[qgis] 02/03: Add patches from upstream release-2_8 branch.

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Wed Mar 11 19:24:04 UTC 2015


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

sebastic pushed a commit to branch master
in repository qgis.

commit 75b03d83b313de1636a892c46da05865ec0e9e5a
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Wed Mar 11 18:50:16 2015 +0100

    Add patches from upstream release-2_8 branch.
---
 debian/changelog                                   |    1 +
 .../0001-Add-some-GDAL-provider-unit-tests.patch   |  172 ++
 ...ct-data-type-for-GDAL-layers-with-gain-of.patch |   28 +
 .../0001-Followup-5d15a07-also-fix-edit-role.patch |   23 +
 ...14ecc-also-fix-calculation-of-srcDataType.patch |   24 +
 .../0001-Server-fix-bug-with-multiple-joins.patch  |   24 +
 ...ttribute-table-ShowVisible-behaviour-mode.patch |   52 +
 ...-editing-of-scales-in-rule-based-renderer.patch |   25 +
 .../patches/0001-german-translation-update.patch   |  549 +++++
 ...ovider-also-cast-field-expressions-to-tex.patch |   47 +
 .../0001-processing-TauDEM-provider-overhaul.patch | 2210 ++++++++++++++++++++
 ...fix-handling-of-Check-for-edge-contaminat.patch |  119 ++
 ...es-of-swedish-translators-as-requested-by.patch |   23 +
 debian/patches/series                              |   12 +
 14 files changed, 3309 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index d550e64..520bff4 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -2,6 +2,7 @@ qgis (2.8.1+dfsg1-1~exp3) UNRELEASED; urgency=medium
 
   * Update symbols for armel, armhf, i386, kfreebsd-amd64, kfreebsd-i386,
     mips, mipsel, powerpc, ppc64el & s390x.
+  * Add patches from upstream release-2_8 branch.
 
  -- Bas Couwenberg <sebastic at debian.org>  Wed, 11 Mar 2015 18:32:07 +0100
 
