[python-pyproj] 01/10: Imported Upstream version 1.9.5

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Wed Jan 6 22:51:53 UTC 2016


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

sebastic pushed a commit to branch master
in repository python-pyproj.

commit d6fe67b998fb5d61311910d5ca841dda0e84aa2a
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Wed Jan 6 07:20:39 2016 +0100

    Imported Upstream version 1.9.5
---
 .gitignore                    |    4 +
 .travis.yml                   |   26 +
 Changelog                     |    5 +
 MANIFEST.in                   |    3 +-
 README.md                     |    8 +-
 _proj.c                       | 5535 +++++++++++++++++++++++------------------
 _proj.pyx                     |   44 +-
 lib/pyproj/__init__.py        |   42 +-
 lib/pyproj/data/epsg          | 1079 ++++----
 lib/pyproj/data/test27        |    5 +-
 lib/pyproj/data/test83        |    5 +-
 lib/pyproj/data/testIGNF      |    3 +-
 lib/pyproj/data/testdatumfile |    3 +-
 lib/pyproj/data/testntv2      |    3 +-
 lib/pyproj/data/testvarious   |  137 +-
 lib/pyproj/data/tv_out.dist   |   77 +-
 setup-proj.py                 |   60 -
 setup.py                      |  120 +-
 src/PJ_aea.c                  |    4 -
 src/PJ_aeqd.c                 |   75 +-
 src/PJ_airy.c                 |    4 -
 src/PJ_aitoff.c               |   96 +-
 src/PJ_august.c               |    1 +
 src/PJ_boggs.c                |    1 +
 src/PJ_cc.c                   |    1 +
 src/PJ_cea.c                  |   11 +-
 src/PJ_collg.c                |    1 +
 src/PJ_crast.c                |    2 +
 src/PJ_denoy.c                |    1 +
 src/PJ_eck1.c                 |    2 +
 src/PJ_eck2.c                 |    1 +
 src/PJ_eck4.c                 |    1 +
 src/PJ_eck5.c                 |    2 +
 src/PJ_fahey.c                |    2 +
 src/PJ_gall.c                 |    2 +
 src/PJ_geos.c                 |    2 -
 src/PJ_gins8.c                |    1 +
 src/PJ_hammer.c               |   18 +-
 src/PJ_hammer.c.diff          |   41 -
 src/PJ_hatano.c               |    1 +
 src/PJ_healpix.c              |    3 +-
 src/PJ_isea.c                 |   29 +-
 src/PJ_krovak.c               |   16 +-
 src/PJ_larr.c                 |    1 +
 src/PJ_lask.c                 |    1 +
 src/PJ_lcca.c                 |    4 +-
 src/PJ_mbt_fps.c              |    1 +
 src/PJ_mbtfpp.c               |    1 +
 src/PJ_mbtfpq.c               |    1 +
 src/PJ_mill.c                 |    2 +
 src/PJ_moll.c                 |    8 +-
 src/PJ_natearth.c             |    2 +
 src/PJ_nell.c                 |    1 +
 src/PJ_nell_h.c               |    2 +
 src/PJ_nocol.c                |    2 +
 src/PJ_nzmg.c                 |    4 -
 src/PJ_omerc.c                |    2 +-
 src/PJ_putp2.c                |    1 +
 src/PJ_qsc.c                  |   74 +-
 src/PJ_robin.c                |    1 +
 src/PJ_sch.c                  |  231 ++
 src/PJ_stere.c                |    2 -
 src/PJ_sterea.c               |    2 -
 src/PJ_tmerc.c                |   22 -
 src/PJ_vandg4.c               |    1 +
 src/PJ_wag7.c                 |    1 +
 src/dmstor.c                  |    4 +-
 src/gen_cheb.c                |   12 +-
 src/geocent.c                 |    3 -
 src/geod_interface.c          |   23 +-
 src/geod_set.c                |   10 +-
 src/geodesic.c                |  723 +++---
 src/geodesic.h                |  186 +-
 src/mk_cheby.c                |    2 +-
 src/nad_init.c                |    6 +-
 src/pj_apply_gridshift.c      |    3 +-
 src/pj_apply_vgridshift.c     |    4 +-
 src/pj_ctx.c                  |    4 -
 src/pj_datum_set.c            |    5 +-
 src/pj_datums.c               |   69 +-
 src/pj_ell_set.c              |    7 +-
 src/pj_ellps.c                |   88 +-
 src/pj_fileapi.c              |    6 +-
 src/pj_fwd.c                  |   19 +-
 src/pj_fwd3d.c                |   47 +
 src/pj_gauss.c                |    3 +-
 src/pj_gc_reader.c            |   21 +-
 src/pj_geocent.c              |    6 +-
 src/pj_gridcatalog.c          |    6 +-
 src/pj_gridinfo.c             |   19 +-
 src/pj_gridlist.c             |    4 +-
 src/pj_init.c                 |   53 +-
 src/pj_initcache.c            |    4 -
 src/pj_inv.c                  |   17 +-
 src/pj_inv3d.c                |   45 +
 src/pj_latlong.c              |    2 -
 src/pj_list.h                 |    2 +
 src/pj_log.c                  |    6 +-
 src/pj_mutex.c                |   16 +-
 src/pj_open_lib.c             |    4 -
 src/pj_param.c                |   18 +-
 src/pj_pr_list.c              |    3 +-
 src/pj_release.c              |    2 +-
 src/pj_strerrno.c             |    2 +-
 src/pj_strtod.c               |  184 ++
 src/pj_transform.c            |  189 +-
 src/pj_units.c                |   44 +-
 src/pj_utils.c                |   13 +-
 src/pj_zpoly1.c               |    2 +-
 src/proj_api.h                |   22 +-
 src/proj_config.h             |    0
 src/proj_etmerc.c             |   33 +-
 src/proj_mdist.c              |    2 -
 src/proj_rouss.c              |    2 -
 src/projects.h                |   34 +-
 src/rtodms.c                  |    8 +-
 unittest/test.py              |   26 +-
 117 files changed, 5732 insertions(+), 4125 deletions(-)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4b6882c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+build/
+nad2bin*
+*.obj
+*.o
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..6359d29
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,26 @@
+language: python
+
+sudo: false
+
+env:
+  global:
+    - DEPENDS="numpy"
+
+python:
+  - "2.7"
+  - "3.3"
+  - "3.4"
+  - "3.5"
+
+before_install:
+  - pip install $DEPENDS
+
+install:
+  - python setup.py install
+
+script:
+    - python -c "import pyproj; pyproj.test()"
+    - python -c "import pyproj; pyproj.Proj(init='epsg:4269')"
+
+notifications:
+  email: false
diff --git a/Changelog b/Changelog
index 5968f0b..7c57cdb 100644
--- a/Changelog
+++ b/Changelog
@@ -1,3 +1,8 @@
+1.9.5
+* update proj4 source to latest github master (commit
+953cc00fd87425395cabe37641cda905c4b587c1).
+* port of basemap fix for input arrays in fortran order 
+* restore inverse Hammer patch that was lost when proj4 source code was updated.
 1.9.4 (git tag v1.9.4rel)
  * migrate to github from googlecode.
  * update proj4 source code from svn r2595 (version 4.9.0RC2).
diff --git a/MANIFEST.in b/MANIFEST.in
index 206a4ad..f68e9f1 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -9,7 +9,7 @@ include _proj.c
 include nad2bin.c
 include src/*.c
 include src/*.h
-include setup-proj.py
+include src/*diff
 include lib/pyproj/*py
 include lib/pyproj/data/*
 include datumgrid/*.lla
@@ -21,3 +21,4 @@ include test/test_transform.py
 include test/geodtest.py
 include test/test_datum.py
 recursive-include docs *
+recursive-include unittest *
diff --git a/README.md b/README.md
index d46722c..e3dee26 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,12 @@ To install:
 
 To test, run `python -c "import pyproj; pyproj.test()"`
 
-To use installed proj lib (and data files), use setup-proj.py instead
-and set PROJ_DIR env var to point to location of proj installation.
+For new unit tests, run `python unittest/test.py`
+
+To use installed proj lib (and data files), 
+set PROJ_DIR env var to point to location of proj installation.
+before running setup.py. If PROJ_DIR is not set, bundled proj4
+source code and data files are used.
 
 Docs at http://jswhit.github.io/pyproj.
 
diff --git a/_proj.c b/_proj.c
index 1d891f4..437a18a 100644
--- a/_proj.c
+++ b/_proj.c
@@ -1,25 +1,14 @@
-/* Generated by Cython 0.19.1 on Tue Nov  5 11:06:29 2013 */
+/* Generated by Cython 0.23.2 */
 
 #define PY_SSIZE_T_CLEAN
-#ifndef CYTHON_USE_PYLONG_INTERNALS
-#ifdef PYLONG_BITS_IN_DIGIT
-#define CYTHON_USE_PYLONG_INTERNALS 0
-#else
-#include "pyconfig.h"
-#ifdef PYLONG_BITS_IN_DIGIT
-#define CYTHON_USE_PYLONG_INTERNALS 1
-#else
-#define CYTHON_USE_PYLONG_INTERNALS 0
-#endif
-#endif
-#endif
 #include "Python.h"
 #ifndef Py_PYTHON_H
     #error Python headers needed to compile C extensions, please install development version of Python.
-#elif PY_VERSION_HEX < 0x02040000
-    #error Cython requires Python 2.4+.
+#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
+    #error Cython requires Python 2.6+ or Python 3.2+.
 #else
-#include <stddef.h> /* For offsetof */
+#define CYTHON_ABI "0_23_2"
+#include <stddef.h>
 #ifndef offsetof
 #define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
 #endif
@@ -53,97 +42,72 @@
 #define CYTHON_COMPILING_IN_PYPY 0
 #define CYTHON_COMPILING_IN_CPYTHON 1
 #endif
-#if PY_VERSION_HEX < 0x02050000
-  typedef int Py_ssize_t;
-  #define PY_SSIZE_T_MAX INT_MAX
-  #define PY_SSIZE_T_MIN INT_MIN
-  #define PY_FORMAT_SIZE_T ""
-  #define CYTHON_FORMAT_SSIZE_T ""
-  #define PyInt_FromSsize_t(z) PyInt_FromLong(z)
-  #define PyInt_AsSsize_t(o)   __Pyx_PyInt_AsInt(o)
-  #define PyNumber_Index(o)    ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \
-                                (PyErr_Format(PyExc_TypeError, \
-                                              "expected index value, got %.200s", Py_TYPE(o)->tp_name), \
-                                 (PyObject*)0))
-  #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \
-                                  !PyComplex_Check(o))
-  #define PyIndex_Check __Pyx_PyIndex_Check
-  #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message)
-  #define __PYX_BUILD_PY_SSIZE_T "i"
-#else
-  #define __PYX_BUILD_PY_SSIZE_T "n"
-  #define CYTHON_FORMAT_SSIZE_T "z"
-  #define __Pyx_PyIndex_Check PyIndex_Check
+#if !defined(CYTHON_USE_PYLONG_INTERNALS) && CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x02070000
+#define CYTHON_USE_PYLONG_INTERNALS 1
 #endif
-#if PY_VERSION_HEX < 0x02060000
-  #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt)
-  #define Py_TYPE(ob)   (((PyObject*)(ob))->ob_type)
-  #define Py_SIZE(ob)   (((PyVarObject*)(ob))->ob_size)
-  #define PyVarObject_HEAD_INIT(type, size) \
-          PyObject_HEAD_INIT(type) size,
-  #define PyType_Modified(t)
-  typedef struct {
-     void *buf;
-     PyObject *obj;
-     Py_ssize_t len;
-     Py_ssize_t itemsize;
-     int readonly;
-     int ndim;
-     char *format;
-     Py_ssize_t *shape;
-     Py_ssize_t *strides;
-     Py_ssize_t *suboffsets;
-     void *internal;
-  } Py_buffer;
-  #define PyBUF_SIMPLE 0
-  #define PyBUF_WRITABLE 0x0001
-  #define PyBUF_FORMAT 0x0004
-  #define PyBUF_ND 0x0008
-  #define PyBUF_STRIDES (0x0010 | PyBUF_ND)
-  #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES)
-  #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES)
-  #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES)
-  #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES)
-  #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE)
-  #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE)
-  typedef int (*getbufferproc)(PyObject *, Py_buffer *, int);
-  typedef void (*releasebufferproc)(PyObject *, Py_buffer *);
+#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag)
+#define Py_OptimizeFlag 0
 #endif
+#define __PYX_BUILD_PY_SSIZE_T "n"
+#define CYTHON_FORMAT_SSIZE_T "z"
 #if PY_MAJOR_VERSION < 3
   #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
-          PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
+          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyClass_Type
 #else
   #define __Pyx_BUILTIN_MODULE_NAME "builtins"
-  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
+  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\
           PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
+  #define __Pyx_DefaultClassType PyType_Type
 #endif
-#if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6
-  #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict")
-#endif
-#if PY_MAJOR_VERSION >= 3
+#ifndef Py_TPFLAGS_CHECKTYPES
   #define Py_TPFLAGS_CHECKTYPES 0
+#endif
+#ifndef Py_TPFLAGS_HAVE_INDEX
   #define Py_TPFLAGS_HAVE_INDEX 0
 #endif
-#if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3)
+#ifndef Py_TPFLAGS_HAVE_NEWBUFFER
   #define Py_TPFLAGS_HAVE_NEWBUFFER 0
 #endif
-#if PY_VERSION_HEX < 0x02060000
-  #define Py_TPFLAGS_HAVE_VERSION_TAG 0
+#ifndef Py_TPFLAGS_HAVE_FINALIZE
+  #define Py_TPFLAGS_HAVE_FINALIZE 0
 #endif
 #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
   #define CYTHON_PEP393_ENABLED 1
-  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
+  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ?\
                                               0 : _PyUnicode_Ready((PyObject *)(op)))
   #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
   #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
+  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
+  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
   #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
 #else
   #define CYTHON_PEP393_ENABLED 0
   #define __Pyx_PyUnicode_READY(op)       (0)
   #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
   #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
-  #define __Pyx_PyUnicode_READ(k, d, i)   ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
+  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
+  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
+#endif
+#if CYTHON_COMPILING_IN_PYPY
+  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
+  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
+#else
+  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
+  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\
+      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
+#endif
+#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains)
+  #define PyUnicode_Contains(u, s)  PySequence_Contains(u, s)
+#endif
+#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
+#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
+#if PY_MAJOR_VERSION >= 3
+  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
+#else
+  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBaseString_Type            PyUnicode_Type
@@ -152,35 +116,12 @@
   #define PyString_Check               PyUnicode_Check
   #define PyString_CheckExact          PyUnicode_CheckExact
 #endif
-#if PY_VERSION_HEX < 0x02060000
-  #define PyBytesObject                PyStringObject
-  #define PyBytes_Type                 PyString_Type
-  #define PyBytes_Check                PyString_Check
-  #define PyBytes_CheckExact           PyString_CheckExact
-  #define PyBytes_FromString           PyString_FromString
-  #define PyBytes_FromStringAndSize    PyString_FromStringAndSize
-  #define PyBytes_FromFormat           PyString_FromFormat
-  #define PyBytes_DecodeEscape         PyString_DecodeEscape
-  #define PyBytes_AsString             PyString_AsString
-  #define PyBytes_AsStringAndSize      PyString_AsStringAndSize
-  #define PyBytes_Size                 PyString_Size
-  #define PyBytes_AS_STRING            PyString_AS_STRING
-  #define PyBytes_GET_SIZE             PyString_GET_SIZE
-  #define PyBytes_Repr                 PyString_Repr
-  #define PyBytes_Concat               PyString_Concat
-  #define PyBytes_ConcatAndDel         PyString_ConcatAndDel
-#endif
 #if PY_MAJOR_VERSION >= 3
   #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
   #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
 #else
-  #define __Pyx_PyBaseString_Check(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj) || \
-                                         PyString_Check(obj) || PyUnicode_Check(obj))
-  #define __Pyx_PyBaseString_CheckExact(obj) (Py_TYPE(obj) == &PyBaseString_Type)
-#endif
-#if PY_VERSION_HEX < 0x02060000
-  #define PySet_Check(obj)             PyObject_TypeCheck(obj, &PySet_Type)
-  #define PyFrozenSet_Check(obj)       PyObject_TypeCheck(obj, &PyFrozenSet_Type)
+  #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
+  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
 #endif
 #ifndef PySet_CheckExact
   #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
@@ -201,11 +142,17 @@
   #define PyInt_AsSsize_t              PyLong_AsSsize_t
   #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
   #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
+  #define PyNumber_Int                 PyNumber_Long
 #endif
 #if PY_MAJOR_VERSION >= 3
   #define PyBoolObject                 PyLongObject
 #endif
-#if PY_VERSION_HEX < 0x03020000
+#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
+  #ifndef PyUnicode_InternFromString
+    #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
+  #endif
+#endif
+#if PY_VERSION_HEX < 0x030200A4
   typedef long Py_hash_t;
   #define __Pyx_PyInt_FromHash_t PyInt_FromLong
   #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
@@ -213,43 +160,37 @@
   #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
   #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
 #endif
-#if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300)
-  #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b)
-  #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value)
-  #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b)
-#else
-  #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \
-        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \
-        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \
-            (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0)))
-  #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \
-        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
-        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \
-            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1)))
-  #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \
-        (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \
-        (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \
-            (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1)))
-#endif
 #if PY_MAJOR_VERSION >= 3
-  #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
-#endif
-#if PY_VERSION_HEX < 0x02050000
-  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),((char *)(n)))
-  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a))
-  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),((char *)(n)))
+  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
 #else
-  #define __Pyx_GetAttrString(o,n)   PyObject_GetAttrString((o),(n))
-  #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a))
-  #define __Pyx_DelAttrString(o,n)   PyObject_DelAttrString((o),(n))
+  #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
 #endif
-#if PY_VERSION_HEX < 0x02050000
-  #define __Pyx_NAMESTR(n) ((char *)(n))
-  #define __Pyx_DOCSTR(n)  ((char *)(n))
+#if PY_VERSION_HEX >= 0x030500B1
+#define __Pyx_PyAsyncMethodsStruct PyAsyncMethods
+#define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async)
+#elif CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+typedef struct {
+    unaryfunc am_await;
+    unaryfunc am_aiter;
+    unaryfunc am_anext;
+} __Pyx_PyAsyncMethodsStruct;
+#define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved))
 #else
-  #define __Pyx_NAMESTR(n) (n)
-  #define __Pyx_DOCSTR(n)  (n)
+#define __Pyx_PyType_AsAsync(obj) NULL
+#endif
+#ifndef CYTHON_RESTRICT
+  #if defined(__GNUC__)
+    #define CYTHON_RESTRICT __restrict__
+  #elif defined(_MSC_VER) && _MSC_VER >= 1400
+    #define CYTHON_RESTRICT __restrict
+  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+    #define CYTHON_RESTRICT restrict
+  #else
+    #define CYTHON_RESTRICT
+  #endif
 #endif
+#define __Pyx_void_to_None(void_result) (void_result, Py_INCREF(Py_None), Py_None)
+
 #ifndef CYTHON_INLINE
   #if defined(__GNUC__)
     #define CYTHON_INLINE __inline__
@@ -261,24 +202,15 @@
     #define CYTHON_INLINE
   #endif
 #endif
-#ifndef CYTHON_RESTRICT
-  #if defined(__GNUC__)
-    #define CYTHON_RESTRICT __restrict__
-  #elif defined(_MSC_VER)
-    #define CYTHON_RESTRICT __restrict
-  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
-    #define CYTHON_RESTRICT restrict
-  #else
-    #define CYTHON_RESTRICT
-  #endif
+
+#if defined(WIN32) || defined(MS_WINDOWS)
+  #define _USE_MATH_DEFINES
 #endif
+#include <math.h>
 #ifdef NAN
 #define __PYX_NAN() ((float) NAN)
 #else
 static CYTHON_INLINE float __PYX_NAN() {
-  /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and
-   a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is
-   a quiet NaN. */
   float value;
   memset(&value, 0xFF, sizeof(value));
   return value;
@@ -302,10 +234,6 @@ static CYTHON_INLINE float __PYX_NAN() {
   #endif
 #endif
 
-#if defined(WIN32) || defined(MS_WINDOWS)
-#define _USE_MATH_DEFINES
-#endif
-#include <math.h>
 #define __PYX_HAVE___proj
 #define __PYX_HAVE_API___proj
 #include "math.h"
@@ -332,19 +260,56 @@ static CYTHON_INLINE float __PYX_NAN() {
 #   define CYTHON_UNUSED
 # endif
 #endif
+#ifndef CYTHON_NCP_UNUSED
+# if CYTHON_COMPILING_IN_CPYTHON
+#  define CYTHON_NCP_UNUSED
+# else
+#  define CYTHON_NCP_UNUSED CYTHON_UNUSED
+# endif
+#endif
 typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding;
-                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/
+                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;
 
 #define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
 #define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
 #define __PYX_DEFAULT_STRING_ENCODING ""
 #define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
 #define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
+#define __Pyx_uchar_cast(c) ((unsigned char)c)
+#define __Pyx_long_cast(x) ((long)x)
+#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (\
+    (sizeof(type) < sizeof(Py_ssize_t))  ||\
+    (sizeof(type) > sizeof(Py_ssize_t) &&\
+          likely(v < (type)PY_SSIZE_T_MAX ||\
+                 v == (type)PY_SSIZE_T_MAX)  &&\
+          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\
+                                v == (type)PY_SSIZE_T_MIN)))  ||\
+    (sizeof(type) == sizeof(Py_ssize_t) &&\
+          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\
+                               v == (type)PY_SSIZE_T_MAX)))  )
+#if defined (__cplusplus) && __cplusplus >= 201103L
+    #include <cstdlib>
+    #define __Pyx_sst_abs(value) std::abs(value)
+#elif SIZEOF_INT >= SIZEOF_SIZE_T
+    #define __Pyx_sst_abs(value) abs(value)
+#elif SIZEOF_LONG >= SIZEOF_SIZE_T
+    #define __Pyx_sst_abs(value) labs(value)
+#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+    #define __Pyx_sst_abs(value) llabs(value)
+#elif defined (_MSC_VER) && defined (_M_X64)
+    #define __Pyx_sst_abs(value) _abs64(value)
+#elif defined (__GNUC__)
+    #define __Pyx_sst_abs(value) __builtin_llabs(value)
+#else
+    #define __Pyx_sst_abs(value) ((value<0) ? -value : value)
+#endif
 static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
 static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
+#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
+#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
 #define __Pyx_PyBytes_FromString        PyBytes_FromString
 #define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*);
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
 #if PY_MAJOR_VERSION < 3
     #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
     #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
@@ -352,17 +317,19 @@ static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char*);
     #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
     #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
 #endif
+#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
 #define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
-#define __Pyx_PyObject_FromUString(s)  __Pyx_PyObject_FromString((char*)s)
-#define __Pyx_PyBytes_FromUString(s)   __Pyx_PyBytes_FromString((char*)s)
-#define __Pyx_PyStr_FromUString(s)     __Pyx_PyStr_FromString((char*)s)
-#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((char*)s)
+#define __Pyx_PyObject_FromCString(s)  __Pyx_PyObject_FromString((const char*)s)
+#define __Pyx_PyBytes_FromCString(s)   __Pyx_PyBytes_FromString((const char*)s)
+#define __Pyx_PyByteArray_FromCString(s)   __Pyx_PyByteArray_FromString((const char*)s)
+#define __Pyx_PyStr_FromCString(s)     __Pyx_PyStr_FromString((const char*)s)
+#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s)
 #if PY_MAJOR_VERSION < 3
 static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
 {
     const Py_UNICODE *u_end = u;
     while (*u_end++) ;
-    return u_end - u - 1;
+    return (size_t)(u_end - u - 1);
 }
 #else
 #define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
@@ -370,13 +337,13 @@ static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
 #define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
 #define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
 #define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
-#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)
-#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
+#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj)
+#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None)
+#define __Pyx_PyBool_FromLong(b) ((b) ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False))
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
 static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 #if CYTHON_COMPILING_IN_CPYTHON
 #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
 #else
@@ -385,19 +352,22 @@ static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
 #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
 static int __Pyx_sys_getdefaultencoding_not_ascii;
-static int __Pyx_init_sys_getdefaultencoding_params() {
-    PyObject* sys = NULL;
+static int __Pyx_init_sys_getdefaultencoding_params(void) {
+    PyObject* sys;
     PyObject* default_encoding = NULL;
     PyObject* ascii_chars_u = NULL;
     PyObject* ascii_chars_b = NULL;
+    const char* default_encoding_c;
     sys = PyImport_ImportModule("sys");
-    if (sys == NULL) goto bad;
-    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
-    if (default_encoding == NULL) goto bad;
-    if (strcmp(PyBytes_AsString(default_encoding), "ascii") == 0) {
+    if (!sys) goto bad;
+    default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL);
+    Py_DECREF(sys);
+    if (!default_encoding) goto bad;
+    default_encoding_c = PyBytes_AsString(default_encoding);
+    if (!default_encoding_c) goto bad;
+    if (strcmp(default_encoding_c, "ascii") == 0) {
         __Pyx_sys_getdefaultencoding_not_ascii = 0;
     } else {
-        const char* default_encoding_c = PyBytes_AS_STRING(default_encoding);
         char ascii_chars[128];
         int c;
         for (c = 0; c < 128; c++) {
@@ -405,23 +375,21 @@ static int __Pyx_init_sys_getdefaultencoding_params() {
         }
         __Pyx_sys_getdefaultencoding_not_ascii = 1;
         ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
-        if (ascii_chars_u == NULL) goto bad;
+        if (!ascii_chars_u) goto bad;
         ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
-        if (ascii_chars_b == NULL || strncmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
+        if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
             PyErr_Format(
                 PyExc_ValueError,
-                "This module compiled with c_string_encoding=ascii, but default encoding '%s' is not a superset of ascii.",
+                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                 default_encoding_c);
             goto bad;
         }
+        Py_DECREF(ascii_chars_u);
+        Py_DECREF(ascii_chars_b);
     }
-    Py_XDECREF(sys);
-    Py_XDECREF(default_encoding);
-    Py_XDECREF(ascii_chars_u);
-    Py_XDECREF(ascii_chars_b);
+    Py_DECREF(default_encoding);
     return 0;
 bad:
-    Py_XDECREF(sys);
     Py_XDECREF(default_encoding);
     Py_XDECREF(ascii_chars_u);
     Py_XDECREF(ascii_chars_b);
@@ -434,22 +402,23 @@ bad:
 #define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
 #if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
 static char* __PYX_DEFAULT_STRING_ENCODING;
-static int __Pyx_init_sys_getdefaultencoding_params() {
-    PyObject* sys = NULL;
+static int __Pyx_init_sys_getdefaultencoding_params(void) {
+    PyObject* sys;
     PyObject* default_encoding = NULL;
     char* default_encoding_c;
     sys = PyImport_ImportModule("sys");
-    if (sys == NULL) goto bad;
+    if (!sys) goto bad;
     default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
-    if (default_encoding == NULL) goto bad;
-    default_encoding_c = PyBytes_AS_STRING(default_encoding);
+    Py_DECREF(sys);
+    if (!default_encoding) goto bad;
+    default_encoding_c = PyBytes_AsString(default_encoding);
+    if (!default_encoding_c) goto bad;
     __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
+    if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
     strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
-    Py_DECREF(sys);
     Py_DECREF(default_encoding);
     return 0;
 bad:
-    Py_XDECREF(sys);
     Py_XDECREF(default_encoding);
     return -1;
 }
@@ -457,16 +426,11 @@ bad:
 #endif
 
 
-#ifdef __GNUC__
-  /* Test for GCC > 2.95 */
-  #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))
-    #define likely(x)   __builtin_expect(!!(x), 1)
-    #define unlikely(x) __builtin_expect(!!(x), 0)
-  #else /* __GNUC__ > 2 ... */
-    #define likely(x)   (x)
-    #define unlikely(x) (x)
-  #endif /* __GNUC__ > 2 ... */
-#else /* __GNUC__ */
+/* Test for GCC > 2.95 */
+#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
+  #define likely(x)   __builtin_expect(!!(x), 1)
+  #define unlikely(x) __builtin_expect(!!(x), 0)
+#else /* !__GNUC__ or GCC < 2.95 */
   #define likely(x)   (x)
   #define unlikely(x) (x)
 #endif /* __GNUC__ */
@@ -491,7 +455,7 @@ struct __pyx_obj_5_proj_Proj;
 struct __pyx_obj_5_proj_Geod;
 struct __pyx_opt_args_5_proj__strencode;
 
-/* "_proj.pyx":359
+/* "_proj.pyx":367
  *             yy[i] = yy[i]*_rad2dg
  * 
  * cdef _strencode(pystr,encoding='ascii'):             # <<<<<<<<<<<<<<
@@ -520,7 +484,7 @@ struct __pyx_obj_5_proj_Proj {
 };
 
 
-/* "_proj.pyx":366
+/* "_proj.pyx":374
  *         return pystr # already bytes?
  * 
  * cdef class Geod:             # <<<<<<<<<<<<<<
@@ -533,6 +497,8 @@ struct __pyx_obj_5_proj_Geod {
   PyObject *initstring;
 };
 
+
+/* --- Runtime support code (head) --- */
 #ifndef CYTHON_REFNANNY
   #define CYTHON_REFNANNY 0
 #endif
@@ -546,22 +512,22 @@ struct __pyx_obj_5_proj_Geod {
     void (*FinishContext)(void**);
   } __Pyx_RefNannyAPIStruct;
   static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
-  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/
+  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
   #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
 #ifdef WITH_THREAD
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
-          if (acquire_gil) { \
-              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
-              PyGILState_Release(__pyx_gilstate_save); \
-          } else { \
-              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
+          if (acquire_gil) {\
+              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
+              PyGILState_Release(__pyx_gilstate_save);\
+          } else {\
+              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\
           }
 #else
-  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
+  #define __Pyx_RefNannySetupContext(name, acquire_gil)\
           __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
 #endif
-  #define __Pyx_RefNannyFinishContext() \
+  #define __Pyx_RefNannyFinishContext()\
           __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
   #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
   #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
@@ -583,7 +549,15 @@ struct __pyx_obj_5_proj_Geod {
   #define __Pyx_XDECREF(r) Py_XDECREF(r)
   #define __Pyx_XGOTREF(r)
   #define __Pyx_XGIVEREF(r)
-#endif /* CYTHON_REFNANNY */
+#endif
+#define __Pyx_XDECREF_SET(r, v) do {\
+        PyObject *tmp = (PyObject *) r;\
+        r = v; __Pyx_XDECREF(tmp);\
+    } while (0)
+#define __Pyx_DECREF_SET(r, v) do {\
+        PyObject *tmp = (PyObject *) r;\
+        r = v; __Pyx_DECREF(tmp);\
+    } while (0)
 #define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
 #define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)
 
@@ -602,73 +576,53 @@ static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject
 #define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
 #endif
 
-static PyObject *__Pyx_GetBuiltinName(PyObject *name); /*proto*/
-
-static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/
-
-static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
-    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
-    const char* function_name); /*proto*/
-
-static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
-    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/
-
-static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-
-static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/
-
-static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name); /*proto*/
-
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
-    const char *name, int exact); /*proto*/
-
-static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t); /* proto */
-
-static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
+static PyObject *__Pyx_GetBuiltinName(PyObject *name);
 
-#ifndef __PYX_FORCE_INIT_THREADS
-  #define __PYX_FORCE_INIT_THREADS 0
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
+#else
+#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
 #endif
 
-static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
-static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
-
-static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); /*proto*/
-
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *);
+static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);
 
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *);
+static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\
+    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\
+    const char* function_name);
 
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *);
-
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *);
-
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *);
-
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *);
+static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
+    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);
 
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *);
+static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
+static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);
 
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *);
+static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);
 
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *);
+static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);
 
-static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
+#endif
 
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *);
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);
 
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *);
+static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+    const char *name, int exact);
 
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *);
+static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t, Py_ssize_t);
 
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *);
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
+#else
+#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
+#endif
 
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *);
+static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb);
+static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);
 
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *);
+static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);
 
-static int __Pyx_check_binary_version(void);
+static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);
 
 typedef struct {
     int code_line;
@@ -685,9 +639,17 @@ static PyCodeObject *__pyx_find_code_object(int code_line);
 static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);
 
 static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename); /*proto*/
+                               int py_line, const char *filename);
+
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);
+
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);
 
-static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);
+
+static int __Pyx_check_binary_version(void);
+
+static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);
 
 
 /* Module declarations from '_proj' */
@@ -703,6 +665,134 @@ int __pyx_module_is_main__proj = 0;
 static PyObject *__pyx_builtin_RuntimeError;
 static PyObject *__pyx_builtin_AttributeError;
 static PyObject *__pyx_builtin_ValueError;
+static char __pyx_k_a[] = "a";
+static char __pyx_k_f[] = "f";
+static char __pyx_k_i[] = "i";
+static char __pyx_k_x[] = "x";
+static char __pyx_k_y[] = "y";
+static char __pyx_k_az[] = "az";
+static char __pyx_k_p1[] = "p1";
+static char __pyx_k_p2[] = "p2";
+static char __pyx_k_xx[] = "xx";
+static char __pyx_k_yy[] = "yy";
+static char __pyx_k_zz[] = "zz";
+static char __pyx_k_err[] = "err";
+static char __pyx_k_inx[] = "inx";
+static char __pyx_k_iny[] = "iny";
+static char __pyx_k_inz[] = "inz";
+static char __pyx_k_dist[] = "dist";
+static char __pyx_k_lat1[] = "lat1";
+static char __pyx_k_lat2[] = "lat2";
+static char __pyx_k_lats[] = "lats";
+static char __pyx_k_lon1[] = "lon1";
+static char __pyx_k_lon2[] = "lon2";
+static char __pyx_k_lons[] = "lons";
+static char __pyx_k_main[] = "__main__";
+static char __pyx_k_math[] = "math";
+static char __pyx_k_npts[] = "npts";
+static char __pyx_k_proj[] = "_proj";
+static char __pyx_k_test[] = "__test__";
+static char __pyx_k_1_9_5[] = "1.9.5";
+static char __pyx_k_ascii[] = "ascii";
+static char __pyx_k_class[] = "__class__";
+static char __pyx_k_lats1[] = "lats1";
+static char __pyx_k_lats2[] = "lats2";
+static char __pyx_k_lons1[] = "lons1";
+static char __pyx_k_lons2[] = "lons2";
+static char __pyx_k_xdata[] = "xdata";
+static char __pyx_k_ydata[] = "ydata";
+static char __pyx_k_zdata[] = "zdata";
+static char __pyx_k_encode[] = "encode";
+static char __pyx_k_import[] = "__import__";
+static char __pyx_k_a_s_f_s[] = "+a=%s +f=%s";
+static char __pyx_k_buflenx[] = "buflenx";
+static char __pyx_k_bufleny[] = "bufleny";
+static char __pyx_k_buflenz[] = "buflenz";
+static char __pyx_k_bytestr[] = "bytestr";
+static char __pyx_k_degrees[] = "degrees";
+static char __pyx_k_radians[] = "radians";
+static char __pyx_k_version[] = "__version__";
+static char __pyx_k_datapath[] = "datapath";
+static char __pyx_k_errcheck[] = "errcheck";
+static char __pyx_k_transform[] = "_transform";
+static char __pyx_k_ValueError[] = "ValueError";
+static char __pyx_k_createproj[] = "_createproj";
+static char __pyx_k_doublesize[] = "_doublesize";
+static char __pyx_k_is_latlong[] = "is_latlong";
+static char __pyx_k_projstring[] = "projstring";
+static char __pyx_k_searchpath[] = "searchpath";
+static char __pyx_k_RuntimeError[] = "RuntimeError";
+static char __pyx_k_set_datapath[] = "set_datapath";
+static char __pyx_k_AttributeError[] = "AttributeError";
+static char __pyx_k_projection_undefined[] = "projection undefined";
+static char __pyx_k_Buffer_lengths_not_the_same[] = "Buffer lengths not the same";
+static char __pyx_k_x_y_and_z_must_be_same_size[] = "x,y and z must be same size";
+static char __pyx_k_Users_jsw_python_pyproj_git__pr[] = "/Users/jsw/python/pyproj.git/_proj.pyx";
+static char __pyx_k_undefined_inverse_geodesic_may_b[] = "undefined inverse geodesic (may be an antipodal point)";
+static PyObject *__pyx_kp_s_1_9_5;
+static PyObject *__pyx_n_s_AttributeError;
+static PyObject *__pyx_kp_s_Buffer_lengths_not_the_same;
+static PyObject *__pyx_n_s_RuntimeError;
+static PyObject *__pyx_kp_s_Users_jsw_python_pyproj_git__pr;
+static PyObject *__pyx_n_s_ValueError;
+static PyObject *__pyx_n_s_a;
+static PyObject *__pyx_kp_s_a_s_f_s;
+static PyObject *__pyx_n_s_ascii;
+static PyObject *__pyx_n_s_az;
+static PyObject *__pyx_n_s_buflenx;
+static PyObject *__pyx_n_s_bufleny;
+static PyObject *__pyx_n_s_buflenz;
+static PyObject *__pyx_n_s_bytestr;
+static PyObject *__pyx_n_s_class;
+static PyObject *__pyx_n_s_createproj;
+static PyObject *__pyx_n_s_datapath;
+static PyObject *__pyx_n_s_degrees;
+static PyObject *__pyx_n_s_dist;
+static PyObject *__pyx_n_s_doublesize;
+static PyObject *__pyx_n_s_encode;
+static PyObject *__pyx_n_s_err;
+static PyObject *__pyx_n_s_errcheck;
+static PyObject *__pyx_n_s_f;
+static PyObject *__pyx_n_s_i;
+static PyObject *__pyx_n_s_import;
+static PyObject *__pyx_n_s_inx;
+static PyObject *__pyx_n_s_iny;
+static PyObject *__pyx_n_s_inz;
+static PyObject *__pyx_n_s_is_latlong;
+static PyObject *__pyx_n_s_lat1;
+static PyObject *__pyx_n_s_lat2;
+static PyObject *__pyx_n_s_lats;
+static PyObject *__pyx_n_s_lats1;
+static PyObject *__pyx_n_s_lats2;
+static PyObject *__pyx_n_s_lon1;
+static PyObject *__pyx_n_s_lon2;
+static PyObject *__pyx_n_s_lons;
+static PyObject *__pyx_n_s_lons1;
+static PyObject *__pyx_n_s_lons2;
+static PyObject *__pyx_n_s_main;
+static PyObject *__pyx_n_s_math;
+static PyObject *__pyx_n_s_npts;
+static PyObject *__pyx_n_s_p1;
+static PyObject *__pyx_n_s_p2;
+static PyObject *__pyx_n_s_proj;
+static PyObject *__pyx_kp_s_projection_undefined;
+static PyObject *__pyx_n_s_projstring;
+static PyObject *__pyx_n_s_radians;
+static PyObject *__pyx_n_s_searchpath;
+static PyObject *__pyx_n_s_set_datapath;
+static PyObject *__pyx_n_s_test;
+static PyObject *__pyx_n_s_transform;
+static PyObject *__pyx_kp_s_undefined_inverse_geodesic_may_b;
+static PyObject *__pyx_n_s_version;
+static PyObject *__pyx_n_s_x;
+static PyObject *__pyx_kp_s_x_y_and_z_must_be_same_size;
+static PyObject *__pyx_n_s_xdata;
+static PyObject *__pyx_n_s_xx;
+static PyObject *__pyx_n_s_y;
+static PyObject *__pyx_n_s_ydata;
+static PyObject *__pyx_n_s_yy;
+static PyObject *__pyx_n_s_zdata;
+static PyObject *__pyx_n_s_zz;
 static PyObject *__pyx_pf_5_proj_set_datapath(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_datapath); /* proto */
 static PyObject *__pyx_pf_5_proj_2_createproj(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_projstring); /* proto */
 static int __pyx_pf_5_proj_4Proj___cinit__(struct __pyx_obj_5_proj_Proj *__pyx_v_self, PyObject *__pyx_v_projstring); /* proto */
@@ -730,181 +820,51 @@ static int __pyx_pf_5_proj_4Geod_10initstring_2__set__(struct __pyx_obj_5_proj_G
 static int __pyx_pf_5_proj_4Geod_10initstring_4__del__(struct __pyx_obj_5_proj_Geod *__pyx_v_self); /* proto */
 static PyObject *__pyx_tp_new_5_proj_Proj(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
 static PyObject *__pyx_tp_new_5_proj_Geod(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
-static char __pyx_k_3[] = "Buffer lengths not the same";
-static char __pyx_k_5[] = "projection undefined";
-static char __pyx_k_15[] = "x,y and z must be same size";
-static char __pyx_k_17[] = "+a=%s +f=%s";
-static char __pyx_k_20[] = "undefined inverse geodesic (may be an antipodal point)";
-static char __pyx_k_26[] = "1.9.4";
-static char __pyx_k_29[] = "/Volumes/User/jwhitaker/python/pyproj/_proj.pyx";
-static char __pyx_k__a[] = "a";
-static char __pyx_k__f[] = "f";
-static char __pyx_k__i[] = "i";
-static char __pyx_k__x[] = "x";
-static char __pyx_k__y[] = "y";
-static char __pyx_k__az[] = "az";
-static char __pyx_k__p1[] = "p1";
-static char __pyx_k__p2[] = "p2";
-static char __pyx_k__xx[] = "xx";
-static char __pyx_k__yy[] = "yy";
-static char __pyx_k__zz[] = "zz";
-static char __pyx_k__err[] = "err";
-static char __pyx_k__inx[] = "inx";
-static char __pyx_k__iny[] = "iny";
-static char __pyx_k__inz[] = "inz";
-static char __pyx_k__dist[] = "dist";
-static char __pyx_k__lat1[] = "lat1";
-static char __pyx_k__lat2[] = "lat2";
-static char __pyx_k__lats[] = "lats";
-static char __pyx_k__lon1[] = "lon1";
-static char __pyx_k__lon2[] = "lon2";
-static char __pyx_k__lons[] = "lons";
-static char __pyx_k__math[] = "math";
-static char __pyx_k__npts[] = "npts";
-static char __pyx_k___proj[] = "_proj";
-static char __pyx_k__ascii[] = "ascii";
-static char __pyx_k__lats1[] = "lats1";
-static char __pyx_k__lats2[] = "lats2";
-static char __pyx_k__lons1[] = "lons1";
-static char __pyx_k__lons2[] = "lons2";
-static char __pyx_k__xdata[] = "xdata";
-static char __pyx_k__ydata[] = "ydata";
-static char __pyx_k__zdata[] = "zdata";
-static char __pyx_k__encode[] = "encode";
-static char __pyx_k__buflenx[] = "buflenx";
-static char __pyx_k__bufleny[] = "bufleny";
-static char __pyx_k__buflenz[] = "buflenz";
-static char __pyx_k__bytestr[] = "bytestr";
-static char __pyx_k__degrees[] = "degrees";
-static char __pyx_k__radians[] = "radians";
-static char __pyx_k____main__[] = "__main__";
-static char __pyx_k____test__[] = "__test__";
-static char __pyx_k__datapath[] = "datapath";
-static char __pyx_k__errcheck[] = "errcheck";
-static char __pyx_k____class__[] = "__class__";
-static char __pyx_k__ValueError[] = "ValueError";
-static char __pyx_k____import__[] = "__import__";
-static char __pyx_k___transform[] = "_transform";
-static char __pyx_k__is_latlong[] = "is_latlong";
-static char __pyx_k__projstring[] = "projstring";
-static char __pyx_k__searchpath[] = "searchpath";
-static char __pyx_k____version__[] = "__version__";
-static char __pyx_k___createproj[] = "_createproj";
-static char __pyx_k___doublesize[] = "_doublesize";
-static char __pyx_k__RuntimeError[] = "RuntimeError";
-static char __pyx_k__set_datapath[] = "set_datapath";
-static char __pyx_k__AttributeError[] = "AttributeError";
-static PyObject *__pyx_kp_s_15;
-static PyObject *__pyx_kp_s_17;
-static PyObject *__pyx_kp_s_20;
-static PyObject *__pyx_kp_s_26;
-static PyObject *__pyx_kp_s_29;
-static PyObject *__pyx_kp_s_3;
-static PyObject *__pyx_kp_s_5;
-static PyObject *__pyx_n_s__AttributeError;
-static PyObject *__pyx_n_s__RuntimeError;
-static PyObject *__pyx_n_s__ValueError;
-static PyObject *__pyx_n_s____class__;
-static PyObject *__pyx_n_s____import__;
-static PyObject *__pyx_n_s____main__;
-static PyObject *__pyx_n_s____test__;
-static PyObject *__pyx_n_s____version__;
-static PyObject *__pyx_n_s___createproj;
-static PyObject *__pyx_n_s___doublesize;
-static PyObject *__pyx_n_s___proj;
-static PyObject *__pyx_n_s___transform;
-static PyObject *__pyx_n_s__a;
-static PyObject *__pyx_n_s__ascii;
-static PyObject *__pyx_n_s__az;
-static PyObject *__pyx_n_s__buflenx;
-static PyObject *__pyx_n_s__bufleny;
-static PyObject *__pyx_n_s__buflenz;
-static PyObject *__pyx_n_s__bytestr;
-static PyObject *__pyx_n_s__datapath;
-static PyObject *__pyx_n_s__degrees;
-static PyObject *__pyx_n_s__dist;
-static PyObject *__pyx_n_s__encode;
-static PyObject *__pyx_n_s__err;
-static PyObject *__pyx_n_s__errcheck;
-static PyObject *__pyx_n_s__f;
-static PyObject *__pyx_n_s__i;
-static PyObject *__pyx_n_s__inx;
-static PyObject *__pyx_n_s__iny;
-static PyObject *__pyx_n_s__inz;
-static PyObject *__pyx_n_s__is_latlong;
-static PyObject *__pyx_n_s__lat1;
-static PyObject *__pyx_n_s__lat2;
-static PyObject *__pyx_n_s__lats;
-static PyObject *__pyx_n_s__lats1;
-static PyObject *__pyx_n_s__lats2;
-static PyObject *__pyx_n_s__lon1;
-static PyObject *__pyx_n_s__lon2;
-static PyObject *__pyx_n_s__lons;
-static PyObject *__pyx_n_s__lons1;
-static PyObject *__pyx_n_s__lons2;
-static PyObject *__pyx_n_s__math;
-static PyObject *__pyx_n_s__npts;
-static PyObject *__pyx_n_s__p1;
-static PyObject *__pyx_n_s__p2;
-static PyObject *__pyx_n_s__projstring;
-static PyObject *__pyx_n_s__radians;
-static PyObject *__pyx_n_s__searchpath;
-static PyObject *__pyx_n_s__set_datapath;
-static PyObject *__pyx_n_s__x;
-static PyObject *__pyx_n_s__xdata;
-static PyObject *__pyx_n_s__xx;
-static PyObject *__pyx_n_s__y;
-static PyObject *__pyx_n_s__ydata;
-static PyObject *__pyx_n_s__yy;
-static PyObject *__pyx_n_s__zdata;
-static PyObject *__pyx_n_s__zz;
-static PyObject *__pyx_k_1;
-static PyObject *__pyx_k_2;
-static PyObject *__pyx_k_9;
-static PyObject *__pyx_k_10;
-static PyObject *__pyx_k_18;
-static PyObject *__pyx_k_22;
-static PyObject *__pyx_k_25;
-static PyObject *__pyx_k_tuple_4;
-static PyObject *__pyx_k_tuple_6;
-static PyObject *__pyx_k_tuple_7;
-static PyObject *__pyx_k_tuple_8;
-static PyObject *__pyx_k_tuple_11;
-static PyObject *__pyx_k_tuple_12;
-static PyObject *__pyx_k_tuple_13;
-static PyObject *__pyx_k_tuple_14;
-static PyObject *__pyx_k_tuple_16;
-static PyObject *__pyx_k_tuple_19;
-static PyObject *__pyx_k_tuple_21;
-static PyObject *__pyx_k_tuple_23;
-static PyObject *__pyx_k_tuple_24;
-static PyObject *__pyx_k_tuple_27;
-static PyObject *__pyx_k_tuple_30;
-static PyObject *__pyx_k_tuple_32;
-static PyObject *__pyx_k_codeobj_28;
-static PyObject *__pyx_k_codeobj_31;
-static PyObject *__pyx_k_codeobj_33;
+static PyObject *__pyx_float_1_;
+static PyObject *__pyx_tuple_;
+static PyObject *__pyx_tuple__2;
+static PyObject *__pyx_tuple__3;
+static PyObject *__pyx_tuple__4;
+static PyObject *__pyx_tuple__5;
+static PyObject *__pyx_tuple__6;
+static PyObject *__pyx_tuple__7;
+static PyObject *__pyx_tuple__8;
+static PyObject *__pyx_tuple__9;
+static PyObject *__pyx_tuple__10;
+static PyObject *__pyx_tuple__11;
+static PyObject *__pyx_tuple__12;
+static PyObject *__pyx_tuple__13;
+static PyObject *__pyx_tuple__14;
+static PyObject *__pyx_tuple__15;
+static PyObject *__pyx_tuple__16;
+static PyObject *__pyx_tuple__18;
+static PyObject *__pyx_tuple__20;
+static PyObject *__pyx_codeobj__17;
+static PyObject *__pyx_codeobj__19;
+static PyObject *__pyx_codeobj__21;
+
+/* "_proj.pyx":58
+ *     int PyObject_AsWriteBuffer(object, void **rbuf, Py_ssize_t *len)
+ * 
+ * def set_datapath(datapath):             # <<<<<<<<<<<<<<
+ *     bytestr = _strencode(datapath)
+ *     cdef const char *searchpath = bytestr
+ */
 
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_1set_datapath(PyObject *__pyx_self, PyObject *__pyx_v_datapath); /*proto*/
-static PyMethodDef __pyx_mdef_5_proj_1set_datapath = {__Pyx_NAMESTR("set_datapath"), (PyCFunction)__pyx_pw_5_proj_1set_datapath, METH_O, __Pyx_DOCSTR(0)};
+static PyMethodDef __pyx_mdef_5_proj_1set_datapath = {"set_datapath", (PyCFunction)__pyx_pw_5_proj_1set_datapath, METH_O, 0};
 static PyObject *__pyx_pw_5_proj_1set_datapath(PyObject *__pyx_self, PyObject *__pyx_v_datapath) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("set_datapath (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_set_datapath(__pyx_self, ((PyObject *)__pyx_v_datapath));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":58
- *     int PyObject_AsWriteBuffer(object, void **rbuf, Py_ssize_t *len)
- * 
- * def set_datapath(datapath):             # <<<<<<<<<<<<<<
- *     bytestr = _strencode(datapath)
- *     cdef const char *searchpath = bytestr
- */
-
 static PyObject *__pyx_pf_5_proj_set_datapath(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_datapath) {
   PyObject *__pyx_v_bytestr = NULL;
   char const *__pyx_v_searchpath;
@@ -948,6 +908,15 @@ static PyObject *__pyx_pf_5_proj_set_datapath(CYTHON_UNUSED PyObject *__pyx_self
  */
   pj_set_searchpath(1, (&__pyx_v_searchpath));
 
+  /* "_proj.pyx":58
+ *     int PyObject_AsWriteBuffer(object, void **rbuf, Py_ssize_t *len)
+ * 
+ * def set_datapath(datapath):             # <<<<<<<<<<<<<<
+ *     bytestr = _strencode(datapath)
+ *     cdef const char *searchpath = bytestr
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -961,26 +930,28 @@ static PyObject *__pyx_pf_5_proj_set_datapath(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
+/* "_proj.pyx":63
+ *     pj_set_searchpath(1, &searchpath)
+ * 
+ * def _createproj(projstring):             # <<<<<<<<<<<<<<
+ *     return Proj(projstring)
+ * 
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_3_createproj(PyObject *__pyx_self, PyObject *__pyx_v_projstring); /*proto*/
-static PyMethodDef __pyx_mdef_5_proj_3_createproj = {__Pyx_NAMESTR("_createproj"), (PyCFunction)__pyx_pw_5_proj_3_createproj, METH_O, __Pyx_DOCSTR(0)};
+static PyMethodDef __pyx_mdef_5_proj_3_createproj = {"_createproj", (PyCFunction)__pyx_pw_5_proj_3_createproj, METH_O, 0};
 static PyObject *__pyx_pw_5_proj_3_createproj(PyObject *__pyx_self, PyObject *__pyx_v_projstring) {
   PyObject *__pyx_r = 0;
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_createproj (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_2_createproj(__pyx_self, ((PyObject *)__pyx_v_projstring));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":63
- *     pj_set_searchpath(1, &searchpath)
- * 
- * def _createproj(projstring):             # <<<<<<<<<<<<<<
- *     return Proj(projstring)
- * 
- */
-
 static PyObject *__pyx_pf_5_proj_2_createproj(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_projstring) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -1002,17 +973,24 @@ static PyObject *__pyx_pf_5_proj_2_createproj(CYTHON_UNUSED PyObject *__pyx_self
   __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_projstring);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_projstring);
   __Pyx_GIVEREF(__pyx_v_projstring);
-  __pyx_t_2 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_5_proj_Proj)), ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_projstring);
+  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_ptype_5_proj_Proj), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
   __pyx_r = __pyx_t_2;
   __pyx_t_2 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "_proj.pyx":63
+ *     pj_set_searchpath(1, &searchpath)
+ * 
+ * def _createproj(projstring):             # <<<<<<<<<<<<<<
+ *     return Proj(projstring)
+ * 
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
@@ -1024,6 +1002,14 @@ static PyObject *__pyx_pf_5_proj_2_createproj(CYTHON_UNUSED PyObject *__pyx_self
   return __pyx_r;
 }
 
+/* "_proj.pyx":73
+ *     cdef public object srs
+ * 
+ *     def __cinit__(self, projstring):             # <<<<<<<<<<<<<<
+ *         # setup proj initialization string.
+ *         cdef int err
+ */
+
 /* Python wrapper */
 static int __pyx_pw_5_proj_4Proj_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_pw_5_proj_4Proj_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -1035,7 +1021,7 @@ static int __pyx_pw_5_proj_4Proj_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__projstring,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_projstring,0};
     PyObject* values[1] = {0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -1048,7 +1034,7 @@ static int __pyx_pw_5_proj_4Proj_1__cinit__(PyObject *__pyx_v_self, PyObject *__
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__projstring)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_projstring)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
       }
       if (unlikely(kw_args > 0)) {
@@ -1070,18 +1056,12 @@ static int __pyx_pw_5_proj_4Proj_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   return -1;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Proj___cinit__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self), __pyx_v_projstring);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":73
- *     cdef public object srs
- * 
- *     def __cinit__(self, projstring):             # <<<<<<<<<<<<<<
- *         # setup proj initialization string.
- *         cdef int err
- */
-
 static int __pyx_pf_5_proj_4Proj___cinit__(struct __pyx_obj_5_proj_Proj *__pyx_v_self, PyObject *__pyx_v_projstring) {
   int __pyx_v_err;
   PyObject *__pyx_v_bytestr = NULL;
@@ -1176,21 +1156,27 @@ static int __pyx_pf_5_proj_4Proj___cinit__(struct __pyx_obj_5_proj_Proj *__pyx_v
  * 
  */
     __pyx_t_1 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_1));
+    __Pyx_GOTREF(__pyx_t_1);
     __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_4);
-    PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_1));
-    __Pyx_GIVEREF(((PyObject *)__pyx_t_1));
+    __Pyx_GIVEREF(__pyx_t_1);
+    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_1);
     __pyx_t_1 = 0;
-    __pyx_t_1 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_1);
-    __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
+    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
     __Pyx_Raise(__pyx_t_1, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
     {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+
+    /* "_proj.pyx":83
+ *         self.projpj = pj_init_plus_ctx(self.projctx, self.pjinitstring)
+ *         err = pj_ctx_get_errno(self.projctx)
+ *         if err != 0:             # <<<<<<<<<<<<<<
+ *              raise RuntimeError(pj_strerrno(err))
+ *         self.proj_version = PJ_VERSION/100.
+ */
   }
-  __pyx_L3:;
 
   /* "_proj.pyx":85
  *         if err != 0:
@@ -1207,6 +1193,15 @@ static int __pyx_pf_5_proj_4Proj___cinit__(struct __pyx_obj_5_proj_Proj *__pyx_v
   __pyx_v_self->proj_version = __pyx_t_1;
   __pyx_t_1 = 0;
 
+  /* "_proj.pyx":73
+ *     cdef public object srs
+ * 
+ *     def __cinit__(self, projstring):             # <<<<<<<<<<<<<<
+ *         # setup proj initialization string.
+ *         cdef int err
+ */
+
+  /* function exit code */
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -1220,23 +1215,25 @@ static int __pyx_pf_5_proj_4Proj___cinit__(struct __pyx_obj_5_proj_Proj *__pyx_v
   return __pyx_r;
 }
 
+/* "_proj.pyx":87
+ *         self.proj_version = PJ_VERSION/100.
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         """destroy projection definition"""
+ *         pj_free(self.projpj)
+ */
+
 /* Python wrapper */
 static void __pyx_pw_5_proj_4Proj_3__dealloc__(PyObject *__pyx_v_self); /*proto*/
 static void __pyx_pw_5_proj_4Proj_3__dealloc__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0);
   __pyx_pf_5_proj_4Proj_2__dealloc__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
-/* "_proj.pyx":87
- *         self.proj_version = PJ_VERSION/100.
- * 
- *     def __dealloc__(self):             # <<<<<<<<<<<<<<
- *         """destroy projection definition"""
- *         pj_free(self.projpj)
- */
-
 static void __pyx_pf_5_proj_4Proj_2__dealloc__(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__dealloc__", 0);
@@ -1259,9 +1256,26 @@ static void __pyx_pf_5_proj_4Proj_2__dealloc__(struct __pyx_obj_5_proj_Proj *__p
  */
   pj_ctx_free(__pyx_v_self->projctx);
 
+  /* "_proj.pyx":87
+ *         self.proj_version = PJ_VERSION/100.
+ * 
+ *     def __dealloc__(self):             # <<<<<<<<<<<<<<
+ *         """destroy projection definition"""
+ *         pj_free(self.projpj)
+ */
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
 }
 
+/* "_proj.pyx":92
+ *         pj_ctx_free(self.projctx)
+ * 
+ *     def to_latlong(self):             # <<<<<<<<<<<<<<
+ *         """return a new Proj instance which is the geographic (lat/lon)
+ *         coordinate version of the current projection"""
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_5to_latlong(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static char __pyx_doc_5_proj_4Proj_4to_latlong[] = "return a new Proj instance which is the geographic (lat/lon)\n        coordinate version of the current projection";
@@ -1270,18 +1284,12 @@ static PyObject *__pyx_pw_5_proj_4Proj_5to_latlong(PyObject *__pyx_v_self, CYTHO
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("to_latlong (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_4to_latlong(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":92
- *         pj_ctx_free(self.projctx)
- * 
- *     def to_latlong(self):             # <<<<<<<<<<<<<<
- *         """return a new Proj instance which is the geographic (lat/lon)
- *         coordinate version of the current projection"""
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_4to_latlong(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   projPJ __pyx_v_llpj;
   char *__pyx_v_initstring;
@@ -1290,6 +1298,8 @@ static PyObject *__pyx_pf_5_proj_4Proj_4to_latlong(struct __pyx_obj_5_proj_Proj
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
   PyObject *__pyx_t_3 = NULL;
+  PyObject *__pyx_t_4 = NULL;
+  PyObject *__pyx_t_5 = NULL;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -1330,30 +1340,56 @@ static PyObject *__pyx_pf_5_proj_4Proj_4to_latlong(struct __pyx_obj_5_proj_Proj
  *     def __reduce__(self):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s___createproj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyBytes_FromString(__pyx_v_initstring); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_2));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
-  __pyx_t_2 = 0;
-  __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_createproj); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-  __pyx_r = __pyx_t_2;
-  __pyx_t_2 = 0;
+  __pyx_t_3 = __Pyx_PyBytes_FromString(__pyx_v_initstring); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_3);
+  __pyx_t_4 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
+    __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2);
+    if (likely(__pyx_t_4)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
+      __Pyx_INCREF(__pyx_t_4);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_2, function);
+    }
+  }
+  if (!__pyx_t_4) {
+    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    __Pyx_GOTREF(__pyx_t_1);
+  } else {
+    __pyx_t_5 = PyTuple_New(1+1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_4); __pyx_t_4 = NULL;
+    __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_5, 0+1, __pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_5, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 99; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_1);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  }
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_r = __pyx_t_1;
+  __pyx_t_1 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "_proj.pyx":92
+ *         pj_ctx_free(self.projctx)
+ * 
+ *     def to_latlong(self):             # <<<<<<<<<<<<<<
+ *         """return a new Proj instance which is the geographic (lat/lon)
+ *         coordinate version of the current projection"""
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_AddTraceback("_proj.Proj.to_latlong", __pyx_clineno, __pyx_lineno, __pyx_filename);
+  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_AddTraceback("_proj.Proj.to_latlong", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
@@ -1361,6 +1397,14 @@ static PyObject *__pyx_pf_5_proj_4Proj_4to_latlong(struct __pyx_obj_5_proj_Proj
   return __pyx_r;
 }
 
+/* "_proj.pyx":101
+ *         return _createproj(initstring)
+ * 
+ *     def __reduce__(self):             # <<<<<<<<<<<<<<
+ *         """special method that allows pyproj.Proj instance to be pickled"""
+ *         return (self.__class__,(self.srs,))
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static char __pyx_doc_5_proj_4Proj_6__reduce__[] = "special method that allows pyproj.Proj instance to be pickled";
@@ -1369,18 +1413,12 @@ static PyObject *__pyx_pw_5_proj_4Proj_7__reduce__(PyObject *__pyx_v_self, CYTHO
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_6__reduce__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":101
- *         return _createproj(initstring)
- * 
- *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         """special method that allows pyproj.Proj instance to be pickled"""
- *         return (self.__class__,(self.srs,))
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_6__reduce__(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -1400,27 +1438,34 @@ static PyObject *__pyx_pf_5_proj_4Proj_6__reduce__(struct __pyx_obj_5_proj_Proj
  *     def _fwd(self, object lons, object lats, radians=False, errcheck=False):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s____class__); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_self->srs);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->srs);
   __Pyx_GIVEREF(__pyx_v_self->srs);
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->srs);
   __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 103; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_t_2));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
   __pyx_t_1 = 0;
   __pyx_t_2 = 0;
-  __pyx_r = ((PyObject *)__pyx_t_3);
+  __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "_proj.pyx":101
+ *         return _createproj(initstring)
+ * 
+ *     def __reduce__(self):             # <<<<<<<<<<<<<<
+ *         """special method that allows pyproj.Proj instance to be pickled"""
+ *         return (self.__class__,(self.srs,))
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
@@ -1433,6 +1478,14 @@ static PyObject *__pyx_pf_5_proj_4Proj_6__reduce__(struct __pyx_obj_5_proj_Proj
   return __pyx_r;
 }
 
+/* "_proj.pyx":105
+ *         return (self.__class__,(self.srs,))
+ * 
+ *     def _fwd(self, object lons, object lats, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  forward transformation - lons,lats to x,y (done in place).
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_9_fwd(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_5_proj_4Proj_8_fwd[] = "\n forward transformation - lons,lats to x,y (done in place).\n if radians=True, lons/lats are radians instead of degrees.\n if errcheck=True, an exception is raised if the forward transformation is invalid.\n if errcheck=False and the forward transformation is invalid, no exception is\n raised and 1.e30 is returned.\n        ";
@@ -1448,10 +1501,10 @@ static PyObject *__pyx_pw_5_proj_4Proj_9_fwd(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_fwd (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lons,&__pyx_n_s__lats,&__pyx_n_s__radians,&__pyx_n_s__errcheck,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lons,&__pyx_n_s_lats,&__pyx_n_s_radians,&__pyx_n_s_errcheck,0};
     PyObject* values[4] = {0,0,0,0};
-    values[2] = __pyx_k_1;
-    values[3] = __pyx_k_2;
+    values[2] = ((PyObject *)Py_False);
+    values[3] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -1466,21 +1519,21 @@ static PyObject *__pyx_pw_5_proj_4Proj_9_fwd(PyObject *__pyx_v_self, PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lons)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lons)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lats)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lats)) != 0)) kw_args--;
         else {
           __Pyx_RaiseArgtupleInvalid("_fwd", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__radians);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_radians);
           if (value) { values[2] = value; kw_args--; }
         }
         case  3:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__errcheck);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_errcheck);
           if (value) { values[3] = value; kw_args--; }
         }
       }
@@ -1511,18 +1564,12 @@ static PyObject *__pyx_pw_5_proj_4Proj_9_fwd(PyObject *__pyx_v_self, PyObject *_
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Proj_8_fwd(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self), __pyx_v_lons, __pyx_v_lats, __pyx_v_radians, __pyx_v_errcheck);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":105
- *         return (self.__class__,(self.srs,))
- * 
- *     def _fwd(self, object lons, object lats, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
- *         """
- *  forward transformation - lons,lats to x,y (done in place).
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx_v_self, PyObject *__pyx_v_lons, PyObject *__pyx_v_lats, PyObject *__pyx_v_radians, PyObject *__pyx_v_errcheck) {
   projUV __pyx_v_projxyout;
   projUV __pyx_v_projlonlatin;
@@ -1543,14 +1590,13 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
   PyObject *__pyx_t_4 = NULL;
   Py_ssize_t __pyx_t_5;
   int __pyx_t_6;
-  int __pyx_t_7;
-  double __pyx_t_8;
+  double __pyx_t_7;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_fwd", 0);
 
-  /* "_proj.pyx":120
+  /* "_proj.pyx":122
  *         cdef int err
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(lons, &londata, &buflenx) <> 0:             # <<<<<<<<<<<<<<
@@ -1560,7 +1606,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lons, (&__pyx_v_londata), (&__pyx_v_buflenx)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":121
+    /* "_proj.pyx":123
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(lons, &londata, &buflenx) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -1568,12 +1614,18 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":122
+ *         cdef int err
+ *         # if buffer api is supported, get pointer to data buffers.
+ *         if PyObject_AsWriteBuffer(lons, &londata, &buflenx) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats, &latdata, &bufleny) <> 0:
+ */
   }
-  __pyx_L3:;
 
-  /* "_proj.pyx":122
+  /* "_proj.pyx":124
  *         if PyObject_AsWriteBuffer(lons, &londata, &buflenx) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats, &latdata, &bufleny) <> 0:             # <<<<<<<<<<<<<<
@@ -1583,7 +1635,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lats, (&__pyx_v_latdata), (&__pyx_v_bufleny)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":123
+    /* "_proj.pyx":125
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats, &latdata, &bufleny) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -1591,12 +1643,18 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  *         if buflenx != bufleny:
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 123; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":124
+ *         if PyObject_AsWriteBuffer(lons, &londata, &buflenx) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats, &latdata, &bufleny) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         # process data in buffer
+ */
   }
-  __pyx_L4:;
 
-  /* "_proj.pyx":125
+  /* "_proj.pyx":127
  *             raise RuntimeError
  *         # process data in buffer
  *         if buflenx != bufleny:             # <<<<<<<<<<<<<<
@@ -1606,42 +1664,48 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
   __pyx_t_1 = ((__pyx_v_buflenx != __pyx_v_bufleny) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":126
+    /* "_proj.pyx":128
  *         # process data in buffer
  *         if buflenx != bufleny:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenx//_doublesize
  *         lonsdata = <double *>londata
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_4), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":127
+ *             raise RuntimeError
+ *         # process data in buffer
+ *         if buflenx != bufleny:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError("Buffer lengths not the same")
+ *         ndim = buflenx//_doublesize
+ */
   }
-  __pyx_L5:;
 
-  /* "_proj.pyx":127
+  /* "_proj.pyx":129
  *         if buflenx != bufleny:
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenx//_doublesize             # <<<<<<<<<<<<<<
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata
  */
-  __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_buflenx); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_buflenx); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s___doublesize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_doublesize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = PyNumber_FloorDivide(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_FloorDivide(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 129; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_v_ndim = __pyx_t_5;
 
-  /* "_proj.pyx":128
+  /* "_proj.pyx":130
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenx//_doublesize
  *         lonsdata = <double *>londata             # <<<<<<<<<<<<<<
@@ -1650,7 +1714,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
   __pyx_v_lonsdata = ((double *)__pyx_v_londata);
 
-  /* "_proj.pyx":129
+  /* "_proj.pyx":131
  *         ndim = buflenx//_doublesize
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata             # <<<<<<<<<<<<<<
@@ -1659,7 +1723,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
   __pyx_v_latsdata = ((double *)__pyx_v_latdata);
 
-  /* "_proj.pyx":130
+  /* "_proj.pyx":132
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata
  *         for i from 0 <= i < ndim:             # <<<<<<<<<<<<<<
@@ -1669,23 +1733,25 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
   __pyx_t_5 = __pyx_v_ndim;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "_proj.pyx":132
+    /* "_proj.pyx":134
  *         for i from 0 <= i < ndim:
  *             # if inputs are nan's, return big number.
  *             if lonsdata[i] != lonsdata[i] or latsdata[i] != latsdata[i]:             # <<<<<<<<<<<<<<
  *                 lonsdata[i]=1.e30; latsdata[i]=1.e30
  *                 if errcheck:
  */
-    __pyx_t_1 = (((__pyx_v_lonsdata[__pyx_v_i]) != (__pyx_v_lonsdata[__pyx_v_i])) != 0);
-    if (!__pyx_t_1) {
-      __pyx_t_6 = (((__pyx_v_latsdata[__pyx_v_i]) != (__pyx_v_latsdata[__pyx_v_i])) != 0);
-      __pyx_t_7 = __pyx_t_6;
+    __pyx_t_6 = (((__pyx_v_lonsdata[__pyx_v_i]) != (__pyx_v_lonsdata[__pyx_v_i])) != 0);
+    if (!__pyx_t_6) {
     } else {
-      __pyx_t_7 = __pyx_t_1;
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L9_bool_binop_done;
     }
-    if (__pyx_t_7) {
+    __pyx_t_6 = (((__pyx_v_latsdata[__pyx_v_i]) != (__pyx_v_latsdata[__pyx_v_i])) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L9_bool_binop_done:;
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":133
+      /* "_proj.pyx":135
  *             # if inputs are nan's, return big number.
  *             if lonsdata[i] != lonsdata[i] or latsdata[i] != latsdata[i]:
  *                 lonsdata[i]=1.e30; latsdata[i]=1.e30             # <<<<<<<<<<<<<<
@@ -1695,33 +1761,39 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
       (__pyx_v_lonsdata[__pyx_v_i]) = 1.e30;
       (__pyx_v_latsdata[__pyx_v_i]) = 1.e30;
 
-      /* "_proj.pyx":134
+      /* "_proj.pyx":136
  *             if lonsdata[i] != lonsdata[i] or latsdata[i] != latsdata[i]:
  *                 lonsdata[i]=1.e30; latsdata[i]=1.e30
  *                 if errcheck:             # <<<<<<<<<<<<<<
  *                     raise RuntimeError('projection undefined')
  *                 continue
  */
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (__pyx_t_7) {
+      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__pyx_t_1) {
 
-        /* "_proj.pyx":135
+        /* "_proj.pyx":137
  *                 lonsdata[i]=1.e30; latsdata[i]=1.e30
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 continue
  *             if radians:
  */
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_6), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L9;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":136
+ *             if lonsdata[i] != lonsdata[i] or latsdata[i] != latsdata[i]:
+ *                 lonsdata[i]=1.e30; latsdata[i]=1.e30
+ *                 if errcheck:             # <<<<<<<<<<<<<<
+ *                     raise RuntimeError('projection undefined')
+ *                 continue
+ */
       }
-      __pyx_L9:;
 
-      /* "_proj.pyx":136
+      /* "_proj.pyx":138
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  *                 continue             # <<<<<<<<<<<<<<
@@ -1729,21 +1801,27 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  *                 projlonlatin.u = lonsdata[i]
  */
       goto __pyx_L6_continue;
-      goto __pyx_L8;
+
+      /* "_proj.pyx":134
+ *         for i from 0 <= i < ndim:
+ *             # if inputs are nan's, return big number.
+ *             if lonsdata[i] != lonsdata[i] or latsdata[i] != latsdata[i]:             # <<<<<<<<<<<<<<
+ *                 lonsdata[i]=1.e30; latsdata[i]=1.e30
+ *                 if errcheck:
+ */
     }
-    __pyx_L8:;
 
-    /* "_proj.pyx":137
+    /* "_proj.pyx":139
  *                     raise RuntimeError('projection undefined')
  *                 continue
  *             if radians:             # <<<<<<<<<<<<<<
  *                 projlonlatin.u = lonsdata[i]
  *                 projlonlatin.v = latsdata[i]
  */
-    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (__pyx_t_7) {
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 139; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":138
+      /* "_proj.pyx":140
  *                 continue
  *             if radians:
  *                 projlonlatin.u = lonsdata[i]             # <<<<<<<<<<<<<<
@@ -1752,7 +1830,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
       __pyx_v_projlonlatin.u = (__pyx_v_lonsdata[__pyx_v_i]);
 
-      /* "_proj.pyx":139
+      /* "_proj.pyx":141
  *             if radians:
  *                 projlonlatin.u = lonsdata[i]
  *                 projlonlatin.v = latsdata[i]             # <<<<<<<<<<<<<<
@@ -1760,20 +1838,28 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  *                 projlonlatin.u = _dg2rad*lonsdata[i]
  */
       __pyx_v_projlonlatin.v = (__pyx_v_latsdata[__pyx_v_i]);
-      goto __pyx_L10;
+
+      /* "_proj.pyx":139
+ *                     raise RuntimeError('projection undefined')
+ *                 continue
+ *             if radians:             # <<<<<<<<<<<<<<
+ *                 projlonlatin.u = lonsdata[i]
+ *                 projlonlatin.v = latsdata[i]
+ */
+      goto __pyx_L12;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":141
+    /* "_proj.pyx":143
  *                 projlonlatin.v = latsdata[i]
  *             else:
  *                 projlonlatin.u = _dg2rad*lonsdata[i]             # <<<<<<<<<<<<<<
  *                 projlonlatin.v = _dg2rad*latsdata[i]
  *             projxyout = pj_fwd(projlonlatin,self.projpj)
  */
+    /*else*/ {
       __pyx_v_projlonlatin.u = (__pyx_v_5_proj__dg2rad * (__pyx_v_lonsdata[__pyx_v_i]));
 
-      /* "_proj.pyx":142
+      /* "_proj.pyx":144
  *             else:
  *                 projlonlatin.u = _dg2rad*lonsdata[i]
  *                 projlonlatin.v = _dg2rad*latsdata[i]             # <<<<<<<<<<<<<<
@@ -1782,9 +1868,9 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
       __pyx_v_projlonlatin.v = (__pyx_v_5_proj__dg2rad * (__pyx_v_latsdata[__pyx_v_i]));
     }
-    __pyx_L10:;
+    __pyx_L12:;
 
-    /* "_proj.pyx":143
+    /* "_proj.pyx":145
  *                 projlonlatin.u = _dg2rad*lonsdata[i]
  *                 projlonlatin.v = _dg2rad*latsdata[i]
  *             projxyout = pj_fwd(projlonlatin,self.projpj)             # <<<<<<<<<<<<<<
@@ -1793,17 +1879,17 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
     __pyx_v_projxyout = pj_fwd(__pyx_v_projlonlatin, __pyx_v_self->projpj);
 
-    /* "_proj.pyx":144
+    /* "_proj.pyx":146
  *                 projlonlatin.v = _dg2rad*latsdata[i]
  *             projxyout = pj_fwd(projlonlatin,self.projpj)
  *             if errcheck:             # <<<<<<<<<<<<<<
  *                 err = pj_ctx_get_errno(self.projctx)
  *                 if err != 0:
  */
-    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (__pyx_t_7) {
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":145
+      /* "_proj.pyx":147
  *             projxyout = pj_fwd(projlonlatin,self.projpj)
  *             if errcheck:
  *                 err = pj_ctx_get_errno(self.projctx)             # <<<<<<<<<<<<<<
@@ -1812,94 +1898,122 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
       __pyx_v_err = pj_ctx_get_errno(__pyx_v_self->projctx);
 
-      /* "_proj.pyx":146
+      /* "_proj.pyx":148
  *             if errcheck:
  *                 err = pj_ctx_get_errno(self.projctx)
  *                 if err != 0:             # <<<<<<<<<<<<<<
  *                      raise RuntimeError(pj_strerrno(err))
  *             # since HUGE_VAL can be 'inf',
  */
-      __pyx_t_7 = ((__pyx_v_err != 0) != 0);
-      if (__pyx_t_7) {
+      __pyx_t_1 = ((__pyx_v_err != 0) != 0);
+      if (__pyx_t_1) {
 
-        /* "_proj.pyx":147
+        /* "_proj.pyx":149
  *                 err = pj_ctx_get_errno(self.projctx)
  *                 if err != 0:
  *                      raise RuntimeError(pj_strerrno(err))             # <<<<<<<<<<<<<<
  *             # since HUGE_VAL can be 'inf',
  *             # change it to a real (but very large) number.
  */
-        __pyx_t_4 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_4));
-        __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+        __Pyx_GIVEREF(__pyx_t_4);
+        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L12;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":148
+ *             if errcheck:
+ *                 err = pj_ctx_get_errno(self.projctx)
+ *                 if err != 0:             # <<<<<<<<<<<<<<
+ *                      raise RuntimeError(pj_strerrno(err))
+ *             # since HUGE_VAL can be 'inf',
+ */
       }
-      __pyx_L12:;
-      goto __pyx_L11;
+
+      /* "_proj.pyx":146
+ *                 projlonlatin.v = _dg2rad*latsdata[i]
+ *             projxyout = pj_fwd(projlonlatin,self.projpj)
+ *             if errcheck:             # <<<<<<<<<<<<<<
+ *                 err = pj_ctx_get_errno(self.projctx)
+ *                 if err != 0:
+ */
     }
-    __pyx_L11:;
 
-    /* "_proj.pyx":151
+    /* "_proj.pyx":153
  *             # change it to a real (but very large) number.
  *             # also check for NaNs.
  *             if projxyout.u == HUGE_VAL or\             # <<<<<<<<<<<<<<
  *                projxyout.u != projxyout.u:
  *                 if errcheck:
  */
-    __pyx_t_7 = ((__pyx_v_projxyout.u == HUGE_VAL) != 0);
-    if (!__pyx_t_7) {
+    __pyx_t_6 = ((__pyx_v_projxyout.u == HUGE_VAL) != 0);
+    if (!__pyx_t_6) {
+    } else {
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L16_bool_binop_done;
+    }
 
-      /* "_proj.pyx":152
+    /* "_proj.pyx":154
  *             # also check for NaNs.
  *             if projxyout.u == HUGE_VAL or\
  *                projxyout.u != projxyout.u:             # <<<<<<<<<<<<<<
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  */
-      __pyx_t_1 = ((__pyx_v_projxyout.u != __pyx_v_projxyout.u) != 0);
-      __pyx_t_6 = __pyx_t_1;
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-    }
-    if (__pyx_t_6) {
+    __pyx_t_6 = ((__pyx_v_projxyout.u != __pyx_v_projxyout.u) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L16_bool_binop_done:;
 
-      /* "_proj.pyx":153
+    /* "_proj.pyx":153
+ *             # change it to a real (but very large) number.
+ *             # also check for NaNs.
+ *             if projxyout.u == HUGE_VAL or\             # <<<<<<<<<<<<<<
+ *                projxyout.u != projxyout.u:
+ *                 if errcheck:
+ */
+    if (__pyx_t_1) {
+
+      /* "_proj.pyx":155
  *             if projxyout.u == HUGE_VAL or\
  *                projxyout.u != projxyout.u:
  *                 if errcheck:             # <<<<<<<<<<<<<<
  *                     raise RuntimeError('projection undefined')
  *                 lonsdata[i] = 1.e30
  */
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 153; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (__pyx_t_6) {
+      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__pyx_t_1) {
 
-        /* "_proj.pyx":154
+        /* "_proj.pyx":156
  *                projxyout.u != projxyout.u:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 lonsdata[i] = 1.e30
  *             else:
  */
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_7), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L14;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":155
+ *             if projxyout.u == HUGE_VAL or\
+ *                projxyout.u != projxyout.u:
+ *                 if errcheck:             # <<<<<<<<<<<<<<
+ *                     raise RuntimeError('projection undefined')
+ *                 lonsdata[i] = 1.e30
+ */
       }
-      __pyx_L14:;
 
-      /* "_proj.pyx":155
+      /* "_proj.pyx":157
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  *                 lonsdata[i] = 1.e30             # <<<<<<<<<<<<<<
@@ -1907,23 +2021,31 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  *                 lonsdata[i] = projxyout.u
  */
       (__pyx_v_lonsdata[__pyx_v_i]) = 1.e30;
-      goto __pyx_L13;
+
+      /* "_proj.pyx":153
+ *             # change it to a real (but very large) number.
+ *             # also check for NaNs.
+ *             if projxyout.u == HUGE_VAL or\             # <<<<<<<<<<<<<<
+ *                projxyout.u != projxyout.u:
+ *                 if errcheck:
+ */
+      goto __pyx_L15;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":157
+    /* "_proj.pyx":159
  *                 lonsdata[i] = 1.e30
  *             else:
  *                 lonsdata[i] = projxyout.u             # <<<<<<<<<<<<<<
  *             if projxyout.v == HUGE_VAL or\
  *                projxyout.u != projxyout.u:
  */
-      __pyx_t_8 = __pyx_v_projxyout.u;
-      (__pyx_v_lonsdata[__pyx_v_i]) = __pyx_t_8;
+    /*else*/ {
+      __pyx_t_7 = __pyx_v_projxyout.u;
+      (__pyx_v_lonsdata[__pyx_v_i]) = __pyx_t_7;
     }
-    __pyx_L13:;
+    __pyx_L15:;
 
-    /* "_proj.pyx":158
+    /* "_proj.pyx":160
  *             else:
  *                 lonsdata[i] = projxyout.u
  *             if projxyout.v == HUGE_VAL or\             # <<<<<<<<<<<<<<
@@ -1932,48 +2054,64 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  */
     __pyx_t_6 = ((__pyx_v_projxyout.v == HUGE_VAL) != 0);
     if (!__pyx_t_6) {
+    } else {
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L20_bool_binop_done;
+    }
 
-      /* "_proj.pyx":159
+    /* "_proj.pyx":161
  *                 lonsdata[i] = projxyout.u
  *             if projxyout.v == HUGE_VAL or\
  *                projxyout.u != projxyout.u:             # <<<<<<<<<<<<<<
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  */
-      __pyx_t_7 = ((__pyx_v_projxyout.u != __pyx_v_projxyout.u) != 0);
-      __pyx_t_1 = __pyx_t_7;
-    } else {
-      __pyx_t_1 = __pyx_t_6;
-    }
+    __pyx_t_6 = ((__pyx_v_projxyout.u != __pyx_v_projxyout.u) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L20_bool_binop_done:;
+
+    /* "_proj.pyx":160
+ *             else:
+ *                 lonsdata[i] = projxyout.u
+ *             if projxyout.v == HUGE_VAL or\             # <<<<<<<<<<<<<<
+ *                projxyout.u != projxyout.u:
+ *                 if errcheck:
+ */
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":160
+      /* "_proj.pyx":162
  *             if projxyout.v == HUGE_VAL or\
  *                projxyout.u != projxyout.u:
  *                 if errcheck:             # <<<<<<<<<<<<<<
  *                     raise RuntimeError('projection undefined')
  *                 latsdata[i] = 1.e30
  */
-      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 160; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_1) {
 
-        /* "_proj.pyx":161
+        /* "_proj.pyx":163
  *                projxyout.u != projxyout.u:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 latsdata[i] = 1.e30
  *             else:
  */
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_8), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__4, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L16;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":162
+ *             if projxyout.v == HUGE_VAL or\
+ *                projxyout.u != projxyout.u:
+ *                 if errcheck:             # <<<<<<<<<<<<<<
+ *                     raise RuntimeError('projection undefined')
+ *                 latsdata[i] = 1.e30
+ */
       }
-      __pyx_L16:;
 
-      /* "_proj.pyx":162
+      /* "_proj.pyx":164
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  *                 latsdata[i] = 1.e30             # <<<<<<<<<<<<<<
@@ -1981,24 +2119,41 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
  *                 latsdata[i] = projxyout.v
  */
       (__pyx_v_latsdata[__pyx_v_i]) = 1.e30;
-      goto __pyx_L15;
+
+      /* "_proj.pyx":160
+ *             else:
+ *                 lonsdata[i] = projxyout.u
+ *             if projxyout.v == HUGE_VAL or\             # <<<<<<<<<<<<<<
+ *                projxyout.u != projxyout.u:
+ *                 if errcheck:
+ */
+      goto __pyx_L19;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":164
+    /* "_proj.pyx":166
  *                 latsdata[i] = 1.e30
  *             else:
  *                 latsdata[i] = projxyout.v             # <<<<<<<<<<<<<<
  * 
  *     def _inv(self, object x, object y, radians=False, errcheck=False):
  */
-      __pyx_t_8 = __pyx_v_projxyout.v;
-      (__pyx_v_latsdata[__pyx_v_i]) = __pyx_t_8;
+    /*else*/ {
+      __pyx_t_7 = __pyx_v_projxyout.v;
+      (__pyx_v_latsdata[__pyx_v_i]) = __pyx_t_7;
     }
-    __pyx_L15:;
+    __pyx_L19:;
     __pyx_L6_continue:;
   }
 
+  /* "_proj.pyx":105
+ *         return (self.__class__,(self.srs,))
+ * 
+ *     def _fwd(self, object lons, object lats, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  forward transformation - lons,lats to x,y (done in place).
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -2013,6 +2168,14 @@ static PyObject *__pyx_pf_5_proj_4Proj_8_fwd(struct __pyx_obj_5_proj_Proj *__pyx
   return __pyx_r;
 }
 
+/* "_proj.pyx":168
+ *                 latsdata[i] = projxyout.v
+ * 
+ *     def _inv(self, object x, object y, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  inverse transformation - x,y to lons,lats (done in place).
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_11_inv(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_5_proj_4Proj_10_inv[] = "\n inverse transformation - x,y to lons,lats (done in place).\n if radians=True, lons/lats are radians instead of degrees.\n if errcheck=True, an exception is raised if the inverse transformation is invalid.\n if errcheck=False and the inverse transformation is invalid, no exception is\n raised and 1.e30 is returned.\n        ";
@@ -2028,10 +2191,10 @@ static PyObject *__pyx_pw_5_proj_4Proj_11_inv(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_inv (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__x,&__pyx_n_s__y,&__pyx_n_s__radians,&__pyx_n_s__errcheck,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,&__pyx_n_s_radians,&__pyx_n_s_errcheck,0};
     PyObject* values[4] = {0,0,0,0};
-    values[2] = __pyx_k_9;
-    values[3] = __pyx_k_10;
+    values[2] = ((PyObject *)Py_False);
+    values[3] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -2046,26 +2209,26 @@ static PyObject *__pyx_pw_5_proj_4Proj_11_inv(PyObject *__pyx_v_self, PyObject *
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__x)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_inv", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_inv", 0, 2, 4, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__radians);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_radians);
           if (value) { values[2] = value; kw_args--; }
         }
         case  3:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__errcheck);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_errcheck);
           if (value) { values[3] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_inv") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_inv") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -2084,25 +2247,19 @@ static PyObject *__pyx_pw_5_proj_4Proj_11_inv(PyObject *__pyx_v_self, PyObject *
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("_inv", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("_inv", 0, 2, 4, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 168; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_proj.Proj._inv", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Proj_10_inv(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self), __pyx_v_x, __pyx_v_y, __pyx_v_radians, __pyx_v_errcheck);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":166
- *                 latsdata[i] = projxyout.v
- * 
- *     def _inv(self, object x, object y, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
- *         """
- *  inverse transformation - x,y to lons,lats (done in place).
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__pyx_v_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_radians, PyObject *__pyx_v_errcheck) {
   projUV __pyx_v_projxyin;
   projUV __pyx_v_projlonlatout;
@@ -2123,15 +2280,14 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
   PyObject *__pyx_t_4 = NULL;
   Py_ssize_t __pyx_t_5;
   int __pyx_t_6;
-  int __pyx_t_7;
-  double __pyx_t_8;
+  double __pyx_t_7;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_inv", 0);
 
-  /* "_proj.pyx":180
- *         cdef double *xdatab, *ydatab
+  /* "_proj.pyx":184
+ *         cdef double *ydatab
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:             # <<<<<<<<<<<<<<
  *             raise RuntimeError
@@ -2140,7 +2296,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_x, (&__pyx_v_xdata), (&__pyx_v_buflenx)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":181
+    /* "_proj.pyx":185
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -2148,13 +2304,19 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 181; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
-  }
-  __pyx_L3:;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "_proj.pyx":182
- *         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:
+    /* "_proj.pyx":184
+ *         cdef double *ydatab
+ *         # if buffer api is supported, get pointer to data buffers.
+ *         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(y, &ydata, &bufleny) <> 0:
+ */
+  }
+
+  /* "_proj.pyx":186
+ *         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(y, &ydata, &bufleny) <> 0:             # <<<<<<<<<<<<<<
  *             raise RuntimeError
@@ -2163,7 +2325,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_y, (&__pyx_v_ydata), (&__pyx_v_bufleny)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":183
+    /* "_proj.pyx":187
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(y, &ydata, &bufleny) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -2171,12 +2333,18 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  *         # (for numpy/regular python arrays).
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 183; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":186
+ *         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(y, &ydata, &bufleny) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         # process data in buffer
+ */
   }
-  __pyx_L4:;
 
-  /* "_proj.pyx":186
+  /* "_proj.pyx":190
  *         # process data in buffer
  *         # (for numpy/regular python arrays).
  *         if buflenx != bufleny:             # <<<<<<<<<<<<<<
@@ -2186,42 +2354,48 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
   __pyx_t_1 = ((__pyx_v_buflenx != __pyx_v_bufleny) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":187
+    /* "_proj.pyx":191
  *         # (for numpy/regular python arrays).
  *         if buflenx != bufleny:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenx//_doublesize
  *         xdatab = <double *>xdata
  */
-    __pyx_t_2 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_2);
     __Pyx_Raise(__pyx_t_2, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":190
+ *         # process data in buffer
+ *         # (for numpy/regular python arrays).
+ *         if buflenx != bufleny:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError("Buffer lengths not the same")
+ *         ndim = buflenx//_doublesize
+ */
   }
-  __pyx_L5:;
 
-  /* "_proj.pyx":188
+  /* "_proj.pyx":192
  *         if buflenx != bufleny:
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenx//_doublesize             # <<<<<<<<<<<<<<
  *         xdatab = <double *>xdata
  *         ydatab = <double *>ydata
  */
-  __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_buflenx); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyInt_FromSsize_t(__pyx_v_buflenx); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s___doublesize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_doublesize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = PyNumber_FloorDivide(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = PyNumber_FloorDivide(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = __Pyx_PyIndex_AsSsize_t(__pyx_t_4); if (unlikely((__pyx_t_5 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
   __pyx_v_ndim = __pyx_t_5;
 
-  /* "_proj.pyx":189
+  /* "_proj.pyx":193
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenx//_doublesize
  *         xdatab = <double *>xdata             # <<<<<<<<<<<<<<
@@ -2230,7 +2404,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
   __pyx_v_xdatab = ((double *)__pyx_v_xdata);
 
-  /* "_proj.pyx":190
+  /* "_proj.pyx":194
  *         ndim = buflenx//_doublesize
  *         xdatab = <double *>xdata
  *         ydatab = <double *>ydata             # <<<<<<<<<<<<<<
@@ -2239,7 +2413,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
   __pyx_v_ydatab = ((double *)__pyx_v_ydata);
 
-  /* "_proj.pyx":191
+  /* "_proj.pyx":195
  *         xdatab = <double *>xdata
  *         ydatab = <double *>ydata
  *         for i from 0 <= i < ndim:             # <<<<<<<<<<<<<<
@@ -2249,23 +2423,25 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
   __pyx_t_5 = __pyx_v_ndim;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_5; __pyx_v_i++) {
 
-    /* "_proj.pyx":193
+    /* "_proj.pyx":197
  *         for i from 0 <= i < ndim:
  *             # if inputs are nan's, return big number.
  *             if xdatab[i] != xdatab[i] or ydatab[i] != ydatab[i]:             # <<<<<<<<<<<<<<
  *                 xdatab[i]=1.e30; ydatab[i]=1.e30
  *                 if errcheck:
  */
-    __pyx_t_1 = (((__pyx_v_xdatab[__pyx_v_i]) != (__pyx_v_xdatab[__pyx_v_i])) != 0);
-    if (!__pyx_t_1) {
-      __pyx_t_6 = (((__pyx_v_ydatab[__pyx_v_i]) != (__pyx_v_ydatab[__pyx_v_i])) != 0);
-      __pyx_t_7 = __pyx_t_6;
+    __pyx_t_6 = (((__pyx_v_xdatab[__pyx_v_i]) != (__pyx_v_xdatab[__pyx_v_i])) != 0);
+    if (!__pyx_t_6) {
     } else {
-      __pyx_t_7 = __pyx_t_1;
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L9_bool_binop_done;
     }
-    if (__pyx_t_7) {
+    __pyx_t_6 = (((__pyx_v_ydatab[__pyx_v_i]) != (__pyx_v_ydatab[__pyx_v_i])) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L9_bool_binop_done:;
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":194
+      /* "_proj.pyx":198
  *             # if inputs are nan's, return big number.
  *             if xdatab[i] != xdatab[i] or ydatab[i] != ydatab[i]:
  *                 xdatab[i]=1.e30; ydatab[i]=1.e30             # <<<<<<<<<<<<<<
@@ -2275,33 +2451,39 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
       (__pyx_v_xdatab[__pyx_v_i]) = 1.e30;
       (__pyx_v_ydatab[__pyx_v_i]) = 1.e30;
 
-      /* "_proj.pyx":195
+      /* "_proj.pyx":199
  *             if xdatab[i] != xdatab[i] or ydatab[i] != ydatab[i]:
  *                 xdatab[i]=1.e30; ydatab[i]=1.e30
  *                 if errcheck:             # <<<<<<<<<<<<<<
  *                     raise RuntimeError('projection undefined')
  *                 continue
  */
-      __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (__pyx_t_7) {
+      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__pyx_t_1) {
 
-        /* "_proj.pyx":196
+        /* "_proj.pyx":200
  *                 xdatab[i]=1.e30; ydatab[i]=1.e30
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 continue
  *             projxyin.u = xdatab[i]
  */
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_12), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L9;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":199
+ *             if xdatab[i] != xdatab[i] or ydatab[i] != ydatab[i]:
+ *                 xdatab[i]=1.e30; ydatab[i]=1.e30
+ *                 if errcheck:             # <<<<<<<<<<<<<<
+ *                     raise RuntimeError('projection undefined')
+ *                 continue
+ */
       }
-      __pyx_L9:;
 
-      /* "_proj.pyx":197
+      /* "_proj.pyx":201
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  *                 continue             # <<<<<<<<<<<<<<
@@ -2309,11 +2491,17 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  *             projxyin.v = ydatab[i]
  */
       goto __pyx_L6_continue;
-      goto __pyx_L8;
+
+      /* "_proj.pyx":197
+ *         for i from 0 <= i < ndim:
+ *             # if inputs are nan's, return big number.
+ *             if xdatab[i] != xdatab[i] or ydatab[i] != ydatab[i]:             # <<<<<<<<<<<<<<
+ *                 xdatab[i]=1.e30; ydatab[i]=1.e30
+ *                 if errcheck:
+ */
     }
-    __pyx_L8:;
 
-    /* "_proj.pyx":198
+    /* "_proj.pyx":202
  *                     raise RuntimeError('projection undefined')
  *                 continue
  *             projxyin.u = xdatab[i]             # <<<<<<<<<<<<<<
@@ -2322,7 +2510,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
     __pyx_v_projxyin.u = (__pyx_v_xdatab[__pyx_v_i]);
 
-    /* "_proj.pyx":199
+    /* "_proj.pyx":203
  *                 continue
  *             projxyin.u = xdatab[i]
  *             projxyin.v = ydatab[i]             # <<<<<<<<<<<<<<
@@ -2331,7 +2519,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
     __pyx_v_projxyin.v = (__pyx_v_ydatab[__pyx_v_i]);
 
-    /* "_proj.pyx":200
+    /* "_proj.pyx":204
  *             projxyin.u = xdatab[i]
  *             projxyin.v = ydatab[i]
  *             projlonlatout = pj_inv(projxyin,self.projpj)             # <<<<<<<<<<<<<<
@@ -2340,17 +2528,17 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
     __pyx_v_projlonlatout = pj_inv(__pyx_v_projxyin, __pyx_v_self->projpj);
 
-    /* "_proj.pyx":201
+    /* "_proj.pyx":205
  *             projxyin.v = ydatab[i]
  *             projlonlatout = pj_inv(projxyin,self.projpj)
  *             if errcheck:             # <<<<<<<<<<<<<<
  *                 err = pj_ctx_get_errno(self.projctx)
  *                 if err != 0:
  */
-    __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (__pyx_t_7) {
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 205; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":202
+      /* "_proj.pyx":206
  *             projlonlatout = pj_inv(projxyin,self.projpj)
  *             if errcheck:
  *                 err = pj_ctx_get_errno(self.projctx)             # <<<<<<<<<<<<<<
@@ -2359,94 +2547,122 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
       __pyx_v_err = pj_ctx_get_errno(__pyx_v_self->projctx);
 
-      /* "_proj.pyx":203
+      /* "_proj.pyx":207
  *             if errcheck:
  *                 err = pj_ctx_get_errno(self.projctx)
  *                 if err != 0:             # <<<<<<<<<<<<<<
  *                      raise RuntimeError(pj_strerrno(err))
  *             # since HUGE_VAL can be 'inf',
  */
-      __pyx_t_7 = ((__pyx_v_err != 0) != 0);
-      if (__pyx_t_7) {
+      __pyx_t_1 = ((__pyx_v_err != 0) != 0);
+      if (__pyx_t_1) {
 
-        /* "_proj.pyx":204
+        /* "_proj.pyx":208
  *                 err = pj_ctx_get_errno(self.projctx)
  *                 if err != 0:
  *                      raise RuntimeError(pj_strerrno(err))             # <<<<<<<<<<<<<<
  *             # since HUGE_VAL can be 'inf',
  *             # change it to a real (but very large) number.
  */
-        __pyx_t_4 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_3);
-        PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_4));
-        __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
+        __Pyx_GIVEREF(__pyx_t_4);
+        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_4);
         __pyx_t_4 = 0;
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
-        __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
+        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L11;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 208; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":207
+ *             if errcheck:
+ *                 err = pj_ctx_get_errno(self.projctx)
+ *                 if err != 0:             # <<<<<<<<<<<<<<
+ *                      raise RuntimeError(pj_strerrno(err))
+ *             # since HUGE_VAL can be 'inf',
+ */
       }
-      __pyx_L11:;
-      goto __pyx_L10;
+
+      /* "_proj.pyx":205
+ *             projxyin.v = ydatab[i]
+ *             projlonlatout = pj_inv(projxyin,self.projpj)
+ *             if errcheck:             # <<<<<<<<<<<<<<
+ *                 err = pj_ctx_get_errno(self.projctx)
+ *                 if err != 0:
+ */
     }
-    __pyx_L10:;
 
-    /* "_proj.pyx":208
+    /* "_proj.pyx":212
  *             # change it to a real (but very large) number.
  *             # also check for NaNs.
  *             if projlonlatout.u == HUGE_VAL or \             # <<<<<<<<<<<<<<
  *                projlonlatout.u != projlonlatout.u:
  *                 if errcheck:
  */
-    __pyx_t_7 = ((__pyx_v_projlonlatout.u == HUGE_VAL) != 0);
-    if (!__pyx_t_7) {
+    __pyx_t_6 = ((__pyx_v_projlonlatout.u == HUGE_VAL) != 0);
+    if (!__pyx_t_6) {
+    } else {
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L15_bool_binop_done;
+    }
 
-      /* "_proj.pyx":209
+    /* "_proj.pyx":213
  *             # also check for NaNs.
  *             if projlonlatout.u == HUGE_VAL or \
  *                projlonlatout.u != projlonlatout.u:             # <<<<<<<<<<<<<<
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  */
-      __pyx_t_1 = ((__pyx_v_projlonlatout.u != __pyx_v_projlonlatout.u) != 0);
-      __pyx_t_6 = __pyx_t_1;
-    } else {
-      __pyx_t_6 = __pyx_t_7;
-    }
-    if (__pyx_t_6) {
+    __pyx_t_6 = ((__pyx_v_projlonlatout.u != __pyx_v_projlonlatout.u) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L15_bool_binop_done:;
+
+    /* "_proj.pyx":212
+ *             # change it to a real (but very large) number.
+ *             # also check for NaNs.
+ *             if projlonlatout.u == HUGE_VAL or \             # <<<<<<<<<<<<<<
+ *                projlonlatout.u != projlonlatout.u:
+ *                 if errcheck:
+ */
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":210
+      /* "_proj.pyx":214
  *             if projlonlatout.u == HUGE_VAL or \
  *                projlonlatout.u != projlonlatout.u:
  *                 if errcheck:             # <<<<<<<<<<<<<<
  *                     raise RuntimeError('projection undefined')
  *                 xdatab[i] = 1.e30
  */
-      __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      if (__pyx_t_6) {
+      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      if (__pyx_t_1) {
 
-        /* "_proj.pyx":211
+        /* "_proj.pyx":215
  *                projlonlatout.u != projlonlatout.u:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 xdatab[i] = 1.e30
  *             elif radians:
  */
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_13), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__7, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L13;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":214
+ *             if projlonlatout.u == HUGE_VAL or \
+ *                projlonlatout.u != projlonlatout.u:
+ *                 if errcheck:             # <<<<<<<<<<<<<<
+ *                     raise RuntimeError('projection undefined')
+ *                 xdatab[i] = 1.e30
+ */
       }
-      __pyx_L13:;
 
-      /* "_proj.pyx":212
+      /* "_proj.pyx":216
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  *                 xdatab[i] = 1.e30             # <<<<<<<<<<<<<<
@@ -2454,44 +2670,60 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  *                 xdatab[i] = projlonlatout.u
  */
       (__pyx_v_xdatab[__pyx_v_i]) = 1.e30;
-      goto __pyx_L12;
+
+      /* "_proj.pyx":212
+ *             # change it to a real (but very large) number.
+ *             # also check for NaNs.
+ *             if projlonlatout.u == HUGE_VAL or \             # <<<<<<<<<<<<<<
+ *                projlonlatout.u != projlonlatout.u:
+ *                 if errcheck:
+ */
+      goto __pyx_L14;
     }
 
-    /* "_proj.pyx":213
+    /* "_proj.pyx":217
  *                     raise RuntimeError('projection undefined')
  *                 xdatab[i] = 1.e30
  *             elif radians:             # <<<<<<<<<<<<<<
  *                 xdatab[i] = projlonlatout.u
  *             else:
  */
-    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (__pyx_t_6) {
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (__pyx_t_1) {
 
-      /* "_proj.pyx":214
+      /* "_proj.pyx":218
  *                 xdatab[i] = 1.e30
  *             elif radians:
  *                 xdatab[i] = projlonlatout.u             # <<<<<<<<<<<<<<
  *             else:
  *                 xdatab[i] = _rad2dg*projlonlatout.u
  */
-      __pyx_t_8 = __pyx_v_projlonlatout.u;
-      (__pyx_v_xdatab[__pyx_v_i]) = __pyx_t_8;
-      goto __pyx_L12;
+      __pyx_t_7 = __pyx_v_projlonlatout.u;
+      (__pyx_v_xdatab[__pyx_v_i]) = __pyx_t_7;
+
+      /* "_proj.pyx":217
+ *                     raise RuntimeError('projection undefined')
+ *                 xdatab[i] = 1.e30
+ *             elif radians:             # <<<<<<<<<<<<<<
+ *                 xdatab[i] = projlonlatout.u
+ *             else:
+ */
+      goto __pyx_L14;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":216
+    /* "_proj.pyx":220
  *                 xdatab[i] = projlonlatout.u
  *             else:
  *                 xdatab[i] = _rad2dg*projlonlatout.u             # <<<<<<<<<<<<<<
  *             if projlonlatout.v == HUGE_VAL or \
  *                projlonlatout.v != projlonlatout.v:
  */
+    /*else*/ {
       (__pyx_v_xdatab[__pyx_v_i]) = (__pyx_v_5_proj__rad2dg * __pyx_v_projlonlatout.u);
     }
-    __pyx_L12:;
+    __pyx_L14:;
 
-    /* "_proj.pyx":217
+    /* "_proj.pyx":221
  *             else:
  *                 xdatab[i] = _rad2dg*projlonlatout.u
  *             if projlonlatout.v == HUGE_VAL or \             # <<<<<<<<<<<<<<
@@ -2500,48 +2732,64 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  */
     __pyx_t_6 = ((__pyx_v_projlonlatout.v == HUGE_VAL) != 0);
     if (!__pyx_t_6) {
+    } else {
+      __pyx_t_1 = __pyx_t_6;
+      goto __pyx_L19_bool_binop_done;
+    }
 
-      /* "_proj.pyx":218
+    /* "_proj.pyx":222
  *                 xdatab[i] = _rad2dg*projlonlatout.u
  *             if projlonlatout.v == HUGE_VAL or \
  *                projlonlatout.v != projlonlatout.v:             # <<<<<<<<<<<<<<
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  */
-      __pyx_t_7 = ((__pyx_v_projlonlatout.v != __pyx_v_projlonlatout.v) != 0);
-      __pyx_t_1 = __pyx_t_7;
-    } else {
-      __pyx_t_1 = __pyx_t_6;
-    }
+    __pyx_t_6 = ((__pyx_v_projlonlatout.v != __pyx_v_projlonlatout.v) != 0);
+    __pyx_t_1 = __pyx_t_6;
+    __pyx_L19_bool_binop_done:;
+
+    /* "_proj.pyx":221
+ *             else:
+ *                 xdatab[i] = _rad2dg*projlonlatout.u
+ *             if projlonlatout.v == HUGE_VAL or \             # <<<<<<<<<<<<<<
+ *                projlonlatout.v != projlonlatout.v:
+ *                 if errcheck:
+ */
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":219
+      /* "_proj.pyx":223
  *             if projlonlatout.v == HUGE_VAL or \
  *                projlonlatout.v != projlonlatout.v:
  *                 if errcheck:             # <<<<<<<<<<<<<<
  *                     raise RuntimeError('projection undefined')
  *                 ydatab[i] = 1.e30
  */
-      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_errcheck); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       if (__pyx_t_1) {
 
-        /* "_proj.pyx":220
+        /* "_proj.pyx":224
  *                projlonlatout.v != projlonlatout.v:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 ydatab[i] = 1.e30
  *             elif radians:
  */
-        __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__8, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
         __Pyx_GOTREF(__pyx_t_4);
         __Pyx_Raise(__pyx_t_4, 0, 0, 0);
         __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-        goto __pyx_L15;
+        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+        /* "_proj.pyx":223
+ *             if projlonlatout.v == HUGE_VAL or \
+ *                projlonlatout.v != projlonlatout.v:
+ *                 if errcheck:             # <<<<<<<<<<<<<<
+ *                     raise RuntimeError('projection undefined')
+ *                 ydatab[i] = 1.e30
+ */
       }
-      __pyx_L15:;
 
-      /* "_proj.pyx":221
+      /* "_proj.pyx":225
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')
  *                 ydatab[i] = 1.e30             # <<<<<<<<<<<<<<
@@ -2549,45 +2797,70 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
  *                 ydatab[i] = projlonlatout.v
  */
       (__pyx_v_ydatab[__pyx_v_i]) = 1.e30;
-      goto __pyx_L14;
+
+      /* "_proj.pyx":221
+ *             else:
+ *                 xdatab[i] = _rad2dg*projlonlatout.u
+ *             if projlonlatout.v == HUGE_VAL or \             # <<<<<<<<<<<<<<
+ *                projlonlatout.v != projlonlatout.v:
+ *                 if errcheck:
+ */
+      goto __pyx_L18;
     }
 
-    /* "_proj.pyx":222
+    /* "_proj.pyx":226
  *                     raise RuntimeError('projection undefined')
  *                 ydatab[i] = 1.e30
  *             elif radians:             # <<<<<<<<<<<<<<
  *                 ydatab[i] = projlonlatout.v
  *             else:
  */
-    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 226; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":223
+      /* "_proj.pyx":227
  *                 ydatab[i] = 1.e30
  *             elif radians:
  *                 ydatab[i] = projlonlatout.v             # <<<<<<<<<<<<<<
  *             else:
  *                 ydatab[i] = _rad2dg*projlonlatout.v
  */
-      __pyx_t_8 = __pyx_v_projlonlatout.v;
-      (__pyx_v_ydatab[__pyx_v_i]) = __pyx_t_8;
-      goto __pyx_L14;
+      __pyx_t_7 = __pyx_v_projlonlatout.v;
+      (__pyx_v_ydatab[__pyx_v_i]) = __pyx_t_7;
+
+      /* "_proj.pyx":226
+ *                     raise RuntimeError('projection undefined')
+ *                 ydatab[i] = 1.e30
+ *             elif radians:             # <<<<<<<<<<<<<<
+ *                 ydatab[i] = projlonlatout.v
+ *             else:
+ */
+      goto __pyx_L18;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":225
+    /* "_proj.pyx":229
  *                 ydatab[i] = projlonlatout.v
  *             else:
  *                 ydatab[i] = _rad2dg*projlonlatout.v             # <<<<<<<<<<<<<<
  * 
  * #   def _fwdn(self, c_numpy.ndarray lonlat, radians=False, errcheck=False):
  */
+    /*else*/ {
       (__pyx_v_ydatab[__pyx_v_i]) = (__pyx_v_5_proj__rad2dg * __pyx_v_projlonlatout.v);
     }
-    __pyx_L14:;
+    __pyx_L18:;
     __pyx_L6_continue:;
   }
 
+  /* "_proj.pyx":168
+ *                 latsdata[i] = projxyout.v
+ * 
+ *     def _inv(self, object x, object y, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  inverse transformation - x,y to lons,lats (done in place).
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -2602,6 +2875,14 @@ static PyObject *__pyx_pf_5_proj_4Proj_10_inv(struct __pyx_obj_5_proj_Proj *__py
   return __pyx_r;
 }
 
+/* "_proj.pyx":308
+ * #               llptr[i].v = _rad2dg*projlonlatout.v
+ * 
+ *     def is_latlong(self):             # <<<<<<<<<<<<<<
+ *         # returns True if projection in geographic (lon/lat) coordinates
+ *         cdef int i
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_13is_latlong(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_5_proj_4Proj_13is_latlong(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -2609,30 +2890,20 @@ static PyObject *__pyx_pw_5_proj_4Proj_13is_latlong(PyObject *__pyx_v_self, CYTH
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_latlong (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_12is_latlong(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":304
- * #               llptr[i].v = _rad2dg*projlonlatout.v
- * 
- *     def is_latlong(self):             # <<<<<<<<<<<<<<
- *         # returns True if projection in geographic (lon/lat) coordinates
- *         cdef int i
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_12is_latlong(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("is_latlong", 0);
 
-  /* "_proj.pyx":307
+  /* "_proj.pyx":311
  *         # returns True if projection in geographic (lon/lat) coordinates
  *         cdef int i
  *         i = pj_is_latlong(self.projpj)             # <<<<<<<<<<<<<<
@@ -2641,7 +2912,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_12is_latlong(struct __pyx_obj_5_proj_Proj
  */
   __pyx_v_i = pj_is_latlong(__pyx_v_self->projpj);
 
-  /* "_proj.pyx":308
+  /* "_proj.pyx":312
  *         cdef int i
  *         i = pj_is_latlong(self.projpj)
  *         if i:             # <<<<<<<<<<<<<<
@@ -2651,7 +2922,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_12is_latlong(struct __pyx_obj_5_proj_Proj
   __pyx_t_1 = (__pyx_v_i != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":309
+    /* "_proj.pyx":313
  *         i = pj_is_latlong(self.projpj)
  *         if i:
  *             return True             # <<<<<<<<<<<<<<
@@ -2659,43 +2930,56 @@ static PyObject *__pyx_pf_5_proj_4Proj_12is_latlong(struct __pyx_obj_5_proj_Proj
  *             return False
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_r = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __Pyx_INCREF(Py_True);
+    __pyx_r = Py_True;
     goto __pyx_L0;
-    goto __pyx_L3;
+
+    /* "_proj.pyx":312
+ *         cdef int i
+ *         i = pj_is_latlong(self.projpj)
+ *         if i:             # <<<<<<<<<<<<<<
+ *             return True
+ *         else:
+ */
   }
-  /*else*/ {
 
-    /* "_proj.pyx":311
+  /* "_proj.pyx":315
  *             return True
  *         else:
  *             return False             # <<<<<<<<<<<<<<
  * 
  *     def is_geocent(self):
  */
+  /*else*/ {
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 311; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_r = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __Pyx_INCREF(Py_False);
+    __pyx_r = Py_False;
     goto __pyx_L0;
   }
-  __pyx_L3:;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("_proj.Proj.is_latlong", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
+  /* "_proj.pyx":308
+ * #               llptr[i].v = _rad2dg*projlonlatout.v
+ * 
+ *     def is_latlong(self):             # <<<<<<<<<<<<<<
+ *         # returns True if projection in geographic (lon/lat) coordinates
+ *         cdef int i
+ */
+
+  /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "_proj.pyx":317
+ *             return False
+ * 
+ *     def is_geocent(self):             # <<<<<<<<<<<<<<
+ *         # returns True if projection in geocentric (x/y) coordinates
+ *         cdef int i
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_15is_geocent(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static PyObject *__pyx_pw_5_proj_4Proj_15is_geocent(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
@@ -2703,30 +2987,20 @@ static PyObject *__pyx_pw_5_proj_4Proj_15is_geocent(PyObject *__pyx_v_self, CYTH
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("is_geocent (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_14is_geocent(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":313
- *             return False
- * 
- *     def is_geocent(self):             # <<<<<<<<<<<<<<
- *         # returns True if projection in geocentric (x/y) coordinates
- *         cdef int i
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_14is_geocent(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   int __pyx_v_i;
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   int __pyx_t_1;
-  PyObject *__pyx_t_2 = NULL;
-  int __pyx_lineno = 0;
-  const char *__pyx_filename = NULL;
-  int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("is_geocent", 0);
 
-  /* "_proj.pyx":316
+  /* "_proj.pyx":320
  *         # returns True if projection in geocentric (x/y) coordinates
  *         cdef int i
  *         i = pj_is_geocent(self.projpj)             # <<<<<<<<<<<<<<
@@ -2735,7 +3009,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_14is_geocent(struct __pyx_obj_5_proj_Proj
  */
   __pyx_v_i = pj_is_geocent(__pyx_v_self->projpj);
 
-  /* "_proj.pyx":317
+  /* "_proj.pyx":321
  *         cdef int i
  *         i = pj_is_geocent(self.projpj)
  *         if i:             # <<<<<<<<<<<<<<
@@ -2745,7 +3019,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_14is_geocent(struct __pyx_obj_5_proj_Proj
   __pyx_t_1 = (__pyx_v_i != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":318
+    /* "_proj.pyx":322
  *         i = pj_is_geocent(self.projpj)
  *         if i:
  *             return True             # <<<<<<<<<<<<<<
@@ -2753,43 +3027,56 @@ static PyObject *__pyx_pf_5_proj_4Proj_14is_geocent(struct __pyx_obj_5_proj_Proj
  *             return False
  */
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = __Pyx_PyBool_FromLong(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 318; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_r = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __Pyx_INCREF(Py_True);
+    __pyx_r = Py_True;
     goto __pyx_L0;
-    goto __pyx_L3;
+
+    /* "_proj.pyx":321
+ *         cdef int i
+ *         i = pj_is_geocent(self.projpj)
+ *         if i:             # <<<<<<<<<<<<<<
+ *             return True
+ *         else:
+ */
   }
-  /*else*/ {
 
-    /* "_proj.pyx":320
+  /* "_proj.pyx":324
  *             return True
  *         else:
  *             return False             # <<<<<<<<<<<<<<
  * 
  * def _transform(Proj p1, Proj p2, inx, iny, inz, radians):
  */
+  /*else*/ {
     __Pyx_XDECREF(__pyx_r);
-    __pyx_t_2 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_2);
-    __pyx_r = __pyx_t_2;
-    __pyx_t_2 = 0;
+    __Pyx_INCREF(Py_False);
+    __pyx_r = Py_False;
     goto __pyx_L0;
   }
-  __pyx_L3:;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
-  __pyx_L1_error:;
-  __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_AddTraceback("_proj.Proj.is_geocent", __pyx_clineno, __pyx_lineno, __pyx_filename);
-  __pyx_r = NULL;
+  /* "_proj.pyx":317
+ *             return False
+ * 
+ *     def is_geocent(self):             # <<<<<<<<<<<<<<
+ *         # returns True if projection in geocentric (x/y) coordinates
+ *         cdef int i
+ */
+
+  /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "_proj.pyx":69
+ *     cdef projPJ projpj
+ *     cdef projCtx projctx
+ *     cdef public object proj_version             # <<<<<<<<<<<<<<
+ *     cdef char *pjinitstring
+ *     cdef public object srs
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_12proj_version_1__get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_pw_5_proj_4Proj_12proj_version_1__get__(PyObject *__pyx_v_self) {
@@ -2797,18 +3084,12 @@ static PyObject *__pyx_pw_5_proj_4Proj_12proj_version_1__get__(PyObject *__pyx_v
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_12proj_version___get__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":69
- *     cdef projPJ projpj
- *     cdef projCtx projctx
- *     cdef public object proj_version             # <<<<<<<<<<<<<<
- *     cdef char *pjinitstring
- *     cdef public object srs
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_12proj_version___get__(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -2818,7 +3099,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_12proj_version___get__(struct __pyx_obj_5
   __pyx_r = __pyx_v_self->proj_version;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
@@ -2832,6 +3113,8 @@ static int __pyx_pw_5_proj_4Proj_12proj_version_3__set__(PyObject *__pyx_v_self,
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_12proj_version_2__set__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -2846,6 +3129,7 @@ static int __pyx_pf_5_proj_4Proj_12proj_version_2__set__(struct __pyx_obj_5_proj
   __Pyx_DECREF(__pyx_v_self->proj_version);
   __pyx_v_self->proj_version = __pyx_v_value;
 
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -2858,6 +3142,8 @@ static int __pyx_pw_5_proj_4Proj_12proj_version_5__del__(PyObject *__pyx_v_self)
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_12proj_version_4__del__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -2872,11 +3158,20 @@ static int __pyx_pf_5_proj_4Proj_12proj_version_4__del__(struct __pyx_obj_5_proj
   __Pyx_DECREF(__pyx_v_self->proj_version);
   __pyx_v_self->proj_version = Py_None;
 
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "_proj.pyx":71
+ *     cdef public object proj_version
+ *     cdef char *pjinitstring
+ *     cdef public object srs             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self, projstring):
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Proj_3srs_1__get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_pw_5_proj_4Proj_3srs_1__get__(PyObject *__pyx_v_self) {
@@ -2884,18 +3179,12 @@ static PyObject *__pyx_pw_5_proj_4Proj_3srs_1__get__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_3srs___get__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":71
- *     cdef public object proj_version
- *     cdef char *pjinitstring
- *     cdef public object srs             # <<<<<<<<<<<<<<
- * 
- *     def __cinit__(self, projstring):
- */
-
 static PyObject *__pyx_pf_5_proj_4Proj_3srs___get__(struct __pyx_obj_5_proj_Proj *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -2905,7 +3194,7 @@ static PyObject *__pyx_pf_5_proj_4Proj_3srs___get__(struct __pyx_obj_5_proj_Proj
   __pyx_r = __pyx_v_self->srs;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
@@ -2919,6 +3208,8 @@ static int __pyx_pw_5_proj_4Proj_3srs_3__set__(PyObject *__pyx_v_self, PyObject
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_3srs_2__set__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -2933,6 +3224,7 @@ static int __pyx_pf_5_proj_4Proj_3srs_2__set__(struct __pyx_obj_5_proj_Proj *__p
   __Pyx_DECREF(__pyx_v_self->srs);
   __pyx_v_self->srs = __pyx_v_value;
 
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -2945,6 +3237,8 @@ static int __pyx_pw_5_proj_4Proj_3srs_5__del__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Proj_3srs_4__del__(((struct __pyx_obj_5_proj_Proj *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -2959,14 +3253,23 @@ static int __pyx_pf_5_proj_4Proj_3srs_4__del__(struct __pyx_obj_5_proj_Proj *__p
   __Pyx_DECREF(__pyx_v_self->srs);
   __pyx_v_self->srs = Py_None;
 
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
+/* "_proj.pyx":326
+ *             return False
+ * 
+ * def _transform(Proj p1, Proj p2, inx, iny, inz, radians):             # <<<<<<<<<<<<<<
+ *     # private function to call pj_transform
+ *     cdef void *xdata
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_5_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
-static PyMethodDef __pyx_mdef_5_proj_5_transform = {__Pyx_NAMESTR("_transform"), (PyCFunction)__pyx_pw_5_proj_5_transform, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)};
+static PyMethodDef __pyx_mdef_5_proj_5_transform = {"_transform", (PyCFunction)__pyx_pw_5_proj_5_transform, METH_VARARGS|METH_KEYWORDS, 0};
 static PyObject *__pyx_pw_5_proj_5_transform(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
   struct __pyx_obj_5_proj_Proj *__pyx_v_p1 = 0;
   struct __pyx_obj_5_proj_Proj *__pyx_v_p2 = 0;
@@ -2981,7 +3284,7 @@ static PyObject *__pyx_pw_5_proj_5_transform(PyObject *__pyx_self, PyObject *__p
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_transform (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p1,&__pyx_n_s__p2,&__pyx_n_s__inx,&__pyx_n_s__iny,&__pyx_n_s__inz,&__pyx_n_s__radians,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_p1,&__pyx_n_s_p2,&__pyx_n_s_inx,&__pyx_n_s_iny,&__pyx_n_s_inz,&__pyx_n_s_radians,0};
     PyObject* values[6] = {0,0,0,0,0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -2999,36 +3302,36 @@ static PyObject *__pyx_pw_5_proj_5_transform(PyObject *__pyx_self, PyObject *__p
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p1)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_p1)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p2)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_p2)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__inx)) != 0)) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_inx)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__iny)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_iny)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__inz)) != 0)) kw_args--;
+        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_inz)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
-        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__radians)) != 0)) kw_args--;
+        if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_radians)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_transform") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_transform") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 6) {
       goto __pyx_L5_argtuple_error;
@@ -3049,15 +3352,17 @@ static PyObject *__pyx_pw_5_proj_5_transform(PyObject *__pyx_self, PyObject *__p
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("_transform", 1, 6, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_proj._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_p1), __pyx_ptype_5_proj_Proj, 1, "p1", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_p2), __pyx_ptype_5_proj_Proj, 1, "p2", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_p1), __pyx_ptype_5_proj_Proj, 1, "p1", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_p2), __pyx_ptype_5_proj_Proj, 1, "p2", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_r = __pyx_pf_5_proj_4_transform(__pyx_self, __pyx_v_p1, __pyx_v_p2, __pyx_v_inx, __pyx_v_iny, __pyx_v_inz, __pyx_v_radians);
+
+  /* function exit code */
   goto __pyx_L0;
   __pyx_L1_error:;
   __pyx_r = NULL;
@@ -3066,14 +3371,6 @@ static PyObject *__pyx_pw_5_proj_5_transform(PyObject *__pyx_self, PyObject *__p
   return __pyx_r;
 }
 
-/* "_proj.pyx":322
- *             return False
- * 
- * def _transform(Proj p1, Proj p2, inx, iny, inz, radians):             # <<<<<<<<<<<<<<
- *     # private function to call pj_transform
- *     cdef void *xdata, *ydata, *zdata
- */
-
 static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self, struct __pyx_obj_5_proj_Proj *__pyx_v_p1, struct __pyx_obj_5_proj_Proj *__pyx_v_p2, PyObject *__pyx_v_inx, PyObject *__pyx_v_iny, PyObject *__pyx_v_inz, PyObject *__pyx_v_radians) {
   void *__pyx_v_xdata;
   void *__pyx_v_ydata;
@@ -3092,15 +3389,16 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
   int __pyx_t_1;
   int __pyx_t_2;
   PyObject *__pyx_t_3 = NULL;
-  PyObject *__pyx_t_4 = NULL;
-  int __pyx_t_5;
-  Py_ssize_t __pyx_t_6;
+  int __pyx_t_4;
+  PyObject *__pyx_t_5 = NULL;
+  PyObject *__pyx_t_6 = NULL;
+  Py_ssize_t __pyx_t_7;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_transform", 0);
 
-  /* "_proj.pyx":328
+  /* "_proj.pyx":336
  *     cdef Py_ssize_t buflenx, bufleny, buflenz, npts, i
  *     cdef int err
  *     if PyObject_AsWriteBuffer(inx, &xdata, &buflenx) <> 0:             # <<<<<<<<<<<<<<
@@ -3110,7 +3408,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_inx, (&__pyx_v_xdata), (&__pyx_v_buflenx)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":329
+    /* "_proj.pyx":337
  *     cdef int err
  *     if PyObject_AsWriteBuffer(inx, &xdata, &buflenx) <> 0:
  *         raise RuntimeError             # <<<<<<<<<<<<<<
@@ -3118,12 +3416,18 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  *         raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":336
+ *     cdef Py_ssize_t buflenx, bufleny, buflenz, npts, i
+ *     cdef int err
+ *     if PyObject_AsWriteBuffer(inx, &xdata, &buflenx) <> 0:             # <<<<<<<<<<<<<<
+ *         raise RuntimeError
+ *     if PyObject_AsWriteBuffer(iny, &ydata, &bufleny) <> 0:
+ */
   }
-  __pyx_L3:;
 
-  /* "_proj.pyx":330
+  /* "_proj.pyx":338
  *     if PyObject_AsWriteBuffer(inx, &xdata, &buflenx) <> 0:
  *         raise RuntimeError
  *     if PyObject_AsWriteBuffer(iny, &ydata, &bufleny) <> 0:             # <<<<<<<<<<<<<<
@@ -3133,7 +3437,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_iny, (&__pyx_v_ydata), (&__pyx_v_bufleny)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":331
+    /* "_proj.pyx":339
  *         raise RuntimeError
  *     if PyObject_AsWriteBuffer(iny, &ydata, &bufleny) <> 0:
  *         raise RuntimeError             # <<<<<<<<<<<<<<
@@ -3141,12 +3445,18 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  *         if PyObject_AsWriteBuffer(inz, &zdata, &buflenz) <> 0:
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":338
+ *     if PyObject_AsWriteBuffer(inx, &xdata, &buflenx) <> 0:
+ *         raise RuntimeError
+ *     if PyObject_AsWriteBuffer(iny, &ydata, &bufleny) <> 0:             # <<<<<<<<<<<<<<
+ *         raise RuntimeError
+ *     if inz is not None:
+ */
   }
-  __pyx_L4:;
 
-  /* "_proj.pyx":332
+  /* "_proj.pyx":340
  *     if PyObject_AsWriteBuffer(iny, &ydata, &bufleny) <> 0:
  *         raise RuntimeError
  *     if inz is not None:             # <<<<<<<<<<<<<<
@@ -3157,7 +3467,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "_proj.pyx":333
+    /* "_proj.pyx":341
  *         raise RuntimeError
  *     if inz is not None:
  *         if PyObject_AsWriteBuffer(inz, &zdata, &buflenz) <> 0:             # <<<<<<<<<<<<<<
@@ -3167,7 +3477,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
     __pyx_t_2 = ((PyObject_AsWriteBuffer(__pyx_v_inz, (&__pyx_v_zdata), (&__pyx_v_buflenz)) != 0) != 0);
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":334
+      /* "_proj.pyx":342
  *     if inz is not None:
  *         if PyObject_AsWriteBuffer(inz, &zdata, &buflenz) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -3175,26 +3485,40 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  *         buflenz = bufleny
  */
       __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L6;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 342; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "_proj.pyx":341
+ *         raise RuntimeError
+ *     if inz is not None:
+ *         if PyObject_AsWriteBuffer(inz, &zdata, &buflenz) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *     else:
+ */
     }
-    __pyx_L6:;
+
+    /* "_proj.pyx":340
+ *     if PyObject_AsWriteBuffer(iny, &ydata, &bufleny) <> 0:
+ *         raise RuntimeError
+ *     if inz is not None:             # <<<<<<<<<<<<<<
+ *         if PyObject_AsWriteBuffer(inz, &zdata, &buflenz) <> 0:
+ *             raise RuntimeError
+ */
     goto __pyx_L5;
   }
-  /*else*/ {
 
-    /* "_proj.pyx":336
+  /* "_proj.pyx":344
  *             raise RuntimeError
  *     else:
  *         buflenz = bufleny             # <<<<<<<<<<<<<<
  *     if not (buflenx == bufleny == buflenz):
  *         raise RuntimeError('x,y and z must be same size')
  */
+  /*else*/ {
     __pyx_v_buflenz = __pyx_v_bufleny;
   }
   __pyx_L5:;
 
-  /* "_proj.pyx":337
+  /* "_proj.pyx":345
  *     else:
  *         buflenz = bufleny
  *     if not (buflenx == bufleny == buflenz):             # <<<<<<<<<<<<<<
@@ -3208,23 +3532,29 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
   __pyx_t_1 = ((!(__pyx_t_2 != 0)) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":338
+    /* "_proj.pyx":346
  *         buflenz = bufleny
  *     if not (buflenx == bufleny == buflenz):
  *         raise RuntimeError('x,y and z must be same size')             # <<<<<<<<<<<<<<
  *     xx = <double *>xdata
  *     yy = <double *>ydata
  */
-    __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L7;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":345
+ *     else:
+ *         buflenz = bufleny
+ *     if not (buflenx == bufleny == buflenz):             # <<<<<<<<<<<<<<
+ *         raise RuntimeError('x,y and z must be same size')
+ *     xx = <double *>xdata
+ */
   }
-  __pyx_L7:;
 
-  /* "_proj.pyx":339
+  /* "_proj.pyx":347
  *     if not (buflenx == bufleny == buflenz):
  *         raise RuntimeError('x,y and z must be same size')
  *     xx = <double *>xdata             # <<<<<<<<<<<<<<
@@ -3233,7 +3563,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
   __pyx_v_xx = ((double *)__pyx_v_xdata);
 
-  /* "_proj.pyx":340
+  /* "_proj.pyx":348
  *         raise RuntimeError('x,y and z must be same size')
  *     xx = <double *>xdata
  *     yy = <double *>ydata             # <<<<<<<<<<<<<<
@@ -3242,72 +3572,95 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
   __pyx_v_yy = ((double *)__pyx_v_ydata);
 
-  /* "_proj.pyx":341
+  /* "_proj.pyx":349
  *     xx = <double *>xdata
  *     yy = <double *>ydata
  *     if inz is not None:             # <<<<<<<<<<<<<<
  *         zz = <double *>zdata
- *     npts = buflenx/8
+ *     npts = buflenx//8
  */
   __pyx_t_1 = (__pyx_v_inz != Py_None);
   __pyx_t_2 = (__pyx_t_1 != 0);
   if (__pyx_t_2) {
 
-    /* "_proj.pyx":342
+    /* "_proj.pyx":350
  *     yy = <double *>ydata
  *     if inz is not None:
  *         zz = <double *>zdata             # <<<<<<<<<<<<<<
- *     npts = buflenx/8
+ *     npts = buflenx//8
  *     if not radians and p1.is_latlong():
  */
     __pyx_v_zz = ((double *)__pyx_v_zdata);
-    goto __pyx_L8;
+
+    /* "_proj.pyx":349
+ *     xx = <double *>xdata
+ *     yy = <double *>ydata
+ *     if inz is not None:             # <<<<<<<<<<<<<<
+ *         zz = <double *>zdata
+ *     npts = buflenx//8
+ */
   }
-  __pyx_L8:;
 
-  /* "_proj.pyx":343
+  /* "_proj.pyx":351
  *     if inz is not None:
  *         zz = <double *>zdata
- *     npts = buflenx/8             # <<<<<<<<<<<<<<
+ *     npts = buflenx//8             # <<<<<<<<<<<<<<
  *     if not radians and p1.is_latlong():
  *         for i from 0 <= i < npts:
  */
   __pyx_v_npts = __Pyx_div_Py_ssize_t(__pyx_v_buflenx, 8);
 
-  /* "_proj.pyx":344
+  /* "_proj.pyx":352
  *         zz = <double *>zdata
- *     npts = buflenx/8
+ *     npts = buflenx//8
  *     if not radians and p1.is_latlong():             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < npts:
  *             xx[i] = xx[i]*_dg2rad
  */
-  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_1 = (!__pyx_t_2);
-  if (__pyx_t_1) {
-    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_p1), __pyx_n_s__is_latlong); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 344; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_5 = __pyx_t_2;
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = ((!__pyx_t_1) != 0);
+  if (__pyx_t_4) {
+  } else {
+    __pyx_t_2 = __pyx_t_4;
+    goto __pyx_L10_bool_binop_done;
+  }
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_p1), __pyx_n_s_is_latlong); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
+    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
+    if (likely(__pyx_t_6)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_5, function);
+    }
+  }
+  if (__pyx_t_6) {
+    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
   } else {
-    __pyx_t_5 = __pyx_t_1;
+    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
-  if (__pyx_t_5) {
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_2 = __pyx_t_4;
+  __pyx_L10_bool_binop_done:;
+  if (__pyx_t_2) {
 
-    /* "_proj.pyx":345
- *     npts = buflenx/8
+    /* "_proj.pyx":353
+ *     npts = buflenx//8
  *     if not radians and p1.is_latlong():
  *         for i from 0 <= i < npts:             # <<<<<<<<<<<<<<
  *             xx[i] = xx[i]*_dg2rad
  *             yy[i] = yy[i]*_dg2rad
  */
-    __pyx_t_6 = __pyx_v_npts;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
+    __pyx_t_7 = __pyx_v_npts;
+    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_7; __pyx_v_i++) {
 
-      /* "_proj.pyx":346
+      /* "_proj.pyx":354
  *     if not radians and p1.is_latlong():
  *         for i from 0 <= i < npts:
  *             xx[i] = xx[i]*_dg2rad             # <<<<<<<<<<<<<<
@@ -3316,7 +3669,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
       (__pyx_v_xx[__pyx_v_i]) = ((__pyx_v_xx[__pyx_v_i]) * __pyx_v_5_proj__dg2rad);
 
-      /* "_proj.pyx":347
+      /* "_proj.pyx":355
  *         for i from 0 <= i < npts:
  *             xx[i] = xx[i]*_dg2rad
  *             yy[i] = yy[i]*_dg2rad             # <<<<<<<<<<<<<<
@@ -3325,22 +3678,28 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
       (__pyx_v_yy[__pyx_v_i]) = ((__pyx_v_yy[__pyx_v_i]) * __pyx_v_5_proj__dg2rad);
     }
-    goto __pyx_L9;
+
+    /* "_proj.pyx":352
+ *         zz = <double *>zdata
+ *     npts = buflenx//8
+ *     if not radians and p1.is_latlong():             # <<<<<<<<<<<<<<
+ *         for i from 0 <= i < npts:
+ *             xx[i] = xx[i]*_dg2rad
+ */
   }
-  __pyx_L9:;
 
-  /* "_proj.pyx":348
+  /* "_proj.pyx":356
  *             xx[i] = xx[i]*_dg2rad
  *             yy[i] = yy[i]*_dg2rad
  *     if inz is not None:             # <<<<<<<<<<<<<<
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, zz)
  *     else:
  */
-  __pyx_t_5 = (__pyx_v_inz != Py_None);
-  __pyx_t_1 = (__pyx_t_5 != 0);
-  if (__pyx_t_1) {
+  __pyx_t_2 = (__pyx_v_inz != Py_None);
+  __pyx_t_4 = (__pyx_t_2 != 0);
+  if (__pyx_t_4) {
 
-    /* "_proj.pyx":349
+    /* "_proj.pyx":357
  *             yy[i] = yy[i]*_dg2rad
  *     if inz is not None:
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, zz)             # <<<<<<<<<<<<<<
@@ -3348,89 +3707,120 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, NULL)
  */
     __pyx_v_err = pj_transform(__pyx_v_p1->projpj, __pyx_v_p2->projpj, __pyx_v_npts, 0, __pyx_v_xx, __pyx_v_yy, __pyx_v_zz);
-    goto __pyx_L12;
+
+    /* "_proj.pyx":356
+ *             xx[i] = xx[i]*_dg2rad
+ *             yy[i] = yy[i]*_dg2rad
+ *     if inz is not None:             # <<<<<<<<<<<<<<
+ *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, zz)
+ *     else:
+ */
+    goto __pyx_L14;
   }
-  /*else*/ {
 
-    /* "_proj.pyx":351
+  /* "_proj.pyx":359
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, zz)
  *     else:
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, NULL)             # <<<<<<<<<<<<<<
  *     if err != 0:
  *         raise RuntimeError(pj_strerrno(err))
  */
+  /*else*/ {
     __pyx_v_err = pj_transform(__pyx_v_p1->projpj, __pyx_v_p2->projpj, __pyx_v_npts, 0, __pyx_v_xx, __pyx_v_yy, NULL);
   }
-  __pyx_L12:;
+  __pyx_L14:;
 
-  /* "_proj.pyx":352
+  /* "_proj.pyx":360
  *     else:
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, NULL)
  *     if err != 0:             # <<<<<<<<<<<<<<
  *         raise RuntimeError(pj_strerrno(err))
  *     if not radians and p2.is_latlong():
  */
-  __pyx_t_1 = ((__pyx_v_err != 0) != 0);
-  if (__pyx_t_1) {
+  __pyx_t_4 = ((__pyx_v_err != 0) != 0);
+  if (__pyx_t_4) {
 
-    /* "_proj.pyx":353
+    /* "_proj.pyx":361
  *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, NULL)
  *     if err != 0:
  *         raise RuntimeError(pj_strerrno(err))             # <<<<<<<<<<<<<<
  *     if not radians and p2.is_latlong():
  *         for i from 0 <= i < npts:
  */
-    __pyx_t_4 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(((PyObject *)__pyx_t_4));
-    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyBytes_FromString(pj_strerrno(__pyx_v_err)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
-    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_4));
-    __Pyx_GIVEREF(((PyObject *)__pyx_t_4));
-    __pyx_t_4 = 0;
-    __pyx_t_4 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-    __Pyx_Raise(__pyx_t_4, 0, 0, 0);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L13;
+    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_5);
+    __Pyx_GIVEREF(__pyx_t_3);
+    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3);
+    __pyx_t_3 = 0;
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_t_5, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_GOTREF(__pyx_t_3);
+    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
+    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 361; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":360
+ *     else:
+ *         err = pj_transform(p1.projpj, p2.projpj, npts, 0, xx, yy, NULL)
+ *     if err != 0:             # <<<<<<<<<<<<<<
+ *         raise RuntimeError(pj_strerrno(err))
+ *     if not radians and p2.is_latlong():
+ */
   }
-  __pyx_L13:;
 
-  /* "_proj.pyx":354
+  /* "_proj.pyx":362
  *     if err != 0:
  *         raise RuntimeError(pj_strerrno(err))
  *     if not radians and p2.is_latlong():             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < npts:
  *             xx[i] = xx[i]*_rad2dg
  */
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_5 = (!__pyx_t_1);
-  if (__pyx_t_5) {
-    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_p2), __pyx_n_s__is_latlong); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_4);
-    __pyx_t_3 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_GOTREF(__pyx_t_3);
-    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    __pyx_t_2 = __pyx_t_1;
+  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = ((!__pyx_t_2) != 0);
+  if (__pyx_t_1) {
   } else {
-    __pyx_t_2 = __pyx_t_5;
+    __pyx_t_4 = __pyx_t_1;
+    goto __pyx_L17_bool_binop_done;
   }
-  if (__pyx_t_2) {
+  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_p2), __pyx_n_s_is_latlong); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_5);
+  __pyx_t_6 = NULL;
+  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
+    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
+    if (likely(__pyx_t_6)) {
+      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+      __Pyx_INCREF(__pyx_t_6);
+      __Pyx_INCREF(function);
+      __Pyx_DECREF_SET(__pyx_t_5, function);
+    }
+  }
+  if (__pyx_t_6) {
+    __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+  } else {
+    __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  __Pyx_GOTREF(__pyx_t_3);
+  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
+  __pyx_t_4 = __pyx_t_1;
+  __pyx_L17_bool_binop_done:;
+  if (__pyx_t_4) {
 
-    /* "_proj.pyx":355
+    /* "_proj.pyx":363
  *         raise RuntimeError(pj_strerrno(err))
  *     if not radians and p2.is_latlong():
  *         for i from 0 <= i < npts:             # <<<<<<<<<<<<<<
  *             xx[i] = xx[i]*_rad2dg
  *             yy[i] = yy[i]*_rad2dg
  */
-    __pyx_t_6 = __pyx_v_npts;
-    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
+    __pyx_t_7 = __pyx_v_npts;
+    for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_7; __pyx_v_i++) {
 
-      /* "_proj.pyx":356
+      /* "_proj.pyx":364
  *     if not radians and p2.is_latlong():
  *         for i from 0 <= i < npts:
  *             xx[i] = xx[i]*_rad2dg             # <<<<<<<<<<<<<<
@@ -3439,7 +3829,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
       (__pyx_v_xx[__pyx_v_i]) = ((__pyx_v_xx[__pyx_v_i]) * __pyx_v_5_proj__rad2dg);
 
-      /* "_proj.pyx":357
+      /* "_proj.pyx":365
  *         for i from 0 <= i < npts:
  *             xx[i] = xx[i]*_rad2dg
  *             yy[i] = yy[i]*_rad2dg             # <<<<<<<<<<<<<<
@@ -3448,15 +3838,31 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
       (__pyx_v_yy[__pyx_v_i]) = ((__pyx_v_yy[__pyx_v_i]) * __pyx_v_5_proj__rad2dg);
     }
-    goto __pyx_L14;
+
+    /* "_proj.pyx":362
+ *     if err != 0:
+ *         raise RuntimeError(pj_strerrno(err))
+ *     if not radians and p2.is_latlong():             # <<<<<<<<<<<<<<
+ *         for i from 0 <= i < npts:
+ *             xx[i] = xx[i]*_rad2dg
+ */
   }
-  __pyx_L14:;
 
+  /* "_proj.pyx":326
+ *             return False
+ * 
+ * def _transform(Proj p1, Proj p2, inx, iny, inz, radians):             # <<<<<<<<<<<<<<
+ *     # private function to call pj_transform
+ *     cdef void *xdata
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
-  __Pyx_XDECREF(__pyx_t_4);
+  __Pyx_XDECREF(__pyx_t_5);
+  __Pyx_XDECREF(__pyx_t_6);
   __Pyx_AddTraceback("_proj._transform", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = NULL;
   __pyx_L0:;
@@ -3465,7 +3871,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
   return __pyx_r;
 }
 
-/* "_proj.pyx":359
+/* "_proj.pyx":367
  *             yy[i] = yy[i]*_rad2dg
  * 
  * cdef _strencode(pystr,encoding='ascii'):             # <<<<<<<<<<<<<<
@@ -3474,7 +3880,7 @@ static PyObject *__pyx_pf_5_proj_4_transform(CYTHON_UNUSED PyObject *__pyx_self,
  */
 
 static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx_opt_args_5_proj__strencode *__pyx_optional_args) {
-  PyObject *__pyx_v_encoding = ((PyObject *)__pyx_n_s__ascii);
+  PyObject *__pyx_v_encoding = ((PyObject *)__pyx_n_s_ascii);
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
   PyObject *__pyx_t_1 = NULL;
@@ -3483,7 +3889,8 @@ static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx
   PyObject *__pyx_t_4 = NULL;
   PyObject *__pyx_t_5 = NULL;
   PyObject *__pyx_t_6 = NULL;
-  int __pyx_t_7;
+  PyObject *__pyx_t_7 = NULL;
+  int __pyx_t_8;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -3494,7 +3901,7 @@ static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx
     }
   }
 
-  /* "_proj.pyx":361
+  /* "_proj.pyx":369
  * cdef _strencode(pystr,encoding='ascii'):
  *     # encode a string into bytes.  If already bytes, do nothing.
  *     try:             # <<<<<<<<<<<<<<
@@ -3508,7 +3915,7 @@ static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx
     __Pyx_XGOTREF(__pyx_t_3);
     /*try:*/ {
 
-      /* "_proj.pyx":362
+      /* "_proj.pyx":370
  *     # encode a string into bytes.  If already bytes, do nothing.
  *     try:
  *         return pystr.encode(encoding)             # <<<<<<<<<<<<<<
@@ -3516,52 +3923,67 @@ static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx
  *         return pystr # already bytes?
  */
       __Pyx_XDECREF(__pyx_r);
-      __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_pystr, __pyx_n_s__encode); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __Pyx_GOTREF(__pyx_t_4);
-      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_pystr, __pyx_n_s_encode); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       __Pyx_GOTREF(__pyx_t_5);
-      __Pyx_INCREF(__pyx_v_encoding);
-      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_encoding);
-      __Pyx_GIVEREF(__pyx_v_encoding);
-      __pyx_t_6 = PyObject_Call(__pyx_t_4, ((PyObject *)__pyx_t_5), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 362; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;
-      __pyx_r = __pyx_t_6;
-      __pyx_t_6 = 0;
+      __pyx_t_6 = NULL;
+      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
+        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
+        if (likely(__pyx_t_6)) {
+          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
+          __Pyx_INCREF(__pyx_t_6);
+          __Pyx_INCREF(function);
+          __Pyx_DECREF_SET(__pyx_t_5, function);
+        }
+      }
+      if (!__pyx_t_6) {
+        __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_encoding); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+      } else {
+        __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_GOTREF(__pyx_t_7);
+        __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __pyx_t_6 = NULL;
+        __Pyx_INCREF(__pyx_v_encoding);
+        __Pyx_GIVEREF(__pyx_v_encoding);
+        PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_encoding);
+        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        __Pyx_GOTREF(__pyx_t_4);
+        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
+      }
+      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
+      __pyx_r = __pyx_t_4;
+      __pyx_t_4 = 0;
       goto __pyx_L7_try_return;
+
+      /* "_proj.pyx":369
+ * cdef _strencode(pystr,encoding='ascii'):
+ *     # encode a string into bytes.  If already bytes, do nothing.
+ *     try:             # <<<<<<<<<<<<<<
+ *         return pystr.encode(encoding)
+ *     except AttributeError:
+ */
     }
-    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
-    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
-    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
-    goto __pyx_L10_try_end;
-    __pyx_L7_try_return:;
-    __Pyx_XGIVEREF(__pyx_t_1);
-    __Pyx_XGIVEREF(__pyx_t_2);
-    __Pyx_XGIVEREF(__pyx_t_3);
-    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
-    goto __pyx_L0;
     __pyx_L3_error:;
-    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
-    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
     __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
+    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
+    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
+    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;
 
-    /* "_proj.pyx":363
+    /* "_proj.pyx":371
  *     try:
  *         return pystr.encode(encoding)
  *     except AttributeError:             # <<<<<<<<<<<<<<
  *         return pystr # already bytes?
  * 
  */
-    __pyx_t_7 = PyErr_ExceptionMatches(__pyx_builtin_AttributeError);
-    if (__pyx_t_7) {
+    __pyx_t_8 = PyErr_ExceptionMatches(__pyx_builtin_AttributeError);
+    if (__pyx_t_8) {
       __Pyx_AddTraceback("_proj._strencode", __pyx_clineno, __pyx_lineno, __pyx_filename);
-      if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_5, &__pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L5_except_error;}
-      __Pyx_GOTREF(__pyx_t_6);
-      __Pyx_GOTREF(__pyx_t_5);
+      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_5, &__pyx_t_7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L5_except_error;}
       __Pyx_GOTREF(__pyx_t_4);
+      __Pyx_GOTREF(__pyx_t_5);
+      __Pyx_GOTREF(__pyx_t_7);
 
-      /* "_proj.pyx":364
+      /* "_proj.pyx":372
  *         return pystr.encode(encoding)
  *     except AttributeError:
  *         return pystr # already bytes?             # <<<<<<<<<<<<<<
@@ -3573,39 +3995,52 @@ static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx
       __pyx_r = __pyx_v_pystr;
       __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
+      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
       goto __pyx_L6_except_return;
-      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
-      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-      goto __pyx_L4_exception_handled;
     }
+    goto __pyx_L5_except_error;
     __pyx_L5_except_error:;
+
+    /* "_proj.pyx":369
+ * cdef _strencode(pystr,encoding='ascii'):
+ *     # encode a string into bytes.  If already bytes, do nothing.
+ *     try:             # <<<<<<<<<<<<<<
+ *         return pystr.encode(encoding)
+ *     except AttributeError:
+ */
     __Pyx_XGIVEREF(__pyx_t_1);
     __Pyx_XGIVEREF(__pyx_t_2);
     __Pyx_XGIVEREF(__pyx_t_3);
     __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
     goto __pyx_L1_error;
-    __pyx_L6_except_return:;
+    __pyx_L7_try_return:;
     __Pyx_XGIVEREF(__pyx_t_1);
     __Pyx_XGIVEREF(__pyx_t_2);
     __Pyx_XGIVEREF(__pyx_t_3);
     __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
     goto __pyx_L0;
-    __pyx_L4_exception_handled:;
+    __pyx_L6_except_return:;
     __Pyx_XGIVEREF(__pyx_t_1);
     __Pyx_XGIVEREF(__pyx_t_2);
     __Pyx_XGIVEREF(__pyx_t_3);
     __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
-    __pyx_L10_try_end:;
+    goto __pyx_L0;
   }
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "_proj.pyx":367
+ *             yy[i] = yy[i]*_rad2dg
+ * 
+ * cdef _strencode(pystr,encoding='ascii'):             # <<<<<<<<<<<<<<
+ *     # encode a string into bytes.  If already bytes, do nothing.
+ *     try:
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_4);
   __Pyx_XDECREF(__pyx_t_5);
   __Pyx_XDECREF(__pyx_t_6);
+  __Pyx_XDECREF(__pyx_t_7);
   __Pyx_AddTraceback("_proj._strencode", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __pyx_r = 0;
   __pyx_L0:;
@@ -3614,6 +4049,14 @@ static PyObject *__pyx_f_5_proj__strencode(PyObject *__pyx_v_pystr, struct __pyx
   return __pyx_r;
 }
 
+/* "_proj.pyx":378
+ *     cdef public object initstring
+ * 
+ *     def __cinit__(self, a, f):             # <<<<<<<<<<<<<<
+ *         self.initstring = '+a=%s +f=%s' % (a, f)
+ *         geod_init(&self._geod_geodesic, <double> a, <double> f)
+ */
+
 /* Python wrapper */
 static int __pyx_pw_5_proj_4Geod_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static int __pyx_pw_5_proj_4Geod_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
@@ -3626,7 +4069,7 @@ static int __pyx_pw_5_proj_4Geod_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__a,&__pyx_n_s__f,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_a,&__pyx_n_s_f,0};
     PyObject* values[2] = {0,0};
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
@@ -3640,16 +4083,16 @@ static int __pyx_pw_5_proj_4Geod_1__cinit__(PyObject *__pyx_v_self, PyObject *__
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__a)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_a)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__f)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_f)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
       goto __pyx_L5_argtuple_error;
@@ -3662,25 +4105,19 @@ static int __pyx_pw_5_proj_4Geod_1__cinit__(PyObject *__pyx_v_self, PyObject *__
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 370; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_proj.Geod.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return -1;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Geod___cinit__(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self), __pyx_v_a, __pyx_v_f);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":370
- *     cdef public object initstring
- * 
- *     def __cinit__(self, a, f):             # <<<<<<<<<<<<<<
- *         self.initstring = '+a=%s +f=%s' % (a, f)
- *         geod_init(&self._geod_geodesic, <double> a, <double> f)
- */
-
 static int __pyx_pf_5_proj_4Geod___cinit__(struct __pyx_obj_5_proj_Geod *__pyx_v_self, PyObject *__pyx_v_a, PyObject *__pyx_v_f) {
   int __pyx_r;
   __Pyx_RefNannyDeclarations
@@ -3693,41 +4130,50 @@ static int __pyx_pf_5_proj_4Geod___cinit__(struct __pyx_obj_5_proj_Geod *__pyx_v
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__cinit__", 0);
 
-  /* "_proj.pyx":371
+  /* "_proj.pyx":379
  * 
  *     def __cinit__(self, a, f):
  *         self.initstring = '+a=%s +f=%s' % (a, f)             # <<<<<<<<<<<<<<
  *         geod_init(&self._geod_geodesic, <double> a, <double> f)
  * 
  */
-  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_INCREF(__pyx_v_a);
-  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_a);
   __Pyx_GIVEREF(__pyx_v_a);
+  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_a);
   __Pyx_INCREF(__pyx_v_f);
-  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
   __Pyx_GIVEREF(__pyx_v_f);
-  __pyx_t_2 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_17), ((PyObject *)__pyx_t_1)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_2));
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_f);
+  __pyx_t_2 = __Pyx_PyString_Format(__pyx_kp_s_a_s_f_s, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 379; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_t_2);
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __Pyx_GIVEREF(__pyx_t_2);
   __Pyx_GOTREF(__pyx_v_self->initstring);
   __Pyx_DECREF(__pyx_v_self->initstring);
-  __pyx_v_self->initstring = ((PyObject *)__pyx_t_2);
+  __pyx_v_self->initstring = __pyx_t_2;
   __pyx_t_2 = 0;
 
-  /* "_proj.pyx":372
+  /* "_proj.pyx":380
  *     def __cinit__(self, a, f):
  *         self.initstring = '+a=%s +f=%s' % (a, f)
  *         geod_init(&self._geod_geodesic, <double> a, <double> f)             # <<<<<<<<<<<<<<
  * 
  *     def __reduce__(self):
  */
-  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_v_a); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_v_f); if (unlikely((__pyx_t_4 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 372; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_v_a); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_v_f); if (unlikely((__pyx_t_4 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 380; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   geod_init((&__pyx_v_self->_geod_geodesic), ((double)__pyx_t_3), ((double)__pyx_t_4));
 
+  /* "_proj.pyx":378
+ *     cdef public object initstring
+ * 
+ *     def __cinit__(self, a, f):             # <<<<<<<<<<<<<<
+ *         self.initstring = '+a=%s +f=%s' % (a, f)
+ *         geod_init(&self._geod_geodesic, <double> a, <double> f)
+ */
+
+  /* function exit code */
   __pyx_r = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -3740,6 +4186,14 @@ static int __pyx_pf_5_proj_4Geod___cinit__(struct __pyx_obj_5_proj_Geod *__pyx_v
   return __pyx_r;
 }
 
+/* "_proj.pyx":382
+ *         geod_init(&self._geod_geodesic, <double> a, <double> f)
+ * 
+ *     def __reduce__(self):             # <<<<<<<<<<<<<<
+ *         """special method that allows pyproj.Geod instance to be pickled"""
+ *         return (self.__class__,(self.initstring,))
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Geod_3__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
 static char __pyx_doc_5_proj_4Geod_2__reduce__[] = "special method that allows pyproj.Geod instance to be pickled";
@@ -3748,18 +4202,12 @@ static PyObject *__pyx_pw_5_proj_4Geod_3__reduce__(PyObject *__pyx_v_self, CYTHO
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Geod_2__reduce__(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":374
- *         geod_init(&self._geod_geodesic, <double> a, <double> f)
- * 
- *     def __reduce__(self):             # <<<<<<<<<<<<<<
- *         """special method that allows pyproj.Geod instance to be pickled"""
- *         return (self.__class__,(self.initstring,))
- */
-
 static PyObject *__pyx_pf_5_proj_4Geod_2__reduce__(struct __pyx_obj_5_proj_Geod *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -3771,7 +4219,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_2__reduce__(struct __pyx_obj_5_proj_Geod
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("__reduce__", 0);
 
-  /* "_proj.pyx":376
+  /* "_proj.pyx":384
  *     def __reduce__(self):
  *         """special method that allows pyproj.Geod instance to be pickled"""
  *         return (self.__class__,(self.initstring,))             # <<<<<<<<<<<<<<
@@ -3779,27 +4227,34 @@ static PyObject *__pyx_pf_5_proj_4Geod_2__reduce__(struct __pyx_obj_5_proj_Geod
  *     def _fwd(self, object lons, object lats, object az, object dist, radians=False):
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s____class__); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_class); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_INCREF(__pyx_v_self->initstring);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->initstring);
   __Pyx_GIVEREF(__pyx_v_self->initstring);
-  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->initstring);
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
   __Pyx_GIVEREF(__pyx_t_1);
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_t_2));
-  __Pyx_GIVEREF(((PyObject *)__pyx_t_2));
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
+  __Pyx_GIVEREF(__pyx_t_2);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2);
   __pyx_t_1 = 0;
   __pyx_t_2 = 0;
-  __pyx_r = ((PyObject *)__pyx_t_3);
+  __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "_proj.pyx":382
+ *         geod_init(&self._geod_geodesic, <double> a, <double> f)
+ * 
+ *     def __reduce__(self):             # <<<<<<<<<<<<<<
+ *         """special method that allows pyproj.Geod instance to be pickled"""
+ *         return (self.__class__,(self.initstring,))
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
@@ -3812,6 +4267,14 @@ static PyObject *__pyx_pf_5_proj_4Geod_2__reduce__(struct __pyx_obj_5_proj_Geod
   return __pyx_r;
 }
 
+/* "_proj.pyx":386
+ *         return (self.__class__,(self.initstring,))
+ * 
+ *     def _fwd(self, object lons, object lats, object az, object dist, radians=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  forward transformation - determine longitude, latitude and back azimuth
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Geod_5_fwd(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_5_proj_4Geod_4_fwd[] = "\n forward transformation - determine longitude, latitude and back azimuth \n of a terminus point given an initial point longitude and latitude, plus\n forward azimuth and distance.\n if radians=True, lons/lats are radians instead of degrees.\n        ";
@@ -3828,9 +4291,9 @@ static PyObject *__pyx_pw_5_proj_4Geod_5_fwd(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_fwd (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lons,&__pyx_n_s__lats,&__pyx_n_s__az,&__pyx_n_s__dist,&__pyx_n_s__radians,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lons,&__pyx_n_s_lats,&__pyx_n_s_az,&__pyx_n_s_dist,&__pyx_n_s_radians,0};
     PyObject* values[5] = {0,0,0,0,0};
-    values[4] = __pyx_k_18;
+    values[4] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -3846,31 +4309,31 @@ static PyObject *__pyx_pw_5_proj_4Geod_5_fwd(PyObject *__pyx_v_self, PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lons)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lons)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lats)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lats)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__az)) != 0)) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_az)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dist)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_dist)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__radians);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_radians);
           if (value) { values[4] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_fwd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_fwd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -3891,25 +4354,19 @@ static PyObject *__pyx_pw_5_proj_4Geod_5_fwd(PyObject *__pyx_v_self, PyObject *_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("_fwd", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 386; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_proj.Geod._fwd", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Geod_4_fwd(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self), __pyx_v_lons, __pyx_v_lats, __pyx_v_az, __pyx_v_dist, __pyx_v_radians);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":378
- *         return (self.__class__,(self.initstring,))
- * 
- *     def _fwd(self, object lons, object lats, object az, object dist, radians=False):             # <<<<<<<<<<<<<<
- *         """
- *  forward transformation - determine longitude, latitude and back azimuth
- */
-
 static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx_v_self, PyObject *__pyx_v_lons, PyObject *__pyx_v_lats, PyObject *__pyx_v_az, PyObject *__pyx_v_dist, PyObject *__pyx_v_radians) {
   Py_ssize_t __pyx_v_buflenlons;
   Py_ssize_t __pyx_v_buflenlats;
@@ -3945,8 +4402,8 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_fwd", 0);
 
-  /* "_proj.pyx":390
- *         cdef void *londata, *latdata, *azdat, *distdat
+  /* "_proj.pyx":404
+ *         cdef void *distdat
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(lons, &londata, &buflenlons) <> 0:             # <<<<<<<<<<<<<<
  *             raise RuntimeError
@@ -3955,7 +4412,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lons, (&__pyx_v_londata), (&__pyx_v_buflenlons)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":391
+    /* "_proj.pyx":405
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(lons, &londata, &buflenlons) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -3963,12 +4420,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 391; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 405; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":404
+ *         cdef void *distdat
+ *         # if buffer api is supported, get pointer to data buffers.
+ *         if PyObject_AsWriteBuffer(lons, &londata, &buflenlons) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats, &latdata, &buflenlats) <> 0:
+ */
   }
-  __pyx_L3:;
 
-  /* "_proj.pyx":392
+  /* "_proj.pyx":406
  *         if PyObject_AsWriteBuffer(lons, &londata, &buflenlons) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats, &latdata, &buflenlats) <> 0:             # <<<<<<<<<<<<<<
@@ -3978,7 +4441,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lats, (&__pyx_v_latdata), (&__pyx_v_buflenlats)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":393
+    /* "_proj.pyx":407
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats, &latdata, &buflenlats) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -3986,12 +4449,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 393; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":406
+ *         if PyObject_AsWriteBuffer(lons, &londata, &buflenlons) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats, &latdata, &buflenlats) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(az, &azdat, &buflenaz) <> 0:
+ */
   }
-  __pyx_L4:;
 
-  /* "_proj.pyx":394
+  /* "_proj.pyx":408
  *         if PyObject_AsWriteBuffer(lats, &latdata, &buflenlats) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(az, &azdat, &buflenaz) <> 0:             # <<<<<<<<<<<<<<
@@ -4001,7 +4470,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_az, (&__pyx_v_azdat), (&__pyx_v_buflenaz)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":395
+    /* "_proj.pyx":409
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(az, &azdat, &buflenaz) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -4009,12 +4478,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 395; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 409; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":408
+ *         if PyObject_AsWriteBuffer(lats, &latdata, &buflenlats) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(az, &azdat, &buflenaz) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(dist, &distdat, &buflend) <> 0:
+ */
   }
-  __pyx_L5:;
 
-  /* "_proj.pyx":396
+  /* "_proj.pyx":410
  *         if PyObject_AsWriteBuffer(az, &azdat, &buflenaz) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(dist, &distdat, &buflend) <> 0:             # <<<<<<<<<<<<<<
@@ -4024,7 +4499,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_dist, (&__pyx_v_distdat), (&__pyx_v_buflend)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":397
+    /* "_proj.pyx":411
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(dist, &distdat, &buflend) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -4032,12 +4507,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 411; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":410
+ *         if PyObject_AsWriteBuffer(az, &azdat, &buflenaz) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(dist, &distdat, &buflend) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         # process data in buffer
+ */
   }
-  __pyx_L6:;
 
-  /* "_proj.pyx":399
+  /* "_proj.pyx":413
  *             raise RuntimeError
  *         # process data in buffer
  *         if not buflenlons == buflenlats == buflenaz == buflend:             # <<<<<<<<<<<<<<
@@ -4054,42 +4535,48 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
   if (__pyx_t_2) {
 
-    /* "_proj.pyx":400
+    /* "_proj.pyx":414
  *         # process data in buffer
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata
  */
-    __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_19), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L7;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":413
+ *             raise RuntimeError
+ *         # process data in buffer
+ *         if not buflenlons == buflenlats == buflenaz == buflend:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError("Buffer lengths not the same")
+ *         ndim = buflenlons//_doublesize
+ */
   }
-  __pyx_L7:;
 
-  /* "_proj.pyx":401
+  /* "_proj.pyx":415
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenlons//_doublesize             # <<<<<<<<<<<<<<
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata
  */
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_buflenlons); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_buflenlons); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s___doublesize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_doublesize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyNumber_FloorDivide(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyNumber_FloorDivide(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 415; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_ndim = __pyx_t_6;
 
-  /* "_proj.pyx":402
+  /* "_proj.pyx":416
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata             # <<<<<<<<<<<<<<
@@ -4098,7 +4585,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_lonsdata = ((double *)__pyx_v_londata);
 
-  /* "_proj.pyx":403
+  /* "_proj.pyx":417
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata             # <<<<<<<<<<<<<<
@@ -4107,7 +4594,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_latsdata = ((double *)__pyx_v_latdata);
 
-  /* "_proj.pyx":404
+  /* "_proj.pyx":418
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata
  *         azdata = <double *>azdat             # <<<<<<<<<<<<<<
@@ -4116,7 +4603,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_azdata = ((double *)__pyx_v_azdat);
 
-  /* "_proj.pyx":405
+  /* "_proj.pyx":419
  *         latsdata = <double *>latdata
  *         azdata = <double *>azdat
  *         distdata = <double *>distdat             # <<<<<<<<<<<<<<
@@ -4125,7 +4612,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_distdata = ((double *)__pyx_v_distdat);
 
-  /* "_proj.pyx":406
+  /* "_proj.pyx":420
  *         azdata = <double *>azdat
  *         distdata = <double *>distdat
  *         for i from 0 <= i < ndim:             # <<<<<<<<<<<<<<
@@ -4135,18 +4622,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_6 = __pyx_v_ndim;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "_proj.pyx":407
+    /* "_proj.pyx":421
  *         distdata = <double *>distdat
  *         for i from 0 <= i < ndim:
  *             if not radians:             # <<<<<<<<<<<<<<
  *                 lon1 = lonsdata[i]
  *                 lat1 = latsdata[i]
  */
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 407; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_1 = ((!__pyx_t_2) != 0);
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":408
+      /* "_proj.pyx":422
  *         for i from 0 <= i < ndim:
  *             if not radians:
  *                 lon1 = lonsdata[i]             # <<<<<<<<<<<<<<
@@ -4155,7 +4642,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lon1 = (__pyx_v_lonsdata[__pyx_v_i]);
 
-      /* "_proj.pyx":409
+      /* "_proj.pyx":423
  *             if not radians:
  *                 lon1 = lonsdata[i]
  *                 lat1 = latsdata[i]             # <<<<<<<<<<<<<<
@@ -4164,7 +4651,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lat1 = (__pyx_v_latsdata[__pyx_v_i]);
 
-      /* "_proj.pyx":410
+      /* "_proj.pyx":424
  *                 lon1 = lonsdata[i]
  *                 lat1 = latsdata[i]
  *                 az1 = azdata[i]             # <<<<<<<<<<<<<<
@@ -4173,7 +4660,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_az1 = (__pyx_v_azdata[__pyx_v_i]);
 
-      /* "_proj.pyx":411
+      /* "_proj.pyx":425
  *                 lat1 = latsdata[i]
  *                 az1 = azdata[i]
  *                 s12 = distdata[i]             # <<<<<<<<<<<<<<
@@ -4181,20 +4668,28 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *                 lon1 = _dg2rad*lonsdata[i]
  */
       __pyx_v_s12 = (__pyx_v_distdata[__pyx_v_i]);
+
+      /* "_proj.pyx":421
+ *         distdata = <double *>distdat
+ *         for i from 0 <= i < ndim:
+ *             if not radians:             # <<<<<<<<<<<<<<
+ *                 lon1 = lonsdata[i]
+ *                 lat1 = latsdata[i]
+ */
       goto __pyx_L10;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":413
+    /* "_proj.pyx":427
  *                 s12 = distdata[i]
  *             else:
  *                 lon1 = _dg2rad*lonsdata[i]             # <<<<<<<<<<<<<<
  *                 lat1 = _dg2rad*latsdata[i]
  *                 az1 = _dg2rad*azdata[i]
  */
+    /*else*/ {
       __pyx_v_lon1 = (__pyx_v_5_proj__dg2rad * (__pyx_v_lonsdata[__pyx_v_i]));
 
-      /* "_proj.pyx":414
+      /* "_proj.pyx":428
  *             else:
  *                 lon1 = _dg2rad*lonsdata[i]
  *                 lat1 = _dg2rad*latsdata[i]             # <<<<<<<<<<<<<<
@@ -4203,7 +4698,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lat1 = (__pyx_v_5_proj__dg2rad * (__pyx_v_latsdata[__pyx_v_i]));
 
-      /* "_proj.pyx":415
+      /* "_proj.pyx":429
  *                 lon1 = _dg2rad*lonsdata[i]
  *                 lat1 = _dg2rad*latsdata[i]
  *                 az1 = _dg2rad*azdata[i]             # <<<<<<<<<<<<<<
@@ -4212,7 +4707,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_az1 = (__pyx_v_5_proj__dg2rad * (__pyx_v_azdata[__pyx_v_i]));
 
-      /* "_proj.pyx":416
+      /* "_proj.pyx":430
  *                 lat1 = _dg2rad*latsdata[i]
  *                 az1 = _dg2rad*azdata[i]
  *                 s12 = distdata[i]             # <<<<<<<<<<<<<<
@@ -4223,16 +4718,16 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
     }
     __pyx_L10:;
 
-    /* "_proj.pyx":418
+    /* "_proj.pyx":431
+ *                 az1 = _dg2rad*azdata[i]
  *                 s12 = distdata[i]
- *             geod_direct(&self._geod_geodesic, lat1, lon1, az1, s12,\
- *                    &plat2, &plon2, &pazi2)             # <<<<<<<<<<<<<<
+ *             geod_direct(&self._geod_geodesic, lat1, lon1, az1, s12,\             # <<<<<<<<<<<<<<
+ *                    &plat2, &plon2, &pazi2)
  *             # back azimuth needs to be flipped 180 degrees
- *             # to match what proj4 geod utility produces.
  */
     geod_direct((&__pyx_v_self->_geod_geodesic), __pyx_v_lat1, __pyx_v_lon1, __pyx_v_az1, __pyx_v_s12, (&__pyx_v_plat2), (&__pyx_v_plon2), (&__pyx_v_pazi2));
 
-    /* "_proj.pyx":421
+    /* "_proj.pyx":435
  *             # back azimuth needs to be flipped 180 degrees
  *             # to match what proj4 geod utility produces.
  *             if pazi2 > 0:             # <<<<<<<<<<<<<<
@@ -4242,7 +4737,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_t_1 = ((__pyx_v_pazi2 > 0.0) != 0);
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":422
+      /* "_proj.pyx":436
  *             # to match what proj4 geod utility produces.
  *             if pazi2 > 0:
  *                 pazi2 = pazi2-180.             # <<<<<<<<<<<<<<
@@ -4250,10 +4745,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *                 pazi2 = pazi2+180.
  */
       __pyx_v_pazi2 = (__pyx_v_pazi2 - 180.);
+
+      /* "_proj.pyx":435
+ *             # back azimuth needs to be flipped 180 degrees
+ *             # to match what proj4 geod utility produces.
+ *             if pazi2 > 0:             # <<<<<<<<<<<<<<
+ *                 pazi2 = pazi2-180.
+ *             elif pazi2 <= 0:
+ */
       goto __pyx_L11;
     }
 
-    /* "_proj.pyx":423
+    /* "_proj.pyx":437
  *             if pazi2 > 0:
  *                 pazi2 = pazi2-180.
  *             elif pazi2 <= 0:             # <<<<<<<<<<<<<<
@@ -4263,7 +4766,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_t_1 = ((__pyx_v_pazi2 <= 0.0) != 0);
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":424
+      /* "_proj.pyx":438
  *                 pazi2 = pazi2-180.
  *             elif pazi2 <= 0:
  *                 pazi2 = pazi2+180.             # <<<<<<<<<<<<<<
@@ -4271,11 +4774,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *             if pazi2 != pazi2:
  */
       __pyx_v_pazi2 = (__pyx_v_pazi2 + 180.);
-      goto __pyx_L11;
+
+      /* "_proj.pyx":437
+ *             if pazi2 > 0:
+ *                 pazi2 = pazi2-180.
+ *             elif pazi2 <= 0:             # <<<<<<<<<<<<<<
+ *                 pazi2 = pazi2+180.
+ *             # check for NaN.
+ */
     }
     __pyx_L11:;
 
-    /* "_proj.pyx":426
+    /* "_proj.pyx":440
  *                 pazi2 = pazi2+180.
  *             # check for NaN.
  *             if pazi2 != pazi2:             # <<<<<<<<<<<<<<
@@ -4285,34 +4795,40 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_t_1 = ((__pyx_v_pazi2 != __pyx_v_pazi2) != 0);
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":427
+      /* "_proj.pyx":441
  *             # check for NaN.
  *             if pazi2 != pazi2:
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')             # <<<<<<<<<<<<<<
  *             if not radians:
  *                 lonsdata[i] = plon2
  */
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_21), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L12;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "_proj.pyx":440
+ *                 pazi2 = pazi2+180.
+ *             # check for NaN.
+ *             if pazi2 != pazi2:             # <<<<<<<<<<<<<<
+ *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
+ *             if not radians:
+ */
     }
-    __pyx_L12:;
 
-    /* "_proj.pyx":428
+    /* "_proj.pyx":442
  *             if pazi2 != pazi2:
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
  *             if not radians:             # <<<<<<<<<<<<<<
  *                 lonsdata[i] = plon2
  *                 latsdata[i] = plat2
  */
-    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 428; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 442; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __pyx_t_2 = ((!__pyx_t_1) != 0);
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":429
+      /* "_proj.pyx":443
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
  *             if not radians:
  *                 lonsdata[i] = plon2             # <<<<<<<<<<<<<<
@@ -4321,7 +4837,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       (__pyx_v_lonsdata[__pyx_v_i]) = __pyx_v_plon2;
 
-      /* "_proj.pyx":430
+      /* "_proj.pyx":444
  *             if not radians:
  *                 lonsdata[i] = plon2
  *                 latsdata[i] = plat2             # <<<<<<<<<<<<<<
@@ -4330,7 +4846,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       (__pyx_v_latsdata[__pyx_v_i]) = __pyx_v_plat2;
 
-      /* "_proj.pyx":431
+      /* "_proj.pyx":445
  *                 lonsdata[i] = plon2
  *                 latsdata[i] = plat2
  *                 azdata[i] = pazi2             # <<<<<<<<<<<<<<
@@ -4338,20 +4854,28 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  *                 lonsdata[i] = _rad2dg*plon2
  */
       (__pyx_v_azdata[__pyx_v_i]) = __pyx_v_pazi2;
+
+      /* "_proj.pyx":442
+ *             if pazi2 != pazi2:
+ *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
+ *             if not radians:             # <<<<<<<<<<<<<<
+ *                 lonsdata[i] = plon2
+ *                 latsdata[i] = plat2
+ */
       goto __pyx_L13;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":433
+    /* "_proj.pyx":447
  *                 azdata[i] = pazi2
  *             else:
  *                 lonsdata[i] = _rad2dg*plon2             # <<<<<<<<<<<<<<
  *                 latsdata[i] = _rad2dg*plat2
  *                 azdata[i] = _rad2dg*pazi2
  */
+    /*else*/ {
       (__pyx_v_lonsdata[__pyx_v_i]) = (__pyx_v_5_proj__rad2dg * __pyx_v_plon2);
 
-      /* "_proj.pyx":434
+      /* "_proj.pyx":448
  *             else:
  *                 lonsdata[i] = _rad2dg*plon2
  *                 latsdata[i] = _rad2dg*plat2             # <<<<<<<<<<<<<<
@@ -4360,7 +4884,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
  */
       (__pyx_v_latsdata[__pyx_v_i]) = (__pyx_v_5_proj__rad2dg * __pyx_v_plat2);
 
-      /* "_proj.pyx":435
+      /* "_proj.pyx":449
  *                 lonsdata[i] = _rad2dg*plon2
  *                 latsdata[i] = _rad2dg*plat2
  *                 azdata[i] = _rad2dg*pazi2             # <<<<<<<<<<<<<<
@@ -4372,6 +4896,15 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_L13:;
   }
 
+  /* "_proj.pyx":386
+ *         return (self.__class__,(self.initstring,))
+ * 
+ *     def _fwd(self, object lons, object lats, object az, object dist, radians=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  forward transformation - determine longitude, latitude and back azimuth
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -4386,6 +4919,14 @@ static PyObject *__pyx_pf_5_proj_4Geod_4_fwd(struct __pyx_obj_5_proj_Geod *__pyx
   return __pyx_r;
 }
 
+/* "_proj.pyx":451
+ *                 azdata[i] = _rad2dg*pazi2
+ * 
+ *     def _inv(self, object lons1, object lats1, object lons2, object lats2, radians=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  inverse transformation - return forward and back azimuths, plus distance
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Geod_7_inv(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_5_proj_4Geod_6_inv[] = "\n inverse transformation - return forward and back azimuths, plus distance\n between an initial and terminus lat/lon pair.\n if radians=True, lons/lats are radians instead of degrees.\n        ";
@@ -4402,9 +4943,9 @@ static PyObject *__pyx_pw_5_proj_4Geod_7_inv(PyObject *__pyx_v_self, PyObject *_
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_inv (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lons1,&__pyx_n_s__lats1,&__pyx_n_s__lons2,&__pyx_n_s__lats2,&__pyx_n_s__radians,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lons1,&__pyx_n_s_lats1,&__pyx_n_s_lons2,&__pyx_n_s_lats2,&__pyx_n_s_radians,0};
     PyObject* values[5] = {0,0,0,0,0};
-    values[4] = __pyx_k_22;
+    values[4] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -4420,31 +4961,31 @@ static PyObject *__pyx_pw_5_proj_4Geod_7_inv(PyObject *__pyx_v_self, PyObject *_
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lons1)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lons1)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lats1)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lats1)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lons2)) != 0)) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lons2)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lats2)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lats2)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__radians);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_radians);
           if (value) { values[4] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_inv") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_inv") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -4465,25 +5006,19 @@ static PyObject *__pyx_pw_5_proj_4Geod_7_inv(PyObject *__pyx_v_self, PyObject *_
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("_inv", 0, 4, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_proj.Geod._inv", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Geod_6_inv(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self), __pyx_v_lons1, __pyx_v_lats1, __pyx_v_lons2, __pyx_v_lats2, __pyx_v_radians);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":437
- *                 azdata[i] = _rad2dg*pazi2
- * 
- *     def _inv(self, object lons1, object lats1, object lons2, object lats2, radians=False):             # <<<<<<<<<<<<<<
- *         """
- *  inverse transformation - return forward and back azimuths, plus distance
- */
-
 static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx_v_self, PyObject *__pyx_v_lons1, PyObject *__pyx_v_lats1, PyObject *__pyx_v_lons2, PyObject *__pyx_v_lats2, PyObject *__pyx_v_radians) {
   double __pyx_v_lat1;
   double __pyx_v_lon1;
@@ -4520,8 +5055,8 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_inv", 0);
 
-  /* "_proj.pyx":448
- *         cdef void *londata, *latdata, *azdat, *distdat
+  /* "_proj.pyx":468
+ *         cdef void *distdat
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(lons1, &londata, &buflenlons) <> 0:             # <<<<<<<<<<<<<<
  *             raise RuntimeError
@@ -4530,7 +5065,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lons1, (&__pyx_v_londata), (&__pyx_v_buflenlons)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":449
+    /* "_proj.pyx":469
  *         # if buffer api is supported, get pointer to data buffers.
  *         if PyObject_AsWriteBuffer(lons1, &londata, &buflenlons) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -4538,12 +5073,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 449; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L3;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 469; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":468
+ *         cdef void *distdat
+ *         # if buffer api is supported, get pointer to data buffers.
+ *         if PyObject_AsWriteBuffer(lons1, &londata, &buflenlons) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats1, &latdata, &buflenlats) <> 0:
+ */
   }
-  __pyx_L3:;
 
-  /* "_proj.pyx":450
+  /* "_proj.pyx":470
  *         if PyObject_AsWriteBuffer(lons1, &londata, &buflenlons) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats1, &latdata, &buflenlats) <> 0:             # <<<<<<<<<<<<<<
@@ -4553,7 +5094,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lats1, (&__pyx_v_latdata), (&__pyx_v_buflenlats)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":451
+    /* "_proj.pyx":471
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats1, &latdata, &buflenlats) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -4561,12 +5102,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L4;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":470
+ *         if PyObject_AsWriteBuffer(lons1, &londata, &buflenlons) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats1, &latdata, &buflenlats) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lons2, &azdat, &buflenaz) <> 0:
+ */
   }
-  __pyx_L4:;
 
-  /* "_proj.pyx":452
+  /* "_proj.pyx":472
  *         if PyObject_AsWriteBuffer(lats1, &latdata, &buflenlats) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lons2, &azdat, &buflenaz) <> 0:             # <<<<<<<<<<<<<<
@@ -4576,7 +5123,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lons2, (&__pyx_v_azdat), (&__pyx_v_buflenaz)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":453
+    /* "_proj.pyx":473
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lons2, &azdat, &buflenaz) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -4584,12 +5131,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *             raise RuntimeError
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 453; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L5;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":472
+ *         if PyObject_AsWriteBuffer(lats1, &latdata, &buflenlats) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lons2, &azdat, &buflenaz) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats2, &distdat, &buflend) <> 0:
+ */
   }
-  __pyx_L5:;
 
-  /* "_proj.pyx":454
+  /* "_proj.pyx":474
  *         if PyObject_AsWriteBuffer(lons2, &azdat, &buflenaz) <> 0:
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats2, &distdat, &buflend) <> 0:             # <<<<<<<<<<<<<<
@@ -4599,7 +5152,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_1 = ((PyObject_AsWriteBuffer(__pyx_v_lats2, (&__pyx_v_distdat), (&__pyx_v_buflend)) != 0) != 0);
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":455
+    /* "_proj.pyx":475
  *             raise RuntimeError
  *         if PyObject_AsWriteBuffer(lats2, &distdat, &buflend) <> 0:
  *             raise RuntimeError             # <<<<<<<<<<<<<<
@@ -4607,12 +5160,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  */
     __Pyx_Raise(__pyx_builtin_RuntimeError, 0, 0, 0);
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L6;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":474
+ *         if PyObject_AsWriteBuffer(lons2, &azdat, &buflenaz) <> 0:
+ *             raise RuntimeError
+ *         if PyObject_AsWriteBuffer(lats2, &distdat, &buflend) <> 0:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError
+ *         # process data in buffer
+ */
   }
-  __pyx_L6:;
 
-  /* "_proj.pyx":457
+  /* "_proj.pyx":477
  *             raise RuntimeError
  *         # process data in buffer
  *         if not buflenlons == buflenlats == buflenaz == buflend:             # <<<<<<<<<<<<<<
@@ -4629,42 +5188,48 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
   if (__pyx_t_2) {
 
-    /* "_proj.pyx":458
+    /* "_proj.pyx":478
  *         # process data in buffer
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata
  */
-    __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_23), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_RuntimeError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     __Pyx_GOTREF(__pyx_t_3);
     __Pyx_Raise(__pyx_t_3, 0, 0, 0);
     __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    goto __pyx_L7;
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+    /* "_proj.pyx":477
+ *             raise RuntimeError
+ *         # process data in buffer
+ *         if not buflenlons == buflenlats == buflenaz == buflend:             # <<<<<<<<<<<<<<
+ *             raise RuntimeError("Buffer lengths not the same")
+ *         ndim = buflenlons//_doublesize
+ */
   }
-  __pyx_L7:;
 
-  /* "_proj.pyx":459
+  /* "_proj.pyx":479
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenlons//_doublesize             # <<<<<<<<<<<<<<
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata
  */
-  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_buflenlons); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_buflenlons); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s___doublesize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_doublesize); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_4);
-  __pyx_t_5 = PyNumber_FloorDivide(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_5 = PyNumber_FloorDivide(__pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_5);
   __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
   __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
-  __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 459; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_6 = __Pyx_PyIndex_AsSsize_t(__pyx_t_5); if (unlikely((__pyx_t_6 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
   __pyx_v_ndim = __pyx_t_6;
 
-  /* "_proj.pyx":460
+  /* "_proj.pyx":480
  *             raise RuntimeError("Buffer lengths not the same")
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata             # <<<<<<<<<<<<<<
@@ -4673,7 +5238,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_lonsdata = ((double *)__pyx_v_londata);
 
-  /* "_proj.pyx":461
+  /* "_proj.pyx":481
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata             # <<<<<<<<<<<<<<
@@ -4682,7 +5247,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_latsdata = ((double *)__pyx_v_latdata);
 
-  /* "_proj.pyx":462
+  /* "_proj.pyx":482
  *         lonsdata = <double *>londata
  *         latsdata = <double *>latdata
  *         azdata = <double *>azdat             # <<<<<<<<<<<<<<
@@ -4691,7 +5256,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_azdata = ((double *)__pyx_v_azdat);
 
-  /* "_proj.pyx":463
+  /* "_proj.pyx":483
  *         latsdata = <double *>latdata
  *         azdata = <double *>azdat
  *         distdata = <double *>distdat             # <<<<<<<<<<<<<<
@@ -4700,17 +5265,17 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
   __pyx_v_distdata = ((double *)__pyx_v_distdat);
 
-  /* "_proj.pyx":464
+  /* "_proj.pyx":484
  *         azdata = <double *>azdat
  *         distdata = <double *>distdat
  *         errmsg = 'undefined inverse geodesic (may be an antipodal point)'             # <<<<<<<<<<<<<<
  *         for i from 0 <= i < ndim:
  *             if radians:
  */
-  __Pyx_INCREF(((PyObject *)__pyx_kp_s_20));
-  __pyx_v_errmsg = ((PyObject *)__pyx_kp_s_20);
+  __Pyx_INCREF(__pyx_kp_s_undefined_inverse_geodesic_may_b);
+  __pyx_v_errmsg = __pyx_kp_s_undefined_inverse_geodesic_may_b;
 
-  /* "_proj.pyx":465
+  /* "_proj.pyx":485
  *         distdata = <double *>distdat
  *         errmsg = 'undefined inverse geodesic (may be an antipodal point)'
  *         for i from 0 <= i < ndim:             # <<<<<<<<<<<<<<
@@ -4720,17 +5285,17 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   __pyx_t_6 = __pyx_v_ndim;
   for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_6; __pyx_v_i++) {
 
-    /* "_proj.pyx":466
+    /* "_proj.pyx":486
  *         errmsg = 'undefined inverse geodesic (may be an antipodal point)'
  *         for i from 0 <= i < ndim:
  *             if radians:             # <<<<<<<<<<<<<<
  *                 lon1 = _rad2dg*lonsdata[i]
  *                 lat1 = _rad2dg*latsdata[i]
  */
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":467
+      /* "_proj.pyx":487
  *         for i from 0 <= i < ndim:
  *             if radians:
  *                 lon1 = _rad2dg*lonsdata[i]             # <<<<<<<<<<<<<<
@@ -4739,7 +5304,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lon1 = (__pyx_v_5_proj__rad2dg * (__pyx_v_lonsdata[__pyx_v_i]));
 
-      /* "_proj.pyx":468
+      /* "_proj.pyx":488
  *             if radians:
  *                 lon1 = _rad2dg*lonsdata[i]
  *                 lat1 = _rad2dg*latsdata[i]             # <<<<<<<<<<<<<<
@@ -4748,7 +5313,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lat1 = (__pyx_v_5_proj__rad2dg * (__pyx_v_latsdata[__pyx_v_i]));
 
-      /* "_proj.pyx":469
+      /* "_proj.pyx":489
  *                 lon1 = _rad2dg*lonsdata[i]
  *                 lat1 = _rad2dg*latsdata[i]
  *                 lon2 = _rad2dg*azdata[i]             # <<<<<<<<<<<<<<
@@ -4757,7 +5322,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lon2 = (__pyx_v_5_proj__rad2dg * (__pyx_v_azdata[__pyx_v_i]));
 
-      /* "_proj.pyx":470
+      /* "_proj.pyx":490
  *                 lat1 = _rad2dg*latsdata[i]
  *                 lon2 = _rad2dg*azdata[i]
  *                 lat2 = _rad2dg*distdata[i]             # <<<<<<<<<<<<<<
@@ -4765,20 +5330,28 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *                 lon1 = lonsdata[i]
  */
       __pyx_v_lat2 = (__pyx_v_5_proj__rad2dg * (__pyx_v_distdata[__pyx_v_i]));
+
+      /* "_proj.pyx":486
+ *         errmsg = 'undefined inverse geodesic (may be an antipodal point)'
+ *         for i from 0 <= i < ndim:
+ *             if radians:             # <<<<<<<<<<<<<<
+ *                 lon1 = _rad2dg*lonsdata[i]
+ *                 lat1 = _rad2dg*latsdata[i]
+ */
       goto __pyx_L10;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":472
+    /* "_proj.pyx":492
  *                 lat2 = _rad2dg*distdata[i]
  *             else:
  *                 lon1 = lonsdata[i]             # <<<<<<<<<<<<<<
  *                 lat1 = latsdata[i]
  *                 lon2 = azdata[i]
  */
+    /*else*/ {
       __pyx_v_lon1 = (__pyx_v_lonsdata[__pyx_v_i]);
 
-      /* "_proj.pyx":473
+      /* "_proj.pyx":493
  *             else:
  *                 lon1 = lonsdata[i]
  *                 lat1 = latsdata[i]             # <<<<<<<<<<<<<<
@@ -4787,7 +5360,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lat1 = (__pyx_v_latsdata[__pyx_v_i]);
 
-      /* "_proj.pyx":474
+      /* "_proj.pyx":494
  *                 lon1 = lonsdata[i]
  *                 lat1 = latsdata[i]
  *                 lon2 = azdata[i]             # <<<<<<<<<<<<<<
@@ -4796,7 +5369,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
       __pyx_v_lon2 = (__pyx_v_azdata[__pyx_v_i]);
 
-      /* "_proj.pyx":475
+      /* "_proj.pyx":495
  *                 lat1 = latsdata[i]
  *                 lon2 = azdata[i]
  *                 lat2 = distdata[i]             # <<<<<<<<<<<<<<
@@ -4807,16 +5380,16 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
     }
     __pyx_L10:;
 
-    /* "_proj.pyx":477
+    /* "_proj.pyx":496
+ *                 lon2 = azdata[i]
  *                 lat2 = distdata[i]
- *             geod_inverse(&self._geod_geodesic, lat1, lon1, lat2, lon2,
- *                     &ps12, &pazi1, &pazi2)             # <<<<<<<<<<<<<<
+ *             geod_inverse(&self._geod_geodesic, lat1, lon1, lat2, lon2,             # <<<<<<<<<<<<<<
+ *                     &ps12, &pazi1, &pazi2)
  *             # back azimuth needs to be flipped 180 degrees
- *             # to match what proj4 geod utility produces.
  */
     geod_inverse((&__pyx_v_self->_geod_geodesic), __pyx_v_lat1, __pyx_v_lon1, __pyx_v_lat2, __pyx_v_lon2, (&__pyx_v_ps12), (&__pyx_v_pazi1), (&__pyx_v_pazi2));
 
-    /* "_proj.pyx":480
+    /* "_proj.pyx":500
  *             # back azimuth needs to be flipped 180 degrees
  *             # to match what proj4 geod utility produces.
  *             if pazi2 > 0:             # <<<<<<<<<<<<<<
@@ -4826,7 +5399,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_t_2 = ((__pyx_v_pazi2 > 0.0) != 0);
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":481
+      /* "_proj.pyx":501
  *             # to match what proj4 geod utility produces.
  *             if pazi2 > 0:
  *                 pazi2 = pazi2-180.             # <<<<<<<<<<<<<<
@@ -4834,10 +5407,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *                 pazi2 = pazi2+180.
  */
       __pyx_v_pazi2 = (__pyx_v_pazi2 - 180.);
+
+      /* "_proj.pyx":500
+ *             # back azimuth needs to be flipped 180 degrees
+ *             # to match what proj4 geod utility produces.
+ *             if pazi2 > 0:             # <<<<<<<<<<<<<<
+ *                 pazi2 = pazi2-180.
+ *             elif pazi2 <= 0:
+ */
       goto __pyx_L11;
     }
 
-    /* "_proj.pyx":482
+    /* "_proj.pyx":502
  *             if pazi2 > 0:
  *                 pazi2 = pazi2-180.
  *             elif pazi2 <= 0:             # <<<<<<<<<<<<<<
@@ -4847,7 +5428,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_t_2 = ((__pyx_v_pazi2 <= 0.0) != 0);
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":483
+      /* "_proj.pyx":503
  *                 pazi2 = pazi2-180.
  *             elif pazi2 <= 0:
  *                 pazi2 = pazi2+180.             # <<<<<<<<<<<<<<
@@ -4855,11 +5436,18 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
  */
       __pyx_v_pazi2 = (__pyx_v_pazi2 + 180.);
-      goto __pyx_L11;
+
+      /* "_proj.pyx":502
+ *             if pazi2 > 0:
+ *                 pazi2 = pazi2-180.
+ *             elif pazi2 <= 0:             # <<<<<<<<<<<<<<
+ *                 pazi2 = pazi2+180.
+ *             if ps12 != ps12: # check for NaN
+ */
     }
     __pyx_L11:;
 
-    /* "_proj.pyx":484
+    /* "_proj.pyx":504
  *             elif pazi2 <= 0:
  *                 pazi2 = pazi2+180.
  *             if ps12 != ps12: # check for NaN             # <<<<<<<<<<<<<<
@@ -4869,33 +5457,39 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
     __pyx_t_2 = ((__pyx_v_ps12 != __pyx_v_ps12) != 0);
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":485
+      /* "_proj.pyx":505
  *                 pazi2 = pazi2+180.
  *             if ps12 != ps12: # check for NaN
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')             # <<<<<<<<<<<<<<
  *             if radians:
  *                 lonsdata[i] = _rad2dg*pazi1
  */
-      __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_24), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_5);
       __Pyx_Raise(__pyx_t_5, 0, 0, 0);
       __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
-      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      goto __pyx_L12;
+      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+
+      /* "_proj.pyx":504
+ *             elif pazi2 <= 0:
+ *                 pazi2 = pazi2+180.
+ *             if ps12 != ps12: # check for NaN             # <<<<<<<<<<<<<<
+ *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
+ *             if radians:
+ */
     }
-    __pyx_L12:;
 
-    /* "_proj.pyx":486
+    /* "_proj.pyx":506
  *             if ps12 != ps12: # check for NaN
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
  *             if radians:             # <<<<<<<<<<<<<<
  *                 lonsdata[i] = _rad2dg*pazi1
  *                 latsdata[i] = _rad2dg*pazi2
  */
-    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 486; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_2) {
 
-      /* "_proj.pyx":487
+      /* "_proj.pyx":507
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
  *             if radians:
  *                 lonsdata[i] = _rad2dg*pazi1             # <<<<<<<<<<<<<<
@@ -4904,7 +5498,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  */
       (__pyx_v_lonsdata[__pyx_v_i]) = (__pyx_v_5_proj__rad2dg * __pyx_v_pazi1);
 
-      /* "_proj.pyx":488
+      /* "_proj.pyx":508
  *             if radians:
  *                 lonsdata[i] = _rad2dg*pazi1
  *                 latsdata[i] = _rad2dg*pazi2             # <<<<<<<<<<<<<<
@@ -4912,20 +5506,28 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
  *                 lonsdata[i] = pazi1
  */
       (__pyx_v_latsdata[__pyx_v_i]) = (__pyx_v_5_proj__rad2dg * __pyx_v_pazi2);
+
+      /* "_proj.pyx":506
+ *             if ps12 != ps12: # check for NaN
+ *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')
+ *             if radians:             # <<<<<<<<<<<<<<
+ *                 lonsdata[i] = _rad2dg*pazi1
+ *                 latsdata[i] = _rad2dg*pazi2
+ */
       goto __pyx_L13;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":490
+    /* "_proj.pyx":510
  *                 latsdata[i] = _rad2dg*pazi2
  *             else:
  *                 lonsdata[i] = pazi1             # <<<<<<<<<<<<<<
  *                 latsdata[i] = pazi2
  *             azdata[i] = ps12
  */
+    /*else*/ {
       (__pyx_v_lonsdata[__pyx_v_i]) = __pyx_v_pazi1;
 
-      /* "_proj.pyx":491
+      /* "_proj.pyx":511
  *             else:
  *                 lonsdata[i] = pazi1
  *                 latsdata[i] = pazi2             # <<<<<<<<<<<<<<
@@ -4936,7 +5538,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
     }
     __pyx_L13:;
 
-    /* "_proj.pyx":492
+    /* "_proj.pyx":512
  *                 lonsdata[i] = pazi1
  *                 latsdata[i] = pazi2
  *             azdata[i] = ps12             # <<<<<<<<<<<<<<
@@ -4946,6 +5548,15 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
     (__pyx_v_azdata[__pyx_v_i]) = __pyx_v_ps12;
   }
 
+  /* "_proj.pyx":451
+ *                 azdata[i] = _rad2dg*pazi2
+ * 
+ *     def _inv(self, object lons1, object lats1, object lons2, object lats2, radians=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  inverse transformation - return forward and back azimuths, plus distance
+ */
+
+  /* function exit code */
   __pyx_r = Py_None; __Pyx_INCREF(Py_None);
   goto __pyx_L0;
   __pyx_L1_error:;
@@ -4961,6 +5572,14 @@ static PyObject *__pyx_pf_5_proj_4Geod_6_inv(struct __pyx_obj_5_proj_Geod *__pyx
   return __pyx_r;
 }
 
+/* "_proj.pyx":514
+ *             azdata[i] = ps12
+ * 
+ *     def _npts(self, double lon1, double lat1, double lon2, double lat2, int npts, radians=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  given initial and terminus lat/lon, find npts intermediate points."""
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Geod_9_npts(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
 static char __pyx_doc_5_proj_4Geod_8_npts[] = "\n given initial and terminus lat/lon, find npts intermediate points.";
@@ -4978,9 +5597,9 @@ static PyObject *__pyx_pw_5_proj_4Geod_9_npts(PyObject *__pyx_v_self, PyObject *
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("_npts (wrapper)", 0);
   {
-    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__lon1,&__pyx_n_s__lat1,&__pyx_n_s__lon2,&__pyx_n_s__lat2,&__pyx_n_s__npts,&__pyx_n_s__radians,0};
+    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_lon1,&__pyx_n_s_lat1,&__pyx_n_s_lon2,&__pyx_n_s_lat2,&__pyx_n_s_npts,&__pyx_n_s_radians,0};
     PyObject* values[6] = {0,0,0,0,0,0};
-    values[5] = __pyx_k_25;
+    values[5] = ((PyObject *)Py_False);
     if (unlikely(__pyx_kwds)) {
       Py_ssize_t kw_args;
       const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
@@ -4997,36 +5616,36 @@ static PyObject *__pyx_pw_5_proj_4Geod_9_npts(PyObject *__pyx_v_self, PyObject *
       kw_args = PyDict_Size(__pyx_kwds);
       switch (pos_args) {
         case  0:
-        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lon1)) != 0)) kw_args--;
+        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lon1)) != 0)) kw_args--;
         else goto __pyx_L5_argtuple_error;
         case  1:
-        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lat1)) != 0)) kw_args--;
+        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lat1)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  2:
-        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lon2)) != 0)) kw_args--;
+        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lon2)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  3:
-        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__lat2)) != 0)) kw_args--;
+        if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_lat2)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  4:
-        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__npts)) != 0)) kw_args--;
+        if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_npts)) != 0)) kw_args--;
         else {
-          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+          __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
         }
         case  5:
         if (kw_args > 0) {
-          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__radians);
+          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_radians);
           if (value) { values[5] = value; kw_args--; }
         }
       }
       if (unlikely(kw_args > 0)) {
-        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_npts") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_npts") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
       }
     } else {
       switch (PyTuple_GET_SIZE(__pyx_args)) {
@@ -5040,34 +5659,28 @@ static PyObject *__pyx_pw_5_proj_4Geod_9_npts(PyObject *__pyx_v_self, PyObject *
         default: goto __pyx_L5_argtuple_error;
       }
     }
-    __pyx_v_lon1 = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_lon1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_lat1 = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_lat1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_lon2 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_lon2 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_lat2 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_lat2 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
-    __pyx_v_npts = __Pyx_PyInt_AsInt(values[4]); if (unlikely((__pyx_v_npts == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_lon1 = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_lon1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_lat1 = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_lat1 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_lon2 = __pyx_PyFloat_AsDouble(values[2]); if (unlikely((__pyx_v_lon2 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_lat2 = __pyx_PyFloat_AsDouble(values[3]); if (unlikely((__pyx_v_lat2 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+    __pyx_v_npts = __Pyx_PyInt_As_int(values[4]); if (unlikely((__pyx_v_npts == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
     __pyx_v_radians = values[5];
   }
   goto __pyx_L4_argument_unpacking_done;
   __pyx_L5_argtuple_error:;
-  __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
+  __Pyx_RaiseArgtupleInvalid("_npts", 0, 5, 6, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 514; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
   __pyx_L3_error:;
   __Pyx_AddTraceback("_proj.Geod._npts", __pyx_clineno, __pyx_lineno, __pyx_filename);
   __Pyx_RefNannyFinishContext();
   return NULL;
   __pyx_L4_argument_unpacking_done:;
   __pyx_r = __pyx_pf_5_proj_4Geod_8_npts(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self), __pyx_v_lon1, __pyx_v_lat1, __pyx_v_lon2, __pyx_v_lat2, __pyx_v_npts, __pyx_v_radians);
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":494
- *             azdata[i] = ps12
- * 
- *     def _npts(self, double lon1, double lat1, double lon2, double lat2, int npts, radians=False):             # <<<<<<<<<<<<<<
- *         """
- *  given initial and terminus lat/lon, find npts intermediate points."""
- */
-
 static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__pyx_v_self, double __pyx_v_lon1, double __pyx_v_lat1, double __pyx_v_lon2, double __pyx_v_lat2, int __pyx_v_npts, PyObject *__pyx_v_radians) {
   int __pyx_v_i;
   double __pyx_v_del_s;
@@ -5090,17 +5703,17 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
   int __pyx_clineno = 0;
   __Pyx_RefNannySetupContext("_npts", 0);
 
-  /* "_proj.pyx":499
+  /* "_proj.pyx":519
  *         cdef int i
  *         cdef double del_s,ps12,pazi1,pazi2,s12,plon2,plat2
  *         if radians:             # <<<<<<<<<<<<<<
  *             lon1 = _rad2dg*lon1
  *             lat1 = _rad2dg*lat1
  */
-  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   if (__pyx_t_1) {
 
-    /* "_proj.pyx":500
+    /* "_proj.pyx":520
  *         cdef double del_s,ps12,pazi1,pazi2,s12,plon2,plat2
  *         if radians:
  *             lon1 = _rad2dg*lon1             # <<<<<<<<<<<<<<
@@ -5109,7 +5722,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
  */
     __pyx_v_lon1 = (__pyx_v_5_proj__rad2dg * __pyx_v_lon1);
 
-    /* "_proj.pyx":501
+    /* "_proj.pyx":521
  *         if radians:
  *             lon1 = _rad2dg*lon1
  *             lat1 = _rad2dg*lat1             # <<<<<<<<<<<<<<
@@ -5118,7 +5731,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
  */
     __pyx_v_lat1 = (__pyx_v_5_proj__rad2dg * __pyx_v_lat1);
 
-    /* "_proj.pyx":502
+    /* "_proj.pyx":522
  *             lon1 = _rad2dg*lon1
  *             lat1 = _rad2dg*lat1
  *             lon2 = _rad2dg*lon2             # <<<<<<<<<<<<<<
@@ -5127,7 +5740,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
  */
     __pyx_v_lon2 = (__pyx_v_5_proj__rad2dg * __pyx_v_lon2);
 
-    /* "_proj.pyx":503
+    /* "_proj.pyx":523
  *             lat1 = _rad2dg*lat1
  *             lon2 = _rad2dg*lon2
  *             lat2 = _rad2dg*lat2             # <<<<<<<<<<<<<<
@@ -5135,20 +5748,26 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
  *         geod_inverse(&self._geod_geodesic, lat1, lon1,  lat2, lon2,
  */
     __pyx_v_lat2 = (__pyx_v_5_proj__rad2dg * __pyx_v_lat2);
-    goto __pyx_L3;
+
+    /* "_proj.pyx":519
+ *         cdef int i
+ *         cdef double del_s,ps12,pazi1,pazi2,s12,plon2,plat2
+ *         if radians:             # <<<<<<<<<<<<<<
+ *             lon1 = _rad2dg*lon1
+ *             lat1 = _rad2dg*lat1
+ */
   }
-  __pyx_L3:;
 
-  /* "_proj.pyx":506
+  /* "_proj.pyx":525
+ *             lat2 = _rad2dg*lat2
  *         # do inverse computation to set azimuths, distance.
- *         geod_inverse(&self._geod_geodesic, lat1, lon1,  lat2, lon2,
- *                 &ps12, &pazi1, &pazi2)             # <<<<<<<<<<<<<<
+ *         geod_inverse(&self._geod_geodesic, lat1, lon1,  lat2, lon2,             # <<<<<<<<<<<<<<
+ *                 &ps12, &pazi1, &pazi2)
  *         # distance increment.
- *         del_s = ps12/(npts+1)
  */
   geod_inverse((&__pyx_v_self->_geod_geodesic), __pyx_v_lat1, __pyx_v_lon1, __pyx_v_lat2, __pyx_v_lon2, (&__pyx_v_ps12), (&__pyx_v_pazi1), (&__pyx_v_pazi2));
 
-  /* "_proj.pyx":508
+  /* "_proj.pyx":528
  *                 &ps12, &pazi1, &pazi2)
  *         # distance increment.
  *         del_s = ps12/(npts+1)             # <<<<<<<<<<<<<<
@@ -5157,38 +5776,32 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
  */
   __pyx_t_2 = (__pyx_v_npts + 1);
   if (unlikely(__pyx_t_2 == 0)) {
-    #ifdef WITH_THREAD
-    PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();
-    #endif
-    PyErr_Format(PyExc_ZeroDivisionError, "float division");
-    #ifdef WITH_THREAD
-    PyGILState_Release(__pyx_gilstate_save);
-    #endif
-    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    PyErr_SetString(PyExc_ZeroDivisionError, "float division");
+    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   }
   __pyx_v_del_s = (__pyx_v_ps12 / __pyx_t_2);
 
-  /* "_proj.pyx":510
+  /* "_proj.pyx":530
  *         del_s = ps12/(npts+1)
  *         # initialize output tuples.
  *         lats = ()             # <<<<<<<<<<<<<<
  *         lons = ()
  *         # loop over intermediate points, compute lat/lons.
  */
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
+  __Pyx_INCREF(__pyx_empty_tuple);
   __pyx_v_lats = __pyx_empty_tuple;
 
-  /* "_proj.pyx":511
+  /* "_proj.pyx":531
  *         # initialize output tuples.
  *         lats = ()
  *         lons = ()             # <<<<<<<<<<<<<<
  *         # loop over intermediate points, compute lat/lons.
  *         for i from 1 <= i < npts+1:
  */
-  __Pyx_INCREF(((PyObject *)__pyx_empty_tuple));
+  __Pyx_INCREF(__pyx_empty_tuple);
   __pyx_v_lons = __pyx_empty_tuple;
 
-  /* "_proj.pyx":513
+  /* "_proj.pyx":533
  *         lons = ()
  *         # loop over intermediate points, compute lat/lons.
  *         for i from 1 <= i < npts+1:             # <<<<<<<<<<<<<<
@@ -5198,7 +5811,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
   __pyx_t_2 = (__pyx_v_npts + 1);
   for (__pyx_v_i = 1; __pyx_v_i < __pyx_t_2; __pyx_v_i++) {
 
-    /* "_proj.pyx":514
+    /* "_proj.pyx":534
  *         # loop over intermediate points, compute lat/lons.
  *         for i from 1 <= i < npts+1:
  *             s12 = i*del_s             # <<<<<<<<<<<<<<
@@ -5207,134 +5820,145 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
  */
     __pyx_v_s12 = (__pyx_v_i * __pyx_v_del_s);
 
-    /* "_proj.pyx":516
+    /* "_proj.pyx":535
+ *         for i from 1 <= i < npts+1:
  *             s12 = i*del_s
- *             geod_direct(&self._geod_geodesic, lat1, lon1, pazi1, s12,\
- *                    &plat2, &plon2, &pazi2)             # <<<<<<<<<<<<<<
+ *             geod_direct(&self._geod_geodesic, lat1, lon1, pazi1, s12,\             # <<<<<<<<<<<<<<
+ *                    &plat2, &plon2, &pazi2)
  *             if radians:
- *                 lats = lats + (_dg2rad*plat2,)
  */
     geod_direct((&__pyx_v_self->_geod_geodesic), __pyx_v_lat1, __pyx_v_lon1, __pyx_v_pazi1, __pyx_v_s12, (&__pyx_v_plat2), (&__pyx_v_plon2), (&__pyx_v_pazi2));
 
-    /* "_proj.pyx":517
+    /* "_proj.pyx":537
  *             geod_direct(&self._geod_geodesic, lat1, lon1, pazi1, s12,\
  *                    &plat2, &plon2, &pazi2)
  *             if radians:             # <<<<<<<<<<<<<<
  *                 lats = lats + (_dg2rad*plat2,)
  *                 lons = lons + (_dg2rad*plon2,)
  */
-    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_radians); if (unlikely(__pyx_t_1 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 537; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
     if (__pyx_t_1) {
 
-      /* "_proj.pyx":518
+      /* "_proj.pyx":538
  *                    &plat2, &plon2, &pazi2)
  *             if radians:
  *                 lats = lats + (_dg2rad*plat2,)             # <<<<<<<<<<<<<<
  *                 lons = lons + (_dg2rad*plon2,)
  *             else:
  */
-      __pyx_t_3 = PyFloat_FromDouble((__pyx_v_5_proj__dg2rad * __pyx_v_plat2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble((__pyx_v_5_proj__dg2rad * __pyx_v_plat2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_lats), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_v_lats));
-      __pyx_v_lats = ((PyObject*)__pyx_t_3);
+      __pyx_t_3 = PyNumber_Add(__pyx_v_lats, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 538; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF_SET(__pyx_v_lats, __pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "_proj.pyx":519
+      /* "_proj.pyx":539
  *             if radians:
  *                 lats = lats + (_dg2rad*plat2,)
  *                 lons = lons + (_dg2rad*plon2,)             # <<<<<<<<<<<<<<
  *             else:
  *                 lats = lats + (plat2,)
  */
-      __pyx_t_3 = PyFloat_FromDouble((__pyx_v_5_proj__dg2rad * __pyx_v_plon2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble((__pyx_v_5_proj__dg2rad * __pyx_v_plon2)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_lons), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_v_lons));
-      __pyx_v_lons = ((PyObject*)__pyx_t_3);
+      __pyx_t_3 = PyNumber_Add(__pyx_v_lons, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF_SET(__pyx_v_lons, __pyx_t_3);
       __pyx_t_3 = 0;
+
+      /* "_proj.pyx":537
+ *             geod_direct(&self._geod_geodesic, lat1, lon1, pazi1, s12,\
+ *                    &plat2, &plon2, &pazi2)
+ *             if radians:             # <<<<<<<<<<<<<<
+ *                 lats = lats + (_dg2rad*plat2,)
+ *                 lons = lons + (_dg2rad*plon2,)
+ */
       goto __pyx_L6;
     }
-    /*else*/ {
 
-      /* "_proj.pyx":521
+    /* "_proj.pyx":541
  *                 lons = lons + (_dg2rad*plon2,)
  *             else:
  *                 lats = lats + (plat2,)             # <<<<<<<<<<<<<<
  *                 lons = lons + (plon2,)
  *         return lons, lats
  */
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_plat2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    /*else*/ {
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_plat2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_lats), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 521; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_v_lats));
-      __pyx_v_lats = ((PyObject*)__pyx_t_3);
+      __pyx_t_3 = PyNumber_Add(__pyx_v_lats, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 541; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF_SET(__pyx_v_lats, __pyx_t_3);
       __pyx_t_3 = 0;
 
-      /* "_proj.pyx":522
+      /* "_proj.pyx":542
  *             else:
  *                 lats = lats + (plat2,)
  *                 lons = lons + (plon2,)             # <<<<<<<<<<<<<<
  *         return lons, lats
  */
-      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_plon2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_3 = PyFloat_FromDouble(__pyx_v_plon2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_3);
-      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
       __Pyx_GOTREF(__pyx_t_4);
-      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __Pyx_GIVEREF(__pyx_t_3);
+      PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3);
       __pyx_t_3 = 0;
-      __pyx_t_3 = PyNumber_Add(((PyObject *)__pyx_v_lons), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 522; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-      __Pyx_GOTREF(((PyObject *)__pyx_t_3));
-      __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0;
-      __Pyx_DECREF(((PyObject *)__pyx_v_lons));
-      __pyx_v_lons = ((PyObject*)__pyx_t_3);
+      __pyx_t_3 = PyNumber_Add(__pyx_v_lons, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 542; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+      __Pyx_GOTREF(__pyx_t_3);
+      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
+      __Pyx_DECREF_SET(__pyx_v_lons, __pyx_t_3);
       __pyx_t_3 = 0;
     }
     __pyx_L6:;
   }
 
-  /* "_proj.pyx":523
+  /* "_proj.pyx":543
  *                 lats = lats + (plat2,)
  *                 lons = lons + (plon2,)
  *         return lons, lats             # <<<<<<<<<<<<<<
  */
   __Pyx_XDECREF(__pyx_r);
-  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 523; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 543; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_INCREF(((PyObject *)__pyx_v_lons));
-  PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_lons));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_lons));
-  __Pyx_INCREF(((PyObject *)__pyx_v_lats));
-  PyTuple_SET_ITEM(__pyx_t_3, 1, ((PyObject *)__pyx_v_lats));
-  __Pyx_GIVEREF(((PyObject *)__pyx_v_lats));
-  __pyx_r = ((PyObject *)__pyx_t_3);
+  __Pyx_INCREF(__pyx_v_lons);
+  __Pyx_GIVEREF(__pyx_v_lons);
+  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_lons);
+  __Pyx_INCREF(__pyx_v_lats);
+  __Pyx_GIVEREF(__pyx_v_lats);
+  PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_lats);
+  __pyx_r = __pyx_t_3;
   __pyx_t_3 = 0;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
-  goto __pyx_L0;
+  /* "_proj.pyx":514
+ *             azdata[i] = ps12
+ * 
+ *     def _npts(self, double lon1, double lat1, double lon2, double lat2, int npts, radians=False):             # <<<<<<<<<<<<<<
+ *         """
+ *  given initial and terminus lat/lon, find npts intermediate points."""
+ */
+
+  /* function exit code */
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_3);
   __Pyx_XDECREF(__pyx_t_4);
@@ -5348,6 +5972,14 @@ static PyObject *__pyx_pf_5_proj_4Geod_8_npts(struct __pyx_obj_5_proj_Geod *__py
   return __pyx_r;
 }
 
+/* "_proj.pyx":376
+ * cdef class Geod:
+ *     cdef geod_geodesic _geod_geodesic
+ *     cdef public object initstring             # <<<<<<<<<<<<<<
+ * 
+ *     def __cinit__(self, a, f):
+ */
+
 /* Python wrapper */
 static PyObject *__pyx_pw_5_proj_4Geod_10initstring_1__get__(PyObject *__pyx_v_self); /*proto*/
 static PyObject *__pyx_pw_5_proj_4Geod_10initstring_1__get__(PyObject *__pyx_v_self) {
@@ -5355,18 +5987,12 @@ static PyObject *__pyx_pw_5_proj_4Geod_10initstring_1__get__(PyObject *__pyx_v_s
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__get__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Geod_10initstring___get__(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
 
-/* "_proj.pyx":368
- * cdef class Geod:
- *     cdef geod_geodesic _geod_geodesic
- *     cdef public object initstring             # <<<<<<<<<<<<<<
- * 
- *     def __cinit__(self, a, f):
- */
-
 static PyObject *__pyx_pf_5_proj_4Geod_10initstring___get__(struct __pyx_obj_5_proj_Geod *__pyx_v_self) {
   PyObject *__pyx_r = NULL;
   __Pyx_RefNannyDeclarations
@@ -5376,7 +6002,7 @@ static PyObject *__pyx_pf_5_proj_4Geod_10initstring___get__(struct __pyx_obj_5_p
   __pyx_r = __pyx_v_self->initstring;
   goto __pyx_L0;
 
-  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
+  /* function exit code */
   __pyx_L0:;
   __Pyx_XGIVEREF(__pyx_r);
   __Pyx_RefNannyFinishContext();
@@ -5390,6 +6016,8 @@ static int __pyx_pw_5_proj_4Geod_10initstring_3__set__(PyObject *__pyx_v_self, P
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__set__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Geod_10initstring_2__set__(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self), ((PyObject *)__pyx_v_value));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -5404,6 +6032,7 @@ static int __pyx_pf_5_proj_4Geod_10initstring_2__set__(struct __pyx_obj_5_proj_G
   __Pyx_DECREF(__pyx_v_self->initstring);
   __pyx_v_self->initstring = __pyx_v_value;
 
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -5416,6 +6045,8 @@ static int __pyx_pw_5_proj_4Geod_10initstring_5__del__(PyObject *__pyx_v_self) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__del__ (wrapper)", 0);
   __pyx_r = __pyx_pf_5_proj_4Geod_10initstring_4__del__(((struct __pyx_obj_5_proj_Geod *)__pyx_v_self));
+
+  /* function exit code */
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
 }
@@ -5430,6 +6061,7 @@ static int __pyx_pf_5_proj_4Geod_10initstring_4__del__(struct __pyx_obj_5_proj_G
   __Pyx_DECREF(__pyx_v_self->initstring);
   __pyx_v_self->initstring = Py_None;
 
+  /* function exit code */
   __pyx_r = 0;
   __Pyx_RefNannyFinishContext();
   return __pyx_r;
@@ -5438,7 +6070,11 @@ static int __pyx_pf_5_proj_4Geod_10initstring_4__del__(struct __pyx_obj_5_proj_G
 static PyObject *__pyx_tp_new_5_proj_Proj(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_5_proj_Proj *p;
   PyObject *o;
-  o = (*t->tp_alloc)(t, 0);
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
   if (unlikely(!o)) return 0;
   p = ((struct __pyx_obj_5_proj_Proj *)o);
   p->proj_version = Py_None; Py_INCREF(Py_None);
@@ -5451,13 +6087,17 @@ static PyObject *__pyx_tp_new_5_proj_Proj(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_5_proj_Proj(PyObject *o) {
   struct __pyx_obj_5_proj_Proj *p = (struct __pyx_obj_5_proj_Proj *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
   PyObject_GC_UnTrack(o);
   {
     PyObject *etype, *eval, *etb;
     PyErr_Fetch(&etype, &eval, &etb);
     ++Py_REFCNT(o);
     __pyx_pw_5_proj_4Proj_3__dealloc__(o);
-    if (PyErr_Occurred()) PyErr_WriteUnraisable(o);
     --Py_REFCNT(o);
     PyErr_Restore(etype, eval, etb);
   }
@@ -5479,8 +6119,8 @@ static int __pyx_tp_traverse_5_proj_Proj(PyObject *o, visitproc v, void *a) {
 }
 
 static int __pyx_tp_clear_5_proj_Proj(PyObject *o) {
-  struct __pyx_obj_5_proj_Proj *p = (struct __pyx_obj_5_proj_Proj *)o;
   PyObject* tmp;
+  struct __pyx_obj_5_proj_Proj *p = (struct __pyx_obj_5_proj_Proj *)o;
   tmp = ((PyObject*)p->proj_version);
   p->proj_version = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -5517,12 +6157,12 @@ static int __pyx_setprop_5_proj_4Proj_srs(PyObject *o, PyObject *v, CYTHON_UNUSE
 }
 
 static PyMethodDef __pyx_methods_5_proj_Proj[] = {
-  {__Pyx_NAMESTR("to_latlong"), (PyCFunction)__pyx_pw_5_proj_4Proj_5to_latlong, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Proj_4to_latlong)},
-  {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_5_proj_4Proj_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Proj_6__reduce__)},
-  {__Pyx_NAMESTR("_fwd"), (PyCFunction)__pyx_pw_5_proj_4Proj_9_fwd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Proj_8_fwd)},
-  {__Pyx_NAMESTR("_inv"), (PyCFunction)__pyx_pw_5_proj_4Proj_11_inv, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Proj_10_inv)},
-  {__Pyx_NAMESTR("is_latlong"), (PyCFunction)__pyx_pw_5_proj_4Proj_13is_latlong, METH_NOARGS, __Pyx_DOCSTR(0)},
-  {__Pyx_NAMESTR("is_geocent"), (PyCFunction)__pyx_pw_5_proj_4Proj_15is_geocent, METH_NOARGS, __Pyx_DOCSTR(0)},
+  {"to_latlong", (PyCFunction)__pyx_pw_5_proj_4Proj_5to_latlong, METH_NOARGS, __pyx_doc_5_proj_4Proj_4to_latlong},
+  {"__reduce__", (PyCFunction)__pyx_pw_5_proj_4Proj_7__reduce__, METH_NOARGS, __pyx_doc_5_proj_4Proj_6__reduce__},
+  {"_fwd", (PyCFunction)__pyx_pw_5_proj_4Proj_9_fwd, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5_proj_4Proj_8_fwd},
+  {"_inv", (PyCFunction)__pyx_pw_5_proj_4Proj_11_inv, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5_proj_4Proj_10_inv},
+  {"is_latlong", (PyCFunction)__pyx_pw_5_proj_4Proj_13is_latlong, METH_NOARGS, 0},
+  {"is_geocent", (PyCFunction)__pyx_pw_5_proj_4Proj_15is_geocent, METH_NOARGS, 0},
   {0, 0, 0, 0}
 };
 
@@ -5534,7 +6174,7 @@ static struct PyGetSetDef __pyx_getsets_5_proj_Proj[] = {
 
 static PyTypeObject __pyx_type_5_proj_Proj = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_proj.Proj"), /*tp_name*/
+  "_proj.Proj", /*tp_name*/
   sizeof(struct __pyx_obj_5_proj_Proj), /*tp_basicsize*/
   0, /*tp_itemsize*/
   __pyx_tp_dealloc_5_proj_Proj, /*tp_dealloc*/
@@ -5543,8 +6183,9 @@ static PyTypeObject __pyx_type_5_proj_Proj = {
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
-  #else
-  0, /*reserved*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
   #endif
   0, /*tp_repr*/
   0, /*tp_as_number*/
@@ -5583,15 +6224,20 @@ static PyTypeObject __pyx_type_5_proj_Proj = {
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
   0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
   0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
   #endif
 };
 
 static PyObject *__pyx_tp_new_5_proj_Geod(PyTypeObject *t, PyObject *a, PyObject *k) {
   struct __pyx_obj_5_proj_Geod *p;
   PyObject *o;
-  o = (*t->tp_alloc)(t, 0);
+  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
+    o = (*t->tp_alloc)(t, 0);
+  } else {
+    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
+  }
   if (unlikely(!o)) return 0;
   p = ((struct __pyx_obj_5_proj_Geod *)o);
   p->initstring = Py_None; Py_INCREF(Py_None);
@@ -5603,6 +6249,11 @@ static PyObject *__pyx_tp_new_5_proj_Geod(PyTypeObject *t, PyObject *a, PyObject
 
 static void __pyx_tp_dealloc_5_proj_Geod(PyObject *o) {
   struct __pyx_obj_5_proj_Geod *p = (struct __pyx_obj_5_proj_Geod *)o;
+  #if PY_VERSION_HEX >= 0x030400a1
+  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
+    if (PyObject_CallFinalizerFromDealloc(o)) return;
+  }
+  #endif
   PyObject_GC_UnTrack(o);
   Py_CLEAR(p->initstring);
   (*Py_TYPE(o)->tp_free)(o);
@@ -5618,8 +6269,8 @@ static int __pyx_tp_traverse_5_proj_Geod(PyObject *o, visitproc v, void *a) {
 }
 
 static int __pyx_tp_clear_5_proj_Geod(PyObject *o) {
-  struct __pyx_obj_5_proj_Geod *p = (struct __pyx_obj_5_proj_Geod *)o;
   PyObject* tmp;
+  struct __pyx_obj_5_proj_Geod *p = (struct __pyx_obj_5_proj_Geod *)o;
   tmp = ((PyObject*)p->initstring);
   p->initstring = Py_None; Py_INCREF(Py_None);
   Py_XDECREF(tmp);
@@ -5640,10 +6291,10 @@ static int __pyx_setprop_5_proj_4Geod_initstring(PyObject *o, PyObject *v, CYTHO
 }
 
 static PyMethodDef __pyx_methods_5_proj_Geod[] = {
-  {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_5_proj_4Geod_3__reduce__, METH_NOARGS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Geod_2__reduce__)},
-  {__Pyx_NAMESTR("_fwd"), (PyCFunction)__pyx_pw_5_proj_4Geod_5_fwd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Geod_4_fwd)},
-  {__Pyx_NAMESTR("_inv"), (PyCFunction)__pyx_pw_5_proj_4Geod_7_inv, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Geod_6_inv)},
-  {__Pyx_NAMESTR("_npts"), (PyCFunction)__pyx_pw_5_proj_4Geod_9_npts, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_5_proj_4Geod_8_npts)},
+  {"__reduce__", (PyCFunction)__pyx_pw_5_proj_4Geod_3__reduce__, METH_NOARGS, __pyx_doc_5_proj_4Geod_2__reduce__},
+  {"_fwd", (PyCFunction)__pyx_pw_5_proj_4Geod_5_fwd, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5_proj_4Geod_4_fwd},
+  {"_inv", (PyCFunction)__pyx_pw_5_proj_4Geod_7_inv, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5_proj_4Geod_6_inv},
+  {"_npts", (PyCFunction)__pyx_pw_5_proj_4Geod_9_npts, METH_VARARGS|METH_KEYWORDS, __pyx_doc_5_proj_4Geod_8_npts},
   {0, 0, 0, 0}
 };
 
@@ -5654,7 +6305,7 @@ static struct PyGetSetDef __pyx_getsets_5_proj_Geod[] = {
 
 static PyTypeObject __pyx_type_5_proj_Geod = {
   PyVarObject_HEAD_INIT(0, 0)
-  __Pyx_NAMESTR("_proj.Geod"), /*tp_name*/
+  "_proj.Geod", /*tp_name*/
   sizeof(struct __pyx_obj_5_proj_Geod), /*tp_basicsize*/
   0, /*tp_itemsize*/
   __pyx_tp_dealloc_5_proj_Geod, /*tp_dealloc*/
@@ -5663,8 +6314,9 @@ static PyTypeObject __pyx_type_5_proj_Geod = {
   0, /*tp_setattr*/
   #if PY_MAJOR_VERSION < 3
   0, /*tp_compare*/
-  #else
-  0, /*reserved*/
+  #endif
+  #if PY_MAJOR_VERSION >= 3
+  0, /*tp_as_async*/
   #endif
   0, /*tp_repr*/
   0, /*tp_as_number*/
@@ -5703,8 +6355,9 @@ static PyTypeObject __pyx_type_5_proj_Geod = {
   0, /*tp_subclasses*/
   0, /*tp_weaklist*/
   0, /*tp_del*/
-  #if PY_VERSION_HEX >= 0x02060000
   0, /*tp_version_tag*/
+  #if PY_VERSION_HEX >= 0x030400a1
+  0, /*tp_finalize*/
   #endif
 };
 
@@ -5719,7 +6372,7 @@ static struct PyModuleDef __pyx_moduledef = {
   #else
     PyModuleDef_HEAD_INIT,
   #endif
-    __Pyx_NAMESTR("_proj"),
+    "_proj",
     0, /* m_doc */
     -1, /* m_size */
     __pyx_methods /* m_methods */,
@@ -5731,76 +6384,76 @@ static struct PyModuleDef __pyx_moduledef = {
 #endif
 
 static __Pyx_StringTabEntry __pyx_string_tab[] = {
-  {&__pyx_kp_s_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 0, 1, 0},
-  {&__pyx_kp_s_17, __pyx_k_17, sizeof(__pyx_k_17), 0, 0, 1, 0},
-  {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0},
-  {&__pyx_kp_s_26, __pyx_k_26, sizeof(__pyx_k_26), 0, 0, 1, 0},
-  {&__pyx_kp_s_29, __pyx_k_29, sizeof(__pyx_k_29), 0, 0, 1, 0},
-  {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0},
-  {&__pyx_kp_s_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 0, 1, 0},
-  {&__pyx_n_s__AttributeError, __pyx_k__AttributeError, sizeof(__pyx_k__AttributeError), 0, 0, 1, 1},
-  {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1},
-  {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1},
-  {&__pyx_n_s____class__, __pyx_k____class__, sizeof(__pyx_k____class__), 0, 0, 1, 1},
-  {&__pyx_n_s____import__, __pyx_k____import__, sizeof(__pyx_k____import__), 0, 0, 1, 1},
-  {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1},
-  {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1},
-  {&__pyx_n_s____version__, __pyx_k____version__, sizeof(__pyx_k____version__), 0, 0, 1, 1},
-  {&__pyx_n_s___createproj, __pyx_k___createproj, sizeof(__pyx_k___createproj), 0, 0, 1, 1},
-  {&__pyx_n_s___doublesize, __pyx_k___doublesize, sizeof(__pyx_k___doublesize), 0, 0, 1, 1},
-  {&__pyx_n_s___proj, __pyx_k___proj, sizeof(__pyx_k___proj), 0, 0, 1, 1},
-  {&__pyx_n_s___transform, __pyx_k___transform, sizeof(__pyx_k___transform), 0, 0, 1, 1},
-  {&__pyx_n_s__a, __pyx_k__a, sizeof(__pyx_k__a), 0, 0, 1, 1},
-  {&__pyx_n_s__ascii, __pyx_k__ascii, sizeof(__pyx_k__ascii), 0, 0, 1, 1},
-  {&__pyx_n_s__az, __pyx_k__az, sizeof(__pyx_k__az), 0, 0, 1, 1},
-  {&__pyx_n_s__buflenx, __pyx_k__buflenx, sizeof(__pyx_k__buflenx), 0, 0, 1, 1},
-  {&__pyx_n_s__bufleny, __pyx_k__bufleny, sizeof(__pyx_k__bufleny), 0, 0, 1, 1},
-  {&__pyx_n_s__buflenz, __pyx_k__buflenz, sizeof(__pyx_k__buflenz), 0, 0, 1, 1},
-  {&__pyx_n_s__bytestr, __pyx_k__bytestr, sizeof(__pyx_k__bytestr), 0, 0, 1, 1},
-  {&__pyx_n_s__datapath, __pyx_k__datapath, sizeof(__pyx_k__datapath), 0, 0, 1, 1},
-  {&__pyx_n_s__degrees, __pyx_k__degrees, sizeof(__pyx_k__degrees), 0, 0, 1, 1},
-  {&__pyx_n_s__dist, __pyx_k__dist, sizeof(__pyx_k__dist), 0, 0, 1, 1},
-  {&__pyx_n_s__encode, __pyx_k__encode, sizeof(__pyx_k__encode), 0, 0, 1, 1},
-  {&__pyx_n_s__err, __pyx_k__err, sizeof(__pyx_k__err), 0, 0, 1, 1},
-  {&__pyx_n_s__errcheck, __pyx_k__errcheck, sizeof(__pyx_k__errcheck), 0, 0, 1, 1},
-  {&__pyx_n_s__f, __pyx_k__f, sizeof(__pyx_k__f), 0, 0, 1, 1},
-  {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1},
-  {&__pyx_n_s__inx, __pyx_k__inx, sizeof(__pyx_k__inx), 0, 0, 1, 1},
-  {&__pyx_n_s__iny, __pyx_k__iny, sizeof(__pyx_k__iny), 0, 0, 1, 1},
-  {&__pyx_n_s__inz, __pyx_k__inz, sizeof(__pyx_k__inz), 0, 0, 1, 1},
-  {&__pyx_n_s__is_latlong, __pyx_k__is_latlong, sizeof(__pyx_k__is_latlong), 0, 0, 1, 1},
-  {&__pyx_n_s__lat1, __pyx_k__lat1, sizeof(__pyx_k__lat1), 0, 0, 1, 1},
-  {&__pyx_n_s__lat2, __pyx_k__lat2, sizeof(__pyx_k__lat2), 0, 0, 1, 1},
-  {&__pyx_n_s__lats, __pyx_k__lats, sizeof(__pyx_k__lats), 0, 0, 1, 1},
-  {&__pyx_n_s__lats1, __pyx_k__lats1, sizeof(__pyx_k__lats1), 0, 0, 1, 1},
-  {&__pyx_n_s__lats2, __pyx_k__lats2, sizeof(__pyx_k__lats2), 0, 0, 1, 1},
-  {&__pyx_n_s__lon1, __pyx_k__lon1, sizeof(__pyx_k__lon1), 0, 0, 1, 1},
-  {&__pyx_n_s__lon2, __pyx_k__lon2, sizeof(__pyx_k__lon2), 0, 0, 1, 1},
-  {&__pyx_n_s__lons, __pyx_k__lons, sizeof(__pyx_k__lons), 0, 0, 1, 1},
-  {&__pyx_n_s__lons1, __pyx_k__lons1, sizeof(__pyx_k__lons1), 0, 0, 1, 1},
-  {&__pyx_n_s__lons2, __pyx_k__lons2, sizeof(__pyx_k__lons2), 0, 0, 1, 1},
-  {&__pyx_n_s__math, __pyx_k__math, sizeof(__pyx_k__math), 0, 0, 1, 1},
-  {&__pyx_n_s__npts, __pyx_k__npts, sizeof(__pyx_k__npts), 0, 0, 1, 1},
-  {&__pyx_n_s__p1, __pyx_k__p1, sizeof(__pyx_k__p1), 0, 0, 1, 1},
-  {&__pyx_n_s__p2, __pyx_k__p2, sizeof(__pyx_k__p2), 0, 0, 1, 1},
-  {&__pyx_n_s__projstring, __pyx_k__projstring, sizeof(__pyx_k__projstring), 0, 0, 1, 1},
-  {&__pyx_n_s__radians, __pyx_k__radians, sizeof(__pyx_k__radians), 0, 0, 1, 1},
-  {&__pyx_n_s__searchpath, __pyx_k__searchpath, sizeof(__pyx_k__searchpath), 0, 0, 1, 1},
-  {&__pyx_n_s__set_datapath, __pyx_k__set_datapath, sizeof(__pyx_k__set_datapath), 0, 0, 1, 1},
-  {&__pyx_n_s__x, __pyx_k__x, sizeof(__pyx_k__x), 0, 0, 1, 1},
-  {&__pyx_n_s__xdata, __pyx_k__xdata, sizeof(__pyx_k__xdata), 0, 0, 1, 1},
-  {&__pyx_n_s__xx, __pyx_k__xx, sizeof(__pyx_k__xx), 0, 0, 1, 1},
-  {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1},
-  {&__pyx_n_s__ydata, __pyx_k__ydata, sizeof(__pyx_k__ydata), 0, 0, 1, 1},
-  {&__pyx_n_s__yy, __pyx_k__yy, sizeof(__pyx_k__yy), 0, 0, 1, 1},
-  {&__pyx_n_s__zdata, __pyx_k__zdata, sizeof(__pyx_k__zdata), 0, 0, 1, 1},
-  {&__pyx_n_s__zz, __pyx_k__zz, sizeof(__pyx_k__zz), 0, 0, 1, 1},
+  {&__pyx_kp_s_1_9_5, __pyx_k_1_9_5, sizeof(__pyx_k_1_9_5), 0, 0, 1, 0},
+  {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1},
+  {&__pyx_kp_s_Buffer_lengths_not_the_same, __pyx_k_Buffer_lengths_not_the_same, sizeof(__pyx_k_Buffer_lengths_not_the_same), 0, 0, 1, 0},
+  {&__pyx_n_s_RuntimeError, __pyx_k_RuntimeError, sizeof(__pyx_k_RuntimeError), 0, 0, 1, 1},
+  {&__pyx_kp_s_Users_jsw_python_pyproj_git__pr, __pyx_k_Users_jsw_python_pyproj_git__pr, sizeof(__pyx_k_Users_jsw_python_pyproj_git__pr), 0, 0, 1, 0},
+  {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
+  {&__pyx_n_s_a, __pyx_k_a, sizeof(__pyx_k_a), 0, 0, 1, 1},
+  {&__pyx_kp_s_a_s_f_s, __pyx_k_a_s_f_s, sizeof(__pyx_k_a_s_f_s), 0, 0, 1, 0},
+  {&__pyx_n_s_ascii, __pyx_k_ascii, sizeof(__pyx_k_ascii), 0, 0, 1, 1},
+  {&__pyx_n_s_az, __pyx_k_az, sizeof(__pyx_k_az), 0, 0, 1, 1},
+  {&__pyx_n_s_buflenx, __pyx_k_buflenx, sizeof(__pyx_k_buflenx), 0, 0, 1, 1},
+  {&__pyx_n_s_bufleny, __pyx_k_bufleny, sizeof(__pyx_k_bufleny), 0, 0, 1, 1},
+  {&__pyx_n_s_buflenz, __pyx_k_buflenz, sizeof(__pyx_k_buflenz), 0, 0, 1, 1},
+  {&__pyx_n_s_bytestr, __pyx_k_bytestr, sizeof(__pyx_k_bytestr), 0, 0, 1, 1},
+  {&__pyx_n_s_class, __pyx_k_class, sizeof(__pyx_k_class), 0, 0, 1, 1},
+  {&__pyx_n_s_createproj, __pyx_k_createproj, sizeof(__pyx_k_createproj), 0, 0, 1, 1},
+  {&__pyx_n_s_datapath, __pyx_k_datapath, sizeof(__pyx_k_datapath), 0, 0, 1, 1},
+  {&__pyx_n_s_degrees, __pyx_k_degrees, sizeof(__pyx_k_degrees), 0, 0, 1, 1},
+  {&__pyx_n_s_dist, __pyx_k_dist, sizeof(__pyx_k_dist), 0, 0, 1, 1},
+  {&__pyx_n_s_doublesize, __pyx_k_doublesize, sizeof(__pyx_k_doublesize), 0, 0, 1, 1},
+  {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1},
+  {&__pyx_n_s_err, __pyx_k_err, sizeof(__pyx_k_err), 0, 0, 1, 1},
+  {&__pyx_n_s_errcheck, __pyx_k_errcheck, sizeof(__pyx_k_errcheck), 0, 0, 1, 1},
+  {&__pyx_n_s_f, __pyx_k_f, sizeof(__pyx_k_f), 0, 0, 1, 1},
+  {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1},
+  {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
+  {&__pyx_n_s_inx, __pyx_k_inx, sizeof(__pyx_k_inx), 0, 0, 1, 1},
+  {&__pyx_n_s_iny, __pyx_k_iny, sizeof(__pyx_k_iny), 0, 0, 1, 1},
+  {&__pyx_n_s_inz, __pyx_k_inz, sizeof(__pyx_k_inz), 0, 0, 1, 1},
+  {&__pyx_n_s_is_latlong, __pyx_k_is_latlong, sizeof(__pyx_k_is_latlong), 0, 0, 1, 1},
+  {&__pyx_n_s_lat1, __pyx_k_lat1, sizeof(__pyx_k_lat1), 0, 0, 1, 1},
+  {&__pyx_n_s_lat2, __pyx_k_lat2, sizeof(__pyx_k_lat2), 0, 0, 1, 1},
+  {&__pyx_n_s_lats, __pyx_k_lats, sizeof(__pyx_k_lats), 0, 0, 1, 1},
+  {&__pyx_n_s_lats1, __pyx_k_lats1, sizeof(__pyx_k_lats1), 0, 0, 1, 1},
+  {&__pyx_n_s_lats2, __pyx_k_lats2, sizeof(__pyx_k_lats2), 0, 0, 1, 1},
+  {&__pyx_n_s_lon1, __pyx_k_lon1, sizeof(__pyx_k_lon1), 0, 0, 1, 1},
+  {&__pyx_n_s_lon2, __pyx_k_lon2, sizeof(__pyx_k_lon2), 0, 0, 1, 1},
+  {&__pyx_n_s_lons, __pyx_k_lons, sizeof(__pyx_k_lons), 0, 0, 1, 1},
+  {&__pyx_n_s_lons1, __pyx_k_lons1, sizeof(__pyx_k_lons1), 0, 0, 1, 1},
+  {&__pyx_n_s_lons2, __pyx_k_lons2, sizeof(__pyx_k_lons2), 0, 0, 1, 1},
+  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
+  {&__pyx_n_s_math, __pyx_k_math, sizeof(__pyx_k_math), 0, 0, 1, 1},
+  {&__pyx_n_s_npts, __pyx_k_npts, sizeof(__pyx_k_npts), 0, 0, 1, 1},
+  {&__pyx_n_s_p1, __pyx_k_p1, sizeof(__pyx_k_p1), 0, 0, 1, 1},
+  {&__pyx_n_s_p2, __pyx_k_p2, sizeof(__pyx_k_p2), 0, 0, 1, 1},
+  {&__pyx_n_s_proj, __pyx_k_proj, sizeof(__pyx_k_proj), 0, 0, 1, 1},
+  {&__pyx_kp_s_projection_undefined, __pyx_k_projection_undefined, sizeof(__pyx_k_projection_undefined), 0, 0, 1, 0},
+  {&__pyx_n_s_projstring, __pyx_k_projstring, sizeof(__pyx_k_projstring), 0, 0, 1, 1},
+  {&__pyx_n_s_radians, __pyx_k_radians, sizeof(__pyx_k_radians), 0, 0, 1, 1},
+  {&__pyx_n_s_searchpath, __pyx_k_searchpath, sizeof(__pyx_k_searchpath), 0, 0, 1, 1},
+  {&__pyx_n_s_set_datapath, __pyx_k_set_datapath, sizeof(__pyx_k_set_datapath), 0, 0, 1, 1},
+  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
+  {&__pyx_n_s_transform, __pyx_k_transform, sizeof(__pyx_k_transform), 0, 0, 1, 1},
+  {&__pyx_kp_s_undefined_inverse_geodesic_may_b, __pyx_k_undefined_inverse_geodesic_may_b, sizeof(__pyx_k_undefined_inverse_geodesic_may_b), 0, 0, 1, 0},
+  {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1},
+  {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1},
+  {&__pyx_kp_s_x_y_and_z_must_be_same_size, __pyx_k_x_y_and_z_must_be_same_size, sizeof(__pyx_k_x_y_and_z_must_be_same_size), 0, 0, 1, 0},
+  {&__pyx_n_s_xdata, __pyx_k_xdata, sizeof(__pyx_k_xdata), 0, 0, 1, 1},
+  {&__pyx_n_s_xx, __pyx_k_xx, sizeof(__pyx_k_xx), 0, 0, 1, 1},
+  {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1},
+  {&__pyx_n_s_ydata, __pyx_k_ydata, sizeof(__pyx_k_ydata), 0, 0, 1, 1},
+  {&__pyx_n_s_yy, __pyx_k_yy, sizeof(__pyx_k_yy), 0, 0, 1, 1},
+  {&__pyx_n_s_zdata, __pyx_k_zdata, sizeof(__pyx_k_zdata), 0, 0, 1, 1},
+  {&__pyx_n_s_zz, __pyx_k_zz, sizeof(__pyx_k_zz), 0, 0, 1, 1},
   {0, 0, 0, 0, 0, 0, 0}
 };
 static int __Pyx_InitCachedBuiltins(void) {
-  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s__AttributeError); if (!__pyx_builtin_AttributeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 363; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_RuntimeError = __Pyx_GetBuiltinName(__pyx_n_s_RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 371; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -5810,148 +6463,170 @@ static int __Pyx_InitCachedConstants(void) {
   __Pyx_RefNannyDeclarations
   __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);
 
-  /* "_proj.pyx":126
+  /* "_proj.pyx":128
  *         # process data in buffer
  *         if buflenx != bufleny:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenx//_doublesize
  *         lonsdata = <double *>londata
  */
-  __pyx_k_tuple_4 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_3)); if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_4);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_4));
+  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Buffer_lengths_not_the_same); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple_);
+  __Pyx_GIVEREF(__pyx_tuple_);
 
-  /* "_proj.pyx":135
+  /* "_proj.pyx":137
  *                 lonsdata[i]=1.e30; latsdata[i]=1.e30
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 continue
  *             if radians:
  */
-  __pyx_k_tuple_6 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_5)); if (unlikely(!__pyx_k_tuple_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_6);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_6));
+  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_projection_undefined); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__2);
+  __Pyx_GIVEREF(__pyx_tuple__2);
 
-  /* "_proj.pyx":154
+  /* "_proj.pyx":156
  *                projxyout.u != projxyout.u:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 lonsdata[i] = 1.e30
  *             else:
  */
-  __pyx_k_tuple_7 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_5)); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_7);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_7));
+  __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_s_projection_undefined); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__3);
+  __Pyx_GIVEREF(__pyx_tuple__3);
 
-  /* "_proj.pyx":161
+  /* "_proj.pyx":163
  *                projxyout.u != projxyout.u:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 latsdata[i] = 1.e30
  *             else:
  */
-  __pyx_k_tuple_8 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_5)); if (unlikely(!__pyx_k_tuple_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_8);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_8));
+  __pyx_tuple__4 = PyTuple_Pack(1, __pyx_kp_s_projection_undefined); if (unlikely(!__pyx_tuple__4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__4);
+  __Pyx_GIVEREF(__pyx_tuple__4);
 
-  /* "_proj.pyx":187
+  /* "_proj.pyx":191
  *         # (for numpy/regular python arrays).
  *         if buflenx != bufleny:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenx//_doublesize
  *         xdatab = <double *>xdata
  */
-  __pyx_k_tuple_11 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_3)); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_11);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11));
+  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_Buffer_lengths_not_the_same); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__5);
+  __Pyx_GIVEREF(__pyx_tuple__5);
 
-  /* "_proj.pyx":196
+  /* "_proj.pyx":200
  *                 xdatab[i]=1.e30; ydatab[i]=1.e30
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 continue
  *             projxyin.u = xdatab[i]
  */
-  __pyx_k_tuple_12 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_5)); if (unlikely(!__pyx_k_tuple_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_12);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_12));
+  __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_projection_undefined); if (unlikely(!__pyx_tuple__6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__6);
+  __Pyx_GIVEREF(__pyx_tuple__6);
 
-  /* "_proj.pyx":211
+  /* "_proj.pyx":215
  *                projlonlatout.u != projlonlatout.u:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 xdatab[i] = 1.e30
  *             elif radians:
  */
-  __pyx_k_tuple_13 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_5)); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_13);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_13));
+  __pyx_tuple__7 = PyTuple_Pack(1, __pyx_kp_s_projection_undefined); if (unlikely(!__pyx_tuple__7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__7);
+  __Pyx_GIVEREF(__pyx_tuple__7);
 
-  /* "_proj.pyx":220
+  /* "_proj.pyx":224
  *                projlonlatout.v != projlonlatout.v:
  *                 if errcheck:
  *                     raise RuntimeError('projection undefined')             # <<<<<<<<<<<<<<
  *                 ydatab[i] = 1.e30
  *             elif radians:
  */
-  __pyx_k_tuple_14 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_5)); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_14);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14));
+  __pyx_tuple__8 = PyTuple_Pack(1, __pyx_kp_s_projection_undefined); if (unlikely(!__pyx_tuple__8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 224; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__8);
+  __Pyx_GIVEREF(__pyx_tuple__8);
 
-  /* "_proj.pyx":338
+  /* "_proj.pyx":346
  *         buflenz = bufleny
  *     if not (buflenx == bufleny == buflenz):
  *         raise RuntimeError('x,y and z must be same size')             # <<<<<<<<<<<<<<
  *     xx = <double *>xdata
  *     yy = <double *>ydata
  */
-  __pyx_k_tuple_16 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_15)); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_16);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16));
+  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_x_y_and_z_must_be_same_size); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 346; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__9);
+  __Pyx_GIVEREF(__pyx_tuple__9);
 
-  /* "_proj.pyx":400
+  /* "_proj.pyx":414
  *         # process data in buffer
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata
  */
-  __pyx_k_tuple_19 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_3)); if (unlikely(!__pyx_k_tuple_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 400; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_19);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_19));
+  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_Buffer_lengths_not_the_same); if (unlikely(!__pyx_tuple__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 414; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__10);
+  __Pyx_GIVEREF(__pyx_tuple__10);
 
-  /* "_proj.pyx":427
+  /* "_proj.pyx":441
  *             # check for NaN.
  *             if pazi2 != pazi2:
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')             # <<<<<<<<<<<<<<
  *             if not radians:
  *                 lonsdata[i] = plon2
  */
-  __pyx_k_tuple_21 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_20)); if (unlikely(!__pyx_k_tuple_21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 427; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_21);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_21));
+  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_undefined_inverse_geodesic_may_b); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 441; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__11);
+  __Pyx_GIVEREF(__pyx_tuple__11);
 
-  /* "_proj.pyx":458
+  /* "_proj.pyx":478
  *         # process data in buffer
  *         if not buflenlons == buflenlats == buflenaz == buflend:
  *             raise RuntimeError("Buffer lengths not the same")             # <<<<<<<<<<<<<<
  *         ndim = buflenlons//_doublesize
  *         lonsdata = <double *>londata
  */
-  __pyx_k_tuple_23 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_3)); if (unlikely(!__pyx_k_tuple_23)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 458; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_23);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_23));
+  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_Buffer_lengths_not_the_same); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__12);
+  __Pyx_GIVEREF(__pyx_tuple__12);
 
-  /* "_proj.pyx":485
+  /* "_proj.pyx":505
  *                 pazi2 = pazi2+180.
  *             if ps12 != ps12: # check for NaN
  *                 raise ValueError('undefined inverse geodesic (may be an antipodal point)')             # <<<<<<<<<<<<<<
  *             if radians:
  *                 lonsdata[i] = _rad2dg*pazi1
  */
-  __pyx_k_tuple_24 = PyTuple_Pack(1, ((PyObject *)__pyx_kp_s_20)); if (unlikely(!__pyx_k_tuple_24)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 485; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_24);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_24));
+  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_kp_s_undefined_inverse_geodesic_may_b); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__13);
+  __Pyx_GIVEREF(__pyx_tuple__13);
+
+  /* "_proj.pyx":8
+ * cdef double _dg2rad, _rad2dg
+ * 
+ * _dg2rad = math.radians(1.)             # <<<<<<<<<<<<<<
+ * _rad2dg = math.degrees(1.)
+ * _doublesize = sizeof(double)
+ */
+  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_float_1_); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__14);
+  __Pyx_GIVEREF(__pyx_tuple__14);
+
+  /* "_proj.pyx":9
+ * 
+ * _dg2rad = math.radians(1.)
+ * _rad2dg = math.degrees(1.)             # <<<<<<<<<<<<<<
+ * _doublesize = sizeof(double)
+ * __version__ = "1.9.5"
+ */
+  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_float_1_); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__15);
+  __Pyx_GIVEREF(__pyx_tuple__15);
 
   /* "_proj.pyx":58
  *     int PyObject_AsWriteBuffer(object, void **rbuf, Py_ssize_t *len)
@@ -5960,10 +6635,10 @@ static int __Pyx_InitCachedConstants(void) {
  *     bytestr = _strencode(datapath)
  *     cdef const char *searchpath = bytestr
  */
-  __pyx_k_tuple_27 = PyTuple_Pack(3, ((PyObject *)__pyx_n_s__datapath), ((PyObject *)__pyx_n_s__bytestr), ((PyObject *)__pyx_n_s__searchpath)); if (unlikely(!__pyx_k_tuple_27)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_27);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_27));
-  __pyx_k_codeobj_28 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_27, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_29, __pyx_n_s__set_datapath, 58, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_28)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__16 = PyTuple_Pack(3, __pyx_n_s_datapath, __pyx_n_s_bytestr, __pyx_n_s_searchpath); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__16);
+  __Pyx_GIVEREF(__pyx_tuple__16);
+  __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jsw_python_pyproj_git__pr, __pyx_n_s_set_datapath, 58, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_proj.pyx":63
  *     pj_set_searchpath(1, &searchpath)
@@ -5972,22 +6647,22 @@ static int __Pyx_InitCachedConstants(void) {
  *     return Proj(projstring)
  * 
  */
-  __pyx_k_tuple_30 = PyTuple_Pack(1, ((PyObject *)__pyx_n_s__projstring)); if (unlikely(!__pyx_k_tuple_30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_k_tuple_30);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_30));
-  __pyx_k_codeobj_31 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_29, __pyx_n_s___createproj, 63, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__18 = PyTuple_Pack(1, __pyx_n_s_projstring); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__18);
+  __Pyx_GIVEREF(__pyx_tuple__18);
+  __pyx_codeobj__19 = (PyObject*)__Pyx_PyCode_New(1, 0, 1, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jsw_python_pyproj_git__pr, __pyx_n_s_createproj, 63, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
-  /* "_proj.pyx":322
+  /* "_proj.pyx":326
  *             return False
  * 
  * def _transform(Proj p1, Proj p2, inx, iny, inz, radians):             # <<<<<<<<<<<<<<
  *     # private function to call pj_transform
- *     cdef void *xdata, *ydata, *zdata
+ *     cdef void *xdata
  */
-  __pyx_k_tuple_32 = PyTuple_Pack(18, ((PyObject *)__pyx_n_s__p1), ((PyObject *)__pyx_n_s__p2), ((PyObject *)__pyx_n_s__inx), ((PyObject *)__pyx_n_s__iny), ((PyObject *)__pyx_n_s__inz), ((PyObject *)__pyx_n_s__radians), ((PyObject *)__pyx_n_s__xdata), ((PyObject *)__pyx_n_s__ydata), ((PyObject *)__pyx_n_s__zdata), ((PyObject *)__pyx_n_s__xx), ((PyObject *)__pyx_n_s__yy), ((PyObject *)__pyx_n_s__zz), ((PyObject *)__pyx_n_s__buflenx), ((PyObject *)__pyx_n_s__bufleny), ((PyObject *)__pyx_n_ [...]
-  __Pyx_GOTREF(__pyx_k_tuple_32);
-  __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_32));
-  __pyx_k_codeobj_33 = (PyObject*)__Pyx_PyCode_New(6, 0, 18, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_29, __pyx_n_s___transform, 322, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_tuple__20 = PyTuple_Pack(18, __pyx_n_s_p1, __pyx_n_s_p2, __pyx_n_s_inx, __pyx_n_s_iny, __pyx_n_s_inz, __pyx_n_s_radians, __pyx_n_s_xdata, __pyx_n_s_ydata, __pyx_n_s_zdata, __pyx_n_s_xx, __pyx_n_s_yy, __pyx_n_s_zz, __pyx_n_s_buflenx, __pyx_n_s_bufleny, __pyx_n_s_buflenz, __pyx_n_s_npts, __pyx_n_s_i, __pyx_n_s_err); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_GOTREF(__pyx_tuple__20);
+  __Pyx_GIVEREF(__pyx_tuple__20);
+  __pyx_codeobj__21 = (PyObject*)__Pyx_PyCode_New(6, 0, 18, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__20, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_Users_jsw_python_pyproj_git__pr, __pyx_n_s_transform, 326, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_RefNannyFinishContext();
   return 0;
   __pyx_L1_error:;
@@ -5997,6 +6672,7 @@ static int __Pyx_InitCachedConstants(void) {
 
 static int __Pyx_InitGlobals(void) {
   if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  __pyx_float_1_ = PyFloat_FromDouble(1.); if (unlikely(!__pyx_float_1_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   return 0;
   __pyx_L1_error:;
   return -1;
@@ -6012,8 +6688,7 @@ PyMODINIT_FUNC PyInit__proj(void)
 {
   PyObject *__pyx_t_1 = NULL;
   PyObject *__pyx_t_2 = NULL;
-  PyObject *__pyx_t_3 = NULL;
-  double __pyx_t_4;
+  double __pyx_t_3;
   int __pyx_lineno = 0;
   const char *__pyx_filename = NULL;
   int __pyx_clineno = 0;
@@ -6028,18 +6703,24 @@ PyMODINIT_FUNC PyInit__proj(void)
   }
   #endif
   __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__proj(void)", 0);
-  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #ifdef __Pyx_CyFunction_USED
-  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   #ifdef __Pyx_FusedFunction_USED
   if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
+  #ifdef __Pyx_Coroutine_USED
+  if (__pyx_Coroutine_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   #ifdef __Pyx_Generator_USED
   if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
+  #ifdef __Pyx_StopAsyncIteration_USED
+  if (__pyx_StopAsyncIteration_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
   /*--- Library function declarations ---*/
   /*--- Threads initialization code ---*/
   #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
@@ -6049,52 +6730,57 @@ PyMODINIT_FUNC PyInit__proj(void)
   #endif
   /*--- Module creation code ---*/
   #if PY_MAJOR_VERSION < 3
-  __pyx_m = Py_InitModule4(__Pyx_NAMESTR("_proj"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
+  __pyx_m = Py_InitModule4("_proj", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
   #else
   __pyx_m = PyModule_Create(&__pyx_moduledef);
   #endif
   if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   Py_INCREF(__pyx_d);
-  #if PY_MAJOR_VERSION >= 3
-  {
-    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    if (!PyDict_GetItemString(modules, "_proj")) {
-      if (unlikely(PyDict_SetItemString(modules, "_proj", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-    }
-  }
-  #endif
-  __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #if CYTHON_COMPILING_IN_PYPY
   Py_INCREF(__pyx_b);
   #endif
-  if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
   /*--- Initialize various global constants etc. ---*/
-  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_InitGlobals() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
   if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   #endif
   if (__pyx_module_is_main__proj) {
-    if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
+    if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  }
+  #if PY_MAJOR_VERSION >= 3
+  {
+    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    if (!PyDict_GetItemString(modules, "_proj")) {
+      if (unlikely(PyDict_SetItemString(modules, "_proj", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+    }
   }
+  #endif
   /*--- Builtin init code ---*/
-  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_InitCachedBuiltins() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Constants init code ---*/
-  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (__Pyx_InitCachedConstants() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   /*--- Global init code ---*/
   /*--- Variable export code ---*/
   /*--- Function export code ---*/
   /*--- Type init code ---*/
   if (PyType_Ready(&__pyx_type_5_proj_Proj) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Proj", (PyObject *)&__pyx_type_5_proj_Proj) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5_proj_Proj.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "Proj", (PyObject *)&__pyx_type_5_proj_Proj) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_5_proj_Proj = &__pyx_type_5_proj_Proj;
-  if (PyType_Ready(&__pyx_type_5_proj_Geod) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  if (__Pyx_SetAttrString(__pyx_m, "Geod", (PyObject *)&__pyx_type_5_proj_Geod) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyType_Ready(&__pyx_type_5_proj_Geod) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_type_5_proj_Geod.tp_print = 0;
+  if (PyObject_SetAttrString(__pyx_m, "Geod", (PyObject *)&__pyx_type_5_proj_Geod) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 374; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __pyx_ptype_5_proj_Geod = &__pyx_type_5_proj_Geod;
   /*--- Type import code ---*/
   /*--- Variable import code ---*/
   /*--- Function import code ---*/
   /*--- Execution code ---*/
+  #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED)
+  if (__Pyx_patch_abc() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  #endif
 
   /* "_proj.pyx":4
  * #c_numpy.import_array()
@@ -6103,9 +6789,9 @@ PyMODINIT_FUNC PyInit__proj(void)
  * 
  * cdef double _dg2rad, _rad2dg
  */
-  __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__math), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_Import(__pyx_n_s_math, 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__math, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_math, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 4; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* "_proj.pyx":8
@@ -6115,73 +6801,57 @@ PyMODINIT_FUNC PyInit__proj(void)
  * _rad2dg = math.degrees(1.)
  * _doublesize = sizeof(double)
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s__math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s__radians); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_radians); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyFloat_FromDouble(1.); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
   __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0;
-  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_4 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 8; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_5_proj__dg2rad = __pyx_t_4;
+  __pyx_v_5_proj__dg2rad = __pyx_t_3;
 
   /* "_proj.pyx":9
  * 
  * _dg2rad = math.radians(1.)
  * _rad2dg = math.degrees(1.)             # <<<<<<<<<<<<<<
  * _doublesize = sizeof(double)
- * __version__ = "1.9.4"
+ * __version__ = "1.9.5"
  */
-  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s__math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s__degrees); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_3);
-  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_t_1 = PyFloat_FromDouble(1.); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_degrees); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_2);
-  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
+  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
-  __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0;
-  __pyx_t_4 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_4 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
+  __pyx_t_3 = __pyx_PyFloat_AsDouble(__pyx_t_1); if (unlikely((__pyx_t_3 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
-  __pyx_v_5_proj__rad2dg = __pyx_t_4;
+  __pyx_v_5_proj__rad2dg = __pyx_t_3;
 
   /* "_proj.pyx":10
  * _dg2rad = math.radians(1.)
  * _rad2dg = math.degrees(1.)
  * _doublesize = sizeof(double)             # <<<<<<<<<<<<<<
- * __version__ = "1.9.4"
+ * __version__ = "1.9.5"
  * 
  */
   __pyx_t_1 = __Pyx_PyInt_FromSize_t((sizeof(double))); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s___doublesize, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_doublesize, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 10; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* "_proj.pyx":11
  * _rad2dg = math.degrees(1.)
  * _doublesize = sizeof(double)
- * __version__ = "1.9.4"             # <<<<<<<<<<<<<<
+ * __version__ = "1.9.5"             # <<<<<<<<<<<<<<
  * 
  * cdef extern from "math.h":
  */
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s____version__, ((PyObject *)__pyx_kp_s_26)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_version, __pyx_kp_s_1_9_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
 
   /* "_proj.pyx":58
  *     int PyObject_AsWriteBuffer(object, void **rbuf, Py_ssize_t *len)
@@ -6190,9 +6860,9 @@ PyMODINIT_FUNC PyInit__proj(void)
  *     bytestr = _strencode(datapath)
  *     cdef const char *searchpath = bytestr
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_proj_1set_datapath, NULL, __pyx_n_s___proj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_proj_1set_datapath, NULL, __pyx_n_s_proj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s__set_datapath, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_set_datapath, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 58; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
   /* "_proj.pyx":63
@@ -6202,114 +6872,43 @@ PyMODINIT_FUNC PyInit__proj(void)
  *     return Proj(projstring)
  * 
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_proj_3_createproj, NULL, __pyx_n_s___proj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_proj_3_createproj, NULL, __pyx_n_s_proj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s___createproj, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_createproj, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "_proj.pyx":105
- *         return (self.__class__,(self.srs,))
- * 
- *     def _fwd(self, object lons, object lats, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
- *         """
- *  forward transformation - lons,lats to x,y (done in place).
- */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_1 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_2 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* "_proj.pyx":166
- *                 latsdata[i] = projxyout.v
- * 
- *     def _inv(self, object x, object y, radians=False, errcheck=False):             # <<<<<<<<<<<<<<
- *         """
- *  inverse transformation - x,y to lons,lats (done in place).
- */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_9 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_10 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* "_proj.pyx":322
+  /* "_proj.pyx":326
  *             return False
  * 
  * def _transform(Proj p1, Proj p2, inx, iny, inz, radians):             # <<<<<<<<<<<<<<
  *     # private function to call pj_transform
- *     cdef void *xdata, *ydata, *zdata
+ *     cdef void *xdata
  */
-  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_proj_5_transform, NULL, __pyx_n_s___proj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_5_proj_5_transform, NULL, __pyx_n_s_proj); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s___transform, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 322; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_transform, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 326; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "_proj.pyx":378
- *         return (self.__class__,(self.initstring,))
+  /* "_proj.pyx":1
+ * #cimport c_numpy             # <<<<<<<<<<<<<<
+ * #c_numpy.import_array()
  * 
- *     def _fwd(self, object lons, object lats, object az, object dist, radians=False):             # <<<<<<<<<<<<<<
- *         """
- *  forward transformation - determine longitude, latitude and back azimuth
  */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 378; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
   __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_18 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
+  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
+  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
 
-  /* "_proj.pyx":437
- *                 azdata[i] = _rad2dg*pazi2
- * 
- *     def _inv(self, object lons1, object lats1, object lons2, object lats2, radians=False):             # <<<<<<<<<<<<<<
- *         """
- *  inverse transformation - return forward and back azimuths, plus distance
- */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_22 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
-
-  /* "_proj.pyx":494
- *             azdata[i] = ps12
- * 
- *     def _npts(self, double lon1, double lat1, double lon2, double lat2, int npts, radians=False):             # <<<<<<<<<<<<<<
- *         """
- *  given initial and terminus lat/lon, find npts intermediate points."""
- */
-  __pyx_t_1 = __Pyx_PyBool_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 494; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(__pyx_t_1);
-  __pyx_k_25 = __pyx_t_1;
-  __Pyx_GIVEREF(__pyx_t_1);
-  __pyx_t_1 = 0;
+  /*--- Wrapped vars code ---*/
 
-  /* "_proj.pyx":1
- * #cimport c_numpy             # <<<<<<<<<<<<<<
- * #c_numpy.import_array()
- * 
- */
-  __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_GOTREF(((PyObject *)__pyx_t_1));
-  if (PyDict_SetItem(__pyx_d, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
-  __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0;
   goto __pyx_L0;
   __pyx_L1_error:;
   __Pyx_XDECREF(__pyx_t_1);
   __Pyx_XDECREF(__pyx_t_2);
-  __Pyx_XDECREF(__pyx_t_3);
   if (__pyx_m) {
-    __Pyx_AddTraceback("init _proj", __pyx_clineno, __pyx_lineno, __pyx_filename);
+    if (__pyx_d) {
+      __Pyx_AddTraceback("init _proj", __pyx_clineno, __pyx_lineno, __pyx_filename);
+    }
     Py_DECREF(__pyx_m); __pyx_m = 0;
   } else if (!PyErr_Occurred()) {
     PyErr_SetString(PyExc_ImportError, "init _proj");
@@ -6323,7 +6922,7 @@ PyMODINIT_FUNC PyInit__proj(void)
   #endif
 }
 
-/* Runtime support code */
+/* --- Runtime support code --- */
 #if CYTHON_REFNANNY
 static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
     PyObject *m = NULL, *p = NULL;
@@ -6338,7 +6937,7 @@ end:
     Py_XDECREF(m);
     return (__Pyx_RefNannyAPIStruct *)r;
 }
-#endif /* CYTHON_REFNANNY */
+#endif
 
 static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
     PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
@@ -6347,12 +6946,31 @@ static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
 #if PY_MAJOR_VERSION >= 3
             "name '%U' is not defined", name);
 #else
-            "name '%s' is not defined", PyString_AS_STRING(name));
+            "name '%.200s' is not defined", PyString_AS_STRING(name));
 #endif
     }
     return result;
 }
 
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
+    PyObject *result;
+    ternaryfunc call = func->ob_type->tp_call;
+    if (unlikely(!call))
+        return PyObject_Call(func, arg, kw);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = (*call)(func, arg, kw);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
 static void __Pyx_RaiseDoubleKeywordsError(
     const char* func_name,
     PyObject* kw_name)
@@ -6452,12 +7070,12 @@ arg_passed_twice:
     goto bad;
 invalid_keyword_type:
     PyErr_Format(PyExc_TypeError,
-        "%s() keywords must be strings", function_name);
+        "%.200s() keywords must be strings", function_name);
     goto bad;
 invalid_keyword:
     PyErr_Format(PyExc_TypeError,
     #if PY_MAJOR_VERSION < 3
-        "%s() got an unexpected keyword argument '%s'",
+        "%.200s() got an unexpected keyword argument '%.200s'",
         function_name, PyString_AsString(key));
     #else
         "%s() got an unexpected keyword argument '%U'",
@@ -6487,7 +7105,7 @@ static void __Pyx_RaiseArgtupleInvalid(
         more_or_less = "exactly";
     }
     PyErr_Format(PyExc_TypeError,
-                 "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)",
+                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                  func_name, more_or_less, num_expected,
                  (num_expected == 1) ? "" : "s", num_found);
 }
@@ -6541,11 +7159,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
             goto raise_error;
         }
     }
-    #if PY_VERSION_HEX < 0x02050000
-    if (PyClass_Check(type)) {
-    #else
     if (PyType_Check(type)) {
-    #endif
 #if CYTHON_COMPILING_IN_PYPY
         if (!value) {
             Py_INCREF(Py_None);
@@ -6560,17 +7174,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
             goto raise_error;
         }
         value = type;
-        #if PY_VERSION_HEX < 0x02050000
-        if (PyInstance_Check(type)) {
-            type = (PyObject*) ((PyInstanceObject*)type)->in_class;
-            Py_INCREF(type);
-        } else {
-            type = 0;
-            PyErr_SetString(PyExc_TypeError,
-                "raise: exception must be an old-style class or instance");
-            goto raise_error;
-        }
-        #else
         type = (PyObject*) Py_TYPE(type);
         Py_INCREF(type);
         if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
@@ -6578,7 +7181,6 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                 "raise: exception class must be a subclass of BaseException");
             goto raise_error;
         }
-        #endif
     }
     __Pyx_ErrRestore(type, value, tb);
     return;
@@ -6588,7 +7190,7 @@ raise_error:
     Py_XDECREF(tb);
     return;
 }
-#else /* Python 3+ */
+#else
 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
     PyObject* owned_instance = NULL;
     if (tb == Py_None) {
@@ -6609,27 +7211,43 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         value = type;
         type = (PyObject*) Py_TYPE(value);
     } else if (PyExceptionClass_Check(type)) {
-        PyObject *args;
-        if (!value)
-            args = PyTuple_New(0);
-        else if (PyTuple_Check(value)) {
-            Py_INCREF(value);
-            args = value;
-        } else
-            args = PyTuple_Pack(1, value);
-        if (!args)
-            goto bad;
-        owned_instance = PyEval_CallObject(type, args);
-        Py_DECREF(args);
-        if (!owned_instance)
-            goto bad;
-        value = owned_instance;
-        if (!PyExceptionInstance_Check(value)) {
-            PyErr_Format(PyExc_TypeError,
-                         "calling %R should have returned an instance of "
-                         "BaseException, not %R",
-                         type, Py_TYPE(value));
-            goto bad;
+        PyObject *instance_class = NULL;
+        if (value && PyExceptionInstance_Check(value)) {
+            instance_class = (PyObject*) Py_TYPE(value);
+            if (instance_class != type) {
+                int is_subclass = PyObject_IsSubclass(instance_class, type);
+                if (!is_subclass) {
+                    instance_class = NULL;
+                } else if (unlikely(is_subclass == -1)) {
+                    goto bad;
+                } else {
+                    type = instance_class;
+                }
+            }
+        }
+        if (!instance_class) {
+            PyObject *args;
+            if (!value)
+                args = PyTuple_New(0);
+            else if (PyTuple_Check(value)) {
+                Py_INCREF(value);
+                args = value;
+            } else
+                args = PyTuple_Pack(1, value);
+            if (!args)
+                goto bad;
+            owned_instance = PyObject_Call(type, args, NULL);
+            Py_DECREF(args);
+            if (!owned_instance)
+                goto bad;
+            value = owned_instance;
+            if (!PyExceptionInstance_Check(value)) {
+                PyErr_Format(PyExc_TypeError,
+                             "calling %R should have returned an instance of "
+                             "BaseException, not %R",
+                             type, Py_TYPE(value));
+                goto bad;
+            }
         }
     } else {
         PyErr_SetString(PyExc_TypeError,
@@ -6661,6 +7279,13 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
     PyErr_SetObject(type, value);
     if (tb) {
+#if CYTHON_COMPILING_IN_PYPY
+        PyObject *tmp_type, *tmp_value, *tmp_tb;
+        PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb);
+        Py_INCREF(tb);
+        PyErr_Restore(tmp_type, tmp_value, tb);
+        Py_XDECREF(tmp_tb);
+#else
         PyThreadState *tstate = PyThreadState_GET();
         PyObject* tmp_tb = tstate->curexc_traceback;
         if (tb != tmp_tb) {
@@ -6668,6 +7293,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             tstate->curexc_traceback = tb;
             Py_XDECREF(tmp_tb);
         }
+#endif
     }
 bad:
     Py_XDECREF(owned_instance);
@@ -6679,7 +7305,7 @@ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
     PyObject *result;
 #if CYTHON_COMPILING_IN_CPYTHON
     result = PyDict_GetItem(__pyx_d, name);
-    if (result) {
+    if (likely(result)) {
         Py_INCREF(result);
     } else {
 #else
@@ -6692,23 +7318,78 @@ static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
     return result;
 }
 
-static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
+    PyObject *self, *result;
+    PyCFunction cfunc;
+    cfunc = PyCFunction_GET_FUNCTION(func);
+    self = PyCFunction_GET_SELF(func);
+    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
+        return NULL;
+    result = cfunc(self, arg);
+    Py_LeaveRecursiveCall();
+    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
+        PyErr_SetString(
+            PyExc_SystemError,
+            "NULL result without error in PyObject_Call");
+    }
+    return result;
+}
+#endif
+
+#if CYTHON_COMPILING_IN_CPYTHON
+static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject *result;
+    PyObject *args = PyTuple_New(1);
+    if (unlikely(!args)) return NULL;
+    Py_INCREF(arg);
+    PyTuple_SET_ITEM(args, 0, arg);
+    result = __Pyx_PyObject_Call(func, args, NULL);
+    Py_DECREF(args);
+    return result;
+}
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+#else
+    if (likely(PyCFunction_Check(func))) {
+#endif
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
+            return __Pyx_PyObject_CallMethO(func, arg);
+        }
+    }
+    return __Pyx__PyObject_CallOneArg(func, arg);
+}
+#else
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
+    PyObject* args = PyTuple_Pack(1, arg);
+    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
+}
+#endif
+
+static void __Pyx_RaiseArgumentTypeInvalid(const char* name, PyObject *obj, PyTypeObject *type) {
+    PyErr_Format(PyExc_TypeError,
+        "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)",
+        name, type->tp_name, Py_TYPE(obj)->tp_name);
+}
+static CYTHON_INLINE int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed,
     const char *name, int exact)
 {
-    if (!type) {
-        PyErr_Format(PyExc_SystemError, "Missing type object");
+    if (unlikely(!type)) {
+        PyErr_SetString(PyExc_SystemError, "Missing type object");
         return 0;
     }
     if (none_allowed && obj == Py_None) return 1;
     else if (exact) {
-        if (Py_TYPE(obj) == type) return 1;
+        if (likely(Py_TYPE(obj) == type)) return 1;
+        #if PY_MAJOR_VERSION == 2
+        else if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1;
+        #endif
     }
     else {
-        if (PyObject_TypeCheck(obj, type)) return 1;
+        if (likely(PyObject_TypeCheck(obj, type))) return 1;
     }
-    PyErr_Format(PyExc_TypeError,
-        "Argument '%s' has incorrect type (expected %s, got %s)",
-        name, type->tp_name, Py_TYPE(obj)->tp_name);
+    __Pyx_RaiseArgumentTypeInvalid(name, obj, type);
     return 0;
 }
 
@@ -6719,6 +7400,52 @@ static CYTHON_INLINE Py_ssize_t __Pyx_div_Py_ssize_t(Py_ssize_t a, Py_ssize_t b)
     return q;
 }
 
+#if CYTHON_COMPILING_IN_CPYTHON
+static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
+#ifdef __Pyx_CyFunction_USED
+    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
+#else
+    if (likely(PyCFunction_Check(func))) {
+#endif
+        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
+            return __Pyx_PyObject_CallMethO(func, NULL);
+        }
+    }
+    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
+}
+#endif
+
+static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyThreadState *tstate = PyThreadState_GET();
+    *type = tstate->exc_type;
+    *value = tstate->exc_value;
+    *tb = tstate->exc_traceback;
+    Py_XINCREF(*type);
+    Py_XINCREF(*value);
+    Py_XINCREF(*tb);
+#else
+    PyErr_GetExcInfo(type, value, tb);
+#endif
+}
+static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
+#if CYTHON_COMPILING_IN_CPYTHON
+    PyObject *tmp_type, *tmp_value, *tmp_tb;
+    PyThreadState *tstate = PyThreadState_GET();
+    tmp_type = tstate->exc_type;
+    tmp_value = tstate->exc_value;
+    tmp_tb = tstate->exc_traceback;
+    tstate->exc_type = type;
+    tstate->exc_value = value;
+    tstate->exc_traceback = tb;
+    Py_XDECREF(tmp_type);
+    Py_XDECREF(tmp_value);
+    Py_XDECREF(tmp_tb);
+#else
+    PyErr_SetExcInfo(type, value, tb);
+#endif
+}
+
 static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
     PyObject *local_type, *local_value, *local_tb;
 #if CYTHON_COMPILING_IN_CPYTHON
@@ -6741,12 +7468,14 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
 #endif
         goto bad;
     #if PY_MAJOR_VERSION >= 3
-    if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
-        goto bad;
+    if (local_tb) {
+        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
+            goto bad;
+    }
     #endif
-    Py_INCREF(local_type);
-    Py_INCREF(local_value);
-    Py_INCREF(local_tb);
+    Py_XINCREF(local_tb);
+    Py_XINCREF(local_type);
+    Py_XINCREF(local_value);
     *type = local_type;
     *value = local_value;
     *tb = local_tb;
@@ -6757,8 +7486,6 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb)
     tstate->exc_type = local_type;
     tstate->exc_value = local_value;
     tstate->exc_traceback = local_tb;
-    /* Make sure tstate is in a consistent state when we XDECREF
-       these objects (DECREF may run arbitrary code). */
     Py_XDECREF(tmp_type);
     Py_XDECREF(tmp_value);
     Py_XDECREF(tmp_tb);
@@ -6776,37 +7503,6 @@ bad:
     return -1;
 }
 
-static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyThreadState *tstate = PyThreadState_GET();
-    *type = tstate->exc_type;
-    *value = tstate->exc_value;
-    *tb = tstate->exc_traceback;
-    Py_XINCREF(*type);
-    Py_XINCREF(*value);
-    Py_XINCREF(*tb);
-#else
-    PyErr_GetExcInfo(type, value, tb);
-#endif
-}
-static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
-#if CYTHON_COMPILING_IN_CPYTHON
-    PyObject *tmp_type, *tmp_value, *tmp_tb;
-    PyThreadState *tstate = PyThreadState_GET();
-    tmp_type = tstate->exc_type;
-    tmp_value = tstate->exc_value;
-    tmp_tb = tstate->exc_traceback;
-    tstate->exc_type = type;
-    tstate->exc_value = value;
-    tstate->exc_traceback = tb;
-    Py_XDECREF(tmp_type);
-    Py_XDECREF(tmp_value);
-    Py_XDECREF(tmp_tb);
-#else
-    PyErr_SetExcInfo(type, value, tb);
-#endif
-}
-
 static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
     PyObject *empty_list = 0;
     PyObject *module = 0;
@@ -6815,7 +7511,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
     PyObject *list;
     #if PY_VERSION_HEX < 0x03030000
     PyObject *py_import;
-    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s____import__);
+    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
     if (!py_import)
         goto bad;
     #endif
@@ -6833,7 +7529,6 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
     empty_dict = PyDict_New();
     if (!empty_dict)
         goto bad;
-    #if PY_VERSION_HEX >= 0x02050000
     {
         #if PY_MAJOR_VERSION >= 3
         if (level == -1) {
@@ -6855,7 +7550,7 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
                     PyErr_Clear();
                 }
             }
-            level = 0; /* try absolute import on failure */
+            level = 0;
         }
         #endif
         if (!module) {
@@ -6872,14 +7567,6 @@ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
             #endif
         }
     }
-    #else
-    if (level>0) {
-        PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4.");
-        goto bad;
-    }
-    module = PyObject_CallFunctionObjArgs(py_import,
-        name, global_dict, empty_dict, list, NULL);
-    #endif
 bad:
     #if PY_VERSION_HEX < 0x03030000
     Py_XDECREF(py_import);
@@ -6889,560 +7576,582 @@ bad:
     return module;
 }
 
-static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) {
-    const unsigned char neg_one = (unsigned char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(unsigned char) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(unsigned char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned char" :
-                    "value too large to convert to unsigned char");
-            }
-            return (unsigned char)-1;
-        }
-        return (unsigned char)val;
+static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
+    int start = 0, mid = 0, end = count - 1;
+    if (end >= 0 && code_line > entries[end].code_line) {
+        return count;
     }
-    return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) {
-    const unsigned short neg_one = (unsigned short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(unsigned short) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(unsigned short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned short" :
-                    "value too large to convert to unsigned short");
-            }
-            return (unsigned short)-1;
+    while (start < end) {
+        mid = start + (end - start) / 2;
+        if (code_line < entries[mid].code_line) {
+            end = mid;
+        } else if (code_line > entries[mid].code_line) {
+             start = mid + 1;
+        } else {
+            return mid;
         }
-        return (unsigned short)val;
     }
-    return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x);
-}
-
-static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) {
-    const unsigned int neg_one = (unsigned int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(unsigned int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(unsigned int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to unsigned int" :
-                    "value too large to convert to unsigned int");
-            }
-            return (unsigned int)-1;
-        }
-        return (unsigned int)val;
+    if (code_line <= entries[mid].code_line) {
+        return mid;
+    } else {
+        return mid + 1;
     }
-    return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x);
 }
-
-static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) {
-    const char neg_one = (char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(char) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to char" :
-                    "value too large to convert to char");
-            }
-            return (char)-1;
-        }
-        return (char)val;
+static PyCodeObject *__pyx_find_code_object(int code_line) {
+    PyCodeObject* code_object;
+    int pos;
+    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
+        return NULL;
     }
-    return (char)__Pyx_PyInt_AsLong(x);
-}
-
-static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) {
-    const short neg_one = (short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(short) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to short" :
-                    "value too large to convert to short");
-            }
-            return (short)-1;
-        }
-        return (short)val;
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
+        return NULL;
     }
-    return (short)__Pyx_PyInt_AsLong(x);
+    code_object = __pyx_code_cache.entries[pos].code_object;
+    Py_INCREF(code_object);
+    return code_object;
 }
-
-static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) {
-    const int neg_one = (int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to int" :
-                    "value too large to convert to int");
-            }
-            return (int)-1;
-        }
-        return (int)val;
+static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
+    int pos, i;
+    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
+    if (unlikely(!code_line)) {
+        return;
     }
-    return (int)__Pyx_PyInt_AsLong(x);
-}
-
-static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) {
-    const signed char neg_one = (signed char)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(signed char) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(signed char)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed char" :
-                    "value too large to convert to signed char");
-            }
-            return (signed char)-1;
+    if (unlikely(!entries)) {
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (likely(entries)) {
+            __pyx_code_cache.entries = entries;
+            __pyx_code_cache.max_count = 64;
+            __pyx_code_cache.count = 1;
+            entries[0].code_line = code_line;
+            entries[0].code_object = code_object;
+            Py_INCREF(code_object);
         }
-        return (signed char)val;
+        return;
     }
-    return (signed char)__Pyx_PyInt_AsSignedLong(x);
-}
-
-static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) {
-    const signed short neg_one = (signed short)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(signed short) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(signed short)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed short" :
-                    "value too large to convert to signed short");
-            }
-            return (signed short)-1;
+    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
+    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
+        PyCodeObject* tmp = entries[pos].code_object;
+        entries[pos].code_object = code_object;
+        Py_DECREF(tmp);
+        return;
+    }
+    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
+        int new_max = __pyx_code_cache.max_count + 64;
+        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
+            __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry));
+        if (unlikely(!entries)) {
+            return;
         }
-        return (signed short)val;
+        __pyx_code_cache.entries = entries;
+        __pyx_code_cache.max_count = new_max;
     }
-    return (signed short)__Pyx_PyInt_AsSignedLong(x);
+    for (i=__pyx_code_cache.count; i>pos; i--) {
+        entries[i] = entries[i-1];
+    }
+    entries[pos].code_line = code_line;
+    entries[pos].code_object = code_object;
+    __pyx_code_cache.count++;
+    Py_INCREF(code_object);
 }
 
-static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) {
-    const signed int neg_one = (signed int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(signed int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(signed int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to signed int" :
-                    "value too large to convert to signed int");
-            }
-            return (signed int)-1;
-        }
-        return (signed int)val;
+#include "compile.h"
+#include "frameobject.h"
+#include "traceback.h"
+static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
+            const char *funcname, int c_line,
+            int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyObject *py_srcfile = 0;
+    PyObject *py_funcname = 0;
+    #if PY_MAJOR_VERSION < 3
+    py_srcfile = PyString_FromString(filename);
+    #else
+    py_srcfile = PyUnicode_FromString(filename);
+    #endif
+    if (!py_srcfile) goto bad;
+    if (c_line) {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        #else
+        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
+        #endif
+    }
+    else {
+        #if PY_MAJOR_VERSION < 3
+        py_funcname = PyString_FromString(funcname);
+        #else
+        py_funcname = PyUnicode_FromString(funcname);
+        #endif
     }
-    return (signed int)__Pyx_PyInt_AsSignedLong(x);
+    if (!py_funcname) goto bad;
+    py_code = __Pyx_PyCode_New(
+        0,
+        0,
+        0,
+        0,
+        0,
+        __pyx_empty_bytes, /*PyObject *code,*/
+        __pyx_empty_tuple, /*PyObject *consts,*/
+        __pyx_empty_tuple, /*PyObject *names,*/
+        __pyx_empty_tuple, /*PyObject *varnames,*/
+        __pyx_empty_tuple, /*PyObject *freevars,*/
+        __pyx_empty_tuple, /*PyObject *cellvars,*/
+        py_srcfile,   /*PyObject *filename,*/
+        py_funcname,  /*PyObject *name,*/
+        py_line,
+        __pyx_empty_bytes  /*PyObject *lnotab*/
+    );
+    Py_DECREF(py_srcfile);
+    Py_DECREF(py_funcname);
+    return py_code;
+bad:
+    Py_XDECREF(py_srcfile);
+    Py_XDECREF(py_funcname);
+    return NULL;
 }
-
-static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) {
-    const int neg_one = (int)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-    if (sizeof(int) < sizeof(long)) {
-        long val = __Pyx_PyInt_AsLong(x);
-        if (unlikely(val != (long)(int)val)) {
-            if (!unlikely(val == -1 && PyErr_Occurred())) {
-                PyErr_SetString(PyExc_OverflowError,
-                    (is_unsigned && unlikely(val < 0)) ?
-                    "can't convert negative value to int" :
-                    "value too large to convert to int");
-            }
-            return (int)-1;
-        }
-        return (int)val;
+static void __Pyx_AddTraceback(const char *funcname, int c_line,
+                               int py_line, const char *filename) {
+    PyCodeObject *py_code = 0;
+    PyFrameObject *py_frame = 0;
+    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
+    if (!py_code) {
+        py_code = __Pyx_CreateCodeObjectForTraceback(
+            funcname, c_line, py_line, filename);
+        if (!py_code) goto bad;
+        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
     }
-    return (int)__Pyx_PyInt_AsLong(x);
+    py_frame = PyFrame_New(
+        PyThreadState_GET(), /*PyThreadState *tstate,*/
+        py_code,             /*PyCodeObject *code,*/
+        __pyx_d,      /*PyObject *globals,*/
+        0                    /*PyObject *locals*/
+    );
+    if (!py_frame) goto bad;
+    py_frame->f_lineno = py_line;
+    PyTraceBack_Here(py_frame);
+bad:
+    Py_XDECREF(py_code);
+    Py_XDECREF(py_frame);
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
+#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\
+    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0)
+#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\
+    __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1)
+#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\
+    {\
+        func_type value = func_value;\
+        if (sizeof(target_type) < sizeof(func_type)) {\
+            if (unlikely(value != (func_type) (target_type) value)) {\
+                func_type zero = 0;\
+                if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\
+                    return (target_type) -1;\
+                if (is_unsigned && unlikely(value < zero))\
+                    goto raise_neg_overflow;\
+                else\
+                    goto raise_overflow;\
+            }\
+        }\
+        return (target_type) value;\
+    }
+
 #if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
+  #include "longintrepr.h"
 #endif
-static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) {
-    const unsigned long neg_one = (unsigned long)-1, const_zero = 0;
+
+static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
+    const int neg_one = (int) -1, const_zero = (int) 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to unsigned long");
-            return (unsigned long)-1;
+        if (sizeof(int) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (int) val;
         }
-        return (unsigned long)val;
     } else
 #endif
     if (likely(PyLong_Check(x))) {
         if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (unsigned long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (int) 0;
+                case  1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0])
+                case 2:
+                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) {
+                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) {
+                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) {
+                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
+#if CYTHON_COMPILING_IN_CPYTHON
             if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned long");
-                return (unsigned long)-1;
+                goto raise_neg_overflow;
             }
-            return (unsigned long)PyLong_AsUnsignedLong(x);
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(unsigned long) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(unsigned long) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            return (unsigned long)PyLong_AsLong(x);
-        }
-    } else {
-        unsigned long val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (unsigned long)-1;
-        val = __Pyx_PyInt_AsUnsignedLong(tmp);
-        Py_DECREF(tmp);
-        return val;
-    }
-}
-
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) {
-    const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to unsigned PY_LONG_LONG");
-            return (unsigned PY_LONG_LONG)-1;
-        }
-        return (unsigned PY_LONG_LONG)val;
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (unsigned PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+#else
+            {
+                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+                if (unlikely(result < 0))
+                    return (int) -1;
+                if (unlikely(result == 1))
+                    goto raise_neg_overflow;
             }
 #endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to unsigned PY_LONG_LONG");
-                return (unsigned PY_LONG_LONG)-1;
+            if (sizeof(int) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
             }
-            return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
         } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(unsigned PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(unsigned PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(unsigned PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (int) 0;
+                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) digits[0])
+                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +digits[0])
+                case -2:
+                    if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+                            return (int) -(((((int)digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 2:
+                    if (8 * sizeof(int) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+                            return (int) (((((int)digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case -3:
+                    if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+                            return (int) -(((((((int)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(int) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+                            return (int) (((((((int)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case -4:
+                    if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
+                            return (int) -(((((((((int)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(int) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) {
+                            return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
-            return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x);
-        }
-    } else {
-        unsigned PY_LONG_LONG val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (unsigned PY_LONG_LONG)-1;
-        val = __Pyx_PyInt_AsUnsignedLongLong(tmp);
-        Py_DECREF(tmp);
-        return val;
-    }
-}
-
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) {
-    const long neg_one = (long)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to long");
-            return (long)-1;
-        }
-        return (long)val;
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            if (sizeof(int) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x))
+            } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x))
             }
-#endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to long");
-                return (long)-1;
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            int val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
             }
-            return (long)PyLong_AsUnsignedLong(x);
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(long) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(long) ((PyLongObject*)x)->ob_digit[0];
-                }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
             }
 #endif
-#endif
-            return (long)PyLong_AsLong(x);
+            return (int) -1;
         }
     } else {
-        long val;
+        int val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (long)-1;
-        val = __Pyx_PyInt_AsLong(tmp);
+        if (!tmp) return (int) -1;
+        val = __Pyx_PyInt_As_int(tmp);
         Py_DECREF(tmp);
         return val;
     }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to int");
+    return (int) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to int");
+    return (int) -1;
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) {
-    const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0;
+static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
+    const long neg_one = (long) -1, const_zero = (long) 0;
     const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to PY_LONG_LONG");
-            return (PY_LONG_LONG)-1;
-        }
-        return (PY_LONG_LONG)val;
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to PY_LONG_LONG");
-                return (PY_LONG_LONG)-1;
-            }
-            return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            return (PY_LONG_LONG)PyLong_AsLongLong(x);
+    if (is_unsigned) {
+        if (sizeof(long) < sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(long) <= sizeof(unsigned long)) {
+            return PyLong_FromUnsignedLong((unsigned long) value);
+        } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+            return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value);
         }
     } else {
-        PY_LONG_LONG val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (PY_LONG_LONG)-1;
-        val = __Pyx_PyInt_AsLongLong(tmp);
-        Py_DECREF(tmp);
-        return val;
+        if (sizeof(long) <= sizeof(long)) {
+            return PyInt_FromLong((long) value);
+        } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+            return PyLong_FromLongLong((PY_LONG_LONG) value);
+        }
+    }
+    {
+        int one = 1; int little = (int)*(unsigned char *)&one;
+        unsigned char *bytes = (unsigned char *)&value;
+        return _PyLong_FromByteArray(bytes, sizeof(long),
+                                     little, !is_unsigned);
     }
 }
 
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) {
-    const signed long neg_one = (signed long)-1, const_zero = 0;
+static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
+    const long neg_one = (long) -1, const_zero = (long) 0;
     const int is_unsigned = neg_one > const_zero;
 #if PY_MAJOR_VERSION < 3
     if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to signed long");
-            return (signed long)-1;
+        if (sizeof(long) < sizeof(long)) {
+            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
+        } else {
+            long val = PyInt_AS_LONG(x);
+            if (is_unsigned && unlikely(val < 0)) {
+                goto raise_neg_overflow;
+            }
+            return (long) val;
         }
-        return (signed long)val;
     } else
 #endif
     if (likely(PyLong_Check(x))) {
         if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (signed long) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (long) 0;
+                case  1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0])
+                case 2:
+                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) {
+                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) {
+                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) {
+                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
-#endif
+#if CYTHON_COMPILING_IN_CPYTHON
             if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to signed long");
-                return (signed long)-1;
+                goto raise_neg_overflow;
             }
-            return (signed long)PyLong_AsUnsignedLong(x);
-        } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed long)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(signed long) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(signed long) ((PyLongObject*)x)->ob_digit[0];
-                }
-            }
-#endif
-#endif
-            return (signed long)PyLong_AsLong(x);
-        }
-    } else {
-        signed long val;
-        PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (signed long)-1;
-        val = __Pyx_PyInt_AsSignedLong(tmp);
-        Py_DECREF(tmp);
-        return val;
-    }
-}
-
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-#include "longintrepr.h"
-#endif
-#endif
-static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) {
-    const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0;
-    const int is_unsigned = neg_one > const_zero;
-#if PY_MAJOR_VERSION < 3
-    if (likely(PyInt_Check(x))) {
-        long val = PyInt_AS_LONG(x);
-        if (is_unsigned && unlikely(val < 0)) {
-            PyErr_SetString(PyExc_OverflowError,
-                            "can't convert negative value to signed PY_LONG_LONG");
-            return (signed PY_LONG_LONG)-1;
-        }
-        return (signed PY_LONG_LONG)val;
-    } else
-#endif
-    if (likely(PyLong_Check(x))) {
-        if (is_unsigned) {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
-#if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return (signed PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+#else
+            {
+                int result = PyObject_RichCompareBool(x, Py_False, Py_LT);
+                if (unlikely(result < 0))
+                    return (long) -1;
+                if (unlikely(result == 1))
+                    goto raise_neg_overflow;
             }
 #endif
-#endif
-            if (unlikely(Py_SIZE(x) < 0)) {
-                PyErr_SetString(PyExc_OverflowError,
-                                "can't convert negative value to signed PY_LONG_LONG");
-                return (signed PY_LONG_LONG)-1;
+            if (sizeof(long) <= sizeof(unsigned long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x))
+            } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x))
             }
-            return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x);
         } else {
-#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
-            if (sizeof(digit) <= sizeof(signed PY_LONG_LONG)) {
-                switch (Py_SIZE(x)) {
-                    case  0: return 0;
-                    case  1: return +(signed PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                    case -1: return -(signed PY_LONG_LONG) ((PyLongObject*)x)->ob_digit[0];
-                }
+            const digit* digits = ((PyLongObject*)x)->ob_digit;
+            switch (Py_SIZE(x)) {
+                case  0: return (long) 0;
+                case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) digits[0])
+                case  1: __PYX_VERIFY_RETURN_INT(long,  digit, +digits[0])
+                case -2:
+                    if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                            return (long) -(((((long)digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 2:
+                    if (8 * sizeof(long) > 1 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                            return (long) (((((long)digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case -3:
+                    if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                            return (long) -(((((((long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 3:
+                    if (8 * sizeof(long) > 2 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                            return (long) (((((((long)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case -4:
+                    if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                            return (long) -(((((((((long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
+                case 4:
+                    if (8 * sizeof(long) > 3 * PyLong_SHIFT) {
+                        if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) {
+                            __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0])))
+                        } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) {
+                            return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+                        }
+                    }
+                    break;
             }
 #endif
+            if (sizeof(long) <= sizeof(long)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x))
+            } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) {
+                __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x))
+            }
+        }
+        {
+#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
+            PyErr_SetString(PyExc_RuntimeError,
+                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
+#else
+            long val;
+            PyObject *v = __Pyx_PyNumber_Int(x);
+ #if PY_MAJOR_VERSION < 3
+            if (likely(v) && !PyLong_Check(v)) {
+                PyObject *tmp = v;
+                v = PyNumber_Long(tmp);
+                Py_DECREF(tmp);
+            }
+ #endif
+            if (likely(v)) {
+                int one = 1; int is_little = (int)*(unsigned char *)&one;
+                unsigned char *bytes = (unsigned char *)&val;
+                int ret = _PyLong_AsByteArray((PyLongObject *)v,
+                                              bytes, sizeof(val),
+                                              is_little, !is_unsigned);
+                Py_DECREF(v);
+                if (likely(!ret))
+                    return val;
+            }
 #endif
-            return (signed PY_LONG_LONG)PyLong_AsLongLong(x);
+            return (long) -1;
         }
     } else {
-        signed PY_LONG_LONG val;
+        long val;
         PyObject *tmp = __Pyx_PyNumber_Int(x);
-        if (!tmp) return (signed PY_LONG_LONG)-1;
-        val = __Pyx_PyInt_AsSignedLongLong(tmp);
+        if (!tmp) return (long) -1;
+        val = __Pyx_PyInt_As_long(tmp);
         Py_DECREF(tmp);
         return val;
     }
+raise_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "value too large to convert to long");
+    return (long) -1;
+raise_neg_overflow:
+    PyErr_SetString(PyExc_OverflowError,
+        "can't convert negative value to long");
+    return (long) -1;
 }
 
 static int __Pyx_check_binary_version(void) {
@@ -7455,177 +8164,11 @@ static int __Pyx_check_binary_version(void) {
                       "compiletime version %s of module '%.100s' "
                       "does not match runtime version %s",
                       ctversion, __Pyx_MODULE_NAME, rtversion);
-        #if PY_VERSION_HEX < 0x02050000
-        return PyErr_Warn(NULL, message);
-        #else
         return PyErr_WarnEx(NULL, message, 1);
-        #endif
     }
     return 0;
 }
 
-static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
-    int start = 0, mid = 0, end = count - 1;
-    if (end >= 0 && code_line > entries[end].code_line) {
-        return count;
-    }
-    while (start < end) {
-        mid = (start + end) / 2;
-        if (code_line < entries[mid].code_line) {
-            end = mid;
-        } else if (code_line > entries[mid].code_line) {
-             start = mid + 1;
-        } else {
-            return mid;
-        }
-    }
-    if (code_line <= entries[mid].code_line) {
-        return mid;
-    } else {
-        return mid + 1;
-    }
-}
-static PyCodeObject *__pyx_find_code_object(int code_line) {
-    PyCodeObject* code_object;
-    int pos;
-    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
-        return NULL;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
-        return NULL;
-    }
-    code_object = __pyx_code_cache.entries[pos].code_object;
-    Py_INCREF(code_object);
-    return code_object;
-}
-static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
-    int pos, i;
-    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
-    if (unlikely(!code_line)) {
-        return;
-    }
-    if (unlikely(!entries)) {
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (likely(entries)) {
-            __pyx_code_cache.entries = entries;
-            __pyx_code_cache.max_count = 64;
-            __pyx_code_cache.count = 1;
-            entries[0].code_line = code_line;
-            entries[0].code_object = code_object;
-            Py_INCREF(code_object);
-        }
-        return;
-    }
-    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
-    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
-        PyCodeObject* tmp = entries[pos].code_object;
-        entries[pos].code_object = code_object;
-        Py_DECREF(tmp);
-        return;
-    }
-    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
-        int new_max = __pyx_code_cache.max_count + 64;
-        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
-            __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry));
-        if (unlikely(!entries)) {
-            return;
-        }
-        __pyx_code_cache.entries = entries;
-        __pyx_code_cache.max_count = new_max;
-    }
-    for (i=__pyx_code_cache.count; i>pos; i--) {
-        entries[i] = entries[i-1];
-    }
-    entries[pos].code_line = code_line;
-    entries[pos].code_object = code_object;
-    __pyx_code_cache.count++;
-    Py_INCREF(code_object);
-}
-
-#include "compile.h"
-#include "frameobject.h"
-#include "traceback.h"
-static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
-            const char *funcname, int c_line,
-            int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_srcfile = 0;
-    PyObject *py_funcname = 0;
-    #if PY_MAJOR_VERSION < 3
-    py_srcfile = PyString_FromString(filename);
-    #else
-    py_srcfile = PyUnicode_FromString(filename);
-    #endif
-    if (!py_srcfile) goto bad;
-    if (c_line) {
-        #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
-        #else
-        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
-        #endif
-    }
-    else {
-        #if PY_MAJOR_VERSION < 3
-        py_funcname = PyString_FromString(funcname);
-        #else
-        py_funcname = PyUnicode_FromString(funcname);
-        #endif
-    }
-    if (!py_funcname) goto bad;
-    py_code = __Pyx_PyCode_New(
-        0,            /*int argcount,*/
-        0,            /*int kwonlyargcount,*/
-        0,            /*int nlocals,*/
-        0,            /*int stacksize,*/
-        0,            /*int flags,*/
-        __pyx_empty_bytes, /*PyObject *code,*/
-        __pyx_empty_tuple, /*PyObject *consts,*/
-        __pyx_empty_tuple, /*PyObject *names,*/
-        __pyx_empty_tuple, /*PyObject *varnames,*/
-        __pyx_empty_tuple, /*PyObject *freevars,*/
-        __pyx_empty_tuple, /*PyObject *cellvars,*/
-        py_srcfile,   /*PyObject *filename,*/
-        py_funcname,  /*PyObject *name,*/
-        py_line,      /*int firstlineno,*/
-        __pyx_empty_bytes  /*PyObject *lnotab*/
-    );
-    Py_DECREF(py_srcfile);
-    Py_DECREF(py_funcname);
-    return py_code;
-bad:
-    Py_XDECREF(py_srcfile);
-    Py_XDECREF(py_funcname);
-    return NULL;
-}
-static void __Pyx_AddTraceback(const char *funcname, int c_line,
-                               int py_line, const char *filename) {
-    PyCodeObject *py_code = 0;
-    PyObject *py_globals = 0;
-    PyFrameObject *py_frame = 0;
-    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
-    if (!py_code) {
-        py_code = __Pyx_CreateCodeObjectForTraceback(
-            funcname, c_line, py_line, filename);
-        if (!py_code) goto bad;
-        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
-    }
-    py_globals = PyModule_GetDict(__pyx_m);
-    if (!py_globals) goto bad;
-    py_frame = PyFrame_New(
-        PyThreadState_GET(), /*PyThreadState *tstate,*/
-        py_code,             /*PyCodeObject *code,*/
-        py_globals,          /*PyObject *globals,*/
-        0                    /*PyObject *locals*/
-    );
-    if (!py_frame) goto bad;
-    py_frame->f_lineno = py_line;
-    PyTraceBack_Here(py_frame);
-bad:
-    Py_XDECREF(py_code);
-    Py_XDECREF(py_frame);
-}
-
 static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     while (t->p) {
         #if PY_MAJOR_VERSION < 3
@@ -7636,7 +8179,7 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
         } else {
             *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
         }
-        #else  /* Python 3+ has unicode identifiers */
+        #else
         if (t->is_unicode | t->is_str) {
             if (t->intern) {
                 *t->p = PyUnicode_InternFromString(t->s);
@@ -7656,15 +8199,15 @@ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
     return 0;
 }
 
-static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(char* c_str) {
-    return __Pyx_PyUnicode_FromStringAndSize(c_str, strlen(c_str));
+static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
+    return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
 }
 static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
     Py_ssize_t ignore;
     return __Pyx_PyObject_AsStringAndSize(o, &ignore);
 }
 static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
-#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
+#if CYTHON_COMPILING_IN_CPYTHON && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
     if (
 #if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
             __Pyx_sys_getdefaultencoding_not_ascii &&
@@ -7686,29 +8229,35 @@ static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_
                 }
             }
         }
-#endif /*__PYX_DEFAULT_STRING_ENCODING_IS_ASCII*/
+#endif
         *length = PyBytes_GET_SIZE(defenc);
         return defenc_c;
-#else /* PY_VERSION_HEX < 0x03030000 */
-        if (PyUnicode_READY(o) == -1) return NULL;
+#else
+        if (__Pyx_PyUnicode_READY(o) == -1) return NULL;
 #if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
         if (PyUnicode_IS_ASCII(o)) {
-            *length = PyUnicode_GET_DATA_SIZE(o);
+            *length = PyUnicode_GET_LENGTH(o);
             return PyUnicode_AsUTF8(o);
         } else {
             PyUnicode_AsASCIIString(o);
             return NULL;
         }
-#else /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
+#else
         return PyUnicode_AsUTF8AndSize(o, length);
-#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII */
-#endif /* PY_VERSION_HEX < 0x03030000 */
+#endif
+#endif
+    } else
+#endif
+#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE))
+    if (PyByteArray_Check(o)) {
+        *length = PyByteArray_GET_SIZE(o);
+        return PyByteArray_AS_STRING(o);
     } else
-#endif /* __PYX_DEFAULT_STRING_ENCODING_IS_ASCII  || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT */
+#endif
     {
         char* result;
         int r = PyBytes_AsStringAndSize(o, &result, length);
-        if (r < 0) {
+        if (unlikely(r < 0)) {
             return NULL;
         } else {
             return result;
@@ -7729,7 +8278,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
 #else
   if (PyLong_Check(x))
 #endif
-    return Py_INCREF(x), x;
+    return __Pyx_NewRef(x);
   m = Py_TYPE(x)->tp_as_number;
 #if PY_MAJOR_VERSION < 3
   if (m && m->nb_int) {
@@ -7753,7 +8302,7 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
     if (!PyLong_Check(res)) {
 #endif
       PyErr_Format(PyExc_TypeError,
-                   "__%s__ returned non-%s (type %.200s)",
+                   "__%.4s__ returned non-%.4s (type %.200s)",
                    name, name, Py_TYPE(res)->tp_name);
       Py_DECREF(res);
       return NULL;
@@ -7767,34 +8316,68 @@ static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
 }
 static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
   Py_ssize_t ival;
-  PyObject* x = PyNumber_Index(b);
+  PyObject *x;
+#if PY_MAJOR_VERSION < 3
+  if (likely(PyInt_CheckExact(b))) {
+    if (sizeof(Py_ssize_t) >= sizeof(long))
+        return PyInt_AS_LONG(b);
+    else
+        return PyInt_AsSsize_t(x);
+  }
+#endif
+  if (likely(PyLong_CheckExact(b))) {
+    #if CYTHON_USE_PYLONG_INTERNALS
+    const digit* digits = ((PyLongObject*)b)->ob_digit;
+    const Py_ssize_t size = Py_SIZE(b);
+    if (likely(__Pyx_sst_abs(size) <= 1)) {
+        ival = likely(size) ? digits[0] : 0;
+        if (size == -1) ival = -ival;
+        return ival;
+    } else {
+      switch (size) {
+         case 2:
+           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
+           }
+           break;
+         case -2:
+           if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | digits[0]));
+           }
+           break;
+         case 3:
+           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+           }
+           break;
+         case -3:
+           if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+           }
+           break;
+         case 4:
+           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+             return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+           }
+           break;
+         case -4:
+           if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) {
+             return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | digits[2]) << PyLong_SHIFT) | digits[1]) << PyLong_SHIFT) | digits[0]));
+           }
+           break;
+      }
+    }
+    #endif
+    return PyLong_AsSsize_t(b);
+  }
+  x = PyNumber_Index(b);
   if (!x) return -1;
   ival = PyInt_AsSsize_t(x);
   Py_DECREF(x);
   return ival;
 }
 static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
-#if PY_VERSION_HEX < 0x02050000
-   if (ival <= LONG_MAX)
-       return PyInt_FromLong((long)ival);
-   else {
-       unsigned char *bytes = (unsigned char *) &ival;
-       int one = 1; int little = (int)*(unsigned char*)&one;
-       return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0);
-   }
-#else
-   return PyInt_FromSize_t(ival);
-#endif
-}
-static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) {
-   unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x);
-   if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) {
-       if ((val != (unsigned PY_LONG_LONG)-1) || !PyErr_Occurred())
-           PyErr_SetString(PyExc_OverflowError,
-                           "value too large to convert to size_t");
-       return (size_t)-1;
-   }
-   return (size_t)val;
+    return PyInt_FromSize_t(ival);
 }
 
 
diff --git a/_proj.pyx b/_proj.pyx
index 791bfa3..a1ed53f 100644
--- a/_proj.pyx
+++ b/_proj.pyx
@@ -8,7 +8,7 @@ cdef double _dg2rad, _rad2dg
 _dg2rad = math.radians(1.)
 _rad2dg = math.degrees(1.)
 _doublesize = sizeof(double)
-__version__ = "1.9.4"
+__version__ = "1.9.5"
 
 cdef extern from "math.h":
     cdef enum:
@@ -113,8 +113,10 @@ cdef class Proj:
         cdef projUV projxyout, projlonlatin
         cdef Py_ssize_t buflenx, bufleny, ndim, i
         cdef double u, v
-        cdef double *lonsdata, *latsdata
-        cdef void *londata, *latdata
+        cdef double *lonsdata
+        cdef double *latsdata
+        cdef void *londata
+        cdef void *latdata
         cdef int err
         # if buffer api is supported, get pointer to data buffers.
         if PyObject_AsWriteBuffer(lons, &londata, &buflenx) <> 0:
@@ -174,8 +176,10 @@ cdef class Proj:
         cdef projUV projxyin, projlonlatout
         cdef Py_ssize_t buflenx, bufleny, ndim, i
         cdef double u, v
-        cdef void *xdata, *ydata
-        cdef double *xdatab, *ydatab
+        cdef void *xdata
+        cdef void *ydata
+        cdef double *xdatab
+        cdef double *ydatab
         # if buffer api is supported, get pointer to data buffers.
         if PyObject_AsWriteBuffer(x, &xdata, &buflenx) <> 0:
             raise RuntimeError
@@ -321,8 +325,12 @@ cdef class Proj:
 
 def _transform(Proj p1, Proj p2, inx, iny, inz, radians):
     # private function to call pj_transform
-    cdef void *xdata, *ydata, *zdata
-    cdef double *xx, *yy, *zz
+    cdef void *xdata
+    cdef void *ydata
+    cdef void *zdata
+    cdef double *xx
+    cdef double *yy
+    cdef double *zz
     cdef Py_ssize_t buflenx, bufleny, buflenz, npts, i
     cdef int err
     if PyObject_AsWriteBuffer(inx, &xdata, &buflenx) <> 0:
@@ -340,7 +348,7 @@ def _transform(Proj p1, Proj p2, inx, iny, inz, radians):
     yy = <double *>ydata
     if inz is not None:
         zz = <double *>zdata
-    npts = buflenx/8
+    npts = buflenx//8
     if not radians and p1.is_latlong():
         for i from 0 <= i < npts:
             xx[i] = xx[i]*_dg2rad
@@ -384,8 +392,14 @@ cdef class Geod:
         """
         cdef Py_ssize_t buflenlons, buflenlats, buflenaz, buflend, ndim, i
         cdef double lat1,lon1,az1,s12,plon2,plat2,pazi2
-        cdef double *lonsdata, *latsdata, *azdata, *distdata
-        cdef void *londata, *latdata, *azdat, *distdat
+        cdef double *lonsdata
+        cdef double *latsdata
+        cdef double *azdata
+        cdef double *distdata
+        cdef void *londata
+        cdef void *latdata
+        cdef void *azdat
+        cdef void *distdat
         # if buffer api is supported, get pointer to data buffers.
         if PyObject_AsWriteBuffer(lons, &londata, &buflenlons) <> 0:
             raise RuntimeError
@@ -442,8 +456,14 @@ cdef class Geod:
         """
         cdef double lat1,lon1,lat2,lon2,pazi1,pazi2,ps12
         cdef Py_ssize_t buflenlons, buflenlats, buflenaz, buflend, ndim, i
-        cdef double *lonsdata, *latsdata, *azdata, *distdata
-        cdef void *londata, *latdata, *azdat, *distdat
+        cdef double *lonsdata
+        cdef double *latsdata
+        cdef double *azdata
+        cdef double *distdata
+        cdef void *londata
+        cdef void *latdata
+        cdef void *azdat
+        cdef void *distdat
         # if buffer api is supported, get pointer to data buffers.
         if PyObject_AsWriteBuffer(lons1, &londata, &buflenlons) <> 0:
             raise RuntimeError
diff --git a/lib/pyproj/__init__.py b/lib/pyproj/__init__.py
index 3e5cc27..40f79d8 100644
--- a/lib/pyproj/__init__.py
+++ b/lib/pyproj/__init__.py
@@ -47,6 +47,7 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. """
 
+import sys
 from pyproj import _proj
 from pyproj.datadir import pyproj_datadir
 __version__ =  _proj.__version__
@@ -54,6 +55,13 @@ set_datapath =  _proj.set_datapath
 from array import array
 import os, math
 #import numpy as np
+
+# Python 2/3 compatibility
+if sys.version_info[0] == 2:	 	# Python 2
+   string_types = (basestring,)
+else: 			   		# Python 3
+   string_types = (str,)
+
 pj_list={
 'aea': "Albers Equal Area",
 'aeqd': "Azimuthal Equidistant",
@@ -313,6 +321,13 @@ class Proj(_proj.Proj):
         >>> p = Proj("+init=epsg:32667",preserve_units=True)
         >>> 'x=%12.3f y=%12.3f (feet)' % p(-114.057222, 51.045)
         'x=-5851322.810 y=20320934.409 (feet)'
+        >>> p = Proj(proj='hammer') # hammer proj and inverse
+        >>> x,y = p(-30,40)
+        >>> 'x=%12.3f y=%12.3f' % (x,y)
+        'x=-2711575.083 y= 4395506.619'
+        >>> lon,lat = p(x,y,inverse=True)
+        >>> 'lon=%9.3f lat=%9.3f (degrees)' % (lon,lat)
+        'lon=  -30.000 lat=   40.000 (degrees)'
         """
         # if projparams is None, use kwargs.
         if projparams is None:
@@ -320,8 +335,8 @@ class Proj(_proj.Proj):
                 raise RuntimeError('no projection control parameters specified')
             else:
                 projstring = _dict2string(kwargs)
-        elif type(projparams) == str:
-            # if projparams is a string, interpret as a proj4 init string.
+        elif isinstance(projparams, string_types):
+            # if projparams is a string or a unicode string, interpret as a proj4 init string.
             projstring = projparams
         else: # projparams a dict
             projstring = _dict2string(projparams)
@@ -356,10 +371,6 @@ class Proj(_proj.Proj):
         If errcheck=False and the transformation is invalid, no
         exception is raised and 1.e30 is returned.
 
-        Instead of calling with lon, lat, a single ndarray of
-        shape n,2 may be used, and one of the same shape will
-        be returned; this is more efficient.
-
         Inputs should be doubles (they will be cast to doubles if they
         are not, causing a slight performance hit).
 
@@ -473,9 +484,15 @@ def transform(p1, p2, x, y, z=None, radians=False):
     >>> x1 = -111.5; y1 = 45.25919444444
     >>> p2 = Proj(proj="utm",zone=10,datum='NAD27')
     >>> x2, y2 = transform(p1, p2, x1, y1)
-    >>> "%12.3f %12.3f" % (x2,y2)
-    ' 1402285.991  5076292.423'
+    >>> "%s  %s" % (str(x2)[:9],str(y2)[:9])
+    '1402285.9  5076292.4'
     """
+    # check that p1 and p2 are from the Proj class
+    if not isinstance(p1, Proj):
+        raise TypeError("p1 must be a Proj class")
+    if not isinstance(p2, Proj):
+        raise TypeError("p2 must be a Proj class")
+
     # process inputs, making copies that support buffer API.
     inx, xisfloat, xislist, xistuple = _copytobuffer(x)
     iny, yisfloat, yislist, yistuple = _copytobuffer(y)
@@ -522,7 +539,10 @@ def _copytobuffer(x):
                 # (this makes a copy - which is crucial
                 #  since buffer is modified in place)
                 x.dtype.char
-                inx = x.astype('d')
+                # Basemap issue
+                # https://github.com/matplotlib/basemap/pull/223/files
+                # (deal with input array in fortran order)
+                inx = x.copy(order="C").astype('d')
                 # inx,isfloat,islist,istuple
                 return inx,False,False,False
             except:
@@ -694,6 +714,10 @@ class Geod(_proj.Geod):
         ellpsd = {}
         if initstring is not None:
             for kvpair in initstring.split():
+                # Actually only +a and +b are needed
+                # We can ignore safely any parameter that doesn't have a value
+                if kvpair.find('=') == -1:
+                    continue
                 k,v = kvpair.split('=')
                 k = k.lstrip('+')
                 if k in ['a','b','rf','f','es','e']:
diff --git a/lib/pyproj/data/epsg b/lib/pyproj/data/epsg
index 89acd4c..9202499 100644
--- a/lib/pyproj/data/epsg
+++ b/lib/pyproj/data/epsg
@@ -123,7 +123,7 @@
 # Observatario
 <4129> +proj=longlat +ellps=clrk66 +no_defs  <>
 # Moznet
-<4130> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs  <>
+<4130> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # Indian 1960
 <4131> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +no_defs  <>
 # FD58
@@ -131,7 +131,7 @@
 # EST92
 <4133> +proj=longlat +ellps=GRS80 +towgs84=0.055,-0.541,-0.185,0.0183,-0.0003,-0.007,-0.014 +no_defs  <>
 # PSD93
-<4134> +proj=longlat +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.7101 +no_defs  <>
+<4134> +proj=longlat +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +no_defs  <>
 # Old Hawaiian
 <4135> +proj=longlat +ellps=clrk66 +towgs84=61,-285,-181,0,0,0,0 +no_defs  <>
 # St. Lawrence Island
@@ -181,7 +181,7 @@
 # Naparima 1955
 <4158> +proj=longlat +ellps=intl +towgs84=-0.465,372.095,171.736,0,0,0,0 +no_defs  <>
 # ELD79
-<4159> +proj=longlat +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +no_defs  <>
+<4159> +proj=longlat +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +no_defs  <>
 # Chos Malal 1914
 <4160> +proj=longlat +ellps=intl +no_defs  <>
 # Pampa del Castillo
@@ -223,7 +223,7 @@
 # EST97
 <4180> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # Luxembourg 1930
-<4181> +proj=longlat +ellps=intl +towgs84=-189.681,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +no_defs  <>
+<4181> +proj=longlat +ellps=intl +towgs84=-189.6806,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +no_defs  <>
 # Azores Occidental 1939
 <4182> +proj=longlat +ellps=intl +towgs84=-425,-169,81,0,0,0,0 +no_defs  <>
 # Azores Central 1948
@@ -257,7 +257,7 @@
 # Egypt 1930
 <4199> +proj=longlat +ellps=intl +no_defs  <>
 # Pulkovo 1995
-<4200> +proj=longlat +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +no_defs  <>
+<4200> +proj=longlat +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +no_defs  <>
 # Adindan
 <4201> +proj=longlat +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +no_defs  <>
 # AGD66
@@ -317,7 +317,7 @@
 # ED50
 <4230> +proj=longlat +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +no_defs  <>
 # ED87
-<4231> +proj=longlat +ellps=intl +towgs84=-83.11,-97.38,-117.22,0.00569291,-0.0446976,0.0442851,0.1218 +no_defs  <>
+<4231> +proj=longlat +ellps=intl +towgs84=-83.11,-97.38,-117.22,0.00569290865241986,-0.0446975835137458,0.0442850539012516,0.1218 +no_defs  <>
 # Fahud
 <4232> +proj=longlat +ellps=clrk80 +towgs84=-346,-1,224,0,0,0,0 +no_defs  <>
 # Gandajika 1970
@@ -417,13 +417,13 @@
 # Padang
 <4280> +proj=longlat +ellps=bessel +no_defs  <>
 # Palestine 1923
-<4281> +proj=longlat +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +no_defs  <>
+<4281> +proj=longlat +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +no_defs  <>
 # Pointe Noire
 <4282> +proj=longlat +a=6378249.2 +b=6356515 +towgs84=-148,51,-291,0,0,0,0 +no_defs  <>
 # GDA94
 <4283> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # Pulkovo 1942
-<4284> +proj=longlat +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +no_defs  <>
+<4284> +proj=longlat +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +no_defs  <>
 # Qatar 1974
 <4285> +proj=longlat +ellps=intl +towgs84=-128.16,-282.42,21.93,0,0,0,0 +no_defs  <>
 # Qatar 1948
@@ -433,7 +433,7 @@
 # Loma Quintana
 <4288> +proj=longlat +ellps=intl +no_defs  <>
 # Amersfoort
-<4289> +proj=longlat +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +no_defs  <>
+<4289> +proj=longlat +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +no_defs  <>
 # SAD69
 <4291> +proj=longlat +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +no_defs  <>
 # Sapper Hill 1943
@@ -465,7 +465,7 @@
 # Bern 1938
 <4306> +proj=longlat +ellps=bessel +no_defs  <>
 # Nord Sahara 1959
-<4307> +proj=longlat +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +no_defs  <>
+<4307> +proj=longlat +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +no_defs  <>
 # RT38
 <4308> +proj=longlat +ellps=bessel +no_defs  <>
 # Yacare
@@ -477,7 +477,7 @@
 # MGI
 <4312> +proj=longlat +datum=hermannskogel +no_defs  <>
 # Belge 1972
-<4313> +proj=longlat +ellps=intl +towgs84=-106.869,52.2978,-103.724,0.3366,-0.457,1.8422,-1.2747 +no_defs  <>
+<4313> +proj=longlat +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +no_defs  <>
 # DHDN
 <4314> +proj=longlat +datum=potsdam +no_defs  <>
 # Conakry 1905
@@ -533,13 +533,13 @@
 # Xian 1980
 <4610> +proj=longlat +a=6378140 +b=6356755.288157528 +no_defs  <>
 # Hong Kong 1980
-<4611> +proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +no_defs  <>
+<4611> +proj=longlat +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.243649,-1.158827,-1.094246 +no_defs  <>
 # JGD2000
 <4612> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # Segara
 <4613> +proj=longlat +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +no_defs  <>
 # QND95
-<4614> +proj=longlat +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +no_defs  <>
+<4614> +proj=longlat +ellps=intl +towgs84=-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065 +no_defs  <>
 # Porto Santo
 <4615> +proj=longlat +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +no_defs  <>
 # Selvagem Grande
@@ -597,7 +597,7 @@
 # ST84 Ile des Pins
 <4642> +proj=longlat +ellps=intl +towgs84=-13,-348,292,0,0,0,0 +no_defs  <>
 # ST71 Belep
-<4643> +proj=longlat +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7 +no_defs  <>
+<4643> +proj=longlat +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7002 +no_defs  <>
 # NEA74 Noumea
 <4644> +proj=longlat +ellps=intl +towgs84=-10.18,-350.43,291.37,0,0,0,0 +no_defs  <>
 # RGNC 1991
@@ -611,7 +611,7 @@
 # ISN93
 <4659> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # Helle 1954
-<4660> +proj=longlat +ellps=intl +towgs84=982.609,552.753,-540.873,6.68163,-31.6115,-19.8482,16.805 +no_defs  <>
+<4660> +proj=longlat +ellps=intl +towgs84=982.6087,552.753,-540.873,6.68162662527694,-31.6114924086422,-19.8481610048168,16.805 +no_defs  <>
 # LKS92
 <4661> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # IGN72 Grande Terre
@@ -637,7 +637,7 @@
 # Chatham Islands 1971
 <4672> +proj=longlat +ellps=intl +towgs84=175,-38,113,0,0,0,0 +no_defs  <>
 # Chatham Islands 1979
-<4673> +proj=longlat +ellps=intl +towgs84=174.05,-25.49,112.57,-0,-0,0.554,0.2263 +no_defs  <>
+<4673> +proj=longlat +ellps=intl +towgs84=174.05,-25.49,112.57,0,0,0.554,0.2263 +no_defs  <>
 # SIRGAS 2000
 <4674> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # Guam 1963
@@ -667,7 +667,7 @@
 # RGPF
 <4687> +proj=longlat +ellps=GRS80 +towgs84=0.072,-0.507,-0.245,-0.0183,0.0003,-0.007,-0.0093 +no_defs  <>
 # Fatu Iva 72
-<4688> +proj=longlat +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +no_defs  <>
+<4688> +proj=longlat +ellps=intl +towgs84=347.103,1078.125,2623.922,-33.8875,70.6773,-9.3943,186.074 +no_defs  <>
 # IGN63 Hiva Oa
 <4689> +proj=longlat +ellps=intl +towgs84=410.721,55.049,80.746,2.5779,2.3514,0.6664,17.3311 +no_defs  <>
 # Tahiti 79
@@ -771,7 +771,7 @@
 # Hong Kong 1963(67)
 <4739> +proj=longlat +ellps=intl +towgs84=-156,-271,-189,0,0,0,0 +no_defs  <>
 # PZ-90
-<4740> +proj=longlat +a=6378136 +b=6356751.361745712 +towgs84=0,0,1.5,-0,-0,0.076,0 +no_defs  <>
+<4740> +proj=longlat +a=6378136 +b=6356751.361745712 +towgs84=0,0,1.5,0,0,0.076,0 +no_defs  <>
 # FD54
 <4741> +proj=longlat +ellps=intl +no_defs  <>
 # GDM2000
@@ -799,7 +799,7 @@
 # fk89
 <4753> +proj=longlat +ellps=intl +no_defs  <>
 # LGD2006
-<4754> +proj=longlat +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +no_defs  <>
+<4754> +proj=longlat +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +no_defs  <>
 # DGN95
 <4755> +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # VN-2000
@@ -857,7 +857,7 @@
 # S-JTSK (Ferro)
 <4818> +proj=longlat +ellps=bessel +towgs84=589,76,480,0,0,0,0 +pm=ferro +no_defs  <>
 # Nord Sahara 1959 (Paris)
-<4819> +proj=longlat +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +pm=paris +no_defs  <>
+<4819> +proj=longlat +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +pm=paris +no_defs  <>
 # Segara (Jakarta)
 <4820> +proj=longlat +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +pm=jakarta +no_defs  <>
 # Voirol 1879 (Paris)
@@ -883,7 +883,7 @@
 # S-JTSK/05 (Ferro)
 <5229> +proj=longlat +ellps=bessel +towgs84=572.213,85.334,461.94,4.9732,1.529,5.2484,3.5378 +pm=ferro +no_defs  <>
 # SLD99
-<5233> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=-0.293,766.95,87.713,0.195704,1.69507,3.47302,-0.039338 +no_defs  <>
+<5233> +proj=longlat +a=6377276.345 +b=6356075.41314024 +towgs84=-0.293,766.95,87.713,0.195704,1.695068,3.473016,-0.039338 +no_defs  <>
 # GDBD2009
 <5246> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # TUREF
@@ -923,7 +923,7 @@
 # PNG94
 <5546> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # UCS-2000
-<5561> +proj=longlat +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +no_defs  <>
+<5561> +proj=longlat +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +no_defs  <>
 # FEH2010
 <5593> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs  <>
 # DB_REF
@@ -1085,31 +1085,31 @@
 # Naparima 1955 / UTM zone 20N
 <2067> +proj=utm +zone=20 +ellps=intl +towgs84=-0.465,372.095,171.736,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 5
-<2068> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2068> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 6
-<2069> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2069> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 7
-<2070> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2070> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 8
-<2071> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2071> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 9
-<2072> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2072> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 10
-<2073> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2073> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 11
-<2074> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2074> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 12
-<2075> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2075> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / Libya zone 13
-<2076> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2076> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.9999 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / UTM zone 32N
-<2077> +proj=utm +zone=32 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2077> +proj=utm +zone=32 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / UTM zone 33N
-<2078> +proj=utm +zone=33 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2078> +proj=utm +zone=33 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / UTM zone 34N
-<2079> +proj=utm +zone=34 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2079> +proj=utm +zone=34 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # ELD79 / UTM zone 35N
-<2080> +proj=utm +zone=35 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2080> +proj=utm +zone=35 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # Chos Malal 1914 / Argentina 2
 <2081> +proj=tmerc +lat_0=-90 +lon_0=-69 +k=1 +x_0=2500000 +y_0=0 +ellps=intl +units=m +no_defs  <>
 # Pampa del Castillo / Argentina 2
@@ -1123,7 +1123,7 @@
 # NAD27 / Cuba Sur (deprecated)
 <2086> +proj=lcc +lat_1=20.71666666666667 +lat_0=20.71666666666667 +lon_0=-76.83333333333333 +k_0=0.99994848 +x_0=500000 +y_0=229126.939 +datum=NAD27 +units=m +no_defs  <>
 # ELD79 / TM 12 NE
-<2087> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-115.854,-99.0583,-152.462,0,0,0,0 +units=m +no_defs  <>
+<2087> +proj=tmerc +lat_0=0 +lon_0=12 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-115.8543,-99.0583,-152.4616,0,0,0,0 +units=m +no_defs  <>
 # Carthage / TM 11 NE
 <2088> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.9996 +x_0=500000 +y_0=0 +datum=carthage +units=m +no_defs  <>
 # Yemen NGN96 / UTM zone 38N
@@ -1287,7 +1287,7 @@
 # Pulkovo 1942(83) / Gauss Kruger zone 5 (deprecated)
 <2168> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=26,-121,-78,0,0,0,0 +units=m +no_defs  <>
 # Luxembourg 1930 / Gauss
-<2169> +proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-189.681,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +units=m +no_defs  <>
+<2169> +proj=tmerc +lat_0=49.83333333333334 +lon_0=6.166666666666667 +k=1 +x_0=80000 +y_0=100000 +ellps=intl +towgs84=-189.6806,18.3463,-42.7695,-0.33746,-3.09264,2.53861,0.4598 +units=m +no_defs  <>
 # MGI / Slovenia Grid (deprecated)
 <2170> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.9999 +x_0=500000 +y_0=0 +datum=hermannskogel +units=m +no_defs  <>
 # Pulkovo 1942(58) / Poland zone I (deprecated)
@@ -1599,7 +1599,7 @@
 # ED50 / TM45
 <2325> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs  <>
 # Hong Kong 1980 Grid System
-<2326> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.24365,-1.15883,-1.09425 +units=m +no_defs  <>
+<2326> +proj=tmerc +lat_0=22.31213333333334 +lon_0=114.1785555555556 +k=1 +x_0=836694.05 +y_0=819069.8 +ellps=intl +towgs84=-162.619,-276.959,-161.764,0.067753,-2.243649,-1.158827,-1.094246 +units=m +no_defs  <>
 # Xian 1980 / Gauss-Kruger zone 13
 <2327> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs  <>
 # Xian 1980 / Gauss-Kruger zone 14
@@ -1873,597 +1873,597 @@
 # Albanian 1987 / Gauss-Kruger zone 4
 <2462> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 21E
-<2463> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2463> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 27E
-<2464> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2464> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 33E
-<2465> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2465> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 39E
-<2466> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2466> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 45E
-<2467> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2467> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 51E
-<2468> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2468> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 57E
-<2469> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2469> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 63E
-<2470> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2470> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 69E
-<2471> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2471> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 75E
-<2472> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2472> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 81E
-<2473> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2473> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 87E
-<2474> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2474> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 93E
-<2475> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2475> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 99E
-<2476> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2476> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 105E
-<2477> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2477> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 111E
-<2478> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2478> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 117E
-<2479> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2479> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 123E
-<2480> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2480> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 129E
-<2481> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2481> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 135E
-<2482> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2482> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 141E
-<2483> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2483> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 147E
-<2484> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2484> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 153E
-<2485> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2485> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 159E
-<2486> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2486> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 165E
-<2487> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2487> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 171E
-<2488> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2488> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 177E
-<2489> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2489> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 177W
-<2490> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2490> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger CM 171W
-<2491> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2491> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 9E (deprecated)
-<2492> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2492> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 15E (deprecated)
-<2493> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2493> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 21E
-<2494> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2494> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 27E
-<2495> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2495> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 33E
-<2496> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2496> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 39E
-<2497> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2497> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 45E
-<2498> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2498> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 51E
-<2499> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2499> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 57E
-<2500> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2500> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 63E
-<2501> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2501> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 69E
-<2502> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2502> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 75E
-<2503> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2503> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 81E
-<2504> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2504> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 87E
-<2505> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2505> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 93E
-<2506> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2506> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 99E
-<2507> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2507> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 105E
-<2508> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2508> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 111E
-<2509> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2509> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 117E
-<2510> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2510> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 123E
-<2511> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2511> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 129E
-<2512> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2512> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 135E
-<2513> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2513> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 141E
-<2514> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2514> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 147E
-<2515> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2515> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 153E
-<2516> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2516> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 159E
-<2517> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2517> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 165E
-<2518> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2518> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 171E
-<2519> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2519> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 177E
-<2520> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2520> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 177W
-<2521> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2521> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger CM 171W
-<2522> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2522> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 7
-<2523> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2523> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 8
-<2524> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2524> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 9
-<2525> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2525> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 10
-<2526> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2526> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 11
-<2527> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2527> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 12
-<2528> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2528> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 13
-<2529> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2529> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 14
-<2530> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2530> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 15
-<2531> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2531> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 16
-<2532> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2532> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 17
-<2533> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2533> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 18
-<2534> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2534> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 19
-<2535> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2535> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 20
-<2536> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2536> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 21
-<2537> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2537> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 22
-<2538> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2538> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 23
-<2539> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2539> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 24
-<2540> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2540> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 25
-<2541> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2541> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 26
-<2542> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2542> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 27
-<2543> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2543> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 28
-<2544> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2544> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 29
-<2545> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2545> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 30
-<2546> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2546> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 31
-<2547> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2547> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 32
-<2548> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2548> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 33
-<2549> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2549> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Samboja / UTM zone 50S (deprecated)
 <2550> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-404.78,685.68,45.47,0,0,0,0 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 34
-<2551> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2551> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 35
-<2552> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2552> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 36
-<2553> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2553> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 37
-<2554> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2554> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 38
-<2555> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2555> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 39
-<2556> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2556> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 40
-<2557> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2557> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 41
-<2558> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2558> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 42
-<2559> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2559> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 43
-<2560> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2560> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 44
-<2561> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2561> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 45
-<2562> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2562> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 46
-<2563> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2563> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 47
-<2564> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2564> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 48
-<2565> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2565> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 49
-<2566> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2566> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 50
-<2567> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2567> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 51
-<2568> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2568> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 52
-<2569> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2569> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 53
-<2570> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2570> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 54
-<2571> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2571> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 55
-<2572> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2572> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 56
-<2573> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2573> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 57
-<2574> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2574> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 58
-<2575> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2575> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 59
-<2576> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2576> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 (deprecated)
-<2577> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2577> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 61
-<2578> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2578> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 62
-<2579> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2579> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 63
-<2580> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2580> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 64
-<2581> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2581> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E
-<2582> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2582> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E
-<2583> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2583> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E
-<2584> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2584> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E
-<2585> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2585> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E
-<2586> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2586> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E
-<2587> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2587> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E
-<2588> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2588> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E
-<2589> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2589> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E
-<2590> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2590> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E
-<2591> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2591> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E
-<2592> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2592> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E
-<2593> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2593> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E
-<2594> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2594> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E
-<2595> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2595> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E
-<2596> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2596> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E
-<2597> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2597> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E
-<2598> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2598> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E
-<2599> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2599> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Lietuvos Koordinoei Sistema 1994 (deprecated)
 <2600> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9998 +x_0=500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E
-<2601> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2601> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E
-<2602> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2602> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E
-<2603> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2603> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E
-<2604> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2604> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E
-<2605> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2605> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E
-<2606> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2606> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E
-<2607> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2607> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E
-<2608> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2608> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E
-<2609> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2609> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E
-<2610> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2610> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E
-<2611> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2611> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E
-<2612> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2612> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E
-<2613> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2613> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E
-<2614> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2614> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E
-<2615> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2615> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E
-<2616> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2616> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E
-<2617> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2617> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E
-<2618> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2618> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E
-<2619> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2619> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E
-<2620> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2620> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E
-<2621> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2621> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E
-<2622> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2622> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E
-<2623> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2623> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E
-<2624> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2624> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E
-<2625> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2625> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E
-<2626> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2626> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E
-<2627> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2627> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E
-<2628> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2628> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E
-<2629> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2629> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E
-<2630> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2630> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E
-<2631> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2631> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E
-<2632> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2632> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E
-<2633> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2633> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E
-<2634> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2634> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E
-<2635> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2635> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E
-<2636> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2636> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W
-<2637> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2637> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W
-<2638> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2638> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W
-<2639> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2639> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W
-<2640> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2640> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 7
-<2641> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2641> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 8
-<2642> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2642> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 9
-<2643> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2643> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 10
-<2644> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2644> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 11
-<2645> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2645> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 12
-<2646> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2646> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 13
-<2647> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2647> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 14
-<2648> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2648> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 15
-<2649> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2649> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 16
-<2650> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2650> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 17
-<2651> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2651> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 18
-<2652> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2652> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 19
-<2653> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2653> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 20
-<2654> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2654> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 21
-<2655> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2655> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 22
-<2656> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2656> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 23
-<2657> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2657> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 24
-<2658> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2658> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 25
-<2659> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2659> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 26
-<2660> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2660> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 27
-<2661> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2661> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 28
-<2662> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2662> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 29
-<2663> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2663> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 30
-<2664> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2664> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 31
-<2665> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2665> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 32
-<2666> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2666> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 33
-<2667> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2667> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=33500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 34
-<2668> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2668> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=34500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 35
-<2669> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2669> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=35500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 36
-<2670> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2670> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=36500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 37
-<2671> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2671> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 38
-<2672> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2672> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=38500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 39
-<2673> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2673> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 40
-<2674> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2674> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=40500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 41
-<2675> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2675> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=41500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 42
-<2676> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2676> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=42500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 43
-<2677> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2677> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=43500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 44
-<2678> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2678> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=44500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 45
-<2679> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2679> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=45500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 46
-<2680> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2680> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=46500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 47
-<2681> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2681> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=47500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 48
-<2682> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2682> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=48500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 49
-<2683> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2683> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=49500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 50
-<2684> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2684> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=50500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 51
-<2685> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2685> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=51500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 52
-<2686> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2686> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=52500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 53
-<2687> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2687> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=53500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 54
-<2688> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2688> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=54500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 55
-<2689> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2689> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=55500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 56
-<2690> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2690> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=56500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 57
-<2691> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2691> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=57500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 58
-<2692> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2692> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=58500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 59
-<2693> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2693> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=59500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 (deprecated)
-<2694> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2694> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60000000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 61
-<2695> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2695> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=61500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 62
-<2696> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2696> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=62500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 63
-<2697> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2697> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=63500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 64
-<2698> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2698> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=64500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E
-<2699> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2699> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E
-<2700> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2700> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E
-<2701> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2701> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E
-<2702> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2702> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E
-<2703> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2703> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E
-<2704> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2704> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E
-<2705> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2705> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E
-<2706> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2706> +proj=tmerc +lat_0=0 +lon_0=42 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E
-<2707> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2707> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E
-<2708> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2708> +proj=tmerc +lat_0=0 +lon_0=48 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E
-<2709> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2709> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E
-<2710> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2710> +proj=tmerc +lat_0=0 +lon_0=54 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E
-<2711> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2711> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E
-<2712> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2712> +proj=tmerc +lat_0=0 +lon_0=60 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E
-<2713> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2713> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E
-<2714> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2714> +proj=tmerc +lat_0=0 +lon_0=66 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E
-<2715> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2715> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E
-<2716> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2716> +proj=tmerc +lat_0=0 +lon_0=72 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E
-<2717> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2717> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E
-<2718> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2718> +proj=tmerc +lat_0=0 +lon_0=78 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E
-<2719> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2719> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E
-<2720> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2720> +proj=tmerc +lat_0=0 +lon_0=84 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E
-<2721> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2721> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E
-<2722> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2722> +proj=tmerc +lat_0=0 +lon_0=90 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E
-<2723> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2723> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E
-<2724> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2724> +proj=tmerc +lat_0=0 +lon_0=96 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E
-<2725> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2725> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E
-<2726> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2726> +proj=tmerc +lat_0=0 +lon_0=102 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E
-<2727> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2727> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E
-<2728> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2728> +proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E
-<2729> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2729> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E
-<2730> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2730> +proj=tmerc +lat_0=0 +lon_0=114 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E
-<2731> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2731> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E
-<2732> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2732> +proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E
-<2733> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2733> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E
-<2734> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2734> +proj=tmerc +lat_0=0 +lon_0=126 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E
-<2735> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2735> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Tete / UTM zone 36S
 <2736> +proj=utm +zone=36 +south +ellps=clrk66 +towgs84=-73.472,-51.66,-112.482,0.953,4.6,-2.368,0.586 +units=m +no_defs  <>
 # Tete / UTM zone 37S
 <2737> +proj=utm +zone=37 +south +ellps=clrk66 +towgs84=-73.472,-51.66,-112.482,0.953,4.6,-2.368,0.586 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E
-<2738> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2738> +proj=tmerc +lat_0=0 +lon_0=132 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E
-<2739> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2739> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E
-<2740> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2740> +proj=tmerc +lat_0=0 +lon_0=138 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E
-<2741> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2741> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E
-<2742> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2742> +proj=tmerc +lat_0=0 +lon_0=144 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E
-<2743> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2743> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E
-<2744> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2744> +proj=tmerc +lat_0=0 +lon_0=150 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E
-<2745> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2745> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E
-<2746> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2746> +proj=tmerc +lat_0=0 +lon_0=156 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E
-<2747> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2747> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E
-<2748> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2748> +proj=tmerc +lat_0=0 +lon_0=162 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E
-<2749> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2749> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E
-<2750> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2750> +proj=tmerc +lat_0=0 +lon_0=168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E
-<2751> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2751> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E
-<2752> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2752> +proj=tmerc +lat_0=0 +lon_0=174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E
-<2753> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2753> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E
-<2754> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2754> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W
-<2755> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2755> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W
-<2756> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2756> +proj=tmerc +lat_0=0 +lon_0=-174 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W
-<2757> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2757> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W
-<2758> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<2758> +proj=tmerc +lat_0=0 +lon_0=-168 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # NAD83(HARN) / Alabama East
 <2759> +proj=tmerc +lat_0=30.5 +lon_0=-85.83333333333333 +k=0.99996 +x_0=200000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # NAD83(HARN) / Alabama West
@@ -2811,25 +2811,25 @@
 # Beduaram / TM 13 NE
 <2931> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.9996 +x_0=500000 +y_0=0 +a=6378249.2 +b=6356515 +towgs84=-106,-87,188,0,0,0,0 +units=m +no_defs  <>
 # QND95 / Qatar National Grid
-<2932> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.425,-303.659,-11.0006,1.1643,0.174458,1.09626,3.65706 +units=m +no_defs  <>
+<2932> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065 +units=m +no_defs  <>
 # Segara / UTM zone 50S
 <2933> +proj=utm +zone=50 +south +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +units=m +no_defs  <>
 # Segara (Jakarta) / NEIEZ (deprecated)
 <2934> +proj=merc +lon_0=110 +k=0.997 +x_0=3900000 +y_0=900000 +ellps=bessel +towgs84=-403,684,41,0,0,0,0 +pm=jakarta +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone A1
-<2935> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1 +x_0=1300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2935> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=41.53333333333333 +k=1 +x_0=1300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone A2
-<2936> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2936> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=44.53333333333333 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone A3
-<2937> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2937> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=47.53333333333333 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone A4
-<2938> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2938> +proj=tmerc +lat_0=0.1166666666666667 +lon_0=50.53333333333333 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone K2
-<2939> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2939> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=50.76666666666667 +k=1 +x_0=2300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone K3
-<2940> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2940> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=53.76666666666667 +k=1 +x_0=3300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone K4
-<2941> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<2941> +proj=tmerc +lat_0=0.1333333333333333 +lon_0=56.76666666666667 +k=1 +x_0=4300000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Porto Santo / UTM zone 28N
 <2942> +proj=utm +zone=28 +ellps=intl +towgs84=-499,-249,314,0,0,0,0 +units=m +no_defs  <>
 # Selvagem Grande / UTM zone 28N
@@ -2942,7 +2942,7 @@
 # ST84 Ile des Pins / UTM zone 58S
 <2996> +proj=utm +zone=58 +south +ellps=intl +towgs84=-13,-348,292,0,0,0,0 +units=m +no_defs  <>
 # ST71 Belep / UTM zone 58S
-<2997> +proj=utm +zone=58 +south +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7 +units=m +no_defs  <>
+<2997> +proj=utm +zone=58 +south +ellps=intl +towgs84=-480.26,-438.32,-643.429,16.3119,20.1721,-4.0349,-111.7002 +units=m +no_defs  <>
 # NEA74 Noumea / UTM zone 58S
 <2998> +proj=utm +zone=58 +south +ellps=intl +towgs84=-10.18,-350.43,291.37,0,0,0,0 +units=m +no_defs  <>
 # Grand Comoros / UTM zone 38S
@@ -3020,9 +3020,9 @@
 # ETRS89 / LAEA Europe
 <3035> +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # Moznet / UTM zone 36S
-<3036> +proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs  <>
+<3036> +proj=utm +zone=36 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # Moznet / UTM zone 37S
-<3037> +proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs  <>
+<3037> +proj=utm +zone=37 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # ETRS89 / TM26 (deprecated)
 <3038> +proj=utm +zone=26 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # ETRS89 / TM27 (deprecated)
@@ -3066,7 +3066,7 @@
 # ISN93 / Lambert 1993
 <3057> +proj=lcc +lat_1=64.25 +lat_2=65.75 +lat_0=65 +lon_0=-19 +x_0=500000 +y_0=500000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # Helle 1954 / Jan Mayen Grid
-<3058> +proj=tmerc +lat_0=0 +lon_0=-8.5 +k=1 +x_0=50000 +y_0=-7800000 +ellps=intl +towgs84=982.609,552.753,-540.873,6.68163,-31.6115,-19.8482,16.805 +units=m +no_defs  <>
+<3058> +proj=tmerc +lat_0=0 +lon_0=-8.5 +k=1 +x_0=50000 +y_0=-7800000 +ellps=intl +towgs84=982.6087,552.753,-540.873,6.68162662527694,-31.6114924086422,-19.8481610048168,16.805 +units=m +no_defs  <>
 # LKS92 / Latvia TM
 <3059> +proj=tmerc +lat_0=0 +lon_0=24 +k=0.9996 +x_0=500000 +y_0=-6000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # IGN72 Grande Terre / UTM zone 58S
@@ -3245,17 +3245,17 @@
 # Unable to translate coordinate system EPSG:3145 into PROJ.4 format.
 #
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 6 (deprecated)
-<3146> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3146> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger CM 18E (deprecated)
-<3147> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3147> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Indian 1960 / UTM zone 48N
 <3148> +proj=utm +zone=48 +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +units=m +no_defs  <>
 # Indian 1960 / UTM zone 49N
 <3149> +proj=utm +zone=49 +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 6 (deprecated)
-<3150> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<3150> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger CM 18E (deprecated)
-<3151> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<3151> +proj=tmerc +lat_0=0 +lon_0=18 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # ST74
 <3152> +proj=tmerc +lat_0=0 +lon_0=18.05779 +k=0.99999425 +x_0=100178.1808 +y_0=-6500614.7836 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # NAD83(CSRS) / BC Albers
@@ -3308,7 +3308,7 @@
 # Indian 1960 / TM 106 NE
 <3176> +proj=tmerc +lat_0=0 +lon_0=106 +k=0.9996 +x_0=500000 +y_0=0 +a=6377276.345 +b=6356075.41314024 +towgs84=198,881,317,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM
-<3177> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9965000000000001 +x_0=1000000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3177> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.9965000000000001 +x_0=1000000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # GR96 / UTM zone 18N
 <3178> +proj=utm +zone=18 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # GR96 / UTM zone 19N
@@ -3334,33 +3334,33 @@
 # GR96 / UTM zone 29N
 <3189> +proj=utm +zone=29 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 5
-<3190> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3190> +proj=tmerc +lat_0=0 +lon_0=9 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 6
-<3191> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3191> +proj=tmerc +lat_0=0 +lon_0=11 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 7
-<3192> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3192> +proj=tmerc +lat_0=0 +lon_0=13 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 8
-<3193> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3193> +proj=tmerc +lat_0=0 +lon_0=15 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 9
-<3194> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3194> +proj=tmerc +lat_0=0 +lon_0=17 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 10
-<3195> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3195> +proj=tmerc +lat_0=0 +lon_0=19 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 11
-<3196> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3196> +proj=tmerc +lat_0=0 +lon_0=21 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 12
-<3197> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3197> +proj=tmerc +lat_0=0 +lon_0=23 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / Libya TM zone 13
-<3198> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3198> +proj=tmerc +lat_0=0 +lon_0=25 +k=0.99995 +x_0=200000 +y_0=0 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / UTM zone 32N
-<3199> +proj=utm +zone=32 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3199> +proj=utm +zone=32 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # FD58 / Iraq zone
 <3200> +proj=lcc +lat_1=32.5 +lat_0=32.5 +lon_0=45 +k_0=0.9987864078000001 +x_0=1500000 +y_0=1166200 +ellps=clrk80 +towgs84=-241.54,-163.64,396.06,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / UTM zone 33N
-<3201> +proj=utm +zone=33 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3201> +proj=utm +zone=33 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / UTM zone 34N
-<3202> +proj=utm +zone=34 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3202> +proj=utm +zone=34 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # LGD2006 / UTM zone 35N
-<3203> +proj=utm +zone=35 +ellps=intl +towgs84=-208.406,-109.878,-2.5764,0,0,0,0 +units=m +no_defs  <>
+<3203> +proj=utm +zone=35 +ellps=intl +towgs84=-208.4058,-109.8777,-2.5764,0,0,0,0 +units=m +no_defs  <>
 # WGS 84 / SCAR IMW SP19-20
 <3204> +proj=lcc +lat_1=-60.66666666666666 +lat_2=-63.33333333333334 +lat_0=-90 +lon_0=-66 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs  <>
 # WGS 84 / SCAR IMW SP21-22
@@ -3561,7 +3561,7 @@
 # IGN63 Hiva Oa / UTM zone 7S
 <3302> +proj=utm +zone=7 +south +ellps=intl +towgs84=410.721,55.049,80.746,2.5779,2.3514,0.6664,17.3311 +units=m +no_defs  <>
 # Fatu Iva 72 / UTM zone 7S
-<3303> +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.12,2623.92,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs  <>
+<3303> +proj=utm +zone=7 +south +ellps=intl +towgs84=347.103,1078.125,2623.922,-33.8875,70.6773,-9.3943,186.074 +units=m +no_defs  <>
 # Tahiti 79 / UTM zone 6S
 <3304> +proj=utm +zone=6 +south +ellps=intl +towgs84=221.525,152.948,176.768,-2.3847,-1.3896,-0.877,11.4741 +units=m +no_defs  <>
 # Moorea 87 / UTM zone 6S
@@ -3655,11 +3655,11 @@
 # WGS 84 / PDC Mercator (deprecated)
 <3349> +proj=merc +lon_0=-150 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone C0
-<3350> +proj=tmerc +lat_0=0.1 +lon_0=21.95 +k=1 +x_0=250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3350> +proj=tmerc +lat_0=0.1 +lon_0=21.95 +k=1 +x_0=250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone C1
-<3351> +proj=tmerc +lat_0=0.1 +lon_0=24.95 +k=1 +x_0=1250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3351> +proj=tmerc +lat_0=0.1 +lon_0=24.95 +k=1 +x_0=1250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / CS63 zone C2
-<3352> +proj=tmerc +lat_0=0.1 +lon_0=27.95 +k=1 +x_0=2250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3352> +proj=tmerc +lat_0=0.1 +lon_0=27.95 +k=1 +x_0=2250000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Mhast (onshore) / UTM zone 32S
 <3353> +proj=utm +zone=32 +south +ellps=intl +units=m +no_defs  <>
 # Mhast (offshore) / UTM zone 32S
@@ -3731,11 +3731,11 @@
 # KKJ / Finland zone 5
 <3387> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=5500000 +y_0=0 +ellps=intl +towgs84=-96.062,-82.428,-121.753,4.801,0.345,-1.376,1.496 +units=m +no_defs  <>
 # Pulkovo 1942 / Caspian Sea Mercator
-<3388> +proj=merc +lon_0=51 +lat_ts=42 +x_0=0 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3388> +proj=merc +lon_0=51 +lat_ts=42 +x_0=0 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / 3-degree Gauss-Kruger zone 60
-<3389> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<3389> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1995 / 3-degree Gauss-Kruger zone 60
-<3390> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<3390> +proj=tmerc +lat_0=0 +lon_0=180 +k=1 +x_0=60500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Karbala 1979 / UTM zone 37N
 <3391> +proj=utm +zone=37 +ellps=clrk80 +towgs84=70.995,-335.916,262.898,0,0,0,0 +units=m +no_defs  <>
 # Karbala 1979 / UTM zone 38N
@@ -3833,9 +3833,9 @@
 # NAD83 / Rhode Island (ftUS)
 <3438> +proj=tmerc +lat_0=41.08333333333334 +lon_0=-71.5 +k=0.99999375 +x_0=99999.99998983997 +y_0=0 +datum=NAD83 +units=us-ft +no_defs  <>
 # PSD93 / UTM zone 39N
-<3439> +proj=utm +zone=39 +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.7101 +units=m +no_defs  <>
+<3439> +proj=utm +zone=39 +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +units=m +no_defs  <>
 # PSD93 / UTM zone 40N
-<3440> +proj=utm +zone=40 +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.7101 +units=m +no_defs  <>
+<3440> +proj=utm +zone=40 +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +units=m +no_defs  <>
 # NAD83(HARN) / Arkansas North (ftUS)
 <3441> +proj=lcc +lat_1=36.23333333333333 +lat_2=34.93333333333333 +lat_0=34.33333333333334 +lon_0=-92 +x_0=399999.99998984 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs  <>
 # NAD83(HARN) / Arkansas South (ftUS)
@@ -5333,7 +5333,7 @@
 # Kandawala / Sri Lanka Grid
 <5234> +proj=tmerc +lat_0=7.000480277777778 +lon_0=80.77171111111112 +k=0.9999238418 +x_0=200000 +y_0=200000 +a=6377276.345 +b=6356075.41314024 +towgs84=-97,787,86,0,0,0,0 +units=m +no_defs  <>
 # SLD99 / Sri Lanka Grid 1999
-<5235> +proj=tmerc +lat_0=7.000471527777778 +lon_0=80.77171308333334 +k=0.9999238418 +x_0=500000 +y_0=500000 +a=6377276.345 +b=6356075.41314024 +towgs84=-0.293,766.95,87.713,0.195704,1.69507,3.47302,-0.039338 +units=m +no_defs  <>
+<5235> +proj=tmerc +lat_0=7.000471527777778 +lon_0=80.77171308333334 +k=0.9999238418 +x_0=500000 +y_0=500000 +a=6377276.345 +b=6356075.41314024 +towgs84=-0.293,766.95,87.713,0.195704,1.695068,3.473016,-0.039338 +units=m +no_defs  <>
 # ETRS89 / LCC Germany (E-N)
 <5243> +proj=lcc +lat_1=48.66666666666666 +lat_2=53.66666666666666 +lat_0=51 +lon_0=10.5 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # GDBD2009 / Brunei BRSO
@@ -5507,7 +5507,7 @@
 # CI1971 / Chatham Islands Map Grid
 <5518> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=350000 +y_0=650000 +ellps=intl +towgs84=175,-38,113,0,0,0,0 +units=m +no_defs  <>
 # CI1979 / Chatham Islands Map Grid
-<5519> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=350000 +y_0=650000 +ellps=intl +towgs84=174.05,-25.49,112.57,-0,-0,0.554,0.2263 +units=m +no_defs  <>
+<5519> +proj=tmerc +lat_0=-44 +lon_0=-176.5 +k=1 +x_0=350000 +y_0=650000 +ellps=intl +towgs84=174.05,-25.49,112.57,0,0,0.554,0.2263 +units=m +no_defs  <>
 # DHDN / 3-degree Gauss-Kruger zone 1
 <5520> +proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +datum=potsdam +units=m +no_defs  <>
 # WGS 84 / Gabon TM 2011
@@ -5541,49 +5541,49 @@
 # Ocotepeque 1935 / Guatemala Norte
 <5559> +proj=lcc +lat_1=16.81666666666667 +lat_0=16.81666666666667 +lon_0=-90.33333333333333 +k_0=0.99992226 +x_0=500000 +y_0=292209.579 +ellps=clrk66 +towgs84=205,96,-98,0,0,0,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger zone 4
-<5562> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5562> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger zone 5
-<5563> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5563> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger zone 6
-<5564> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5564> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger zone 7
-<5565> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5565> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger CM 21E
-<5566> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5566> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger CM 27E
-<5567> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5567> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger CM 33E
-<5568> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5568> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Gauss-Kruger CM 39E
-<5569> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5569> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 7 (deprecated)
-<5570> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5570> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 8 (deprecated)
-<5571> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5571> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 9 (deprecated)
-<5572> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5572> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 10 (deprecated)
-<5573> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5573> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 11 (deprecated)
-<5574> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5574> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 12 (deprecated)
-<5575> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5575> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger zone 13 (deprecated)
-<5576> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5576> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 21E (deprecated)
-<5577> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5577> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 24E (deprecated)
-<5578> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5578> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 27E (deprecated)
-<5579> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5579> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 30E (deprecated)
-<5580> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5580> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 33E (deprecated)
-<5581> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5581> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 36E (deprecated)
-<5582> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5582> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / 3-degree Gauss-Kruger CM 39E (deprecated)
-<5583> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<5583> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # NAD27 / New Brunswick Stereographic (NAD27)
 <5588> +proj=sterea +lat_0=46.5 +lon_0=-66.5 +k=0.999912 +x_0=304800 +y_0=304800 +datum=NAD27 +units=ft +no_defs  <>
 # Sibun Gorge 1922 / Colony Grid
@@ -5599,7 +5599,7 @@
 # ED50 / TM 6 NE
 <5627> +proj=tmerc +lat_0=0 +lon_0=6 +k=0.9996 +x_0=500000 +y_0=0 +ellps=intl +towgs84=-87,-98,-121,0,0,0,0 +units=m +no_defs  <>
 # Moznet / UTM zone 38S
-<5629> +proj=utm +zone=38 +south +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +units=m +no_defs  <>
+<5629> +proj=utm +zone=38 +south +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # Pulkovo 1942(58) / Gauss-Kruger zone 2 (E-N)
 <5631> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84 +units=m +no_defs  <>
 # PTRA08 / LCC Europe
@@ -6109,19 +6109,19 @@
 # Mexico ITRF2008 / LCC
 <6372> +proj=lcc +lat_1=17.5 +lat_2=29.5 +lat_0=12 +lon_0=-102 +x_0=2500000 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 7
-<6381> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6381> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 8
-<6382> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6382> +proj=tmerc +lat_0=0 +lon_0=24 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 9
-<6383> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6383> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 10
-<6384> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6384> +proj=tmerc +lat_0=0 +lon_0=30 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 11
-<6385> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6385> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 12
-<6386> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6386> +proj=tmerc +lat_0=0 +lon_0=36 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # UCS-2000 / Ukraine TM zone 13
-<6387> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,-0,0.35,0.736,0 +units=m +no_defs  <>
+<6387> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=300000 +y_0=0 +ellps=krass +towgs84=25,-141,-78.5,0,0.35,0.736,0 +units=m +no_defs  <>
 # Cayman Islands National Grid 2011
 <6391> +proj=lcc +lat_1=19.33333333333333 +lat_2=19.7 +lat_0=19.33333333333333 +lon_0=-80.56666666666666 +x_0=899160 +y_0=579120 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=ft +no_defs  <>
 # NAD83(2011) / Alaska Albers
@@ -6717,121 +6717,121 @@
 # NAD83(CORS96) / Oregon South (ft)
 <6887> +proj=lcc +lat_1=44 +lat_2=42.33333333333334 +lat_0=41.66666666666666 +lon_0=-120.5 +x_0=1500000.0001464 +y_0=0 +ellps=GRS80 +units=ft +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 4
-<20004> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20004> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 5
-<20005> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20005> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 6
-<20006> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20006> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 7
-<20007> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20007> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 8
-<20008> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20008> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 9
-<20009> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20009> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 10
-<20010> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20010> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 11
-<20011> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20011> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 12
-<20012> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20012> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 13
-<20013> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20013> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 14
-<20014> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20014> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 15
-<20015> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20015> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 16
-<20016> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20016> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 17
-<20017> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20017> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 18
-<20018> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20018> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 19
-<20019> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20019> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 20
-<20020> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20020> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 21
-<20021> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20021> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 22
-<20022> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20022> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 23
-<20023> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20023> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 24
-<20024> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20024> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 25
-<20025> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20025> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 26
-<20026> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20026> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 27
-<20027> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20027> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 28
-<20028> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20028> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 29
-<20029> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20029> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 30
-<20030> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20030> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 31
-<20031> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20031> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger zone 32
-<20032> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20032> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 4N (deprecated)
-<20064> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20064> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 5N (deprecated)
-<20065> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20065> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 6N (deprecated)
-<20066> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20066> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 7N (deprecated)
-<20067> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20067> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 8N (deprecated)
-<20068> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20068> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 9N (deprecated)
-<20069> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20069> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 10N (deprecated)
-<20070> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20070> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 11N (deprecated)
-<20071> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20071> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 12N (deprecated)
-<20072> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20072> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 13N (deprecated)
-<20073> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20073> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 14N (deprecated)
-<20074> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20074> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 15N (deprecated)
-<20075> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20075> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 16N (deprecated)
-<20076> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20076> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 17N (deprecated)
-<20077> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20077> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 18N (deprecated)
-<20078> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20078> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 19N (deprecated)
-<20079> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20079> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 20N (deprecated)
-<20080> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20080> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 21N (deprecated)
-<20081> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20081> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 22N (deprecated)
-<20082> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20082> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 23N (deprecated)
-<20083> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20083> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 24N (deprecated)
-<20084> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20084> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 25N (deprecated)
-<20085> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20085> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 26N (deprecated)
-<20086> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20086> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 27N (deprecated)
-<20087> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20087> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 28N (deprecated)
-<20088> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20088> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 29N (deprecated)
-<20089> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20089> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 30N (deprecated)
-<20090> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20090> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 31N (deprecated)
-<20091> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20091> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Pulkovo 1995 / Gauss-Kruger 32N (deprecated)
-<20092> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,-0,-0,0.13,-0.22 +units=m +no_defs  <>
+<20092> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=24.47,-130.89,-81.56,0,0,0.13,-0.22 +units=m +no_defs  <>
 # Adindan / UTM zone 35N
 <20135> +proj=utm +zone=35 +ellps=clrk80 +towgs84=-166,-15,204,0,0,0,0 +units=m +no_defs  <>
 # Adindan / UTM zone 36N
@@ -8074,11 +8074,11 @@
 # OSGB 1936 / British National Grid
 <27700> +proj=tmerc +lat_0=49 +lon_0=-2 +k=0.9996012717 +x_0=400000 +y_0=-100000 +datum=OSGB36 +units=m +no_defs  <>
 # Palestine 1923 / Palestine Grid
-<28191> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs  <>
+<28191> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs  <>
 # Palestine 1923 / Palestine Belt
-<28192> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs  <>
+<28192> +proj=tmerc +lat_0=31.73409694444445 +lon_0=35.21208055555556 +k=1 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs  <>
 # Palestine 1923 / Israeli CS Grid
-<28193> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.722,94.7824,340.894,-8.001,-4.42,-11.821,1 +units=m +no_defs  <>
+<28193> +proj=cass +lat_0=31.73409694444445 +lon_0=35.21208055555556 +x_0=170251.555 +y_0=1126867.909 +a=6378300.789 +b=6356566.435 +towgs84=-275.7224,94.7824,340.8944,-8.001,-4.42,-11.821,1 +units=m +no_defs  <>
 # Pointe Noire / UTM zone 32S
 <28232> +proj=utm +zone=32 +south +a=6378249.2 +b=6356515 +towgs84=-148,51,-291,0,0,0,0 +units=m +no_defs  <>
 # GDA94 / MGA zone 48
@@ -8104,135 +8104,135 @@
 # GDA94 / MGA zone 58
 <28358> +proj=utm +zone=58 +south +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 2 (deprecated)
-<28402> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28402> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=2500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 3 (deprecated)
-<28403> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28403> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=3500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 4
-<28404> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28404> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=4500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 5
-<28405> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28405> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=5500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 6
-<28406> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28406> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=6500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 7
-<28407> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28407> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=7500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 8
-<28408> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28408> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=8500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 9
-<28409> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28409> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=9500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 10
-<28410> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28410> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=10500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 11
-<28411> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28411> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=11500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 12
-<28412> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28412> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=12500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 13
-<28413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28413> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=13500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 14
-<28414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28414> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=14500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 15
-<28415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28415> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=15500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 16
-<28416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28416> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=16500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 17
-<28417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28417> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=17500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 18
-<28418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28418> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=18500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 19
-<28419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28419> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=19500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 20
-<28420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28420> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=20500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 21
-<28421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28421> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=21500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 22
-<28422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28422> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=22500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 23
-<28423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28423> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=23500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 24
-<28424> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28424> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=24500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 25
-<28425> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28425> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=25500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 26
-<28426> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28426> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=26500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 27
-<28427> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28427> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=27500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 28
-<28428> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28428> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=28500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 29
-<28429> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28429> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=29500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 30
-<28430> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28430> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=30500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 31
-<28431> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28431> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=31500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger zone 32
-<28432> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28432> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=32500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 2N (deprecated)
-<28462> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28462> +proj=tmerc +lat_0=0 +lon_0=9 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 3N (deprecated)
-<28463> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28463> +proj=tmerc +lat_0=0 +lon_0=15 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 4N (deprecated)
-<28464> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28464> +proj=tmerc +lat_0=0 +lon_0=21 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 5N (deprecated)
-<28465> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28465> +proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 6N (deprecated)
-<28466> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28466> +proj=tmerc +lat_0=0 +lon_0=33 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 7N (deprecated)
-<28467> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28467> +proj=tmerc +lat_0=0 +lon_0=39 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 8N (deprecated)
-<28468> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28468> +proj=tmerc +lat_0=0 +lon_0=45 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 9N (deprecated)
-<28469> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28469> +proj=tmerc +lat_0=0 +lon_0=51 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 10N (deprecated)
-<28470> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28470> +proj=tmerc +lat_0=0 +lon_0=57 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 11N (deprecated)
-<28471> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28471> +proj=tmerc +lat_0=0 +lon_0=63 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 12N (deprecated)
-<28472> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28472> +proj=tmerc +lat_0=0 +lon_0=69 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 13N (deprecated)
-<28473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28473> +proj=tmerc +lat_0=0 +lon_0=75 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 14N (deprecated)
-<28474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28474> +proj=tmerc +lat_0=0 +lon_0=81 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 15N (deprecated)
-<28475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28475> +proj=tmerc +lat_0=0 +lon_0=87 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 16N (deprecated)
-<28476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28476> +proj=tmerc +lat_0=0 +lon_0=93 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 17N (deprecated)
-<28477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28477> +proj=tmerc +lat_0=0 +lon_0=99 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 18N (deprecated)
-<28478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28478> +proj=tmerc +lat_0=0 +lon_0=105 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 19N (deprecated)
-<28479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28479> +proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 20N (deprecated)
-<28480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28480> +proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 21N (deprecated)
-<28481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28481> +proj=tmerc +lat_0=0 +lon_0=123 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 22N (deprecated)
-<28482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28482> +proj=tmerc +lat_0=0 +lon_0=129 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 23N (deprecated)
-<28483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28483> +proj=tmerc +lat_0=0 +lon_0=135 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 24N (deprecated)
-<28484> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28484> +proj=tmerc +lat_0=0 +lon_0=141 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 25N (deprecated)
-<28485> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28485> +proj=tmerc +lat_0=0 +lon_0=147 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 26N (deprecated)
-<28486> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28486> +proj=tmerc +lat_0=0 +lon_0=153 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 27N (deprecated)
-<28487> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28487> +proj=tmerc +lat_0=0 +lon_0=159 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 28N (deprecated)
-<28488> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28488> +proj=tmerc +lat_0=0 +lon_0=165 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 29N (deprecated)
-<28489> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28489> +proj=tmerc +lat_0=0 +lon_0=171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 30N (deprecated)
-<28490> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28490> +proj=tmerc +lat_0=0 +lon_0=177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 31N (deprecated)
-<28491> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28491> +proj=tmerc +lat_0=0 +lon_0=-177 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Pulkovo 1942 / Gauss-Kruger 32N (deprecated)
-<28492> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,-0,0.35,0.82,-0.12 +units=m +no_defs  <>
+<28492> +proj=tmerc +lat_0=0 +lon_0=-171 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=23.92,-141.27,-80.9,0,0.35,0.82,-0.12 +units=m +no_defs  <>
 # Qatar 1974 / Qatar National Grid
 <28600> +proj=tmerc +lat_0=24.45 +lon_0=51.21666666666667 +k=0.99999 +x_0=200000 +y_0=300000 +ellps=intl +towgs84=-128.16,-282.42,21.93,0,0,0,0 +units=m +no_defs  <>
 # Amersfoort / RD Old
-<28991> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=0 +y_0=0 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs  <>
+<28991> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=0 +y_0=0 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs  <>
 # Amersfoort / RD New
-<28992> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +no_defs  <>
+<28992> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +no_defs  <>
 # SAD69 / Brazil Polyconic (deprecated)
 <29100> +proj=poly +lat_0=0 +lon_0=-54 +x_0=5000000 +y_0=10000000 +ellps=GRS67 +towgs84=-57,1,-41,0,0,0,0 +units=m +no_defs  <>
 # SAD69 / Brazil Polyconic
@@ -8401,17 +8401,17 @@
 # Voirol 1879 / Sud Algerie (ancienne)
 <30494> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500000 +y_0=300000 +a=6378249.2 +b=6356515 +units=m +no_defs  <>
 # Nord Sahara 1959 / UTM zone 29N
-<30729> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
+<30729> +proj=utm +zone=29 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
 # Nord Sahara 1959 / UTM zone 30N
-<30730> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
+<30730> +proj=utm +zone=30 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
 # Nord Sahara 1959 / UTM zone 31N
-<30731> +proj=utm +zone=31 +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
+<30731> +proj=utm +zone=31 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
 # Nord Sahara 1959 / UTM zone 32N
-<30732> +proj=utm +zone=32 +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
+<30732> +proj=utm +zone=32 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
 # Nord Sahara 1959 / Nord Algerie
-<30791> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
+<30791> +proj=lcc +lat_1=36 +lat_0=36 +lon_0=2.7 +k_0=0.999625544 +x_0=500135 +y_0=300090 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
 # Nord Sahara 1959 / Sud Algerie
-<30792> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +towgs84=-209.362,-87.8162,404.62,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
+<30792> +proj=lcc +lat_1=33.3 +lat_0=33.3 +lon_0=2.7 +k_0=0.999625769 +x_0=500135 +y_0=300090 +ellps=clrk80 +towgs84=-209.3622,-87.8162,404.6198,0.0046,3.4784,0.5805,-1.4547 +units=m +no_defs  <>
 # RT38 2.5 gon W (deprecated)
 <30800> +proj=tmerc +lat_0=0 +lon_0=15.80827777777778 +k=1 +x_0=1500000 +y_0=0 +ellps=bessel +units=m +no_defs  <>
 # Yoff / UTM zone 28N
@@ -8495,9 +8495,9 @@
 # MGI / Austria Lambert (deprecated)
 <31297> +proj=lcc +lat_1=49 +lat_2=46 +lat_0=47.5 +lon_0=13.33333333333333 +x_0=400000 +y_0=400000 +datum=hermannskogel +units=m +no_defs  <>
 # Belge 1972 / Belge Lambert 72
-<31300> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +towgs84=-106.869,52.2978,-103.724,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs  <>
+<31300> +proj=lcc +lat_1=49.83333333333334 +lat_2=51.16666666666666 +lat_0=90 +lon_0=4.356939722222222 +x_0=150000.01256 +y_0=5400088.4378 +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs  <>
 # Belge 1972 / Belgian Lambert 72
-<31370> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.869,52.2978,-103.724,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs  <>
+<31370> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +units=m +no_defs  <>
 # DHDN / 3-degree Gauss zone 1 (deprecated)
 <31461> +proj=tmerc +lat_0=0 +lon_0=3 +k=1 +x_0=1500000 +y_0=0 +datum=potsdam +units=m +no_defs  <>
 # DHDN / 3-degree Gauss zone 2 (deprecated)
@@ -9514,8 +9514,7 @@
 # WGS 84 / Plate Carree (deprecated)
 <32662> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs  <>
 # WGS 84 / World Equidistant Cylindrical (deprecated)
-# Unable to translate coordinate system EPSG:32663 into PROJ.4 format.
-#
+<32663> +proj=eqc +lat_ts=0 +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs  <>
 # WGS 84 / BLM 14N (ftUS)
 <32664> +proj=tmerc +lat_0=0 +lon_0=-99 +k=0.9996 +x_0=500000.001016002 +y_0=0 +datum=WGS84 +units=us-ft +no_defs  <>
 # WGS 84 / BLM 15N (ftUS)
@@ -10134,7 +10133,7 @@
 # ETRS89 / UTM zone 36 + NN54 height
 <6176> +proj=utm +zone=36 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs  <>
 # Belge 1972 / Belgian Lambert 72 + Ostend height
-<6190> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.869,52.2978,-103.724,0.3366,-0.457,1.8422,-1.2747 +units=m +vunits=m +no_defs  <>
+<6190> +proj=lcc +lat_1=51.16666723333333 +lat_2=49.8333339 +lat_0=90 +lon_0=4.367486666666666 +x_0=150000.013 +y_0=5400088.438 +ellps=intl +towgs84=-106.8686,52.2978,-103.7239,0.3366,-0.457,1.8422,-1.2747 +units=m +vunits=m +no_defs  <>
 # NAD83(2011) + NAVD88 height
 <6349> +proj=longlat +ellps=GRS80 +geoidgrids=g2012a_conus.gtx,g2012a_alaska.gtx,g2012a_guam.gtx,g2012a_hawaii.gtx,g2012a_puertorico.gtx,g2012a_samoa.gtx +vunits=m +no_defs  <>
 # NAD83(CSRS) + CGVD2013 height
@@ -10196,11 +10195,11 @@
 # NAD27 / Texas North + NGVD29 height
 <7407> +proj=lcc +lat_1=34.65 +lat_2=36.18333333333333 +lat_0=34 +lon_0=-101.5 +x_0=609601.2192024384 +y_0=0 +datum=NAD27 +units=us-ft +vunits=us-ft +no_defs  <>
 # RD/NAP
-<7408> +proj=longlat +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +vunits=m +no_defs  <>
+<7408> +proj=longlat +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +vunits=m +no_defs  <>
 # ETRS89 + EVRF2000 height
 <7409> +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +vunits=m +no_defs  <>
 # PSHD93
-<7410> +proj=longlat +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.7101 +vunits=m +no_defs  <>
+<7410> +proj=longlat +ellps=clrk80 +towgs84=-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006 +vunits=m +no_defs  <>
 # NTF (Paris) / Lambert zone II + NGF Lallemand height
 <7411> +proj=lcc +lat_1=46.8 +lat_0=46.8 +lon_0=0 +k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +towgs84=-168,-60,320,0,0,0,0 +pm=paris +units=m +vunits=m +no_defs  <>
 # NTF (Paris) / Lambert zone II + NGF IGN69
@@ -10210,7 +10209,7 @@
 # Tokyo + JSLD69 height
 <7414> +proj=longlat +ellps=bessel +towgs84=-146.414,507.337,680.507,0,0,0,0 +vunits=m +no_defs  <>
 # Amersfoort / RD New + NAP height
-<7415> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.417,50.3319,465.552,-0.398957,0.343988,-1.8774,4.0725 +units=m +vunits=m +no_defs  <>
+<7415> +proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +towgs84=565.4171,50.3319,465.5524,-0.398957388243134,0.343987817378283,-1.87740163998045,4.0725 +units=m +vunits=m +no_defs  <>
 # ETRS89 / UTM zone 32N + DVR90 height
 <7416> +proj=utm +zone=32 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +vunits=m +no_defs  <>
 # ETRS89 / UTM zone 33N + DVR90 height
diff --git a/lib/pyproj/data/test27 b/lib/pyproj/data/test27
index 583f603..66f6f1c 100755
--- a/lib/pyproj/data/test27
+++ b/lib/pyproj/data/test27
@@ -6,6 +6,7 @@
 # Proj will vary in the .001ft range with projections using Transverse
 #   Mercator due to greater precision of meridinal distance function.
 #
+NAD_DIR=`dirname $0`
 EXE=$1
 
 usage()
@@ -29,7 +30,7 @@ echo "Running ${0} using ${EXE}:"
 echo "============================================"
 
 OUT=proj_out27
-INIT_FILE=./nad27
+INIT_FILE=${NAD_DIR}/nad27
 #
 echo "doing tests into file ${OUT}, please wait"
 #
@@ -831,7 +832,7 @@ EOF
 #
 # do 'diff' with distribution results
 echo "diff ${OUT} with pj_out27.dist"
-diff -b ${OUT} pj_out27.dist
+diff -b ${OUT} ${NAD_DIR}/pj_out27.dist
 if [ $? -ne 0 ] ; then
 	echo  ""
 	echo "PROBLEMS HAVE OCCURED"
diff --git a/lib/pyproj/data/test83 b/lib/pyproj/data/test83
index 2de16ab..4dcb15e 100755
--- a/lib/pyproj/data/test83
+++ b/lib/pyproj/data/test83
@@ -7,6 +7,7 @@
 # Proj will vary in the .001ft range with projections using Transverse
 #   Mercator due to greater precision of meridinal distance function.
 #
+NAD_DIR=`dirname $0`
 EXE=$1
 
 usage()
@@ -30,7 +31,7 @@ echo "Running ${0} using ${EXE}:"
 echo "============================================"
 
 OUT=proj_out83
-INIT_FILE=./nad83
+INIT_FILE=${NAD_DIR}/nad83
 #
 echo "doing tests into file ${OUT}, please wait"
 #
@@ -712,7 +713,7 @@ EOF
 #
 # do 'diff' with distribution results
 echo "diff ${OUT} with pj_out83.dist"
-diff -b ${OUT} pj_out83.dist
+diff -b ${OUT} ${NAD_DIR}/pj_out83.dist
 if [ $? -ne 0 ] ; then
 	echo  ""
 	echo "PROBLEMS HAVE OCCURED"
diff --git a/lib/pyproj/data/testIGNF b/lib/pyproj/data/testIGNF
index 1522677..6f8437f 100755
--- a/lib/pyproj/data/testIGNF
+++ b/lib/pyproj/data/testIGNF
@@ -10,6 +10,7 @@
 #               transformations will be wrong and vice-versa
 # 2009-10-04 :  addition of NTFG to RGF93G test to check if
 #               the gsb grid is still ok
+NAD_DIR=`dirname $0`
 EXE=$1
 
 usage()
@@ -150,7 +151,7 @@ EOF
 #
 # do 'diff' with distribution results
 echo "diff ${OUT} with ${OUT}.dist"
-diff -b ${OUT} ${OUT}.dist
+diff -b ${OUT} ${NAD_DIR}/${OUT}.dist
 if [ $? -ne 0 ] ; then
 echo  ""
 echo "PROBLEMS HAVE OCCURED"
diff --git a/lib/pyproj/data/testdatumfile b/lib/pyproj/data/testdatumfile
index e03d1d8..e3f2764 100755
--- a/lib/pyproj/data/testdatumfile
+++ b/lib/pyproj/data/testdatumfile
@@ -3,6 +3,7 @@
 # files that are not always available.
 #
 #
+NAD_DIR=`dirname $0`
 EXE=$1
 
 usage()
@@ -97,7 +98,7 @@ EOF
 # Done! 
 # do 'diff' with distribution results
 echo "diff ${OUT} with ${OUT}.dist"
-diff -b ${OUT} ${OUT}.dist
+diff -b ${OUT} ${NAD_DIR}/${OUT}.dist
 if [ $? -ne 0 ] ; then
 	echo  ""
 	echo "PROBLEMS HAVE OCCURED"
diff --git a/lib/pyproj/data/testntv2 b/lib/pyproj/data/testntv2
index 5a9e1a7..669517d 100755
--- a/lib/pyproj/data/testntv2
+++ b/lib/pyproj/data/testntv2
@@ -3,6 +3,7 @@
 # Test NTv2 (.gsb) support.  Assumes ntv2_0.gsb is installed.
 #
 #
+NAD_DIR=`dirname $0`
 EXE=$1
 
 usage()
@@ -56,7 +57,7 @@ EOF
 # Done! 
 # do 'diff' with distribution results
 echo "diff ${OUT} with ${OUT}.dist"
-diff -b ${OUT} ${OUT}.dist
+diff -b ${OUT} ${NAD_DIR}/${OUT}.dist
 if [ $? -ne 0 ] ; then
 	echo  ""
 	echo "PROBLEMS HAVE OCCURED"
diff --git a/lib/pyproj/data/testvarious b/lib/pyproj/data/testvarious
index 4c427cd..972dc22 100755
--- a/lib/pyproj/data/testvarious
+++ b/lib/pyproj/data/testvarious
@@ -3,6 +3,7 @@
 # on datum files.
 #
 #
+NAD_DIR=`dirname $0`
 EXE=$1
 
 usage()
@@ -21,6 +22,16 @@ if test ! -x ${EXE}; then
     exit 1
 fi
 
+# Would be great to have a universale way of selecting a locale with
+# a decimal separator that is not '.'
+if command locale >/dev/null 2>/dev/null; then
+    if test `locale -a | grep fr_FR.utf8`; then
+        echo "Using locale with comma as decimal separator"
+        export LC_ALL=fr_FR.UTF-8
+        export PROJ_USE_ENV_LOCALE=1
+    fi
+fi
+
 echo "============================================"
 echo "Running ${0} using ${EXE}:"
 echo "============================================"
@@ -255,6 +266,22 @@ $EXE +proj=robin +datum=WGS84 \
 1741397.30      4276351.58 0.00
 EOF
 echo "##############################################################" >> ${OUT}
+echo "Test hammer projection (pull request #329)" >> ${OUT}
+$EXE +proj=latlong +datum=WGS84 \
+ +to +proj=hammer  +datum=WGS84 \
+ -E >>${OUT} <<EOF
+-30 40
+-35 45
+20 40
+EOF
+$EXE +proj=hammer  +datum=WGS84 \
+ +to +proj=latlong +datum=WGS84 \
+ -E >>${OUT} <<EOF
+-2711575.08	4395506.62 0.00
+-2964412.70	4929091.33 0.00
+1811748.54	4377349.50 0.00
+EOF
+echo "##############################################################" >> ${OUT}
 echo "Test healpix forward projection on sphere" >> ${OUT}
 $EXE +proj=latlong +a=1 +lon_0=0 \
  +to +proj=healpix +a=1 +lon_0=0  -f '%.'5'f' \
@@ -276,27 +303,6 @@ $EXE +proj=latlong +R=5 \
 0 60.0
 0 -60.0
 EOF
-echo "Test healpix inverse projection on sphere" >> ${OUT}
-$EXE +proj=latlong +a=1 +lon_0=0 \
- +to +proj=healpix +a=1 +lon_0=0  -f '%.'5'f' -I\
- -E >>${OUT} <<EOF
-0 0.7853981633974483
--1.5707963267948966 0
-EOF
-$EXE +proj=latlong +a=5 \
- +to +proj=healpix +a=5 -f '%.'5'f' -I\
- -E >>${OUT} <<EOF
-0.0 0.0
-0.0 3.9269908169872414
-0.0 -3.9269908169872414
-7.853981633974483 0.0
--7.853981633974483 0.0
--15.707963267948966 0.0
--11.780972450961723 7.853981633974483
--11.780972450961723 -7.853981633974483
-1.437378399445537 5.364369216432778
-1.437378399445537 -5.364369216432778
-EOF
 echo "Test healpix forward projection on ellipsoid" >> ${OUT}
 $EXE +proj=latlong +a=1 +lon_0=0 +ellps=WGS84 \
  +to +proj=healpix +a=1 +lon_0=0 +ellps=WGS84 -f '%.'5'f' \
@@ -588,7 +594,7 @@ EOF
 echo "##############################################################" >> ${OUT}
 echo "Test MGI datum gives expected results (#207)" >> ${OUT}
 #
-$EXE -f '%.14f' \
+$EXE -f '%.7f' \
      +proj=latlong +datum=WGS84 \
  +to +init=epsg:31284 \
  -E >>${OUT} <<EOF
@@ -597,7 +603,7 @@ EOF
 echo "##############################################################" >> ${OUT}
 echo "Test omerc sensitivity with locations 90d from origin(#114)" >> ${OUT}
 #
-$EXE -f '%.14f' \
+$EXE -f '%.8f' \
      +proj=latlong +ellps=WGS84 \
  +to +proj=omerc +ellps=WGS84 +lon_1=62.581150 +lat_1=74.856102 \
                  +lon_2=53.942810 +lat_2=74.905884 +units=km +no_rot +no_defs \
@@ -634,7 +640,7 @@ EOF
 echo "##############################################################" >> ${OUT}
 echo "Test qsc" >> ${OUT}
 #
-$EXE -f '%.13f' \
+$EXE -f '%.7f' \
      +proj=latlong +datum=WGS84 \
  +to +proj=qsc +datum=WGS84 +no_defs \
  -E >>${OUT} <<EOF
@@ -666,7 +672,7 @@ EOF
 echo "##############################################################" >> ${OUT}
 echo "Test bug 244 " >> ${OUT}
 #
-$EXE -f '%.12f' \
+$EXE -f '%.8f' \
      +init=epsg:4326 \
      +to +proj=aeqd +lon_0=130.0 +lat_0=40.0 +a=6378137 +b=6378137 +units=m +no_defs \
  -E >>${OUT} <<EOF
@@ -675,33 +681,98 @@ EOF
 echo "##############################################################" >> ${OUT}
 echo "Test bug 244 (2)" >> ${OUT}
 #
-$EXE -f '%.12f' \
+$EXE -f '%.11f' \
      +proj=aeqd +lon_0=130.0 +lat_0=40.0 +a=6378137 +b=6378137 +units=m +no_defs \
      +to +init=epsg:4326 \
  -E >>${OUT} <<EOF
-987122.4183302754536 -14429896.5395309105515
+987122.418330284 -14429896.539530909
 EOF
 echo "##############################################################" >> ${OUT}
 echo "Test bug 245 (use +datum=carthage)" >> ${OUT}
 #
-$EXE -f '%.12f' \
-     +proj=longlat +datum=WGS84 +nodefs +to +proj=utm +zone=32 +datum=carthage +nodefs \
+$EXE -f '%.7f' \
+     +proj=longlat +datum=WGS84 +no_defs +to +proj=utm +zone=32 +datum=carthage +no_defs \
  -E >>${OUT} <<EOF
 10 34
 EOF
 echo "##############################################################" >> ${OUT}
-echo "Test bug 245 (use expension of +datum=carthage)" >> ${OUT}
+echo "Test bug 245 (use expansion of +datum=carthage)" >> ${OUT}
 #
-$EXE -f '%.12f' \
-     +proj=longlat +datum=WGS84 +nodefs +to +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-263.0,6.0,431.0 +nodefs \
+$EXE -f '%.7f' \
+     +proj=longlat +datum=WGS84 +no_defs +to +proj=utm +zone=32 +a=6378249.2 +b=6356515 +towgs84=-263.0,6.0,431.0 +no_defs \
  -E >>${OUT} <<EOF
 10 34
 EOF
+echo  "##############################################################" >> ${OUT}
+echo  "Test SCH forward projection" >> ${OUT}
+#
+$EXE -f '%.7f' \
+    +proj=latlong +datum=WGS84 +to +proj=sch +datum=WGS84 +plat_0=30.0 +plon_0=45.0 \
+    +phdg_0=-12.0 +nodefs \
+ -E >> ${OUT} <<EOF
+0.0 0.0
+0.0 90.0
+45.0 45.0
+45.1 44.9
+44.9 45.1
+30.0 45.0
+EOF
+echo  "##############################################################" >> ${OUT}
+echo  "Test SCH inverse projection" >> ${OUT}
+#
+$EXE -f '%.7f' \
+    +proj=sch +datum=WGS84 +plat_0=30.0 +plon_0=45.0 +phdg_0=-12.0 +nodefs +to \
+    +proj=latlong +datum=WGS84 \
+ -E >> ${OUT} <<EOF
+0. 0.
+0. 1000.
+1000. 0.
+1000. 1000.
+EOF
+##############################################################################
+echo "##############################################################" >> ${OUT}
+echo "Test issue #316 (switch utm to use etmerc)" >> ${OUT}
+#
+$EXE -f '%.6f' \
+     +proj=latlong +datum=WGS84 +no_defs +to +proj=utm +zone=35 +datum=WGS84 +no_defs \
+ -E >>${OUT} <<EOF
+0 83
+EOF
 ##############################################################################
+echo "##############################################################" >> ${OUT}
+echo "Test issue #316 (switch utm to use etmerc)" >> ${OUT}
+#
+$EXE -f '%.6f' \
+     +proj=latlong +datum=WGS84 +no_defs +to +proj=etmerc +datum=WGS84 +no_defs +k=0.9996 +lon_0=27 +x_0=500000 -f %.6f \
+ -E >>${OUT} <<EOF
+0 83
+EOF
+##############################################################################
+echo  "##############################################################" >> ${OUT}
+echo  "Test nzmg forward projection" >> ${OUT}
+#
+$EXE -f '%.7f' \
+    +proj=latlong +datum=WGS84 +to \
+    +proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=WGS84 +units=m +no_defs \
+ -E >> ${OUT} <<EOF
+175. -40. 0.
+EOF
+##############################################################################
+echo  "##############################################################" >> ${OUT}
+echo  "Test nzmg inverse projection" >> ${OUT}
+#
+$EXE -f '%.7f' \
+    +proj=nzmg +lat_0=-41 +lon_0=173 +x_0=2510000 +y_0=6023150 +ellps=WGS84 +units=m +no_defs +to \
+    +proj=latlong +datum=WGS84 \
+ -E >> ${OUT} <<EOF
+2680778.57267967 6132228.07645127 0.
+EOF
+
+
 # Done!
 # do 'diff' with distribution results
 echo "diff ${OUT} with ${OUT}.dist"
-diff -b ${OUT} ${OUT}.dist
+diff -b ${OUT} ${NAD_DIR}/${OUT}.dist
 if [ $? -ne 0 ] ; then
 	echo  ""
 	echo "PROBLEMS HAVE OCCURED"
diff --git a/lib/pyproj/data/tv_out.dist b/lib/pyproj/data/tv_out.dist
index a9d5120..e58f6da 100644
--- a/lib/pyproj/data/tv_out.dist
+++ b/lib/pyproj/data/tv_out.dist
@@ -20,8 +20,8 @@ Test simple prime meridian handling.
 ##############################################################
 Test support for the lon_wrap switch.
 1d00'00.000"W 10d00'00.000"N 0.0	359dE	10dN 0.000
-0d00'00.000"W 10d00'00.000"N 0.0	360dE	10dN 0.000
-0d00'00.000"E 10d00'00.000"N 0.0	360dE	10dN 0.000
+0d00'00.000"W 10d00'00.000"N 0.0	0dE	10dN 0.000
+0d00'00.000"E 10d00'00.000"N 0.0	0dE	10dN 0.000
 1d00'00.000"E 45d00'00.000"N 0.0	1dE	45dN 0.000
 179d00'00.000"E 45d00'00.000"N 0.0	179dE	45dN 0.000
 181d00'00.000"E 45d00'00.000"N 0.0	181dE	45dN 0.000
@@ -92,6 +92,14 @@ Test robinson projection (#113)
 -2963455.42     4805073.65 0.00	35dW	45dN 0.000
 1741397.30      4276351.58 0.00	20d0'0.002"E	40d0'0.066"N 0.000
 ##############################################################
+Test hammer projection (pull request #329)
+-30 40	-2711575.08	4395506.62 0.00
+-35 45	-2964412.70	4929091.33 0.00
+20 40	1811748.54	4377349.50 0.00
+-2711575.08	4395506.62 0.00	30dW	40dN 0.000
+-2964412.70	4929091.33 0.00	35dW	45dN 0.000
+1811748.54	4377349.50 0.00	20dE	40dN 0.000
+##############################################################
 Test healpix forward projection on sphere
 0 41.81031	0.00000	0.78540 0.00000
 -90 0	-1.57080	0.00000 0.00000
@@ -101,23 +109,10 @@ Test healpix forward projection on sphere
 90.0 0	7.85398	0.00000 0.00000
 -90.0 0	-7.85398	0.00000 0.00000
 -180 0	-15.70796	0.00000 0.00000
--180 90.0	-19.63495	7.85398 0.00000
--180 -90.0	-19.63495	-7.85398 0.00000
+-180 90.0	-11.78097	7.85398 0.00000
+-180 -90.0	-11.78097	-7.85398 0.00000
 0 60.0	1.43738	5.36437 0.00000
 0 -60.0	1.43738	-5.36437 0.00000
-Test healpix inverse projection on sphere
-0 0.7853981633974483	0.00000	41.81031 0.00000
--1.5707963267948966 0	-90.00000	0.00000 0.00000
-0.0 0.0	0.00000	0.00000 0.00000
-0.0 3.9269908169872414	0.00000	41.81031 0.00000
-0.0 -3.9269908169872414	0.00000	-41.81031 0.00000
-7.853981633974483 0.0	90.00000	0.00000 0.00000
--7.853981633974483 0.0	-90.00000	0.00000 0.00000
--15.707963267948966 0.0	-180.00000	0.00000 0.00000
--11.780972450961723 7.853981633974483	-180.00000	90.00000 0.00000
--11.780972450961723 -7.853981633974483	-180.00000	-90.00000 0.00000
-1.437378399445537 5.364369216432778	0.00000	60.00000 0.00000
-1.437378399445537 -5.364369216432778	0.00000	-60.00000 0.00000
 Test healpix forward projection on ellipsoid
 0 41.937853904844985	0.00000	0.78452 0.00000
 -90 0	-1.56904	0.00000 0.00000
@@ -127,8 +122,8 @@ Test healpix forward projection on ellipsoid
 90.0 0	6.78898	0.00000 0.00000
 -90.0 0	-6.78898	0.00000 0.00000
 -180 0	-13.57797	0.00000 0.00000
--180 90.0	-16.97246	6.78898 0.00000
--180 -90.0	-16.97246	-6.78898 0.00000
+-180 90.0	-10.18348	6.78898 0.00000
+-180 -90.0	-10.18348	-6.78898 0.00000
 0 60.0	0.00000	3.35128 0.00000
 0 -60.0	0.00000	-3.35128 0.00000
 Test healpix inverse projection on ellipsoid
@@ -291,11 +286,11 @@ Test inverse handling
 10 20	-1384841.19	7581707.88 0.00
 ##############################################################
 Test MGI datum gives expected results (#207)
-16.33 48.20	595710.37321015028283	5357598.46457545924932 -44.49510847218335
+16.33 48.20	595710.3732102	5357598.4645755 -44.4951085
 ##############################################################
 Test omerc sensitivity with locations 90d from origin(#114)
-56.958381652832 72.8798	-9985.16336452572614	-227.67701050320997 0.00000000000000
-56.9584 72.8798	9985.16263662453457	-227.67701050313340 0.00000000000000
+56.958381652832 72.8798	-9985.16336453	-227.67701050 0.00000000
+56.9584 72.8798	9985.16263662	-227.67701050 0.00000000
 ##############################################################
 Test omerc differences between poles (#190)
 -27 70	7846957.203	0.000 0.000
@@ -310,7 +305,7 @@ Test omerc differences between poles (#190)
 163 -80	-11163496.121	397796.828 0.000
 ##############################################################
 Test qsc
-13 -10	2073986.9490880956873	-1680858.2722242795862 0.0000000000000
+13 -10	2073986.9490881	-1680858.2722243 0.0000000
 2073986.94908809568733	-1680858.27222427958623	13.0000000000000	-10.0000000000000 0.0000000000000
 ##############################################################
 Test bug 229
@@ -320,13 +315,39 @@ Test bug 229 (2)
 13 -10	13.0000000000000	-10.0000000000000 0.0000000000000
 ##############################################################
 Test bug 244 
--140.100000 -87.000000	987122.418330275454	-14429896.539530910552 0.000000000000
+-140.100000 -87.000000	987122.41833028	-14429896.53953091 0.00000000
 ##############################################################
 Test bug 244 (2)
-987122.4183302754536 -14429896.5395309105515	-140.100000000000	-87.000000000000 0.000000000000
+987122.418330284 -14429896.539530909	-140.10000000000	-87.00000000000 0.00000000000
 ##############################################################
 Test bug 245 (use +datum=carthage)
-10 34	592302.981946153101	3762148.734061029274 -30.311017032713
+10 34	592302.9819461	3762148.7340609 -30.3110170
+##############################################################
+Test bug 245 (use expansion of +datum=carthage)
+10 34	592302.9819461	3762148.7340609 -30.3110170
+##############################################################
+Test SCH forward projection
+0.0 0.0	-1977112.0305592	5551475.1418378 6595.7256583
+0.0 90.0	6618337.9734775	-1152927.4060894 10055.1157181
+45.0 45.0	1630035.5650122	-342353.6396475 128.3445654
+45.1 44.9	1617547.4295637	-347855.9734973 125.4645102
+44.9 45.1	1642526.7453121	-336878.8571851 131.3265616
+30.0 45.0	1974596.2356203	787409.8217445 773.0028577
+##############################################################
+Test SCH inverse projection
+0. 0.	45.0000000	30.0000000 0.0000000
+0. 1000.	44.9898625	29.9981240 -0.0003617
+1000. 0.	44.9978450	30.0088238 -0.0000000
+1000. 1000.	44.9877066	30.0069477 -0.0005228
+##############################################################
+Test issue #316 (switch utm to use etmerc)
+0 83	145723.870553	9300924.845226 0.000000
+##############################################################
+Test issue #316 (switch utm to use etmerc)
+0 83	145723.870553	9300924.845226 0.000000
+##############################################################
+Test nzmg forward projection
+175. -40. 0.  2680778.5726797 6132228.0764513 0.0000000
 ##############################################################
-Test bug 245 (use expension of +datum=carthage)
-10 34	592302.981946153101	3762148.734061030205 -30.311017032713
+Test nzmg inverse projection
+2680778.57267967 6132228.07645127 0.  175.0000000     -40.0000000 0.0000000
diff --git a/setup-proj.py b/setup-proj.py
deleted file mode 100644
index 6d2f797..0000000
--- a/setup-proj.py
+++ /dev/null
@@ -1,60 +0,0 @@
-# build pyproj using installed proj library and data files
-# (instead of bundled source and data)
-from distutils.core import setup, Extension
-import os, glob, numpy, sys, subprocess
-
-proj_dir = os.environ.get('PROJ_DIR')
-if proj_dir is None: proj_dir='/usr/local'
-proj_libdir = os.environ.get('PROJ_LIBDIR')
-proj_incdir = os.environ.get('PROJ_INCDIR')
-libdirs=[]
-incdirs=[numpy.get_include()]
-libraries=['proj']
-
-if proj_libdir is None and proj_dir is not None:
-    libdirs.append(os.path.join(proj_dir,'lib'))
-    libdirs.append(os.path.join(proj_dir,'lib64'))
-if proj_incdir is None and proj_dir is not None:
-    incdirs.append(os.path.join(proj_dir,'include'))
-
-pyprojext =\
-Extension("pyproj._proj",["_proj.c"],include_dirs=incdirs,library_dirs=libdirs,\
-runtime_library_dirs=libdirs,libraries=libraries)
-
-# over-write default data directory.
-pyproj_datadir = os.path.join(os.path.join(proj_dir,'share'),'proj')
-datadirfile = os.path.join('lib',os.path.join('pyproj','datadir.py'))
-f = open(datadirfile,'w')
-f.write('pyproj_datadir="%s"\n' % pyproj_datadir)
-f.close()
-
-packages          = ['pyproj']
-package_dirs       = {'':'lib'}
-
-setup(name = "pyproj",
-  version = "1.9.4",
-  description = "Python interface to PROJ.4 library",
-  long_description  = """
-Performs cartographic transformations between geographic (lat/lon)
-and map projection (x/y) coordinates. Can also transform directly
-from one map projection coordinate system to another.
-Coordinates can be given as numpy arrays, python arrays, lists or scalars.
-Optimized for numpy arrays.""",
-  url               = "https://github.com/jswhit/pyproj",
-  download_url      = "http://python.org/pypi/pyproj",
-  author            = "Jeff Whitaker",
-  author_email      = "jeffrey.s.whitaker at noaa.gov",
-  platforms         = ["any"],
-  license           = "OSI Approved",
-  keywords          = ["python","map projections","GIS","mapping","maps"],
-  classifiers       = ["Development Status :: 4 - Beta",
-                       "Intended Audience :: Science/Research",
-                       "License :: OSI Approved",
-                       "Topic :: Software Development :: Libraries :: Python Modules",
-                       "Topic :: Scientific/Engineering :: GIS",
-                       "Topic :: Scientific/Engineering :: Mathematics",
-                       "Operating System :: OS Independent"],
-  packages          = packages,
-  package_dir       = package_dirs,
-  ext_modules = [pyprojext]
-  )
diff --git a/setup.py b/setup.py
index 6443d57..f1c8118 100644
--- a/setup.py
+++ b/setup.py
@@ -1,38 +1,96 @@
-import sys, os, glob, subprocess
+import sys, os, glob, subprocess, shutil
 from distutils import ccompiler, sysconfig
-from distutils.core import setup, Extension
-
-deps = glob.glob('src/*.c')
-extensions = [Extension("pyproj._proj",deps+['_proj.c'],include_dirs = ['src'])]
-
-# create binary datum shift grid files.
-pathout = os.path.join('lib',os.path.join('pyproj','data'))
-if sys.argv[1] != 'sdist':
-    cc = ccompiler.new_compiler()
-    sysconfig.get_config_vars()
-    sysconfig.customize_compiler(cc)
-    cc.set_include_dirs(['src'])
-    objects = cc.compile(['nad2bin.c', 'src/pj_malloc.c'])
-    execname = 'nad2bin'
-    cc.link_executable(objects, execname)
-    llafiles = glob.glob('datumgrid/*.lla')
-    cmd = os.path.join(os.getcwd(),execname)
-    for f in llafiles:
-        fout = os.path.basename(f.split('.lla')[0])
-        fout = os.path.join(pathout,fout)
-        strg = '%s %s < %s' % (cmd, fout, f)
-        sys.stdout.write('executing %s'%strg)
-        subprocess.call(strg,shell=True)
+from setuptools import setup, Extension
+
+proj_dir = os.environ.get('PROJ_DIR')
+
+# if PROJ_DIR env var is set, build against
+# existing proj.4 installation.
+
+if proj_dir is not None:
+    sys.stdout.write('PROJ_DIR is set, using existing proj4 installation..\n')
+    proj_libdir = os.environ.get('PROJ_LIBDIR')
+    proj_incdir = os.environ.get('PROJ_INCDIR')
+    libdirs=[]; incdirs = []; libraries = ['proj']
+
+    if proj_libdir is None and proj_dir is not None:
+        libdirs.append(os.path.join(proj_dir,'lib'))
+        libdirs.append(os.path.join(proj_dir,'lib64'))
+    if proj_incdir is None and proj_dir is not None:
+        incdirs.append(os.path.join(proj_dir,'include'))
+
+    pyprojext =\
+    Extension("pyproj._proj",["_proj.c"],include_dirs=incdirs,library_dirs=libdirs,\
+    runtime_library_dirs=libdirs,libraries=libraries)
+
+    # over-write default data directory.
+    pyproj_datadir = os.path.join(os.path.join(proj_dir,'share'),'proj')
+    datadirfile = os.path.join('lib',os.path.join('pyproj','datadir.py'))
+    datadirfile_save = os.path.join('lib',os.path.join('pyproj','datadir.py.save'))
+    if not os.path.isfile(datadirfile_save):
+        shutil.copyfile(datadirfile, datadirfile_save)
+    f = open(datadirfile,'w')
+    f.write('pyproj_datadir="%s"\n' % pyproj_datadir)
+    f.close()
+
+    extensions = [pyprojext]
+    package_data = {}
+
+else:
+    # use bundled proj.4
+    sys.stdout.write('using bundled proj4..\n')
+
+    # copy saved datadir.py back
+    datadirfile = os.path.join('lib',os.path.join('pyproj','datadir.py'))
+    datadirfile_save = os.path.join('lib',os.path.join('pyproj','datadir.py.save'))
+    if os.path.isfile(datadirfile_save):
+        shutil.move(datadirfile_save, datadirfile)
+
+    deps = glob.glob('src/*.c')
+    macros = []
+    # these flags are set by configure when proj.4 lib is built.
+    # enable pthreads support
+    #macros.append(('MUTEX_pthread',1))
+    #macros.append(('HAVE_PTHREAD_MUTEX_RECURSIVE',1))
+    # you have localeconv
+    #macros.append(('HAVE_LOCALECONV',1))
+    # use strerror to print error messages
+    #macros.append(('HAVE_STRERROR',1))
+    # for win32 threads
+    #macros.append(('MUTEX_win32',1))
+    extensions = [Extension("pyproj._proj",deps+['_proj.c'],
+                  include_dirs=['src'],define_macros=macros)]
+
+    # create binary datum shift grid files.
+    pathout = os.path.join('lib',os.path.join('pyproj','data'))
+    if len(sys.argv) > 1 and sys.argv[1] != 'sdist':
+        cc = ccompiler.new_compiler()
+        cc.define_macro('_CRT_SECURE_NO_WARNINGS')
+        sysconfig.get_config_vars()
+        sysconfig.customize_compiler(cc)
+        cc.set_include_dirs(['src'])
+        objects = cc.compile(['nad2bin.c', 'src/pj_malloc.c'])
+        execname = 'nad2bin'
+        cc.link_executable(objects, execname, extra_postargs = [ '/MANIFEST' ] if os.name == 'nt' else  None)
+        llafiles = glob.glob('datumgrid/*.lla')
+        cmd = os.path.join(os.getcwd(),execname)
+        for f in llafiles:
+            fout = os.path.basename(f.split('.lla')[0])
+            fout = os.path.join(pathout,fout)
+            strg = '%s %s < %s' % (cmd, fout, f)
+            sys.stdout.write('executing %s'%strg)
+            subprocess.call(strg,shell=True)
+
+    datafiles = glob.glob(os.path.join(pathout,'*'))
+    datafiles = [os.path.join('data',os.path.basename(f)) for f in datafiles]
+    package_data = {'pyproj':datafiles}
+
 
 packages          = ['pyproj']
 package_dirs       = {'':'lib'}
 
-datafiles = glob.glob(os.path.join(pathout,'*'))
-datafiles = [os.path.join('data',os.path.basename(f)) for f in datafiles]
-package_data = {'pyproj':datafiles}
-
 setup(name = "pyproj",
-  version = "1.9.4",
+  version = "1.9.5",
   description = "Python interface to PROJ.4 library",
   long_description  = """
 Performs cartographic transformations between geographic (lat/lon)
@@ -56,6 +114,6 @@ Optimized for numpy arrays.""",
                        "Operating System :: OS Independent"],
   packages          = packages,
   package_dir       = package_dirs,
-  ext_modules = extensions,
-  package_data = package_data
+  ext_modules       = extensions,
+  package_data      = package_data
   )
diff --git a/src/PJ_aea.c b/src/PJ_aea.c
index 53f03b0..0881ba7 100644
--- a/src/PJ_aea.c
+++ b/src/PJ_aea.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: PJ_aea.c 1856 2010-06-11 03:26:04Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the aea (Albers Equal Area) projection.
  * Author:   Gerald Evenden
@@ -43,8 +41,6 @@
 #define PJ_LIB__
 #include <projects.h>
 
-PJ_CVSID("$Id: PJ_aea.c 1856 2010-06-11 03:26:04Z warmerdam $");
-
 # define EPS10	1.e-10
 # define TOL7	1.e-7
 
diff --git a/src/PJ_aeqd.c b/src/PJ_aeqd.c
index 0da1ea2..22a75ac 100644
--- a/src/PJ_aeqd.c
+++ b/src/PJ_aeqd.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: PJ_aeqd.c 2520 2014-09-13 20:19:37Z hobu $
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the aeqd (Azimuthal Equidistant) projection.
  * Author:   Gerald Evenden
@@ -36,21 +34,22 @@
 	double	Mp; \
 	double	He; \
 	double	G; \
-	int		mode;
+	int		mode; \
+	struct geod_geodesic g;
 #define PJ_LIB__
+#include	"geodesic.h"
 #include	<projects.h>
 
-PJ_CVSID("$Id: PJ_aeqd.c 2520 2014-09-13 20:19:37Z hobu $");
-
 PROJ_HEAD(aeqd, "Azimuthal Equidistant") "\n\tAzi, Sph&Ell\n\tlat_0 guam";
 
 #define EPS10 1.e-10
 #define TOL 1.e-14
 
 #define N_POLE	0
-#define S_POLE 1
+#define S_POLE	1
 #define EQUIT	2
 #define OBLIQ	3
+
 FORWARD(e_guam_fwd); /* Guam elliptical */
 	double  cosphi, sinphi, t;
 
@@ -63,7 +62,9 @@ FORWARD(e_guam_fwd); /* Guam elliptical */
 	return (xy);
 }
 FORWARD(e_forward); /* elliptical */
-	double  coslam, cosphi, sinphi, rho, s, H, H2, c, Az, t, ct, st, cA, sA;
+	double  coslam, cosphi, sinphi, rho;
+	double azi1, azi2, s12;
+	double lam1, phi1, lam2, phi2;
 
 	coslam = cos(lp.lam);
 	cosphi = cos(lp.phi);
@@ -82,22 +83,14 @@ FORWARD(e_forward); /* elliptical */
 			xy.x = xy.y = 0.;
 			break;
 		}
-		t = atan2(P->one_es * sinphi + P->es * P->N1 * P->sinph0 *
-			sqrt(1. - P->es * sinphi * sinphi), cosphi);
-		ct = cos(t); st = sin(t);
-		Az = atan2(sin(lp.lam) * ct, P->cosph0 * st - P->sinph0 * coslam * ct);
-		cA = cos(Az); sA = sin(Az);
-		s = aasin( P->ctx, fabs(sA) < TOL ?
-			(P->cosph0 * st - P->sinph0 * coslam * ct) / cA :
-			sin(lp.lam) * ct / sA );
-		H = P->He * cA;
-		H2 = H * H;
-		c = P->N1 * s * (1. + s * s * (- H2 * (1. - H2)/6. +
-			s * ( P->G * H * (1. - 2. * H2 * H2) / 8. +
-			s * ((H2 * (4. - 7. * H2) - 3. * P->G * P->G * (1. - 7. * H2)) /
-			120. - s * P->G * H / 48.))));
-		xy.x = c * sA;
-		xy.y = c * cA;
+
+		phi1 = P->phi0 / DEG_TO_RAD; lam1 = P->lam0 / DEG_TO_RAD;
+		phi2 = lp.phi / DEG_TO_RAD;  lam2 = (lp.lam+P->lam0) / DEG_TO_RAD;
+
+		geod_inverse(&P->g, phi1, lam1, phi2, lam2, &s12, &azi1, &azi2);
+		azi1 *= DEG_TO_RAD;
+		xy.x = s12 * sin(azi1) / P->a;
+		xy.y = s12 * cos(azi1) / P->a;
 		break;
 	}
 	return (xy);
@@ -117,7 +110,7 @@ FORWARD(s_forward); /* spherical */
 oblcon:
 		if (fabs(fabs(xy.y) - 1.) < TOL)
 			if (xy.y < 0.)
-				F_ERROR 
+				F_ERROR
 			else
 				xy.x = xy.y = 0.;
 		else {
@@ -154,7 +147,8 @@ INVERSE(e_guam_inv); /* Guam elliptical */
 	return (lp);
 }
 INVERSE(e_inverse); /* elliptical */
-	double c, Az, cosAz, A, B, D, E, F, psi, t;
+	double c;
+	double azi1, azi2, s12, x2, y2, lat1, lon1, lat2, lon2;
 
 	if ((c = hypot(xy.x, xy.y)) < EPS10) {
 		lp.phi = P->phi0;
@@ -162,23 +156,17 @@ INVERSE(e_inverse); /* elliptical */
 		return (lp);
 	}
 	if (P->mode == OBLIQ || P->mode == EQUIT) {
-		cosAz = cos(Az = atan2(xy.x, xy.y));
-		t = P->cosph0 * cosAz;
-		B = P->es * t / P->one_es;
-		A = - B * t;
-		B *= 3. * (1. - A) * P->sinph0;
-		D = c / P->N1;
-		E = D * (1. - D * D * (A * (1. + A) / 6. + B * (1. + 3.*A) * D / 24.));
-		F = 1. - E * E * (A / 2. + B * E / 6.);
-		psi = aasin(P->ctx, P->sinph0 * cos(E) + t * sin(E));
-		lp.lam = aasin(P->ctx, sin(Az) * sin(E) / cos(psi));
-		if ((t = fabs(psi)) < EPS10)
-			lp.phi = 0.;
-		else if (fabs(t - HALFPI) < 0.)
-			lp.phi = HALFPI;
-		else
-			lp.phi = atan((1. - P->es * F * P->sinph0 / sin(psi)) * tan(psi) /
-				P->one_es);
+
+		x2 = xy.x * P->a;
+		y2 = xy.y * P->a;
+		lat1 = P->phi0 / DEG_TO_RAD;
+		lon1 = P->lam0 / DEG_TO_RAD;
+		azi1 = atan2(x2, y2) / DEG_TO_RAD;
+		s12 = sqrt(x2 * x2 + y2 * y2);
+		geod_direct(&P->g, lat1, lon1, azi1, s12, &lat2, &lon2, &azi2);
+		lp.phi = lat2 * DEG_TO_RAD;
+		lp.lam = lon2 * DEG_TO_RAD;
+		lp.lam -= P->lam0;
 	} else { /* Polar */
 		lp.phi = pj_inv_mlfn(P->ctx, P->mode == N_POLE ? P->Mp - c : P->Mp + c,
 			P->es, P->en);
@@ -210,7 +198,7 @@ INVERSE(s_inverse); /* spherical */
 			xy.y = (cosc - P->sinph0 * sin(lp.phi)) * c_rh;
 			xy.x *= sinc * P->cosph0;
 		}
-		lp.lam = atan2(xy.x, xy.y);
+		lp.lam = xy.y == 0. ? 0. : atan2(xy.x, xy.y);
 	} else if (P->mode == N_POLE) {
 		lp.phi = HALFPI - c_rh;
 		lp.lam = atan2(xy.x, -xy.y);
@@ -228,6 +216,7 @@ FREEUP;
 	}
 }
 ENTRY1(aeqd, en)
+	geod_init(&P->g, P->a, P->es / (1 + sqrt(P->one_es)));
 	P->phi0 = pj_param(P->ctx, P->params, "rlat_0").f;
 	if (fabs(fabs(P->phi0) - HALFPI) < EPS10) {
 		P->mode = P->phi0 < 0. ? S_POLE : N_POLE;
diff --git a/src/PJ_airy.c b/src/PJ_airy.c
index abb4d12..73a51e5 100644
--- a/src/PJ_airy.c
+++ b/src/PJ_airy.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: PJ_airy.c 1856 2010-06-11 03:26:04Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the airy (Airy) projection.
  * Author:   Gerald Evenden
@@ -37,8 +35,6 @@
 #define PJ_LIB__
 #include <projects.h>
 
-PJ_CVSID("$Id: PJ_airy.c 1856 2010-06-11 03:26:04Z warmerdam $");
-
 PROJ_HEAD(airy, "Airy") "\n\tMisc Sph, no inv.\n\tno_cut lat_b=";
 
 # define EPS 1.e-10
diff --git a/src/PJ_aitoff.c b/src/PJ_aitoff.c
index 2606b63..d5350f2 100644
--- a/src/PJ_aitoff.c
+++ b/src/PJ_aitoff.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: PJ_aitoff.c 2369 2013-06-26 05:54:00Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the aitoff (Aitoff) and wintri (Winkel Tripel)
  *           projections.
@@ -34,10 +32,15 @@
 #define PJ_LIB__
 #include <projects.h>
 
-PJ_CVSID("$Id: PJ_aitoff.c 2369 2013-06-26 05:54:00Z warmerdam $");
+#ifndef M_PI
+#  define M_PI 3.14159265358979323846
+#endif
+#ifndef M_PI_2
+#  define M_PI_2 1.57079632679489661923
+#endif
 
-PROJ_HEAD(aitoff, "Aitoff") "\n\tMisc Sph, no inv.";
-PROJ_HEAD(wintri, "Winkel Tripel") "\n\tMisc Sph, no inv.\n\tlat_1";
+PROJ_HEAD(aitoff, "Aitoff") "\n\tMisc Sph";
+PROJ_HEAD(wintri, "Winkel Tripel") "\n\tMisc Sph\n\tlat_1";
 
 FORWARD(s_forward); /* spheroid */
 	double c, d;
@@ -53,10 +56,91 @@ FORWARD(s_forward); /* spheroid */
 	}
 	return (xy);
 }
+
+/***********************************************************************************
+*
+* Inverse functions added by Drazen Tutic and Lovro Gradiser based on paper:
+*           
+* I.Özbug Biklirici and Cengizhan Ipbüker. A General Algorithm for the Inverse 
+* Transformation of Map Projections Using Jacobian Matrices. In Proceedings of the
+* Third International Symposium Mathematical & Computational Applications,
+* pages 175{182, Turkey, September 2002.
+*
+* Expected accuracy is defined by EPSILON = 1e-12. Should be appropriate for 
+* most applications of Aitoff and Winkel Tripel projections.
+*
+* Longitudes of 180W and 180E can be mixed in solution obtained.
+*
+* Inverse for Aitoff projection in poles is undefined, longitude value of 0 is assumed.
+*
+* Contact : dtutic at geof.hr
+* Date: 2015-02-16
+*
+************************************************************************************/
+
+INVERSE(s_inverse); /* sphere */  
+        int iter, MAXITER = 10, round = 0, MAXROUND = 20;
+	double EPSILON = 1e-12, D, C, f1, f2, f1p, f1l, f2p, f2l, dp, dl, sl, sp, cp, cl, x, y;
+
+	if ((fabs(xy.x) < EPSILON) && (fabs(xy.y) < EPSILON )) { lp.phi = 0.; lp.lam = 0.; return (lp); }
+
+	/* intial values for Newton-Raphson method */
+	lp.phi = xy.y; lp.lam = xy.x; 
+	do {
+		iter = 0; 
+		do { 
+			sl = sin(lp.lam * 0.5); cl = cos(lp.lam * 0.5); 
+			sp = sin(lp.phi); cp = cos(lp.phi); 
+			D = cp * cl;
+ 		      	C = 1. - D * D;
+			D = acos(D) / pow(C, 1.5);
+	       		f1 = 2. * D * C * cp * sl;
+		       	f2 = D * C * sp;
+		       	f1p = 2.* (sl * cl * sp * cp / C - D * sp * sl);
+		       	f1l = cp * cp * sl * sl / C + D * cp * cl * sp * sp;
+		    	f2p = sp * sp * cl / C + D * sl * sl * cp;
+		      	f2l = 0.5 * (sp * cp * sl / C - D * sp * cp * cp * sl * cl);
+		      	if (P->mode) { /* Winkel Tripel */
+				f1 = 0.5 * (f1 + lp.lam * P->cosphi1);
+				f2 = 0.5 * (f2 + lp.phi);
+				f1p *= 0.5;
+				f1l = 0.5 * (f1l + P->cosphi1);
+				f2p = 0.5 * (f2p + 1.);
+				f2l *= 0.5;
+			}
+			f1 -= xy.x; f2 -= xy.y;
+			dl = (f2 * f1p - f1 * f2p) / (dp = f1p * f2l - f2p * f1l);
+			dp = (f1 * f2l - f2 * f1l) / dp;
+			while (dl > M_PI) dl -= M_PI; /* set to interval [-M_PI, M_PI]  */
+			while (dl < -M_PI) dl += M_PI; /* set to interval [-M_PI, M_PI]  */
+			lp.phi -= dp;	lp.lam -= dl;
+		} while ((fabs(dp) > EPSILON || fabs(dl) > EPSILON) && (iter++ < MAXITER));
+		if (lp.phi > M_PI_2) lp.phi -= 2.*(lp.phi-M_PI_2); /* correct if symmetrical solution for Aitoff */ 
+		if (lp.phi < -M_PI_2) lp.phi -= 2.*(lp.phi+M_PI_2); /* correct if symmetrical solution for Aitoff */ 
+		if ((fabs(fabs(lp.phi) - M_PI_2) < EPSILON) && (!P->mode)) lp.lam = 0.; /* if pole in Aitoff, return longitude of 0 */ 
+
+		/* calculate x,y coordinates with solution obtained */
+		if((D = acos(cos(lp.phi) * cos(C = 0.5 * lp.lam)))) {/* Aitoff */
+			x = 2. * D * cos(lp.phi) * sin(C) * (y = 1. / sin(D));
+			y *= D * sin(lp.phi);
+		} else
+			x = y = 0.;
+		if (P->mode) { /* Winkel Tripel */
+			x = (x + lp.lam * P->cosphi1) * 0.5;
+			y = (y + lp.phi) * 0.5;
+		}
+	/* if too far from given values of x,y, repeat with better approximation of phi,lam */
+	} while (((fabs(xy.x-x) > EPSILON) || (fabs(xy.y-y) > EPSILON)) && (round++ < MAXROUND));
+
+	if (iter == MAXITER && round == MAXROUND) fprintf(stderr, "Warning: Accuracy of 1e-12 not reached. Last increments: dlat=%e and dlon=%e\n", dp, dl);
+
+	return (lp);
+}
+
 FREEUP; if (P) pj_dalloc(P); }
 	static PJ *
 setup(PJ *P) {
-	P->inv = 0;
+	P->inv = s_inverse;
 	P->fwd = s_forward;
 	P->es = 0.;
 	return P;
diff --git a/src/PJ_august.c b/src/PJ_august.c
index 4e6dab9..496fc3c 100644
--- a/src/PJ_august.c
+++ b/src/PJ_august.c
@@ -4,6 +4,7 @@ PROJ_HEAD(august, "August Epicycloidal") "\n\tMisc Sph, no inv.";
 #define M 1.333333333333333
 FORWARD(s_forward); /* spheroid */
 	double t, c1, c, x1, x12, y1, y12;
+	(void) P;
 
 	t = tan(.5 * lp.phi);
 	c1 = sqrt(1. - t * t);
diff --git a/src/PJ_boggs.c b/src/PJ_boggs.c
index 48fdc9a..b22a25f 100644
--- a/src/PJ_boggs.c
+++ b/src/PJ_boggs.c
@@ -11,6 +11,7 @@ PROJ_HEAD(boggs, "Boggs Eumorphic") "\n\tPCyl., no inv., Sph.";
 FORWARD(s_forward); /* spheroid */
 	double theta, th1, c;
 	int i;
+	(void) P;
 
 	theta = lp.phi;
 	if (fabs(fabs(lp.phi) - HALFPI) < EPS)
diff --git a/src/PJ_cc.c b/src/PJ_cc.c
index be1191b..0f57392 100644
--- a/src/PJ_cc.c
+++ b/src/PJ_cc.c
@@ -11,6 +11,7 @@ FORWARD(s_forward); /* spheroid */
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.phi = atan(xy.y);
 	lp.lam = xy.x;
 	return (lp);
diff --git a/src/PJ_cea.c b/src/PJ_cea.c
index f5b7883..44c0a88 100644
--- a/src/PJ_cea.c
+++ b/src/PJ_cea.c
@@ -40,11 +40,14 @@ FREEUP;
 	}
 }
 ENTRY1(cea, apa)
-	double t;
+	double t = 0.0;
 
-	if (pj_param(P->ctx, P->params, "tlat_ts").i &&
-	    (P->k0 = cos(t = pj_param(P->ctx, P->params, "rlat_ts").f)) < 0.)
-	  E_ERROR(-24);
+	if (pj_param(P->ctx, P->params, "tlat_ts").i) {
+		P->k0 = cos(t = pj_param(P->ctx, P->params, "rlat_ts").f);
+		if (P->k0 < 0.) {
+			E_ERROR(-24);
+		}
+	}
 	if (P->es) {
 		t = sin(t);
 		P->k0 /= sqrt(1. - P->es * t * t);
diff --git a/src/PJ_collg.c b/src/PJ_collg.c
index ca389a6..871dfc9 100644
--- a/src/PJ_collg.c
+++ b/src/PJ_collg.c
@@ -5,6 +5,7 @@ PROJ_HEAD(collg, "Collignon") "\n\tPCyl, Sph.";
 #define FYC	1.77245385090551602729
 #define ONEEPS	1.0000001
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	if ((xy.y = 1. - sin(lp.phi)) <= 0.)
 		xy.y = 0.;
 	else
diff --git a/src/PJ_crast.c b/src/PJ_crast.c
index 5351a39..3f251ac 100644
--- a/src/PJ_crast.c
+++ b/src/PJ_crast.c
@@ -8,12 +8,14 @@ PROJ_HEAD(crast, "Craster Parabolic (Putnins P4)")
 #define RYM	0.32573500793527994772
 #define THIRD	0.333333333333333333
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	lp.phi *= THIRD;
 	xy.x = XM * lp.lam * (2. * cos(lp.phi + lp.phi) - 1.);
 	xy.y = YM * sin(lp.phi);
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.phi = 3. * asin(xy.y * RYM);
 	lp.lam = xy.x * RXM / (2. * cos((lp.phi + lp.phi) * THIRD) - 1);
 	return (lp);
diff --git a/src/PJ_denoy.c b/src/PJ_denoy.c
index 8b80031..b1a6fe8 100644
--- a/src/PJ_denoy.c
+++ b/src/PJ_denoy.c
@@ -7,6 +7,7 @@ PROJ_HEAD(denoy, "Denoyer Semi-Elliptical") "\n\tPCyl., no inv., Sph.";
 #define D1	0.9
 #define D5	0.03
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.y = lp.phi;
 	xy.x = lp.lam;
 	lp.lam = fabs(lp.lam);
diff --git a/src/PJ_eck1.c b/src/PJ_eck1.c
index 9b31b09..b0b43da 100644
--- a/src/PJ_eck1.c
+++ b/src/PJ_eck1.c
@@ -4,11 +4,13 @@ PROJ_HEAD(eck1, "Eckert I") "\n\tPCyl., Sph.";
 #define FC	.92131773192356127802
 #define RP	.31830988618379067154
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.x = FC * lp.lam * (1. - RP * fabs(lp.phi));
 	xy.y = FC * lp.phi;
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.phi = xy.y / FC;
 	lp.lam = xy.x / (FC * (1. - RP * fabs(lp.phi)));
 	return (lp);
diff --git a/src/PJ_eck2.c b/src/PJ_eck2.c
index f8e0154..08b6559 100644
--- a/src/PJ_eck2.c
+++ b/src/PJ_eck2.c
@@ -6,6 +6,7 @@ PROJ_HEAD(eck2, "Eckert II") "\n\tPCyl. Sph.";
 #define C13	0.33333333333333333333
 #define ONEEPS	1.0000001
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.x = FXC * lp.lam * (xy.y = sqrt(4. - 3. * sin(fabs(lp.phi))));
 	xy.y = FYC * (2. - xy.y);
 	if ( lp.phi < 0.) xy.y = -xy.y;
diff --git a/src/PJ_eck4.c b/src/PJ_eck4.c
index f90267d..0bedbbc 100644
--- a/src/PJ_eck4.c
+++ b/src/PJ_eck4.c
@@ -11,6 +11,7 @@ PROJ_HEAD(eck4, "Eckert IV") "\n\tPCyl, Sph.";
 FORWARD(s_forward); /* spheroid */
 	double p, V, s, c;
 	int i;
+	(void) P;
 
 	p = C_p * sin(lp.phi);
 	V = lp.phi * lp.phi;
diff --git a/src/PJ_eck5.c b/src/PJ_eck5.c
index 3eeb332..029c18e 100644
--- a/src/PJ_eck5.c
+++ b/src/PJ_eck5.c
@@ -6,11 +6,13 @@ PROJ_HEAD(eck5, "Eckert V") "\n\tPCyl, Sph.";
 #define YF	0.88202554344910296438
 #define RYF	1.13375401361911319568
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.x = XF * (1. + cos(lp.phi)) * lp.lam;
 	xy.y = YF * lp.phi;
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.lam = RXF * xy.x / (1. + cos( lp.phi = RYF * xy.y));
 	return (lp);
 }
diff --git a/src/PJ_fahey.c b/src/PJ_fahey.c
index 93e9b38..007fc90 100644
--- a/src/PJ_fahey.c
+++ b/src/PJ_fahey.c
@@ -3,11 +3,13 @@
 PROJ_HEAD(fahey, "Fahey") "\n\tPcyl, Sph.";
 #define TOL 1e-6
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.y = 1.819152 * ( xy.x = tan(0.5 * lp.phi) );
 	xy.x = 0.819152 * lp.lam * asqrt(1 - xy.x * xy.x);
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.phi = 2. * atan(xy.y /= 1.819152);
 	lp.lam = fabs(xy.y = 1. - xy.y * xy.y) < TOL ? 0. :
 		xy.x / (0.819152 * sqrt(xy.y));
diff --git a/src/PJ_gall.c b/src/PJ_gall.c
index 3c507bd..1acd7d0 100644
--- a/src/PJ_gall.c
+++ b/src/PJ_gall.c
@@ -6,11 +6,13 @@ PROJ_HEAD(gall, "Gall (Gall Stereographic)") "\n\tCyl, Sph";
 #define RYF	0.58578643762690495119
 #define RXF	1.41421356237309504880
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.x = XF * lp.lam;
 	xy.y = YF * tan(.5 * lp.phi);
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.lam = RXF * xy.x;
 	lp.phi = 2. * atan(xy.y * RYF);
 	return (lp);
diff --git a/src/PJ_geos.c b/src/PJ_geos.c
index 76fa1d9..09393ad 100644
--- a/src/PJ_geos.c
+++ b/src/PJ_geos.c
@@ -4,8 +4,6 @@
 ** Copyright (c) 2004   Gerald I. Evenden
 ** Copyright (c) 2012   Martin Raspaud
 */
-static const char
-LIBPROJ_ID[] = "$Id: PJ_geos.c 2411 2013-12-09 18:13:15Z warmerdam $";
 /*
 ** See also (section 4.4.3.2):
 **   http://www.eumetsat.int/en/area4/msg/news/us_doc/cgms_03_26.pdf
diff --git a/src/PJ_gins8.c b/src/PJ_gins8.c
index 0747d76..b7f38ad 100644
--- a/src/PJ_gins8.c
+++ b/src/PJ_gins8.c
@@ -6,6 +6,7 @@ PROJ_HEAD(gins8, "Ginsburg VIII (TsNIIGAiK)") "\n\tPCyl, Sph., no inv.";
 #define	C12 0.08333333333333333
 FORWARD(s_forward); /* spheroid */
 	double t = lp.phi * lp.phi;
+	(void) P;
 
 	xy.y = lp.phi * (1. + t * C12);
 	xy.x = lp.lam * (1. - Cp * t);
diff --git a/src/PJ_hammer.c b/src/PJ_hammer.c
index 719a2ce..31e7a12 100644
--- a/src/PJ_hammer.c
+++ b/src/PJ_hammer.c
@@ -2,9 +2,10 @@
 	double w; \
 	double m, rm;
 #define PJ_LIB__
+#define EPS 1.0e-10
 # include	<projects.h>
 PROJ_HEAD(hammer, "Hammer & Eckert-Greifendorff")
-	"\n\tMisc Sph, no inv.\n\tW= M=";
+	"\n\tMisc Sph, \n\tW= M=";
 FORWARD(s_forward); /* spheroid */
 	double cosphi, d;
 
@@ -13,6 +14,19 @@ FORWARD(s_forward); /* spheroid */
 	xy.y = P->rm * d * sin(lp.phi);
 	return (xy);
 }
+INVERSE(s_inverse); /* spheroid */
+	double z;
+	z = sqrt(1. - 0.25*P->w*P->w*xy.x*xy.x - 0.25*xy.y*xy.y);
+	if (fabs(2.*z*z-1.) < EPS) {
+		lp.lam = HUGE_VAL;
+		lp.phi = HUGE_VAL;
+		pj_errno = -14;
+	} else {
+		lp.lam = aatan2(P->w * xy.x * z,2. * z * z - 1)/P->w;
+		lp.phi = aasin(P->ctx,z * xy.y);
+	}
+	return (lp);
+}
 FREEUP; if (P) pj_dalloc(P); }
 ENTRY0(hammer)
 	if (pj_param(P->ctx, P->params, "tW").i) {
@@ -25,5 +39,5 @@ ENTRY0(hammer)
 		P->m = 1.;
 	P->rm = 1. / P->m;
 	P->m /= P->w;
-	P->es = 0.; P->fwd = s_forward;
+	P->es = 0.; P->fwd = s_forward; P->inv = s_inverse;
 ENDENTRY(P)
diff --git a/src/PJ_hammer.c.diff b/src/PJ_hammer.c.diff
deleted file mode 100644
index 5fb8a47..0000000
--- a/src/PJ_hammer.c.diff
+++ /dev/null
@@ -1,41 +0,0 @@
---- ../../proj/src/PJ_hammer.c	2011-12-15 09:24:19.000000000 -0700
-+++ PJ_hammer.c	2012-04-02 15:37:13.000000000 -0600
-@@ -2,9 +2,10 @@
- 	double w; \
- 	double m, rm;
- #define PJ_LIB__
-+# define EPS 1.0e-10
- # include	<projects.h>
- PROJ_HEAD(hammer, "Hammer & Eckert-Greifendorff")
--	"\n\tMisc Sph, no inv.\n\tW= M=";
-+	"\n\tMisc Sph, \n\tW= M=";
- FORWARD(s_forward); /* spheroid */
- 	double cosphi, d;
- 
-@@ -13,6 +14,19 @@
- 	xy.y = P->rm * d * sin(lp.phi);
- 	return (xy);
- }
-+INVERSE(s_inverse); /* spheroid */
-+        double z;
-+	z = sqrt(1. - 0.25*P->w*P->w*xy.x*xy.x - 0.25*xy.y*xy.y);
-+	if (fabs(2.*z*z-1.) < EPS) {
-+           lp.lam = HUGE_VAL;
-+           lp.phi = HUGE_VAL;
-+           pj_errno = -14;
-+	} else {
-+	   lp.lam = aatan2(P->w * xy.x * z,2. * z * z - 1)/P->w;
-+	   lp.phi = aasin(P->ctx,z * xy.y);
-+        }
-+	return (lp);
-+}
- FREEUP; if (P) pj_dalloc(P); }
- ENTRY0(hammer)
- 	if (pj_param(P->ctx, P->params, "tW").i) {
-@@ -25,5 +39,5 @@
- 		P->m = 1.;
- 	P->rm = 1. / P->m;
- 	P->m /= P->w;
--	P->es = 0.; P->fwd = s_forward;
-+	P->es = 0.; P->fwd = s_forward; P->inv = s_inverse;
- ENDENTRY(P)
diff --git a/src/PJ_hatano.c b/src/PJ_hatano.c
index 8e0ff5c..7516ba6 100644
--- a/src/PJ_hatano.c
+++ b/src/PJ_hatano.c
@@ -17,6 +17,7 @@ PROJ_HEAD(hatano, "Hatano Asymmetrical Equal Area") "\n\tPCyl, Sph.";
 FORWARD(s_forward); /* spheroid */
 	double th1, c;
 	int i;
+	(void) P;
 
 	c = sin(lp.phi) * (lp.phi < 0. ? CS : CN);
 	for (i = NITER; i; --i) {
diff --git a/src/PJ_healpix.c b/src/PJ_healpix.c
index 2cc918b..12d57ff 100644
--- a/src/PJ_healpix.c
+++ b/src/PJ_healpix.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: PJ_healpix.c 1504 2011-10-18 14:58:57Z landcare $
- *
  * Project: PROJ.4
  * Purpose: Implementation of the HEALPix and rHEALPix projections.
  *          For background see <http://code.scenzgrid.org/index.php/p/scenzgrid-py/source/tree/master/docs/rhealpix_dggs.pdf>.
@@ -466,6 +464,7 @@ static XY combine_caps(double x, double y, int north_square, int south_square,
     }
 }
 FORWARD(s_healpix_forward); /* sphere  */
+    (void) P;
     (void) xy;
     return healpix_sphere(lp);
 }
diff --git a/src/PJ_isea.c b/src/PJ_isea.c
index c68861d..7c09189 100644
--- a/src/PJ_isea.c
+++ b/src/PJ_isea.c
@@ -59,7 +59,7 @@ int hex_iso(struct hex *h) {
 }
 
 ISEA_STATIC
-int hexbin2(int horizontal, double width, double x, double y,
+int hexbin2(double width, double x, double y,
                 int *i, int *j) {
 	double z, rx, ry, rz;
 	double abs_dx, abs_dy, abs_dz;
@@ -160,10 +160,10 @@ ISEA_STATIC
 struct snyder_constants constants[] = {
 	{23.80018260, 62.15458023, 60.0, 3.75, 1.033, 0.968, 5.09, 1.195, 1.0},
 	{20.07675127, 55.69063953, 54.0, 2.65, 1.030, 0.983, 3.59, 1.141, 1.027},
-	{0.0},
-	{0.0},
-	{0.0},
-	{0.0},
+	{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
+	{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
+	{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
+	{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0},
 	{37.37736814, 36.0, 30.0, 17.27, 1.163, 0.860, 13.14, 1.584, 1.0},
 };
 
@@ -369,23 +369,14 @@ isea_snyder_forward(struct isea_geo * ll, struct isea_pt * out)
 		center = icostriangles[i];
 
 		/* step 1 */
-#if 0
-		z = sph_distance(center.lon, center.lat, ll->lon, ll->lat);
-#else
 		z = acos(sin(center.lat) * sin(ll->lat)
 			 + cos(center.lat) * cos(ll->lat) * cos(ll->lon - center.lon));
-#endif
-
 		/* not on this triangle */
 		if (z > g + 0.000005) { /* TODO DBL_EPSILON */
 			continue;
 		}
-		Az = sph_azimuth(ll->lon, ll->lat, center.lon, center.lat);
 
-		Az = atan2(cos(ll->lat) * sin(ll->lon - center.lon),
-			   cos(center.lat) * sin(ll->lat)
-		- sin(center.lat) * cos(ll->lat) * cos(ll->lon - center.lon)
-			);
+		Az = sph_azimuth(center.lon, center.lat, ll->lon, ll->lat);
 
 		/* step 2 */
 
@@ -735,7 +726,7 @@ isea_dddi_ap3odd(struct isea_dgg *g, int quad, struct isea_pt *pt, struct isea_p
 	maxcoord = (int) (sidelength * 2.0 + 0.5);
 
 	v = *pt;
-	hexbin2(0, hexwidth, v.x, v.y, &h.x, &h.y);
+	hexbin2(hexwidth, v.x, v.y, &h.x, &h.y);
 	h.iso = 0;
 	hex_iso(&h);
 
@@ -813,7 +804,7 @@ isea_dddi(struct isea_dgg *g, int quad, struct isea_pt *pt, struct isea_pt *di)
 
 	v = *pt;
 	isea_rotate(&v, -30.0);
-	hexbin2(0, hexwidth, v.x, v.y, &h.x, &h.y);
+	hexbin2(hexwidth, v.x, v.y, &h.x, &h.y);
 	h.iso = 0;
 	hex_iso(&h);
 
@@ -976,13 +967,11 @@ ISEA_STATIC
 struct isea_pt
 isea_forward(struct isea_dgg *g, struct isea_geo *in)
 {
-	int             tri, downtri;
+	int             tri;
 	struct isea_pt  out, coord;
 
 	tri = isea_transform(g, in, &out);
 
-	downtri = (((tri - 1) / 5) % 2 == 1);
-
 	if (g->output == ISEA_PLANE) {
 		isea_tri_plane(tri, &out, g->radius);
 		return out;
diff --git a/src/PJ_krovak.c b/src/PJ_krovak.c
index ac21df6..dd25013 100644
--- a/src/PJ_krovak.c
+++ b/src/PJ_krovak.c
@@ -1,5 +1,5 @@
 /******************************************************************************
- * $Id: PJ_krovak.c 1856 2010-06-11 03:26:04Z warmerdam $
+ * $Id$
  *
  * Project:  PROJ.4
  * Purpose:  Implementation of the krovak (Krovak) projection.
@@ -37,8 +37,6 @@
 #include <string.h>
 #include <stdio.h>
 
-PJ_CVSID("$Id: PJ_krovak.c 1856 2010-06-11 03:26:04Z warmerdam $");	
-
 PROJ_HEAD(krovak, "Krovak") "\n\tPCyl., Ellps.";
 
 /**
@@ -74,9 +72,9 @@ FORWARD(e_forward); /* ellipsoid */
 	double gfi, u, fi0, deltav, s, d, eps, ro;
 
 
-	s45 = 0.785398163397448;    /* 45� */
+	s45 = 0.785398163397448;    /* 45deg */
 	s90 = 2 * s45;
-	fi0 = P->phi0;    /* Latitude of projection centre 49� 30' */
+	fi0 = P->phi0;    /* Latitude of projection centre 49deg 30' */
 
    /* Ellipsoid is used as Parameter in for.c and inv.c, therefore a must 
       be set to 1 here.
@@ -98,7 +96,7 @@ FORWARD(e_forward); /* ellipsoid */
 
 	k1 = P->k0;
 	n0 = a * sqrt(1. - e2) / (1. - e2 * pow(sin(fi0), 2));
-	s0 = 1.37008346281555;       /* Latitude of pseudo standard parallel 78� 30'00" N */
+	s0 = 1.37008346281555;       /* Latitude of pseudo standard parallel 78deg 30'00" N */
 	n = sin(s0);
 	ro0 = k1 * n0 / tan(s0);
 	ad = s90 - uq;
@@ -140,9 +138,9 @@ INVERSE(e_inverse); /* ellipsoid */
 	double u, deltav, s, d, eps, ro, fi1, xy0;
 	int ok;
 
-	s45 = 0.785398163397448;    /* 45� */
+	s45 = 0.785398163397448;    /* 45deg */
 	s90 = 2 * s45;
-	fi0 = P->phi0;    /* Latitude of projection centre 49� 30' */
+	fi0 = P->phi0;    /* Latitude of projection centre 49deg 30' */
 
 
    /* Ellipsoid is used as Parameter in for.c and inv.c, therefore a must 
@@ -164,7 +162,7 @@ INVERSE(e_inverse); /* ellipsoid */
 
 	k1 = P->k0;
 	n0 = a * sqrt(1. - e2) / (1. - e2 * pow(sin(fi0), 2));
-	s0 = 1.37008346281555;       /* Latitude of pseudo standard parallel 78� 30'00" N */
+	s0 = 1.37008346281555;       /* Latitude of pseudo standard parallel 78deg 30'00" N */
 	n = sin(s0);
 	ro0 = k1 * n0 / tan(s0);
 	ad = s90 - uq;
diff --git a/src/PJ_larr.c b/src/PJ_larr.c
index 5bab2b0..118bef0 100644
--- a/src/PJ_larr.c
+++ b/src/PJ_larr.c
@@ -4,6 +4,7 @@
 PROJ_HEAD(larr, "Larrivee") "\n\tMisc Sph, no inv.";
 #define SIXTH .16666666666666666
 FORWARD(s_forward); /* sphere */
+	(void) P;
 	xy.x = 0.5 * lp.lam * (1. + sqrt(cos(lp.phi)));
 	xy.y = lp.phi / (cos(0.5 * lp.phi) * cos(SIXTH * lp.lam));
 	return (xy);
diff --git a/src/PJ_lask.c b/src/PJ_lask.c
index 05e80a1..797b580 100644
--- a/src/PJ_lask.c
+++ b/src/PJ_lask.c
@@ -14,6 +14,7 @@ PROJ_HEAD(lask, "Laskowski") "\n\tMisc Sph, no inv.";
 #define	b05	-0.0491032
 FORWARD(s_forward); /* sphere */
 	double l2, p2;
+	(void) P;
 
 	l2 = lp.lam * lp.lam;
 	p2 = lp.phi * lp.phi;
diff --git a/src/PJ_lcca.c b/src/PJ_lcca.c
index 0e3289f..320d52d 100644
--- a/src/PJ_lcca.c
+++ b/src/PJ_lcca.c
@@ -1,4 +1,3 @@
-static const char RCS_ID[] = "$Id: PJ_lcca.c 1856 2010-06-11 03:26:04Z warmerdam $";
 /* PROJ.4 Cartographic Projection System 
 */
 #define MAX_ITER 10
@@ -51,7 +50,7 @@ INVERSE(e_inverse); /* ellipsoid & spheroid */
 }
 FREEUP; if (P) { if (P->en) pj_dalloc(P->en); pj_dalloc(P); } }
 ENTRY0(lcca)
-	double s2p0, N0, R0, tan0, tan20;
+	double s2p0, N0, R0, tan0;
 
 	if (!(P->en = pj_enfn(P->es))) E_ERROR_0;
 	if (!pj_param(P->ctx, P->params, "tlat_0").i) E_ERROR(50);
@@ -63,7 +62,6 @@ ENTRY0(lcca)
 	N0 = sqrt(R0);
 	R0 *= P->one_es * N0;
 	tan0 = tan(P->phi0);
-	tan20 = tan0 * tan0;
 	P->r0 = N0 / tan0;
 	P->C = 1. / (6. * R0 * N0);
 	P->inv = e_inverse;
diff --git a/src/PJ_mbt_fps.c b/src/PJ_mbt_fps.c
index 57a96e7..3cd5e67 100644
--- a/src/PJ_mbt_fps.c
+++ b/src/PJ_mbt_fps.c
@@ -12,6 +12,7 @@ PROJ_HEAD(mbt_fps, "McBryde-Thomas Flat-Pole Sine (No. 2)") "\n\tCyl., Sph.";
 FORWARD(s_forward); /* spheroid */
 	double k, V, t;
 	int i;
+	(void) P;
 
 	k = C3 * sin(lp.phi);
 	for (i = MAX_ITER; i ; --i) {
diff --git a/src/PJ_mbtfpp.c b/src/PJ_mbtfpp.c
index 9549a23..433d3c8 100644
--- a/src/PJ_mbtfpp.c
+++ b/src/PJ_mbtfpp.c
@@ -8,6 +8,7 @@ PROJ_HEAD(mbtfpp, "McBride-Thomas Flat-Polar Parabolic") "\n\tCyl., Sph.";
 #define C13	.33333333333333333333
 #define ONEEPS	1.0000001
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	lp.phi = asin(CS * sin(lp.phi));
 	xy.x = FXC * lp.lam * (2. * cos(C23 * lp.phi) - 1.);
 	xy.y = FYC * sin(C13 * lp.phi);
diff --git a/src/PJ_mbtfpq.c b/src/PJ_mbtfpq.c
index 3298db4..0d343fa 100644
--- a/src/PJ_mbtfpq.c
+++ b/src/PJ_mbtfpq.c
@@ -13,6 +13,7 @@ PROJ_HEAD(mbtfpq, "McBryde-Thomas Flat-Polar Quartic") "\n\tCyl., Sph.";
 FORWARD(s_forward); /* spheroid */
 	double th1, c;
 	int i;
+	(void) P;
 
 	c = C * sin(lp.phi);
 	for (i = NITER; i; --i) {
diff --git a/src/PJ_mill.c b/src/PJ_mill.c
index 03c3559..c4cee7f 100644
--- a/src/PJ_mill.c
+++ b/src/PJ_mill.c
@@ -2,11 +2,13 @@
 # include	<projects.h>
 PROJ_HEAD(mill, "Miller Cylindrical") "\n\tCyl, Sph";
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.x = lp.lam;
 	xy.y = log(tan(FORTPI + lp.phi * .4)) * 1.25;
 	return (xy);
 }
 INVERSE(s_inverse); /* spheroid */
+	(void) P;
 	lp.lam = xy.x;
 	lp.phi = 2.5 * (atan(exp(.8 * xy.y)) - FORTPI);
 	return (lp);
diff --git a/src/PJ_moll.c b/src/PJ_moll.c
index 98f0457..cf9369d 100644
--- a/src/PJ_moll.c
+++ b/src/PJ_moll.c
@@ -29,8 +29,12 @@ FORWARD(s_forward); /* spheroid */
 INVERSE(s_inverse); /* spheroid */
 	lp.phi = aasin(P->ctx, xy.y / P->C_y);
 	lp.lam = xy.x / (P->C_x * cos(lp.phi));
-	lp.phi += lp.phi;
-	lp.phi = aasin(P->ctx, (lp.phi + sin(lp.phi)) / P->C_p);
+        if (fabs(lp.lam) < PI) {
+            lp.phi += lp.phi;
+            lp.phi = aasin(P->ctx, (lp.phi + sin(lp.phi)) / P->C_p);
+        } else {
+            lp.lam = lp.phi = HUGE_VAL;
+        }
 	return (lp);
 }
 FREEUP; if (P) pj_dalloc(P); }
diff --git a/src/PJ_natearth.c b/src/PJ_natearth.c
index f83a3ff..0f28341 100644
--- a/src/PJ_natearth.c
+++ b/src/PJ_natearth.c
@@ -36,6 +36,7 @@ PROJ_HEAD(natearth, "Natural Earth") "\n\tPCyl., Sph.";
 
 FORWARD(s_forward); /* spheroid */
 	double phi2, phi4;
+	(void) P;
 
 	phi2 = lp.phi * lp.phi;
 	phi4 = phi2 * phi2;
@@ -45,6 +46,7 @@ FORWARD(s_forward); /* spheroid */
 }
 INVERSE(s_inverse); /* spheroid */
 	double yc, tol, y2, y4, f, fder;
+	(void) P;
 
         /* make sure y is inside valid range */
 	if (xy.y > MAX_Y) {
diff --git a/src/PJ_nell.c b/src/PJ_nell.c
index dd41b46..77983de 100644
--- a/src/PJ_nell.c
+++ b/src/PJ_nell.c
@@ -6,6 +6,7 @@ PROJ_HEAD(nell, "Nell") "\n\tPCyl., Sph.";
 FORWARD(s_forward); /* spheroid */
 	double k, V;
 	int i;
+	(void) P;
 
 	k = 2. * sin(lp.phi);
 	V = lp.phi * lp.phi;
diff --git a/src/PJ_nell_h.c b/src/PJ_nell_h.c
index 670dea8..22061ea 100644
--- a/src/PJ_nell_h.c
+++ b/src/PJ_nell_h.c
@@ -4,6 +4,7 @@ PROJ_HEAD(nell_h, "Nell-Hammer") "\n\tPCyl., Sph.";
 #define NITER 9
 #define EPS 1e-7
 FORWARD(s_forward); /* spheroid */
+	(void) P;
 	xy.x = 0.5 * lp.lam * (1. + cos(lp.phi));
 	xy.y = 2.0 * (lp.phi - tan(0.5 *lp.phi));
 	return (xy);
@@ -11,6 +12,7 @@ FORWARD(s_forward); /* spheroid */
 INVERSE(s_inverse); /* spheroid */
 	double V, c, p;
 	int i;
+	(void) P;
 
 	p = 0.5 * xy.y;
 	for (i = NITER; i ; --i) {
diff --git a/src/PJ_nocol.c b/src/PJ_nocol.c
index f129eb2..2b005e1 100644
--- a/src/PJ_nocol.c
+++ b/src/PJ_nocol.c
@@ -3,6 +3,8 @@
 PROJ_HEAD(nicol, "Nicolosi Globular") "\n\tMisc Sph, no inv.";
 #define EPS	1e-10
 FORWARD(s_forward); /* spheroid */
+	(void) P;
+
 	if (fabs(lp.lam) < EPS) {
 		xy.x = 0;
 		xy.y = lp.phi;
diff --git a/src/PJ_nzmg.c b/src/PJ_nzmg.c
index 5a28541..60df004 100644
--- a/src/PJ_nzmg.c
+++ b/src/PJ_nzmg.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: PJ_nzmg.c 1504 2009-01-06 02:11:57Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the nzmg (New Zealand Map Grid) projection.
  *           Very loosely based upon DMA code by Bradford W. Drew
@@ -31,8 +29,6 @@
 #define PJ_LIB__
 #include	<projects.h>
 
-PJ_CVSID("$Id: PJ_nzmg.c 1504 2009-01-06 02:11:57Z warmerdam $");
-
 PROJ_HEAD(nzmg, "New Zealand Map Grid") "\n\tfixed Earth";
 
 #define EPSLN 1e-10
diff --git a/src/PJ_omerc.c b/src/PJ_omerc.c
index 310d774..8a9fa0d 100644
--- a/src/PJ_omerc.c
+++ b/src/PJ_omerc.c
@@ -97,7 +97,7 @@ INVERSE(e_inverse); /* ellipsoid */
 FREEUP; if (P) pj_dalloc(P); }
 ENTRY0(omerc)
 	double con, com, cosph0, D, F, H, L, sinph0, p, J, gamma=0,
-		gamma0, lamc=0, lam1=0, lam2=0, phi1=0, phi2=0, alpha_c;
+		gamma0, lamc=0, lam1=0, lam2=0, phi1=0, phi2=0, alpha_c=0;
 	int alp, gam, no_off = 0;
 
 	P->no_rot = pj_param(P->ctx, P->params, "tno_rot").i;
diff --git a/src/PJ_putp2.c b/src/PJ_putp2.c
index 33bc67a..d6fcaea 100644
--- a/src/PJ_putp2.c
+++ b/src/PJ_putp2.c
@@ -10,6 +10,7 @@ PROJ_HEAD(putp2, "Putnins P2") "\n\tPCyl., Sph.";
 FORWARD(s_forward); /* spheroid */
 	double p, c, s, V;
 	int i;
+	(void) P;
 
 	p = C_p * sin(lp.phi);
 	s = lp.phi * lp.phi;
diff --git a/src/PJ_qsc.c b/src/PJ_qsc.c
index 1c7a443..12cb9d6 100644
--- a/src/PJ_qsc.c
+++ b/src/PJ_qsc.c
@@ -105,11 +105,8 @@ qsc_shift_lon_origin(double lon, double offset) {
 /* Forward projection, ellipsoid */
 FORWARD(e_forward);
         double lat, lon;
-        double sinlat, coslat;
-        double sinlon, coslon;
-        double q, r, s;
         double theta, phi;
-        double t, mu, nu;
+        double t, mu; /* nu; */
         int area;
 
         /* Convert the geodetic latitude to a geocentric latitude.
@@ -127,35 +124,7 @@ FORWARD(e_forward);
          * directly from phi, lam. For the other faces, we must use
          * unit sphere cartesian coordinates as an intermediate step. */
         lon = lp.lam;
-        if (P->face != FACE_TOP && P->face != FACE_BOTTOM) {
-            if (P->face == FACE_RIGHT) {
-                lon = qsc_shift_lon_origin(lon, +HALFPI);
-            } else if (P->face == FACE_BACK) {
-                lon = qsc_shift_lon_origin(lon, +PI);
-            } else if (P->face == FACE_LEFT) {
-                lon = qsc_shift_lon_origin(lon, -HALFPI);
-            }
-            sinlat = sin(lat);
-            coslat = cos(lat);
-            sinlon = sin(lon);
-            coslon = cos(lon);
-            q = coslat * coslon;
-            r = coslat * sinlon;
-            s = sinlat;
-        }
-        if (P->face == FACE_FRONT) {
-            phi = acos(q);
-            theta = qsc_fwd_equat_face_theta(phi, s, r, &area);
-        } else if (P->face == FACE_RIGHT) {
-            phi = acos(r);
-            theta = qsc_fwd_equat_face_theta(phi, s, -q, &area);
-        } else if (P->face == FACE_BACK) {
-            phi = acos(-q);
-            theta = qsc_fwd_equat_face_theta(phi, s, -r, &area);
-        } else if (P->face == FACE_LEFT) {
-            phi = acos(-r);
-            theta = qsc_fwd_equat_face_theta(phi, s, q, &area);
-        } else if (P->face == FACE_TOP) {
+        if (P->face == FACE_TOP) {
             phi = HALFPI - lat;
             if (lon >= FORTPI && lon <= HALFPI + FORTPI) {
                 area = AREA_0;
@@ -170,7 +139,7 @@ FORWARD(e_forward);
                 area = AREA_3;
                 theta = lon;
             }
-        } else /* P->face == FACE_BOTTOM */ {
+        } else if (P->face == FACE_BOTTOM) {
             phi = HALFPI + lat;
             if (lon >= FORTPI && lon <= HALFPI + FORTPI) {
                 area = AREA_0;
@@ -185,6 +154,43 @@ FORWARD(e_forward);
                 area = AREA_3;
                 theta = (lon > 0.0 ? -lon + PI : -lon - PI);
             }
+        } else {
+            double q, r, s;
+            double sinlat, coslat;
+            double sinlon, coslon;
+
+            if (P->face == FACE_RIGHT) {
+                lon = qsc_shift_lon_origin(lon, +HALFPI);
+            } else if (P->face == FACE_BACK) {
+                lon = qsc_shift_lon_origin(lon, +PI);
+            } else if (P->face == FACE_LEFT) {
+                lon = qsc_shift_lon_origin(lon, -HALFPI);
+            }
+            sinlat = sin(lat);
+            coslat = cos(lat);
+            sinlon = sin(lon);
+            coslon = cos(lon);
+            q = coslat * coslon;
+            r = coslat * sinlon;
+            s = sinlat;
+
+            if (P->face == FACE_FRONT) {
+                phi = acos(q);
+                theta = qsc_fwd_equat_face_theta(phi, s, r, &area);
+            } else if (P->face == FACE_RIGHT) {
+                phi = acos(r);
+                theta = qsc_fwd_equat_face_theta(phi, s, -q, &area);
+            } else if (P->face == FACE_BACK) {
+                phi = acos(-q);
+                theta = qsc_fwd_equat_face_theta(phi, s, -r, &area);
+            } else if (P->face == FACE_LEFT) {
+                phi = acos(-r);
+                theta = qsc_fwd_equat_face_theta(phi, s, q, &area);
+            } else {
+                /* Impossible */
+                phi = theta = 0.0;
+                area = AREA_0;
+            }
         }
 
         /* Compute mu and nu for the area of definition.
diff --git a/src/PJ_robin.c b/src/PJ_robin.c
index 39513e2..e8572ae 100644
--- a/src/PJ_robin.c
+++ b/src/PJ_robin.c
@@ -69,6 +69,7 @@ static const struct COEFS Y[] = {
 FORWARD(s_forward); /* spheroid */
 	int i;
 	double dphi;
+	(void) P;
 
 	i = floor((dphi = fabs(lp.phi)) * C1);
 	if (i >= NODES) i = NODES - 1;
diff --git a/src/PJ_sch.c b/src/PJ_sch.c
new file mode 100644
index 0000000..9a0120f
--- /dev/null
+++ b/src/PJ_sch.c
@@ -0,0 +1,231 @@
+/******************************************************************************
+ * $Id$
+ *
+ * Project:  SCH Coordinate system
+ * Purpose:  Implementation of SCH Coordinate system
+ * References : 
+ *      1. Hensley. Scott. SCH Coordinates and various transformations. June 15, 2000.  
+ *      2. Buckley, Sean Monroe. Radar interferometry measurement of land subsidence. 2000..
+ *         PhD Thesis. UT Austin. (Appendix)
+ *      3. Hensley, Scott, Elaine Chapin, and T. Michel. "Improved processing of AIRSAR
+ *         data based on the GeoSAR processor." Airsar earth science and applications
+ *         workshop, March. 2002. (http://airsar.jpl.nasa.gov/documents/workshop2002/papers/T3.pdf)
+ *
+ * Author:   Piyush Agram (piyush.agram at jpl.nasa.gov)
+ * Copyright (c) 2015 California Institute of Technology.
+ * Government sponsorship acknowledged.
+ *
+ * NOTE:  The SCH coordinate system is a sensor aligned coordinate system 
+ * developed at JPL for radar mapping missions. Details pertaining to the 
+ * coordinate system have been release in the public domain (see references above).
+ * This code is an independent implementation of the SCH coordinate system
+ * that conforms to the PROJ.4 conventions and uses the details presented in these
+ * publicly released documents. All credit for the development of the coordinate
+ * system and its use should be directed towards the original developers at JPL.
+ ******************************************************************************
+ * 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.
+ ****************************************************************************/
+
+#include "geocent.h"
+
+#define PROJ_PARMS__ \
+	double plat; /*Peg Latitude */    \
+        double plon; /*Peg Longitude*/    \
+        double phdg; /*Peg heading  */    \
+        double h0;   /*Average altitude */\
+	double transMat[9]; \
+        double xyzoff[3]; \
+        double rcurv; \
+        GeocentricInfo sph; \
+        GeocentricInfo elp_0; 
+        
+#define PJ_LIB__
+#include	<projects.h>
+
+PROJ_HEAD(sch, "Spherical Cross-track Height") "\n\tMisc\n\tplat_0 = ,plon_0 = , phdg_0 = ,[h_0 = ]";
+
+INVERSE3D(inverse3d);
+        double temp[3];
+        double pxyz[3];
+
+        //Local lat,lon using radius
+        pxyz[0] = xyz.y * P->a / P->rcurv;
+        pxyz[1] = xyz.x * P->a / P->rcurv;
+        pxyz[2] = xyz.z;
+
+
+        if( pj_Convert_Geodetic_To_Geocentric( &(P->sph), pxyz[0], pxyz[1], pxyz[2],
+                    temp, temp+1, temp+2) != 0)
+                I3_ERROR;
+
+        //Apply rotation
+        pxyz[0] = P->transMat[0] * temp[0] + P->transMat[1] * temp[1] + P->transMat[2] * temp[2];
+        pxyz[1] = P->transMat[3] * temp[0] + P->transMat[4] * temp[1] + P->transMat[5] * temp[2];
+        pxyz[2] = P->transMat[6] * temp[0] + P->transMat[7] * temp[1] + P->transMat[8] * temp[2];
+
+        //Apply offset
+        pxyz[0] += P->xyzoff[0];
+        pxyz[1] += P->xyzoff[1];
+        pxyz[2] += P->xyzoff[2];
+
+        //Convert geocentric coordinates to lat lon
+        pj_Convert_Geocentric_To_Geodetic( &(P->elp_0), pxyz[0], pxyz[1], pxyz[2],
+                temp, temp+1, temp+2);
+
+
+        lpz.lam = temp[1] ;
+        lpz.phi = temp[0] ;
+        lpz.z = temp[2];
+
+//        printf("INVERSE: \n");
+//        printf("XYZ: %f %f %f \n", xyz.x, xyz.y, xyz.z);
+//        printf("LPZ: %f %f %f \n", lpz.lam, lpz.phi, lpz.z);
+        return (lpz);
+}
+
+FORWARD3D(forward3d);
+        double temp[3];
+        double pxyz[3];
+
+
+        //Convert lat lon to geocentric coordinates
+        if( pj_Convert_Geodetic_To_Geocentric( &(P->elp_0), lpz.phi, lpz.lam, lpz.z,
+                    temp, temp+1, temp+2 ) != 0 )
+            F3_ERROR;
+
+
+        //Adjust for offset
+        temp[0] -= P->xyzoff[0];
+        temp[1] -= P->xyzoff[1];
+        temp[2] -= P->xyzoff[2];
+
+       
+        //Apply rotation 
+        pxyz[0] = P->transMat[0] * temp[0] + P->transMat[3] * temp[1] + P->transMat[6] * temp[2];
+        pxyz[1] = P->transMat[1] * temp[0] + P->transMat[4] * temp[1] + P->transMat[7] * temp[2];
+        pxyz[2] = P->transMat[2] * temp[0] + P->transMat[5] * temp[1] + P->transMat[8] * temp[2];
+
+        //Convert to local lat,lon
+        pj_Convert_Geocentric_To_Geodetic( &(P->sph), pxyz[0], pxyz[1], pxyz[2],
+                temp, temp+1, temp+2);
+
+
+        //Scale by radius
+        xyz.x = temp[1] * P->rcurv / P->a;
+        xyz.y = temp[0] * P->rcurv / P->a;
+        xyz.z = temp[2];
+
+//        printf("FORWARD: \n");
+//        printf("LPZ: %f %f %f \n", lpz.lam, lpz.phi, lpz.z);
+//        printf("XYZ: %f %f %f \n", xyz.x, xyz.y, xyz.z);
+
+        return (xyz);
+}
+
+FREEUP; if (P) pj_dalloc(P); }
+	static PJ *
+setup(PJ *P) { /* general initialization */
+        double reast, rnorth;
+        double chdg, shdg;
+        double clt, slt;
+        double clo, slo;
+        double temp;
+        double pxyz[3];
+
+        temp = P->a * sqrt(1.0 - P->es);
+
+        //Setup original geocentric system
+        if ( pj_Set_Geocentric_Parameters(&(P->elp_0), P->a, temp) != 0)
+                E_ERROR(-37);
+
+
+        clt = cos(P->plat);
+        slt = sin(P->plat);
+        clo = cos(P->plon);
+        slo = sin(P->plon);
+
+        //Estimate the radius of curvature for given peg
+        temp = sqrt(1.0 - (P->es) * slt * slt);
+        reast = (P->a)/temp;
+        rnorth = (P->a) * (1.0 - (P->es))/pow(temp,3);
+
+        chdg = cos(P->phdg);
+        shdg = sin(P->phdg);
+        
+        P->rcurv = P->h0 + (reast*rnorth)/(reast * chdg * chdg + rnorth * shdg * shdg);
+
+//        printf("North Radius: %f \n", rnorth);
+//        printf("East Radius: %f \n", reast);
+//        printf("Effective Radius: %f \n", P->rcurv);
+
+        //Set up local sphere at the given peg point
+        if ( pj_Set_Geocentric_Parameters(&(P->sph), P->rcurv, P->rcurv) != 0)
+            E_ERROR(-37);
+
+        //Set up the transformation matrices
+        P->transMat[0] = clt * clo; 
+        P->transMat[1] = -shdg*slo - slt*clo * chdg;
+        P->transMat[2] =  slo*chdg - slt*clo*shdg;
+        P->transMat[3] =  clt*slo;
+        P->transMat[4] =  clo*shdg - slt*slo*chdg;
+        P->transMat[5] = -clo*chdg - slt*slo*shdg;
+        P->transMat[6] =  slt;
+        P->transMat[7] =  clt*chdg;
+        P->transMat[8] =  clt*shdg;        
+
+        
+        if( pj_Convert_Geodetic_To_Geocentric( &(P->elp_0), P->plat, P->plon, P->h0, 
+                                               pxyz, pxyz+1, pxyz+2 ) != 0 )
+        {
+            E_ERROR(-14)
+        }
+
+
+        P->xyzoff[0] = pxyz[0] - (P->rcurv) * clt * clo;
+        P->xyzoff[1] = pxyz[1] - (P->rcurv) * clt * slo;
+        P->xyzoff[2] = pxyz[2] - (P->rcurv) * slt;
+
+//        printf("Offset: %f %f %f \n", P->xyzoff[0], P->xyzoff[1], P->xyzoff[2]);
+
+
+        P->fwd3d = forward3d;
+        P->inv3d = inverse3d;
+	return P;
+}
+ENTRY0(sch)
+        P->h0 = 0.0;
+
+        //Check if peg latitude was defined
+        if (pj_param(P->ctx, P->params, "tplat_0").i)
+            P->plat = pj_param(P->ctx, P->params, "rplat_0").f;
+        else
+            E_ERROR(-37);
+
+        //Check if peg longitude was defined
+        if (pj_param(P->ctx, P->params, "tplon_0").i)
+            P->plon = pj_param(P->ctx, P->params, "rplon_0").f;
+        else
+            E_ERROR(-37);
+        
+        //Check if peg latitude is defined
+        if (pj_param(P->ctx, P->params, "tphdg_0").i)
+            P->phdg = pj_param(P->ctx, P->params, "rphdg_0").f;
+        else
+            E_ERROR(-37);
+        
+
+        //Check if average height was defined
+        //If so read it in
+        if (pj_param(P->ctx, P->params, "th_0").i)
+            P->h0 = pj_param(P->ctx, P->params, "dh_0").f;
+
+        //Completed reading in the projection parameters
+//        printf("PSA: Lat = %f Lon = %f Hdg = %f \n", P->plat, P->plon, P->phdg);
+
+ENDENTRY(setup(P))
diff --git a/src/PJ_stere.c b/src/PJ_stere.c
index 52ec1df..a052462 100644
--- a/src/PJ_stere.c
+++ b/src/PJ_stere.c
@@ -192,8 +192,6 @@ setup(PJ *P) { /* general initialization */
 			}
 			break;
 		case EQUIT:
-			P->akm1 = 2. * P->k0;
-			break;
 		case OBLIQ:
 			t = sin(P->phi0);
 			X = 2. * atan(ssfn_(P->phi0, t, P->e)) - HALFPI;
diff --git a/src/PJ_sterea.c b/src/PJ_sterea.c
index 7e52e15..fff2e95 100644
--- a/src/PJ_sterea.c
+++ b/src/PJ_sterea.c
@@ -3,8 +3,6 @@
 **
 ** Copyright (c) 2003   Gerald I. Evenden
 */
-static const char
-LIBPROJ_ID[] = "$Id: PJ_sterea.c 2022 2011-05-20 13:04:08Z warmerdam $";
 /*
 ** Permission is hereby granted, free of charge, to any person obtaining
 ** a copy of this software and associated documentation files (the
diff --git a/src/PJ_tmerc.c b/src/PJ_tmerc.c
index 3b1e0fb..70e8e72 100644
--- a/src/PJ_tmerc.c
+++ b/src/PJ_tmerc.c
@@ -5,8 +5,6 @@
 #define PJ_LIB__
 #include	<projects.h>
 PROJ_HEAD(tmerc, "Transverse Mercator") "\n\tCyl, Sph&Ell";
-PROJ_HEAD(utm, "Universal Transverse Mercator (UTM)")
-	"\n\tCyl, Sph\n\tzone= south";
 #define EPS10	1.e-10
 #define aks0	P->esp
 #define aks5	P->ml0
@@ -153,23 +151,3 @@ setup(PJ *P) { /* general initialization */
 }
 ENTRY1(tmerc, en)
 ENDENTRY(setup(P))
-ENTRY1(utm, en)
-	int zone;
-
-	if (!P->es) E_ERROR(-34);
-	P->y0 = pj_param(P->ctx, P->params, "bsouth").i ? 10000000. : 0.;
-	P->x0 = 500000.;
-	if (pj_param(P->ctx, P->params, "tzone").i) /* zone input ? */
-		if ((zone = pj_param(P->ctx, P->params, "izone").i) > 0 && zone <= 60)
-			--zone;
-		else
-			E_ERROR(-35)
-	else /* nearest central meridian input */
-		if ((zone = floor((adjlon(P->lam0) + PI) * 30. / PI)) < 0)
-			zone = 0;
-		else if (zone >= 60)
-			zone = 59;
-	P->lam0 = (zone + .5) * PI / 30. - PI;
-	P->k0 = 0.9996;
-	P->phi0 = 0.;
-ENDENTRY(setup(P))
diff --git a/src/PJ_vandg4.c b/src/PJ_vandg4.c
index d670503..0229042 100644
--- a/src/PJ_vandg4.c
+++ b/src/PJ_vandg4.c
@@ -5,6 +5,7 @@ PROJ_HEAD(vandg4, "van der Grinten IV") "\n\tMisc Sph, no inv.";
 #define TWORPI	0.63661977236758134308
 FORWARD(s_forward); /* spheroid */
 	double x1, t, bt, ct, ft, bt2, ct2, dt, dt2;
+	(void) P;
 
 	if (fabs(lp.phi) < TOL) {
 		xy.x = lp.lam;
diff --git a/src/PJ_wag7.c b/src/PJ_wag7.c
index 5f6f1bb..db29ffb 100644
--- a/src/PJ_wag7.c
+++ b/src/PJ_wag7.c
@@ -3,6 +3,7 @@
 PROJ_HEAD(wag7, "Wagner VII") "\n\tMisc Sph, no inv.";
 FORWARD(s_forward); /* sphere */
 	double theta, ct, D;
+	(void) P;
 
 	theta = asin(xy.y = 0.90630778703664996 * sin(lp.phi));
 	xy.x = 2.66723 * (ct = cos(theta)) * sin(lp.lam /= 3.);
diff --git a/src/dmstor.c b/src/dmstor.c
index f1da537..9665d5a 100644
--- a/src/dmstor.c
+++ b/src/dmstor.c
@@ -11,7 +11,7 @@ static double proj_strtod(char *nptr, char **endptr);
 *sym = "NnEeSsWw";
 	static const double
 vm[] = {
-	.0174532925199433,
+	DEG_TO_RAD,
 	.0002908882086657216,
 	.0000048481368110953599
 };
@@ -108,6 +108,6 @@ proj_strtod(char *nptr, char **endptr)
 
     /* no offending characters, just handle normally */
 
-    return strtod(nptr, endptr);
+    return pj_strtod(nptr, endptr);
 }
 
diff --git a/src/gen_cheb.c b/src/gen_cheb.c
index 82cd926..f173687 100644
--- a/src/gen_cheb.c
+++ b/src/gen_cheb.c
@@ -10,7 +10,7 @@
 #endif
 	void
 gen_cheb(int inverse, projUV (*proj)(projUV), char *s, PJ *P, int iargc, char **iargv) {
-	int NU = 15, NV = 15, i, res = -1, errin = 0, pwr;
+	int NU = 15, NV = 15, res = -1, errin = 0, pwr;
 	char *arg, fmt[15];
 	projUV low, upp, resid;
 	Tseries *F;
@@ -18,10 +18,10 @@ gen_cheb(int inverse, projUV (*proj)(projUV), char *s, PJ *P, int iargc, char **
 	double (*input)(const char *, char **);
 
 	input = inverse ? strtod : dmstor;
-	if (*s) low.u = input(s, &s); else ++errin;
-	if (*s == ',') upp.u = input(s+1, &s); else ++errin;
-	if (*s == ',') low.v = input(s+1, &s); else ++errin;
-	if (*s == ',') upp.v = input(s+1, &s); else ++errin;
+	if (*s) low.u = input(s, &s); else { low.u = 0; ++errin; }
+	if (*s == ',') upp.u = input(s+1, &s); else { upp.u = 0; ++errin; }
+	if (*s == ',') low.v = input(s+1, &s); else { low.v = 0; ++errin; }
+	if (*s == ',') upp.v = input(s+1, &s); else { upp.v = 0; ++errin; }
 	if (errin)
 		emess(16,"null or absent -T parameters");
 	if (*s == ',') if (*++s != ',') res = strtol(s, &s, 10);
@@ -33,7 +33,7 @@ gen_cheb(int inverse, projUV (*proj)(projUV), char *s, PJ *P, int iargc, char **
 	if (iargc > 0) { /* proj execution audit trail */
 		int n = 0, L;
 
-		for( i = 0 ; iargc ; --iargc) {
+		for ( ; iargc ; --iargc) {
 			arg = *iargv++;
 			if (*arg != '+') {
 				if (!n) { putchar('#'); ++n; }
diff --git a/src/geocent.c b/src/geocent.c
index d95a778..6ac6c40 100644
--- a/src/geocent.c
+++ b/src/geocent.c
@@ -362,10 +362,8 @@ void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi,
     double CPHI;     /* cos of searched geodetic latitude */
     double SPHI;     /* sin of searched geodetic latitude */
     double SDPHI;    /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */
-    int At_Pole;     /* indicates location is in polar region */
     int iter;        /* # of continous iteration, max. 30 is always enough (s.a.) */
 
-    At_Pole = FALSE;
     P = sqrt(X*X+Y*Y);
     RR = sqrt(X*X+Y*Y+Z*Z);
 
@@ -373,7 +371,6 @@ void pj_Convert_Geocentric_To_Geodetic (GeocentricInfo *gi,
     if (P/gi->Geocent_a < genau) {
 
 /*  special case, if P=0. (X=0., Y=0.) */
-        At_Pole = TRUE;
 	*Longitude = 0.;
 
 /*  if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis
diff --git a/src/geod_interface.c b/src/geod_interface.c
index dc75728..a30377a 100644
--- a/src/geod_interface.c
+++ b/src/geod_interface.c
@@ -7,28 +7,27 @@ void geod_ini(void) {
 
 void geod_pre(void) {
   double
-    degree = PI/180,
-    lat1 = phi1 / degree, lon1 = lam1 /degree, azi1 = al12 / degree;
-  geod_lineinit(&GlobalGeodesicLine, &GlobalGeodesic,
-		   lat1, lon1, azi1, 0U);
+    lat1 = phi1 / DEG_TO_RAD, lon1 = lam1 / DEG_TO_RAD,
+    azi1 = al12 / DEG_TO_RAD;
+  geod_lineinit(&GlobalGeodesicLine, &GlobalGeodesic, lat1, lon1, azi1, 0U);
 }
 
 void geod_for(void) {
-  double degree = PI/180, s12 = geod_S, lat2, lon2, azi2;
+  double
+    s12 = geod_S, lat2, lon2, azi2;
   geod_position(&GlobalGeodesicLine, s12, &lat2, &lon2, &azi2);
   azi2 += azi2 >= 0 ? -180 : 180; /* Compute back azimuth */
-  phi2 = lat2 * degree;
-  lam2 = lon2 * degree;
-  al21 = azi2 * degree;
+  phi2 = lat2 * DEG_TO_RAD;
+  lam2 = lon2 * DEG_TO_RAD;
+  al21 = azi2 * DEG_TO_RAD;
 }
 
 void geod_inv(void) {
   double
-    degree = PI / 180,
-    lat1 = phi1 / degree, lon1 = lam1 / degree,
-    lat2 = phi2 / degree, lon2 = lam2 / degree,
+    lat1 = phi1 / DEG_TO_RAD, lon1 = lam1 / DEG_TO_RAD,
+    lat2 = phi2 / DEG_TO_RAD, lon2 = lam2 / DEG_TO_RAD,
     azi1, azi2, s12;
   geod_inverse(&GlobalGeodesic, lat1, lon1, lat2, lon2, &s12, &azi1, &azi2);
   azi2 += azi2 >= 0 ? -180 : 180; /* Compute back azimuth */
-  al12 = azi1 * degree; al21 = azi2 * degree; geod_S = s12;
+  al12 = azi1 * DEG_TO_RAD; al21 = azi2 * DEG_TO_RAD; geod_S = s12;
 }
diff --git a/src/geod_set.c b/src/geod_set.c
index eaadce5..e687c51 100644
--- a/src/geod_set.c
+++ b/src/geod_set.c
@@ -15,11 +15,11 @@ geod_set(int argc, char **argv) {
     /* put arguments into internal linked list */
 	if (argc <= 0)
 		emess(1, "no arguments in initialization list");
-	for (i = 0; i < argc; ++i)
-		if (i)
-			curr = curr->next = pj_mkparam(argv[i]);
-		else
-			start = curr = pj_mkparam(argv[i]);
+	start = curr = pj_mkparam(argv[0]);
+	for (i = 1; i < argc; ++i) {
+		curr->next = pj_mkparam(argv[i]);
+		curr = curr->next;
+	}
 	/* set elliptical parameters */
 	if (pj_ell_set(pj_get_default_ctx(),start, &geod_a, &es)) emess(1,"ellipse setup failure");
 	/* set units */
diff --git a/src/geodesic.c b/src/geodesic.c
index bd9fc96..2dee45e 100644
--- a/src/geodesic.c
+++ b/src/geodesic.c
@@ -13,12 +13,12 @@
  *   C. F. F. Karney,
  *   Algorithms for geodesics,
  *   J. Geodesy <b>87</b>, 43--55 (2013);
- *   http://dx.doi.org/10.1007/s00190-012-0578-z
+ *   https://dx.doi.org/10.1007/s00190-012-0578-z
  *   Addenda: http://geographiclib.sf.net/geod-addenda.html
  *
  * See the comments in geodesic.h for documentation.
  *
- * Copyright (c) Charles Karney (2012-2013) <charles at karney.com> and licensed
+ * Copyright (c) Charles Karney (2012-2015) <charles at karney.com> and licensed
  * under the MIT/X11 License.  For more information, see
  * http://geographiclib.sourceforge.net/
  */
@@ -27,8 +27,10 @@
 #include <math.h>
 
 #define GEOGRAPHICLIB_GEODESIC_ORDER 6
+#define nA1   GEOGRAPHICLIB_GEODESIC_ORDER
 #define nC1   GEOGRAPHICLIB_GEODESIC_ORDER
 #define nC1p  GEOGRAPHICLIB_GEODESIC_ORDER
+#define nA2   GEOGRAPHICLIB_GEODESIC_ORDER
 #define nC2   GEOGRAPHICLIB_GEODESIC_ORDER
 #define nA3   GEOGRAPHICLIB_GEODESIC_ORDER
 #define nA3x  nA3
@@ -36,6 +38,7 @@
 #define nC3x  ((nC3 * (nC3 - 1)) / 2)
 #define nC4   GEOGRAPHICLIB_GEODESIC_ORDER
 #define nC4x  ((nC4 * (nC4 + 1)) / 2)
+#define nC    (GEOGRAPHICLIB_GEODESIC_ORDER + 1)
 
 typedef double real;
 typedef int boolx;
@@ -137,6 +140,12 @@ static real sumx(real u, real v, real* t) {
   return s;
 }
 
+static real polyval(int N, const real p[], real x) {
+  real y = N < 0 ? 0 : *p++;
+  while (--N >= 0) y = y * x + *p++;
+  return y;
+}
+
 static real minx(real x, real y)
 { return x < y ? x : y; }
 
@@ -146,24 +155,29 @@ static real maxx(real x, real y)
 static void swapx(real* x, real* y)
 { real t = *x; *x = *y; *y = t; }
 
-static void SinCosNorm(real* sinx, real* cosx) {
+static void norm2(real* sinx, real* cosx) {
   real r = hypotx(*sinx, *cosx);
   *sinx /= r;
   *cosx /= r;
 }
 
-static real AngNormalize(real x)
-{ return x >= 180 ? x - 360 : (x < -180 ? x + 360 : x); }
-static real AngNormalize2(real x)
-{ return AngNormalize(fmod(x, (real)(360))); }
+static real AngNormalize(real x) {
+  x = fmod(x, (real)(360));
+  return x < -180 ? x + 360 : (x < 180 ? x : x - 360);
+}
+
+static real LatFix(real x)
+{ return fabs(x) > 90 ? NaN : x; }
 
 static real AngDiff(real x, real y) {
-  real t, d = sumx(-x, y, &t);
-  if ((d - (real)(180)) + t > (real)(0))       /* y - x > 180 */
-    d -= (real)(360);                          /* exact */
-  else if ((d + (real)(180)) + t <= (real)(0)) /* y - x <= -180 */
-    d += (real)(360);                          /* exact */
-  return d + t;
+  real t, d = - AngNormalize(sumx(AngNormalize(x), AngNormalize(-y), &t));
+  /* Here y - x = d - t (mod 360), exactly, where d is in (-180,180] and
+   * abs(t) <= eps (eps = 2^-45 for doubles).  The only case where the
+   * addition of t takes the result outside the range (-180,180] is d = 180
+   * and t < 0.  The case, d = -180 + eps, t = eps, can't happen, since
+   * sum would have returned the exact result in such a case (i.e., given t
+   * = 0). */
+  return (d == 180 && t < 0 ? -180 : d) - t;
 }
 
 static real AngRound(real x) {
@@ -171,7 +185,49 @@ static real AngRound(real x) {
   volatile real y = fabs(x);
   /* The compiler mustn't "simplify" z - (z - y) to y */
   y = y < z ? z - (z - y) : y;
-  return x < 0 ? -y : y;
+  return x < 0 ? 0 - y : y;
+}
+
+static void sincosdx(real x, real* sinx, real* cosx) {
+  /* In order to minimize round-off errors, this function exactly reduces
+   * the argument to the range [-45, 45] before converting it to radians. */
+  real r, s, c; int q;
+  r = fmod(x, (real)(360));
+  q = (int)(floor(r / 90 + (real)(0.5)));
+  r -= 90 * q;
+  /* now abs(r) <= 45 */
+  r *= degree;
+  /* Possibly could call the gnu extension sincos */
+  s = sin(r); c = cos(r);
+  switch ((unsigned)q & 3U) {
+  case 0U: *sinx =     s; *cosx =     c; break;
+  case 1U: *sinx =     c; *cosx = 0 - s; break;
+  case 2U: *sinx = 0 - s; *cosx = 0 - c; break;
+  default: *sinx = 0 - c; *cosx =     s; break; /* case 3U */
+  }
+}
+
+static real atan2dx(real y, real x) {
+  /* In order to minimize round-off errors, this function rearranges the
+   * arguments so that result of atan2 is in the range [-pi/4, pi/4] before
+   * converting it to degrees and mapping the result to the correct
+   * quadrant. */
+  int q = 0; real ang;
+  if (fabs(y) > fabs(x)) { swapx(&x, &y); q = 2; }
+  if (x < 0) { x = -x; ++q; }
+  /* here x >= 0 and x >= abs(y), so angle is in [-pi/4, pi/4] */
+  ang = atan2(y, x) / degree;
+  switch (q) {
+    /* Note that atan2d(-0.0, 1.0) will return -0.  However, we expect that
+     * atan2d will not be called with y = -0.  If need be, include
+     *
+     *   case 0: ang = 0 + ang; break;
+     */
+  case 1: ang = (y > 0 ? 180 : -180) - ang; break;
+  case 2: ang =  90 - ang; break;
+  case 3: ang = -90 + ang; break;
+  }
+  return ang;
 }
 
 static void A3coeff(struct geod_geodesic* g);
@@ -186,9 +242,9 @@ static void Lengths(const struct geod_geodesic* g,
                     real ssig2, real csig2, real dn2,
                     real cbet1, real cbet2,
                     real* ps12b, real* pm12b, real* pm0,
-                    boolx scalep, real* pM12, real* pM21,
-                    /* Scratch areas of the right size */
-                    real C1a[], real C2a[]);
+                    real* pM12, real* pM21,
+                    /* Scratch area of the right size */
+                    real Ca[]);
 static real Astroid(real x, real y);
 static real InverseStart(const struct geod_geodesic* g,
                          real sbet1, real cbet1, real dn1,
@@ -199,8 +255,8 @@ static real InverseStart(const struct geod_geodesic* g,
                          real* psalp2, real* pcalp2,
                          /* Only updated for short lines */
                          real* pdnm,
-                         /* Scratch areas of the right size */
-                         real C1a[], real C2a[]);
+                         /* Scratch area of the right size */
+                         real Ca[]);
 static real Lambda12(const struct geod_geodesic* g,
                      real sbet1, real cbet1, real dn1,
                      real sbet2, real cbet2, real dn2,
@@ -211,8 +267,8 @@ static real Lambda12(const struct geod_geodesic* g,
                      real* pssig2, real* pcsig2,
                      real* peps, real* pdomg12,
                      boolx diffp, real* pdlam12,
-                     /* Scratch areas of the right size */
-                     real C1a[], real C2a[], real C3a[]);
+                     /* Scratch area of the right size */
+                     real Ca[]);
 static real A3f(const struct geod_geodesic* g, real eps);
 static void C3f(const struct geod_geodesic* g, real eps, real c[]);
 static void C4f(const struct geod_geodesic* g, real eps, real c[]);
@@ -222,6 +278,7 @@ static void C1pf(real eps, real c[]);
 static real A2m1f(real eps);
 static void C2f(real eps, real c[]);
 static int transit(real lon1, real lon2);
+static int transitdirect(real lon1, real lon2);
 static void accini(real s[]);
 static void acccopy(const real s[], real t[]);
 static void accadd(real s[], real y);
@@ -261,7 +318,7 @@ void geod_init(struct geod_geodesic* g, real a, real f) {
 void geod_lineinit(struct geod_geodesicline* l,
                    const struct geod_geodesic* g,
                    real lat1, real lon1, real azi1, unsigned caps) {
-  real alp1, cbet1, sbet1, phi, eps;
+  real cbet1, sbet1, eps;
   l->a = g->a;
   l->f = g->f;
   l->b = g->b;
@@ -269,25 +326,18 @@ void geod_lineinit(struct geod_geodesicline* l,
   l->f1 = g->f1;
   /* If caps is 0 assume the standard direct calculation */
   l->caps = (caps ? caps : GEOD_DISTANCE_IN | GEOD_LONGITUDE) |
-    GEOD_LATITUDE | GEOD_AZIMUTH; /* Always allow latitude and azimuth */
+    /* always allow latitude and azimuth and unrolling of longitude */
+    GEOD_LATITUDE | GEOD_AZIMUTH | GEOD_LONG_UNROLL;
 
-  /* Guard against underflow in salp0 */
-  azi1 = AngRound(AngNormalize(azi1));
-  lon1 = AngNormalize(lon1);
-  l->lat1 = lat1;
+  l->lat1 = LatFix(lat1);
   l->lon1 = lon1;
-  l->azi1 = azi1;
-  /* alp1 is in [0, pi] */
-  alp1 = azi1 * degree;
-  /* Enforce sin(pi) == 0 and cos(pi/2) == 0.  Better to face the ensuing
-   * problems directly than to skirt them. */
-  l->salp1 =      azi1  == -180 ? 0 : sin(alp1);
-  l->calp1 = fabs(azi1) ==   90 ? 0 : cos(alp1);
-  phi = lat1 * degree;
+  l->azi1 = AngNormalize(azi1);
+  /* Guard against underflow in salp0 */
+  sincosdx(AngRound(l->azi1), &l->salp1, &l->calp1);
+
+  sincosdx(AngRound(l->lat1), &sbet1, &cbet1); sbet1 *= l->f1;
   /* Ensure cbet1 = +epsilon at poles */
-  sbet1 = l->f1 * sin(phi);
-  cbet1 = fabs(lat1) == 90 ? tiny : cos(phi);
-  SinCosNorm(&sbet1, &cbet1);
+  norm2(&sbet1, &cbet1); cbet1 = maxx(tiny, cbet1);
   l->dn1 = sqrt(1 + g->ep2 * sq(sbet1));
 
   /* Evaluate alp0 from sin(alp1) * cos(bet1) = sin(alp0), */
@@ -306,8 +356,8 @@ void geod_lineinit(struct geod_geodesicline* l,
    * With alp0 = 0, omg1 = 0 for alp1 = 0, omg1 = pi for alp1 = pi. */
   l->ssig1 = sbet1; l->somg1 = l->salp0 * sbet1;
   l->csig1 = l->comg1 = sbet1 != 0 || l->calp1 != 0 ? cbet1 * l->calp1 : 1;
-  SinCosNorm(&l->ssig1, &l->csig1); /* sig1 in (-pi, pi] */
-  /* SinCosNorm(somg1, comg1); -- don't need to normalize! */
+  norm2(&l->ssig1, &l->csig1); /* sig1 in (-pi, pi] */
+  /* norm2(somg1, comg1); -- don't need to normalize! */
 
   l->k2 = sq(l->calp0) * g->ep2;
   eps = l->k2 / (2 * (1 + sqrt(1 + l->k2)) + l->k2);
@@ -349,7 +399,7 @@ void geod_lineinit(struct geod_geodesicline* l,
 }
 
 real geod_genposition(const struct geod_geodesicline* l,
-                      boolx arcmode, real s12_a12,
+                      unsigned flags, real s12_a12,
                       real* plat2, real* plon2, real* pazi2,
                       real* ps12, real* pm12,
                       real* pM12, real* pM21,
@@ -371,18 +421,14 @@ real geod_genposition(const struct geod_geodesicline* l,
 
   outmask &= l->caps & OUT_ALL;
   if (!( TRUE /*Init()*/ &&
-         (arcmode || (l->caps & GEOD_DISTANCE_IN & OUT_ALL)) ))
+         (flags & GEOD_ARCMODE || (l->caps & GEOD_DISTANCE_IN & OUT_ALL)) ))
     /* Uninitialized or impossible distance calculation requested */
     return NaN;
 
-  if (arcmode) {
-    real s12a;
+  if (flags & GEOD_ARCMODE) {
     /* Interpret s12_a12 as spherical arc length */
     sig12 = s12_a12 * degree;
-    s12a = fabs(s12_a12);
-    s12a -= 180 * floor(s12a / 180);
-    ssig12 = s12a ==  0 ? 0 : sin(sig12);
-    csig12 = s12a == 90 ? 0 : cos(sig12);
+    sincosdx(s12_a12, &ssig12, &csig12);
   } else {
     /* Interpret s12_a12 as distance */
     real
@@ -435,7 +481,7 @@ real geod_genposition(const struct geod_geodesicline* l,
   csig2 = l->csig1 * csig12 - l->ssig1 * ssig12;
   dn2 = sqrt(1 + l->k2 * sq(ssig2));
   if (outmask & (GEOD_DISTANCE | GEOD_REDUCEDLENGTH | GEOD_GEODESICSCALE)) {
-    if (arcmode || fabs(l->f) > 0.01)
+    if (flags & GEOD_ARCMODE || fabs(l->f) > 0.01)
       B12 = SinCosSeries(TRUE, ssig2, csig2, l->C1a, nC1);
     AB1 = (1 + l->A1m1) * (B12 - l->B11);
   }
@@ -446,34 +492,36 @@ real geod_genposition(const struct geod_geodesicline* l,
   if (cbet2 == 0)
     /* I.e., salp0 = 0, csig2 = 0.  Break the degeneracy in this case */
     cbet2 = csig2 = tiny;
-  /* tan(omg2) = sin(alp0) * tan(sig2) */
-  somg2 = l->salp0 * ssig2; comg2 = csig2;  /* No need to normalize */
   /* tan(alp0) = cos(sig2)*tan(alp2) */
   salp2 = l->salp0; calp2 = l->calp0 * csig2; /* No need to normalize */
-  /* omg12 = omg2 - omg1 */
-  omg12 = atan2(somg2 * l->comg1 - comg2 * l->somg1,
-                comg2 * l->comg1 + somg2 * l->somg1);
 
   if (outmask & GEOD_DISTANCE)
-    s12 = arcmode ? l->b * ((1 + l->A1m1) * sig12 + AB1) : s12_a12;
+    s12 = flags & GEOD_ARCMODE ? l->b * ((1 + l->A1m1) * sig12 + AB1) : s12_a12;
 
   if (outmask & GEOD_LONGITUDE) {
+    int E = l->salp0 < 0 ? -1 : 1; /* east or west going? */
+    /* tan(omg2) = sin(alp0) * tan(sig2) */
+    somg2 = l->salp0 * ssig2; comg2 = csig2;  /* No need to normalize */
+    /* omg12 = omg2 - omg1 */
+    omg12 = flags & GEOD_LONG_UNROLL
+      ? E * (sig12
+             - (atan2(    ssig2, csig2) - atan2(    l->ssig1, l->csig1))
+             + (atan2(E * somg2, comg2) - atan2(E * l->somg1, l->comg1)))
+      : atan2(somg2 * l->comg1 - comg2 * l->somg1,
+              comg2 * l->comg1 + somg2 * l->somg1);
     lam12 = omg12 + l->A3c *
       ( sig12 + (SinCosSeries(TRUE, ssig2, csig2, l->C3a, nC3-1)
                  - l->B31));
     lon12 = lam12 / degree;
-    /* Use AngNormalize2 because longitude might have wrapped multiple
-     * times. */
-    lon12 = AngNormalize2(lon12);
-    lon2 = AngNormalize(l->lon1 + lon12);
+    lon2 = flags & GEOD_LONG_UNROLL ? l->lon1 + lon12 :
+      AngNormalize(AngNormalize(l->lon1) + AngNormalize(lon12));
   }
 
   if (outmask & GEOD_LATITUDE)
-    lat2 = atan2(sbet2, l->f1 * cbet2) / degree;
+    lat2 = atan2dx(sbet2, l->f1 * cbet2);
 
   if (outmask & GEOD_AZIMUTH)
-    /* minus signs give range [-180, 180). 0- converts -0 to +0. */
-    azi2 = 0 - atan2(-salp2, calp2) / degree;
+    azi2 = atan2dx(salp2, calp2);
 
   if (outmask & (GEOD_REDUCEDLENGTH | GEOD_GEODESICSCALE)) {
     real
@@ -497,7 +545,7 @@ real geod_genposition(const struct geod_geodesicline* l,
       B42 = SinCosSeries(FALSE, ssig2, csig2, l->C4a, nC4);
     real salp12, calp12;
     if (l->calp0 == 0 || l->salp0 == 0) {
-      /* alp12 = alp2 - alp1, used in atan2 so no need to normalized */
+      /* alp12 = alp2 - alp1, used in atan2 so no need to normalize */
       salp12 = salp2 * l->calp1 - calp2 * l->salp1;
       calp12 = calp2 * l->calp1 + salp2 * l->salp1;
       /* The right thing appears to happen if alp1 = +/-180 and alp2 = 0, viz
@@ -542,7 +590,7 @@ real geod_genposition(const struct geod_geodesicline* l,
   if (outmask & GEOD_AREA)
     *pS12 = S12;
 
-  return arcmode ? s12_a12 : sig12 / degree;
+  return flags & GEOD_ARCMODE ? s12_a12 : sig12 / degree;
 }
 
 void geod_position(const struct geod_geodesicline* l, real s12,
@@ -552,7 +600,7 @@ void geod_position(const struct geod_geodesicline* l, real s12,
 
 real geod_gendirect(const struct geod_geodesic* g,
                     real lat1, real lon1, real azi1,
-                    boolx arcmode, real s12_a12,
+                    unsigned flags, real s12_a12,
                     real* plat2, real* plon2, real* pazi2,
                     real* ps12, real* pm12, real* pM12, real* pM21,
                     real* pS12) {
@@ -568,8 +616,9 @@ real geod_gendirect(const struct geod_geodesic* g,
 
   geod_lineinit(&l, g, lat1, lon1, azi1,
                 /* Automatically supply GEOD_DISTANCE_IN if necessary */
-                outmask | (arcmode ? GEOD_NONE : GEOD_DISTANCE_IN));
-  return geod_genposition(&l, arcmode, s12_a12,
+                outmask |
+                (flags & GEOD_ARCMODE ? GEOD_NONE : GEOD_DISTANCE_IN));
+  return geod_genposition(&l, flags, s12_a12,
                           plat2, plon2, pazi2, ps12, pm12, pM12, pM21, pS12);
 }
 
@@ -577,7 +626,7 @@ void geod_direct(const struct geod_geodesic* g,
                  real lat1, real lon1, real azi1,
                  real s12,
                  real* plat2, real* plon2, real* pazi2) {
-  geod_gendirect(g, lat1, lon1, azi1, FALSE, s12, plat2, plon2, pazi2,
+  geod_gendirect(g, lat1, lon1, azi1, GEOD_NOFLAGS, s12, plat2, plon2, pazi2,
                  0, 0, 0, 0, 0);
 }
 
@@ -588,11 +637,10 @@ real geod_geninverse(const struct geod_geodesic* g,
   real s12 = 0, azi1 = 0, azi2 = 0, m12 = 0, M12 = 0, M21 = 0, S12 = 0;
   real lon12;
   int latsign, lonsign, swapp;
-  real phi, sbet1, cbet1, sbet2, cbet2, s12x = 0, m12x = 0;
+  real sbet1, cbet1, sbet2, cbet2, s12x = 0, m12x = 0;
   real dn1, dn2, lam12, slam12, clam12;
   real a12 = 0, sig12, calp1 = 0, salp1 = 0, calp2 = 0, salp2 = 0;
-  /* index zero elements of these arrays are unused */
-  real C1a[nC1 + 1], C2a[nC2 + 1], C3a[nC3];
+  real Ca[nC];
   boolx meridian;
   real omg12 = 0;
 
@@ -607,15 +655,14 @@ real geod_geninverse(const struct geod_geodesic* g,
   /* Compute longitude difference (AngDiff does this carefully).  Result is
    * in [-180, 180] but -180 is only for west-going geodesics.  180 is for
    * east-going and meridional geodesics. */
-  lon12 = AngDiff(AngNormalize(lon1), AngNormalize(lon2));
   /* If very close to being on the same half-meridian, then make it so. */
-  lon12 = AngRound(lon12);
+  lon12 = AngRound(AngDiff(lon1, lon2));
   /* Make longitude difference positive. */
   lonsign = lon12 >= 0 ? 1 : -1;
   lon12 *= lonsign;
   /* If really close to the equator, treat as on equator. */
-  lat1 = AngRound(lat1);
-  lat2 = AngRound(lat2);
+  lat1 = AngRound(LatFix(lat1));
+  lat2 = AngRound(LatFix(lat2));
   /* Swap points so that point with higher (abs) latitude is point 1 */
   swapp = fabs(lat1) >= fabs(lat2) ? 1 : -1;
   if (swapp < 0) {
@@ -638,17 +685,13 @@ real geod_geninverse(const struct geod_geodesic* g,
    * check, e.g., on verifying quadrants in atan2.  In addition, this
    * enforces some symmetries in the results returned. */
 
-  phi = lat1 * degree;
+  sincosdx(lat1, &sbet1, &cbet1); sbet1 *= g->f1;
   /* Ensure cbet1 = +epsilon at poles */
-  sbet1 = g->f1 * sin(phi);
-  cbet1 = lat1 == -90 ? tiny : cos(phi);
-  SinCosNorm(&sbet1, &cbet1);
+  norm2(&sbet1, &cbet1); cbet1 = maxx(tiny, cbet1);
 
-  phi = lat2 * degree;
+  sincosdx(lat2, &sbet2, &cbet2); sbet2 *= g->f1;
   /* Ensure cbet2 = +epsilon at poles */
-  sbet2 = g->f1 * sin(phi);
-  cbet2 = fabs(lat2) == 90 ? tiny : cos(phi);
-  SinCosNorm(&sbet2, &cbet2);
+  norm2(&sbet2, &cbet2); cbet2 = maxx(tiny, cbet2);
 
   /* If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the
    * |bet1| - |bet2|.  Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is
@@ -670,8 +713,7 @@ real geod_geninverse(const struct geod_geodesic* g,
   dn2 = sqrt(1 + g->ep2 * sq(sbet2));
 
   lam12 = lon12 * degree;
-  slam12 = lon12 == 180 ? 0 : sin(lam12);
-  clam12 = cos(lam12);      /* lon12 == 90 isn't interesting */
+  sincosdx(lon12, &slam12, &clam12);
 
   meridian = lat1 == -90 || slam12 == 0;
 
@@ -691,20 +733,22 @@ real geod_geninverse(const struct geod_geodesic* g,
     /* sig12 = sig2 - sig1 */
     sig12 = atan2(maxx(csig1 * ssig2 - ssig1 * csig2, (real)(0)),
                   csig1 * csig2 + ssig1 * ssig2);
-    {
-      real dummy;
-      Lengths(g, g->n, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
-              cbet1, cbet2, &s12x, &m12x, &dummy,
-              (outmask & GEOD_GEODESICSCALE) != 0U, &M12, &M21, C1a, C2a);
-    }
+    Lengths(g, g->n, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
+            cbet1, cbet2, &s12x, &m12x, 0,
+            outmask & GEOD_GEODESICSCALE ? &M12 : 0,
+            outmask & GEOD_GEODESICSCALE ? &M21 : 0,
+            Ca);
     /* Add the check for sig12 since zero length geodesics might yield m12 <
      * 0.  Test case was
      *
-     *    echo 20.001 0 20.001 0 | Geod -i
+     *    echo 20.001 0 20.001 0 | GeodSolve -i
      *
      * In fact, we will have sig12 > pi/2 for meridional geodesic which is
      * not a shortest path. */
     if (sig12 < 1 || m12x >= 0) {
+      /* Need at least 2, to handle 90 0 90 180 */
+      if (sig12 < 3 * tiny)
+        sig12 = m12x = s12x = 0;
       m12x *= g->b;
       s12x *= g->b;
       a12 = sig12 / degree;
@@ -737,7 +781,7 @@ real geod_geninverse(const struct geod_geodesic* g,
     sig12 = InverseStart(g, sbet1, cbet1, dn1, sbet2, cbet2, dn2,
                          lam12,
                          &salp1, &calp1, &salp2, &calp2, &dnm,
-                         C1a, C2a);
+                         Ca);
 
     if (sig12 >= 0) {
       /* Short lines (InverseStart sets salp2, calp2, dnm) */
@@ -768,10 +812,10 @@ real geod_geninverse(const struct geod_geodesic* g,
       for (tripn = FALSE, tripb = FALSE; numit < maxit2; ++numit) {
         /* the WGS84 test set: mean = 1.47, sd = 1.25, max = 16
          * WGS84 and random input: mean = 2.85, sd = 0.60 */
-        real dv,
+        real dv = 0,
           v = (Lambda12(g, sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1,
                         &salp2, &calp2, &sig12, &ssig1, &csig1, &ssig2, &csig2,
-                        &eps, &omg12, numit < maxit1, &dv, C1a, C2a, C3a)
+                        &eps, &omg12, numit < maxit1, &dv, Ca)
                - lam12);
         /* 2 * tol0 is approximately 1 ulp for a number in [0, pi]. */
         /* Reversed test to allow escape with NaNs */
@@ -790,7 +834,7 @@ real geod_geninverse(const struct geod_geodesic* g,
           if (nsalp1 > 0 && fabs(dalp1) < pi) {
             calp1 = calp1 * cdalp1 - salp1 * sdalp1;
             salp1 = nsalp1;
-            SinCosNorm(&salp1, &calp1);
+            norm2(&salp1, &calp1);
             /* In some regimes we don't get quadratic convergence because
              * slope -> 0.  So use convergence conditions based on epsilon
              * instead of sqrt(epsilon). */
@@ -808,17 +852,15 @@ real geod_geninverse(const struct geod_geodesic* g,
          * WGS84 and random input: mean = 4.74, sd = 0.99 */
         salp1 = (salp1a + salp1b)/2;
         calp1 = (calp1a + calp1b)/2;
-        SinCosNorm(&salp1, &calp1);
+        norm2(&salp1, &calp1);
         tripn = FALSE;
         tripb = (fabs(salp1a - salp1) + (calp1a - calp1) < tolb ||
                  fabs(salp1 - salp1b) + (calp1 - calp1b) < tolb);
       }
-      {
-        real dummy;
-        Lengths(g, eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
-                cbet1, cbet2, &s12x, &m12x, &dummy,
-                (outmask & GEOD_GEODESICSCALE) != 0U, &M12, &M21, C1a, C2a);
-      }
+      Lengths(g, eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
+              cbet1, cbet2, &s12x, &m12x, 0,
+              outmask & GEOD_GEODESICSCALE ? &M12 : 0,
+              outmask & GEOD_GEODESICSCALE ? &M21 : 0, Ca);
       m12x *= g->b;
       s12x *= g->b;
       a12 = sig12 / degree;
@@ -847,13 +889,12 @@ real geod_geninverse(const struct geod_geodesic* g,
         eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2),
         /* Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0). */
         A4 = sq(g->a) * calp0 * salp0 * g->e2;
-      real C4a[nC4];
       real B41, B42;
-      SinCosNorm(&ssig1, &csig1);
-      SinCosNorm(&ssig2, &csig2);
-      C4f(g, eps, C4a);
-      B41 = SinCosSeries(FALSE, ssig1, csig1, C4a, nC4);
-      B42 = SinCosSeries(FALSE, ssig2, csig2, C4a, nC4);
+      norm2(&ssig1, &csig1);
+      norm2(&ssig2, &csig2);
+      C4f(g, eps, Ca);
+      B41 = SinCosSeries(FALSE, ssig1, csig1, Ca, nC4);
+      B42 = SinCosSeries(FALSE, ssig2, csig2, Ca, nC4);
       S12 = A4 * (B42 - B41);
     } else
       /* Avoid problems with indeterminate sig1, sig2 on equator */
@@ -904,8 +945,8 @@ real geod_geninverse(const struct geod_geodesic* g,
 
   if (outmask & GEOD_AZIMUTH) {
     /* minus signs give range [-180, 180). 0- converts -0 to +0. */
-    azi1 = 0 - atan2(-salp1, calp1) / degree;
-    azi2 = 0 - atan2(-salp2, calp2) / degree;
+    azi1 = atan2dx(salp1, calp1);
+    azi2 = atan2dx(salp2, calp2);
   }
 
   if (outmask & GEOD_DISTANCE)
@@ -961,42 +1002,58 @@ void Lengths(const struct geod_geodesic* g,
              real ssig2, real csig2, real dn2,
              real cbet1, real cbet2,
              real* ps12b, real* pm12b, real* pm0,
-             boolx scalep, real* pM12, real* pM21,
-             /* Scratch areas of the right size */
-             real C1a[], real C2a[]) {
-  real s12b = 0, m12b = 0, m0 = 0, M12 = 0, M21 = 0;
-  real A1m1, AB1, A2m1, AB2, J12;
+             real* pM12, real* pM21,
+             /* Scratch area of the right size */
+             real Ca[]) {
+  real m0 = 0, J12 = 0, A1 = 0, A2 = 0;
+  real Cb[nC];
 
   /* Return m12b = (reduced length)/b; also calculate s12b = distance/b,
    * and m0 = coefficient of secular term in expression for reduced length. */
-  C1f(eps, C1a);
-  C2f(eps, C2a);
-  A1m1 = A1m1f(eps);
-  AB1 = (1 + A1m1) * (SinCosSeries(TRUE, ssig2, csig2, C1a, nC1) -
-                      SinCosSeries(TRUE, ssig1, csig1, C1a, nC1));
-  A2m1 = A2m1f(eps);
-  AB2 = (1 + A2m1) * (SinCosSeries(TRUE, ssig2, csig2, C2a, nC2) -
-                      SinCosSeries(TRUE, ssig1, csig1, C2a, nC2));
-  m0 = A1m1 - A2m1;
-  J12 = m0 * sig12 + (AB1 - AB2);
-  /* Missing a factor of b.
-   * Add parens around (csig1 * ssig2) and (ssig1 * csig2) to ensure accurate
-   * cancellation in the case of coincident points. */
-  m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12;
-  /* Missing a factor of b */
-  s12b = (1 + A1m1) * sig12 + AB1;
-  if (scalep) {
+  boolx redlp = pm12b || pm0 || pM12 || pM21;
+  if (ps12b || redlp) {
+    A1 = A1m1f(eps);
+    C1f(eps, Ca);
+    if (redlp) {
+      A2 = A2m1f(eps);
+      C2f(eps, Cb);
+      m0 = A1 - A2;
+      A2 = 1 + A2;
+    }
+    A1 = 1 + A1;
+  }
+  if (ps12b) {
+    real B1 = SinCosSeries(TRUE, ssig2, csig2, Ca, nC1) -
+      SinCosSeries(TRUE, ssig1, csig1, Ca, nC1);
+    /* Missing a factor of b */
+    *ps12b = A1 * (sig12 + B1);
+    if (redlp) {
+      real B2 = SinCosSeries(TRUE, ssig2, csig2, Cb, nC2) -
+        SinCosSeries(TRUE, ssig1, csig1, Cb, nC2);
+      J12 = m0 * sig12 + (A1 * B1 - A2 * B2);
+    }
+  } else if (redlp) {
+    /* Assume here that nC1 >= nC2 */
+    int l;
+    for (l = 1; l <= nC2; ++l)
+      Cb[l] = A1 * Ca[l] - A2 * Cb[l];
+    J12 = m0 * sig12 + (SinCosSeries(TRUE, ssig2, csig2, Cb, nC2) -
+                        SinCosSeries(TRUE, ssig1, csig1, Cb, nC2));
+  }
+  if (pm0) *pm0 = m0;
+  if (pm12b)
+    /* Missing a factor of b.
+     * Add parens around (csig1 * ssig2) and (ssig1 * csig2) to ensure
+     * accurate cancellation in the case of coincident points. */
+    *pm12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) -
+      csig1 * csig2 * J12;
+  if (pM12 || pM21) {
     real csig12 = csig1 * csig2 + ssig1 * ssig2;
     real t = g->ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
-    M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
-    M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
-  }
-  *ps12b = s12b;
-  *pm12b = m12b;
-  *pm0 = m0;
-  if (scalep) {
-    *pM12 = M12;
-    *pM21 = M21;
+    if (pM12)
+      *pM12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
+    if (pM21)
+      *pM21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
   }
 }
 
@@ -1015,7 +1072,7 @@ real Astroid(real x, real y) {
       S = p * q / 4,            /* S = r^3 * s */
       r2 = sq(r),
       r3 = r * r2,
-      /* The discrimant of the quadratic equation for T3.  This is zero on
+      /* The discriminant of the quadratic equation for T3.  This is zero on
        * the evolute curve p^(1/3)+q^(1/3) = 1 */
       disc = S * (S + 2 * r3);
     real u = r;
@@ -1061,8 +1118,8 @@ real InverseStart(const struct geod_geodesic* g,
                   real* psalp2, real* pcalp2,
                   /* Only updated for short lines */
                   real* pdnm,
-                  /* Scratch areas of the right size */
-                  real C1a[], real C2a[]) {
+                  /* Scratch area of the right size */
+                  real Ca[]) {
   real salp1 = 0, calp1 = 0, salp2 = 0, calp2 = 0, dnm = 0;
 
   /* Return a starting point for Newton's method in salp1 and calp1 (function
@@ -1073,6 +1130,10 @@ real InverseStart(const struct geod_geodesic* g,
     /* bet12 = bet2 - bet1 in [0, pi); bet12a = bet2 + bet1 in (-pi, 0] */
     sbet12 = sbet2 * cbet1 - cbet2 * sbet1,
     cbet12 = cbet2 * cbet1 + sbet2 * sbet1;
+  real sbet12a;
+  boolx shortline = cbet12 >= 0 && sbet12 < (real)(0.5) &&
+    cbet2 * lam12 < (real)(0.5);
+  real omg12 = lam12, somg12, comg12, ssig12, csig12;
 #if defined(__GNUC__) && __GNUC__ == 4 &&       \
   (__GNUC_MINOR__ < 6 || defined(__MINGW32__))
   /* Volatile declaration needed to fix inverse cases
@@ -1081,18 +1142,14 @@ real InverseStart(const struct geod_geodesic* g,
    * 89.333123580033 0 -89.333123580032997687 179.99295812360148422
    * which otherwise fail with g++ 4.4.4 x86 -O3 (Linux)
    * and g++ 4.4.0 (mingw) and g++ 4.6.1 (tdm mingw). */
-  real sbet12a;
   {
     volatile real xx1 = sbet2 * cbet1;
     volatile real xx2 = cbet2 * sbet1;
     sbet12a = xx1 + xx2;
   }
 #else
-  real sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
+  sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
 #endif
-  boolx shortline = cbet12 >= 0 && sbet12 < (real)(0.5) &&
-    cbet2 * lam12 < (real)(0.5);
-  real omg12 = lam12, somg12, comg12, ssig12, csig12;
   if (shortline) {
     real sbetm2 = sq(sbet1 + sbet2);
     /* sin((bet1+bet2)/2)^2
@@ -1116,7 +1173,7 @@ real InverseStart(const struct geod_geodesic* g,
     salp2 = cbet1 * somg12;
     calp2 = sbet12 - cbet1 * sbet2 *
       (comg12 >= 0 ? sq(somg12) / (1 + comg12) : 1 - comg12);
-    SinCosNorm(&salp2, &calp2);
+    norm2(&salp2, &calp2);
     /* Set return value */
     sig12 = atan2(ssig12, csig12);
   } else if (fabs(g->n) > (real)(0.1) || /* No astroid calc if too eccentric */
@@ -1148,13 +1205,12 @@ real InverseStart(const struct geod_geodesic* g,
       real
         cbet12a = cbet2 * cbet1 - sbet2 * sbet1,
         bet12a = atan2(sbet12a, cbet12a);
-      real m12b, m0, dummy;
+      real m12b, m0;
       /* In the case of lon12 = 180, this repeats a calculation made in
        * Inverse. */
       Lengths(g, g->n, pi + bet12a,
               sbet1, -cbet1, dn1, sbet2, cbet2, dn2,
-              cbet1, cbet2, &dummy, &m12b, &m0, FALSE,
-              &dummy, &dummy, C1a, C2a);
+              cbet1, cbet2, 0, &m12b, &m0, 0, 0, Ca);
       x = -1 + m12b / (cbet1 * cbet2 * m0 * pi);
       betscale = x < -(real)(0.01) ? sbet12a / x :
         -g->f * sq(cbet1) * pi;
@@ -1214,8 +1270,9 @@ real InverseStart(const struct geod_geodesic* g,
       calp1 = sbet12a - cbet2 * sbet1 * sq(somg12) / (1 - comg12);
     }
   }
-  if (salp1 > 0)              /* Sanity check on starting guess */
-    SinCosNorm(&salp1, &calp1);
+  /* Sanity check on starting guess.  Backwards check allows NaN through. */
+  if (!(salp1 <= 0))
+    norm2(&salp1, &calp1);
   else {
     salp1 = 1; calp1 = 0;
   }
@@ -1241,8 +1298,8 @@ real Lambda12(const struct geod_geodesic* g,
               real* pssig2, real* pcsig2,
               real* peps, real* pdomg12,
               boolx diffp, real* pdlam12,
-              /* Scratch areas of the right size */
-              real C1a[], real C2a[], real C3a[]) {
+              /* Scratch area of the right size */
+              real Ca[]) {
   real salp2 = 0, calp2 = 0, sig12 = 0,
     ssig1 = 0, csig1 = 0, ssig2 = 0, csig2 = 0, eps = 0, domg12 = 0, dlam12 = 0;
   real salp0, calp0;
@@ -1262,8 +1319,8 @@ real Lambda12(const struct geod_geodesic* g,
    * tan(omg1) = sin(alp0) * tan(sig1) = tan(omg1)=tan(alp1)*sin(bet1) */
   ssig1 = sbet1; somg1 = salp0 * sbet1;
   csig1 = comg1 = calp1 * cbet1;
-  SinCosNorm(&ssig1, &csig1);
-  /* SinCosNorm(&somg1, &comg1); -- don't need to normalize! */
+  norm2(&ssig1, &csig1);
+  /* norm2(&somg1, &comg1); -- don't need to normalize! */
 
   /* Enforce symmetries in the case abs(bet2) = -bet1.  Need to be careful
    * about this case, since this can yield singularities in the Newton
@@ -1284,8 +1341,8 @@ real Lambda12(const struct geod_geodesic* g,
    * tan(omg2) = sin(alp0) * tan(sig2). */
   ssig2 = sbet2; somg2 = salp0 * sbet2;
   csig2 = comg2 = calp2 * cbet2;
-  SinCosNorm(&ssig2, &csig2);
-  /* SinCosNorm(&somg2, &comg2); -- don't need to normalize! */
+  norm2(&ssig2, &csig2);
+  /* norm2(&somg2, &comg2); -- don't need to normalize! */
 
   /* sig12 = sig2 - sig1, limit to [0, pi] */
   sig12 = atan2(maxx(csig1 * ssig2 - ssig1 * csig2, (real)(0)),
@@ -1296,9 +1353,9 @@ real Lambda12(const struct geod_geodesic* g,
                 comg1 * comg2 + somg1 * somg2);
   k2 = sq(calp0) * g->ep2;
   eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
-  C3f(g, eps, C3a);
-  B312 = (SinCosSeries(TRUE, ssig2, csig2, C3a, nC3-1) -
-          SinCosSeries(TRUE, ssig1, csig1, C3a, nC3-1));
+  C3f(g, eps, Ca);
+  B312 = (SinCosSeries(TRUE, ssig2, csig2, Ca, nC3-1) -
+          SinCosSeries(TRUE, ssig1, csig1, Ca, nC3-1));
   h0 = -g->f * A3f(g, eps);
   domg12 = salp0 * h0 * (sig12 + B312);
   lam12 = omg12 + domg12;
@@ -1307,10 +1364,8 @@ real Lambda12(const struct geod_geodesic* g,
     if (calp2 == 0)
       dlam12 = - 2 * g->f1 * dn1 / sbet1;
     else {
-      real dummy;
       Lengths(g, eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
-              cbet1, cbet2, &dummy, &dlam12, &dummy,
-              FALSE, &dummy, &dummy, C1a, C2a);
+              cbet1, cbet2, 0, &dlam12, 0, 0, 0, Ca);
       dlam12 *= g->f1 / (calp2 * cbet2);
     }
   }
@@ -1331,177 +1386,264 @@ real Lambda12(const struct geod_geodesic* g,
 }
 
 real A3f(const struct geod_geodesic* g, real eps) {
-  /* Evaluate sum(A3x[k] * eps^k, k, 0, nA3x-1) by Horner's method */
-  real v = 0;
-  int i;
-  for (i = nA3x; i; )
-    v = eps * v + g->A3x[--i];
-  return v;
+  /* Evaluate A3 */
+  return polyval(nA3 - 1, g->A3x, eps);
 }
 
 void C3f(const struct geod_geodesic* g, real eps, real c[]) {
-  /* Evaluate C3 coeffs by Horner's method
+  /* Evaluate C3 coeffs
    * Elements c[1] thru c[nC3 - 1] are set */
-  int i, j, k;
   real mult = 1;
-  for (j = nC3x, k = nC3 - 1; k; ) {
-    real t = 0;
-    for (i = nC3 - k; i; --i)
-      t = eps * t + g->C3x[--j];
-    c[k--] = t;
-  }
-
-  for (k = 1; k < nC3; ) {
+  int o = 0, l;
+  for (l = 1; l < nC3; ++l) {   /* l is index of C3[l] */
+    int m = nC3 - l - 1;        /* order of polynomial in eps */
     mult *= eps;
-    c[k++] *= mult;
+    c[l] = mult * polyval(m, g->C3x + o, eps);
+    o += m + 1;
   }
 }
 
 void C4f(const struct geod_geodesic* g, real eps, real c[]) {
-  /* Evaluate C4 coeffs by Horner's method
+  /* Evaluate C4 coeffs
    * Elements c[0] thru c[nC4 - 1] are set */
-  int i, j, k;
   real mult = 1;
-  for (j = nC4x, k = nC4; k; ) {
-    real t = 0;
-    for (i = nC4 - k + 1; i; --i)
-      t = eps * t + g->C4x[--j];
-    c[--k] = t;
-  }
-
-  for (k = 1; k < nC4; ) {
+  int o = 0, l;
+  for (l = 0; l < nC4; ++l) {   /* l is index of C4[l] */
+    int m = nC4 - l - 1;        /* order of polynomial in eps */
+    c[l] = mult * polyval(m, g->C4x + o, eps);
+    o += m + 1;
     mult *= eps;
-    c[k++] *= mult;
   }
 }
 
-/* Generated by Maxima on 2010-09-04 10:26:17-04:00 */
-
 /* The scale factor A1-1 = mean value of (d/dsigma)I1 - 1 */
 real A1m1f(real eps)  {
-  real
-    eps2 = sq(eps),
-    t = eps2*(eps2*(eps2+4)+64)/256;
+  static const real coeff[] = {
+    /* (1-eps)*A1-1, polynomial in eps2 of order 3 */
+    1, 4, 64, 0, 256,
+  };
+  int m = nA1/2;
+  real t = polyval(m, coeff, sq(eps)) / coeff[m + 1];
   return (t + eps) / (1 - eps);
 }
 
 /* The coefficients C1[l] in the Fourier expansion of B1 */
 void C1f(real eps, real c[])  {
+  static const real coeff[] = {
+    /* C1[1]/eps^1, polynomial in eps2 of order 2 */
+    -1, 6, -16, 32,
+    /* C1[2]/eps^2, polynomial in eps2 of order 2 */
+    -9, 64, -128, 2048,
+    /* C1[3]/eps^3, polynomial in eps2 of order 1 */
+    9, -16, 768,
+    /* C1[4]/eps^4, polynomial in eps2 of order 1 */
+    3, -5, 512,
+    /* C1[5]/eps^5, polynomial in eps2 of order 0 */
+    -7, 1280,
+    /* C1[6]/eps^6, polynomial in eps2 of order 0 */
+    -7, 2048,
+  };
   real
     eps2 = sq(eps),
     d = eps;
-  c[1] = d*((6-eps2)*eps2-16)/32;
-  d *= eps;
-  c[2] = d*((64-9*eps2)*eps2-128)/2048;
-  d *= eps;
-  c[3] = d*(9*eps2-16)/768;
-  d *= eps;
-  c[4] = d*(3*eps2-5)/512;
-  d *= eps;
-  c[5] = -7*d/1280;
-  d *= eps;
-  c[6] = -7*d/2048;
+  int o = 0, l;
+  for (l = 1; l <= nC1; ++l) {  /* l is index of C1p[l] */
+    int m = (nC1 - l) / 2;      /* order of polynomial in eps^2 */
+    c[l] = d * polyval(m, coeff + o, eps2) / coeff[o + m + 1];
+    o += m + 2;
+    d *= eps;
+  }
 }
 
 /* The coefficients C1p[l] in the Fourier expansion of B1p */
 void C1pf(real eps, real c[])  {
+  static const real coeff[] = {
+    /* C1p[1]/eps^1, polynomial in eps2 of order 2 */
+    205, -432, 768, 1536,
+    /* C1p[2]/eps^2, polynomial in eps2 of order 2 */
+    4005, -4736, 3840, 12288,
+    /* C1p[3]/eps^3, polynomial in eps2 of order 1 */
+    -225, 116, 384,
+    /* C1p[4]/eps^4, polynomial in eps2 of order 1 */
+    -7173, 2695, 7680,
+    /* C1p[5]/eps^5, polynomial in eps2 of order 0 */
+    3467, 7680,
+    /* C1p[6]/eps^6, polynomial in eps2 of order 0 */
+    38081, 61440,
+  };
   real
     eps2 = sq(eps),
     d = eps;
-  c[1] = d*(eps2*(205*eps2-432)+768)/1536;
-  d *= eps;
-  c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
-  d *= eps;
-  c[3] = d*(116-225*eps2)/384;
-  d *= eps;
-  c[4] = d*(2695-7173*eps2)/7680;
-  d *= eps;
-  c[5] = 3467*d/7680;
-  d *= eps;
-  c[6] = 38081*d/61440;
+  int o = 0, l;
+  for (l = 1; l <= nC1p; ++l) { /* l is index of C1p[l] */
+    int m = (nC1p - l) / 2;     /* order of polynomial in eps^2 */
+    c[l] = d * polyval(m, coeff + o, eps2) / coeff[o + m + 1];
+    o += m + 2;
+    d *= eps;
+  }
 }
 
 /* The scale factor A2-1 = mean value of (d/dsigma)I2 - 1 */
 real A2m1f(real eps)  {
-  real
-    eps2 = sq(eps),
-    t = eps2*(eps2*(25*eps2+36)+64)/256;
-  return t * (1 - eps) - eps;
+  static const real coeff[] = {
+    /* (eps+1)*A2-1, polynomial in eps2 of order 3 */
+    -11, -28, -192, 0, 256,
+  };
+  int m = nA2/2;
+  real t = polyval(m, coeff, sq(eps)) / coeff[m + 1];
+  return (t - eps) / (1 + eps);
 }
 
 /* The coefficients C2[l] in the Fourier expansion of B2 */
 void C2f(real eps, real c[])  {
+  static const real coeff[] = {
+    /* C2[1]/eps^1, polynomial in eps2 of order 2 */
+    1, 2, 16, 32,
+    /* C2[2]/eps^2, polynomial in eps2 of order 2 */
+    35, 64, 384, 2048,
+    /* C2[3]/eps^3, polynomial in eps2 of order 1 */
+    15, 80, 768,
+    /* C2[4]/eps^4, polynomial in eps2 of order 1 */
+    7, 35, 512,
+    /* C2[5]/eps^5, polynomial in eps2 of order 0 */
+    63, 1280,
+    /* C2[6]/eps^6, polynomial in eps2 of order 0 */
+    77, 2048,
+  };
   real
     eps2 = sq(eps),
     d = eps;
-  c[1] = d*(eps2*(eps2+2)+16)/32;
-  d *= eps;
-  c[2] = d*(eps2*(35*eps2+64)+384)/2048;
-  d *= eps;
-  c[3] = d*(15*eps2+80)/768;
-  d *= eps;
-  c[4] = d*(7*eps2+35)/512;
-  d *= eps;
-  c[5] = 63*d/1280;
-  d *= eps;
-  c[6] = 77*d/2048;
+  int o = 0, l;
+  for (l = 1; l <= nC2; ++l) { /* l is index of C2[l] */
+    int m = (nC2 - l) / 2;     /* order of polynomial in eps^2 */
+    c[l] = d * polyval(m, coeff + o, eps2) / coeff[o + m + 1];
+    o += m + 2;
+    d *= eps;
+  }
 }
 
 /* The scale factor A3 = mean value of (d/dsigma)I3 */
 void A3coeff(struct geod_geodesic* g) {
-  g->A3x[0] = 1;
-  g->A3x[1] = (g->n-1)/2;
-  g->A3x[2] = (g->n*(3*g->n-1)-2)/8;
-  g->A3x[3] = ((-g->n-3)*g->n-1)/16;
-  g->A3x[4] = (-2*g->n-3)/64;
-  g->A3x[5] = -3/(real)(128);
+  static const real coeff[] = {
+    /* A3, coeff of eps^5, polynomial in n of order 0 */
+    -3, 128,
+    /* A3, coeff of eps^4, polynomial in n of order 1 */
+    -2, -3, 64,
+    /* A3, coeff of eps^3, polynomial in n of order 2 */
+    -1, -3, -1, 16,
+    /* A3, coeff of eps^2, polynomial in n of order 2 */
+    3, -1, -2, 8,
+    /* A3, coeff of eps^1, polynomial in n of order 1 */
+    1, -1, 2,
+    /* A3, coeff of eps^0, polynomial in n of order 0 */
+    1, 1,
+  };
+  int o = 0, k = 0, j;
+  for (j = nA3 - 1; j >= 0; --j) {             /* coeff of eps^j */
+    int m = nA3 - j - 1 < j ? nA3 - j - 1 : j; /* order of polynomial in n */
+    g->A3x[k++] = polyval(m, coeff + o, g->n) / coeff[o + m + 1];
+    o += m + 2;
+  }
 }
 
 /* The coefficients C3[l] in the Fourier expansion of B3 */
 void C3coeff(struct geod_geodesic* g) {
-  g->C3x[0] = (1-g->n)/4;
-  g->C3x[1] = (1-g->n*g->n)/8;
-  g->C3x[2] = ((3-g->n)*g->n+3)/64;
-  g->C3x[3] = (2*g->n+5)/128;
-  g->C3x[4] = 3/(real)(128);
-  g->C3x[5] = ((g->n-3)*g->n+2)/32;
-  g->C3x[6] = ((-3*g->n-2)*g->n+3)/64;
-  g->C3x[7] = (g->n+3)/128;
-  g->C3x[8] = 5/(real)(256);
-  g->C3x[9] = (g->n*(5*g->n-9)+5)/192;
-  g->C3x[10] = (9-10*g->n)/384;
-  g->C3x[11] = 7/(real)(512);
-  g->C3x[12] = (7-14*g->n)/512;
-  g->C3x[13] = 7/(real)(512);
-  g->C3x[14] = 21/(real)(2560);
+  static const real coeff[] = {
+    /* C3[1], coeff of eps^5, polynomial in n of order 0 */
+    3, 128,
+    /* C3[1], coeff of eps^4, polynomial in n of order 1 */
+    2, 5, 128,
+    /* C3[1], coeff of eps^3, polynomial in n of order 2 */
+    -1, 3, 3, 64,
+    /* C3[1], coeff of eps^2, polynomial in n of order 2 */
+    -1, 0, 1, 8,
+    /* C3[1], coeff of eps^1, polynomial in n of order 1 */
+    -1, 1, 4,
+    /* C3[2], coeff of eps^5, polynomial in n of order 0 */
+    5, 256,
+    /* C3[2], coeff of eps^4, polynomial in n of order 1 */
+    1, 3, 128,
+    /* C3[2], coeff of eps^3, polynomial in n of order 2 */
+    -3, -2, 3, 64,
+    /* C3[2], coeff of eps^2, polynomial in n of order 2 */
+    1, -3, 2, 32,
+    /* C3[3], coeff of eps^5, polynomial in n of order 0 */
+    7, 512,
+    /* C3[3], coeff of eps^4, polynomial in n of order 1 */
+    -10, 9, 384,
+    /* C3[3], coeff of eps^3, polynomial in n of order 2 */
+    5, -9, 5, 192,
+    /* C3[4], coeff of eps^5, polynomial in n of order 0 */
+    7, 512,
+    /* C3[4], coeff of eps^4, polynomial in n of order 1 */
+    -14, 7, 512,
+    /* C3[5], coeff of eps^5, polynomial in n of order 0 */
+    21, 2560,
+  };
+  int o = 0, k = 0, l, j;
+  for (l = 1; l < nC3; ++l) {                    /* l is index of C3[l] */
+    for (j = nC3 - 1; j >= l; --j) {             /* coeff of eps^j */
+      int m = nC3 - j - 1 < j ? nC3 - j - 1 : j; /* order of polynomial in n */
+      g->C3x[k++] = polyval(m, coeff + o, g->n) / coeff[o + m + 1];
+      o += m + 2;
+    }
+  }
 }
 
-/* Generated by Maxima on 2012-10-19 08:02:34-04:00 */
-
 /* The coefficients C4[l] in the Fourier expansion of I4 */
 void C4coeff(struct geod_geodesic* g) {
-  g->C4x[0] = (g->n*(g->n*(g->n*(g->n*(100*g->n+208)+572)+3432)-12012)+30030)/
-    45045;
-  g->C4x[1] = (g->n*(g->n*(g->n*(64*g->n+624)-4576)+6864)-3003)/15015;
-  g->C4x[2] = (g->n*((14144-10656*g->n)*g->n-4576)-858)/45045;
-  g->C4x[3] = ((-224*g->n-4784)*g->n+1573)/45045;
-  g->C4x[4] = (1088*g->n+156)/45045;
-  g->C4x[5] = 97/(real)(15015);
-  g->C4x[6] = (g->n*(g->n*((-64*g->n-624)*g->n+4576)-6864)+3003)/135135;
-  g->C4x[7] = (g->n*(g->n*(5952*g->n-11648)+9152)-2574)/135135;
-  g->C4x[8] = (g->n*(5792*g->n+1040)-1287)/135135;
-  g->C4x[9] = (468-2944*g->n)/135135;
-  g->C4x[10] = 1/(real)(9009);
-  g->C4x[11] = (g->n*((4160-1440*g->n)*g->n-4576)+1716)/225225;
-  g->C4x[12] = ((4992-8448*g->n)*g->n-1144)/225225;
-  g->C4x[13] = (1856*g->n-936)/225225;
-  g->C4x[14] = 8/(real)(10725);
-  g->C4x[15] = (g->n*(3584*g->n-3328)+1144)/315315;
-  g->C4x[16] = (1024*g->n-208)/105105;
-  g->C4x[17] = -136/(real)(63063);
-  g->C4x[18] = (832-2560*g->n)/405405;
-  g->C4x[19] = -128/(real)(135135);
-  g->C4x[20] = 128/(real)(99099);
+  static const real coeff[] = {
+    /* C4[0], coeff of eps^5, polynomial in n of order 0 */
+    97, 15015,
+    /* C4[0], coeff of eps^4, polynomial in n of order 1 */
+    1088, 156, 45045,
+    /* C4[0], coeff of eps^3, polynomial in n of order 2 */
+    -224, -4784, 1573, 45045,
+    /* C4[0], coeff of eps^2, polynomial in n of order 3 */
+    -10656, 14144, -4576, -858, 45045,
+    /* C4[0], coeff of eps^1, polynomial in n of order 4 */
+    64, 624, -4576, 6864, -3003, 15015,
+    /* C4[0], coeff of eps^0, polynomial in n of order 5 */
+    100, 208, 572, 3432, -12012, 30030, 45045,
+    /* C4[1], coeff of eps^5, polynomial in n of order 0 */
+    1, 9009,
+    /* C4[1], coeff of eps^4, polynomial in n of order 1 */
+    -2944, 468, 135135,
+    /* C4[1], coeff of eps^3, polynomial in n of order 2 */
+    5792, 1040, -1287, 135135,
+    /* C4[1], coeff of eps^2, polynomial in n of order 3 */
+    5952, -11648, 9152, -2574, 135135,
+    /* C4[1], coeff of eps^1, polynomial in n of order 4 */
+    -64, -624, 4576, -6864, 3003, 135135,
+    /* C4[2], coeff of eps^5, polynomial in n of order 0 */
+    8, 10725,
+    /* C4[2], coeff of eps^4, polynomial in n of order 1 */
+    1856, -936, 225225,
+    /* C4[2], coeff of eps^3, polynomial in n of order 2 */
+    -8448, 4992, -1144, 225225,
+    /* C4[2], coeff of eps^2, polynomial in n of order 3 */
+    -1440, 4160, -4576, 1716, 225225,
+    /* C4[3], coeff of eps^5, polynomial in n of order 0 */
+    -136, 63063,
+    /* C4[3], coeff of eps^4, polynomial in n of order 1 */
+    1024, -208, 105105,
+    /* C4[3], coeff of eps^3, polynomial in n of order 2 */
+    3584, -3328, 1144, 315315,
+    /* C4[4], coeff of eps^5, polynomial in n of order 0 */
+    -128, 135135,
+    /* C4[4], coeff of eps^4, polynomial in n of order 1 */
+    -2560, 832, 405405,
+    /* C4[5], coeff of eps^5, polynomial in n of order 0 */
+    128, 99099,
+  };
+  int o = 0, k = 0, l, j;
+  for (l = 0; l < nC4; ++l) {        /* l is index of C4[l] */
+    for (j = nC4 - 1; j >= l; --j) { /* coeff of eps^j */
+      int m = nC4 - j - 1;           /* order of polynomial in n */
+      g->C4x[k++] = polyval(m, coeff + o, g->n) / coeff[o + m + 1];
+      o += m + 2;
+    }
+  }
 }
 
 int transit(real lon1, real lon2) {
@@ -1516,6 +1658,13 @@ int transit(real lon1, real lon2) {
     (lon2 < 0 && lon1 >= 0 && lon12 < 0 ? -1 : 0);
 }
 
+int transitdirect(real lon1, real lon2) {
+  lon1 = fmod(lon1, (real)(720));
+  lon2 = fmod(lon2, (real)(720));
+  return ( ((lon2 >= 0 && lon2 < 360) || lon2 < -360 ? 0 : 1) -
+           ((lon1 >= 0 && lon1 < 360) || lon1 < -360 ? 0 : 1) );
+}
+
 void accini(real s[]) {
   /* Initialize an accumulator; this is an array with two elements. */
   s[0] = s[1] = 0;
@@ -1583,13 +1732,13 @@ void geod_polygon_addedge(const struct geod_geodesic* g,
                           real azi, real s) {
   if (p->num) {                 /* Do nothing is num is zero */
     real lat, lon, S12;
-    geod_gendirect(g, p->lat, p->lon, azi, FALSE, s,
+    geod_gendirect(g, p->lat, p->lon, azi, GEOD_LONG_UNROLL, s,
                    &lat, &lon, 0,
                    0, 0, 0, 0, p->polyline ? 0 : &S12);
     accadd(p->P, s);
     if (!p->polyline) {
       accadd(p->A, S12);
-      p->crossings += transit(p->lon, lon);
+      p->crossings += transitdirect(p->lon, lon);
     }
     p->lat = lat; p->lon = lon;
     ++p->num;
@@ -1720,11 +1869,11 @@ unsigned geod_polygon_testedge(const struct geod_geodesic* g,
   crossings = p->crossings;
   {
     real lat, lon, s12, S12;
-    geod_gendirect(g, p->lat, p->lon, azi, FALSE, s,
+    geod_gendirect(g, p->lat, p->lon, azi, GEOD_LONG_UNROLL, s,
                    &lat, &lon, 0,
                    0, 0, 0, 0, &S12);
     tempsum += S12;
-    crossings += transit(p->lon, lon);
+    crossings += transitdirect(p->lon, lon);
     geod_geninverse(g, lat,  lon, p->lat0,  p->lon0,
                     &s12, 0, 0, 0, 0, 0, &S12);
     perimeter += s12;
diff --git a/src/geodesic.h b/src/geodesic.h
index 6998500..7bd8270 100644
--- a/src/geodesic.h
+++ b/src/geodesic.h
@@ -4,10 +4,10 @@
  *
  * This an implementation in C of the geodesic algorithms described in
  * - C. F. F. Karney,
- *   <a href="http://dx.doi.org/10.1007/s00190-012-0578-z">
+ *   <a href="https://dx.doi.org/10.1007/s00190-012-0578-z">
  *   Algorithms for geodesics</a>,
  *   J. Geodesy <b>87</b>, 43--55 (2013);
- *   DOI: <a href="http://dx.doi.org/10.1007/s00190-012-0578-z">
+ *   DOI: <a href="https://dx.doi.org/10.1007/s00190-012-0578-z">
  *   10.1007/s00190-012-0578-z</a>;
  *   addenda: <a href="http://geographiclib.sf.net/geod-addenda.html">
  *   geod-addenda.html</a>.
@@ -75,18 +75,18 @@
  * (obviously) uniquely defined.  However, in a few special cases there are
  * multiple azimuths which yield the same shortest distance.  Here is a
  * catalog of those cases:
- * - \e lat1 = −\e lat2 (with neither at a pole).  If \e azi1 = \e
- *   azi2, the geodesic is unique.  Otherwise there are two geodesics
+ * - \e lat1 = −\e lat2 (with neither point at a pole).  If \e azi1 =
+ *   \e azi2, the geodesic is unique.  Otherwise there are two geodesics
  *   and the second one is obtained by setting [\e azi1, \e azi2] = [\e
  *   azi2, \e azi1], [\e M12, \e M21] = [\e M21, \e M12], \e S12 =
  *   −\e S12.  (This occurs when the longitude difference is near
  *   ±180° for oblate ellipsoids.)
- * - \e lon2 = \e lon1 ± 180° (with neither at a pole).  If
- *   \e azi1 = 0° or ±180°, the geodesic is unique.
+ * - \e lon2 = \e lon1 ± 180° (with neither point at a pole).
+ *   If \e azi1 = 0° or ±180°, the geodesic is unique.
  *   Otherwise there are two geodesics and the second one is obtained by
- *   setting [\e azi1, \e azi2] = [−\e azi1, −\e azi2], \e
- *   S12 = −\e S12.  (This occurs when the \e lat2 is near
- *   −\e lat1 for prolate ellipsoids.)
+ *   setting [\e azi1, \e azi2] = [−\e azi1, −\e azi2], \e S12
+ *   = −\e S12.  (This occurs when \e lat2 is near −\e lat1 for
+ *   prolate ellipsoids.)
  * - Points 1 and 2 at opposite poles.  There are infinitely many
  *   geodesics which can be generated by setting [\e azi1, \e azi2] =
  *   [\e azi1, \e azi2] + [\e d, −\e d], for arbitrary \e d.  (For
@@ -103,17 +103,17 @@
  * to the member functions.  Most of the internal comments have been retained.
  * However, in the process of transcription some documentation has been lost
  * and the documentation for the C++ classes, GeographicLib::Geodesic,
- * GeographicLib::GeodesicLine, and GeographicLib::PolygonArea, should be
+ * GeographicLib::GeodesicLine, and GeographicLib::PolygonAreaT, should be
  * consulted.  The C++ code remains the "reference implementation".  Think
  * twice about restructuring the internals of the C code since this may make
  * porting fixes from the C++ code more difficult.
  *
- * Copyright (c) Charles Karney (2012-2013) <charles at karney.com> and licensed
+ * Copyright (c) Charles Karney (2012-2015) <charles at karney.com> and licensed
  * under the MIT/X11 License.  For more information, see
  * http://geographiclib.sourceforge.net/
  *
  * This library was distributed with
- * <a href="../index.html">GeographicLib</a> 1.32.
+ * <a href="../index.html">GeographicLib</a> 1.44.
  **********************************************************************/
 
 #if !defined(GEODESIC_H)
@@ -128,13 +128,36 @@
  * The minor version of the geodesic library.  (This tracks the version of
  * GeographicLib.)
  **********************************************************************/
-#define GEODESIC_VERSION_MINOR 32
+#define GEODESIC_VERSION_MINOR 44
 /**
  * The patch level of the geodesic library.  (This tracks the version of
  * GeographicLib.)
  **********************************************************************/
 #define GEODESIC_VERSION_PATCH 0
 
+/**
+ * Pack the version components into a single integer.  Users should not rely on
+ * this particular packing of the components of the version number; see the
+ * documentation for GEODESIC_VERSION, below.
+ **********************************************************************/
+#define GEODESIC_VERSION_NUM(a,b,c) ((((a) * 10000 + (b)) * 100) + (c))
+
+/**
+ * The version of the geodesic library as a single integer, packed as MMmmmmpp
+ * where MM is the major version, mmmm is the minor version, and pp is the
+ * patch level.  Users should not rely on this particular packing of the
+ * components of the version number.  Instead they should use a test such as
+ * @code{.c}
+   #if GEODESIC_VERSION >= GEODESIC_VERSION_NUM(1,40,0)
+   ...
+   #endif
+ * @endcode
+ **********************************************************************/
+#define GEODESIC_VERSION \
+ GEODESIC_VERSION_NUM(GEODESIC_VERSION_MAJOR, \
+                      GEODESIC_VERSION_MINOR, \
+                      GEODESIC_VERSION_PATCH)
+
 #if defined(__cplusplus)
 extern "C" {
 #endif
@@ -214,8 +237,7 @@ extern "C" {
    *   geod_genposition().
    *
    * \e g must have been initialized with a call to geod_init().  \e lat1
-   * should be in the range [−90°, 90°]; \e lon1 and \e azi1
-   * should be in the range [−540°, 540°).
+   * should be in the range [−90°, 90°].
    *
    * The geod_mask values are [see geod_mask()]:
    * - \e caps |= GEOD_LATITUDE for the latitude \e lat2; this is
@@ -255,8 +277,7 @@ extern "C" {
    * @param[out] pazi2 pointer to the (forward) azimuth at point 2 (degrees).
    *
    * \e g must have been initialized with a call to geod_init().  \e lat1
-   * should be in the range [−90°, 90°]; \e lon1 and \e azi1
-   * should be in the range [−540°, 540°).  The values of \e lon2
+   * should be in the range [−90°, 90°].  The values of \e lon2
    * and \e azi2 returned are in the range [−180°, 180°).  Any of
    * the "return" arguments \e plat2, etc., may be replaced by 0, if you do not
    * need some quantities computed.
@@ -269,7 +290,7 @@ extern "C" {
    * longitudinal extent must not exceed of 180°.)
    *
    * Example, determine the point 10000 km NE of JFK:
-   @code
+   @code{.c}
    struct geod_geodesic g;
    double lat, lon;
    geod_init(&g, 6378137, 1/298.257223563);
@@ -295,11 +316,10 @@ extern "C" {
    * @param[out] pazi1 pointer to the azimuth at point 1 (degrees).
    * @param[out] pazi2 pointer to the (forward) azimuth at point 2 (degrees).
    *
-   * \e g must have been initialized with a call to geod_init().  \e lat1
-   * and \e lat2 should be in the range [−90°, 90°]; \e lon1 and
-   * \e lon2 should be in the range [−540°, 540°).  The values of
+   * \e g must have been initialized with a call to geod_init().  \e lat1 and
+   * \e lat2 should be in the range [−90°, 90°].  The values of
    * \e azi1 and \e azi2 returned are in the range [−180°, 180°).
-   * Any of the "return" arguments \e ps12, etc., may be replaced by 0, if you
+   * Any of the "return" arguments, \e ps12, etc., may be replaced by 0, if you
    * do not need some quantities computed.
    *
    * If either point is at a pole, the azimuth is defined by keeping the
@@ -312,7 +332,7 @@ extern "C" {
    * is used to refine the solution.
    *
    * Example, determine the distance between JFK and Singapore Changi Airport:
-   @code
+   @code{.c}
    struct geod_geodesic g;
    double s12;
    geod_init(&g, 6378137, 1/298.257223563);
@@ -344,7 +364,7 @@ extern "C" {
    *
    * Example, compute way points between JFK and Singapore Changi Airport
    * the "obvious" way using geod_direct():
-   @code
+   @code{.c}
    struct geod_geodesic g;
    double s12, azi1, lat[101],lon[101];
    int i;
@@ -356,7 +376,7 @@ extern "C" {
    }
    @endcode
    * A faster way using geod_position():
-   @code
+   @code{.c}
    struct geod_geodesic g;
    struct geod_geodesicline l;
    double s12, azi1, lat[101],lon[101];
@@ -381,11 +401,12 @@ extern "C" {
    * @param[in] lat1 latitude of point 1 (degrees).
    * @param[in] lon1 longitude of point 1 (degrees).
    * @param[in] azi1 azimuth at point 1 (degrees).
-   * @param[in] arcmode flag determining the meaning of the \e
-   *   s12_a12.
-   * @param[in] s12_a12 if \e arcmode is 0, this is the distance between
-   *   point 1 and point 2 (meters); otherwise it is the arc length between
-   *   point 1 and point 2 (degrees); it can be negative.
+   * @param[in] flags bitor'ed combination of geod_flags(); \e flags &
+   *   GEOD_ARCMODE determines the meaning of \e s12_a12 and \e flags &
+   *   GEOD_LONG_UNROLL "unrolls" \e lon2.
+   * @param[in] s12_a12 if \e flags & GEOD_ARCMODE is 0, this is the distance
+   *   between point 1 and point 2 (meters); otherwise it is the arc length
+   *   between point 1 and point 2 (degrees); it can be negative.
    * @param[out] plat2 pointer to the latitude of point 2 (degrees).
    * @param[out] plon2 pointer to the longitude of point 2 (degrees).
    * @param[out] pazi2 pointer to the (forward) azimuth at point 2 (degrees).
@@ -401,15 +422,18 @@ extern "C" {
    * @return \e a12 arc length of between point 1 and point 2 (degrees).
    *
    * \e g must have been initialized with a call to geod_init().  \e lat1
-   * should be in the range [−90°, 90°]; \e lon1 and \e azi1
-   * should be in the range [−540°, 540°).  The function value \e
-   * a12 equals \e s12_a12 is \e arcmode is non-zero.  Any of the "return"
-   * arguments \e plat2, etc., may be replaced by 0, if you do not need some
+   * should be in the range [−90°, 90°].  The function value \e
+   * a12 equals \e s12_a12 if \e flags & GEOD_ARCMODE.  Any of the "return"
+   * arguments, \e plat2, etc., may be replaced by 0, if you do not need some
    * quantities computed.
+   *
+   * With \e flags & GEOD_LONG_UNROLL bit set, the longitude is "unrolled" so
+   * that the quantity \e lon2 − \e lon1 indicates how many times and in
+   * what sense the geodesic encircles the ellipsoid.
    **********************************************************************/
   double geod_gendirect(const struct geod_geodesic* g,
                         double lat1, double lon1, double azi1,
-                        int arcmode, double s12_a12,
+                        unsigned flags, double s12_a12,
                         double* plat2, double* plon2, double* pazi2,
                         double* ps12, double* pm12, double* pM12, double* pM21,
                         double* pS12);
@@ -436,9 +460,8 @@ extern "C" {
    *   (meters<sup>2</sup>).
    * @return \e a12 arc length of between point 1 and point 2 (degrees).
    *
-   * \e g must have been initialized with a call to geod_init().  \e lat1
-   * and \e lat2 should be in the range [−90°, 90°]; \e lon1 and
-   * \e lon2 should be in the range [−540°, 540°).  Any of the
+   * \e g must have been initialized with a call to geod_init().  \e lat1 and
+   * \e lat2 should be in the range [−90°, 90°].  Any of the
    * "return" arguments \e ps12, etc., may be replaced by 0, if you do not need
    * some quantities computed.
    **********************************************************************/
@@ -453,12 +476,14 @@ extern "C" {
    *
    * @param[in] l a pointer to the geod_geodesicline object specifying the
    *   geodesic line.
-   * @param[in] arcmode flag determining the meaning of the second parameter;
-   *   if arcmode is 0, then \e l must have been initialized with \e caps |=
-   *   GEOD_DISTANCE_IN.
-   * @param[in] s12_a12 if \e arcmode is 0, this is the distance between
-   *   point 1 and point 2 (meters); otherwise it is the arc length between
-   *   point 1 and point 2 (degrees); it can be negative.
+   * @param[in] flags bitor'ed combination of geod_flags(); \e flags &
+   *   GEOD_ARCMODE determines the meaning of \e s12_a12 and \e flags &
+   *   GEOD_LONG_UNROLL "unrolls" \e lon2; if \e flags & GEOD_ARCMODE is 0,
+   *   then \e l must have been initialized with \e caps |= GEOD_DISTANCE_IN.
+   * @param[in] s12_a12 if \e flags & GEOD_ARCMODE is 0, this is the
+   *   distance between point 1 and point 2 (meters); otherwise it is the
+   *   arc length between point 1 and point 2 (degrees); it can be
+   *   negative.
    * @param[out] plat2 pointer to the latitude of point 2 (degrees).
    * @param[out] plon2 pointer to the longitude of point 2 (degrees); requires
    *   that \e l was initialized with \e caps |= GEOD_LONGITUDE.
@@ -480,21 +505,25 @@ extern "C" {
    * @return \e a12 arc length of between point 1 and point 2 (degrees).
    *
    * \e l must have been initialized with a call to geod_lineinit() with \e
-   * caps |= GEOD_DISTANCE_IN.  The values of \e lon2 and \e azi2 returned are
-   * in the range [−180°, 180°).  Any of the "return" arguments
-   * \e plat2, etc., may be replaced by 0, if you do not need some quantities
-   * computed.  Requesting a value which \e l is not capable of computing is
-   * not an error; the corresponding argument will not be altered.
+   * caps |= GEOD_DISTANCE_IN.  The value \e azi2 returned is in the range
+   * [−180°, 180°).  Any of the "return" arguments \e plat2,
+   * etc., may be replaced by 0, if you do not need some quantities
+   * computed.  Requesting a value which \e l is not capable of computing
+   * is not an error; the corresponding argument will not be altered.
+   *
+   * With \e flags & GEOD_LONG_UNROLL bit set, the longitude is "unrolled" so
+   * that the quantity \e lon2 − \e lon1 indicates how many times and in
+   * what sense the geodesic encircles the ellipsoid.
    *
    * Example, compute way points between JFK and Singapore Changi Airport
    * using geod_genposition().  In this example, the points are evenly space in
    * arc length (and so only approximately equally space in distance).  This is
    * faster than using geod_position() would be appropriate if drawing the path
    * on a map.
-   @code
+   @code{.c}
    struct geod_geodesic g;
    struct geod_geodesicline l;
-   double a12, azi1, lat[101],lon[101];
+   double a12, azi1, lat[101], lon[101];
    int i;
    geod_init(&g, 6378137, 1/298.257223563);
    a12 = geod_geninverse(&g, 40.64, -73.78, 1.36, 103.99,
@@ -508,7 +537,7 @@ extern "C" {
    @endcode
    **********************************************************************/
   double geod_genposition(const struct geod_geodesicline* l,
-                          int arcmode, double s12_a12,
+                          unsigned flags, double s12_a12,
                           double* plat2, double* plon2, double* pazi2,
                           double* ps12, double* pm12,
                           double* pM12, double* pM21,
@@ -526,6 +555,10 @@ extern "C" {
    * polylinep is non-zero, then the vertices and edges define a polyline and
    * only the perimeter is returned by geod_polygon_compute().
    *
+   * The area and perimeter are accumulated at two times the standard floating
+   * point precision to guard against the loss of accuracy with many-sided
+   * polygons.  At any point you can ask for the perimeter and area so far.
+   *
    * An example of the use of this function is given in the documentation for
    * geod_polygon_compute().
    **********************************************************************/
@@ -544,8 +577,7 @@ extern "C" {
    * \e g and \e p must have been initialized with calls to geod_init() and
    * geod_polygon_init(), respectively.  The same \e g must be used for all the
    * points and edges in a polygon.  \e lat should be in the range
-   * [−90°, 90°] and \e lon should be in the range
-   * [−540°, 540°).
+   * [−90°, 90°].
    *
    * An example of the use of this function is given in the documentation for
    * geod_polygon_compute().
@@ -566,10 +598,9 @@ extern "C" {
    *
    * \e g and \e p must have been initialized with calls to geod_init() and
    * geod_polygon_init(), respectively.  The same \e g must be used for all the
-   * points and edges in a polygon.  \e azi should be in the range
-   * [−540°, 540°).  This does nothing if no points have been
-   * added yet.  The \e lat and \e lon fields of \e p give the location of
-   * the new vertex.
+   * points and edges in a polygon.  This does nothing if no points have been
+   * added yet.  The \e lat and \e lon fields of \e p give the location of the
+   * new vertex.
    **********************************************************************/
   void geod_polygon_addedge(const struct geod_geodesic* g,
                             struct geod_polygon* p,
@@ -592,14 +623,16 @@ extern "C" {
    *   polyline (meters).
    * @return the number of points.
    *
-   * Only simple polygons (which are not self-intersecting) are allowed.
-   * There's no need to "close" the polygon by repeating the first vertex.  Set
-   * \e pA or \e pP to zero, if you do not want the corresponding quantity
-   * returned.
+   * The area and perimeter are accumulated at two times the standard floating
+   * point precision to guard against the loss of accuracy with many-sided
+   * polygons.  Only simple polygons (which are not self-intersecting) are
+   * allowed.  There's no need to "close" the polygon by repeating the first
+   * vertex.  Set \e pA or \e pP to zero, if you do not want the corresponding
+   * quantity returned.
    *
    * Example, compute the perimeter and area of the geodesic triangle with
    * vertices (0°N,0°E), (0°N,90°E), (90°N,0°E).
-   @code
+   @code{.c}
    double A, P;
    int n;
    struct geod_geodesic g;
@@ -643,8 +676,7 @@ extern "C" {
    *   polyline (meters).
    * @return the number of points.
    *
-   * \e lat should be in the range [−90°, 90°] and \e
-   * lon should be in the range [−540°, 540°).
+   * \e lat should be in the range [−90°, 90°].
    **********************************************************************/
   unsigned geod_polygon_testpoint(const struct geod_geodesic* g,
                                   const struct geod_polygon* p,
@@ -676,8 +708,6 @@ extern "C" {
    * @param[out] pP pointer to the perimeter of the polygon or length of the
    *   polyline (meters).
    * @return the number of points.
-   *
-   * \e azi should be in the range [−540°, 540°).
    **********************************************************************/
   unsigned geod_polygon_testedge(const struct geod_geodesic* g,
                                  const struct geod_polygon* p,
@@ -696,16 +726,15 @@ extern "C" {
    * @param[out] pA pointer to the area of the polygon (meters<sup>2</sup>).
    * @param[out] pP pointer to the perimeter of the polygon (meters).
    *
-   * \e lats should be in the range [−90°, 90°]; \e lons should
-   * be in the range [−540°, 540°).
+   * \e lats should be in the range [−90°, 90°].
    *
    * Only simple polygons (which are not self-intersecting) are allowed.
    * There's no need to "close" the polygon by repeating the first vertex.  The
    * area returned is signed with counter-clockwise traversal being treated as
    * positive.
    *
-   * Example, compute the area of Antarctic:
-   @code
+   * Example, compute the area of Antarctica:
+   @code{.c}
    double
      lats[] = {-72.9, -71.9, -74.9, -74.3, -77.5, -77.4, -71.7, -65.9, -65.7,
                -66.6, -66.9, -69.8, -70.0, -71.0, -77.3, -77.9, -74.7},
@@ -723,7 +752,7 @@ extern "C" {
                         double* pA, double* pP);
 
   /**
-   * mask values for the the \e caps argument to geod_lineinit().
+   * mask values for the \e caps argument to geod_lineinit().
    **********************************************************************/
   enum geod_mask {
     GEOD_NONE         = 0U,                     /**< Calculate nothing */
@@ -738,6 +767,19 @@ extern "C" {
     GEOD_ALL          = 0x7F80U| 0x1FU          /**< Calculate everything */
   };
 
+  /**
+   * flag values for the \e flags argument to geod_gendirect() and
+   * geod_genposition()
+   **********************************************************************/
+  enum geod_flags {
+    GEOD_NOFLAGS      = 0U,     /**< No flags */
+    GEOD_ARCMODE      = 1U<<0,  /**< Position given in terms of arc distance */
+    GEOD_LONG_UNROLL  = 1U<<15, /**< Unroll the longitude */
+    /**< @cond SKIP */
+    GEOD_LONG_NOWRAP  = GEOD_LONG_UNROLL /* For backward compatibility only */
+    /**< @endcond */
+  };
+
 #if defined(__cplusplus)
 }
 #endif
diff --git a/src/mk_cheby.c b/src/mk_cheby.c
index 0ff0a22..32f22f1 100644
--- a/src/mk_cheby.c
+++ b/src/mk_cheby.c
@@ -36,7 +36,7 @@ Tseries *
 mk_cheby(projUV a, projUV b, double res, projUV *resid, projUV (*func)(projUV), 
          int nu, int nv, int power) {
     int j, i, nru, nrv, *ncu, *ncv;
-    Tseries *T;
+    Tseries *T = NULL;
     projUV **w;
     double cutres;
 
diff --git a/src/nad_init.c b/src/nad_init.c
index 6c2787c..3b35ea6 100644
--- a/src/nad_init.c
+++ b/src/nad_init.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: nad_init.c 2345 2013-06-22 07:54:57Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Load datum shift files into memory.
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -85,7 +83,7 @@ static void swap_words( void *data_in, int word_size, int word_count )
 int nad_ctable_load( projCtx ctx, struct CTABLE *ct, PAFile fid )
 
 {
-    int  a_size;
+    size_t a_size;
 
     pj_ctx_fseek( ctx, fid, sizeof(struct CTABLE), SEEK_SET );
 
@@ -158,7 +156,7 @@ struct CTABLE *nad_ctable_init( projCtx ctx, PAFile fid )
 int nad_ctable2_load( projCtx ctx, struct CTABLE *ct, PAFile fid )
 
 {
-    int  a_size;
+    size_t a_size;
 
     pj_ctx_fseek( ctx, fid, 160, SEEK_SET );
 
diff --git a/src/pj_apply_gridshift.c b/src/pj_apply_gridshift.c
index 4e7681a..d614190 100644
--- a/src/pj_apply_gridshift.c
+++ b/src/pj_apply_gridshift.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_apply_gridshift.c 2548 2014-09-17 06:21:09Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Apply datum shifts based on grid shift files (normally NAD27 to
  *           NAD83 or the reverse).  This module is responsible for keeping
@@ -119,6 +117,7 @@ int pj_apply_gridshift_3( projCtx ctx, PJ_GRIDINFO **tables, int grid_count,
 {
     int  i;
     static int debug_count = 0;
+    (void) z;
 
     if( tables == NULL || grid_count == 0 )
     {
diff --git a/src/pj_apply_vgridshift.c b/src/pj_apply_vgridshift.c
index d26e902..7f82d83 100644
--- a/src/pj_apply_vgridshift.c
+++ b/src/pj_apply_vgridshift.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_apply_gridshift.c 1831 2010-03-16 12:44:36Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Apply vertical datum shifts based on grid shift files, normally
  *           geoid grids mapping WGS84 to NAVD88 or something similar.
@@ -153,7 +151,7 @@ int pj_apply_vgridshift( PJ *defn, const char *listname,
                 + cvs[grid_ix + 1 + (grid_iy+1) * ct->lim.lam] 
                 * (grid_x) * (grid_y);
 
-            if( value > 1000 || value < -1000 ) /* nodata? */
+            if( value == -88.88880f ) /* nodata? */
                 value = HUGE_VAL;
             else
             {
diff --git a/src/pj_ctx.c b/src/pj_ctx.c
index 048baf4..43d1225 100644
--- a/src/pj_ctx.c
+++ b/src/pj_ctx.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id$
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the projCtx thread context object.
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -30,8 +28,6 @@
 #include <projects.h>
 #include <string.h>
 
-PJ_CVSID("$Id$");
-
 static projCtx_t default_context;
 static volatile int       default_context_initialized = 0;
 
diff --git a/src/pj_datum_set.c b/src/pj_datum_set.c
index b47e469..194bfe5 100644
--- a/src/pj_datum_set.c
+++ b/src/pj_datum_set.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_datum_set.c 2219 2012-06-19 04:18:00Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Apply datum definition to PJ structure from initialization string.
  * Author:   Frank Warmerdam, warmerda at home.com
@@ -118,10 +116,9 @@ int pj_datum_set(projCtx ctx, paralist *pl, PJ *projdef)
         memset( projdef->datum_params, 0, sizeof(double) * 7);
 
         /* parse out the parameters */
-        s = towgs84;
         for( s = towgs84; *s != '\0' && parm_count < 7; ) 
         {
-            projdef->datum_params[parm_count++] = atof(s);
+            projdef->datum_params[parm_count++] = pj_atof(s);
             while( *s != '\0' && *s != ',' )
                 s++;
             if( *s == ',' )
diff --git a/src/pj_datums.c b/src/pj_datums.c
index 114b88c..c9655cd 100644
--- a/src/pj_datums.c
+++ b/src/pj_datums.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_datums.c 2553 2014-09-17 09:07:29Z rouault $
- *
  * Project:  PROJ.4
  * Purpose:  Built in datum list.
  * Author:   Frank Warmerdam, warmerda at home.com
@@ -40,21 +38,30 @@
 C_NAMESPACE_VAR struct PJ_DATUMS pj_datums[] = {
 /* id       definition                               ellipse  comments */
 /* --       ----------                               -------  -------- */
-"WGS84",    "towgs84=0,0,0", 		             "WGS84", "",
-"GGRS87",   "towgs84=-199.87,74.79,246.62",          "GRS80", 
-				"Greek_Geodetic_Reference_System_1987",
-"NAD83",    "towgs84=0,0,0",                         "GRS80", 
-				"North_American_Datum_1983",
-"NAD27",    "nadgrids=@conus, at alaska, at ntv2_0.gsb, at ntv1_can.dat",           
-                                                     "clrk66", 
-				"North_American_Datum_1927",
-"potsdam",  "towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7",  "bessel",  "Potsdam Rauenberg 1950 DHDN",
-"carthage",  "towgs84=-263.0,6.0,431.0",  "clrk80ign",  "Carthage 1934 Tunisia",
-"hermannskogel", "towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232",  "bessel",  "Hermannskogel",
-"ire65",  "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",  "mod_airy",  "Ireland 1965",
-"nzgd49",    "towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", "intl", "New Zealand Geodetic Datum 1949",
-"OSGB36",    "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", "airy", "Airy 1830",
-NULL,       NULL,                                    NULL,    NULL 
+{"WGS84",   "towgs84=0,0,0",                         "WGS84", ""},
+{"GGRS87",  "towgs84=-199.87,74.79,246.62",          "GRS80",
+                                                              "Greek_Geodetic_Reference_System_1987"},
+{"NAD83",   "towgs84=0,0,0",                         "GRS80",
+                                                              "North_American_Datum_1983"},
+{"NAD27",   "nadgrids=@conus, at alaska, at ntv2_0.gsb, at ntv1_can.dat",
+                                                     "clrk66",
+                                                              "North_American_Datum_1927"},
+{"potsdam", "towgs84=598.1,73.7,418.2,0.202,0.045,-2.455,6.7",
+                                                     "bessel",
+                                                              "Potsdam Rauenberg 1950 DHDN"},
+{"carthage","towgs84=-263.0,6.0,431.0",              "clrk80ign",
+                                                              "Carthage 1934 Tunisia"},
+{"hermannskogel",  "towgs84=577.326,90.129,463.919,5.137,1.474,5.297,2.4232",
+                                                     "bessel",
+                                                              "Hermannskogel"},
+{"ire65",   "towgs84=482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",
+                                                     "mod_airy",
+                                                              "Ireland 1965"},
+{"nzgd49",  "towgs84=59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",
+                                                     "intl",  "New Zealand Geodetic Datum 1949"},
+{"OSGB36",  "towgs84=446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",
+                                                     "airy",  "Airy 1830"},
+{NULL,      NULL,                                    NULL,    NULL}
 };
 
 struct PJ_DATUMS *pj_get_datums_ref()
@@ -66,20 +73,20 @@ struct PJ_DATUMS *pj_get_datums_ref()
 C_NAMESPACE_VAR struct PJ_PRIME_MERIDIANS pj_prime_meridians[] = {
     /* id        definition                         */
     /* --        ----------                         */
-    "greenwich", "0dE",
-    "lisbon",    "9d07'54.862\"W",
-    "paris",     "2d20'14.025\"E",
-    "bogota",    "74d04'51.3\"W",
-    "madrid",    "3d41'16.58\"W",
-    "rome",      "12d27'8.4\"E",
-    "bern",      "7d26'22.5\"E",
-    "jakarta",   "106d48'27.79\"E",
-    "ferro",     "17d40'W",
-    "brussels",  "4d22'4.71\"E",
-    "stockholm", "18d3'29.8\"E",
-    "athens",    "23d42'58.815\"E",
-    "oslo",      "10d43'22.5\"E",
-    NULL,        NULL 
+    {"greenwich", "0dE"},
+    {"lisbon",    "9d07'54.862\"W"},
+    {"paris",     "2d20'14.025\"E"},
+    {"bogota",    "74d04'51.3\"W"},
+    {"madrid",    "3d41'16.58\"W"},
+    {"rome",      "12d27'8.4\"E"},
+    {"bern",      "7d26'22.5\"E"},
+    {"jakarta",   "106d48'27.79\"E"},
+    {"ferro",     "17d40'W"},
+    {"brussels",  "4d22'4.71\"E"},
+    {"stockholm", "18d3'29.8\"E"},
+    {"athens",    "23d42'58.815\"E"},
+    {"oslo",      "10d43'22.5\"E"},
+    {NULL,        NULL}
 };
 
 struct PJ_PRIME_MERIDIANS *pj_get_prime_meridians_ref()
diff --git a/src/pj_ell_set.c b/src/pj_ell_set.c
index 857bd78..af825be 100644
--- a/src/pj_ell_set.c
+++ b/src/pj_ell_set.c
@@ -11,7 +11,7 @@ pj_ell_set(projCtx ctx, paralist *pl, double *a, double *es) {
 	int i;
 	double b=0.0, e;
 	char *name;
-	paralist *start = 0, *curr;
+	paralist *start = 0;
 
         /* clear any previous error */
         pj_ctx_set_errno(ctx,0);
@@ -28,11 +28,10 @@ pj_ell_set(projCtx ctx, paralist *pl, double *a, double *es) {
 			char *s;
 
 			for (start = pl; start && start->next ; start = start->next) ;
-			curr = start;
 			for (i = 0; (s = pj_ellps[i].id) && strcmp(name, s) ; ++i) ;
 			if (!s) { pj_ctx_set_errno( ctx, -9); return 1; }
-			curr = curr->next = pj_mkparam(pj_ellps[i].major);
-			curr = curr->next = pj_mkparam(pj_ellps[i].ell);
+			start->next = pj_mkparam(pj_ellps[i].major);
+			start->next->next = pj_mkparam(pj_ellps[i].ell);
 		}
 		*a = pj_param(ctx,pl, "da").f;
 		if (pj_param(ctx,pl, "tes").i) /* eccentricity squared */
diff --git a/src/pj_ellps.c b/src/pj_ellps.c
index 3da162b..32fbbd4 100644
--- a/src/pj_ellps.c
+++ b/src/pj_ellps.c
@@ -4,50 +4,50 @@
 
 C_NAMESPACE_VAR struct PJ_ELLPS
 pj_ellps[] = {
-"MERIT",	"a=6378137.0", "rf=298.257", "MERIT 1983",
-"SGS85",	"a=6378136.0", "rf=298.257",  "Soviet Geodetic System 85",
-"GRS80",	"a=6378137.0", "rf=298.257222101", "GRS 1980(IUGG, 1980)",
-"IAU76",	"a=6378140.0", "rf=298.257", "IAU 1976",
-"airy",		"a=6377563.396", "b=6356256.910", "Airy 1830",
-"APL4.9",	"a=6378137.0.",  "rf=298.25", "Appl. Physics. 1965",
-"NWL9D",	"a=6378145.0.",  "rf=298.25", "Naval Weapons Lab., 1965",
-"mod_airy",	"a=6377340.189", "b=6356034.446", "Modified Airy",
-"andrae",	"a=6377104.43",  "rf=300.0", 	"Andrae 1876 (Den., Iclnd.)",
-"aust_SA",	"a=6378160.0", "rf=298.25", "Australian Natl & S. Amer. 1969",
-"GRS67",	"a=6378160.0", "rf=298.2471674270", "GRS 67(IUGG 1967)",
-"bessel",	"a=6377397.155", "rf=299.1528128", "Bessel 1841",
-"bess_nam",	"a=6377483.865", "rf=299.1528128", "Bessel 1841 (Namibia)",
-"clrk66",	"a=6378206.4", "b=6356583.8", "Clarke 1866",
-"clrk80",	"a=6378249.145", "rf=293.4663", "Clarke 1880 mod.",
-"clrk80ign","a=6378249.2", "rf=293.4660212936269", "Clarke 1880 (IGN).",
-"CPM",  	"a=6375738.7", "rf=334.29", "Comm. des Poids et Mesures 1799",
-"delmbr",	"a=6376428.",  "rf=311.5", "Delambre 1810 (Belgium)",
-"engelis",	"a=6378136.05", "rf=298.2566", "Engelis 1985",
-"evrst30",  "a=6377276.345", "rf=300.8017",  "Everest 1830",
-"evrst48",  "a=6377304.063", "rf=300.8017",  "Everest 1948",
-"evrst56",  "a=6377301.243", "rf=300.8017",  "Everest 1956",
-"evrst69",  "a=6377295.664", "rf=300.8017",  "Everest 1969",
-"evrstSS",  "a=6377298.556", "rf=300.8017",  "Everest (Sabah & Sarawak)",
-"fschr60",  "a=6378166.",   "rf=298.3", "Fischer (Mercury Datum) 1960",
-"fschr60m", "a=6378155.",   "rf=298.3", "Modified Fischer 1960",
-"fschr68",  "a=6378150.",   "rf=298.3", "Fischer 1968",
-"helmert",  "a=6378200.",   "rf=298.3", "Helmert 1906",
-"hough",	"a=6378270.0", "rf=297.", "Hough",
-"intl",		"a=6378388.0", "rf=297.", "International 1909 (Hayford)",
-"krass",	"a=6378245.0", "rf=298.3", "Krassovsky, 1942",
-"kaula",	"a=6378163.",  "rf=298.24", "Kaula 1961",
-"lerch",	"a=6378139.",  "rf=298.257", "Lerch 1979",
-"mprts",	"a=6397300.",  "rf=191.", "Maupertius 1738",
-"new_intl",	"a=6378157.5", "b=6356772.2", "New International 1967",
-"plessis",	"a=6376523.",  "b=6355863.", "Plessis 1817 (France)",
-"SEasia",	"a=6378155.0", "b=6356773.3205", "Southeast Asia",
-"walbeck",	"a=6376896.0", "b=6355834.8467", "Walbeck",
-"WGS60",    "a=6378165.0",  "rf=298.3", "WGS 60",
-"WGS66",	"a=6378145.0", "rf=298.25", "WGS 66",
-"WGS72",	"a=6378135.0", "rf=298.26", "WGS 72",
-"WGS84",    "a=6378137.0",  "rf=298.257223563", "WGS 84",
-"sphere",   "a=6370997.0",  "b=6370997.0", "Normal Sphere (r=6370997)",
-0,0,0,0
+{"MERIT",	"a=6378137.0",		"rf=298.257",		"MERIT 1983"},
+{"SGS85",	"a=6378136.0",		"rf=298.257",		"Soviet Geodetic System 85"},
+{"GRS80",	"a=6378137.0",		"rf=298.257222101",	"GRS 1980(IUGG, 1980)"},
+{"IAU76",	"a=6378140.0",		"rf=298.257",		"IAU 1976"},
+{"airy",	"a=6377563.396",	"b=6356256.910",	"Airy 1830"},
+{"APL4.9",	"a=6378137.0.",		"rf=298.25",		"Appl. Physics. 1965"},
+{"NWL9D",	"a=6378145.0.",		"rf=298.25",		"Naval Weapons Lab., 1965"},
+{"mod_airy",	"a=6377340.189",	"b=6356034.446",	"Modified Airy"},
+{"andrae",	"a=6377104.43",		"rf=300.0",		"Andrae 1876 (Den., Iclnd.)"},
+{"aust_SA",	"a=6378160.0",		"rf=298.25",		"Australian Natl & S. Amer. 1969"},
+{"GRS67",	"a=6378160.0",		"rf=298.2471674270",	"GRS 67(IUGG 1967)"},
+{"bessel",	"a=6377397.155",	"rf=299.1528128",	"Bessel 1841"},
+{"bess_nam",	"a=6377483.865",	"rf=299.1528128",	"Bessel 1841 (Namibia)"},
+{"clrk66",	"a=6378206.4",		"b=6356583.8",		"Clarke 1866"},
+{"clrk80",	"a=6378249.145",	"rf=293.4663",		"Clarke 1880 mod."},
+{"clrk80ign",	"a=6378249.2",		"rf=293.4660212936269",	"Clarke 1880 (IGN)."},
+{"CPM", 	"a=6375738.7",		"rf=334.29",		"Comm. des Poids et Mesures 1799"},
+{"delmbr",	"a=6376428.",		"rf=311.5",		"Delambre 1810 (Belgium)"},
+{"engelis",	"a=6378136.05",		"rf=298.2566",		"Engelis 1985"},
+{"evrst30",	"a=6377276.345",	"rf=300.8017",		"Everest 1830"},
+{"evrst48",	"a=6377304.063",	"rf=300.8017",		"Everest 1948"},
+{"evrst56",	"a=6377301.243",	"rf=300.8017",		"Everest 1956"},
+{"evrst69",	"a=6377295.664",	"rf=300.8017",		"Everest 1969"},
+{"evrstSS",	"a=6377298.556",	"rf=300.8017",		"Everest (Sabah & Sarawak)"},
+{"fschr60",	"a=6378166.",		"rf=298.3",		"Fischer (Mercury Datum) 1960"},
+{"fschr60m",	"a=6378155.",		"rf=298.3",		"Modified Fischer 1960"},
+{"fschr68",	"a=6378150.",		"rf=298.3",		"Fischer 1968"},
+{"helmert",	"a=6378200.",		"rf=298.3",		"Helmert 1906"},
+{"hough",	"a=6378270.0",		"rf=297.",		"Hough"},
+{"intl",	"a=6378388.0",		"rf=297.",		"International 1909 (Hayford)"},
+{"krass",	"a=6378245.0",		"rf=298.3",		"Krassovsky, 1942"},
+{"kaula",	"a=6378163.",		"rf=298.24",		"Kaula 1961"},
+{"lerch",	"a=6378139.",		"rf=298.257",		"Lerch 1979"},
+{"mprts",	"a=6397300.",		"rf=191.",		"Maupertius 1738"},
+{"new_intl",	"a=6378157.5",		"b=6356772.2",		"New International 1967"},
+{"plessis",	"a=6376523.",		"b=6355863.", 		"Plessis 1817 (France)"},
+{"SEasia",	"a=6378155.0",		"b=6356773.3205",	"Southeast Asia"},
+{"walbeck",	"a=6376896.0",		"b=6355834.8467",	"Walbeck"},
+{"WGS60",	"a=6378165.0",		"rf=298.3",		"WGS 60"},
+{"WGS66",	"a=6378145.0",		"rf=298.25",		"WGS 66"},
+{"WGS72",	"a=6378135.0",		"rf=298.26", 		"WGS 72"},
+{"WGS84",	"a=6378137.0",		"rf=298.257223563",	"WGS 84"},
+{"sphere",	"a=6370997.0",		"b=6370997.0",		"Normal Sphere (r=6370997)"},
+{NULL,		NULL,			NULL,			NULL}
 };
 
 struct PJ_ELLPS *pj_get_ellps_ref()
diff --git a/src/pj_fileapi.c b/src/pj_fileapi.c
index c0b3369..fa35f30 100644
--- a/src/pj_fileapi.c
+++ b/src/pj_fileapi.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id$
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of the pj_ctx_* file api, and the default stdio
  *           based implementation.
@@ -31,8 +29,6 @@
 #include <projects.h>
 #include <string.h>
 
-PJ_CVSID("$Id$");
-
 static PAFile pj_stdio_fopen(projCtx ctx, const char *filename, 
                              const char *access);
 static size_t pj_stdio_fread(void *buffer, size_t size, size_t nmemb, 
@@ -185,7 +181,7 @@ char *pj_ctx_fgets(projCtx ctx, char *line, int size, PAFile file)
     bytes_read = pj_ctx_fread(ctx, line, 1, size-1, file);
     if(bytes_read == 0)
         return NULL;
-    if(bytes_read < size) 
+    if(bytes_read < (size_t)size)
     {
         line[bytes_read] = '\0';
     }
diff --git a/src/pj_fwd.c b/src/pj_fwd.c
index b70b424..1cd002b 100644
--- a/src/pj_fwd.c
+++ b/src/pj_fwd.c
@@ -24,14 +24,23 @@ pj_fwd(LP lp, PJ *P) {
 		lp.lam -= P->lam0;	/* compute del lp.lam */
 		if (!P->over)
 			lp.lam = adjlon(lp.lam); /* adjust del longitude */
-		xy = (*P->fwd)(lp, P); /* project */
-		if ( P->ctx->last_errno )
+
+                //Check for NULL pointer
+                if (P->fwd != NULL)
+                {
+		    xy = (*P->fwd)(lp, P); /* project */
+		    if ( P->ctx->last_errno )
 			xy.x = xy.y = HUGE_VAL;
-		/* adjust for major axis and easting/northings */
-		else {
+		    /* adjust for major axis and easting/northings */
+		    else {
 			xy.x = P->fr_meter * (P->a * xy.x + P->x0);
 			xy.y = P->fr_meter * (P->a * xy.y + P->y0);
-		}
+		    }
+                }
+                else
+                {
+                    xy.x = xy.y = HUGE_VAL;
+                }
 	}
 	return xy;
 }
diff --git a/src/pj_fwd3d.c b/src/pj_fwd3d.c
new file mode 100644
index 0000000..834746d
--- /dev/null
+++ b/src/pj_fwd3d.c
@@ -0,0 +1,47 @@
+/* general forward projection */
+#define PJ_LIB__
+#include <projects.h>
+#include <errno.h>
+# define EPS 1.0e-12
+	XYZ /* forward projection entry */
+pj_fwd3d(LPZ lpz, PJ *P) {
+	XYZ xyz;
+	double t;
+
+	/* check for forward and latitude or longitude overange */
+	if ((t = fabs(lpz.phi)-HALFPI) > EPS || fabs(lpz.lam) > 10.) {
+		xyz.x = xyz.y = xyz.z = HUGE_VAL;
+		pj_ctx_set_errno( P->ctx, -14);
+	} else { /* proceed with projection */
+                P->ctx->last_errno = 0;
+                pj_errno = 0;
+                errno = 0;
+
+		if (fabs(t) <= EPS)
+			lpz.phi = lpz.phi < 0. ? -HALFPI : HALFPI;
+		else if (P->geoc)   //Maybe redundant and never used.
+			lpz.phi = atan(P->rone_es * tan(lpz.phi));
+		lpz.lam -= P->lam0;	/* compute del lp.lam */
+		if (!P->over)
+			lpz.lam = adjlon(lpz.lam); /* adjust del longitude */
+
+                //Check for NULL pointer
+                if (P->fwd3d != NULL)
+                {
+		    xyz = (*P->fwd3d)(lpz, P); /* project */
+		    if ( P->ctx->last_errno )
+			xyz.x = xyz.y = xyz.z = HUGE_VAL;
+		    /* adjust for major axis and easting/northings */
+		    else {
+			xyz.x = P->fr_meter * (P->a * xyz.x + P->x0);
+			xyz.y = P->fr_meter * (P->a * xyz.y + P->y0);
+                        //z is not scaled since this handled by vto_meter outside
+		    }
+                }
+                else
+                {
+                    xyz.x = xyz.y = xyz.z = HUGE_VAL;
+                }
+	}
+	return xyz;
+}
diff --git a/src/pj_gauss.c b/src/pj_gauss.c
index 1d2e2ab..b4b965f 100644
--- a/src/pj_gauss.c
+++ b/src/pj_gauss.c
@@ -3,8 +3,6 @@
 **
 ** Copyright (c) 2003   Gerald I. Evenden
 */
-static const char
-LIBPROJ_ID[] = "$Id: pj_gauss.c 1856 2010-06-11 03:26:04Z warmerdam $";
 /*
 ** Permission is hereby granted, free of charge, to any person obtaining
 ** a copy of this software and associated documentation files (the
@@ -66,6 +64,7 @@ pj_gauss_ini(double e, double phi0, double *chi, double *rc) {
 	LP
 pj_gauss(projCtx ctx, LP elp, const void *en) {
 	LP slp;
+	(void) ctx;
 
 	slp.phi = 2. * atan( EN->K *
 		pow(tan(.5 * elp.phi + FORTPI), EN->C) *
diff --git a/src/pj_gc_reader.c b/src/pj_gc_reader.c
index 1845fca..458737c 100644
--- a/src/pj_gc_reader.c
+++ b/src/pj_gc_reader.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id$
- *
  * Project:  PROJ.4
  * Purpose:  Code to read a grid catalog from a .cvs file.
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -34,7 +32,6 @@
 #include <ctype.h>
 
 static int pj_gc_readentry(projCtx ctx, PAFile fid, PJ_GridCatalogEntry *entry);
-static void pj_gc_sortcatalog( projCtx ctx, PJ_GridCatalog *catalog );
 
 /************************************************************************/
 /*                         pj_gc_readcatalog()                          */
@@ -82,24 +79,10 @@ PJ_GridCatalog *pj_gc_readcatalog( projCtx ctx, const char *catalog_name )
         }
     }
 
-    pj_gc_sortcatalog( ctx, catalog );
-
     return catalog;
 }
 
 /************************************************************************/
-/*                         pj_gc_sortcatalog()                          */
-/*                                                                      */
-/*      Sort all the entries in ascending date and within a date in     */
-/*      descending priority order.                                      */
-/************************************************************************/
-
-static void pj_gc_sortcatalog( projCtx ctx, PJ_GridCatalog *catalog )
-
-{
-}
-
-/************************************************************************/
 /*                        pj_gc_read_csv_line()                         */
 /*                                                                      */
 /*      Simple csv line splitter with fixed maximum line size and       */
@@ -155,6 +138,8 @@ static int pj_gc_read_csv_line( projCtx ctx, PAFile fid,
 
 double pj_gc_parsedate( projCtx ctx, const char *date_string )
 {
+    (void) ctx;
+
     if( strlen(date_string) == 10 
         && date_string[4] == '-' && date_string[7] == '-' ) 
     {
@@ -167,7 +152,7 @@ double pj_gc_parsedate( projCtx ctx, const char *date_string )
     }
     else 
     {
-        return atof(date_string);
+        return pj_atof(date_string);
     }
 }
 
diff --git a/src/pj_geocent.c b/src/pj_geocent.c
index e94730f..6b2f302 100644
--- a/src/pj_geocent.c
+++ b/src/pj_geocent.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_geocent.c 1504 2009-01-06 02:11:57Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Stub projection for geocentric.  The transformation isn't
  *           really done here since this code is 2D.  The real transformation
@@ -32,16 +30,16 @@
 #define PJ_LIB__
 #include <projects.h>
 
-PJ_CVSID("$Id: pj_geocent.c 1504 2009-01-06 02:11:57Z warmerdam $");
-
 PROJ_HEAD(geocent, "Geocentric")  "\n\t";
 
 FORWARD(forward);
+	(void) P;
         xy.x = lp.lam;
         xy.y = lp.phi;
         return xy;
 }
 INVERSE(inverse);
+	(void) P;
         lp.phi = xy.y;
         lp.lam = xy.x;
         return lp;
diff --git a/src/pj_gridcatalog.c b/src/pj_gridcatalog.c
index 76f52c8..7954318 100644
--- a/src/pj_gridcatalog.c
+++ b/src/pj_gridcatalog.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id$
- *
  * Project:  PROJ.4
  * Purpose:  Code in support of grid catalogs
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -43,8 +41,9 @@ static PJ_GridCatalog *grid_catalog_list = NULL;
 /************************************************************************/
 
 void pj_gc_unloadall( projCtx ctx )
-
 {
+    (void) ctx;
+
     while( grid_catalog_list != NULL )
     {
         int i;
@@ -105,6 +104,7 @@ int pj_gc_apply_gridshift( PJ *defn, int inverse,
 
 {
     int i;
+    (void) z;
 
     if( defn->catalog == NULL ) 
     {
diff --git a/src/pj_gridinfo.c b/src/pj_gridinfo.c
index 3761717..958396a 100644
--- a/src/pj_gridinfo.c
+++ b/src/pj_gridinfo.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_gridinfo.c 2548 2014-09-17 06:21:09Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Functions for handling individual PJ_GRIDINFO's.  Includes
  *           loaders for all formats but CTABLE (in nad_init.c).
@@ -41,7 +39,7 @@
  * TODO - mloskot: re-implement porting friendly assert
  */
 # define assert(exp)	((void)0)
-#else/
+#else
 # include <assert.h>
 #endif /* _WIN32_WCE */
 
@@ -52,7 +50,7 @@
 /************************************************************************/
 
 static int  byte_order_test = 1;
-#define IS_LSB	(((unsigned char *) (&byte_order_test))[0] == 1)
+#define IS_LSB	(1 == ((unsigned char *) (&byte_order_test))[0])
 
 static void swap_words( unsigned char *data, int word_size, int word_count )
 
@@ -227,7 +225,7 @@ int pj_gridinfo_load( projCtx ctx, PJ_GRIDINFO *gi )
 
             if( pj_ctx_fread( ctx, row_buf,
                               sizeof(double), gi->ct->lim.lam * 2, fid )
-                != 2 * gi->ct->lim.lam )
+                != (size_t)( 2 * gi->ct->lim.lam ) )
             {
                 pj_dalloc( row_buf );
                 pj_dalloc( ct_tmp.cvs );
@@ -305,7 +303,7 @@ int pj_gridinfo_load( projCtx ctx, PJ_GRIDINFO *gi )
 
             if( pj_ctx_fread( ctx, row_buf, sizeof(float),
                               gi->ct->lim.lam*4, fid )
-                != 4 * gi->ct->lim.lam )
+                != (size_t)( 4 * gi->ct->lim.lam ) )
             {
                 pj_dalloc( row_buf );
                 pj_dalloc( ct_tmp.cvs );
@@ -370,7 +368,7 @@ int pj_gridinfo_load( projCtx ctx, PJ_GRIDINFO *gi )
         }
 
         if( pj_ctx_fread( ctx, ct_tmp.cvs, sizeof(float), words, fid )
-            != words )
+            != (size_t)words )
         {
             pj_dalloc( ct_tmp.cvs );
             pj_release_lock();
@@ -399,7 +397,7 @@ int pj_gridinfo_load( projCtx ctx, PJ_GRIDINFO *gi )
 /*      Seek a parent grid file by name from a grid list                */
 /************************************************************************/
 
-static PJ_GRIDINFO* pj_gridinfo_parent( PJ_GRIDINFO *gilist, 
+static PJ_GRIDINFO* pj_gridinfo_parent( PJ_GRIDINFO *gilist,
         const char *name, int length )
 {
     while( gilist )
@@ -860,9 +858,8 @@ PJ_GRIDINFO *pj_gridinfo_init( projCtx ctx, const char *gridname )
 /* -------------------------------------------------------------------- */
     if( pj_ctx_fread( ctx, header, sizeof(header), 1, fp ) != 1 )
     {
-        pj_ctx_fclose( ctx, fp );
-        pj_ctx_set_errno( ctx, -38 );
-        return gilist;
+        /* some files may be smaller that sizeof(header), eg 160, so */
+        ctx->last_errno = 0; /* don't treat as a persistent error */
     }
 
     pj_ctx_fseek( ctx, fp, SEEK_SET, 0 );
diff --git a/src/pj_gridlist.c b/src/pj_gridlist.c
index dae859a..0cfab76 100644
--- a/src/pj_gridlist.c
+++ b/src/pj_gridlist.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_gridlist.c 1990 2011-03-28 18:06:43Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Code to manage the list of currently loaded (cached) PJ_GRIDINFOs
  *           See pj_gridinfo.c for details of loading individual grids.
@@ -178,7 +176,7 @@ PJ_GRIDINFO **pj_gridlist_from_nadgrids( projCtx ctx, const char *nadgrids,
 /* -------------------------------------------------------------------- */
     for( s = nadgrids; *s != '\0'; )
     {
-        int   end_char;
+        size_t end_char;
         int   required = 1;
         char  name[128];
 
diff --git a/src/pj_init.c b/src/pj_init.c
index c238af3..13d469d 100644
--- a/src/pj_init.c
+++ b/src/pj_init.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_init.c 2482 2014-08-18 22:43:04Z hobu $
- *
  * Project:  PROJ.4
  * Purpose:  Initialize projection object from string definition.  Includes
  *           pj_init(), pj_init_plus() and pj_free() function.
@@ -34,11 +32,8 @@
 #include <stdio.h>
 #include <string.h>
 #include <errno.h>
-#include <locale.h>
 #include <ctype.h>
 
-PJ_CVSID("$Id: pj_init.c 2482 2014-08-18 22:43:04Z hobu $");
-
 typedef struct {
     projCtx ctx;
     PAFile fid;
@@ -54,7 +49,7 @@ typedef struct {
 static const char *fill_buffer(pj_read_state *state, const char *last_char)
 {
     size_t bytes_read;
-    int char_remaining, char_requested;
+    size_t char_remaining, char_requested;
 
 /* -------------------------------------------------------------------- */
 /*      Don't bother trying to read more if we are at eof, or if the    */
@@ -312,7 +307,7 @@ pj_init_plus_ctx( projCtx ctx, const char *definition )
     char	*argv[MAX_ARG];
     char	*defn_copy;
     int		argc = 0, i, blank_count = 0;
-    PJ	    *result;
+    PJ	    *result = NULL;
     
     /* make a copy that we can manipulate */
     defn_copy = (char *) pj_malloc( strlen(definition)+1 );
@@ -337,7 +332,7 @@ pj_init_plus_ctx( projCtx ctx, const char *definition )
                 if( argc+1 == MAX_ARG )
                 {
                     pj_ctx_set_errno( ctx, -44 );
-                    return NULL;
+                    goto bum_call;
                 }
                 
                 argv[argc++] = defn_copy + i + 1;
@@ -365,6 +360,7 @@ pj_init_plus_ctx( projCtx ctx, const char *definition )
     /* perform actual initialization */
     result = pj_init_ctx( ctx, argc, argv );
 
+bum_call:
     pj_dalloc( defn_copy );
 
     return result;
@@ -392,37 +388,21 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) {
     paralist *curr;
     int i;
     PJ *PIN = 0;
-    char *old_locale;
 
     ctx->last_errno = 0;
     start = NULL;
 
-    /*
-    ** MS Visual Studio 2012+ may have problems in multithreaded cases
-    ** as discussed in this ticket:
-    ** http://trac.osgeo.org/proj/ticket/226
-    */
-    old_locale = setlocale(LC_NUMERIC, NULL);
-    if (old_locale != NULL) {
-       if (strcmp(old_locale,"C") != 0) {
-	  setlocale(LC_NUMERIC,"C");
-	  old_locale = strdup(old_locale);
-       }else
-	  old_locale = NULL;
-    }
-
     /* put arguments into internal linked list */
     if (argc <= 0) { pj_ctx_set_errno( ctx, -1 ); goto bum_call; }
-    for (i = 0; i < argc; ++i)
-        if (i)
-            curr = curr->next = pj_mkparam(argv[i]);
-        else
-            start = curr = pj_mkparam(argv[i]);
+    start = curr = pj_mkparam(argv[0]);
+    for (i = 1; i < argc; ++i) {
+        curr->next = pj_mkparam(argv[i]);
+        curr = curr->next;
+    }
     if (ctx->last_errno) goto bum_call;
 
     /* check if +init present */
     if (pj_param(ctx, start, "tinit").i) {
-        paralist *last = curr;
         int found_def = 0;
 
         if (!(curr = get_init(ctx,&start, curr,
@@ -558,9 +538,9 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) {
         s = pj_units[i].to_meter;
     }
     if (s || (s = pj_param(ctx, start, "sto_meter").s)) {
-        PIN->to_meter = strtod(s, &s);
+        PIN->to_meter = pj_strtod(s, &s);
         if (*s == '/') /* ratio number */
-            PIN->to_meter /= strtod(++s, 0);
+            PIN->to_meter /= pj_strtod(++s, 0);
         PIN->fr_meter = 1. / PIN->to_meter;
     } else
         PIN->to_meter = PIN->fr_meter = 1.;
@@ -573,9 +553,9 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) {
         s = pj_units[i].to_meter;
     }
     if (s || (s = pj_param(ctx, start, "svto_meter").s)) {
-        PIN->vto_meter = strtod(s, &s);
+        PIN->vto_meter = pj_strtod(s, &s);
         if (*s == '/') /* ratio number */
-            PIN->vto_meter /= strtod(++s, 0);
+            PIN->vto_meter /= pj_strtod(++s, 0);
         PIN->vfr_meter = 1. / PIN->vto_meter;
     } else {
         PIN->vto_meter = PIN->to_meter;
@@ -621,11 +601,6 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) {
         PIN = 0;
     }
 
-    if (old_locale != NULL) {
-       setlocale(LC_NUMERIC,old_locale);
-       free( (char*)old_locale );
-    }
-
     return PIN;
 }
 
@@ -642,7 +617,7 @@ pj_init_ctx(projCtx ctx, int argc, char **argv) {
 void
 pj_free(PJ *P) {
     if (P) {
-        paralist *t = P->params, *n;
+        paralist *t, *n;
 
         /* free parameter list elements */
         for (t = P->params; t; t = n) {
diff --git a/src/pj_initcache.c b/src/pj_initcache.c
index 71036f2..e36b0ab 100644
--- a/src/pj_initcache.c
+++ b/src/pj_initcache.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  init file definition cache.
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -30,8 +28,6 @@
 #include <projects.h>
 #include <string.h>
 
-PJ_CVSID("$Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $");
-
 static int cache_count = 0;
 static int cache_alloc = 0;
 static char **cache_key = NULL;
diff --git a/src/pj_inv.c b/src/pj_inv.c
index a418ccd..d77b4e5 100644
--- a/src/pj_inv.c
+++ b/src/pj_inv.c
@@ -19,15 +19,24 @@ pj_inv(XY xy, PJ *P) {
 
 	xy.x = (xy.x * P->to_meter - P->x0) * P->ra; /* descale and de-offset */
 	xy.y = (xy.y * P->to_meter - P->y0) * P->ra;
-	lp = (*P->inv)(xy, P); /* inverse project */
-	if (P->ctx->last_errno )
+
+        //Check for NULL pointer
+        if (P->inv != NULL)
+        {
+	    lp = (*P->inv)(xy, P); /* inverse project */
+	    if (P->ctx->last_errno )
 		lp.lam = lp.phi = HUGE_VAL;
-	else {
+	    else {
 		lp.lam += P->lam0; /* reduce from del lp.lam */
 		if (!P->over)
 			lp.lam = adjlon(lp.lam); /* adjust longitude to CM */
 		if (P->geoc && fabs(fabs(lp.phi)-HALFPI) > EPS)
 			lp.phi = atan(P->one_es * tan(lp.phi));
-	}
+	    }
+        }
+        else
+        {
+           lp.lam = lp.phi = HUGE_VAL;
+        }
 	return lp;
 }
diff --git a/src/pj_inv3d.c b/src/pj_inv3d.c
new file mode 100644
index 0000000..de35e77
--- /dev/null
+++ b/src/pj_inv3d.c
@@ -0,0 +1,45 @@
+/* general inverse projection */
+#define PJ_LIB__
+#include <projects.h>
+#include <errno.h>
+# define EPS 1.0e-12
+	LPZ /* inverse projection entry */
+pj_inv3d(XYZ xyz, PJ *P) {
+	LPZ lpz;
+
+	/* can't do as much preliminary checking as with forward */
+	if (xyz.x == HUGE_VAL || xyz.y == HUGE_VAL || xyz.z == HUGE_VAL ) {
+		lpz.lam = lpz.phi = lpz.z = HUGE_VAL;
+		pj_ctx_set_errno( P->ctx, -15);
+                return lpz;
+	}
+
+	errno = pj_errno = 0;
+        P->ctx->last_errno = 0;
+
+	xyz.x = (xyz.x * P->to_meter - P->x0) * P->ra; /* descale and de-offset */
+	xyz.y = (xyz.y * P->to_meter - P->y0) * P->ra;
+        //z is not scaled since that is handled by vto_meter before we get here
+        
+        //Check for NULL pointer
+        if (P->inv3d != NULL)
+        {
+	    lpz = (*P->inv3d)(xyz, P); /* inverse project */
+	    if (P->ctx->last_errno )
+		lpz.lam = lpz.phi = lpz.z = HUGE_VAL;
+	    else {
+		lpz.lam += P->lam0; /* reduce from del lp.lam */
+		if (!P->over)
+			lpz.lam = adjlon(lpz.lam); /* adjust longitude to CM */
+
+                //This maybe redundant and never user
+		if (P->geoc && fabs(fabs(lpz.phi)-HALFPI) > EPS)
+			lpz.phi = atan(P->one_es * tan(lpz.phi));
+	    }
+        }
+        else
+        {
+            lpz.lam = lpz.phi = lpz.z = HUGE_VAL;
+        }
+	return lpz;
+}
diff --git a/src/pj_latlong.c b/src/pj_latlong.c
index 1ade364..b7a771a 100644
--- a/src/pj_latlong.c
+++ b/src/pj_latlong.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_latlong.c 1504 2009-01-06 02:11:57Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Stub projection implementation for lat/long coordinates. We 
  *           don't actually change the coordinates, but we want proj=latlong
diff --git a/src/pj_list.h b/src/pj_list.h
index 194bcc6..20af2eb 100644
--- a/src/pj_list.h
+++ b/src/pj_list.h
@@ -111,6 +111,7 @@ PROJ_HEAD(qsc, "Quadrilateralized Spherical Cube")
 PROJ_HEAD(robin, "Robinson")
 PROJ_HEAD(rouss, "Roussilhe Stereographic")
 PROJ_HEAD(rpoly, "Rectangular Polyconic")
+PROJ_HEAD(sch, "Spherical Cross-track Height")
 PROJ_HEAD(sinu, "Sinusoidal (Sanson-Flamsteed)")
 PROJ_HEAD(somerc, "Swiss. Obl. Mercator")
 PROJ_HEAD(stere, "Stereographic")
@@ -142,3 +143,4 @@ PROJ_HEAD(weren, "Werenskiold I")
 PROJ_HEAD(wink1, "Winkel I")
 PROJ_HEAD(wink2, "Winkel II")
 PROJ_HEAD(wintri, "Winkel Tripel")
+
diff --git a/src/pj_log.c b/src/pj_log.c
index 630a3cf..54b83a0 100644
--- a/src/pj_log.c
+++ b/src/pj_log.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id$
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of pj_log() function.
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -31,8 +29,6 @@
 #include <string.h>
 #include <stdarg.h>
 
-PJ_CVSID("$Id$");
-
 /************************************************************************/
 /*                          pj_stderr_logger()                          */
 /************************************************************************/
@@ -40,6 +36,8 @@ PJ_CVSID("$Id$");
 void pj_stderr_logger( void *app_data, int level, const char *msg )
 
 {
+    (void) app_data;
+    (void) level;
     fprintf( stderr, "%s\n", msg );
 }
 
diff --git a/src/pj_mutex.c b/src/pj_mutex.c
index ee5a655..dc484c6 100644
--- a/src/pj_mutex.c
+++ b/src/pj_mutex.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Mutex (thread lock) functions.
  * Author:   Frank Warmerdam, warmerdam at pobox.com
@@ -30,9 +28,15 @@
 
 /* projects.h and windows.h conflict - avoid this! */
 
+#if defined(MUTEX_pthread) && !defined(_XOPEN_SOURCE)
+// For pthread_mutexattr_settype
+#define _XOPEN_SOURCE 500
+#endif
+
+
 #ifndef _WIN32
+#include "proj_config.h"
 #include <projects.h>
-PJ_CVSID("$Id: pj_transform.c 1504 2009-01-06 02:11:57Z warmerdam $");
 #else
 #include <proj_api.h>
 #endif
@@ -118,10 +122,10 @@ void pj_acquire_lock()
         pthread_mutex_lock( &pj_precreated_lock);
 
         pthread_mutexattr_init(&mutex_attr);
-#ifndef PTHREAD_MUTEX_RECURSIVE
-        pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);
-#else
+#ifdef HAVE_PTHREAD_MUTEX_RECURSIVE
         pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE);
+#else
+        pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE_NP);
 #endif
         pthread_mutex_init(&pj_core_lock, &mutex_attr);
         pj_core_lock_created = 1;
diff --git a/src/pj_open_lib.c b/src/pj_open_lib.c
index db4dcab..0a2e7fe 100644
--- a/src/pj_open_lib.c
+++ b/src/pj_open_lib.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_open_lib.c 2372 2013-06-26 21:44:00Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Implementation of pj_open_lib(), and pj_set_finder().  These
  *           provide a standard interface for opening projections support
@@ -36,8 +34,6 @@
 #include <string.h>
 #include <errno.h>
 
-PJ_CVSID("$Id: pj_open_lib.c 2372 2013-06-26 21:44:00Z warmerdam $");
-
 static const char *(*pj_finder)(const char *) = NULL;
 static int path_count = 0;
 static char **search_path = NULL;
diff --git a/src/pj_param.c b/src/pj_param.c
index 119006e..434d453 100644
--- a/src/pj_param.c
+++ b/src/pj_param.c
@@ -23,22 +23,22 @@ pj_mkparam(char *str) {
 /*      character in `opt' is a parameter type which can take the       */
 /*      values:                                                         */
 /*                                                                      */
-/*       `t' - test for presence, return TRUE/FALSE in PVALUE.i         */
-/*       `i' - integer value returned in PVALUE.i                       */
-/*       `d' - simple valued real input returned in PVALUE.f            */
+/*       `t' - test for presence, return TRUE/FALSE in PROJVALUE.i         */
+/*       `i' - integer value returned in PROJVALUE.i                       */
+/*       `d' - simple valued real input returned in PROJVALUE.f            */
 /*       `r' - degrees (DMS translation applied), returned as           */
-/*             radians in PVALUE.f                                      */
-/*       `s' - string returned in PVALUE.s                              */
-/*       `b' - test for t/T/f/F, return in PVALUE.i                     */
+/*             radians in PROJVALUE.f                                      */
+/*       `s' - string returned in PROJVALUE.s                              */
+/*       `b' - test for t/T/f/F, return in PROJVALUE.i                     */
 /*                                                                      */
 /************************************************************************/
 
-	PVALUE /* test for presence or get parameter value */
+	PROJVALUE /* test for presence or get parameter value */
 pj_param(projCtx ctx, paralist *pl, const char *opt) {
 
 	int type;
 	unsigned l;
-	PVALUE value;
+	PROJVALUE value;
 
 	if( ctx == NULL )
 		ctx = pj_get_default_ctx();
@@ -61,7 +61,7 @@ pj_param(projCtx ctx, paralist *pl, const char *opt) {
 			value.i = atoi(opt);
 			break;
 		case 'd':	/* simple real input */
-			value.f = atof(opt);
+			value.f = pj_atof(opt);
 			break;
 		case 'r':	/* degrees input */
 			value.f = dmstor_ctx(ctx, opt, 0);
diff --git a/src/pj_pr_list.c b/src/pj_pr_list.c
index e14b20d..95aab4a 100644
--- a/src/pj_pr_list.c
+++ b/src/pj_pr_list.c
@@ -58,7 +58,8 @@ char *pj_get_def( PJ *P, int options )
     paralist *t;
     int l;
     char *definition;
-    int  def_max = 10;
+    size_t def_max = 10;
+    (void) options;
 
     definition = (char *) pj_malloc(def_max);
     definition[0] = '\0';
diff --git a/src/pj_release.c b/src/pj_release.c
index c1d4f69..c3736b4 100644
--- a/src/pj_release.c
+++ b/src/pj_release.c
@@ -2,7 +2,7 @@
 
 #include <projects.h>
 
-char const pj_release[]="Rel. 4.9.0, 13 September 2014";
+char const pj_release[]="Rel. 4.9.2, 08 September 2015";
 
 const char *pj_get_release()
 
diff --git a/src/pj_strerrno.c b/src/pj_strerrno.c
index 9d23703..b46f143 100644
--- a/src/pj_strerrno.c
+++ b/src/pj_strerrno.c
@@ -71,7 +71,7 @@ pj_strerrno(int err)
     }
 #endif
     else if (err < 0) {
-        int adjusted_err = - err - 1;
+        size_t adjusted_err = - err - 1;
         if (adjusted_err < (sizeof(pj_err_list) / sizeof(char *)))
             return(pj_err_list[adjusted_err]);
         else
diff --git a/src/pj_strtod.c b/src/pj_strtod.c
new file mode 100644
index 0000000..9aac07e
--- /dev/null
+++ b/src/pj_strtod.c
@@ -0,0 +1,184 @@
+/******************************************************************************
+ *
+ * Derived from GDAL port/cpl_strtod.cpp
+ * Purpose:  Functions to convert ASCII string to floating point number.
+ * Author:   Andrey Kiselev, dron at ak4719.spb.edu.
+ *
+ ******************************************************************************
+ * Copyright (c) 2006, Andrey Kiselev
+ * Copyright (c) 2008-2012, Even Rouault <even dot rouault at mines-paris dot org>
+ *
+ * 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.
+ ****************************************************************************/
+
+#include "projects.h"
+
+/* Windows nmake build doesn't have a proj_config.h, but HAVE_LOCALECONV */
+/* is defined in the compilation line */
+#ifndef HAVE_LOCALECONV
+#include "proj_config.h"
+#endif
+
+#include <stdlib.h>
+#include <locale.h>
+#include <errno.h>
+
+#define PJ_STRTOD_WORK_BUFFER_SIZE 64
+
+/************************************************************************/
+/*                              pj_atof()                               */
+/************************************************************************/
+
+/**
+ * Converts ASCII string to floating point number.
+ *
+ * This function converts the initial portion of the string pointed to
+ * by nptr to double floating point representation. The behaviour is the
+ * same as
+ *
+ *   pj_strtod(nptr, (char **)NULL);
+ *
+ * This function does the same as standard atof(3), but does not take
+ * locale in account. That means, the decimal delimiter is always '.'
+ * (decimal point).
+ *
+ * @param nptr Pointer to string to convert.
+ *
+ * @return Converted value.
+ */
+double pj_atof( const char* nptr )
+{
+    return pj_strtod(nptr, NULL);
+}
+
+
+/************************************************************************/
+/*                     pj_replace_point_by_locale_point()               */
+/************************************************************************/
+
+static char* pj_replace_point_by_locale_point(const char* pszNumber, char point,
+                                              char* pszWorkBuffer)
+{
+#if !defined(HAVE_LOCALECONV) || defined(_WIN32_WCE)
+#warning "localeconv not available"
+    static char byPoint = 0;
+    if (byPoint == 0)
+    {
+        char szBuf[16];
+        sprintf(szBuf, "%.1f", 1.0);
+        byPoint = szBuf[1];
+    }
+    if (point != byPoint)
+    {
+        const char* pszPoint = strchr(pszNumber, point);
+        if (pszPoint)
+        {
+            char* pszNew;
+            if( strlen(pszNumber) < PJ_STRTOD_WORK_BUFFER_SIZE )
+            {
+                strcpy(pszWorkBuffer, pszNumber);
+                pszNew = pszWorkBuffer;
+            }
+            else
+                pszNew = strdup(pszNumber);
+            pszNew[pszPoint - pszNumber] = byPoint;
+            return pszNew;
+        }
+    }
+#else
+    struct lconv *poLconv = localeconv();
+    if ( poLconv
+         && poLconv->decimal_point
+         && poLconv->decimal_point[0] != '\0' )
+    {
+        char    byPoint = poLconv->decimal_point[0];
+
+        if (point != byPoint)
+        {
+            const char* pszLocalePoint = strchr(pszNumber, byPoint);
+            const char* pszPoint = strchr(pszNumber, point);
+            if (pszPoint || pszLocalePoint)
+            {
+                char* pszNew;
+                if( strlen(pszNumber) < PJ_STRTOD_WORK_BUFFER_SIZE )
+                {
+                    strcpy(pszWorkBuffer, pszNumber);
+                    pszNew = pszWorkBuffer;
+                }
+                else
+                    pszNew = strdup(pszNumber);
+                if( pszLocalePoint )
+                    pszNew[pszLocalePoint - pszNumber] = ' ';
+                if( pszPoint )
+                    pszNew[pszPoint - pszNumber] = byPoint;
+                return pszNew;
+            }
+        }
+    }
+#endif
+    return (char*) pszNumber;
+}
+
+/************************************************************************/
+/*                            pj_strtod()                               */
+/************************************************************************/
+
+/**
+ * Converts ASCII string to floating point number.
+ *
+ * This function converts the initial portion of the string pointed to
+ * by nptr to double floating point representation. This function does the
+ * same as standard strtod(3), but does not take locale in account and use
+ * decimal point.
+ *
+ * @param nptr Pointer to string to convert.
+ * @param endptr If is not NULL, a pointer to the character after the last
+ * character used in the conversion is stored in the location referenced
+ * by endptr.
+ * @param point Decimal delimiter.
+ *
+ * @return Converted value.
+ */
+double pj_strtod( const char *nptr, char **endptr )
+{
+/* -------------------------------------------------------------------- */
+/*  We are implementing a simple method here: copy the input string     */
+/*  into the temporary buffer, replace the specified decimal delimiter  */
+/*  with the one, taken from locale settings and use standard strtod()  */
+/*  on that buffer.                                                     */
+/* -------------------------------------------------------------------- */
+    double      dfValue;
+    int         nError;
+    char        szWorkBuffer[PJ_STRTOD_WORK_BUFFER_SIZE];
+
+    char*       pszNumber = pj_replace_point_by_locale_point(nptr, '.', szWorkBuffer);
+
+    dfValue = strtod( pszNumber, endptr );
+    nError = errno;
+
+    if ( endptr )
+        *endptr = (char *)nptr + (*endptr - pszNumber);
+
+    if (pszNumber != (char*) nptr && pszNumber != szWorkBuffer )
+        free( pszNumber );
+
+    errno = nError;
+    return dfValue;
+}
+
diff --git a/src/pj_transform.c b/src/pj_transform.c
index afd3db3..32f1495 100644
--- a/src/pj_transform.c
+++ b/src/pj_transform.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_transform.c 2000 2011-05-10 17:06:33Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Perform overall coordinate system to coordinate system 
  *           transformations (pj_transform() function) including reprojection
@@ -34,8 +32,6 @@
 #include <math.h>
 #include "geocent.h"
 
-PJ_CVSID("$Id: pj_transform.c 2000 2011-05-10 17:06:33Z warmerdam $");
-
 static int pj_adjust_axis( projCtx ctx, const char *axis, int denormalize_flag,
                            long point_count, int point_offset, 
                            double *x, double *y, double *z );
@@ -156,7 +152,9 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset,
 /* -------------------------------------------------------------------- */
     else if( !srcdefn->is_latlong )
     {
-        if( srcdefn->inv == NULL )
+
+        //Check first if projection is invertible.
+        if( (srcdefn->inv3d == NULL) && (srcdefn->inv == NULL))
         {
             pj_ctx_set_errno( pj_get_ctx(srcdefn), -17 );
             pj_log( pj_get_ctx(srcdefn), PJ_LOG_ERROR, 
@@ -164,35 +162,85 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset,
             return -17;
         }
 
-        for( i = 0; i < point_count; i++ )
+        //If invertible - First try inv3d if defined
+        if (srcdefn->inv3d != NULL)
         {
-            XY         projected_loc;
-            LP	       geodetic_loc;
+            //Three dimensions must be defined
+            if ( z == NULL)
+            {
+                pj_ctx_set_errno( pj_get_ctx(srcdefn), PJD_ERR_GEOCENTRIC);
+                return PJD_ERR_GEOCENTRIC;
+            }
 
-            projected_loc.u = x[point_offset*i];
-            projected_loc.v = y[point_offset*i];
+            for (i=0; i < point_count; i++)
+            {
+                XYZ projected_loc;
+                XYZ geodetic_loc;
 
-            if( projected_loc.u == HUGE_VAL )
-                continue;
+                projected_loc.u = x[point_offset*i];
+                projected_loc.v = y[point_offset*i];
+                projected_loc.w = z[point_offset*i];
 
-            geodetic_loc = pj_inv( projected_loc, srcdefn );
-            if( srcdefn->ctx->last_errno != 0 )
-            {
-                if( (srcdefn->ctx->last_errno != 33 /*EDOM*/ 
-                     && srcdefn->ctx->last_errno != 34 /*ERANGE*/ )
-                    && (srcdefn->ctx->last_errno > 0 
-                        || srcdefn->ctx->last_errno < -44 || point_count == 1
-                        || transient_error[-srcdefn->ctx->last_errno] == 0 ) )
-                    return srcdefn->ctx->last_errno;
-                else
+                if (projected_loc.u == HUGE_VAL)
+                    continue;
+
+                geodetic_loc = pj_inv3d(projected_loc, srcdefn);
+                if( srcdefn->ctx->last_errno != 0 )
                 {
-                    geodetic_loc.u = HUGE_VAL;
-                    geodetic_loc.v = HUGE_VAL;
+                    if( (srcdefn->ctx->last_errno != 33 /*EDOM*/ 
+                         && srcdefn->ctx->last_errno != 34 /*ERANGE*/ )
+                        && (srcdefn->ctx->last_errno > 0 
+                            || srcdefn->ctx->last_errno < -44 || point_count == 1
+                            || transient_error[-srcdefn->ctx->last_errno] == 0 ) )
+                        return srcdefn->ctx->last_errno;
+                    else
+                    {
+                        geodetic_loc.u = HUGE_VAL;
+                        geodetic_loc.v = HUGE_VAL;
+                        geodetic_loc.w = HUGE_VAL;
+                    }
                 }
+
+                x[point_offset*i] = geodetic_loc.u;
+                y[point_offset*i] = geodetic_loc.v;
+                z[point_offset*i] = geodetic_loc.w;
+
             }
 
-            x[point_offset*i] = geodetic_loc.u;
-            y[point_offset*i] = geodetic_loc.v;
+        }
+        else
+        {
+            //Fallback to the original PROJ.4 API 2d inversion- inv 
+            for( i = 0; i < point_count; i++ )
+            {
+                XY         projected_loc;
+                LP	       geodetic_loc;
+
+                projected_loc.u = x[point_offset*i];
+                projected_loc.v = y[point_offset*i];
+
+                if( projected_loc.u == HUGE_VAL )
+                    continue;
+
+                geodetic_loc = pj_inv( projected_loc, srcdefn );
+                if( srcdefn->ctx->last_errno != 0 )
+                {
+                    if( (srcdefn->ctx->last_errno != 33 /*EDOM*/ 
+                         && srcdefn->ctx->last_errno != 34 /*ERANGE*/ )
+                        && (srcdefn->ctx->last_errno > 0 
+                            || srcdefn->ctx->last_errno < -44 || point_count == 1
+                            || transient_error[-srcdefn->ctx->last_errno] == 0 ) )
+                        return srcdefn->ctx->last_errno;
+                    else
+                    {
+                        geodetic_loc.u = HUGE_VAL;
+                        geodetic_loc.v = HUGE_VAL;
+                    }
+                }
+
+                x[point_offset*i] = geodetic_loc.u;
+                y[point_offset*i] = geodetic_loc.v;
+            }
         }
     }
 /* -------------------------------------------------------------------- */
@@ -212,7 +260,7 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset,
 /*      Do we need to translate from geoid to ellipsoidal vertical      */
 /*      datum?                                                          */
 /* -------------------------------------------------------------------- */
-    if( srcdefn->has_geoid_vgrids )
+    if( srcdefn->has_geoid_vgrids && z != NULL )
     {
         if( pj_apply_vgridshift( srcdefn, "sgeoidgrids", 
                                  &(srcdefn->vgridlist_geoid), 
@@ -237,7 +285,7 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset,
 /*      Do we need to translate from geoid to ellipsoidal vertical      */
 /*      datum?                                                          */
 /* -------------------------------------------------------------------- */
-    if( dstdefn->has_geoid_vgrids )
+    if( dstdefn->has_geoid_vgrids && z != NULL )
     {
         if( pj_apply_vgridshift( dstdefn, "sgeoidgrids", 
                                  &(dstdefn->vgridlist_geoid), 
@@ -293,35 +341,76 @@ int pj_transform( PJ *srcdefn, PJ *dstdefn, long point_count, int point_offset,
 /* -------------------------------------------------------------------- */
     else if( !dstdefn->is_latlong )
     {
-        for( i = 0; i < point_count; i++ )
+
+        if( dstdefn->fwd3d != NULL)
         {
-            XY         projected_loc;
-            LP	       geodetic_loc;
+            for( i = 0; i < point_count; i++ )
+            {
+                XYZ projected_loc;
+                LPZ geodetic_loc;
+                
+                geodetic_loc.u = x[point_offset*i];
+                geodetic_loc.v = y[point_offset*i];
+                geodetic_loc.w = z[point_offset*i];
 
-            geodetic_loc.u = x[point_offset*i];
-            geodetic_loc.v = y[point_offset*i];
+                if (geodetic_loc.u == HUGE_VAL)
+                    continue;
 
-            if( geodetic_loc.u == HUGE_VAL )
-                continue;
+                projected_loc = pj_fwd3d( geodetic_loc, dstdefn);
+                if( dstdefn->ctx->last_errno != 0 )
+                {
+                    if( (dstdefn->ctx->last_errno != 33 /*EDOM*/ 
+                         && dstdefn->ctx->last_errno != 34 /*ERANGE*/ )
+                        && (dstdefn->ctx->last_errno > 0 
+                            || dstdefn->ctx->last_errno < -44 || point_count == 1
+                            || transient_error[-dstdefn->ctx->last_errno] == 0 ) )
+                        return dstdefn->ctx->last_errno;
+                    else
+                    {
+                        projected_loc.u = HUGE_VAL;
+                        projected_loc.v = HUGE_VAL;
+                        projected_loc.w = HUGE_VAL;
+                    }
+                }   
+
+                x[point_offset*i] = projected_loc.u;
+                y[point_offset*i] = projected_loc.v;
+                z[point_offset*i] = projected_loc.w;
+            }
 
-            projected_loc = pj_fwd( geodetic_loc, dstdefn );
-            if( dstdefn->ctx->last_errno != 0 )
+        }
+        else
+        {
+            for( i = 0; i < point_count; i++ )
             {
-                if( (dstdefn->ctx->last_errno != 33 /*EDOM*/ 
-                     && dstdefn->ctx->last_errno != 34 /*ERANGE*/ )
-                    && (dstdefn->ctx->last_errno > 0 
-                        || dstdefn->ctx->last_errno < -44 || point_count == 1
-                        || transient_error[-dstdefn->ctx->last_errno] == 0 ) )
-                    return dstdefn->ctx->last_errno;
-                else
+                XY         projected_loc;
+                LP	       geodetic_loc;
+
+                geodetic_loc.u = x[point_offset*i];
+                geodetic_loc.v = y[point_offset*i];
+
+                if( geodetic_loc.u == HUGE_VAL )
+                    continue;
+
+                projected_loc = pj_fwd( geodetic_loc, dstdefn );
+                if( dstdefn->ctx->last_errno != 0 )
                 {
-                    projected_loc.u = HUGE_VAL;
-                    projected_loc.v = HUGE_VAL;
-                }
+                    if( (dstdefn->ctx->last_errno != 33 /*EDOM*/ 
+                         && dstdefn->ctx->last_errno != 34 /*ERANGE*/ )
+                        && (dstdefn->ctx->last_errno > 0 
+                            || dstdefn->ctx->last_errno < -44 || point_count == 1
+                            || transient_error[-dstdefn->ctx->last_errno] == 0 ) )
+                        return dstdefn->ctx->last_errno;
+                    else
+                    {
+                        projected_loc.u = HUGE_VAL;
+                        projected_loc.v = HUGE_VAL;
+                    }
+                }   
+
+                x[point_offset*i] = projected_loc.u;
+                y[point_offset*i] = projected_loc.v;
             }
-
-            x[point_offset*i] = projected_loc.u;
-            y[point_offset*i] = projected_loc.v;
         }
     }
 
diff --git a/src/pj_units.c b/src/pj_units.c
index bb39f91..c6b5ae3 100644
--- a/src/pj_units.c
+++ b/src/pj_units.c
@@ -6,28 +6,28 @@
 ** numerator/denomenator values (e.g. 1/1000) */
 C_NAMESPACE_VAR struct PJ_UNITS
 pj_units[] = {
-	"km",	"1000.",	"Kilometer",
-	"m",	"1.",		"Meter",
-	"dm",	"1/10",		"Decimeter",
-	"cm",	"1/100",	"Centimeter",
-	"mm",	"1/1000",	"Millimeter",
-	"kmi",	"1852.0",	"International Nautical Mile",
-	"in",	"0.0254",	"International Inch",
-	"ft",	"0.3048",	"International Foot",
-	"yd",	"0.9144",	"International Yard",
-	"mi",	"1609.344",	"International Statute Mile",
-	"fath",	"1.8288",	"International Fathom",
-	"ch",	"20.1168",	"International Chain",
-	"link",	"0.201168",	"International Link",
-	"us-in",	"1./39.37",	"U.S. Surveyor's Inch",
-	"us-ft",	"0.304800609601219",	"U.S. Surveyor's Foot",
-	"us-yd",	"0.914401828803658",	"U.S. Surveyor's Yard",
-	"us-ch",	"20.11684023368047",	"U.S. Surveyor's Chain",
-	"us-mi",	"1609.347218694437",	"U.S. Surveyor's Statute Mile",
-	"ind-yd",	"0.91439523",	"Indian Yard",
-	"ind-ft",	"0.30479841",	"Indian Foot",
-	"ind-ch",	"20.11669506",	"Indian Chain",
-(char *)0, (char *)0, (char *)0
+	{"km",		"1000.",		"Kilometer"},
+	{"m",		"1.",			"Meter"},
+	{"dm",		"1/10",			"Decimeter"},
+	{"cm",		"1/100",		"Centimeter"},
+	{"mm",		"1/1000",		"Millimeter"},
+	{"kmi",		"1852.0",		"International Nautical Mile"},
+	{"in",		"0.0254",		"International Inch"},
+	{"ft",		"0.3048",		"International Foot"},
+	{"yd",		"0.9144",		"International Yard"},
+	{"mi",		"1609.344",		"International Statute Mile"},
+	{"fath",	"1.8288",		"International Fathom"},
+	{"ch",		"20.1168",		"International Chain"},
+	{"link",	"0.201168",		"International Link"},
+	{"us-in",	"1./39.37",		"U.S. Surveyor's Inch"},
+	{"us-ft",	"0.304800609601219",	"U.S. Surveyor's Foot"},
+	{"us-yd",	"0.914401828803658",	"U.S. Surveyor's Yard"},
+	{"us-ch",	"20.11684023368047",	"U.S. Surveyor's Chain"},
+	{"us-mi",	"1609.347218694437",	"U.S. Surveyor's Statute Mile"},
+	{"ind-yd",	"0.91439523",		"Indian Yard"},
+	{"ind-ft",	"0.30479841",		"Indian Foot"},
+	{"ind-ch",	"20.11669506",		"Indian Chain"},
+	{NULL,		NULL,			NULL}
 };
 
 struct PJ_UNITS *pj_get_units_ref()
diff --git a/src/pj_utils.c b/src/pj_utils.c
index c485de9..f11081f 100644
--- a/src/pj_utils.c
+++ b/src/pj_utils.c
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: pj_utils.c 2160 2012-02-15 23:51:45Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Some utility functions we don't want to bother putting in
  *           their own source files.
@@ -103,8 +101,15 @@ PJ *pj_latlong_from_proj( PJ *pj_in )
             sprintf( defn+strlen(defn), " +f=%s", 
                      pj_param(pj_in->ctx,pj_in->params,"sf").s );
         else
-            sprintf( defn+strlen(defn), " +es=%.16g", 
-                     pj_in->es );
+        {
+            char* ptr = defn+strlen(defn);
+            sprintf( ptr, " +es=%.16g",  pj_in->es );
+            for(; *ptr; ptr++)
+            {
+                if( *ptr == ',' )
+                    *ptr = '.';
+            }
+        }
     }
     else
     {
diff --git a/src/pj_zpoly1.c b/src/pj_zpoly1.c
index fa163de..3d6418b 100644
--- a/src/pj_zpoly1.c
+++ b/src/pj_zpoly1.c
@@ -26,10 +26,10 @@ pj_zpolyd1(COMPLEX z, COMPLEX *C, int n, COMPLEX *der) {
 	int first = 1;
 
 	a = *(C += n);
+	b = a;
 	while (n-- > 0) {
 		if (first) {
 			first = 0;
-			b = a;
 		} else {
 			b.r = a.r + z.r * (t = b.r) - z.i * b.i;
 			b.i = a.i + z.r * b.i + z.i * t;
diff --git a/src/proj_api.h b/src/proj_api.h
index b892113..e381815 100644
--- a/src/proj_api.h
+++ b/src/proj_api.h
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: proj_api.h 2372 2013-06-26 21:44:00Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Public (application) include file for PROJ.4 API, and constants.
  * Author:   Frank Warmerdam, <warmerdam at pobox.com>
@@ -40,27 +38,36 @@ extern "C" {
 #endif
 
 /* Try to update this every version! */
-#define PJ_VERSION 490
+#define PJ_VERSION 492
+
+/* pj_init() and similar functions can be used with a non-C locale */
+/* Can be detected too at runtime if the symbol pj_atof exists */
+#define PJ_LOCALE_SAFE 1
 
 extern char const pj_release[]; /* global release id string */
 
-#define RAD_TO_DEG	57.29577951308232
-#define DEG_TO_RAD	.0174532925199432958
+#define RAD_TO_DEG	57.295779513082321
+#define DEG_TO_RAD	.017453292519943296
 
 
 extern int pj_errno;	/* global error return code */
 
 #if !defined(PROJECTS_H)
     typedef struct { double u, v; } projUV;
+    typedef struct { double u, v, w; } projUVW;
     typedef void *projPJ;
     #define projXY projUV
     #define projLP projUV
+    #define projXYZ projUVW
+    #define projLPZ projUVW
     typedef void *projCtx;
 #else
     typedef PJ *projPJ;
     typedef projCtx_t *projCtx;
 #   define projXY	XY
 #   define projLP       LP
+#   define projXYZ      XYZ
+#   define projLPZ      LPZ
 #endif
 
 /* file reading api, like stdio */
@@ -78,6 +85,9 @@ typedef struct projFileAPI_t {
 projXY pj_fwd(projLP, projPJ);
 projLP pj_inv(projXY, projPJ);
 
+projXYZ pj_fwd3d(projLPZ, projPJ);
+projLPZ pj_inv3d(projXYZ, projPJ);
+
 int pj_transform( projPJ src, projPJ dst, long point_count, int point_offset,
                   double *x, double *y, double *z );
 int pj_datum_transform( projPJ src, projPJ dst, long point_count, int point_offset,
@@ -89,7 +99,7 @@ int pj_geodetic_to_geocentric( double a, double es,
                                long point_count, int point_offset,
                                double *x, double *y, double *z );
 int pj_compare_datums( projPJ srcdefn, projPJ dstdefn );
-int pj_apply_gridshift( projCtx, const char *, int, 
+int pj_apply_gridshift( projCtx, const char *, int,
                         long point_count, int point_offset,
                         double *x, double *y, double *z );
 void pj_deallocate_grids(void);
diff --git a/src/proj_config.h b/src/proj_config.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/proj_etmerc.c b/src/proj_etmerc.c
index 1097eb3..a5351f5 100644
--- a/src/proj_etmerc.c
+++ b/src/proj_etmerc.c
@@ -52,6 +52,8 @@
 
 PROJ_HEAD(etmerc, "Extended Transverse Mercator")
     "\n\tCyl, Sph\n\tlat_ts=(0)\nlat_0=(0)";
+PROJ_HEAD(utm, "Universal Transverse Mercator (UTM)")
+	"\n\tCyl, Sph\n\tzone= south";
 
 #define PROJ_ETMERC_ORDER 6
 
@@ -211,7 +213,8 @@ INVERSE(e_inverse); /* ellipsoid */
 
 FREEUP; if (P) free(P); }
 
-ENTRY0(etmerc)
+	static PJ *
+setup(PJ *P) { /* general initialization */
     double f, n, np, Z;
 
     if (P->es <= 0) E_ERROR(-34);
@@ -286,4 +289,30 @@ ENTRY0(etmerc)
     P->Zb  = - P->Qn*(Z + clens(P->gtu, PROJ_ETMERC_ORDER, 2*Z));
     P->inv = e_inverse;
     P->fwd = e_forward;
-ENDENTRY(P)
+	return P;
+}
+
+ENTRY0(etmerc)
+ENDENTRY(setup(P))
+
+/* utm uses etmerc for the underlying projection */
+ENTRY0(utm)
+	int zone;
+
+	if (!P->es) E_ERROR(-34);
+	P->y0 = pj_param(P->ctx, P->params, "bsouth").i ? 10000000. : 0.;
+	P->x0 = 500000.;
+	if (pj_param(P->ctx, P->params, "tzone").i) /* zone input ? */
+		if ((zone = pj_param(P->ctx, P->params, "izone").i) > 0 && zone <= 60)
+			--zone;
+		else
+			E_ERROR(-35)
+	else /* nearest central meridian input */
+		if ((zone = floor((adjlon(P->lam0) + PI) * 30. / PI)) < 0)
+			zone = 0;
+		else if (zone >= 60)
+			zone = 59;
+	P->lam0 = (zone + .5) * PI / 30. - PI;
+	P->k0 = 0.9996;
+	P->phi0 = 0.;
+ENDENTRY(setup(P))
diff --git a/src/proj_mdist.c b/src/proj_mdist.c
index 465ebeb..d7e4344 100644
--- a/src/proj_mdist.c
+++ b/src/proj_mdist.c
@@ -3,8 +3,6 @@
 **
 ** Copyright (c) 2003, 2006   Gerald I. Evenden
 */
-static const char
-LIBPROJ_ID[] = "$Id: proj_mdist.c 1856 2010-06-11 03:26:04Z warmerdam $";
 /*
 ** Permission is hereby granted, free of charge, to any person obtaining
 ** a copy of this software and associated documentation files (the
diff --git a/src/proj_rouss.c b/src/proj_rouss.c
index f2c49e2..f1c2f5a 100644
--- a/src/proj_rouss.c
+++ b/src/proj_rouss.c
@@ -3,8 +3,6 @@
 **
 ** Copyright (c) 2003, 2006   Gerald I. Evenden
 */
-static const char
-LIBPROJ_ID[] = "$Id: proj_rouss.c 1856 2010-06-11 03:26:04Z warmerdam $";
 /*
 ** Permission is hereby granted, free of charge, to any person obtaining
 ** a copy of this software and associated documentation files (the
diff --git a/src/projects.h b/src/projects.h
index b35e89e..0b1d5b3 100644
--- a/src/projects.h
+++ b/src/projects.h
@@ -1,6 +1,4 @@
 /******************************************************************************
- * $Id: projects.h 2356 2013-06-25 01:02:23Z warmerdam $
- *
  * Project:  PROJ.4
  * Purpose:  Primary (private) include file for PROJ.4 library.
  * Author:   Gerald Evenden
@@ -149,16 +147,21 @@ typedef struct {
 
 typedef struct { double u, v; } projUV;
 typedef struct { double r, i; }	COMPLEX;
+typedef struct { double u, v, w; } projUVW;
 
 #ifndef PJ_LIB__
 #define XY projUV
 #define LP projUV
+#define XYZ projUVW
+#define LPZ projUVW
 #else
 typedef struct { double x, y; }     XY;
 typedef struct { double lam, phi; } LP;
+typedef struct { double x, y, z; } XYZ;
+typedef struct { double lam, phi, z; } LPZ;
 #endif
 
-typedef union { double  f; int  i; char *s; } PVALUE;
+typedef union { double  f; int  i; char *s; } PROJVALUE;
 struct PJconsts;
     
 struct PJ_LIST {
@@ -227,6 +230,8 @@ typedef struct PJconsts {
     projCtx_t *ctx;
 	XY  (*fwd)(LP, struct PJconsts *);
 	LP  (*inv)(XY, struct PJconsts *);
+        XYZ (*fwd3d)(LPZ, struct PJconsts *);
+        LPZ (*inv3d)(XYZ, struct PJconsts *); 
 	void (*spc)(LP, struct PJconsts *, struct FACTORS *);
 	void (*pfree)(struct PJconsts *);
 	const char *descr;
@@ -318,7 +323,7 @@ extern struct PJ_PRIME_MERIDIANS pj_prime_meridians[];
 #endif
 
 #ifdef PJ_LIB__
-    /* repeatative projection code */
+    /* repetitive projection code */
 #define PROJ_HEAD(id, name) static const char des_##id [] = name
 #define ENTRYA(name) \
         C_NAMESPACE_VAR const char * const pj_s_##name = des_##name; \
@@ -326,6 +331,7 @@ extern struct PJ_PRIME_MERIDIANS pj_prime_meridians[];
 	if( (P = (PJ*) pj_malloc(sizeof(PJ))) != NULL) { \
         memset( P, 0, sizeof(PJ) ); \
 	P->pfree = freeup; P->fwd = 0; P->inv = 0; \
+        P->fwd3d = 0; P->inv3d = 0; \
 	P->spc = 0; P->descr = des_##name;
 #define ENTRYX } return P; } else {
 #define ENTRY0(name) ENTRYA(name) ENTRYX
@@ -335,9 +341,13 @@ extern struct PJ_PRIME_MERIDIANS pj_prime_meridians[];
 #define E_ERROR(err) { pj_ctx_set_errno( P->ctx, err); freeup(P); return(0); }
 #define E_ERROR_0 { freeup(P); return(0); }
 #define F_ERROR { pj_ctx_set_errno( P->ctx, -20); return(xy); }
+#define F3_ERROR { pj_ctx_set_errno( P->ctx, -20); return(xyz); }
 #define I_ERROR { pj_ctx_set_errno( P->ctx, -20); return(lp); }
+#define I3_ERROR { pj_ctx_set_errno( P->ctx, -20); return(lpz); }
 #define FORWARD(name) static XY name(LP lp, PJ *P) { XY xy = {0.0,0.0}
 #define INVERSE(name) static LP name(XY xy, PJ *P) { LP lp = {0.0,0.0}
+#define FORWARD3D(name) static XYZ name(LPZ lpz, PJ *P) {XYZ xyz = {0.0, 0.0, 0.0}
+#define INVERSE3D(name) static LPZ name(XYZ xyz, PJ *P) {LPZ lpz = {0.0, 0.0, 0.0}
 #define FREEUP static void freeup(PJ *P) {
 #define SPECIAL(name) static void name(LP lp, PJ *P, struct FACTORS *fac)
 #endif
@@ -397,7 +407,7 @@ void set_rtodms(int, int);
 char *rtodms(char *, double, int, int);
 double adjlon(double);
 double aacos(projCtx,double), aasin(projCtx,double), asqrt(double), aatan2(double, double);
-PVALUE pj_param(projCtx ctx, paralist *, const char *);
+PROJVALUE pj_param(projCtx ctx, paralist *, const char *);
 paralist *pj_mkparam(char *);
 int pj_ell_set(projCtx ctx, paralist *, double *, double *);
 int pj_datum_set(projCtx,paralist *, PJ *);
@@ -511,17 +521,9 @@ struct PJ_DATUMS *pj_get_datums_ref( void );
 struct PJ_UNITS *pj_get_units_ref( void );
 struct PJ_LIST  *pj_get_list_ref( void );
 struct PJ_PRIME_MERIDIANS  *pj_get_prime_meridians_ref( void );
- 
-#ifndef DISABLE_CVSID
-#  if defined(__GNUC__) && __GNUC__ >= 4
-#    define PJ_CVSID(string)     static char pj_cvsid[] __attribute__((used)) = string;
-#  else
-#    define PJ_CVSID(string)     static char pj_cvsid[] = string; \
-static char *cvsid_aw() { return( cvsid_aw() ? ((char *) NULL) : pj_cvsid ); }
-#  endif
-#else
-#  define PJ_CVSID(string)
-#endif
+
+double pj_atof( const char* nptr );
+double pj_strtod( const char *nptr, char **endptr );
 
 #ifdef __cplusplus
 }
diff --git a/src/rtodms.c b/src/rtodms.c
index abf6bc1..fa7801c 100644
--- a/src/rtodms.c
+++ b/src/rtodms.c
@@ -10,7 +10,7 @@
 	static double
 RES = 1000.,
 RES60 = 60000.,
-CONV = 206264806.24709635515796003417;
+CONV = 206264806.24709635516;
 	static char
 format[50] = "%dd%d'%.3f\"%c";
 	static int
@@ -57,13 +57,15 @@ rtodms(char *s, double r, int pos, int neg) {
 		(void)sprintf(ss,format,deg,min,sec,sign);
 	else if (sec) {
 		char *p, *q;
+		/* double prime + pos/neg suffix (if included) + NUL */
+		size_t suffix_len = sign ? 3 : 2;
 
 		(void)sprintf(ss,format,deg,min,sec,sign);
-		for (q = p = ss + strlen(ss) - (sign ? 3 : 2); *p == '0'; --p) ;
+		for (q = p = ss + strlen(ss) - suffix_len; *p == '0'; --p) ;
 		if (*p != '.')
 			++p;
 		if (++q != p)
-			(void)strcpy(p, q);
+			(void)memmove(p, q, suffix_len);
 	} else if (min)
 		(void)sprintf(ss,"%dd%d'%c",deg,min,sign);
 	else
diff --git a/unittest/test.py b/unittest/test.py
index 762b483..6e0d179 100644
--- a/unittest/test.py
+++ b/unittest/test.py
@@ -1,6 +1,6 @@
 """Rewrite part of test.py in pyproj in the form of unittests."""
 import unittest
-from pyproj import Proj
+from pyproj import Geod, Proj, transform
 
 
 class BasicTest(unittest.TestCase):
@@ -47,6 +47,30 @@ class BasicTest(unittest.TestCase):
       self.assertAlmostEqual(point_geog[0], point_geog2[0])
       self.assertAlmostEqual(point_geog[1], point_geog2[1])
 
+class TypeError_Transform_Issue8_Test(unittest.TestCase):
+    # Test for "Segmentation fault on pyproj.transform #8"
+    # https://github.com/jswhit/pyproj/issues/8
+
+    def setUp(self):
+       self.p = Proj(init='epsg:4269')
+    
+    def test_tranform_none_1st_parmeter(self):
+    # test should raise Type error if projections are not of Proj classes
+    # version 1.9.4 produced AttributeError, now should raise TypeError
+       with self.assertRaises(TypeError):
+          transform(None, self.p, -74, 39)
+
+    def test_tranform_none_2nd_parmeter(self):
+    # test should raise Type error if projections are not of Proj classes
+    # version 1.9.4 has a Segmentation Fault, now should raise TypeError
+       with self.assertRaises(TypeError):
+          transform(self.p, None, -74, 39)
+
+class Geod_NoDefs_Issue22_Test(unittest.TestCase):
+   # Test for Issue #22, Geod with "+no_defs" in initstring 
+   # Before PR #23 merged 2015-10-07, having +no_defs in the initstring would result in a ValueError
+   def test_geod_nodefs(self):
+       Geod("+a=6378137 +b=6378137 +no_defs")
 
 if __name__ == '__main__':
   unittest.main()

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



More information about the Pkg-grass-devel mailing list