diff --git a/debian/patches/0001-Add-some-GDAL-provider-unit-tests.patch b/debian/patches/0001-Add-some-GDAL-provider-unit-tests.patch
new file mode 100644
index 0000000..90ea6e3
--- /dev/null
+++ b/debian/patches/0001-Add-some-GDAL-provider-unit-tests.patch
@@ -0,0 +1,172 @@
+From 6c7eb5b35c6d3c4331832be3811a186fa53d18ad Mon Sep 17 00:00:00 2001
+From: Nyall Dawson <nyall.dawson at gmail.com>
+Date: Tue, 10 Mar 2015 22:53:23 +1100
+Subject: Add some GDAL provider unit tests...
+Origin: https://github.com/qgis/QGIS/commit/6c7eb5b35c6d3c4331832be3811a186fa53d18ad
+
+(...doing penance for my 2.8 sins)
+---
+ tests/src/providers/CMakeLists.txt               |    1 +
+ tests/src/providers/testqgsgdalprovider.cpp      |  107 ++++++++++++++++++++++
+ tests/testdata/int_raster_with_scale.tif         |  Bin 0 -> 1022 bytes
+ tests/testdata/int_raster_with_scale.tif.aux.xml |   30 ++++++
+ tests/testdata/requires_warped_vrt.tif           |  Bin 0 -> 978 bytes
+ 5 files changed, 138 insertions(+)
+ create mode 100644 tests/src/providers/testqgsgdalprovider.cpp
+ create mode 100644 tests/testdata/int_raster_with_scale.tif
+ create mode 100644 tests/testdata/int_raster_with_scale.tif.aux.xml
+ create mode 100644 tests/testdata/requires_warped_vrt.tif
+
+--- a/tests/src/providers/CMakeLists.txt
++++ b/tests/src/providers/CMakeLists.txt
+@@ -74,6 +74,7 @@ ENDMACRO (ADD_QGIS_TEST)
+ # Tests:
+ 
+ ADD_QGIS_TEST(wcsprovidertest testqgswcsprovider.cpp)
++ADD_QGIS_TEST(gdalprovidertest testqgsgdalprovider.cpp)
+ 
+ #############################################################
+ # WCS public servers test:
+--- /dev/null
++++ b/tests/src/providers/testqgsgdalprovider.cpp
+@@ -0,0 +1,107 @@
++/***************************************************************************
++     testqgsgdalprovider.cpp
++     --------------------------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Nyall Dawson
++    Email                : nyall.dawson at gmail.com
++ ***************************************************************************
++ *                                                                         *
++ *   This program is free software; you can redistribute it and/or modify  *
++ *   it under the terms of the GNU General Public License as published by  *
++ *   the Free Software Foundation; either version 2 of the License, or     *
++ *   (at your option) any later version.                                   *
++ *                                                                         *
++ ***************************************************************************/
++#include <QtTest/QtTest>
++#include <QObject>
++#include <QString>
++#include <QStringList>
++#include <QObject>
++#include <QApplication>
++#include <QFileInfo>
++#include <QDir>
++
++//qgis includes...
++#include <qgis.h>
++#include <qgsapplication.h>
++#include <qgsproviderregistry.h>
++#include <qgsrasterdataprovider.h>
++#include <qgsrectangle.h>
++
++/** \ingroup UnitTests
++ * This is a unit test for the gdal provider
++ */
++class TestQgsGdalProvider : public QObject
++{
++    Q_OBJECT
++
++  private slots:
++    void initTestCase();// will be called before the first testfunction is executed.
++    void cleanupTestCase();// will be called after the last testfunction was executed.
++    void init() {}// will be called before each testfunction is executed.
++    void cleanup() {}// will be called after every testfunction.
++
++    void scaleDataType(); //test resultant data types for int raster with float scale (#11573)
++    void warpedVrt(); //test loading raster which requires a warped vrt
++
++  private:
++    QString mTestDataDir;
++    QString mReport;
++};
++
++//runs before all tests
++void TestQgsGdalProvider::initTestCase()
++{
++  // init QGIS's paths - true means that all path will be inited from prefix
++  QgsApplication::init();
++  QgsApplication::initQgis();
++
++  mTestDataDir = QString( TEST_DATA_DIR ) + QDir::separator(); //defined in CmakeLists.txt
++  mReport = "<h1>GDAL Provider Tests</h1>\n";
++}
++
++//runs after all tests
++void TestQgsGdalProvider::cleanupTestCase()
++{
++  QgsApplication::exitQgis();
++  QString myReportFile = QDir::tempPath() + QDir::separator() + "qgistest.html";
++  QFile myFile( myReportFile );
++  if ( myFile.open( QIODevice::WriteOnly | QIODevice::Append ) )
++  {
++    QTextStream myQTextStream( &myFile );
++    myQTextStream << mReport;
++    myFile.close();
++  }
++}
++
++void TestQgsGdalProvider::scaleDataType()
++{
++  QString rasterWithOffset = QString( TEST_DATA_DIR ) + QDir::separator() +  "int_raster_with_scale.tif";
++  QgsDataProvider* provider = QgsProviderRegistry::instance()->provider( "gdal", rasterWithOffset );
++  QgsRasterDataProvider* rp = dynamic_cast< QgsRasterDataProvider* >( provider );
++  QVERIFY( rp );
++  //raster is an integer data type, but has a scale < 1, so data type must be float
++  QCOMPARE( rp->dataType( 1 ), QGis::Float32 );
++  QCOMPARE( rp->srcDataType( 1 ), QGis::Float32 );
++}
++
++void TestQgsGdalProvider::warpedVrt()
++{
++  QString raster = QString( TEST_DATA_DIR ) + QDir::separator() +  "requires_warped_vrt.tif";
++  QgsDataProvider* provider = QgsProviderRegistry::instance()->provider( "gdal", raster );
++  QgsRasterDataProvider* rp = dynamic_cast< QgsRasterDataProvider* >( provider );
++  QVERIFY( rp );
++
++  qDebug() << "x min: " << rp->extent().xMinimum();
++  qDebug() << "x max: " << rp->extent().xMaximum();
++  qDebug() << "y min: " << rp->extent().yMinimum();
++  qDebug() << "y max: " << rp->extent().yMaximum();
++
++  QVERIFY( qgsDoubleNear( rp->extent().xMinimum(), 2058589, 1 ) );
++  QVERIFY( qgsDoubleNear( rp->extent().xMaximum(), 3118999, 1 ) );
++  QVERIFY( qgsDoubleNear( rp->extent().yMinimum(), 2281355, 1 ) );
++  QVERIFY( qgsDoubleNear( rp->extent().yMaximum(), 3129683, 1 ) );
++}
++
++QTEST_MAIN( TestQgsGdalProvider )
++#include "testqgsgdalprovider.moc"
+--- /dev/null
++++ b/tests/testdata/int_raster_with_scale.tif.aux.xml
+@@ -0,0 +1,30 @@
++<PAMDataset>
++  <Metadata>
++    <MDI key="AOD Source">MODIS (MOD08_D3)</MDI>
++    <MDI key="AOD Value">0.069</MDI>
++    <MDI key="GIPPY Version">1.0.2</MDI>
++    <MDI key="GIPS Version">0.7.1</MDI>
++    <MDI key="GIPS-landsat Version">0.9.0</MDI>
++  </Metadata>
++  <PAMRasterBand band="1">
++    <Description>ndvi</Description>
++    <UnitType>other</UnitType>
++    <Scale>9.999999747378752e-05</Scale>
++    <Histograms>
++      <HistItem>
++        <HistMin>7091</HistMin>
++        <HistMax>8573</HistMax>
++        <BucketCount>2</BucketCount>
++        <IncludeOutOfRange>0</IncludeOutOfRange>
++        <Approximate>0</Approximate>
++        <HistCounts>23|33</HistCounts>
++      </HistItem>
++    </Histograms>
++    <Metadata>
++      <MDI key="STATISTICS_MAXIMUM">8326</MDI>
++      <MDI key="STATISTICS_MEAN">7873.3214285714</MDI>
++      <MDI key="STATISTICS_MINIMUM">7338</MDI>
++      <MDI key="STATISTICS_STDDEV">261.16183455194</MDI>
++    </Metadata>
++  </PAMRasterBand>
++</PAMDataset>
diff --git a/debian/patches/0001-Fix-incorrect-data-type-for-GDAL-layers-with-gain-of.patch b/debian/patches/0001-Fix-incorrect-data-type-for-GDAL-layers-with-gain-of.patch
new file mode 100644
index 0000000..ab223b9
--- /dev/null
+++ b/debian/patches/0001-Fix-incorrect-data-type-for-GDAL-layers-with-gain-of.patch
@@ -0,0 +1,28 @@
+From 326b4989f0b00254601dbb6ef8182f571b58a2d3 Mon Sep 17 00:00:00 2001
+From: Nyall Dawson <nyall.dawson at gmail.com>
+Date: Fri, 6 Mar 2015 15:11:44 +1100
+Subject: Fix incorrect data type for GDAL layers with gain/offset (fix
+ #11573)
+Bug: http://hub.qgis.org/issues/11573
+Origin: https://github.com/qgis/QGIS/commit/326b4989f0b00254601dbb6ef8182f571b58a2d3
+
+Test was incorrectly checking for both offset and gain, when it
+should have been testing for either.
+---
+ src/providers/gdal/qgsgdalprovider.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/src/providers/gdal/qgsgdalprovider.cpp
++++ b/src/providers/gdal/qgsgdalprovider.cpp
+@@ -2650,9 +2650,9 @@ void QgsGdalProvider::initBaseDataset()
+     // define if the band has scale and offset to apply
+     double myScale = bandScale( i );
+     double myOffset = bandOffset( i );
+-    if ( myScale != 1.0 && myOffset != 0.0 )
++    if ( !qgsDoubleNear( myScale, 1.0 ) || !qgsDoubleNear( myOffset, 0.0 ) )
+     {
+-      // if the band has scale and offset to apply change dataType
++      // if the band has scale or offset to apply change dataType
+       switch ( myGdalDataType )
+       {
+         case GDT_Unknown:
diff --git a/debian/patches/0001-Followup-5d15a07-also-fix-edit-role.patch b/debian/patches/0001-Followup-5d15a07-also-fix-edit-role.patch
new file mode 100644
index 0000000..de00a00
--- /dev/null
+++ b/debian/patches/0001-Followup-5d15a07-also-fix-edit-role.patch
@@ -0,0 +1,23 @@
+From e1b08fb2e879ba4b0580d412ffd6cc89f9d0f2e1 Mon Sep 17 00:00:00 2001
+From: Nyall Dawson <nyall.dawson at gmail.com>
+Date: Tue, 10 Mar 2015 10:03:43 +1100
+Subject: Followup 5d15a07, also fix edit role
+Origin: https://github.com/qgis/QGIS/commit/e1b08fb2e879ba4b0580d412ffd6cc89f9d0f2e1
+
+---
+ src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
++++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
+@@ -800,8 +800,8 @@ QVariant QgsRuleBasedRendererV2Model::da
+     {
+       case 0: return rule->label();
+       case 1: return rule->filterExpression();
+-      case 2: return rule->scaleMinDenom();
+-      case 3: return rule->scaleMaxDenom();
++      case 2: return rule->scaleMaxDenom();
++      case 3: return rule->scaleMinDenom();
+       default: return QVariant();
+     }
+   }
diff --git a/debian/patches/0001-Followup-914ecc-also-fix-calculation-of-srcDataType.patch b/debian/patches/0001-Followup-914ecc-also-fix-calculation-of-srcDataType.patch
new file mode 100644
index 0000000..3eb3e33
--- /dev/null
+++ b/debian/patches/0001-Followup-914ecc-also-fix-calculation-of-srcDataType.patch
@@ -0,0 +1,24 @@
+From 9490d667d3295b3ea6463af069a98062b4a18387 Mon Sep 17 00:00:00 2001
+From: Nyall Dawson <nyall.dawson at gmail.com>
+Date: Tue, 10 Mar 2015 22:30:58 +1100
+Subject: Followup 914ecc, also fix calculation of srcDataType
+Origin: https://github.com/qgis/QGIS/commit/9490d667d3295b3ea6463af069a98062b4a18387
+
+---
+ src/providers/gdal/qgsgdalprovider.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/src/providers/gdal/qgsgdalprovider.cpp
++++ b/src/providers/gdal/qgsgdalprovider.cpp
+@@ -1091,9 +1091,9 @@ QGis::DataType QgsGdalProvider::srcDataT
+   // define if the band has scale and offset to apply
+   double myScale = bandScale( bandNo );
+   double myOffset = bandOffset( bandNo );
+-  if ( myScale != 1.0 && myOffset != 0.0 )
++  if ( myScale != 1.0 || myOffset != 0.0 )
+   {
+-    // if the band has scale and offset to apply change dataType
++    // if the band has scale or offset to apply change dataType
+     switch ( myDataType )
+     {
+       case QGis::UnknownDataType:
diff --git a/debian/patches/0001-Server-fix-bug-with-multiple-joins.patch b/debian/patches/0001-Server-fix-bug-with-multiple-joins.patch
new file mode 100644
index 0000000..05f89b4
--- /dev/null
+++ b/debian/patches/0001-Server-fix-bug-with-multiple-joins.patch
@@ -0,0 +1,24 @@
+From 47d04db3bc6ec7d97c4a66da5c32f210c0227d74 Mon Sep 17 00:00:00 2001
+From: Marco Hugentobler <marco.hugentobler at sourcepole.ch>
+Date: Thu, 5 Mar 2015 17:24:02 +0100
+Subject: Server: fix bug with multiple joins
+Origin: https://github.com/qgis/QGIS/commit/47d04db3bc6ec7d97c4a66da5c32f210c0227d74
+
+---
+ src/server/qgsserverprojectparser.cpp |    5 -----
+ 1 file changed, 5 deletions(-)
+
+--- a/src/server/qgsserverprojectparser.cpp
++++ b/src/server/qgsserverprojectparser.cpp
+@@ -1349,11 +1349,6 @@ void QgsServerProjectParser::addJoinLaye
+   }
+ 
+   QDomNodeList joinNodeList = vectorJoinsElem.elementsByTagName( "join" );
+-  if ( joinNodeList.size() > 1 )
+-  {
+-    return;
+-  }
+-
+   for ( int i = 0; i < joinNodeList.size(); ++i )
+   {
+     QString id = joinNodeList.at( i ).toElement().attribute( "joinLayerId" );
diff --git a/debian/patches/0001-attribute-table-ShowVisible-behaviour-mode.patch b/debian/patches/0001-attribute-table-ShowVisible-behaviour-mode.patch
new file mode 100644
index 0000000..ef66ff9
--- /dev/null
+++ b/debian/patches/0001-attribute-table-ShowVisible-behaviour-mode.patch
@@ -0,0 +1,52 @@
+From 2d9621ec260ead1bb06bcc5befbb84a38cfbecd9 Mon Sep 17 00:00:00 2001
+From: "Juergen E. Fischer" <jef at norbit.de>
+Date: Tue, 10 Mar 2015 09:37:39 +0100
+Subject: =?UTF-8?q?attribute=20table:=20ShowVisible=20behaviour=20mode=0A*=20?=
+ =?UTF-8?q?change=20'show=20all'=20action=20text=0A*=20add=20note=20to=20the?=
+ =?UTF-8?q?=20window=20title=0A*=20also=20ignore=20mode=20for=20geometryless?=
+ =?UTF-8?q?=20tables?=
+Bug: http://hub.qgis.org/issues/12318
+Origin: https://github.com/qgis/QGIS/commit/2d9621ec260ead1bb06bcc5befbb84a38cfbecd9
+
+(fixes #12318)
+
+(cherry picked from commit 2a5d59e872f91de16eed73aab218aed46a71ec58)
+---
+ src/app/qgsattributetabledialog.cpp |    8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- a/src/app/qgsattributetabledialog.cpp
++++ b/src/app/qgsattributetabledialog.cpp
+@@ -90,7 +90,8 @@ QgsAttributeTableDialog::QgsAttributeTab
+   context.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() );
+ 
+   QgsFeatureRequest r;
+-  if ( settings.value( "/qgis/attributeTableBehaviour", QgsAttributeTableFilterModel::ShowAll ).toInt() == QgsAttributeTableFilterModel::ShowVisible )
++  if ( mLayer->geometryType() != QGis::NoGeometry &&
++       settings.value( "/qgis/attributeTableBehaviour", QgsAttributeTableFilterModel::ShowAll ).toInt() == QgsAttributeTableFilterModel::ShowVisible )
+   {
+     QgsMapCanvas *mc = QgisApp::instance()->mapCanvas();
+     QgsRectangle extent( mc->mapSettings().mapToLayerCoordinates( theLayer, mc->extent() ) );
+@@ -100,6 +101,8 @@ QgsAttributeTableDialog::QgsAttributeTab
+     mRubberBand = new QgsRubberBand( mc, true );
+     mRubberBand->setToGeometry( g, theLayer );
+     delete g;
++
++    mActionShowAllFilter->setText( tr( "Show All Features In Initial Canvas Extent" ) );
+   }
+ 
+   // Initialize dual view
+@@ -236,11 +239,12 @@ QgsAttributeTableDialog::~QgsAttributeTa
+ void QgsAttributeTableDialog::updateTitle()
+ {
+   QWidget *w = mDock ? qobject_cast<QWidget*>( mDock ) : qobject_cast<QWidget*>( this );
+-  w->setWindowTitle( tr( "Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4" )
++  w->setWindowTitle( tr( "Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5" )
+                      .arg( mLayer->name() )
+                      .arg( mMainView->featureCount() )
+                      .arg( mMainView->filteredFeatureCount() )
+                      .arg( mLayer->selectedFeatureCount() )
++                     .arg( mRubberBand ? tr( ", spatially limited" ) : "" )
+                    );
+ 
+   if ( mMainView->filterMode() == QgsAttributeTableFilterModel::ShowAll )
diff --git a/debian/patches/0001-fix-inline-editing-of-scales-in-rule-based-renderer.patch b/debian/patches/0001-fix-inline-editing-of-scales-in-rule-based-renderer.patch
new file mode 100644
index 0000000..b68018d
--- /dev/null
+++ b/debian/patches/0001-fix-inline-editing-of-scales-in-rule-based-renderer.patch
@@ -0,0 +1,25 @@
+From e11f81033bb29384f77f2a0c5ab0f2487908ffda Mon Sep 17 00:00:00 2001
+From: Denis Rouzaud <denis.rouzaud at gmail.com>
+Date: Thu, 5 Mar 2015 15:25:11 +0100
+Subject: fix inline editing of scales in rule based renderer
+Origin: https://github.com/qgis/QGIS/commit/e11f81033bb29384f77f2a0c5ab0f2487908ffda
+
+---
+ src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- a/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
++++ b/src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp
+@@ -906,10 +906,10 @@ bool QgsRuleBasedRendererV2Model::setDat
+       rule->setFilterExpression( value.toString() );
+       break;
+     case 2: // scale min
+-      rule->setScaleMinDenom( value.toInt() );
++      rule->setScaleMaxDenom( value.toInt() );
+       break;
+     case 3: // scale max
+-      rule->setScaleMaxDenom( value.toInt() );
++      rule->setScaleMinDenom( value.toInt() );
+       break;
+     default:
+       return false;
diff --git a/debian/patches/0001-german-translation-update.patch b/debian/patches/0001-german-translation-update.patch
new file mode 100644
index 0000000..924d7cd
--- /dev/null
+++ b/debian/patches/0001-german-translation-update.patch
@@ -0,0 +1,549 @@
+From 7d515e2592c6a74ee402577c4dc8c0e85d2e435c Mon Sep 17 00:00:00 2001
+From: "Juergen E. Fischer" <jef at norbit.de>
+Date: Tue, 10 Mar 2015 09:44:11 +0100
+Subject: german translation update
+Origin: https://github.com/qgis/QGIS/commit/7d515e2592c6a74ee402577c4dc8c0e85d2e435c
+
+---
+ doc/TRANSLATORS |   90 +++++++-------
+ i18n/qgis_de.ts |  364 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 2 files changed, 408 insertions(+), 46 deletions(-)
+
+--- a/doc/TRANSLATORS
++++ b/doc/TRANSLATORS
+@@ -1,47 +1,47 @@
+ <style>table {font-size:80%;}th {text-align:left; }.bartodo{ background-color:red;width:100px;height:20px;}.bardone{ background-color:green;width:80px;height:20px;font-size:80%;text-align:center;padding-top:4px;height:16px;color:white;}</style><table><tr><th colspan="2" style="width:250px;">Language</th><th>Finished %</th><th>Translators</th></tr>
+ 
+-<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:13174 unfinished:0 untranslated:0" class="bartodo"><div class="bardone" style="width:100px">100.0</div></div></td><td>Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho</td></tr>
+-<tr><td><img src="qrc:/images/flags/gl.png"></td><td>Galician</td><td><div title="finished:13170 unfinished:1 untranslated:3" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Xan Vieiro</td></tr>
+-<tr><td><img src="qrc:/images/flags/nb.png"></td><td>Norwegian Bokmal</td><td><div title="finished:13170 unfinished:1 untranslated:3" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>James Stott, Maléne Peterson</td></tr>
+-<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:13170 unfinished:1 untranslated:3" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Giovanni Manghi, Joana Simões, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva, Ricardo Sena, Leandro Infantini, João Gaspar</td></tr>
+-<tr><td><img src="qrc:/images/flags/sv.png"></td><td>Swedish</td><td><div title="finished:13170 unfinished:1 untranslated:3" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Lars Luthman, Magnus Homann, Victor Axbom</td></tr>
+-<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:13170 unfinished:0 untranslated:4" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu</td></tr>
+-<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:13170 unfinished:0 untranslated:4" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Sidney Schaberle Goveia, Arthur Nanni, Marcelo Soares Souza, Narcélio de Sá Pereira Filho, Leônidas Descovi Filho, Felipe Sodré Barros </td></tr>
+-<tr><td><img src="qrc:/images/flags/nl.png"></td><td>Dutch</td><td><div title="finished:13168 unfinished:1 untranslated:5" class="bartodo"><div class="bardone" style="width:99px">100.0</div></div></td><td>Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk, Diethard Jansen, Willem Hoffmans, Dick Groskamp</td></tr>
+-<tr><td><img src="qrc:/images/flags/it.png"></td><td>Italian</td><td><div title="finished:13166 unfinished:1 untranslated:7" class="bartodo"><div class="bardone" style="width:99px">99.9</div></div></td><td>Roberto Angeletti, Michele Beneventi, Marco Braida, Stefano Campus, Luca Casagrande, Paolo Cavallini, Giuliano Curti, Luca Delucchi, Alessandro Fanna, Michele Ferretti, Matteo Ghetta, Anne Gishla, Maurizio Napolitano, Flavio Rigolon</td></tr>
+-<tr><td><img src="qrc:/images/flags/es.png"></td><td>Spanish</td><td><div title="finished:13154 unfinished:1 untranslated:19" class="bartodo"><div class="bardone" style="width:99px">99.9</div></div></td><td>Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo</td></tr>
+-<tr><td><img src="qrc:/images/flags/fi.png"></td><td>Finnish</td><td><div title="finished:13152 unfinished:1 untranslated:21" class="bartodo"><div class="bardone" style="width:99px">99.8</div></div></td><td>Kari Salovaara, Marko Järvenpää</td></tr>
+-<tr><td><img src="qrc:/images/flags/eu.png"></td><td>Basque</td><td><div title="finished:13018 unfinished:1 untranslated:155" class="bartodo"><div class="bardone" style="width:98px">98.8</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
+-<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:12957 unfinished:0 untranslated:217" class="bartodo"><div class="bardone" style="width:98px">98.4</div></div></td><td>BABA Yoshihiko, Yoichi Kayama, Minoru Akagi, Takayuki Nuimura, Takayuki Mizutani, Norihiro Yamate</td></tr>
+-<tr><td><img src="qrc:/images/flags/pl.png"></td><td>Polish</td><td><div title="finished:12698 unfinished:1 untranslated:475" class="bartodo"><div class="bardone" style="width:96px">96.4</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder, Radosław Pasiok</td></tr>
+-<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:12394 unfinished:9 untranslated:771" class="bartodo"><div class="bardone" style="width:94px">94.1</div></div></td><td>Zoltan Siki</td></tr>
+-<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:12307 unfinished:4 untranslated:863" class="bartodo"><div class="bardone" style="width:93px">93.4</div></div></td><td>Sorin Călinică, Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
+-<tr><td><img src="qrc:/images/flags/da.png"></td><td>Danish</td><td><div title="finished:12269 unfinished:4 untranslated:901" class="bartodo"><div class="bardone" style="width:93px">93.1</div></div></td><td>Jacob Overgaard Madsen, Bo Victor Thomsen</td></tr>
+-<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese simplified</td><td><div title="finished:12193 unfinished:3 untranslated:978" class="bartodo"><div class="bardone" style="width:92px">92.6</div></div></td><td>Calvin Ngei, Lisashen</td></tr>
+-<tr><td><img src="qrc:/images/flags/zh_CN.png"></td><td>Chinese (China)</td><td><div title="finished:12179 unfinished:2 untranslated:993" class="bartodo"><div class="bardone" style="width:92px">92.5</div></div></td><td>Calvin Ngei, Zhang Jun, Richard Xie</td></tr>
+-<tr><td><img src="qrc:/images/flags/ko.png"></td><td>Korean</td><td><div title="finished:12083 unfinished:2 untranslated:1089" class="bartodo"><div class="bardone" style="width:91px">91.7</div></div></td><td>OSGeo Korean Chapter</td></tr>
+-<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:12041 unfinished:24 untranslated:1109" class="bartodo"><div class="bardone" style="width:91px">91.5</div></div></td><td>Alexander Bruy, Artem Popov</td></tr>
+-<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:12041 unfinished:14 untranslated:1119" class="bartodo"><div class="bardone" style="width:91px">91.5</div></div></td><td>Phan Anh, Bùi Hữu Mạnh</td></tr>
+-<tr><td><img src="qrc:/images/flags/zh_TW.png"></td><td>Chinese (Taiwan (Province of China))</td><td><div title="finished:11990 unfinished:5 untranslated:1179" class="bartodo"><div class="bardone" style="width:91px">91.0</div></div></td><td>Nung-yao Lin</td></tr>
+-<tr><td><img src="qrc:/images/flags/cs.png"></td><td>Czech</td><td><div title="finished:11844 unfinished:5 untranslated:1325" class="bartodo"><div class="bardone" style="width:89px">89.9</div></div></td><td>Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček</td></tr>
+-<tr><td><img src="qrc:/images/flags/hi.png"></td><td>Hindi</td><td><div title="finished:11369 unfinished:3 untranslated:1802" class="bartodo"><div class="bardone" style="width:86px">86.3</div></div></td><td>Harish Kumar Solanki</td></tr>
+-<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:10755 unfinished:63 untranslated:2356" class="bartodo"><div class="bardone" style="width:81px">81.9</div></div></td><td>Emir Hartato, Muhammad Iqnaul Haq Siregar, Trias Aditya, Januar V. Simarmata, I Made Anombawa</td></tr>
+-<tr><td><img src="qrc:/images/flags/lt.png"></td><td>Lithuanian</td><td><div title="finished:10775 unfinished:10 untranslated:2389" class="bartodo"><div class="bardone" style="width:81px">81.8</div></div></td><td>Paulius Litvinas, Tomas Straupis, Kestas M</td></tr>
+-<tr><td><img src="qrc:/images/flags/bs.png"></td><td>Bosnian</td><td><div title="finished:10515 unfinished:15 untranslated:2644" class="bartodo"><div class="bardone" style="width:79px">79.9</div></div></td><td>Almir Karabegovic</td></tr>
+-<tr><td><img src="qrc:/images/flags/km.png"></td><td>Central Khmer</td><td><div title="finished:9381 unfinished:9 untranslated:3784" class="bartodo"><div class="bardone" style="width:71px">71.2</div></div></td><td>Khoem Sokhem</td></tr>
+-<tr><td><img src="qrc:/images/flags/sl.png"></td><td>Slovenian</td><td><div title="finished:9037 unfinished:12 untranslated:4125" class="bartodo"><div class="bardone" style="width:68px">68.6</div></div></td><td>Jože Detečnik, Dejan Gregor, Jaka Kranjc</td></tr>
+-<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:8902 unfinished:48 untranslated:4224" class="bartodo"><div class="bardone" style="width:67px">67.8</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
+-<tr><td><img src="qrc:/images/flags/ar.png"></td><td>Arabic</td><td><div title="finished:8889 unfinished:31 untranslated:4254" class="bartodo"><div class="bardone" style="width:67px">67.6</div></div></td><td>Ichaouia Amine, Hosham Munier</td></tr>
+-<tr><td><img src="qrc:/images/flags/et.png"></td><td>Estonian</td><td><div title="finished:8813 unfinished:32 untranslated:4329" class="bartodo"><div class="bardone" style="width:67px">67.0</div></div></td><td>Veiko Viil</td></tr>
+-<tr><td><img src="qrc:/images/flags/hr.png"></td><td>Croatian</td><td><div title="finished:7451 unfinished:15 untranslated:5708" class="bartodo"><div class="bardone" style="width:56px">56.6</div></div></td><td>Zoran Jankovic</td></tr>
+-<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:6838 unfinished:7 untranslated:6329" class="bartodo"><div class="bardone" style="width:51px">51.9</div></div></td><td>Osman Yalçın YILMAZ, Omur Saygin</td></tr>
+-<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:5931 unfinished:979 untranslated:6264" class="bartodo"><div class="bardone" style="width:48px">48.7</div></div></td><td>Lubos Balazovic, Jana Kormanikova, Ivan Mincik</td></tr>
+-<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian (latin)</td><td><div title="finished:6244 unfinished:39 untranslated:6891" class="bartodo"><div class="bardone" style="width:47px">47.5</div></div></td><td>Goran Ivanković</td></tr>
+-<tr><td><img src="qrc:/images/flags/el.png"></td><td>Modern Greek (1453-)</td><td><div title="finished:6186 unfinished:12 untranslated:6976" class="bartodo"><div class="bardone" style="width:47px">47.0</div></div></td><td>Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
+-<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian</td><td><div title="finished:6002 unfinished:27 untranslated:7145" class="bartodo"><div class="bardone" style="width:45px">45.7</div></div></td><td>Goran Ivanković</td></tr>
+-<tr><td><img src="qrc:/images/flags/ca.png"></td><td>Catalan</td><td><div title="finished:5152 unfinished:24 untranslated:7998" class="bartodo"><div class="bardone" style="width:39px">39.2</div></div></td><td>Albert F, Pau Reguant Ridó, Xavier Roijals</td></tr>
+-<tr><td><img src="qrc:/images/flags/th.png"></td><td>Thai</td><td><div title="finished:5071 unfinished:27 untranslated:8076" class="bartodo"><div class="bardone" style="width:38px">38.6</div></div></td><td>Man Chao</td></tr>
+-<tr><td><img src="qrc:/images/flags/fa.png"></td><td>Persian</td><td><div title="finished:5037 unfinished:32 untranslated:8105" class="bartodo"><div class="bardone" style="width:38px">38.4</div></div></td><td>Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan</td></tr>
+-<tr><td><img src="qrc:/images/flags/is.png"></td><td>Icelandic</td><td><div title="finished:4917 unfinished:28 untranslated:8229" class="bartodo"><div class="bardone" style="width:37px">37.4</div></div></td><td>Ásta Kristín Óladóttir, Thordur Ivarsson</td></tr>
+-<tr><td><img src="qrc:/images/flags/uk.png"></td><td>Ukrainian</td><td><div title="finished:4836 unfinished:21 untranslated:8317" class="bartodo"><div class="bardone" style="width:36px">36.8</div></div></td><td>Alexander Bruy</td></tr>
+-<tr><td><img src="qrc:/images/flags/mn.png"></td><td>Mongolian</td><td><div title="finished:4632 unfinished:19 untranslated:8523" class="bartodo"><div class="bardone" style="width:35px">35.2</div></div></td><td>Bayarmaa Enkhtur</td></tr></table>
++<tr><td><img src="qrc:/images/flags/de.png"></td><td>German</td><td><div title="finished:13255 unfinished:0 untranslated:0" class="bartodo"><div class="bardone" style="width:100px">100.0</div></div></td><td>Jürgen E. Fischer, Stephan Holl, Otto Dassau, Werner Macho</td></tr>
++<tr><td><img src="qrc:/images/flags/fr.png"></td><td>French</td><td><div title="finished:13169 unfinished:76 untranslated:10" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Arnaud Morvan, Augustin Roche, Jean-Roc Morreale, Loïc Buscoz, Marc-André Saia, Mathieu Bossaert, Mayeul Kauffmann, Médéric Ribreux, Michael Douchin, Nicolas Rochard, Robin Prest, DelazJ, Stéphane Possamai, Sylvain Badey, Sylvain_M, Sylvain Maillard, Xavier Tardieu</td></tr>
++<tr><td><img src="qrc:/images/flags/nb.png"></td><td>Norwegian Bokmal</td><td><div title="finished:13169 unfinished:73 untranslated:13" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>James Stott, Maléne Peterson</td></tr>
++<tr><td><img src="qrc:/images/flags/pt_PT.png"></td><td>Portuguese (Portugal)</td><td><div title="finished:13169 unfinished:73 untranslated:13" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Giovanni Manghi, Joana Simões, Duarte Carreira, Alexandre Neto, Pedro Pereira, Pedro Palheiro, Nelson Silva, Ricardo Sena, Leandro Infantini, João Gaspar</td></tr>
++<tr><td><img src="qrc:/images/flags/gl.png"></td><td>Galician</td><td><div title="finished:13169 unfinished:71 untranslated:15" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Xan Vieiro</td></tr>
++<tr><td><img src="qrc:/images/flags/pt_BR.png"></td><td>Portuguese (Brazil)</td><td><div title="finished:13169 unfinished:68 untranslated:18" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Sidney Schaberle Goveia, Arthur Nanni, Marcelo Soares Souza, Narcélio de Sá Pereira Filho, Leônidas Descovi Filho, Felipe Sodré Barros </td></tr>
++<tr><td><img src="qrc:/images/flags/it.png"></td><td>Italian</td><td><div title="finished:13165 unfinished:75 untranslated:15" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Roberto Angeletti, Michele Beneventi, Marco Braida, Stefano Campus, Luca Casagrande, Paolo Cavallini, Giuliano Curti, Luca Delucchi, Alessandro Fanna, Michele Ferretti, Matteo Ghetta, Anne Gishla, Maurizio Napolitano, Flavio Rigolon</td></tr>
++<tr><td><img src="qrc:/images/flags/sv.png"></td><td>Swedish</td><td><div title="finished:13169 unfinished:67 untranslated:19" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Victor Axbom, Lars Luthman, Magnus Homann, Klas Karlsson, Isabelle J Wigren, Daniel Rosander, Anders Ekwall, Magnus Nilsson, Jonas Svensson, Christian Brinkenberg</td></tr>
++<tr><td><img src="qrc:/images/flags/nl.png"></td><td>Dutch</td><td><div title="finished:13167 unfinished:65 untranslated:23" class="bartodo"><div class="bardone" style="width:99px">99.6</div></div></td><td>Richard Duivenvoorde, Raymond Nijssen, Carlo van Rijswijk, Diethard Jansen, Willem Hoffmans, Dick Groskamp</td></tr>
++<tr><td><img src="qrc:/images/flags/es.png"></td><td>Spanish</td><td><div title="finished:13153 unfinished:68 untranslated:34" class="bartodo"><div class="bardone" style="width:99px">99.5</div></div></td><td>Carlos Dávila, Javier César Aldariz, Gabriela Awad, Edwin Amado, Mayeul Kauffmann, Diana Galindo</td></tr>
++<tr><td><img src="qrc:/images/flags/fi.png"></td><td>Finnish</td><td><div title="finished:13151 unfinished:66 untranslated:38" class="bartodo"><div class="bardone" style="width:99px">99.5</div></div></td><td>Kari Salovaara, Marko Järvenpää</td></tr>
++<tr><td><img src="qrc:/images/flags/eu.png"></td><td>Basque</td><td><div title="finished:13017 unfinished:73 untranslated:165" class="bartodo"><div class="bardone" style="width:98px">98.5</div></div></td><td>Asier Sarasua Garmendia, Irantzu Alvarez</td></tr>
++<tr><td><img src="qrc:/images/flags/ja.png"></td><td>Japanese</td><td><div title="finished:12956 unfinished:36 untranslated:263" class="bartodo"><div class="bardone" style="width:97px">97.9</div></div></td><td>BABA Yoshihiko, Yoichi Kayama, Minoru Akagi, Takayuki Nuimura, Takayuki Mizutani, Norihiro Yamate</td></tr>
++<tr><td><img src="qrc:/images/flags/pl.png"></td><td>Polish</td><td><div title="finished:12697 unfinished:24 untranslated:534" class="bartodo"><div class="bardone" style="width:95px">95.9</div></div></td><td>Robert Szczepanek, Milena Nowotarska, Borys Jurgiel, Mateusz Łoskot, Tomasz Paul, Andrzej Świąder, Radosław Pasiok</td></tr>
++<tr><td><img src="qrc:/images/flags/hu.png"></td><td>Hungarian</td><td><div title="finished:12393 unfinished:45 untranslated:817" class="bartodo"><div class="bardone" style="width:93px">93.7</div></div></td><td>Zoltan Siki</td></tr>
++<tr><td><img src="qrc:/images/flags/ro.png"></td><td>Romanian</td><td><div title="finished:12306 unfinished:53 untranslated:896" class="bartodo"><div class="bardone" style="width:93px">93.0</div></div></td><td>Sorin Călinică, Lonut Losifescu-Enescu, Bogdan Pacurar</td></tr>
++<tr><td><img src="qrc:/images/flags/da.png"></td><td>Danish</td><td><div title="finished:12268 unfinished:13 untranslated:974" class="bartodo"><div class="bardone" style="width:92px">92.6</div></div></td><td>Jacob Overgaard Madsen, Bo Victor Thomsen</td></tr>
++<tr><td><img src="qrc:/images/flags/zh.png"></td><td>Chinese simplified</td><td><div title="finished:12192 unfinished:22 untranslated:1041" class="bartodo"><div class="bardone" style="width:92px">92.1</div></div></td><td>Calvin Ngei, Lisashen</td></tr>
++<tr><td><img src="qrc:/images/flags/zh_CN.png"></td><td>Chinese (China)</td><td><div title="finished:12178 unfinished:21 untranslated:1056" class="bartodo"><div class="bardone" style="width:91px">92.0</div></div></td><td>Calvin Ngei, Zhang Jun, Richard Xie</td></tr>
++<tr><td><img src="qrc:/images/flags/ko.png"></td><td>Korean</td><td><div title="finished:12082 unfinished:3 untranslated:1170" class="bartodo"><div class="bardone" style="width:91px">91.2</div></div></td><td>OSGeo Korean Chapter</td></tr>
++<tr><td><img src="qrc:/images/flags/ru.png"></td><td>Russian</td><td><div title="finished:12040 unfinished:33 untranslated:1182" class="bartodo"><div class="bardone" style="width:90px">91.0</div></div></td><td>Alexander Bruy, Artem Popov</td></tr>
++<tr><td><img src="qrc:/images/flags/vi.png"></td><td>Vietnamese</td><td><div title="finished:12040 unfinished:17 untranslated:1198" class="bartodo"><div class="bardone" style="width:90px">90.9</div></div></td><td>Phan Anh, Bùi Hữu Mạnh</td></tr>
++<tr><td><img src="qrc:/images/flags/zh_TW.png"></td><td>Chinese (Taiwan (Province of China))</td><td><div title="finished:11989 unfinished:14 untranslated:1252" class="bartodo"><div class="bardone" style="width:90px">90.5</div></div></td><td>Nung-yao Lin</td></tr>
++<tr><td><img src="qrc:/images/flags/cs.png"></td><td>Czech</td><td><div title="finished:11843 unfinished:17 untranslated:1395" class="bartodo"><div class="bardone" style="width:89px">89.4</div></div></td><td>Jan Helebrant, Martin Landa, Peter Antolik, Martin Dzurov, Stanislav Horáček</td></tr>
++<tr><td><img src="qrc:/images/flags/hi.png"></td><td>Hindi</td><td><div title="finished:11368 unfinished:4 untranslated:1883" class="bartodo"><div class="bardone" style="width:85px">85.8</div></div></td><td>Harish Kumar Solanki</td></tr>
++<tr><td><img src="qrc:/images/flags/lt.png"></td><td>Lithuanian</td><td><div title="finished:10774 unfinished:32 untranslated:2449" class="bartodo"><div class="bardone" style="width:81px">81.4</div></div></td><td>Paulius Litvinas, Tomas Straupis, Kestas M</td></tr>
++<tr><td><img src="qrc:/images/flags/id.png"></td><td>Indonesian</td><td><div title="finished:10754 unfinished:64 untranslated:2437" class="bartodo"><div class="bardone" style="width:81px">81.4</div></div></td><td>Emir Hartato, Muhammad Iqnaul Haq Siregar, Trias Aditya, Januar V. Simarmata, I Made Anombawa</td></tr>
++<tr><td><img src="qrc:/images/flags/bs.png"></td><td>Bosnian</td><td><div title="finished:10514 unfinished:16 untranslated:2725" class="bartodo"><div class="bardone" style="width:79px">79.4</div></div></td><td>Almir Karabegovic</td></tr>
++<tr><td><img src="qrc:/images/flags/km.png"></td><td>Central Khmer</td><td><div title="finished:9381 unfinished:11 untranslated:3863" class="bartodo"><div class="bardone" style="width:70px">70.8</div></div></td><td>Khoem Sokhem</td></tr>
++<tr><td><img src="qrc:/images/flags/sl.png"></td><td>Slovenian</td><td><div title="finished:9036 unfinished:13 untranslated:4206" class="bartodo"><div class="bardone" style="width:68px">68.2</div></div></td><td>Jože Detečnik, Dejan Gregor, Jaka Kranjc</td></tr>
++<tr><td><img src="qrc:/images/flags/lv.png"></td><td>Latvian</td><td><div title="finished:8901 unfinished:49 untranslated:4305" class="bartodo"><div class="bardone" style="width:67px">67.3</div></div></td><td>Maris Nartiss, Pēteris Brūns</td></tr>
++<tr><td><img src="qrc:/images/flags/ar.png"></td><td>Arabic</td><td><div title="finished:8889 unfinished:31 untranslated:4335" class="bartodo"><div class="bardone" style="width:67px">67.2</div></div></td><td>Ichaouia Amine, Hosham Munier</td></tr>
++<tr><td><img src="qrc:/images/flags/et.png"></td><td>Estonian</td><td><div title="finished:8813 unfinished:32 untranslated:4410" class="bartodo"><div class="bardone" style="width:66px">66.6</div></div></td><td>Veiko Viil</td></tr>
++<tr><td><img src="qrc:/images/flags/hr.png"></td><td>Croatian</td><td><div title="finished:7451 unfinished:15 untranslated:5789" class="bartodo"><div class="bardone" style="width:56px">56.3</div></div></td><td>Zoran Jankovic</td></tr>
++<tr><td><img src="qrc:/images/flags/tr.png"></td><td>Turkish</td><td><div title="finished:6838 unfinished:7 untranslated:6410" class="bartodo"><div class="bardone" style="width:51px">51.6</div></div></td><td>Osman Yalçın YILMAZ, Omur Saygin</td></tr>
++<tr><td><img src="qrc:/images/flags/sk.png"></td><td>Slovak</td><td><div title="finished:5930 unfinished:980 untranslated:6345" class="bartodo"><div class="bardone" style="width:48px">48.4</div></div></td><td>Lubos Balazovic, Jana Kormanikova, Ivan Mincik</td></tr>
++<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian (latin)</td><td><div title="finished:6244 unfinished:39 untranslated:6972" class="bartodo"><div class="bardone" style="width:47px">47.3</div></div></td><td>Goran Ivanković</td></tr>
++<tr><td><img src="qrc:/images/flags/el.png"></td><td>Modern Greek (1453-)</td><td><div title="finished:6186 unfinished:12 untranslated:7057" class="bartodo"><div class="bardone" style="width:46px">46.7</div></div></td><td>Theodoros Vakkas, Ioannis Tsimpiris, Evripidis Argyropoulos, Mike Pegnigiannis, Nikos Ves</td></tr>
++<tr><td><img src="qrc:/images/flags/sr.png"></td><td>Serbian</td><td><div title="finished:6002 unfinished:27 untranslated:7226" class="bartodo"><div class="bardone" style="width:45px">45.4</div></div></td><td>Goran Ivanković</td></tr>
++<tr><td><img src="qrc:/images/flags/ca.png"></td><td>Catalan</td><td><div title="finished:5151 unfinished:25 untranslated:8079" class="bartodo"><div class="bardone" style="width:38px">39.0</div></div></td><td>Albert F, Pau Reguant Ridó, Xavier Roijals</td></tr>
++<tr><td><img src="qrc:/images/flags/th.png"></td><td>Thai</td><td><div title="finished:5071 unfinished:27 untranslated:8157" class="bartodo"><div class="bardone" style="width:38px">38.4</div></div></td><td>Man Chao</td></tr>
++<tr><td><img src="qrc:/images/flags/fa.png"></td><td>Persian</td><td><div title="finished:5037 unfinished:32 untranslated:8186" class="bartodo"><div class="bardone" style="width:38px">38.1</div></div></td><td>Mola Pahnadayan, Masoud Pashotan , Masoud Erfanyan</td></tr>
++<tr><td><img src="qrc:/images/flags/is.png"></td><td>Icelandic</td><td><div title="finished:4917 unfinished:28 untranslated:8310" class="bartodo"><div class="bardone" style="width:37px">37.2</div></div></td><td>Ásta Kristín Óladóttir, Thordur Ivarsson</td></tr>
++<tr><td><img src="qrc:/images/flags/uk.png"></td><td>Ukrainian</td><td><div title="finished:4836 unfinished:21 untranslated:8398" class="bartodo"><div class="bardone" style="width:36px">36.6</div></div></td><td>Alexander Bruy</td></tr>
++<tr><td><img src="qrc:/images/flags/mn.png"></td><td>Mongolian</td><td><div title="finished:4632 unfinished:19 untranslated:8604" class="bartodo"><div class="bardone" style="width:35px">35.0</div></div></td><td>Bayarmaa Enkhtur</td></tr></table>
+--- a/i18n/qgis_de.ts
++++ b/i18n/qgis_de.ts
+@@ -3193,6 +3193,45 @@ Soll wirklich fortgefahren werden?</tran
+     </message>
+ </context>
+ <context>
++    <name>DinfDistDownMulti</name>
++    <message>
++        <source>D-Infinity Flow Direction Grid</source>
++        <translation>D-Infinity Fliessrichtung Raster</translation>
++    </message>
++    <message>
++        <source>Pit Filled Elevation Grid</source>
++        <translation>Höhengitter mit gefüllten Löchern</translation>
++    </message>
++    <message>
++        <source>Stream Raster Grid</source>
++        <translation>Stromrastergitter</translation>
++    </message>
++    <message>
++        <source>Weight Path Grid</source>
++        <translation>Pfadgewichtungsgitter</translation>
++    </message>
++    <message>
++        <source>Statistical Method</source>
++        <translation>Statistische Methode</translation>
++    </message>
++    <message>
++        <source>Distance Method</source>
++        <translation>Distanz Methode</translation>
++    </message>
++    <message>
++        <source>Check for edge contamination</source>
++        <translation>Kantenverunreinigung prüfen</translation>
++    </message>
++    <message>
++        <source>D-Infinity Drop to Stream Grid</source>
++        <translation>D-Infinity Sende and Strom Gitter</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>DinfDistUp</name>
+     <message>
+         <source>D-Infinity Flow Direction Grid</source>
+@@ -3232,6 +3271,45 @@ Soll wirklich fortgefahren werden?</tran
+     </message>
+ </context>
+ <context>
++    <name>DinfDistUpMulti</name>
++    <message>
++        <source>D-Infinity Flow Direction Grid</source>
++        <translation>D-Infinity Fliessrichtung Raster</translation>
++    </message>
++    <message>
++        <source>Pit Filled Elevation Grid</source>
++        <translation>Höhengitter mit gefüllten Löchern</translation>
++    </message>
++    <message>
++        <source>Slope Grid</source>
++        <translation>Neigungsgitter</translation>
++    </message>
++    <message>
++        <source>Statistical Method</source>
++        <translation>Statistische Methode</translation>
++    </message>
++    <message>
++        <source>Distance Method</source>
++        <translation>Distanz Methode</translation>
++    </message>
++    <message>
++        <source>Proportion Threshold</source>
++        <translation>Anteils Schwellenwert</translation>
++    </message>
++    <message>
++        <source>Check for edge contamination</source>
++        <translation>Kantenverunreinigung prüfen</translation>
++    </message>
++    <message>
++        <source>D-Infinity Distance Up</source>
++        <translation>D-Infinity Entfernung hoch</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>DinfTransLimAccum</name>
+     <message>
+         <source>D-Infinity Flow Direction Grid</source>
+@@ -3310,6 +3388,84 @@ Soll wirklich fortgefahren werden?</tran
+     </message>
+ </context>
+ <context>
++    <name>DinfTransLimAccum2Multi</name>
++    <message>
++        <source>D-Infinity Flow Direction Grid</source>
++        <translation>D-Infinity Fliessrichtung Raster</translation>
++    </message>
++    <message>
++        <source>Supply Grid</source>
++        <translation>Versorgungsnetz</translation>
++    </message>
++    <message>
++        <source>Transport Capacity Grid</source>
++        <translation>Transportkapazitätsgitter</translation>
++    </message>
++    <message>
++        <source>Input Concentration Grid</source>
++        <translation>Eingangs Konzentrationsgitter</translation>
++    </message>
++    <message>
++        <source>Outlets Shapefile</source>
++        <translation>Auslaß-Shapedatei</translation>
++    </message>
++    <message>
++        <source>Check for edge contamination</source>
++        <translation>Kantenverunreinigung prüfen</translation>
++    </message>
++    <message>
++        <source>Transport Limited Accumulation Grid</source>
++        <translation>Transportbegrenztes Akkumulations Gitter</translation>
++    </message>
++    <message>
++        <source>Deposition Grid</source>
++        <translation>Ablagerungs Raster</translation>
++    </message>
++    <message>
++        <source>Output Concentration Grid</source>
++        <translation>Ausgangs Konzentrationsgitter</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
++    <name>DinfTransLimAccumMulti</name>
++    <message>
++        <source>D-Infinity Flow Direction Grid</source>
++        <translation>D-Infinity Fliessrichtung Raster</translation>
++    </message>
++    <message>
++        <source>Supply Grid</source>
++        <translation>Versorgungsnetz</translation>
++    </message>
++    <message>
++        <source>Transport Capacity Grid</source>
++        <translation>Transportkapazitätsgitter</translation>
++    </message>
++    <message>
++        <source>Outlets Shapefile</source>
++        <translation>Auslaß-Shapedatei</translation>
++    </message>
++    <message>
++        <source>Check for edge contamination</source>
++        <translation>Kantenverunreinigung prüfen</translation>
++    </message>
++    <message>
++        <source>Transport Limited Accumulation Grid</source>
++        <translation>Transportbegrenztes Akkumulations Gitter</translation>
++    </message>
++    <message>
++        <source>Deposition Grid</source>
++        <translation>Ablagerungs Raster</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>Dissolve</name>
+     <message>
+         <source>Geometry exception while dissolving</source>
+@@ -3945,6 +4101,53 @@ Geometriespate - Spalte mit eindeutigen
+     </message>
+ </context>
+ <context>
++    <name>DropAnalysisMulti</name>
++    <message>
++        <source>D8 Contributing Area Grid</source>
++        <translation>D8 beitragende Fläche Raster</translation>
++    </message>
++    <message>
++        <source>D8 Flow Direction Grid</source>
++        <translation>D8 Fliessrichtung Raster</translation>
++    </message>
++    <message>
++        <source>Pit Filled Elevation Grid</source>
++        <translation>Höhengitter mit gefüllten Löchern</translation>
++    </message>
++    <message>
++        <source>Accumulated Stream Source Grid</source>
++        <translation>Kumuliertes Fluss Quellennetz</translation>
++    </message>
++    <message>
++        <source>Outlets Shapefile</source>
++        <translation>Auslaß-Shapedatei</translation>
++    </message>
++    <message>
++        <source>Minimum Threshold</source>
++        <translation>Minimum Schwellenwert</translation>
++    </message>
++    <message>
++        <source>Maximum Threshold</source>
++        <translation>Maximum Schwellenwert</translation>
++    </message>
++    <message>
++        <source>Number of Threshold Values</source>
++        <translation>Anzahl der Schwellenwerte</translation>
++    </message>
++    <message>
++        <source>Spacing for Threshold Values</source>
++        <translation>Abstand für Schwellenwerte</translation>
++    </message>
++    <message>
++        <source>D-Infinity Drop to Stream Grid</source>
++        <translation>D-Infinity Sende and Strom Gitter</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>EditModelAction</name>
+     <message>
+         <source>Edit model</source>
+@@ -7066,6 +7269,41 @@ Bitte installieren bevor GRASS-Algorithm
+     </message>
+ </context>
+ <context>
++    <name>GridNetMulti</name>
++    <message>
++        <source>D8 Flow Direction Grid</source>
++        <translation>D8 Fliessrichtung Raster</translation>
++    </message>
++    <message>
++        <source>Outlets Shapefile</source>
++        <translation>Auslaß-Shapedatei</translation>
++    </message>
++    <message>
++        <source>Mask Grid</source>
++        <translation>Maskengitter</translation>
++    </message>
++    <message>
++        <source>Mask Threshold</source>
++        <translation>Maskenschwellenwert</translation>
++    </message>
++    <message>
++        <source>Longest Upslope Length Grid</source>
++        <translation>Längstes Steigungslängen Gitter</translation>
++    </message>
++    <message>
++        <source>Total Upslope Length Grid</source>
++        <translation>Gesamt Steigungslängen Gitter</translation>
++    </message>
++    <message>
++        <source>Strahler Network Order Grid</source>
++        <translation>Strahler Netzwerk Ordnungs Raster</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>GridSurfaceCreate</name>
+     <message>
+         <source>Input las layer</source>
+@@ -7901,6 +8139,33 @@ Bitte vor der Ausführung von LAStools-A
+     </message>
+ </context>
+ <context>
++    <name>LengthAreaMulti</name>
++    <message>
++        <source>Length Grid</source>
++        <translation>Längengitter</translation>
++    </message>
++    <message>
++        <source>Contributing Area Grid</source>
++        <translation>Beitragende Fläche Raster</translation>
++    </message>
++    <message>
++        <source>Threshold</source>
++        <translation>Schwelle</translation>
++    </message>
++    <message>
++        <source>Exponent</source>
++        <translation>Exponent</translation>
++    </message>
++    <message>
++        <source>Stream Source Grid</source>
++        <translation>Strom Quellennetz</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>LidarToolsAlgorithmProvider</name>
+     <message>
+         <source>LAStools folder</source>
+@@ -10595,6 +10860,33 @@ Bitte die Processing-Einstellung überpr
+     </message>
+ </context>
+ <context>
++    <name>PeukerDouglasMulti</name>
++    <message>
++        <source>Elevation Grid</source>
++        <translation>Höhen Raster</translation>
++    </message>
++    <message>
++        <source>Center Smoothing Weight</source>
++        <translation>Glättungsgewichtung Mitte</translation>
++    </message>
++    <message>
++        <source>Side Smoothing Weight</source>
++        <translation>Seitenglättungsgewichtung</translation>
++    </message>
++    <message>
++        <source>Diagonal Smoothing Weight</source>
++        <translation>Diagonale Glättungsgewichtung</translation>
++    </message>
++    <message>
++        <source>Stream Source Grid</source>
++        <translation>Strom Quellennetz</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>PointDistance</name>
+     <message>
+         <source>Input point layer</source>
+@@ -16641,7 +16933,7 @@ Ausdruckfehler:
+     </message>
+     <message>
+         <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4</source>
+-        <translation>Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4</translation>
++        <translation type="obsolete">Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4</translation>
+     </message>
+     <message>
+         <source>Update Filtered</source>
+@@ -16689,6 +16981,18 @@ Ausdruckfehler:
+         <source>Update Selected</source>
+         <translation>Gewählte aktualisieren</translation>
+     </message>
++    <message>
++        <source>Show All Features In Initial Canvas Extent</source>
++        <translation>Alle Objekte im anfänglichen Kartenausschnitt zeigen</translation>
++    </message>
++    <message>
++        <source>Attribute table - %1 :: Features total: %2, filtered: %3, selected: %4%5</source>
++        <translation>Attributtabelle - %1 :: Objekte gesamt: %2, gefiltert: %3, gewählt: %4%5</translation>
++    </message>
++    <message>
++        <source>, spatially limited</source>
++        <translation>, räumlich beschränkt</translation>
++    </message>
+ </context>
+ <context>
+     <name>QgsAttributeTableModel</name>
+@@ -50315,6 +50619,33 @@ Fehler in Zeile %d</translation>
+     </message>
+ </context>
+ <context>
++    <name>SlopeAreaMulti</name>
++    <message>
++        <source>Slope Grid</source>
++        <translation>Neigungsgitter</translation>
++    </message>
++    <message>
++        <source>Contributing Area Grid</source>
++        <translation>Beitragende Fläche Raster</translation>
++    </message>
++    <message>
++        <source>Slope Exponent</source>
++        <translation>Neigungs Exponent</translation>
++    </message>
++    <message>
++        <source>Area Exponent</source>
++        <translation>Flächen Exponent</translation>
++    </message>
++    <message>
++        <source>Slope Area Grid</source>
++        <translation>Neigungsflächen Raster</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
++</context>
++<context>
+     <name>SpatialJoin</name>
+     <message>
+         <source>Target vector layer</source>
+@@ -50534,6 +50865,37 @@ Fehler in Zeile %d</translation>
+         <source>TauDEM (hydrologic analysis)</source>
+         <translation>TauDEM (hydrologische Analyse)</translation>
+     </message>
++    <message>
++        <source>TauDEM multifile command line tools folder</source>
++        <translation>TauDEM-Mehrdateibefehlszeilenwerkzeugverzeichnis</translation>
++    </message>
++    <message>
++        <source>Enable singlefile TauDEM tools</source>
++        <translation>TauDEM-Einzeldateiwerkzeuge aktivieren</translation>
++    </message>
++    <message>
++        <source>Enable multifile TauDEM tools</source>
++        <translation>TauDEM-Mehrdateiwerkzeuge aktivieren</translation>
++    </message>
++    <message>
++        <source>Could not open TauDEM algorithm %s:
++%s</source>
++        <translation>Konnte TauDEM-Algorithmus nicht öffnen: %s:
++%s</translation>
++    </message>
++</context>
++<context>
++    <name>TauDEMMultifileAlgorithm</name>
++    <message>
++        <source>Could not load TauDEM algorithm: %s
++%s</source>
++        <translation>Konnte TauDEM-Algorithmus nicht laden: %s
++%s</translation>
++    </message>
++    <message>
++        <source>Wrong number of MPI processes used. Please set correct number before running TauDEM algorithms.</source>
++        <translation>Falsche Anzahl von MPI-Prozessen verwendet. Bitte vor der Ausführung von TauDEM-Algorithmen korrekte Anzahl einstellen.</translation>
++    </message>
+ </context>
+ <context>
+     <name>TauDEMUtils</name>
diff --git a/debian/patches/0001-postgres-provider-also-cast-field-expressions-to-tex.patch b/debian/patches/0001-postgres-provider-also-cast-field-expressions-to-tex.patch
new file mode 100644
index 0000000..6cd2742
--- /dev/null
+++ b/debian/patches/0001-postgres-provider-also-cast-field-expressions-to-tex.patch
@@ -0,0 +1,47 @@
+From f04c40c28330708e394f598f27c26bf0e78dea7c Mon Sep 17 00:00:00 2001
+From: "Juergen E. Fischer" <jef at norbit.de>
+Date: Tue, 10 Mar 2015 09:01:51 +0100
+Subject: postgres provider: also cast field expressions to text (fixes
+ #12346)
+Bug: http://hub.qgis.org/issues/12346
+Origin: https://github.com/qgis/QGIS/commit/f04c40c28330708e394f598f27c26bf0e78dea7c
+
+(cherry picked from commit 1acad42f48dcf7ce31512356c8dd609292f22899)
+---
+ src/providers/postgres/qgspostgresconn.cpp     |    6 +++---
+ src/providers/postgres/qgspostgresprovider.cpp |    3 +--
+ 2 files changed, 4 insertions(+), 5 deletions(-)
+
+--- a/src/providers/postgres/qgspostgresconn.cpp
++++ b/src/providers/postgres/qgspostgresconn.cpp
+@@ -1183,15 +1183,15 @@ QString QgsPostgresConn::fieldExpression
+   expr = expr.arg( quotedIdentifier( fld.name() ) );
+   if ( type == "money" )
+   {
+-    return QString( "cash_out(%1)" ).arg( expr );
++    return QString( "cash_out(%1)::text" ).arg( expr );
+   }
+   else if ( type.startsWith( "_" ) )
+   {
+-    return QString( "array_out(%1)" ).arg( expr );
++    return QString( "array_out(%1)::text" ).arg( expr );
+   }
+   else if ( type == "bool" )
+   {
+-    return QString( "boolout(%1)" ).arg( expr );
++    return QString( "boolout(%1)::text" ).arg( expr );
+   }
+   else if ( type == "geometry" )
+   {
+--- a/src/providers/postgres/qgspostgresprovider.cpp
++++ b/src/providers/postgres/qgspostgresprovider.cpp
+@@ -1270,8 +1270,7 @@ void QgsPostgresProvider::uniqueValues(
+       sql += QString( " WHERE %1" ).arg( mSqlWhereClause );
+     }
+ 
+-    sql +=  QString( " ORDER BY %1" )
+-            .arg( quotedIdentifier( fld.name() ) );
++    sql +=  QString( " ORDER BY %1" ).arg( connectionRO()->fieldExpression( fld ) );
+ 
+     if ( limit >= 0 )
+     {
diff --git a/debian/patches/0001-processing-TauDEM-provider-overhaul.patch b/debian/patches/0001-processing-TauDEM-provider-overhaul.patch
new file mode 100644
index 0000000..9380668
--- /dev/null
+++ b/debian/patches/0001-processing-TauDEM-provider-overhaul.patch
@@ -0,0 +1,2210 @@
+From 0b1a67bdbf9259975a0111f4b3f3d4d3e88afd3d Mon Sep 17 00:00:00 2001
+From: Alexander Bruy <alexander.bruy at gmail.com>
+Date: Mon, 2 Mar 2015 19:27:02 +0200
+Subject: [processing] TauDEM provider overhaul
+Origin: https://github.com/qgis/QGIS/commit/0b1a67bdbf9259975a0111f4b3f3d4d3e88afd3d
+
+ - add new TauDEM 5.1.2/5.2 tools: Gage watershed, TWI and Select GT
+   Threshold
+ - implement support for multifile TauDEM version
+ - allow to use single- and multifile versions simultaneously
+
+Work done for Faunalia (http://faunalia.eu)
+
+(cherry-picked from 427adf79bb975fd436e69d2120d1261081eb4687)
+---
+ .../plugins/processing/algs/taudem/CMakeLists.txt  |    6 +-
+ .../processing/algs/taudem/TauDEMAlgorithm.py      |    5 +-
+ .../algs/taudem/TauDEMAlgorithmProvider.py         |  113 ++++++++++++-----
+ .../algs/taudem/TauDEMMultifileAlgorithm.py        |  122 +++++++++++++++++++
+ .../plugins/processing/algs/taudem/TauDEMUtils.py  |   28 ++++-
+ .../processing/algs/taudem/description/aread8.txt  |    8 --
+ .../algs/taudem/description/areadinf.txt           |    8 --
+ .../algs/taudem/description/d8flowdir.txt          |    6 -
+ .../taudem/description/d8flowpathextremeup.txt     |    9 --
+ .../algs/taudem/description/d8hdisttostrm.txt      |    7 --
+ .../algs/taudem/description/dinfavalanche.txt      |   11 --
+ .../algs/taudem/description/dinfconclimaccum.txt   |   11 --
+ .../algs/taudem/description/dinfdecayaccum.txt     |    9 --
+ .../algs/taudem/description/dinfflowdir.txt        |    6 -
+ .../algs/taudem/description/dinfrevaccum.txt       |    7 --
+ .../algs/taudem/description/dinfupdependence.txt   |    6 -
+ .../algs/taudem/description/moveoutletstostrm.txt  |    8 --
+ .../algs/taudem/description/multi/aread8.txt       |    8 ++
+ .../algs/taudem/description/multi/areadinf.txt     |    8 ++
+ .../algs/taudem/description/multi/d8flowdir.txt    |    6 +
+ .../description/multi/d8flowpathextremeup.txt      |    9 ++
+ .../taudem/description/multi/d8hdisttostrm.txt     |    7 ++
+ .../taudem/description/multi/dinfavalanche.txt     |   11 ++
+ .../taudem/description/multi/dinfconclimaccum.txt  |   11 ++
+ .../taudem/description/multi/dinfdecayaccum.txt    |    9 ++
+ .../algs/taudem/description/multi/dinfflowdir.txt  |    6 +
+ .../algs/taudem/description/multi/dinfrevaccum.txt |    7 ++
+ .../taudem/description/multi/dinfupdependence.txt  |    6 +
+ .../taudem/description/multi/gagewatershed.txt     |    6 +
+ .../taudem/description/multi/gagewatershed2.txt    |    7 ++
+ .../taudem/description/multi/moveoutletstostrm.txt |    8 ++
+ .../algs/taudem/description/multi/pitremove.txt    |    5 +
+ .../taudem/description/multi/selectgtthreshold.txt |    6 +
+ .../taudem/description/multi/slopearearatio.txt    |    6 +
+ .../algs/taudem/description/multi/slopeavedown.txt |    7 ++
+ .../algs/taudem/description/multi/streamnet.txt    |   14 +++
+ .../algs/taudem/description/multi/threshold.txt    |    7 ++
+ .../algs/taudem/description/multi/twi.txt          |    6 +
+ .../algs/taudem/description/pitremove.txt          |    5 -
+ .../algs/taudem/description/single/aread8.txt      |    8 ++
+ .../algs/taudem/description/single/areadinf.txt    |    8 ++
+ .../algs/taudem/description/single/d8flowdir.txt   |    6 +
+ .../description/single/d8flowpathextremeup.txt     |    9 ++
+ .../taudem/description/single/d8hdisttostrm.txt    |    7 ++
+ .../taudem/description/single/dinfavalanche.txt    |   11 ++
+ .../taudem/description/single/dinfconclimaccum.txt |   11 ++
+ .../taudem/description/single/dinfdecayaccum.txt   |    9 ++
+ .../algs/taudem/description/single/dinfflowdir.txt |    6 +
+ .../taudem/description/single/dinfrevaccum.txt     |    7 ++
+ .../taudem/description/single/dinfupdependence.txt |    6 +
+ .../taudem/description/single/gagewatershed.txt    |    6 +
+ .../taudem/description/single/gagewatershed2.txt   |    7 ++
+ .../description/single/moveoutletstostrm.txt       |    8 ++
+ .../algs/taudem/description/single/pitremove.txt   |    5 +
+ .../description/single/selectgtthreshold.txt       |    6 +
+ .../taudem/description/single/slopearearatio.txt   |    6 +
+ .../taudem/description/single/slopeavedown.txt     |    7 ++
+ .../algs/taudem/description/single/streamnet.txt   |   14 +++
+ .../algs/taudem/description/single/threshold.txt   |    7 ++
+ .../algs/taudem/description/single/twi.txt         |    6 +
+ .../algs/taudem/description/slopearearatio.txt     |    6 -
+ .../algs/taudem/description/slopeavedown.txt       |    7 --
+ .../algs/taudem/description/streamnet.txt          |   14 ---
+ .../algs/taudem/description/threshold.txt          |    7 --
+ .../processing/algs/taudem/dinfdistdown_multi.py   |  127 ++++++++++++++++++++
+ .../processing/algs/taudem/dinfdistup_multi.py     |  124 +++++++++++++++++++
+ .../algs/taudem/dinftranslimaccum2_multi.py        |  122 +++++++++++++++++++
+ .../algs/taudem/dinftranslimaccum_multi.py         |  114 ++++++++++++++++++
+ .../processing/algs/taudem/dropanalysis_multi.py   |  124 +++++++++++++++++++
+ .../processing/algs/taudem/gridnet_multi.py        |  114 ++++++++++++++++++
+ .../processing/algs/taudem/lengtharea_multi.py     |   96 +++++++++++++++
+ .../processing/algs/taudem/peukerdouglas_multi.py  |   94 +++++++++++++++
+ .../processing/algs/taudem/slopearea_multi.py      |   96 +++++++++++++++
+ 73 files changed, 1567 insertions(+), 173 deletions(-)
+ create mode 100644 python/plugins/processing/algs/taudem/TauDEMMultifileAlgorithm.py
+ delete mode 100644 python/plugins/processing/algs/taudem/description/aread8.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/areadinf.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/d8flowdir.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/d8hdisttostrm.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/dinfavalanche.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/dinfconclimaccum.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/dinfdecayaccum.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/dinfflowdir.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/dinfrevaccum.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/dinfupdependence.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/aread8.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/areadinf.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/d8flowdir.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/d8flowpathextremeup.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/d8hdisttostrm.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/dinfavalanche.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/dinfconclimaccum.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/dinfdecayaccum.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/dinfflowdir.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/dinfrevaccum.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/dinfupdependence.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/gagewatershed.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/gagewatershed2.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/moveoutletstostrm.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/pitremove.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/selectgtthreshold.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/slopearearatio.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/slopeavedown.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/streamnet.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/threshold.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/multi/twi.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/pitremove.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/aread8.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/areadinf.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/d8flowdir.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/d8flowpathextremeup.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/d8hdisttostrm.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/dinfavalanche.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/dinfconclimaccum.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/dinfdecayaccum.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/dinfflowdir.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/dinfrevaccum.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/dinfupdependence.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/gagewatershed.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/gagewatershed2.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/moveoutletstostrm.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/pitremove.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/selectgtthreshold.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/slopearearatio.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/slopeavedown.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/streamnet.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/threshold.txt
+ create mode 100644 python/plugins/processing/algs/taudem/description/single/twi.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/slopearearatio.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/slopeavedown.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/streamnet.txt
+ delete mode 100644 python/plugins/processing/algs/taudem/description/threshold.txt
+ create mode 100644 python/plugins/processing/algs/taudem/dinfdistdown_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/dinfdistup_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/dropanalysis_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/gridnet_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/lengtharea_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/peukerdouglas_multi.py
+ create mode 100644 python/plugins/processing/algs/taudem/slopearea_multi.py
+
+--- a/python/plugins/processing/algs/taudem/CMakeLists.txt
++++ b/python/plugins/processing/algs/taudem/CMakeLists.txt
+@@ -1,5 +1,7 @@
+ FILE(GLOB PY_FILES *.py)
+-FILE(GLOB DESCR_FILES description/*.txt)
++FILE(GLOB SINGLE_DESCR_FILES description/single/*.txt)
++FILE(GLOB MULTI_DESCR_FILES description/multi/*.txt)
+ 
+ PLUGIN_INSTALL(processing algs/taudem ${PY_FILES})
+-PLUGIN_INSTALL(processing algs/taudem/description ${DESCR_FILES})
++PLUGIN_INSTALL(processing algs/taudem/description/single ${SINGLE_DESCR_FILES})
++PLUGIN_INSTALL(processing algs/taudem/description/multi ${MULTI_DESCR_FILES})
+--- a/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
++++ b/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
+@@ -27,18 +27,21 @@ __revision__ = '$Format:%H$'
+ 
+ import os
+ from PyQt4.QtGui import QIcon
++
+ from processing.core.GeoAlgorithm import GeoAlgorithm
+ from processing.core.ProcessingLog import ProcessingLog
+ from processing.core.ProcessingConfig import ProcessingConfig
+ from processing.core.GeoAlgorithmExecutionException import \
+     GeoAlgorithmExecutionException
+-from processing.core.parameters import getParameterFromString
++
+ from processing.core.parameters import ParameterRaster
+ from processing.core.parameters import ParameterVector
+ from processing.core.parameters import ParameterBoolean
+ from processing.core.parameters import ParameterString
+ from processing.core.parameters import ParameterNumber
++from processing.core.parameters import getParameterFromString
+ from processing.core.outputs import getOutputFromString
++
+ from TauDEMUtils import TauDEMUtils
+ 
+ 
+--- a/python/plugins/processing/algs/taudem/TauDEMAlgorithmProvider.py
++++ b/python/plugins/processing/algs/taudem/TauDEMAlgorithmProvider.py
+@@ -30,11 +30,13 @@ import os
+ from PyQt4.QtGui import QIcon
+ 
+ from processing.core.AlgorithmProvider import AlgorithmProvider
+-from processing.core.ProcessingConfig import ProcessingConfig
+-from processing.core.ProcessingConfig import Setting
++from processing.core.ProcessingConfig import ProcessingConfig, Setting
+ from processing.core.ProcessingLog import ProcessingLog
++
+ from TauDEMAlgorithm import TauDEMAlgorithm
++from TauDEMMultifileAlgorithm import TauDEMMultifileAlgorithm
+ from TauDEMUtils import TauDEMUtils
++
+ from peukerdouglas import PeukerDouglas
+ from slopearea import SlopeArea
+ from lengtharea import LengthArea
+@@ -45,13 +47,22 @@ from gridnet import GridNet
+ from dinftranslimaccum import DinfTransLimAccum
+ from dinftranslimaccum2 import DinfTransLimAccum2
+ 
++from peukerdouglas_multi import PeukerDouglasMulti
++from slopearea_multi import SlopeAreaMulti
++from lengtharea_multi import LengthAreaMulti
++from dropanalysis_multi import DropAnalysisMulti
++from dinfdistdown_multi import DinfDistDownMulti
++from dinfdistup_multi import DinfDistUpMulti
++from gridnet_multi import GridNetMulti
++from dinftranslimaccum_multi import DinfTransLimAccumMulti
++from dinftranslimaccum2_multi import DinfTransLimAccum2Multi
++
+ 
+ class TauDEMAlgorithmProvider(AlgorithmProvider):
+ 
+     def __init__(self):
+         AlgorithmProvider.__init__(self)
+         self.activate = False
+-        self.createAlgsList()
+ 
+     def getDescription(self):
+         return self.tr('TauDEM (hydrologic analysis)')
+@@ -64,11 +75,22 @@ class TauDEMAlgorithmProvider(AlgorithmP
+ 
+     def initializeSettings(self):
+         AlgorithmProvider.initializeSettings(self)
++
+         ProcessingConfig.addSetting(Setting(self.getDescription(),
+             TauDEMUtils.TAUDEM_FOLDER,
+             self.tr('TauDEM command line tools folder'),
+             TauDEMUtils.taudemPath()))
+         ProcessingConfig.addSetting(Setting(self.getDescription(),
++            TauDEMUtils.TAUDEM_MULTIFILE_FOLDER,
++            self.tr('TauDEM multifile command line tools folder'),
++            TauDEMUtils.taudemMultifilePath()))
++        ProcessingConfig.addSetting(Setting(self.getDescription(),
++            TauDEMUtils.TAUDEM_USE_SINGLEFILE,
++            self.tr('Enable singlefile TauDEM tools'), True))
++        ProcessingConfig.addSetting(Setting(self.getDescription(),
++            TauDEMUtils.TAUDEM_USE_MULTIFILE,
++            self.tr('Enable multifile TauDEM tools'), False))
++        ProcessingConfig.addSetting(Setting(self.getDescription(),
+             TauDEMUtils.MPIEXEC_FOLDER,
+             self.tr('MPICH2/OpenMPI bin directory'),
+             TauDEMUtils.mpiexecPath()))
+@@ -78,36 +100,65 @@ class TauDEMAlgorithmProvider(AlgorithmP
+ 
+     def unload(self):
+         AlgorithmProvider.unload(self)
++
+         ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_FOLDER)
++        ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_MULTIFILE_FOLDER)
++        ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_USE_SINGLEFILE)
++        ProcessingConfig.removeSetting(TauDEMUtils.TAUDEM_USE_MULTIFILE)
+         ProcessingConfig.removeSetting(TauDEMUtils.MPIEXEC_FOLDER)
+         ProcessingConfig.removeSetting(TauDEMUtils.MPI_PROCESSES)
+ 
+     def _loadAlgorithms(self):
+-        self.algs = self.preloadedAlgs
++        self.algs = []
++        basePath = TauDEMUtils.taudemDescriptionPath()
++
++        if ProcessingConfig.getSetting(TauDEMUtils.TAUDEM_USE_SINGLEFILE):
++            folder = os.path.join(basePath, 'single')
+ 
+-    def createAlgsList(self):
+-        self.preloadedAlgs = []
+-        folder = TauDEMUtils.taudemDescriptionPath()
+-        for descriptionFile in os.listdir(folder):
+-            if descriptionFile.endswith('txt'):
+-                try:
+-                    alg = TauDEMAlgorithm(os.path.join(folder,
+-                            descriptionFile))
+-                    if alg.name.strip() != '':
+-                        self.preloadedAlgs.append(alg)
+-                    else:
+-                        ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
+-                            self.tr('Could not open TauDEM algorithm: %s' % descriptionFile))
+-                except Exception, e:
+-                    ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
+-                        self.tr('Could not open TauDEM algorithm: %s' % descriptionFile))
+-
+-        self.preloadedAlgs.append(PeukerDouglas())
+-        self.preloadedAlgs.append(SlopeArea())
+-        self.preloadedAlgs.append(LengthArea())
+-        self.preloadedAlgs.append(DropAnalysis())
+-        self.preloadedAlgs.append(DinfDistDown())
+-        self.preloadedAlgs.append(DinfDistUp())
+-        self.preloadedAlgs.append(GridNet())
+-        self.preloadedAlgs.append(DinfTransLimAccum())
+-        self.preloadedAlgs.append(DinfTransLimAccum2())
++            for descriptionFile in os.listdir(folder):
++                if descriptionFile.endswith('txt'):
++                    descriptionFile = os.path.join(folder, descriptionFile)
++                    self._algFromDescription(descriptionFile)
++
++            self.algs.append(PeukerDouglas())
++            self.algs.append(SlopeArea())
++            self.algs.append(LengthArea())
++            self.algs.append(DropAnalysis())
++            self.algs.append(DinfDistDown())
++            self.algs.append(DinfDistUp())
++            self.algs.append(GridNet())
++            self.algs.append(DinfTransLimAccum())
++            self.algs.append(DinfTransLimAccum2())
++
++        if ProcessingConfig.getSetting(TauDEMUtils.TAUDEM_USE_MULTIFILE):
++            folder = os.path.join(basePath, 'multi')
++
++            for descriptionFile in os.listdir(folder):
++                if descriptionFile.endswith('txt'):
++                    descriptionFile = os.path.join(folder, descriptionFile)
++                    self._algFromDescription(descriptionFile, True)
++
++            self.algs.append(PeukerDouglasMulti())
++            self.algs.append(SlopeAreaMulti())
++            self.algs.append(LengthAreaMulti())
++            self.algs.append(DropAnalysisMulti())
++            self.algs.append(DinfDistDownMulti())
++            self.algs.append(DinfDistUpMulti())
++            self.algs.append(GridNetMulti())
++            self.algs.append(DinfTransLimAccumMulti())
++            self.algs.append(DinfTransLimAccum2Multi())
++
++    def _algFromDescription(self, descriptionFile, multifile=False):
++        try:
++            if multifile:
++                alg = TauDEMMultifileAlgorithm(descriptionFile)
++            else:
++                alg = TauDEMAlgorithm(descriptionFile)
++            if alg.name.strip() != '':
++                self.algs.append(alg)
++            else:
++                ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
++                    self.tr('Could not open TauDEM algorithm: %s' % descriptionFile))
++        except Exception, e:
++            ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
++                self.tr('Could not open TauDEM algorithm %s:\n%s' % (descriptionFile, str(e))))
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/TauDEMMultifileAlgorithm.py
+@@ -0,0 +1,122 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    TauDEMMultifileAlgorithm.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2012 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingLog import ProcessingLog
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterVector
++from processing.core.parameters import ParameterBoolean
++from processing.core.parameters import ParameterString
++from processing.core.parameters import ParameterNumber
++from processing.core.parameters import getParameterFromString
++from processing.core.outputs import getOutputFromString
++
++from TauDEMUtils import TauDEMUtils
++
++
++class TauDEMMultifileAlgorithm(GeoAlgorithm):
++
++    def __init__(self, descriptionfile):
++        GeoAlgorithm.__init__(self)
++        self.descriptionFile = descriptionfile
++        self.defineCharacteristicsFromFile()
++
++    def getCopy(self):
++        newone = TauDEMMultifileAlgorithm(self.descriptionFile)
++        newone.provider = self.provider
++        return newone
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristicsFromFile(self):
++        lines = open(self.descriptionFile)
++        line = lines.readline().strip('\n').strip()
++        self.name = line
++        line = lines.readline().strip('\n').strip()
++        self.cmdName = line
++        line = lines.readline().strip('\n').strip()
++        self.group = line
++
++        line = lines.readline().strip('\n').strip()
++        while line != '':
++            try:
++                line = line.strip('\n').strip()
++                if line.startswith('Parameter'):
++                    param = getParameterFromString(line)
++                    self.addParameter(param)
++                else:
++                    self.addOutput(getOutputFromString(line))
++                line = lines.readline().strip('\n').strip()
++            except Exception, e:
++                ProcessingLog.addToLog(ProcessingLog.LOG_ERROR,
++                    self.tr('Could not load TauDEM algorithm: %s\n%s' % (self.descriptionFile, line)))
++                raise e
++        lines.close()
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = int(ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES))
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++
++        for param in self.parameters:
++            if param.value is None or param.value == '':
++                continue
++            if isinstance(param, ParameterNumber):
++                commands.append(param.name)
++                commands.append(str(param.value))
++            if isinstance(param, (ParameterFile, ParameterVector)):
++                commands.append(param.name)
++                commands.append(param.value)
++            elif isinstance(param, ParameterBoolean):
++                if param.value and str(param.value).lower() == 'false':
++                    commands.append(param.name)
++            elif isinstance(param, ParameterString):
++                commands.append(param.name)
++                commands.append(str(param.value))
++
++        for out in self.outputs:
++            commands.append(out.name)
++            commands.append(out.value)
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- a/python/plugins/processing/algs/taudem/TauDEMUtils.py
++++ b/python/plugins/processing/algs/taudem/TauDEMUtils.py
+@@ -26,18 +26,22 @@ __copyright__ = '(C) 2012, Alexander Bru
+ __revision__ = '$Format:%H$'
+ 
+ import os
+-from qgis.core import QgsApplication
+ import subprocess
+ 
++from PyQt4.QtCore import QCoreApplication
++from qgis.core import QgsApplication
++
+ from processing.core.ProcessingConfig import ProcessingConfig
+ from processing.core.ProcessingLog import ProcessingLog
+ from processing.tools.system import isMac
+-from PyQt4.QtCore import QCoreApplication
+ 
+ 
+ class TauDEMUtils:
+ 
+     TAUDEM_FOLDER = 'TAUDEM_FOLDER'
++    TAUDEM_MULTIFILE_FOLDER = 'TAUDEM_MULTIFILE_FOLDER'
++    TAUDEM_USE_SINGLEFILE = 'TAUDEM_USE_SINGLEFILE'
++    TAUDEM_USE_MULTIFILE = 'TAUDEM_USE_MULTIFILE'
+     MPIEXEC_FOLDER = 'MPIEXEC_FOLDER'
+     MPI_PROCESSES = 'MPI_PROCESSES'
+ 
+@@ -58,6 +62,22 @@ class TauDEMUtils:
+         return folder
+ 
+     @staticmethod
++    def taudemMultifilePath():
++        folder = ProcessingConfig.getSetting(TauDEMUtils.TAUDEM_MULTIFILE_FOLDER)
++        if folder is None:
++            folder = ''
++
++        if isMac():
++            testfolder = os.path.join(QgsApplication.prefixPath(), 'bin')
++            if os.path.exists(os.path.join(testfolder, 'slopearea')):
++                folder = testfolder
++            else:
++                testfolder = '/usr/local/bin'
++                if os.path.exists(os.path.join(testfolder, 'slopearea')):
++                    folder = testfolder
++        return folder
++
++    @staticmethod
+     def mpiexecPath():
+         folder = ProcessingConfig.getSetting(TauDEMUtils.MPIEXEC_FOLDER)
+         if folder is None:
+@@ -75,8 +95,8 @@ class TauDEMUtils:
+ 
+     @staticmethod
+     def taudemDescriptionPath():
+-        return os.path.normpath(os.path.join(os.path.dirname(__file__),
+-                                'description'))
++        return os.path.normpath(
++            os.path.join(os.path.dirname(__file__), 'description'))
+ 
+     @staticmethod
+     def executeTauDEM(command, progress):
+--- a/python/plugins/processing/algs/taudem/description/aread8.txt
++++ /dev/null
+@@ -1,8 +0,0 @@
+-D8 Contributing Area
+-aread8
+-Basic Grid Analysis tools
+-ParameterRaster|-p|D8 Flow Direction Grid|False
+-ParameterVector|-o|Outlets Shapefile|0|True
+-ParameterRaster|-wg|Weight Grid|True
+-ParameterBoolean|-nc|Check for edge contamination|True
+-OutputRaster|-ad8|D8 Contributing Area Grid
+--- a/python/plugins/processing/algs/taudem/description/areadinf.txt
++++ /dev/null
+@@ -1,8 +0,0 @@
+-D-Infinity Contributing Area
+-areadinf
+-Basic Grid Analysis tools
+-ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
+-ParameterVector|-o|Outlets Shapefile|0|True
+-ParameterRaster|-wg|Weight Grid|True
+-ParameterBoolean|-nc|Check for edge contamination|True
+-OutputRaster|-sca|D-Infinity Specific Catchment Area Grid
+--- a/python/plugins/processing/algs/taudem/description/d8flowdir.txt
++++ /dev/null
+@@ -1,6 +0,0 @@
+-D8 Flow Directions
+-d8flowdir
+-Basic Grid Analysis tools
+-ParameterRaster|-fel|Pit Filled Elevation Grid|False
+-OutputRaster|-p|D8 Flow Direction Grid
+-OutputRaster|-sd8|D8 Slope Grid
+--- a/python/plugins/processing/algs/taudem/description/d8flowpathextremeup.txt
++++ /dev/null
+@@ -1,9 +0,0 @@
+-D8 Extreme Upslope Value
+-d8flowpathextremeup
+-Stream Network Analysis tools
+-ParameterRaster|-p|D8 Flow Directions Grid|False
+-ParameterRaster|-sa|Upslope Values Grid|False
+-ParameterVector|-o|Outlets Shapefile|0|True
+-ParameterBoolean|-nc|Check for edge contamination|True
+-ParameterBoolean|-min|Use max upslope value|True
+-OutputRaster|-ssa|Extereme Upslope Values Grid
+--- a/python/plugins/processing/algs/taudem/description/d8hdisttostrm.txt
++++ /dev/null
+@@ -1,7 +0,0 @@
+-D8 Distance To Streams
+-d8hdisttostrm
+-Specialized Grid Analysis tools
+-ParameterRaster|-p|D8 Flow Direction Grid|False
+-ParameterRaster|-src|Stream Raster Grid|False
+-ParameterNumber|-thresh|Threshold|1|500|50
+-OutputRaster|-dist|Output Distance to Streams
+--- a/python/plugins/processing/algs/taudem/description/dinfavalanche.txt
++++ /dev/null
+@@ -1,11 +0,0 @@
+-D-Infinity Avalanche Runout
+-dinfavalanche
+-Specialized Grid Analysis tools
+-ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
+-ParameterRaster|-fel|Pit Filled Elevation Grid|False
+-ParameterRaster|-ass|Avalanche Source Site Grid|False
+-ParameterNumber|-thresh|Proportion Threshold|0.00001|10.0|0.2
+-ParameterNumber|-alpha|Alpha Angle Threshold|0|360|18
+-ParameterBoolean|-direct|Measure distance along flow path|True
+-OutputRaster|-rz|Runout Zone Grid
+-OutputRaster|-dfs|Path Distance Grid
+--- a/python/plugins/processing/algs/taudem/description/dinfconclimaccum.txt
++++ /dev/null
+@@ -1,11 +0,0 @@
+-D-Infinity Concentration Limited Accumulation
+-dinfconclimaccum
+-Specialized Grid Analysis tools
+-ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
+-ParameterRaster|-dg|Disturbance Indicator Grid|False
+-ParameterRaster|-dm|Decay Multiplier Grid|False
+-ParameterRaster|-q|Effective Runoff Weight Grid|False
+-ParameterVector|-o|Outlets shapefile|0|True
+-ParameterNumber|-csol|Concentration Threshold|1.0|100.0|1.0
+-ParameterBoolean|-nc|Check for edge contamination|True
+-OutputRaster|-ctpt|Concentration Grid
+--- a/python/plugins/processing/algs/taudem/description/dinfdecayaccum.txt
++++ /dev/null
+@@ -1,9 +0,0 @@
+-D-Infinity Decaying Accumulation
+-dinfdecayaccum
+-Specialized Grid Analysis tools
+-ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
+-ParameterRaster|-dm|Decay Multiplier Grid|False
+-ParameterRaster|-wg|Weight Grid|True
+-ParameterVector|-o|Outlets Shapefile|0|True
+-ParameterBoolean|-nc|Check for edge contamination|True
+-OutputRaster|-dsca|Decayed Specific Catchment Area Grid
+--- a/python/plugins/processing/algs/taudem/description/dinfflowdir.txt
++++ /dev/null
+@@ -1,6 +0,0 @@
+-D-Infinity Flow Directions
+-dinfflowdir
+-Basic Grid Analysis tools
+-ParameterRaster|-fel|Pit Filled Elevation Grid|False
+-OutputRaster|-ang|D-Infinity Flow Directions Grid
+-OutputRaster|-slp|D-Infinity Slope Grid
+--- a/python/plugins/processing/algs/taudem/description/dinfrevaccum.txt
++++ /dev/null
+@@ -1,7 +0,0 @@
+-D-Infinity Reverse Accumulation
+-dinfrevaccum
+-Specialized Grid Analysis tools
+-ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
+-ParameterRaster|-wg|Weight Grid|False
+-OutputRaster|-racc|Reverse Accumulation Grid
+-OutputRaster|-dmax|Maximum Downslope Grid
+--- a/python/plugins/processing/algs/taudem/description/dinfupdependence.txt
++++ /dev/null
+@@ -1,6 +0,0 @@
+-D-Infinity Upslope Dependence
+-dinfupdependence
+-Specialized Grid Analysis tools
+-ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
+-ParameterRaster|-dg|Destination Grid|False
+-OutputRaster|-dep|Output Upslope Dependence Grid
+--- a/python/plugins/processing/algs/taudem/description/moveoutletstostrm.txt
++++ /dev/null
+@@ -1,8 +0,0 @@
+-Move Outlets To Streams
+-moveoutletstostrm
+-Stream Network Analysis tools
+-ParameterRaster|-p|D8 Flow Direction Grid|False
+-ParameterRaster|-src|Stream Raster Grid|False
+-ParameterVector|-o|Outlets Shapefile|0|False
+-ParameterNumber|-md|Maximum Number of Grid Cells to traverse|1|500|50
+-OutputVector|-om|Output Outlet Shapefile
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/aread8.txt
+@@ -0,0 +1,8 @@
++D8 Contributing Area (multifile)
++aread8
++Basic Grid Analysis tools
++ParameterFile|-p|D8 Flow Direction Grid|True|False
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterFile|-wg|Weight Grid|True|True
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputDirectory|-ad8|D8 Contributing Area Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/areadinf.txt
+@@ -0,0 +1,8 @@
++D-Infinity Contributing Area (multifile)
++areadinf
++Basic Grid Analysis tools
++ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterFile|-wg|Weight Grid|True|True
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputDirectory|-sca|D-Infinity Specific Catchment Area Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/d8flowdir.txt
+@@ -0,0 +1,6 @@
++D8 Flow Directions (multifile)
++d8flowdir
++Basic Grid Analysis tools
++ParameterFile|-fel|Pit Filled Elevation Grid|True|False
++OutputDirectory|-p|D8 Flow Direction Grid
++OutputDirectory|-sd8|D8 Slope Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/d8flowpathextremeup.txt
+@@ -0,0 +1,9 @@
++D8 Extreme Upslope Value (multifile)
++d8flowpathextremeup
++Stream Network Analysis tools
++ParameterFile|-p|D8 Flow Directions Grid|True|False
++ParameterFile|-sa|Upslope Values Grid|True|False
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterBoolean|-nc|Check for edge contamination|True
++ParameterBoolean|-min|Use max upslope value|True
++OutputDirectory|-ssa|Extereme Upslope Values Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/d8hdisttostrm.txt
+@@ -0,0 +1,7 @@
++D8 Distance To Streams (multifile)
++d8hdisttostrm
++Specialized Grid Analysis tools
++ParameterFile|-p|D8 Flow Direction Grid|True|False
++ParameterFile|-src|Stream Raster Grid|True|False
++ParameterNumber|-thresh|Threshold|1|500|50
++OutputDirectory|-dist|Output Distance to Streams
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/dinfavalanche.txt
+@@ -0,0 +1,11 @@
++D-Infinity Avalanche Runout (multifile)
++dinfavalanche
++Specialized Grid Analysis tools
++ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
++ParameterFile|-fel|Pit Filled Elevation Grid|True|False
++ParameterFile|-ass|Avalanche Source Site Grid|True|False
++ParameterNumber|-thresh|Proportion Threshold|0.00001|10.0|0.2
++ParameterNumber|-alpha|Alpha Angle Threshold|0|360|18
++ParameterBoolean|-direct|Measure distance along flow path|True
++OutputDirectory|-rz|Runout Zone Grid
++OutputDirectory|-dfs|Path Distance Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/dinfconclimaccum.txt
+@@ -0,0 +1,11 @@
++D-Infinity Concentration Limited Accumulation (multifile)
++dinfconclimaccum
++Specialized Grid Analysis tools
++ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
++ParameterFile|-dg|Disturbance Indicator Grid|True|False
++ParameterFile|-dm|Decay Multiplier Grid|True|False
++ParameterFile|-q|Effective Runoff Weight Grid|True|False
++ParameterVector|-o|Outlets shapefile|0|True
++ParameterNumber|-csol|Concentration Threshold|1.0|100.0|1.0
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputDirectory|-ctpt|Concentration Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/dinfdecayaccum.txt
+@@ -0,0 +1,9 @@
++D-Infinity Decaying Accumulation
++dinfdecayaccum
++Specialized Grid Analysis tools
++ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
++ParameterFile|-dm|Decay Multiplier Grid|True|False
++ParameterFile|-wg|Weight Grid|True|True
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputDirectory|-dsca|Decayed Specific Catchment Area Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/dinfflowdir.txt
+@@ -0,0 +1,6 @@
++D-Infinity Flow Directions (multifile)
++dinfflowdir
++Basic Grid Analysis tools
++ParameterFile|-fel|Pit Filled Elevation Grid|True|False
++OutputDirectory|-ang|D-Infinity Flow Directions Grid
++OutputDirectory|-slp|D-Infinity Slope Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/dinfrevaccum.txt
+@@ -0,0 +1,7 @@
++D-Infinity Reverse Accumulation (multifile)
++dinfrevaccum
++Specialized Grid Analysis tools
++ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
++ParameterFile|-wg|Weight Grid|True|False
++OutputDirectory|-racc|Reverse Accumulation Grid
++OutputDirectory|-dmax|Maximum Downslope Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/dinfupdependence.txt
+@@ -0,0 +1,6 @@
++D-Infinity Upslope Dependence (multifile)
++dinfupdependence
++Specialized Grid Analysis tools
++ParameterFile|-ang|D-Infinity Flow Direction Grid|True|False
++ParameterFile|-dg|Destination Grid|True|False
++OutputDirectory|-dep|Output Upslope Dependence Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/gagewatershed.txt
+@@ -0,0 +1,6 @@
++Gage Watershed (multifile)
++gagewatershed
++Stream Network Analysis tools
++ParameterRaster|-p|D8 Flow Directions Grid|False
++ParameterVector|-o|Gages Shapefile|0|False
++OutputRaster|-gw|Gage Watershed Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/gagewatershed2.txt
+@@ -0,0 +1,7 @@
++Gage Watershed - 2 (multifile)
++gagewatershed
++Stream Network Analysis tools
++ParameterRaster|-p|D8 Flow Directions Grid|False
++ParameterVector|-o|Gages Shapefile|0|False
++OutputRaster|-gw|Gage Watershed Grid
++OutputFile|-id|Downstream Identifiers File
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/moveoutletstostrm.txt
+@@ -0,0 +1,8 @@
++Move Outlets To Streams (multifile)
++moveoutletstostrm
++Stream Network Analysis tools
++ParameterFile|-p|D8 Flow Direction Grid|True|False
++ParameterFile|-src|Stream Raster Grid|True|False
++ParameterVector|-o|Outlets Shapefile|0|False
++ParameterNumber|-md|Maximum Number of Grid Cells to traverse|1|500|50
++OutputVector|-om|Output Outlet Shapefile
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/pitremove.txt
+@@ -0,0 +1,5 @@
++Pit Remove (multifile)
++pitremove
++Basic Grid Analysis tools
++ParameterFile|-z|Elevation Grid|True|False
++OutputDirectory|-fel|Pit Removed Elevation Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/selectgtthreshold.txt
+@@ -0,0 +1,6 @@
++Select GT Threshold (multifile)
++selectgtthreshold
++Basic Grid Analysis tools
++ParameterRaster|-z|Elevation Grid|False
++ParameterNumber|-thresh|Threshold|0.0|999999.999999|0.0
++OutputRaster|-t|Output Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/slopearearatio.txt
+@@ -0,0 +1,6 @@
++Slope Over Area Ratio (multifile)
++slopearearatio
++Specialized Grid Analysis tools
++ParameterFile|-slp|Slope Grid|True|False
++ParameterFile|-sca|Specific Catchment Area Grid|True|False
++OutputDirectory|-sar|Slope Divided By Area Ratio Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/slopeavedown.txt
+@@ -0,0 +1,7 @@
++Slope Average Down (multifile)
++slopeavedown
++Specialized Grid Analysis tools
++ParameterFile|-p|D8 Flow Direction Grid|True|False
++ParameterFile|-fel|Pit Filled Elevation Grid|True|False
++ParameterNumber|-dn|Downslope Distance|1|500|50
++OutputDirectory|-slpd|Slope Average Down Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/streamnet.txt
+@@ -0,0 +1,14 @@
++Stream Reach and Watershed (multifile)
++streamnet
++Stream Network Analysis tools
++ParameterFile|-fel|Pit Filled Elevation Grid|True|False
++ParameterFile|-p|D8 Flow Direction Grid|True|False
++ParameterFile|-ad8|D8 Drainage Area|True|False
++ParameterFile|-src|Stream Raster Grid|True|False
++ParameterVector|-o|Outlets Shapefile as Network Nodes|0|True
++ParameterBoolean|-sw|Delineate Single Watershed|False
++OutputDirectory|-ord|Stream Order Grid
++OutputDirectory|-w|Watershed Grid
++OutputVector|-net|Stream Reach Shapefile
++OutputFile|-tree|Network Connectivity Tree
++OutputFile|-coord|Network Coordinates
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/threshold.txt
+@@ -0,0 +1,7 @@
++Stream Definition By Threshold (multifile)
++threshold
++Stream Network Analysis tools
++ParameterFile|-ssa|Accumulated Stream Source Grid|True|False
++ParameterNumber|-thresh|Threshold|1|None|100
++ParameterFile|-mask|Mask Grid|True|True
++OutputDirectory|-src|Stream Raster Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/multi/twi.txt
+@@ -0,0 +1,6 @@
++Topographic Wetness Index (multifile)
++twi
++Stream Network Analysis tools
++ParameterRaster|-sca|D-Infinity Specific Catchment Area Grid|False
++ParameterRaster|-slp|D-Infinity Slope Grid|False
++OutputRaster|-twi|Topographic Wetness Index Grid
+--- a/python/plugins/processing/algs/taudem/description/pitremove.txt
++++ /dev/null
+@@ -1,5 +0,0 @@
+-Pit Remove
+-pitremove
+-Basic Grid Analysis tools
+-ParameterRaster|-z|Elevation Grid|False
+-OutputRaster|-fel|Pit Removed Elevation Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/aread8.txt
+@@ -0,0 +1,8 @@
++D8 Contributing Area
++aread8
++Basic Grid Analysis tools
++ParameterRaster|-p|D8 Flow Direction Grid|False
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterRaster|-wg|Weight Grid|True
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputRaster|-ad8|D8 Contributing Area Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/areadinf.txt
+@@ -0,0 +1,8 @@
++D-Infinity Contributing Area
++areadinf
++Basic Grid Analysis tools
++ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterRaster|-wg|Weight Grid|True
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputRaster|-sca|D-Infinity Specific Catchment Area Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/d8flowdir.txt
+@@ -0,0 +1,6 @@
++D8 Flow Directions
++d8flowdir
++Basic Grid Analysis tools
++ParameterRaster|-fel|Pit Filled Elevation Grid|False
++OutputRaster|-p|D8 Flow Direction Grid
++OutputRaster|-sd8|D8 Slope Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/d8flowpathextremeup.txt
+@@ -0,0 +1,9 @@
++D8 Extreme Upslope Value
++d8flowpathextremeup
++Stream Network Analysis tools
++ParameterRaster|-p|D8 Flow Directions Grid|False
++ParameterRaster|-sa|Upslope Values Grid|False
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterBoolean|-nc|Check for edge contamination|True
++ParameterBoolean|-min|Use max upslope value|True
++OutputRaster|-ssa|Extereme Upslope Values Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/d8hdisttostrm.txt
+@@ -0,0 +1,7 @@
++D8 Distance To Streams
++d8hdisttostrm
++Specialized Grid Analysis tools
++ParameterRaster|-p|D8 Flow Direction Grid|False
++ParameterRaster|-src|Stream Raster Grid|False
++ParameterNumber|-thresh|Threshold|1|500|50
++OutputRaster|-dist|Output Distance to Streams
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/dinfavalanche.txt
+@@ -0,0 +1,11 @@
++D-Infinity Avalanche Runout
++dinfavalanche
++Specialized Grid Analysis tools
++ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
++ParameterRaster|-fel|Pit Filled Elevation Grid|False
++ParameterRaster|-ass|Avalanche Source Site Grid|False
++ParameterNumber|-thresh|Proportion Threshold|0.00001|10.0|0.2
++ParameterNumber|-alpha|Alpha Angle Threshold|0|360|18
++ParameterBoolean|-direct|Measure distance along flow path|True
++OutputRaster|-rz|Runout Zone Grid
++OutputRaster|-dfs|Path Distance Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/dinfconclimaccum.txt
+@@ -0,0 +1,11 @@
++D-Infinity Concentration Limited Accumulation
++dinfconclimaccum
++Specialized Grid Analysis tools
++ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
++ParameterRaster|-dg|Disturbance Indicator Grid|False
++ParameterRaster|-dm|Decay Multiplier Grid|False
++ParameterRaster|-q|Effective Runoff Weight Grid|False
++ParameterVector|-o|Outlets shapefile|0|True
++ParameterNumber|-csol|Concentration Threshold|1.0|100.0|1.0
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputRaster|-ctpt|Concentration Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/dinfdecayaccum.txt
+@@ -0,0 +1,9 @@
++D-Infinity Decaying Accumulation
++dinfdecayaccum
++Specialized Grid Analysis tools
++ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
++ParameterRaster|-dm|Decay Multiplier Grid|False
++ParameterRaster|-wg|Weight Grid|True
++ParameterVector|-o|Outlets Shapefile|0|True
++ParameterBoolean|-nc|Check for edge contamination|True
++OutputRaster|-dsca|Decayed Specific Catchment Area Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/dinfflowdir.txt
+@@ -0,0 +1,6 @@
++D-Infinity Flow Directions
++dinfflowdir
++Basic Grid Analysis tools
++ParameterRaster|-fel|Pit Filled Elevation Grid|False
++OutputRaster|-ang|D-Infinity Flow Directions Grid
++OutputRaster|-slp|D-Infinity Slope Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/dinfrevaccum.txt
+@@ -0,0 +1,7 @@
++D-Infinity Reverse Accumulation
++dinfrevaccum
++Specialized Grid Analysis tools
++ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
++ParameterRaster|-wg|Weight Grid|False
++OutputRaster|-racc|Reverse Accumulation Grid
++OutputRaster|-dmax|Maximum Downslope Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/dinfupdependence.txt
+@@ -0,0 +1,6 @@
++D-Infinity Upslope Dependence
++dinfupdependence
++Specialized Grid Analysis tools
++ParameterRaster|-ang|D-Infinity Flow Direction Grid|False
++ParameterRaster|-dg|Destination Grid|False
++OutputRaster|-dep|Output Upslope Dependence Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/gagewatershed.txt
+@@ -0,0 +1,6 @@
++Gage Watershed
++gagewatershed
++Stream Network Analysis tools
++ParameterRaster|-p|D8 Flow Directions Grid|False
++ParameterVector|-o|Gages Shapefile|0|False
++OutputRaster|-gw|Gage Watershed Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/gagewatershed2.txt
+@@ -0,0 +1,7 @@
++Gage Watershed - 2
++gagewatershed
++Stream Network Analysis tools
++ParameterRaster|-p|D8 Flow Directions Grid|False
++ParameterVector|-o|Gages Shapefile|0|False
++OutputRaster|-gw|Gage Watershed Grid
++OutputFile|-id|Downstream Identifiers File
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/moveoutletstostrm.txt
+@@ -0,0 +1,8 @@
++Move Outlets To Streams
++moveoutletstostrm
++Stream Network Analysis tools
++ParameterRaster|-p|D8 Flow Direction Grid|False
++ParameterRaster|-src|Stream Raster Grid|False
++ParameterVector|-o|Outlets Shapefile|0|False
++ParameterNumber|-md|Maximum Number of Grid Cells to traverse|1|500|50
++OutputVector|-om|Output Outlet Shapefile
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/pitremove.txt
+@@ -0,0 +1,5 @@
++Pit Remove
++pitremove
++Basic Grid Analysis tools
++ParameterRaster|-z|Elevation Grid|False
++OutputRaster|-fel|Pit Removed Elevation Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/selectgtthreshold.txt
+@@ -0,0 +1,6 @@
++Select GT Threshold
++selectgtthreshold
++Basic Grid Analysis tools
++ParameterRaster|-z|Elevation Grid|False
++ParameterNumber|-thresh|Threshold|0.0|999999.999999|0.0
++OutputRaster|-t|Output Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/slopearearatio.txt
+@@ -0,0 +1,6 @@
++Slope Over Area Ratio
++slopearearatio
++Specialized Grid Analysis tools
++ParameterRaster|-slp|Slope Grid|False
++ParameterRaster|-sca|Specific Catchment Area Grid|False
++OutputRaster|-sar|Slope Divided By Area Ratio Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/slopeavedown.txt
+@@ -0,0 +1,7 @@
++Slope Average Down
++slopeavedown
++Specialized Grid Analysis tools
++ParameterRaster|-p|D8 Flow Direction Grid|False
++ParameterRaster|-fel|Pit Filled Elevation Grid|False
++ParameterNumber|-dn|Downslope Distance|1|500|50
++OutputRaster|-slpd|Slope Average Down Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/streamnet.txt
+@@ -0,0 +1,14 @@
++Stream Reach and Watershed
++streamnet
++Stream Network Analysis tools
++ParameterRaster|-fel|Pit Filled Elevation Grid|False
++ParameterRaster|-p|D8 Flow Direction Grid|False
++ParameterRaster|-ad8|D8 Drainage Area|False
++ParameterRaster|-src|Stream Raster Grid|False
++ParameterVector|-o|Outlets Shapefile as Network Nodes|0|True
++ParameterBoolean|-sw|Delineate Single Watershed|False
++OutputRaster|-ord|Stream Order Grid
++OutputRaster|-w|Watershed Grid
++OutputVector|-net|Stream Reach Shapefile
++OutputFile|-tree|Network Connectivity Tree
++OutputFile|-coord|Network Coordinates
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/threshold.txt
+@@ -0,0 +1,7 @@
++Stream Definition By Threshold
++threshold
++Stream Network Analysis tools
++ParameterRaster|-ssa|Accumulated Stream Source Grid|False
++ParameterNumber|-thresh|Threshold|1|None|100
++ParameterRaster|-mask|Mask Grid|True
++OutputRaster|-src|Stream Raster Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/description/single/twi.txt
+@@ -0,0 +1,6 @@
++Topographic Wetness Index
++twi
++Stream Network Analysis tools
++ParameterRaster|-sca|D-Infinity Specific Catchment Area Grid|False
++ParameterRaster|-slp|D-Infinity Slope Grid|False
++OutputRaster|-twi|Topographic Wetness Index Grid
+--- a/python/plugins/processing/algs/taudem/description/slopearearatio.txt
++++ /dev/null
+@@ -1,6 +0,0 @@
+-Slope Over Area Ratio
+-slopearearatio
+-Specialized Grid Analysis tools
+-ParameterRaster|-slp|Slope Grid|False
+-ParameterRaster|-sca|Specific Catchment Area Grid|False
+-OutputRaster|-sar|Slope Divided By Area Ratio Grid
+--- a/python/plugins/processing/algs/taudem/description/slopeavedown.txt
++++ /dev/null
+@@ -1,7 +0,0 @@
+-Slope Average Down
+-slopeavedown
+-Specialized Grid Analysis tools
+-ParameterRaster|-p|D8 Flow Direction Grid|False
+-ParameterRaster|-fel|Pit Filled Elevation Grid|False
+-ParameterNumber|-dn|Downslope Distance|1|500|50
+-OutputRaster|-slpd|Slope Average Down Grid
+--- a/python/plugins/processing/algs/taudem/description/streamnet.txt
++++ /dev/null
+@@ -1,14 +0,0 @@
+-Stream Reach and Watershed
+-streamnet
+-Stream Network Analysis tools
+-ParameterRaster|-fel|Pit Filled Elevation Grid|False
+-ParameterRaster|-p|D8 Flow Direction Grid|False
+-ParameterRaster|-ad8|D8 Drainage Area|False
+-ParameterRaster|-src|Stream Raster Grid|False
+-ParameterVector|-o|Outlets Shapefile as Network Nodes|0|True
+-ParameterBoolean|-sw|Delineate Single Watershed|False
+-OutputRaster|-ord|Stream Order Grid
+-OutputRaster|-w|Watershed Grid
+-OutputVector|-net|Stream Reach Shapefile
+-OutputFile|-tree|Network Connectivity Tree
+-OutputFile|-coord|Network Coordinates
+--- a/python/plugins/processing/algs/taudem/description/threshold.txt
++++ /dev/null
+@@ -1,7 +0,0 @@
+-Stream Definition By Threshold
+-threshold
+-Stream Network Analysis tools
+-ParameterRaster|-ssa|Accumulated Stream Source Grid|False
+-ParameterNumber|-thresh|Threshold|1|None|100
+-ParameterRaster|-mask|Mask Grid|True
+-OutputRaster|-src|Stream Raster Grid
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/dinfdistdown_multi.py
+@@ -0,0 +1,127 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    dinfdistdown_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterBoolean
++from processing.core.parameters import ParameterSelection
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class DinfDistDownMulti(GeoAlgorithm):
++
++    DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
++    PIT_FILLED_GRID = 'PIT_FILLED_GRID'
++    STREAM_GRID = 'STREAM_GRID'
++    WEIGHT_PATH_GRID = 'WEIGHT_PATH_GRID'
++    STAT_METHOD = 'STAT_METHOD'
++    DIST_METHOD = 'DIST_METHOD'
++    EDGE_CONTAM = 'EDGE_CONTAM'
++
++    DIST_DOWN_GRID = 'DIST_DOWN_GRID'
++
++    STATISTICS = ['Minimum', 'Maximum', 'Average']
++    STAT_DICT = {0: 'min', 1: 'max', 2: 'ave'}
++
++    DISTANCE = ['Pythagoras', 'Horizontal', 'Vertical', 'Surface']
++    DIST_DICT = {
++        0: 'p',
++        1: 'h',
++        2: 'v',
++        3: 's',
++    }
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'D-Infinity Distance Down (multifile)'
++        self.cmdName = 'dinfdistdown'
++        self.group = 'Specialized Grid Analysis tools'
++
++        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
++            self.tr('D-Infinity Flow Direction Grid'), True, False))
++        self.addParameter(ParameterFile(self.PIT_FILLED_GRID,
++            self.tr('Pit Filled Elevation Grid'), True, False))
++        self.addParameter(ParameterFile(self.STREAM_GRID,
++            self.tr('Stream Raster Grid'), True, False))
++        self.addParameter(ParameterFile(self.WEIGHT_PATH_GRID,
++            self.tr('Weight Path Grid'), True, True))
++        self.addParameter(ParameterSelection(self.STAT_METHOD,
++            self.tr('Statistical Method'), self.STATISTICS, 2))
++        self.addParameter(ParameterSelection(self.DIST_METHOD,
++            self.tr('Distance Method'), self.DISTANCE, 1))
++        self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
++            self.tr('Check for edge contamination'), True))
++
++        self.addOutput(OutputDirectory(self.DIST_DOWN_GRID,
++            self.tr('D-Infinity Drop to Stream Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-ang')
++        commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
++        commands.append('-fel')
++        commands.append(self.getParameterValue(self.PIT_FILLED_GRID))
++        commands.append('-src')
++        commands.append(self.getParameterValue(self.STREAM_GRID))
++        wg = self.getParameterValue(self.WEIGHT_PATH_GRID)
++        if wg is not None:
++            commands.append('-wg')
++            commands.append(self.getParameterValue(self.WEIGHT_PATH_GRID))
++        commands.append('-m')
++        commands.append(str(self.STAT_DICT[self.getParameterValue(
++            self.STAT_METHOD)]))
++        commands.append(str(self.DIST_DICT[self.getParameterValue(
++            self.DIST_METHOD)]))
++        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++            commands.append('-nc')
++        commands.append('-dd')
++        commands.append(self.getOutputValue(self.DIST_DOWN_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/dinfdistup_multi.py
+@@ -0,0 +1,124 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    dinfdistup_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterNumber
++from processing.core.parameters import ParameterBoolean
++from processing.core.parameters import ParameterSelection
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class DinfDistUpMulti(GeoAlgorithm):
++
++    DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
++    PIT_FILLED_GRID = 'PIT_FILLED_GRID'
++    SLOPE_GRID = 'SLOPE_GRID'
++    THRESHOLD = 'THRESHOLD'
++    STAT_METHOD = 'STAT_METHOD'
++    DIST_METHOD = 'DIST_METHOD'
++    EDGE_CONTAM = 'EDGE_CONTAM'
++
++    DIST_UP_GRID = 'DIST_UP_GRID'
++
++    STATISTICS = ['Minimum', 'Maximum', 'Average']
++    STAT_DICT = {0: 'min', 1: 'max', 2: 'ave'}
++
++    DISTANCE = ['Pythagoras', 'Horizontal', 'Vertical', 'Surface']
++    DIST_DICT = {
++        0: 'p',
++        1: 'h',
++        2: 'v',
++        3: 's',
++    }
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'D-Infinity Distance Up (multifile)'
++        self.cmdName = 'dinfdistup'
++        self.group = 'Specialized Grid Analysis tools'
++
++        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
++            self.tr('D-Infinity Flow Direction Grid'), True, False))
++        self.addParameter(ParameterFile(self.PIT_FILLED_GRID,
++            self.tr('Pit Filled Elevation Grid'), True, False))
++        self.addParameter(ParameterFile(self.SLOPE_GRID,
++            self.tr('Slope Grid'), True, False))
++        self.addParameter(ParameterSelection(self.STAT_METHOD,
++            self.tr('Statistical Method'), self.STATISTICS, 2))
++        self.addParameter(ParameterSelection(self.DIST_METHOD,
++            self.tr('Distance Method'), self.DISTANCE, 1))
++        self.addParameter(ParameterNumber(self.THRESHOLD,
++            self.tr('Proportion Threshold'), 0, None, 0.5))
++        self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
++            self.tr('Check for edge contamination'), True))
++
++        self.addOutput(OutputDirectory(self.DIST_UP_GRID,
++            self.tr('D-Infinity Distance Up')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-ang')
++        commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
++        commands.append('-fel')
++        commands.append(self.getParameterValue(self.PIT_FILLED_GRID))
++        commands.append('-m')
++        commands.append(str(self.STAT_DICT[self.getParameterValue(
++            self.STAT_METHOD)]))
++        commands.append(str(self.DIST_DICT[self.getParameterValue(
++            self.DIST_METHOD)]))
++        commands.append('-thresh')
++        commands.append(str(self.getParameterValue(self.THRESHOLD)))
++        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++            commands.append('-nc')
++        commands.append('-du')
++        commands.append(self.getOutputValue(self.DIST_UP_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
+@@ -0,0 +1,122 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    dinftranslimaccum2_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterVector
++from processing.core.parameters import ParameterBoolean
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class DinfTransLimAccum2Multi(GeoAlgorithm):
++
++    DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
++    SUPPLY_GRID = 'SUPPLY_GRID'
++    CAPACITY_GRID = 'CAPACITY_GRID'
++    IN_CONCENTR_GRID = 'IN_CONCENTR_GRID'
++    OUTLETS_SHAPE = 'OUTLETS_SHAPE'
++    EDGE_CONTAM = 'EDGE_CONTAM'
++
++    TRANSP_LIM_ACCUM_GRID = 'TRANSP_LIM_ACCUM_GRID'
++    DEPOSITION_GRID = 'DEPOSITION_GRID'
++    OUT_CONCENTR_GRID = 'OUT_CONCENTR_GRID'
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'D-Infinity Transport Limited Accumulation - 2 (multifile)'
++        self.cmdName = 'dinftranslimaccum'
++        self.group = 'Specialized Grid Analysis tools'
++
++        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
++            self.tr('D-Infinity Flow Direction Grid'), True, False))
++        self.addParameter(ParameterFile(self.SUPPLY_GRID,
++            self.tr('Supply Grid'), True, False))
++        self.addParameter(ParameterFile(self.CAPACITY_GRID,
++            self.tr('Transport Capacity Grid'), True, False))
++        self.addParameter(ParameterFile(self.IN_CONCENTR_GRID,
++            self.tr('Input Concentration Grid'), True, False))
++        self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
++            self.tr('Outlets Shapefile'),
++            [ParameterVector.VECTOR_TYPE_POINT], True))
++        self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
++            self.tr('Check for edge contamination'), True))
++
++        self.addOutput(OutputDirectory(self.TRANSP_LIM_ACCUM_GRID,
++            self.tr('Transport Limited Accumulation Grid')))
++        self.addOutput(OutputDirectory(self.DEPOSITION_GRID,
++            self.tr('Deposition Grid')))
++        self.addOutput(OutputDirectory(self.OUT_CONCENTR_GRID,
++            self.tr('Output Concentration Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-ang')
++        commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
++        commands.append('-tsup')
++        commands.append(self.getParameterValue(self.SUPPLY_GRID))
++        commands.append('-tc')
++        commands.append(self.getParameterValue(self.CAPACITY_GRID))
++        commands.append('-cs')
++        commands.append(self.getParameterValue(self.IN_CONCENTR_GRID))
++        param = self.getParameterValue(self.OUTLETS_SHAPE)
++        if param is not None:
++            commands.append('-o')
++            commands.append(param)
++        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++            commands.append('-nc')
++
++        commands.append('-tla')
++        commands.append(self.getOutputValue(self.TRANSP_LIM_ACCUM_GRID))
++        commands.append('-tdep')
++        commands.append(self.getOutputValue(self.DEPOSITION_GRID))
++        commands.append('-ctpt')
++        commands.append(self.getOutputValue(self.OUT_CONCENTR_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
+@@ -0,0 +1,114 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    dinftranslimaccum_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterVector
++from processing.core.parameters import ParameterBoolean
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class DinfTransLimAccumMulti(GeoAlgorithm):
++
++    DINF_FLOW_DIR_GRID = 'DINF_FLOW_DIR_GRID'
++    SUPPLY_GRID = 'SUPPLY_GRID'
++    CAPACITY_GRID = 'CAPACITY_GRID'
++    IN_CONCENTR_GRID = 'IN_CONCENTR_GRID'
++    OUTLETS_SHAPE = 'OUTLETS_SHAPE'
++    EDGE_CONTAM = 'EDGE_CONTAM'
++
++    TRANSP_LIM_ACCUM_GRID = 'TRANSP_LIM_ACCUM_GRID'
++    DEPOSITION_GRID = 'DEPOSITION_GRID'
++    OUT_CONCENTR_GRID = 'OUT_CONCENTR_GRID'
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'D-Infinity Transport Limited Accumulation (multifile)'
++        self.cmdName = 'dinftranslimaccum'
++        self.group = 'Specialized Grid Analysis tools'
++
++        self.addParameter(ParameterFile(self.DINF_FLOW_DIR_GRID,
++            self.tr('D-Infinity Flow Direction Grid'), True, False))
++        self.addParameter(ParameterFile(self.SUPPLY_GRID,
++            self.tr('Supply Grid'), True, False))
++        self.addParameter(ParameterFile(self.CAPACITY_GRID,
++            self.tr('Transport Capacity Grid'), True, False))
++        self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
++            self.tr('Outlets Shapefile'),
++            [ParameterVector.VECTOR_TYPE_POINT], True))
++        self.addParameter(ParameterBoolean(self.EDGE_CONTAM,
++            self.tr('Check for edge contamination'), True))
++
++        self.addOutput(OutputDirectory(self.TRANSP_LIM_ACCUM_GRID,
++            self.tr('Transport Limited Accumulation Grid')))
++        self.addOutput(OutputDirectory(self.DEPOSITION_GRID,
++            self.tr('Deposition Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-ang')
++        commands.append(self.getParameterValue(self.DINF_FLOW_DIR_GRID))
++        commands.append('-tsup')
++        commands.append(self.getParameterValue(self.SUPPLY_GRID))
++        commands.append('-tc')
++        commands.append(self.getParameterValue(self.CAPACITY_GRID))
++        param = self.getParameterValue(self.OUTLETS_SHAPE)
++        if param is not None:
++            commands.append('-o')
++            commands.append(param)
++        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++            commands.append('-nc')
++
++        commands.append('-tla')
++        commands.append(self.getOutputValue(self.TRANSP_LIM_ACCUM_GRID))
++        commands.append('-tdep')
++        commands.append(self.getOutputValue(self.DEPOSITION_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/dropanalysis_multi.py
+@@ -0,0 +1,124 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    dropanalysis_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterVector
++from processing.core.parameters import ParameterNumber
++from processing.core.parameters import ParameterSelection
++from processing.core.outputs import OutputFile
++
++from TauDEMUtils import TauDEMUtils
++
++
++class DropAnalysisMulti(GeoAlgorithm):
++
++    PIT_FILLED_GRID = 'PIT_FILLED_GRID'
++    D8_CONTRIB_AREA_GRID = 'D8_CONTRIB_AREA_GRID'
++    D8_FLOW_DIR_GRID = 'D8_FLOW_DIR_GRID'
++    ACCUM_STREAM_SOURCE_GRID = 'ACCUM_STREAM_SOURCE_GRID'
++    OUTLETS_SHAPE = 'OUTLETS_SHAPE'
++    MIN_TRESHOLD = 'MIN_TRESHOLD'
++    MAX_THRESHOLD = 'MAX_THRESHOLD'
++    TRESHOLD_NUM = 'TRESHOLD_NUM'
++    STEP_TYPE = 'STEP_TYPE'
++
++    DROP_ANALYSIS_FILE = 'DROP_ANALYSIS_FILE'
++
++    STEPS = ['Logarithmic', 'Linear']
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'Stream Drop Analysis (multifile)'
++        self.cmdName = 'dropanalysis'
++        self.group = 'Stream Network Analysis tools'
++
++        self.addParameter(ParameterFile(self.D8_CONTRIB_AREA_GRID,
++            self.tr('D8 Contributing Area Grid'), True, False))
++        self.addParameter(ParameterFile(self.D8_FLOW_DIR_GRID,
++            self.tr('D8 Flow Direction Grid'), True, False))
++        self.addParameter(ParameterFile(self.PIT_FILLED_GRID,
++            self.tr('Pit Filled Elevation Grid'), True, False))
++        self.addParameter(ParameterFile(self.ACCUM_STREAM_SOURCE_GRID,
++            self.tr('Accumulated Stream Source Grid'), True, False))
++        self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
++            self.tr('Outlets Shapefile'),
++            [ParameterVector.VECTOR_TYPE_POINT], False))
++        self.addParameter(ParameterNumber(self.MIN_TRESHOLD,
++            self.tr('Minimum Threshold'), 0, None, 5))
++        self.addParameter(ParameterNumber(self.MAX_THRESHOLD,
++            self.tr('Maximum Threshold'), 0, None, 500))
++        self.addParameter(ParameterNumber(self.TRESHOLD_NUM,
++            self.tr('Number of Threshold Values'), 0, None, 10))
++        self.addParameter(ParameterSelection(self.STEP_TYPE,
++            self.tr('Spacing for Threshold Values'), self.STEPS, 0))
++
++        self.addOutput(OutputFile(self.DROP_ANALYSIS_FILE,
++            self.tr('D-Infinity Drop to Stream Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-ad8')
++        commands.append(self.getParameterValue(self.D8_CONTRIB_AREA_GRID))
++        commands.append('-p')
++        commands.append(self.getParameterValue(self.D8_FLOW_DIR_GRID))
++        commands.append('-fel')
++        commands.append(self.getParameterValue(self.PIT_FILLED_GRID))
++        commands.append('-ssa')
++        commands.append(self.getParameterValue(self.ACCUM_STREAM_SOURCE_GRID))
++        commands.append('-o')
++        commands.append(self.getParameterValue(self.OUTLETS_SHAPE))
++        commands.append('-par')
++        commands.append(str(self.getParameterValue(self.MIN_TRESHOLD)))
++        commands.append(str(self.getParameterValue(self.MAX_THRESHOLD)))
++        commands.append(str(self.getParameterValue(self.TRESHOLD_NUM)))
++        commands.append(str(self.getParameterValue(self.STEPS)))
++        commands.append('-drp')
++        commands.append(self.getOutputValue(self.DROP_ANALYSIS_FILE))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/gridnet_multi.py
+@@ -0,0 +1,114 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    gridnet_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterVector
++from processing.core.parameters import ParameterNumber
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class GridNetMulti(GeoAlgorithm):
++
++    D8_FLOW_DIR_GRID = 'D8_FLOW_DIR_GRID'
++    OUTLETS_SHAPE = 'OUTLETS_SHAPE'
++    MASK_GRID = 'MASK_GRID'
++    THRESHOLD = 'THRESHOLD'
++
++    LONGEST_LEN_GRID = 'LONGEST_LEN_GRID'
++    TOTAL_LEN_GRID = 'TOTAL_LEN_GRID'
++    STRAHLER_GRID = 'STRAHLER_GRID'
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'Grid Network (multifile)'
++        self.cmdName = 'gridnet'
++        self.group = 'Basic Grid Analysis tools'
++
++        self.addParameter(ParameterFile(self.D8_FLOW_DIR_GRID,
++            self.tr('D8 Flow Direction Grid'), True, False))
++        self.addParameter(ParameterVector(self.OUTLETS_SHAPE,
++            self.tr('Outlets Shapefile'),
++            [ParameterVector.VECTOR_TYPE_POINT], True))
++        self.addParameter(ParameterFile(self.MASK_GRID,
++            self.tr('Mask Grid'), True, True))
++        self.addParameter(ParameterNumber(self.THRESHOLD,
++            self.tr('Mask Threshold'), 0, None, 100))
++
++        self.addOutput(OutputDirectory(self.LONGEST_LEN_GRID,
++            self.tr('Longest Upslope Length Grid')))
++        self.addOutput(OutputDirectory(self.TOTAL_LEN_GRID,
++            self.tr('Total Upslope Length Grid')))
++        self.addOutput(OutputDirectory(self.STRAHLER_GRID,
++            self.tr('Strahler Network Order Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-p')
++        commands.append(self.getParameterValue(self.D8_FLOW_DIR_GRID))
++        param = self.getParameterValue(self.OUTLETS_SHAPE)
++        if param is not None:
++            commands.append('-o')
++            commands.append(param)
++        param = self.getParameterValue(self.MASK_GRID)
++        if param is not None:
++            commands.append('-mask')
++            commands.append(param)
++            commands.append('-thresh')
++            commands.append(self.getParameterValue(self.THRESHOLD))
++
++        commands.append('-plen')
++        commands.append(self.getOutputValue(self.LONGEST_LEN_GRID))
++        commands.append('-tlen')
++        commands.append(self.getOutputValue(self.TOTAL_LEN_GRID))
++        commands.append('-gord')
++        commands.append(self.getOutputValue(self.STRAHLER_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/lengtharea_multi.py
+@@ -0,0 +1,96 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    lengtharea_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterNumber
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class LengthAreaMulti(GeoAlgorithm):
++
++    LENGTH_GRID = 'LENGTH_GRID'
++    CONTRIB_AREA_GRID = 'CONTRIB_AREA_GRID'
++    THRESHOLD = 'THRESHOLD'
++    EXPONENT = 'EXPONENT'
++
++    STREAM_SOURCE_GRID = 'STREAM_SOURCE_GRID'
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'Length Area Stream Source (multifile)'
++        self.cmdName = 'lengtharea'
++        self.group = 'Stream Network Analysis tools'
++
++        self.addParameter(ParameterFile(self.LENGTH_GRID,
++            self.tr('Length Grid'), True, False))
++        self.addParameter(ParameterFile(self.CONTRIB_AREA_GRID,
++            self.tr('Contributing Area Grid'), True, False))
++        self.addParameter(ParameterNumber(self.THRESHOLD,
++            self.tr('Threshold'), 0, None, 0.03))
++        self.addParameter(ParameterNumber(self.EXPONENT,
++            self.tr('Exponent'), 0, None, 1.3))
++
++        self.addOutput(OutputDirectory(self.STREAM_SOURCE_GRID,
++            self.tr('Stream Source Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-plen')
++        commands.append(self.getParameterValue(self.LENGTH_GRID))
++        commands.append('-ad8')
++        commands.append(self.getParameterValue(self.CONTRIB_AREA_GRID))
++        commands.append('-par')
++        commands.append(str(self.getParameterValue(self.THRESHOLD)))
++        commands.append(str(self.getParameterValue(self.EXPONENT)))
++        commands.append('-ss')
++        commands.append(self.getOutputValue(self.STREAM_SOURCE_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/peukerdouglas_multi.py
+@@ -0,0 +1,94 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    peukerdouglas_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterNumber
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class PeukerDouglasMulti(GeoAlgorithm):
++
++    ELEVATION_GRID = 'ELEVATION_GRID'
++    CENTER_WEIGHT = 'CENTER_WEIGHT'
++    SIDE_WEIGHT = 'SIDE_WEIGHT'
++    DIAGONAL_WEIGHT = 'DIAGONAL_WEIGHT'
++
++    STREAM_SOURCE_GRID = 'STREAM_SOURCE_GRID'
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'Peuker Douglas (multifile)'
++        self.cmdName = 'peukerdouglas'
++        self.group = 'Stream Network Analysis tools'
++
++        self.addParameter(ParameterFile(self.ELEVATION_GRID,
++            self.tr('Elevation Grid'), True, False))
++        self.addParameter(ParameterNumber(self.CENTER_WEIGHT,
++            self.tr('Center Smoothing Weight'), 0, None, 0.4))
++        self.addParameter(ParameterNumber(self.SIDE_WEIGHT,
++            self.tr('Side Smoothing Weight'), 0, None, 0.1))
++        self.addParameter(ParameterNumber(self.DIAGONAL_WEIGHT,
++            self.tr('Diagonal Smoothing Weight'), 0, None, 0.05))
++
++        self.addOutput(OutputDirectory(self.STREAM_SOURCE_GRID,
++            self.tr('Stream Source Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-fel')
++        commands.append(self.getParameterValue(self.ELEVATION_GRID))
++        commands.append('-par')
++        commands.append(str(self.getParameterValue(self.CENTER_WEIGHT)))
++        commands.append(str(self.getParameterValue(self.SIDE_WEIGHT)))
++        commands.append(str(self.getParameterValue(self.DIAGONAL_WEIGHT)))
++        commands.append('-ss')
++        commands.append(self.getOutputValue(self.STREAM_SOURCE_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
+--- /dev/null
++++ b/python/plugins/processing/algs/taudem/slopearea_multi.py
+@@ -0,0 +1,96 @@
++# -*- coding: utf-8 -*-
++
++"""
++***************************************************************************
++    slopearea_multi.py
++    ---------------------
++    Date                 : March 2015
++    Copyright            : (C) 2015 by Alexander Bruy
++    Email                : alexander dot bruy at gmail dot com
++***************************************************************************
++*                                                                         *
++*   This program is free software; you can redistribute it and/or modify  *
++*   it under the terms of the GNU General Public License as published by  *
++*   the Free Software Foundation; either version 2 of the License, or     *
++*   (at your option) any later version.                                   *
++*                                                                         *
++***************************************************************************
++"""
++
++__author__ = 'Alexander Bruy'
++__date__ = 'March 2015'
++__copyright__ = '(C) 2015, Alexander Bruy'
++
++# This will get replaced with a git SHA1 when you do a git archive
++
++__revision__ = '$Format:%H$'
++
++import os
++
++from PyQt4.QtGui import QIcon
++
++from processing.core.GeoAlgorithm import GeoAlgorithm
++from processing.core.ProcessingConfig import ProcessingConfig
++from processing.core.GeoAlgorithmExecutionException import \
++    GeoAlgorithmExecutionException
++
++from processing.core.parameters import ParameterFile
++from processing.core.parameters import ParameterNumber
++from processing.core.outputs import OutputDirectory
++
++from TauDEMUtils import TauDEMUtils
++
++
++class SlopeAreaMulti(GeoAlgorithm):
++
++    SLOPE_GRID = 'SLOPE_GRID'
++    AREA_GRID = 'AREA_GRID'
++    SLOPE_EXPONENT = 'SLOPE_EXPONENT'
++    AREA_EXPONENT = 'AREA_EXPONENT'
++
++    SLOPE_AREA_GRID = 'SLOPE_AREA_GRID'
++
++    def getIcon(self):
++        return QIcon(os.path.dirname(__file__) + '/../../images/taudem.png')
++
++    def defineCharacteristics(self):
++        self.name = 'Slope Area Combination (multifile)'
++        self.cmdName = 'slopearea'
++        self.group = 'Stream Network Analysis tools'
++
++        self.addParameter(ParameterFile(self.SLOPE_GRID,
++            self.tr('Slope Grid'), True, False))
++        self.addParameter(ParameterFile(self.AREA_GRID,
++            self.tr('Contributing Area Grid'), True, False))
++        self.addParameter(ParameterNumber(self.SLOPE_EXPONENT,
++            self.tr('Slope Exponent'), 0, None, 2))
++        self.addParameter(ParameterNumber(self.AREA_EXPONENT,
++            self.tr('Area Exponent'), 0, None, 1))
++
++        self.addOutput(OutputDirectory(self.SLOPE_AREA_GRID,
++            self.tr('Slope Area Grid')))
++
++    def processAlgorithm(self, progress):
++        commands = []
++        commands.append(os.path.join(TauDEMUtils.mpiexecPath(), 'mpiexec'))
++
++        processNum = ProcessingConfig.getSetting(TauDEMUtils.MPI_PROCESSES)
++        if processNum <= 0:
++            raise GeoAlgorithmExecutionException(
++                self.tr('Wrong number of MPI processes used. Please set '
++                        'correct number before running TauDEM algorithms.'))
++
++        commands.append('-n')
++        commands.append(str(processNum))
++        commands.append(os.path.join(TauDEMUtils.taudemMultifilePath(), self.cmdName))
++        commands.append('-slp')
++        commands.append(self.getParameterValue(self.SLOPE_GRID))
++        commands.append('-sca')
++        commands.append(self.getParameterValue(self.AREA_GRID))
++        commands.append('-par')
++        commands.append(str(self.getParameterValue(self.SLOPE_EXPONENT)))
++        commands.append(str(self.getParameterValue(self.AREA_EXPONENT)))
++        commands.append('-sa')
++        commands.append(self.getOutputValue(self.SLOPE_AREA_GRID))
++
++        TauDEMUtils.executeTauDEM(commands, progress)
diff --git a/debian/patches/0001-processing-fix-handling-of-Check-for-edge-contaminat.patch b/debian/patches/0001-processing-fix-handling-of-Check-for-edge-contaminat.patch
new file mode 100644
index 0000000..14cf603
--- /dev/null
+++ b/debian/patches/0001-processing-fix-handling-of-Check-for-edge-contaminat.patch
@@ -0,0 +1,119 @@
+From e94ebd7c7246d91147df5269ade24f3ace6d6439 Mon Sep 17 00:00:00 2001
+From: Alexander Bruy <alexander.bruy at gmail.com>
+Date: Wed, 4 Mar 2015 19:37:11 +0200
+Subject: =?UTF-8?q?[processing]=20fix=20handling=20of=20"Check=20for=20edge=20?=
+ =?UTF-8?q?contamination"=20option=20in=0ATauDEM=20algorithms?=
+Origin: https://github.com/qgis/QGIS/commit/e94ebd7c7246d91147df5269ade24f3ace6d6439
+
+(cherry-picked from fe24c8295606a1ddbc4e3d4bd1b80188584d0635)
+---
+ python/plugins/processing/algs/taudem/TauDEMAlgorithm.py          |    2 +-
+ python/plugins/processing/algs/taudem/dinfdistdown.py             |    2 +-
+ python/plugins/processing/algs/taudem/dinfdistdown_multi.py       |    2 +-
+ python/plugins/processing/algs/taudem/dinfdistup.py               |    2 +-
+ python/plugins/processing/algs/taudem/dinfdistup_multi.py         |    2 +-
+ python/plugins/processing/algs/taudem/dinftranslimaccum.py        |    2 +-
+ python/plugins/processing/algs/taudem/dinftranslimaccum2.py       |    2 +-
+ python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py |    2 +-
+ python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py  |    2 +-
+ 9 files changed, 9 insertions(+), 9 deletions(-)
+
+--- a/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
++++ b/python/plugins/processing/algs/taudem/TauDEMAlgorithm.py
+@@ -109,7 +109,7 @@ class TauDEMAlgorithm(GeoAlgorithm):
+                 commands.append(param.name)
+                 commands.append(param.value)
+             elif isinstance(param, ParameterBoolean):
+-                if param.value and str(param.value).lower() == 'false':
++                if not param.value:
+                     commands.append(param.name)
+             elif isinstance(param, ParameterString):
+                 commands.append(param.name)
+--- a/python/plugins/processing/algs/taudem/dinfdistdown.py
++++ b/python/plugins/processing/algs/taudem/dinfdistdown.py
+@@ -118,7 +118,7 @@ class DinfDistDown(GeoAlgorithm):
+             self.STAT_METHOD)]))
+         commands.append(str(self.DIST_DICT[self.getParameterValue(
+             self.DIST_METHOD)]))
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+         commands.append('-dd')
+         commands.append(self.getOutputValue(self.DIST_DOWN_GRID))
+--- a/python/plugins/processing/algs/taudem/dinfdistdown_multi.py
++++ b/python/plugins/processing/algs/taudem/dinfdistdown_multi.py
+@@ -119,7 +119,7 @@ class DinfDistDownMulti(GeoAlgorithm):
+             self.STAT_METHOD)]))
+         commands.append(str(self.DIST_DICT[self.getParameterValue(
+             self.DIST_METHOD)]))
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+         commands.append('-dd')
+         commands.append(self.getOutputValue(self.DIST_DOWN_GRID))
+--- a/python/plugins/processing/algs/taudem/dinfdistup.py
++++ b/python/plugins/processing/algs/taudem/dinfdistup.py
+@@ -115,7 +115,7 @@ class DinfDistUp(GeoAlgorithm):
+             self.DIST_METHOD)]))
+         commands.append('-thresh')
+         commands.append(str(self.getParameterValue(self.THRESHOLD)))
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+         commands.append('-du')
+         commands.append(self.getOutputValue(self.DIST_UP_GRID))
+--- a/python/plugins/processing/algs/taudem/dinfdistup_multi.py
++++ b/python/plugins/processing/algs/taudem/dinfdistup_multi.py
+@@ -116,7 +116,7 @@ class DinfDistUpMulti(GeoAlgorithm):
+             self.DIST_METHOD)]))
+         commands.append('-thresh')
+         commands.append(str(self.getParameterValue(self.THRESHOLD)))
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+         commands.append('-du')
+         commands.append(self.getOutputValue(self.DIST_UP_GRID))
+--- a/python/plugins/processing/algs/taudem/dinftranslimaccum.py
++++ b/python/plugins/processing/algs/taudem/dinftranslimaccum.py
+@@ -103,7 +103,7 @@ class DinfTransLimAccum(GeoAlgorithm):
+         if param is not None:
+             commands.append('-o')
+             commands.append(param)
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+ 
+         commands.append('-tla')
+--- a/python/plugins/processing/algs/taudem/dinftranslimaccum2.py
++++ b/python/plugins/processing/algs/taudem/dinftranslimaccum2.py
+@@ -109,7 +109,7 @@ class DinfTransLimAccum2(GeoAlgorithm):
+         if param is not None:
+             commands.append('-o')
+             commands.append(param)
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+ 
+         commands.append('-tla')
+--- a/python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
++++ b/python/plugins/processing/algs/taudem/dinftranslimaccum2_multi.py
+@@ -109,7 +109,7 @@ class DinfTransLimAccum2Multi(GeoAlgorit
+         if param is not None:
+             commands.append('-o')
+             commands.append(param)
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+ 
+         commands.append('-tla')
+--- a/python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
++++ b/python/plugins/processing/algs/taudem/dinftranslimaccum_multi.py
+@@ -103,7 +103,7 @@ class DinfTransLimAccumMulti(GeoAlgorith
+         if param is not None:
+             commands.append('-o')
+             commands.append(param)
+-        if str(self.getParameterValue(self.EDGE_CONTAM)).lower() == 'false':
++        if not self.getParameterValue(self.EDGE_CONTAM):
+             commands.append('-nc')
+ 
+         commands.append('-tla')
diff --git a/debian/patches/0001-updated-names-of-swedish-translators-as-requested-by.patch b/debian/patches/0001-updated-names-of-swedish-translators-as-requested-by.patch
new file mode 100644
index 0000000..689f39d
--- /dev/null
+++ b/debian/patches/0001-updated-names-of-swedish-translators-as-requested-by.patch
@@ -0,0 +1,23 @@
+From f6ca96edb0057272061c071fb41e958713a92cd3 Mon Sep 17 00:00:00 2001
+From: Werner Macho <werner.macho at gmail.com>
+Date: Mon, 9 Mar 2015 18:41:16 +0100
+Subject: updated names of swedish translators as requested by language
+ coordinator
+Origin: https://github.com/qgis/QGIS/commit/f6ca96edb0057272061c071fb41e958713a92cd3
+
+Signed-off-by: Werner Macho <werner.macho at gmail.com>
+---
+ scripts/tsstat.pl |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/scripts/tsstat.pl
++++ b/scripts/tsstat.pl
+@@ -79,7 +79,7 @@ my $translators= {
+ 	'sq' => '',
+ 	'sr at latin' => 'Goran Ivanković',
+ 	'sr' => 'Goran Ivanković',
+-	'sv' => 'Lars Luthman, Magnus Homann, Victor Axbom',
++	'sv' => 'Victor Axbom, Lars Luthman, Magnus Homann, Klas Karlsson, Isabelle J Wigren, Daniel Rosander, Anders Ekwall, Magnus Nilsson, Jonas Svensson, Christian Brinkenberg',
+ 	'sw' => '',
+ 	'ta' => '',
+ 	'te' => '',
diff --git a/debian/patches/series b/debian/patches/series
index 32b5565..c8b7e39 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -20,3 +20,15 @@ exclude-elvensword-resources.patch
 0001-translation-string-fix.patch
 0001-german-translation-fix-fixes-12231.patch
 0001-expression-builder-widget-save-scripts-in-the-same-m.patch
+0001-updated-names-of-swedish-translators-as-requested-by.patch
+0001-fix-inline-editing-of-scales-in-rule-based-renderer.patch
+0001-Followup-5d15a07-also-fix-edit-role.patch
+0001-processing-TauDEM-provider-overhaul.patch
+0001-processing-fix-handling-of-Check-for-edge-contaminat.patch
+0001-postgres-provider-also-cast-field-expressions-to-tex.patch
+0001-attribute-table-ShowVisible-behaviour-mode.patch
+0001-german-translation-update.patch
+0001-Server-fix-bug-with-multiple-joins.patch
+0001-Fix-incorrect-data-type-for-GDAL-layers-with-gain-of.patch
+0001-Followup-914ecc-also-fix-calculation-of-srcDataType.patch
+0001-Add-some-GDAL-provider-unit-tests.patch

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



More information about the Pkg-grass-devel mailing list