changeset 5576:2b862190aee4 surveysperbottleneckid

merge with default
author Thomas Junk <thomas.junk@intevation.de>
date Tue, 08 Feb 2022 10:20:26 +0100
parents 6709530f002e (current diff) ce9a9a1bf92f (diff)
children 973c71c07bb2
files client/src/components/fairway/AvailableFairwayDepthDialogue.vue pkg/controllers/routes.go
diffstat 103 files changed, 12152 insertions(+), 3005 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Jul 21 15:14:40 2021 +0200
+++ b/.hgtags	Tue Feb 08 10:20:26 2022 +0100
@@ -36,3 +36,8 @@
 d62587503a398ae842da78ecd2b40eaba16fec63 v5.2
 724f595693679e41bd0b20fd7147acae5e339176 v5.2
 1beb407cf7d0abd1d5eb5cfbcbd2f0fcfb2d1124 v5.3
+48e2b45f9be801a53c746589b907b9111e28b3a2 v5.4
+232377c112def41c254c50d567280eba096d527c v5.4.1
+79155213c4da9ad4d381e1b39d768d9137a5f827 v5.5
+79155213c4da9ad4d381e1b39d768d9137a5f827 v5.5
+d4fb695f8437f85d107dbcc10406bb9485529abb v5.5
--- a/Makefile	Wed Jul 21 15:14:40 2021 +0200
+++ b/Makefile	Tue Feb 08 10:20:26 2022 +0100
@@ -12,9 +12,9 @@
 
 export BUILDBASE
 
-.PHONY: all gemma client clean
+.PHONY: all gemma gmaggregate client clean
 
-all: gemma client
+all: gemma gmaggregate client
 
 $(ENVWARPPER):
 	@echo "Preparing go build environment:"
@@ -30,21 +30,28 @@
 gemma: $(ENVWARPPER)
 	"$(ENVWARPPER)" go build -o ./cmd/gemma/gemma ./cmd/gemma
 
+gmaggregate: $(ENVWARPPER)
+	cd ./contrib/gmaggregate; "$(ENVWARPPER)" go build
+
 client:
 	$(MAKE) -f Makefile.build -C client
 
 install: gemma
 	cp cmd/gemma/gemma $(BINDIR)
+	cp contrib/gmaggregate/gmaggregate $(BINDIR)
 
 tar: all
 	v="gemma-$$(hg id -i)" ;\
         tar --transform "s@^@$${v}/@" \
 	    -cJf "../$${v}.tar.xz" \
-	    cmd/gemma/gemma schema style-templates report-templates \
+	    cmd/gemma/gemma \
+	    contrib/gmaggregate/gmaggregate \
+	    schema style-templates report-templates \
 	    web misc example_conf.toml
 
 clean:
 	$(MAKE) -f Makefile.build -C client $@
-	rm -f "$(gemma-bin)"
+	rm -f contrib/gmaggregate/gmaggregate
+	rm -f cmd/gemma/gemma
 	chmod -R u+w "$(BUILDBASE)" # This is neccessary for deletion to work...
 	rm -rf "$(BUILDBASE)"
--- a/client/package.json	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/package.json	Tue Feb 08 10:20:26 2022 +0100
@@ -1,6 +1,6 @@
 {
   "name": "gemmajs",
-  "version": "5.4.0-dev",
+  "version": "5.5.1-dev",
   "license": "AGPL-3.0-or-later",
   "repository": {
     "type": "hg",
--- a/client/src/components/fairway/AvailableFairwayDepth.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/fairway/AvailableFairwayDepth.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -197,12 +197,15 @@
       "widthlimit2"
     ]),
     legend() {
-      const d = [this.depthlimit1D, this.depthlimit2D].sort();
-      const w = [this.widthlimit1D, this.widthlimit2D].sort();
+      const d = [this.depthlimit1D, this.depthlimit2D].sort((a, b) => a - b);
+      const w = [this.widthlimit1D, this.widthlimit2D].sort((a, b) => a - b);
       const lowerBound = [d[0] / 100, w[0]].filter(x => x).join(", ");
       const upperBound = [d[1] / 100, w[1]].filter(x => x).join(", ");
       let result;
-      if (this.depthlimit1D !== this.depthlimit2D) {
+      if (
+        this.depthlimit1D !== this.depthlimit2D ||
+        this.widthlimit1 !== this.widthlimit2
+      ) {
         result = [
           `> LDC`,
           `>= ${upperBound} [m]`,
@@ -441,7 +444,10 @@
       }
     },
     legendStyle(index) {
-      if (this.depthlimit1 === this.depthlimit2) {
+      if (
+        (this.depthlimit1 && this.depthlimit1 === this.depthlimit2) ||
+        (this.widthlimit1 && this.widthlimit1 === this.widthlimit2)
+      ) {
         let result = [
           `background-color: ${this.$options.COLORS.LDC};`,
           `background-color: ${this.$options.COLORS.HIGHEST};`
--- a/client/src/components/fairway/AvailableFairwayDepthDialogue.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/fairway/AvailableFairwayDepthDialogue.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -623,6 +623,12 @@
         this.depthLimit2 = 2.5;
       }
     },
+    widthLimitVisible() {
+      if (this.widthLimitVisible) {
+        this.widthLimit1 = 80;
+        this.widthLimit2 = 150;
+      }
+    },
     selectedBottleneck() {
       this.type = this.$options.BOTTLENECK;
       this.setSelectedBottleneck();
@@ -757,8 +763,8 @@
           type: this.type,
           depthLimit1: this.depthlimit1,
           depthLimit2: this.depthlimit2,
-          widthLimit1: this.widthLimit1,
-          widthLimit2: this.widthLimit2,
+          widthLimit1: Math.round(this.widthLimit1 * 100),
+          widthLimit2: Math.round(this.widthLimit2 * 100),
           limitingFactor: this.limitingFactor
         })
         .then(() => {
@@ -805,8 +811,8 @@
           type: this.type,
           depthLimit1: this.depthlimit1,
           depthLimit2: this.depthlimit2,
-          widthLimit1: this.widthLimit1,
-          widthLimit2: this.widthLimit2,
+          widthLimit1: Math.round(this.widthLimit1 * 100),
+          widthLimit2: Math.round(this.widthLimit2 * 100),
           limitingFactor: this.limitingFactor
         })
         .then(() => {
--- a/client/src/components/fairway/AvailableFairwayDepthLNWL.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/fairway/AvailableFairwayDepthLNWL.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -192,12 +192,15 @@
       "widthlimit2"
     ]),
     legendLNWL() {
-      const d = [this.depthlimit1D, this.depthlimit2D].sort();
-      const w = [this.widthlimit1D, this.widthlimit2D].sort();
+      const d = [this.depthlimit1D, this.depthlimit2D].sort((a, b) => a - b);
+      const w = [this.widthlimit1D, this.widthlimit2D].sort((a, b) => a - b);
       const lowerBound = [d[0] / 100, w[0]].filter(x => x).join(", ");
       const upperBound = [d[1] / 100, w[1]].filter(x => x).join(", ");
       let result;
-      if (this.depthlimit1D !== this.depthlimit2D) {
+      if (
+        this.depthlimit1D !== this.depthlimit2D ||
+        this.widthlimit1 !== this.widthlimit2
+      ) {
         result = [
           `> LDC`,
           `< ${lowerBound} [m]`,
@@ -325,7 +328,10 @@
     },
     legendStyle(index) {
       let style;
-      if (this.depthlimit1 !== this.depthlimit2) {
+      if (
+        this.depthlimit1 !== this.depthlimit2 ||
+        this.widthlimit1 !== this.widthlimit2
+      ) {
         style = {
           0: `background-color: ${this.$options.LWNLCOLORS.LDC};`,
           1: `background-color: ${this.$options.AFDCOLORS[2]};`,
--- a/client/src/components/layers/Layerselect.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/layers/Layerselect.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -158,7 +158,7 @@
     },
     loadLegendImage(layer, storeTarget) {
       HTTP.get(
-        `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.3.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=${layer}&legend_options=columns:4;fontAntiAliasing:true&SCALE=4000`,
+        `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.3.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=${layer}&legend_options=columns:4%3BfontAntiAliasing:true&SCALE=4000`,
         {
           headers: {
             Accept: "image/png",
--- a/client/src/components/layers/LegendElement.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/layers/LegendElement.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -122,12 +122,12 @@
         this.url =
           `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=` +
           this.layer.getSource().getParams().LAYERS +
-          `&legend_options=columns:4;fontAntiAliasing:true`;
+          `&legend_options=columns:4%3BfontAntiAliasing:true`;
       } else {
         this.url =
           `/internal/wms?REQUEST=GetLegendGraphic&VERSION=1.0.0&SCALE=80000&FORMAT=image/png&WIDTH=20&HEIGHT=20&LAYER=` +
           this.layer.getSource().getParams().LAYERS +
-          `&legend_options=columns:1;fontAntiAliasing:true;forceLabels:off`;
+          `&legend_options=columns:1%3BfontAntiAliasing:true%3BforceLabels:off`;
       }
 
       this.loadImageSrc();
--- a/client/src/components/ui/UIBoxHeader.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/ui/UIBoxHeader.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -10,6 +10,18 @@
       {{ title }}
     </span>
     <div class="d-flex flex-row">
+      <span class="box-control" v-if="checkBox" style="cursor: default;">
+        <input
+          id="checkboxID"
+          type="checkbox"
+          class="checkbox-header"
+          :checked="checkBox.value"
+          @change="checkBox.callback"
+        />
+        <label for="checkboxID" class="ml-1 small mb-0 checkbox-header">
+          {{ checkBox.label }}
+        </label>
+      </span>
       <span
         class="box-control"
         v-for="(action, index) in actions"
@@ -52,6 +64,8 @@
   &.small
     padding: 0.1rem 0.1rem 0.1rem 0.25rem
     min-height: 27px
+.checkbox-header
+  cursor: pointer
 </style>
 
 <script>
@@ -75,7 +89,8 @@
     title: String,
     closeCallback: Function,
     actions: Array,
-    small: Boolean
+    small: Boolean,
+    checkBox: Object
   }
 };
 </script>
--- a/client/src/components/usermanagement/Userdetail.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/usermanagement/Userdetail.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -131,7 +131,9 @@
             :disabled="submitted"
             class="shadow-sm btn btn-info submit-button"
           >
-            <translate>Save</translate>
+            <span>{{
+              currentUser.active ? $gettext("Save") : $gettext("Reactivate")
+            }}</span>
           </button>
         </div>
       </form>
@@ -245,6 +247,9 @@
   },
   mounted() {
     this.currentUser = { ...this.user };
+    if (!this.currentUser.active) {
+      this.currentUser.email = "";
+    }
     this.path = this.user.name;
   },
   watch: {
@@ -253,6 +258,9 @@
     },
     user() {
       this.currentUser = { ...this.user };
+      if (!this.currentUser.active) {
+        this.currentUser.email = "";
+      }
       this.path = this.user.name;
       this.clearPassword();
       this.clearErrors();
@@ -279,7 +287,10 @@
         isEmailValid(this.currentUser.email) &&
         this.currentUser.country &&
         this.password === this.passwordre &&
-        (this.password === "" || !violatedPasswordRules(this.password))
+        ((this.currentUser.active &&
+          (this.password === "" || !violatedPasswordRules(this.password))) ||
+          // Do not accept empty password by user-reactivation
+          (!this.currentUser.active && !violatedPasswordRules(this.password)))
       );
     }
   },
@@ -318,12 +329,21 @@
         this.password === this.passwordre
           ? ""
           : this.$gettext("Passwords do not match!");
-      this.errors.password =
-        this.password === "" || !violatedPasswordRules(this.password)
+      if (this.currentUser.active) {
+        this.errors.password =
+          this.password === "" || !violatedPasswordRules(this.password)
+            ? ""
+            : this.$gettext(
+                "Password should at least be 8 char long including 1 digit and 1 special char like $"
+              );
+      } else {
+        // Force entering password for user-reactivation
+        this.errors.password = !violatedPasswordRules(this.password)
           ? ""
           : this.$gettext(
               "Password should at least be 8 char long including 1 digit and 1 special char like $"
             );
+      }
     },
     validateEmailaddress() {
       this.errors.email = isEmailValid(this.currentUser.email)
--- a/client/src/components/usermanagement/Usermanagement.vue	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/components/usermanagement/Usermanagement.vue	Tue Feb 08 10:20:26 2022 +0100
@@ -4,7 +4,11 @@
     <div class="d-flex content py-2">
       <div :class="userlistStyle">
         <div class="card shadow-xs">
-          <UIBoxHeader icon="users-cog" :title="usersLabel" />
+          <UIBoxHeader
+            icon="users-cog"
+            :title="usersLabel"
+            :checkBox="checkboxObject"
+          />
           <UITableHeader
             :columns="[
               { id: 'role', title: `${roleForColumLabel}`, class: 'col-1' },
@@ -15,14 +19,17 @@
             ]"
           />
           <UITableBody
-            :data="users | sortTable(sortColumn, sortDirection, page, pageSize)"
+            :data="
+              usersForTable
+                | sortTable(sortColumn, sortDirection, page, pageSize)
+            "
             :isActive="item => item === currentUser"
             maxHeight="47rem"
           >
             <template v-slot:row="{ item: user }">
               <div
                 class="table-cell center col-1"
-                @click="selectUser(user.user)"
+                :style="{ opacity: user.active ? '1' : '0.7' }"
               >
                 <font-awesome-icon
                   v-tooltip="roleLabel(user.role)"
@@ -30,16 +37,22 @@
                   class="fa-lg"
                 />
               </div>
-              <div class="table-cell col-4" @click="selectUser(user.user)">
+              <div
+                class="table-cell col-4"
+                :style="{ opacity: user.active ? '1' : '0.7' }"
+              >
                 {{ user.user }}
               </div>
               <div
+                :style="{ opacity: user.active ? '1' : '0.7' }"
                 class="table-cell center col-1"
-                @click="selectUser(user.user)"
               >
                 {{ user.country }}
               </div>
-              <div class="table-cell col-3" @click="selectUser(user.user)">
+              <div
+                class="table-cell col-3"
+                :style="{ opacity: user.active ? '1' : '0.7' }"
+              >
                 {{ user.email }}
               </div>
               <div class="table-cell center col-1">
@@ -52,15 +65,30 @@
                   @change="toggleReport(user)"
                   v-tooltip="receivesReportLabel"
                   :width="40"
+                  :disabled="!user.active"
                   :height="20"
                 />
               </div>
               <div class="table-cell col text-right justify-content-end">
                 <button
+                  @click="selectUser(user.user)"
+                  class="btn btn-xs btn-dark mr-1"
+                  v-tooltip="getEditLabel(user.active)"
+                >
+                  <font-awesome-icon
+                    v-if="user.active"
+                    icon="pencil-alt"
+                    fixed-width
+                  />
+                  <font-awesome-icon v-else icon="undo" fixed-width />
+                </button>
+                <button
                   @click="sendTestMail(user.user)"
                   class="btn btn-xs btn-dark mr-1"
                   v-tooltip="sendMailLabel"
                   v-if="user.email"
+                  :disabled="!user.active"
+                  :style="{ cursor: user.active ? 'pointer' : 'default' }"
                 >
                   <font-awesome-icon icon="paper-plane" fixed-width />
                 </button>
@@ -68,6 +96,8 @@
                   @click="deleteUser(user.user)"
                   class="btn btn-xs btn-dark"
                   v-tooltip="deleteUserLabel"
+                  :style="{ cursor: user.active ? 'pointer' : 'default' }"
+                  :disabled="!user.active"
                 >
                   <font-awesome-icon icon="trash" fixed-width />
                 </button>
@@ -154,7 +184,9 @@
   data() {
     return {
       sortColumn: "user", // overriding the sortTable mixin's empty default value
-      reportToggled: false
+      reportToggled: false,
+      usersForTable: [],
+      areSomeUsersHidden: false
     };
   },
   components: {
@@ -193,7 +225,7 @@
       return this.$gettext("Email");
     },
     pages() {
-      return Math.ceil(this.users.length / this.pageSize);
+      return Math.ceil(this.usersForTable.length / this.pageSize);
     },
     tableStyle() {
       return {
@@ -212,9 +244,46 @@
           userlistextended: !this.isUserDetailsVisible
         }
       ];
+    },
+    checkboxObject() {
+      // Hide checkbox in case there are no deactivated users
+      if (this.users.some(u => !u.active)) {
+        return {
+          value: this.areSomeUsersHidden,
+          label: "Hide inactive users",
+          callback: () => {
+            this.changeDisplayingState();
+          }
+        };
+      } else {
+        return undefined;
+      }
     }
   },
+  watch: {
+    users() {
+      this.filterUsers();
+    }
+  },
+  mounted() {
+    this.usersForTable = this.users;
+  },
   methods: {
+    getEditLabel(active) {
+      if (active) return this.$gettext("Edit user");
+      return this.$gettext("Reactivate user");
+    },
+    changeDisplayingState() {
+      this.areSomeUsersHidden = !this.areSomeUsersHidden;
+      this.filterUsers();
+    },
+    filterUsers() {
+      if (this.areSomeUsersHidden) {
+        this.usersForTable = this.users.filter(u => u.active);
+      } else {
+        this.usersForTable = this.users;
+      }
+    },
     toggleReport(user) {
       HTTP.patch(
         `/users/${user.user}`,
@@ -297,7 +366,18 @@
           callback: () => {
             this.$store
               .dispatch("usermanagement/deleteUser", { name })
-              .then(() => {
+              .then(response => {
+                displayInfo({
+                  message:
+                    name +
+                    // Exclude whitespaces from the string passed to "gettext" function
+                    " " +
+                    this.$gettext("user account") +
+                    " " +
+                    response.data.action +
+                    " " +
+                    this.$gettext("successfully")
+                });
                 this.$store
                   .dispatch("usermanagement/loadUsers")
                   .catch(error => {
--- a/client/src/locale/bg_BG/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/bg_BG/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -23,7 +23,7 @@
 msgid " does not match any template's element"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
 msgstr ""
 
@@ -35,19 +35,19 @@
 msgid "%{layerName} Fill Color"
 msgstr ""
 
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
 msgstr ""
 
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
 msgstr ""
 
@@ -55,7 +55,7 @@
 msgid "120 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr ""
 
@@ -63,7 +63,7 @@
 msgid "200 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
 msgstr ""
 
@@ -71,11 +71,11 @@
 msgid "30 Days"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:678
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
 msgstr ""
 
@@ -107,8 +107,8 @@
 msgid "According gauge data:"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr ""
 
@@ -120,7 +120,7 @@
 msgid "AM"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:466
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
 msgstr ""
 
@@ -132,8 +132,8 @@
 msgid "Apr"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr ""
@@ -142,29 +142,33 @@
 msgid "Area"
 msgstr "Район"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr ""
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 msgid "Aug"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr ""
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 msgid "Avail: Latest measurement from "
 msgstr ""
 
-#: src/components/identify/Identify.vue:436
+#: src/components/identify/Identify.vue:505
 msgid "Avail: Latest measurement older than"
 msgstr ""
 
@@ -178,7 +182,7 @@
 msgid "Available fairway depth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 msgid "Available Fairway Depth"
 msgstr ""
 
@@ -186,13 +190,13 @@
 msgid "Available fairway depth vs LNWL"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 msgid "Available Fairway Depth vs LNWL:"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 msgid "Available Fairway Depth:"
 msgstr ""
 
@@ -209,56 +213,60 @@
 msgid "back to login"
 msgstr ""
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -269,25 +277,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr ""
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -296,8 +305,8 @@
 msgid "BeamType"
 msgstr "Тип"
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 #, fuzzy
 msgid "Bottleneck"
@@ -307,67 +316,71 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 #, fuzzy
 msgid "Bottleneck Surveys"
 msgstr "Критични участъци"
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 #, fuzzy
 msgid "Bottleneck:"
 msgstr "Критични участъци"
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr ""
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr ""
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 msgid "Cancel"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr ""
 
@@ -387,11 +400,11 @@
 msgid "Choose color"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr ""
 
@@ -417,11 +430,11 @@
 msgid "Compare with"
 msgstr ""
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr ""
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr ""
 
@@ -431,25 +444,25 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 #, fuzzy
 msgid "Country"
 msgstr "Държава"
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr ""
 
@@ -457,7 +470,7 @@
 msgid "Current Waterlevel"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr ""
 
@@ -465,15 +478,19 @@
 msgid "Data Availability/Accuracy"
 msgstr ""
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr ""
 
@@ -488,7 +505,7 @@
 msgid "Date info"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr ""
 
@@ -496,13 +513,13 @@
 msgid "Day"
 msgstr ""
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -510,8 +527,8 @@
 msgid "Dec"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr ""
@@ -536,14 +553,14 @@
 msgid "Define Stretches"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 msgid "Delete"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 msgid "Delete cross profile"
 msgstr ""
 
@@ -555,11 +572,11 @@
 msgid "Delete Template"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 msgid "Delete user"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 msgid "Delete User"
 msgstr ""
 
@@ -575,13 +592,13 @@
 msgid "deleted successfully"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr ""
 
@@ -593,7 +610,7 @@
 msgid "Depth Reference"
 msgstr ""
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr ""
 
@@ -609,11 +626,11 @@
 msgid "Depthreference"
 msgstr ""
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 msgid "Distance Mark"
 msgstr ""
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 msgid "Distance Mark ashore"
 msgstr ""
 
@@ -625,7 +642,7 @@
 msgid "Distance marks virtual"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr ""
 
@@ -633,7 +650,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr ""
 
@@ -659,12 +676,21 @@
 msgid "Download Meta.json"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:273
+msgid "Edit user"
+msgstr ""
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 #, fuzzy
 msgid "Email"
 msgstr "E-mail"
@@ -700,11 +726,11 @@
 msgid "Enqueued"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr ""
 
@@ -724,11 +750,11 @@
 msgid "Errorlog"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 msgid "Every"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr ""
 
@@ -781,15 +807,15 @@
 msgid "Fairway (LOS 3)"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr ""
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 msgid "Fairway Critical"
 msgstr ""
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 msgid "Fairway Date"
 msgstr ""
 
@@ -797,17 +823,17 @@
 msgid "Fairway dimension"
 msgstr ""
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 msgid "Fairway Dimensions"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 msgid "FairwayAvailability"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr ""
 
@@ -833,21 +859,21 @@
 msgid "Feb"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 msgid "File Import"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr ""
 
@@ -864,7 +890,7 @@
 msgid "Fri"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr ""
@@ -879,11 +905,11 @@
 msgid "From"
 msgstr ""
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr ""
 
@@ -899,11 +925,11 @@
 msgid "Gauge measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 msgid "Gauge Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr ""
 
@@ -911,24 +937,24 @@
 msgid "Gauges"
 msgstr ""
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr ""
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 msgid "Generated by"
 msgstr ""
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 msgid "Generated PDFs use font:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr ""
 
@@ -958,21 +984,21 @@
 msgid "ID"
 msgstr ""
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 msgid "Identified Features"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -982,7 +1008,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 msgid "Import import: #"
 msgstr ""
 
@@ -995,7 +1021,7 @@
 msgid "Import Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr ""
 
@@ -1007,7 +1033,7 @@
 msgid "Import via"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 msgid "Import Waterway Profiles"
 msgstr ""
 
@@ -1026,11 +1052,11 @@
 msgid "Invalid element"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr ""
 
@@ -1038,8 +1064,8 @@
 msgid "Jan"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr ""
@@ -1048,8 +1074,8 @@
 msgid "Jul"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr ""
@@ -1058,8 +1084,8 @@
 msgid "Jun"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr ""
@@ -1080,21 +1106,21 @@
 msgid "Later"
 msgstr ""
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 msgid "Latest measurement"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 msgid "Latest Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 msgid "Latest Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 msgid "Latest Waterlevel Date"
 msgstr ""
 
@@ -1107,11 +1133,15 @@
 msgid "Length"
 msgstr ""
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+msgid "Loading Error"
+msgstr ""
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr ""
@@ -1135,12 +1165,12 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr ""
 
@@ -1159,22 +1189,26 @@
 msgid "Mar"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 msgid "May"
 msgstr ""
@@ -1191,16 +1225,16 @@
 msgid "Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 msgid "Measurement is within"
 msgstr ""
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 msgid "measurements"
 msgstr ""
 
@@ -1214,21 +1248,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr ""
 
@@ -1236,24 +1270,24 @@
 msgid "Mon"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 msgid "monthly"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1262,17 +1296,17 @@
 msgid "Name"
 msgstr "име"
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr ""
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr ""
 
@@ -1290,10 +1324,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr ""
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1311,7 +1341,7 @@
 msgid "New stretch"
 msgstr ""
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr ""
 
@@ -1321,11 +1351,16 @@
 msgid "No data available."
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+msgid "No data selectable"
+msgstr ""
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr ""
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 msgid "No measurement available"
 msgstr ""
 
@@ -1333,7 +1368,7 @@
 msgid "No results."
 msgstr ""
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr ""
 
@@ -1341,7 +1376,7 @@
 msgid "No style-changes"
 msgstr ""
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr ""
 
@@ -1357,8 +1392,8 @@
 msgid "No valid waterlevel data available."
 msgstr ""
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1366,14 +1401,14 @@
 msgid "Nov"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr ""
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr ""
 
@@ -1382,7 +1417,7 @@
 msgid "Numbers"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 msgid "o' clock"
 msgstr ""
 
@@ -1394,13 +1429,13 @@
 msgid "Oct"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr ""
 
@@ -1412,11 +1447,11 @@
 msgid "Old"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 msgid "Onetime Imports"
 msgstr ""
 
@@ -1429,17 +1464,17 @@
 msgid "Owner"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr "Парола"
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr "Парола"
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr ""
 
@@ -1447,13 +1482,14 @@
 msgid "Password reset requested!"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr ""
 
@@ -1465,16 +1501,16 @@
 msgid "pending"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 #, fuzzy
 msgid "Please choose a country"
 msgstr "Моля, изберете държава"
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr ""
 
@@ -1483,7 +1519,7 @@
 msgid "Please enter a date"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr ""
 
@@ -1496,15 +1532,15 @@
 msgid "Please enter a Featuretype"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr ""
 
@@ -1526,7 +1562,7 @@
 msgid "Please enter a source organization"
 msgstr "Моля, изберете държава"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr ""
 
@@ -1574,28 +1610,27 @@
 msgid "Please enter an originator"
 msgstr "Моля, изберете държава"
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr ""
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+msgid "Please select a report to update"
+msgstr ""
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+msgid "Please select stats to update"
+msgstr ""
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1604,7 +1639,7 @@
 msgid "portrait"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr ""
 
@@ -1617,7 +1652,7 @@
 msgid "Prediction"
 msgstr ""
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr ""
 
@@ -1629,11 +1664,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr ""
 
@@ -1653,21 +1688,29 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+msgid "Reactivate user"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 #, fuzzy
 msgid "Recency of Bottleneck Surveys"
 msgstr "Критични участъци"
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr ""
 
@@ -1679,14 +1722,18 @@
 msgid "Refresh"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 msgid "Regular Imports"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr ""
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+msgid "Reports"
+msgstr ""
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr ""
@@ -1703,15 +1750,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1729,11 +1776,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1745,25 +1792,24 @@
 msgid "Sat"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 msgid "Saved import: #"
 msgstr ""
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr ""
 
@@ -1772,15 +1818,15 @@
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 msgid "Scheduled"
 msgstr ""
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 msgid "Section"
 msgstr ""
 
@@ -1804,7 +1850,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 #, fuzzy
 msgid "Select bottleneck"
 msgstr "Критични участъци"
@@ -1837,7 +1883,7 @@
 msgid "Send all"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr ""
 
@@ -1845,13 +1891,13 @@
 msgid "Sep"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr ""
 
@@ -1859,7 +1905,7 @@
 msgid "Show Hydrological Conditions"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr ""
 
@@ -1871,11 +1917,11 @@
 msgid "Signer"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr ""
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1899,7 +1945,7 @@
 msgid "Sounding Result Comparison"
 msgstr ""
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 msgid "Sounding results"
 msgstr ""
 
@@ -1916,16 +1962,16 @@
 msgid "Source organization"
 msgstr ""
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 msgid "Source Organization"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr ""
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr ""
 
@@ -1934,7 +1980,7 @@
 msgid "Staging Area"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr ""
 
@@ -1942,7 +1988,7 @@
 msgid "Start rhm"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr ""
 
@@ -1966,11 +2012,15 @@
 msgid "Starting Year"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 msgid "Status"
 msgstr ""
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 msgid "Stretch"
 msgstr ""
 
@@ -1979,13 +2029,17 @@
 msgstr ""
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+msgid "successfully"
+msgstr ""
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -1993,17 +2047,17 @@
 msgid "Sun"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr ""
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr ""
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr ""
 
@@ -2011,11 +2065,11 @@
 msgid "Survey from:"
 msgstr ""
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 msgid "Survey type"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr ""
 
@@ -2023,7 +2077,7 @@
 msgid "Sysadmin"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 msgid "System-Administrator"
 msgstr ""
 
@@ -2035,10 +2089,16 @@
 msgid "Systemconfiguration"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 msgid "Testmail sent"
 msgstr ""
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2126,9 +2186,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2136,7 +2196,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2146,12 +2206,12 @@
 msgid "Thu"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2173,21 +2233,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 msgid "Trigger import"
 msgstr ""
 
@@ -2195,7 +2255,7 @@
 msgid "Tue"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr ""
@@ -2211,11 +2271,15 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 msgid "update import: #"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr ""
 
@@ -2239,7 +2303,7 @@
 msgid "uploaded successfully"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2254,25 +2318,34 @@
 msgid "URL"
 msgstr ""
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 msgid "User Manual"
 msgstr ""
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr ""
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr ""
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2284,7 +2357,7 @@
 msgid "Value"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2309,17 +2382,17 @@
 msgstr ""
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 msgid "Waterlevel [m]"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 msgid "Waterway Admin"
 msgstr ""
 
@@ -2327,7 +2400,7 @@
 msgid "Waterway area"
 msgstr ""
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 msgid "Waterway Area"
 msgstr ""
 
@@ -2335,7 +2408,7 @@
 msgid "Waterway axis"
 msgstr ""
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 msgid "Waterway Axis"
 msgstr ""
 
@@ -2343,7 +2416,7 @@
 msgid "Waterway gauges"
 msgstr ""
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 msgid "Waterway Profile"
 msgstr ""
 
@@ -2352,7 +2425,7 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 msgid "Waterway User"
 msgstr ""
 
@@ -2360,16 +2433,16 @@
 msgid "Wed"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr ""
 
@@ -2385,26 +2458,30 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr "Година"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 #, fuzzy
 msgid "yearly"
 msgstr "Година"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 #, fuzzy
 msgid "yes"
 msgstr "Слоеве"
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
 msgstr ""
 
+#: src/components/identify/formatter.js:127
+msgid "ZPG exception"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Chose preset"
 #~ msgstr "Избиране на формат"
--- a/client/src/locale/de_AT/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/de_AT/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -23,7 +23,7 @@
 msgid " does not match any template's element"
 msgstr " stimmt mit keinem Vorlagenelement überein"
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
 msgstr " wurde erfolgreich hochgeladen"
 
@@ -35,19 +35,19 @@
 msgid "%{layerName} Fill Color"
 msgstr "Füllfarbe"
 
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
 msgstr "%a %d"
 
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
 msgstr "%b %d"
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
 msgstr "0 bedeutet, keine Wiederholung"
 
@@ -55,7 +55,7 @@
 msgid "120 dpi"
 msgstr "120 dpi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr "15 Minuten"
 
@@ -63,7 +63,7 @@
 msgid "200 dpi"
 msgstr "200 dpi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
 msgstr "2h45m bedeutet 2 Stunden und 45 Minuten"
 
@@ -71,11 +71,11 @@
 msgid "30 Days"
 msgstr "30 Tage"
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
 msgstr "30m entsprechen 30 Minuten"
 
-#: src/components/importconfiguration/ScheduledImports.vue:678
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
 msgstr "60 enspricht 60 Sekunden "
 
@@ -107,8 +107,8 @@
 msgid "According gauge data:"
 msgstr "Laut Pegelstellendaten:"
 
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr "Benutzer hinzufügen"
 
@@ -120,7 +120,7 @@
 msgid "AM"
 msgstr "AM"
 
-#: src/components/importoverview/ImportOverview.vue:466
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
 msgstr "bestätigt"
 
@@ -133,8 +133,8 @@
 msgid "Apr"
 msgstr "April"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr "April"
@@ -143,30 +143,34 @@
 msgid "Area"
 msgstr "Fläche"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr "am"
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 #, fuzzy
 msgid "Aug"
 msgstr "August"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr "August"
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr "Verfügbarkeit: Unterhalb des Schwellenwertes"
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 msgid "Avail: Latest measurement from "
 msgstr "Verfügbarkeit: Letzte Messung vom "
 
-#: src/components/identify/Identify.vue:436
+#: src/components/identify/Identify.vue:505
 msgid "Avail: Latest measurement older than"
 msgstr "Verfügbarkeit: Letzte Messung älter als"
 
@@ -180,7 +184,7 @@
 msgid "Available fairway depth"
 msgstr "Verfügbare Fahrrinnentiefe"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 #, fuzzy
 msgid "Available Fairway Depth"
 msgstr "Verfügbare Fahrrinnen Tiefen"
@@ -189,13 +193,13 @@
 msgid "Available fairway depth vs LNWL"
 msgstr "Verfügbare Fahrrinnen Tiefen vs RNW"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 msgid "Available Fairway Depth vs LNWL:"
 msgstr "Verfügbare Fahrrinnen Tiefen vs RNW:"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 msgid "Available Fairway Depth:"
 msgstr "Verfügbare Fahrrinnen Tiefen:"
 
@@ -213,56 +217,60 @@
 msgid "back to login"
 msgstr "zurück zur Anmeldung"
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -273,25 +281,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr "Server-Fehler"
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -299,8 +308,8 @@
 msgid "BeamType"
 msgstr "Typ des Echosounders"
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 msgid "Bottleneck"
 msgstr "Seichtstelle"
@@ -309,65 +318,69 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr "Seichtstellen Isobathenklassen"
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 msgid "Bottleneck Surveys"
 msgstr "Seichtstellen Vermessung"
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 msgid "Bottleneck:"
 msgstr "Seichtstelle:"
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr "Seichtstellen"
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr "Berechnung der Unterschiede"
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 msgid "Cancel"
 msgstr "Abbrechen"
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr "Kilometrierung"
 
@@ -389,11 +402,11 @@
 msgid "Choose color"
 msgstr "Farbe auswählen"
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr "Wähle hochzuladende Datei"
 
@@ -422,11 +435,11 @@
 msgid "Compare with"
 msgstr "Vergleiche mit"
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr "Zuversicht per 24h"
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr "Zuversicht per 72h"
 
@@ -436,24 +449,24 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr "Bestätigen"
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr "Koordinaten auf die Zwischenablage kopiert!"
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 msgid "Country"
 msgstr "Land"
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr "Crontab-Zeile"
 
@@ -461,7 +474,7 @@
 msgid "Current Waterlevel"
 msgstr "Aktueller Wasserstand"
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr "Einstellbare Tiefe"
 
@@ -469,15 +482,19 @@
 msgid "Data Availability/Accuracy"
 msgstr "Daten Verfügbarkeit/ Genauigkeit"
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr "Daten zu alt. Schwellenwert:"
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr "Daten sind innerhalb der Gültigkeitsschwelle"
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr "Daten sind innerhalb des Gültigkeitzeitraums"
 
@@ -492,7 +509,7 @@
 msgid "Date info"
 msgstr "Datum"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr "Tag"
 
@@ -500,13 +517,13 @@
 msgid "Day"
 msgstr "Tag"
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -514,8 +531,8 @@
 msgid "Dec"
 msgstr "Dez"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr "Dezember"
@@ -540,14 +557,14 @@
 msgid "Define Stretches"
 msgstr "Definiere Strecke"
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 msgid "Delete"
 msgstr "Löschen"
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 msgid "Delete cross profile"
 msgstr "Lösche gespeicherte Querprofile"
 
@@ -559,11 +576,11 @@
 msgid "Delete Template"
 msgstr "Lösche Vorlage"
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 msgid "Delete user"
 msgstr "Konto löschen"
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 msgid "Delete User"
 msgstr "Lösche Nutzer"
 
@@ -579,13 +596,13 @@
 msgid "deleted successfully"
 msgstr "erfolgreich gelöscht"
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr "Löchen "
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr "Tiefe"
 
@@ -599,7 +616,7 @@
 msgid "Depth Reference"
 msgstr "Tiefenreferenz"
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr "Tiefe relativ zu"
 
@@ -615,11 +632,11 @@
 msgid "Depthreference"
 msgstr "Tiefenreferenz"
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 msgid "Distance Mark"
 msgstr "Flusshektometer"
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 msgid "Distance Mark ashore"
 msgstr "Flusshektometer Ufer"
 
@@ -631,7 +648,7 @@
 msgid "Distance marks virtual"
 msgstr "Flusshektometer Achse (virtuel)"
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr "Wollen sie das Querprofil löschen:"
 
@@ -639,7 +656,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr "Wollen sie das ausgewählte Template löschen:"
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr "Wollen sie den Nutzeraccount löschen:"
 
@@ -665,12 +682,22 @@
 msgid "Download Meta.json"
 msgstr "Meta.json Herunterladen"
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr "Zuvor"
 
+#: src/components/usermanagement/Usermanagement.vue:273
+#, fuzzy
+msgid "Edit user"
+msgstr "Benutzername eingeben"
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 msgid "Email"
 msgstr "E-Mail"
 
@@ -705,11 +732,11 @@
 msgid "Enqueued"
 msgstr "Hinzugefügt"
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr "Manuelle Koordinateneingabe"
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr "Namen für Profilschnitt eingeben"
 
@@ -729,11 +756,11 @@
 msgid "Errorlog"
 msgstr "Fehlerprotokoll"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 msgid "Every"
 msgstr "Jeder"
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr "Beispiele:"
 
@@ -786,15 +813,15 @@
 msgid "Fairway (LOS 3)"
 msgstr "Fahrrinne (LOS 3)"
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr "Fahrrinnenverfügbarkeit"
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 msgid "Fairway Critical"
 msgstr "Kritischer Fahrrinnenabschnitt"
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 msgid "Fairway Date"
 msgstr "Fahrrinnen Datum"
 
@@ -802,18 +829,18 @@
 msgid "Fairway dimension"
 msgstr "Fahrrinnenabmessung"
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 msgid "Fairway Dimensions"
 msgstr "Fahrinnenabmessungen"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 #, fuzzy
 msgid "FairwayAvailability"
 msgstr "Fahrrinnenverfügbarkeit"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr "Fahrrinnenverfügbarkeit vs RNW"
 
@@ -840,21 +867,21 @@
 msgid "Feb"
 msgstr "Februar"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr "Februar"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr "Datei"
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 msgid "File Import"
 msgstr "Daten Import"
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr "Beenden der Überprüfung"
 
@@ -871,7 +898,7 @@
 msgid "Fri"
 msgstr "Freitag"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr "Freitag"
@@ -886,11 +913,11 @@
 msgid "From"
 msgstr "Von"
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr "G.M. Anzahl der Messungen in den letzten 14 Tagen"
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr "Pegel"
 
@@ -906,11 +933,11 @@
 msgid "Gauge measurement"
 msgstr "Pegelmessung"
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 msgid "Gauge Waterlevel"
 msgstr "Wasserstand am Pegel"
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr "Datum der Messung"
 
@@ -918,24 +945,24 @@
 msgid "Gauges"
 msgstr "Pegel"
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr "PDF generieren"
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 msgid "Generated by"
 msgstr "Erstellt von"
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 msgid "Generated PDFs use font:"
 msgstr "Generierte PDFs nutzen die Schriftart:"
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr "Höchste Zuversicht"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr "Stunde"
 
@@ -966,23 +993,23 @@
 msgid "ID"
 msgstr "ID"
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 msgid "Identified Features"
 msgstr "Identifizierte Features"
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr ""
 "Wenn kein Error während des Imports auftritt, dann gibt es keine "
 "Wiederholung der Anfrage."
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -992,7 +1019,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr "Import von bestätigten Wasserstandsdaten"
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 msgid "Import import: #"
 msgstr "Import import: #"
 
@@ -1005,7 +1032,7 @@
 msgid "Import Schedule"
 msgstr "Importplan"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr "Seichtstellenmessungen importieren"
 
@@ -1017,7 +1044,7 @@
 msgid "Import via"
 msgstr "Import via"
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 msgid "Import Waterway Profiles"
 msgstr "Import der Fahrrinnenprofile"
 
@@ -1036,11 +1063,11 @@
 msgid "Invalid element"
 msgstr "Ungültiges Element"
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr "Ungültige E-Mail"
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr "Ungültige Eingabe"
 
@@ -1049,8 +1076,8 @@
 msgid "Jan"
 msgstr "Januar"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr "Januar"
@@ -1060,8 +1087,8 @@
 msgid "Jul"
 msgstr "Juli"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr "Juli"
@@ -1071,8 +1098,8 @@
 msgid "Jun"
 msgstr "Juni"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr "Juni"
@@ -1093,21 +1120,21 @@
 msgid "Later"
 msgstr "Später"
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 msgid "Latest measurement"
 msgstr "Neueste Messung"
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 msgid "Latest Measurement"
 msgstr "Neueste Messung"
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 msgid "Latest Waterlevel"
 msgstr "Aktueller Wasserstand"
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 msgid "Latest Waterlevel Date"
 msgstr "Datum der neuesten Wasserstandsmessung"
 
@@ -1120,11 +1147,16 @@
 msgid "Length"
 msgstr "Länge"
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+#, fuzzy
+msgid "Loading Error"
+msgstr "Formatfehler"
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr "Login"
@@ -1148,12 +1180,12 @@
 msgstr "Langzeit Amplitude"
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr "LOS"
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr "Manuell getätigter Import: #"
 
@@ -1172,22 +1204,26 @@
 msgid "Mar"
 msgstr "März"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr "März"
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr "Maximale Wiederholungsanzahl"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr "Max. Breite"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 msgid "May"
 msgstr "Mai"
@@ -1205,16 +1241,16 @@
 msgid "Measurement"
 msgstr "Messung"
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr "Anzahl der Messungen in den letzten 14 Tagen"
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 msgid "Measurement is within"
 msgstr "Messung ist innerhalb"
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 #, fuzzy
 msgid "measurements"
 msgstr "Messung"
@@ -1229,21 +1265,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr "Minimum G.M. Anzahl in den letzten 14 Tagen"
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr "Minuten nach"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr "Min. Breite"
 
@@ -1251,25 +1287,25 @@
 msgid "Mon"
 msgstr "Mo"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr "Montag"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr "Monat"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 #, fuzzy
 msgid "monthly"
 msgstr "monatlich"
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr "monatlich"
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1277,17 +1313,17 @@
 msgid "Name"
 msgstr "Name"
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr ""
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr "Nash-Sutcliffe nicht verfügbar"
 
@@ -1305,10 +1341,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr "Negiere das Z-Vorzeichen in xyz Dateien"
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr "Negative Zahlen bedeuten eine \"unendliche\" Anzahl der Versuche"
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1327,7 +1359,7 @@
 msgid "New stretch"
 msgstr "Neue Strecke"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr "nein"
 
@@ -1337,11 +1369,17 @@
 msgid "No data available."
 msgstr "Keine Daten verfügbar."
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+#, fuzzy
+msgid "No data selectable"
+msgstr "Keine Daten verfügbar."
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr "Keine Objekte identifiziert."
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 msgid "No measurement available"
 msgstr "Keine Messwerte verfügbar"
 
@@ -1349,7 +1387,7 @@
 msgid "No results."
 msgstr "Keine Ergebnisse."
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr "Keine \"Revisiting time\" definiert"
 
@@ -1357,7 +1395,7 @@
 msgid "No style-changes"
 msgstr "Keine Style-Änderungen"
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr "Keine Vermessungsdaten verfügbar"
 
@@ -1375,8 +1413,8 @@
 msgid "No valid waterlevel data available."
 msgstr "Keine Daten verfügbar."
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1385,14 +1423,14 @@
 msgid "Nov"
 msgstr "Jetzt"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr "November"
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr "Jetzt"
 
@@ -1402,7 +1440,7 @@
 msgid "Numbers"
 msgstr "November"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 #, fuzzy
 msgid "o' clock"
 msgstr "Uhr"
@@ -1415,13 +1453,13 @@
 msgid "Oct"
 msgstr "Oktober"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr "Oktober"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr "von"
 
@@ -1433,11 +1471,11 @@
 msgid "Old"
 msgstr "Alt"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr "auf"
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 msgid "Onetime Imports"
 msgstr "Einmalige Importe"
 
@@ -1450,17 +1488,17 @@
 msgid "Owner"
 msgstr "Eigentümer"
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr "Passwort"
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr "Passwort"
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr "Noch einmal das Passwort"
 
@@ -1468,7 +1506,8 @@
 msgid "Password reset requested!"
 msgstr "Passwort Zurücksetzung angefragt!"
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
@@ -1476,7 +1515,7 @@
 "Das Passwort sollte mindestens 8 Zeichen lang sein, eine Ziffer und ein "
 "Sonderzeichen wie etwa $ enthalten"
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr "Die Passwörter stimmen nicht überein!"
 
@@ -1488,15 +1527,15 @@
 msgid "pending"
 msgstr "ausstehend"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr "Prozent"
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 msgid "Please choose a country"
 msgstr "Bitte wählen Sie ein Land aus"
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr "Bitte wählen Sie eine Rolle aus"
 
@@ -1505,7 +1544,7 @@
 msgid "Please enter a date"
 msgstr "Bitte ein Datum eingeben"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr "Bitte eine Tiefe eingeben"
 
@@ -1518,15 +1557,15 @@
 msgid "Please enter a Featuretype"
 msgstr "Bitte einen Featuretype eingeben"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr "Bitte eine LOS eingeben"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr "Bitte eine maximale Fahrrinnenbreite eingeben"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr "Bitte eine minimale Fahrrinnenbreite eingeben"
 
@@ -1547,7 +1586,7 @@
 msgid "Please enter a source organization"
 msgstr "Bitte eine Quellorganisation eingeben"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr "Bitte eine Quellorganisation eintragen"
 
@@ -1599,29 +1638,30 @@
 msgid "Please enter an originator"
 msgstr "Bitte eine Organisation eintragen"
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 "Bitte geben Sie die Koordinaten in folgendem Format an: Lat,Lon,Lat,Lon"
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr ""
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr "Bitte eine Seichtstelle wählen"
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+#, fuzzy
+msgid "Please select a report to update"
+msgstr "Bitte auswählen"
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr "Bitte auswählen"
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+#, fuzzy
+msgid "Please select stats to update"
+msgstr "Bitte auswählen"
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1630,7 +1670,7 @@
 msgid "portrait"
 msgstr "Hochformat"
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr ""
 
@@ -1645,7 +1685,7 @@
 msgid "Prediction"
 msgstr "Projektion"
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr "Keine Vorhersagen verfügbar"
 
@@ -1657,11 +1697,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr "Profil gelöscht!"
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr "Profil gespeichert!"
 
@@ -1681,21 +1721,30 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+#, fuzzy
+msgid "Reactivate user"
+msgstr "Konto löschen"
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 #, fuzzy
 msgid "Recency of Bottleneck Surveys"
 msgstr "Seichtstellen"
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr ""
 
@@ -1708,15 +1757,20 @@
 msgid "Refresh"
 msgstr "Aktualisieren"
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 #, fuzzy
 msgid "Regular Imports"
 msgstr "Neuer Import"
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr "Passwort erneut eingeben"
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+#, fuzzy
+msgid "Reports"
+msgstr "Daten-Import"
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr "Passwort-Zurücksetzung anfragen!"
@@ -1733,15 +1787,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1759,11 +1813,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr "Rolle"
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1775,26 +1829,25 @@
 msgid "Sat"
 msgstr "Sa"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr "Samstag"
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr "Speichern"
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr "Gespeicherte Profile"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 #, fuzzy
 msgid "Saved import: #"
 msgstr "Neuer Import"
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr ""
 
@@ -1803,16 +1856,16 @@
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr "Zeitplan"
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 #, fuzzy
 msgid "Scheduled"
 msgstr "Zeitplan"
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 #, fuzzy
 msgid "Section"
 msgstr "Projektion"
@@ -1838,7 +1891,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 #, fuzzy
 msgid "Select bottleneck"
 msgstr "Wähle Seichtstelle"
@@ -1873,7 +1926,7 @@
 msgid "Send all"
 msgstr "Test-E-Mail versenden"
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr "Test-E-Mail versenden"
 
@@ -1881,13 +1934,13 @@
 msgid "Sep"
 msgstr "Sep"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr "September"
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr "Differenzen anzeigen"
 
@@ -1895,7 +1948,7 @@
 msgid "Show Hydrological Conditions"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr ""
 
@@ -1908,11 +1961,11 @@
 msgid "Signer"
 msgstr "Überprüft durch"
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr "Einfach"
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1939,7 +1992,7 @@
 msgid "Sounding Result Comparison"
 msgstr "Seichtstellenvermessung"
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 #, fuzzy
 msgid "Sounding results"
 msgstr "Seichtstellenvermessung"
@@ -1959,17 +2012,17 @@
 msgid "Source organization"
 msgstr "Bitte ein Datum eingeben"
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 #, fuzzy
 msgid "Source Organization"
 msgstr "Bitte ein Datum eingeben"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr ""
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr "Quelltext"
 
@@ -1978,7 +2031,7 @@
 msgid "Staging Area"
 msgstr "Import-Überprüfung"
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr "Start"
 
@@ -1987,7 +2040,7 @@
 msgid "Start rhm"
 msgstr "Start"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr "Import gestartet "
 
@@ -2015,12 +2068,16 @@
 msgid "Starting Year"
 msgstr "Import-Überprüfung"
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 #, fuzzy
 msgid "Status"
 msgstr "Zustand"
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 #, fuzzy
 msgid "Stretch"
 msgstr "Konto löschen"
@@ -2031,13 +2088,18 @@
 msgstr "Konto löschen"
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr "Abschicken"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+#, fuzzy
+msgid "successfully"
+msgstr "erfolgreich gelöscht"
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -2045,17 +2107,17 @@
 msgid "Sun"
 msgstr "So"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr "Sonntag"
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr ""
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr ""
 
@@ -2063,12 +2125,12 @@
 msgid "Survey from:"
 msgstr ""
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 #, fuzzy
 msgid "Survey type"
 msgstr "Featuretyp"
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr ""
 
@@ -2076,7 +2138,7 @@
 msgid "Sysadmin"
 msgstr "Sys-Admin"
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 #, fuzzy
 msgid "System-Administrator"
 msgstr "System-Administration"
@@ -2089,11 +2151,17 @@
 msgid "Systemconfiguration"
 msgstr "System-Konfiguation"
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 #, fuzzy
 msgid "Testmail sent"
 msgstr "E-Mail wurde gesendet"
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2181,9 +2249,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2191,7 +2259,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2201,12 +2269,12 @@
 msgid "Thu"
 msgstr "Do"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr "Donnerstag"
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2228,21 +2296,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr "Versuche"
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 #, fuzzy
 msgid "Trigger import"
 msgstr "Neuer Import"
@@ -2251,7 +2319,7 @@
 msgid "Tue"
 msgstr "Di"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr "Dienstag"
@@ -2266,12 +2334,16 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 #, fuzzy
 msgid "update import: #"
 msgstr "Neuer Import"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr "Hochladen"
 
@@ -2295,7 +2367,7 @@
 msgid "uploaded successfully"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2310,26 +2382,35 @@
 msgid "URL"
 msgstr ""
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 #, fuzzy
 msgid "User Manual"
 msgstr "Benutzername"
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr "Benutzername"
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr "Benutzer"
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2345,7 +2426,7 @@
 msgid "Value"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2371,17 +2452,17 @@
 msgstr "Wasserstand"
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 msgid "Waterlevel [m]"
 msgstr "Wasserstand [m]"
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr "Wasserstände"
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 #, fuzzy
 msgid "Waterway Admin"
 msgstr "Waterway-Admin"
@@ -2391,7 +2472,7 @@
 msgid "Waterway area"
 msgstr "Waterway-Benutzer"
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 #, fuzzy
 msgid "Waterway Area"
 msgstr "Waterway-Benutzer"
@@ -2400,7 +2481,7 @@
 msgid "Waterway axis"
 msgstr ""
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 #, fuzzy
 msgid "Waterway Axis"
 msgstr "Waterway-Admin"
@@ -2409,7 +2490,7 @@
 msgid "Waterway gauges"
 msgstr ""
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 #, fuzzy
 msgid "Waterway Profile"
 msgstr "Einlesen der Wasserwegsprofile"
@@ -2420,7 +2501,7 @@
 msgstr "Einlesen der Wasserwegsprofile"
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 #, fuzzy
 msgid "Waterway User"
 msgstr "Waterway-Benutzer"
@@ -2429,16 +2510,16 @@
 msgid "Wed"
 msgstr "Mi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr "Mittwoch"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr "Woche"
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr "wöchentlich"
 
@@ -2454,21 +2535,21 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr "Jahr"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 #, fuzzy
 msgid "yearly"
 msgstr "Jahr"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 #, fuzzy
 msgid "yes"
 msgstr "Ebenen"
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
@@ -2476,6 +2557,14 @@
 "Sie können diese Koordinaten aus dem \"Gespeicherte Profile\"-Menü "
 "auswählen, um diesen Profilschnitt wieder herzustellen."
 
+#: src/components/identify/formatter.js:127
+#, fuzzy
+msgid "ZPG exception"
+msgstr "Projektion"
+
+#~ msgid "Negative values mean endless retry"
+#~ msgstr "Negative Zahlen bedeuten eine \"unendliche\" Anzahl der Versuche"
+
 #~ msgid "Error while saving user"
 #~ msgstr "Während des Speicherns der Nutzerdaten trat ein Fehler auf"
 
@@ -2530,10 +2619,6 @@
 #~ msgid "Delete Section"
 #~ msgstr "Konto löschen"
 
-#, fuzzy
-#~ msgid "Please select template type"
-#~ msgstr "Bitte auswählen"
-
 #~ msgid "Author"
 #~ msgstr "Autor"
 
--- a/client/src/locale/en_GB/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/en_GB/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -21,7 +21,7 @@
 msgid " does not match any template's element"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
 msgstr ""
 
@@ -33,19 +33,19 @@
 msgid "%{layerName} Fill Color"
 msgstr ""
 
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
 msgstr ""
 
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
 msgstr ""
 
@@ -53,7 +53,7 @@
 msgid "120 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr ""
 
@@ -61,7 +61,7 @@
 msgid "200 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
 msgstr ""
 
@@ -69,11 +69,11 @@
 msgid "30 Days"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:678
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
 msgstr ""
 
@@ -105,8 +105,8 @@
 msgid "According gauge data:"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr ""
 
@@ -118,7 +118,7 @@
 msgid "AM"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:466
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
 msgstr ""
 
@@ -130,8 +130,8 @@
 msgid "Apr"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr ""
@@ -140,29 +140,33 @@
 msgid "Area"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr ""
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 msgid "Aug"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr ""
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 msgid "Avail: Latest measurement from "
 msgstr ""
 
-#: src/components/identify/Identify.vue:436
+#: src/components/identify/Identify.vue:505
 msgid "Avail: Latest measurement older than"
 msgstr ""
 
@@ -176,7 +180,7 @@
 msgid "Available fairway depth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 msgid "Available Fairway Depth"
 msgstr ""
 
@@ -184,13 +188,13 @@
 msgid "Available fairway depth vs LNWL"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 msgid "Available Fairway Depth vs LNWL:"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 msgid "Available Fairway Depth:"
 msgstr ""
 
@@ -207,56 +211,60 @@
 msgid "back to login"
 msgstr ""
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -267,25 +275,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr ""
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -293,8 +302,8 @@
 msgid "BeamType"
 msgstr ""
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 msgid "Bottleneck"
 msgstr ""
@@ -303,65 +312,69 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 msgid "Bottleneck Surveys"
 msgstr ""
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 msgid "Bottleneck:"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr ""
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr ""
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 msgid "Cancel"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr ""
 
@@ -381,11 +394,11 @@
 msgid "Choose color"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr ""
 
@@ -411,11 +424,11 @@
 msgid "Compare with"
 msgstr ""
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr ""
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr ""
 
@@ -425,24 +438,24 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 msgid "Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr ""
 
@@ -450,7 +463,7 @@
 msgid "Current Waterlevel"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr ""
 
@@ -458,15 +471,19 @@
 msgid "Data Availability/Accuracy"
 msgstr ""
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr ""
 
@@ -481,7 +498,7 @@
 msgid "Date info"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr ""
 
@@ -489,13 +506,13 @@
 msgid "Day"
 msgstr ""
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -503,8 +520,8 @@
 msgid "Dec"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr ""
@@ -529,14 +546,14 @@
 msgid "Define Stretches"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 msgid "Delete"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 msgid "Delete cross profile"
 msgstr ""
 
@@ -548,11 +565,11 @@
 msgid "Delete Template"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 msgid "Delete user"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 msgid "Delete User"
 msgstr ""
 
@@ -568,13 +585,13 @@
 msgid "deleted successfully"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr ""
 
@@ -586,7 +603,7 @@
 msgid "Depth Reference"
 msgstr ""
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr ""
 
@@ -602,11 +619,11 @@
 msgid "Depthreference"
 msgstr ""
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 msgid "Distance Mark"
 msgstr ""
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 msgid "Distance Mark ashore"
 msgstr ""
 
@@ -618,7 +635,7 @@
 msgid "Distance marks virtual"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr ""
 
@@ -626,7 +643,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr ""
 
@@ -652,12 +669,21 @@
 msgid "Download Meta.json"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:273
+msgid "Edit user"
+msgstr ""
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 msgid "Email"
 msgstr ""
 
@@ -692,11 +718,11 @@
 msgid "Enqueued"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr ""
 
@@ -716,11 +742,11 @@
 msgid "Errorlog"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 msgid "Every"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr ""
 
@@ -773,15 +799,15 @@
 msgid "Fairway (LOS 3)"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr ""
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 msgid "Fairway Critical"
 msgstr ""
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 msgid "Fairway Date"
 msgstr ""
 
@@ -789,17 +815,17 @@
 msgid "Fairway dimension"
 msgstr ""
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 msgid "Fairway Dimensions"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 msgid "FairwayAvailability"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr ""
 
@@ -825,21 +851,21 @@
 msgid "Feb"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 msgid "File Import"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr ""
 
@@ -856,7 +882,7 @@
 msgid "Fri"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr ""
@@ -871,11 +897,11 @@
 msgid "From"
 msgstr ""
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr ""
 
@@ -891,11 +917,11 @@
 msgid "Gauge measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 msgid "Gauge Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr ""
 
@@ -903,24 +929,24 @@
 msgid "Gauges"
 msgstr ""
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr ""
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 msgid "Generated by"
 msgstr ""
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 msgid "Generated PDFs use font:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr ""
 
@@ -950,21 +976,21 @@
 msgid "ID"
 msgstr ""
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 msgid "Identified Features"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -974,7 +1000,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 msgid "Import import: #"
 msgstr ""
 
@@ -987,7 +1013,7 @@
 msgid "Import Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr ""
 
@@ -999,7 +1025,7 @@
 msgid "Import via"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 msgid "Import Waterway Profiles"
 msgstr ""
 
@@ -1018,11 +1044,11 @@
 msgid "Invalid element"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr ""
 
@@ -1030,8 +1056,8 @@
 msgid "Jan"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr ""
@@ -1040,8 +1066,8 @@
 msgid "Jul"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr ""
@@ -1050,8 +1076,8 @@
 msgid "Jun"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr ""
@@ -1072,21 +1098,21 @@
 msgid "Later"
 msgstr ""
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 msgid "Latest measurement"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 msgid "Latest Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 msgid "Latest Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 msgid "Latest Waterlevel Date"
 msgstr ""
 
@@ -1098,11 +1124,15 @@
 msgid "Length"
 msgstr ""
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+msgid "Loading Error"
+msgstr ""
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr ""
@@ -1126,12 +1156,12 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr ""
 
@@ -1149,22 +1179,26 @@
 msgid "Mar"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 msgid "May"
 msgstr ""
@@ -1181,16 +1215,16 @@
 msgid "Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 msgid "Measurement is within"
 msgstr ""
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 msgid "measurements"
 msgstr ""
 
@@ -1204,21 +1238,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr ""
 
@@ -1226,24 +1260,24 @@
 msgid "Mon"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 msgid "monthly"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1251,17 +1285,17 @@
 msgid "Name"
 msgstr ""
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr ""
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr ""
 
@@ -1279,10 +1313,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr ""
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1300,7 +1330,7 @@
 msgid "New stretch"
 msgstr ""
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr ""
 
@@ -1310,11 +1340,16 @@
 msgid "No data available."
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+msgid "No data selectable"
+msgstr ""
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr ""
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 msgid "No measurement available"
 msgstr ""
 
@@ -1322,7 +1357,7 @@
 msgid "No results."
 msgstr ""
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr ""
 
@@ -1330,7 +1365,7 @@
 msgid "No style-changes"
 msgstr ""
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr ""
 
@@ -1346,8 +1381,8 @@
 msgid "No valid waterlevel data available."
 msgstr ""
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1355,14 +1390,14 @@
 msgid "Nov"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr ""
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr ""
 
@@ -1371,7 +1406,7 @@
 msgid "Numbers"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 msgid "o' clock"
 msgstr ""
 
@@ -1383,13 +1418,13 @@
 msgid "Oct"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr ""
 
@@ -1401,11 +1436,11 @@
 msgid "Old"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 msgid "Onetime Imports"
 msgstr ""
 
@@ -1418,17 +1453,17 @@
 msgid "Owner"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr ""
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr ""
 
@@ -1436,13 +1471,14 @@
 msgid "Password reset requested!"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr ""
 
@@ -1454,15 +1490,15 @@
 msgid "pending"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 msgid "Please choose a country"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr ""
 
@@ -1471,7 +1507,7 @@
 msgid "Please enter a date"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr ""
 
@@ -1484,15 +1520,15 @@
 msgid "Please enter a Featuretype"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr ""
 
@@ -1513,7 +1549,7 @@
 msgid "Please enter a source organization"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr ""
 
@@ -1560,28 +1596,27 @@
 msgid "Please enter an originator"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr ""
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+msgid "Please select a report to update"
+msgstr ""
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+msgid "Please select stats to update"
+msgstr ""
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1590,7 +1625,7 @@
 msgid "portrait"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr ""
 
@@ -1603,7 +1638,7 @@
 msgid "Prediction"
 msgstr ""
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr ""
 
@@ -1615,11 +1650,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr ""
 
@@ -1639,20 +1674,28 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+msgid "Reactivate user"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 msgid "Recency of Bottleneck Surveys"
 msgstr ""
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr ""
 
@@ -1664,14 +1707,18 @@
 msgid "Refresh"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 msgid "Regular Imports"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr ""
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+msgid "Reports"
+msgstr ""
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr ""
@@ -1688,15 +1735,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1714,11 +1761,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1730,25 +1777,24 @@
 msgid "Sat"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 msgid "Saved import: #"
 msgstr ""
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr ""
 
@@ -1757,15 +1803,15 @@
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 msgid "Scheduled"
 msgstr ""
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 msgid "Section"
 msgstr ""
 
@@ -1789,7 +1835,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 msgid "Select bottleneck"
 msgstr ""
 
@@ -1821,7 +1867,7 @@
 msgid "Send all"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr ""
 
@@ -1829,13 +1875,13 @@
 msgid "Sep"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr ""
 
@@ -1843,7 +1889,7 @@
 msgid "Show Hydrological Conditions"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr ""
 
@@ -1855,11 +1901,11 @@
 msgid "Signer"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr ""
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1883,7 +1929,7 @@
 msgid "Sounding Result Comparison"
 msgstr ""
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 msgid "Sounding results"
 msgstr ""
 
@@ -1900,16 +1946,16 @@
 msgid "Source organization"
 msgstr ""
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 msgid "Source Organization"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr ""
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr ""
 
@@ -1918,7 +1964,7 @@
 msgid "Staging Area"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr ""
 
@@ -1926,7 +1972,7 @@
 msgid "Start rhm"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr ""
 
@@ -1950,11 +1996,15 @@
 msgid "Starting Year"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 msgid "Status"
 msgstr ""
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 msgid "Stretch"
 msgstr ""
 
@@ -1963,13 +2013,17 @@
 msgstr ""
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+msgid "successfully"
+msgstr ""
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -1977,17 +2031,17 @@
 msgid "Sun"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr ""
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr ""
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr ""
 
@@ -1995,11 +2049,11 @@
 msgid "Survey from:"
 msgstr ""
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 msgid "Survey type"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr ""
 
@@ -2007,7 +2061,7 @@
 msgid "Sysadmin"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 msgid "System-Administrator"
 msgstr ""
 
@@ -2019,10 +2073,16 @@
 msgid "Systemconfiguration"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 msgid "Testmail sent"
 msgstr ""
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2110,9 +2170,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2120,7 +2180,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2130,12 +2190,12 @@
 msgid "Thu"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2157,21 +2217,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 msgid "Trigger import"
 msgstr ""
 
@@ -2179,7 +2239,7 @@
 msgid "Tue"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr ""
@@ -2194,11 +2254,15 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 msgid "update import: #"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr ""
 
@@ -2222,7 +2286,7 @@
 msgid "uploaded successfully"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2237,25 +2301,34 @@
 msgid "URL"
 msgstr ""
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 msgid "User Manual"
 msgstr ""
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr ""
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr ""
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2267,7 +2340,7 @@
 msgid "Value"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2292,17 +2365,17 @@
 msgstr ""
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 msgid "Waterlevel [m]"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 msgid "Waterway Admin"
 msgstr ""
 
@@ -2310,7 +2383,7 @@
 msgid "Waterway area"
 msgstr ""
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 msgid "Waterway Area"
 msgstr ""
 
@@ -2318,7 +2391,7 @@
 msgid "Waterway axis"
 msgstr ""
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 msgid "Waterway Axis"
 msgstr ""
 
@@ -2326,7 +2399,7 @@
 msgid "Waterway gauges"
 msgstr ""
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 msgid "Waterway Profile"
 msgstr ""
 
@@ -2335,7 +2408,7 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 msgid "Waterway User"
 msgstr ""
 
@@ -2343,16 +2416,16 @@
 msgid "Wed"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr ""
 
@@ -2368,20 +2441,24 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 msgid "yearly"
 msgstr ""
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "yes"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
 msgstr ""
+
+#: src/components/identify/formatter.js:127
+msgid "ZPG exception"
+msgstr ""
--- a/client/src/locale/hr_HR/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/hr_HR/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -8,7 +8,7 @@
 "Project-Id-Version: gemmajs 1.99.0-dev\n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2019-01-25 10:11+0100\n"
-"PO-Revision-Date: 2019-01-23 15:28+0000\n"
+"PO-Revision-Date: 2021-09-12 01:36+0000\n"
 "Last-Translator: Andrija Spaic <andrija.spaic@vodniputovi.hr>\n"
 "Language-Team: Croatian <https://hosted.weblate.org/projects/gemma/client/hr/"
 ">\n"
@@ -18,83 +18,83 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Generator: Weblate 3.5-dev\n"
+"X-Generator: Weblate 4.9-dev\n"
 
 #: src/components/systemconfiguration/PDFTemplates.vue:223
 msgid " does not match any template's element"
-msgstr ""
-
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+msgstr " ne podudara se s elementom predloška"
+
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
-msgstr ""
+msgstr " uspješno je učitan."
 
 #: src/components/systemconfiguration/ColorSettings.vue:21
 msgid "%{layerName} Border Color"
-msgstr ""
+msgstr "% {layerName} Boja obruba"
 
 #: src/components/systemconfiguration/ColorSettings.vue:7
 msgid "%{layerName} Fill Color"
-msgstr ""
-
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+msgstr "%{layerName} Boja ispune"
+
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
-msgstr ""
-
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+msgstr "%a %d"
+
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
-msgstr ""
-
-#: src/components/importconfiguration/ScheduledImports.vue:690
+msgstr "%b %d"
+
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
-msgstr ""
+msgstr "0 znači da nema ponovnog pokušaja"
 
 #: src/components/Pdftool.vue:41
 msgid "120 dpi"
-msgstr ""
-
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+msgstr "120 dpi"
+
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr "15 minuta"
 
 #: src/components/Pdftool.vue:42
 msgid "200 dpi"
-msgstr ""
-
-#: src/components/importconfiguration/ScheduledImports.vue:679
+msgstr "200 dpi"
+
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
-msgstr ""
+msgstr "2h45m za dva sata i 45 minuta"
 
 #: src/components/importoverview/ImportOverview.vue:55
 msgid "30 Days"
-msgstr ""
-
-#: src/components/importconfiguration/ScheduledImports.vue:679
+msgstr "30 dana"
+
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
-msgstr ""
-
-#: src/components/importconfiguration/ScheduledImports.vue:678
+msgstr "30m za 30 minuta"
+
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
-msgstr ""
+msgstr "60 za 60 sekundi "
 
 #: src/components/importoverview/ImportOverview.vue:52
 msgid "7 days"
-msgstr ""
+msgstr "7 dana"
 
 #: src/components/Pdftool.vue:40
 msgid "80 dpi"
-msgstr ""
+msgstr "80 dpi"
 
 #: src/components/Pdftool.vue:51
 msgid "A3"
-msgstr ""
+msgstr "A3"
 
 #: src/components/Pdftool.vue:50
 msgid "A4"
-msgstr ""
+msgstr "A4"
 
 #: src/components/importoverview/Filters.vue:18
 #, fuzzy
@@ -107,24 +107,24 @@
 
 #: src/components/identify/Identify.vue:74
 msgid "According gauge data:"
-msgstr ""
-
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+msgstr "Prema podacima vodomjera:"
+
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr "Dodaj korisnika"
 
 #: src/components/importoverview/LogDetail.vue:14
 msgid "Additional Info"
-msgstr ""
+msgstr "Dodatne informacije"
 
 #: src/lib/datelocalization.js:6
 msgid "AM"
-msgstr ""
-
-#: src/components/importoverview/ImportOverview.vue:466
+msgstr "Prijepodne"
+
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
-msgstr ""
+msgstr "odobren"
 
 #: src/components/importconfiguration/ImportDetails.vue:17
 #, fuzzy
@@ -136,8 +136,8 @@
 msgid "Apr"
 msgstr "Travanj"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr "Travanj"
@@ -146,31 +146,35 @@
 msgid "Area"
 msgstr "Područje"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr "na"
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 #, fuzzy
 msgid "Aug"
 msgstr "Kolovoz"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr "Kolovoz"
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 #, fuzzy
 msgid "Avail: Latest measurement from "
-msgstr "Mjerenje"
-
-#: src/components/identify/Identify.vue:436
+msgstr "Mjerenje "
+
+#: src/components/identify/Identify.vue:505
 #, fuzzy
 msgid "Avail: Latest measurement older than"
 msgstr "Mjerenje"
@@ -187,24 +191,22 @@
 msgid "Available fairway depth"
 msgstr "Dostupne dubine plovnog puta"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 #, fuzzy
 msgid "Available Fairway Depth"
 msgstr "Dostupne dubine plovnog puta"
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:337
-#, fuzzy
 msgid "Available fairway depth vs LNWL"
-msgstr "Dostupne dubine plovnog puta"
-
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
-#, fuzzy
+msgstr "Dostupne dubine plovnog puta u odnosu na NPV"
+
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 msgid "Available Fairway Depth vs LNWL:"
-msgstr "Dostupne dubine plovnog puta"
-
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+msgstr "Dostupne dubine plovnog puta u odnosu na NPV"
+
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 #, fuzzy
 msgid "Available Fairway Depth:"
 msgstr "Dostupne dubine plovnog puta"
@@ -217,62 +219,66 @@
 #: src/components/sections/SectionForm.vue:178
 #: src/components/stretches/StretchForm.vue:18
 msgid "Back"
-msgstr ""
+msgstr "Nazad"
 
 #: src/components/Login.vue:70
 msgid "back to login"
 msgstr "natrag na prijavu"
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -283,25 +289,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr "Greška Servera"
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -310,8 +317,8 @@
 msgid "BeamType"
 msgstr "Tip"
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 msgid "Bottleneck"
 msgstr "Kritični sektor"
@@ -320,68 +327,72 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 #, fuzzy
 msgid "Bottleneck Surveys"
 msgstr "Kritični sektori"
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 #, fuzzy
 msgid "Bottleneck:"
 msgstr "Kritični sektor"
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr "Kritični sektori"
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr ""
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 #, fuzzy
 msgid "Cancel"
 msgstr "Prekini slanje"
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr "Stacionaža"
 
@@ -401,11 +412,11 @@
 msgid "Choose color"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr "odaberi datoteku za učitavanje"
 
@@ -432,11 +443,11 @@
 msgid "Compare with"
 msgstr "Usporedi sa"
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr ""
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr ""
 
@@ -446,24 +457,24 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr "Potvrdi"
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr "Koordinate su kopirane u međuspremnik!"
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 msgid "Country"
 msgstr "Država"
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr "Crontab - linija"
 
@@ -471,7 +482,7 @@
 msgid "Current Waterlevel"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr ""
 
@@ -479,15 +490,19 @@
 msgid "Data Availability/Accuracy"
 msgstr ""
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr ""
 
@@ -502,7 +517,7 @@
 msgid "Date info"
 msgstr "Datum"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr "Dan"
 
@@ -511,13 +526,13 @@
 msgid "Day"
 msgstr "Dan"
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -525,8 +540,8 @@
 msgid "Dec"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr "Prosinac"
@@ -554,15 +569,15 @@
 msgid "Define Stretches"
 msgstr "Definiraj dionice"
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 #, fuzzy
 msgid "Delete"
 msgstr "Brisanje "
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 #, fuzzy
 msgid "Delete cross profile"
 msgstr "Spremljeni poprečni profili"
@@ -577,12 +592,12 @@
 msgid "Delete Template"
 msgstr "Obrisan uvoz: #"
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 #, fuzzy
 msgid "Delete user"
 msgstr "Brisanje "
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 #, fuzzy
 msgid "Delete User"
 msgstr "Brisanje "
@@ -601,13 +616,13 @@
 msgid "deleted successfully"
 msgstr "Uspješno"
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr "Brisanje "
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr "Dubina"
 
@@ -621,7 +636,7 @@
 msgid "Depth Reference"
 msgstr "Referentna dubina"
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr ""
 
@@ -637,12 +652,12 @@
 msgid "Depthreference"
 msgstr "Referentna dubina"
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 #, fuzzy
 msgid "Distance Mark"
 msgstr "Virtualne Oznake Udaljenosti"
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 #, fuzzy
 msgid "Distance Mark ashore"
 msgstr "Virtualne Oznake Udaljenosti"
@@ -657,7 +672,7 @@
 msgid "Distance marks virtual"
 msgstr "Virtualne Oznake Udaljenosti"
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr ""
 
@@ -665,7 +680,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr ""
 
@@ -693,12 +708,22 @@
 msgid "Download Meta.json"
 msgstr "Preuzmi Meta.json"
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:273
+#, fuzzy
+msgid "Edit user"
+msgstr "Unesi korisničko ime"
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 msgid "Email"
 msgstr "E-mail"
 
@@ -733,11 +758,11 @@
 msgid "Enqueued"
 msgstr "Na čekanju"
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr "Unesi koordinate ručno"
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr "Unesi oznaku poprečnog profila"
 
@@ -758,12 +783,12 @@
 msgid "Errorlog"
 msgstr "Zapis pogreške"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 #, fuzzy
 msgid "Every"
 msgstr "Svaki"
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr ""
 
@@ -817,16 +842,16 @@
 msgid "Fairway (LOS 3)"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr ""
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 #, fuzzy
 msgid "Fairway Critical"
 msgstr "Uvoz Profila Plovnog Puta"
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 #, fuzzy
 msgid "Fairway Date"
 msgstr "Područje plovnog puta"
@@ -836,18 +861,18 @@
 msgid "Fairway dimension"
 msgstr "Dimenzije plovnog puta"
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 #, fuzzy
 msgid "Fairway Dimensions"
 msgstr "Dimenzije plovnog puta"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 msgid "FairwayAvailability"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr ""
 
@@ -875,22 +900,22 @@
 msgid "Feb"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr "Veljača"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 #, fuzzy
 msgid "File Import"
 msgstr "Novi uvoz"
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr ""
 
@@ -908,7 +933,7 @@
 msgid "Fri"
 msgstr "Petak"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr "Petak"
@@ -923,11 +948,11 @@
 msgid "From"
 msgstr ""
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr ""
 
@@ -943,12 +968,12 @@
 msgid "Gauge measurement"
 msgstr "Podatak o vodostaju"
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 #, fuzzy
 msgid "Gauge Waterlevel"
 msgstr "Podatak o vodostaju"
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr ""
 
@@ -956,26 +981,26 @@
 msgid "Gauges"
 msgstr ""
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr "Kreiraj PDF"
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 #, fuzzy
 msgid "Generated by"
 msgstr "– kreiran od:"
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 #, fuzzy
 msgid "Generated PDFs use font:"
 msgstr "Kreiraj PDF"
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr "sat"
 
@@ -1006,22 +1031,22 @@
 msgid "ID"
 msgstr "ID"
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 #, fuzzy
 msgid "Identified Features"
 msgstr "Identificirano"
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -1031,7 +1056,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr "Uvoz odobrenih podataka o vodostaju"
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 #, fuzzy
 msgid "Import import: #"
 msgstr "ažuriraj uvoz: #"
@@ -1047,7 +1072,7 @@
 msgid "Import Schedule"
 msgstr "Raspored"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr "Uvoz rezultata hidrografskih snimanja"
 
@@ -1061,7 +1086,7 @@
 msgid "Import via"
 msgstr "Uvoz"
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 #, fuzzy
 msgid "Import Waterway Profiles"
 msgstr "Uvoz Profila Plovnog Puta"
@@ -1082,11 +1107,11 @@
 msgid "Invalid element"
 msgstr "nevažeći unos"
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr "nevažeći email"
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr "nevažeći unos"
 
@@ -1095,8 +1120,8 @@
 msgid "Jan"
 msgstr "Siječanj"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr "Siječanj"
@@ -1106,8 +1131,8 @@
 msgid "Jul"
 msgstr "Srpanj"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr "Srpanj"
@@ -1117,8 +1142,8 @@
 msgid "Jun"
 msgstr "Lipanj"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr "Lipanj"
@@ -1140,24 +1165,24 @@
 msgid "Later"
 msgstr "Najnovije"
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 #, fuzzy
 msgid "Latest measurement"
 msgstr "Mjerenje"
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 #, fuzzy
 msgid "Latest Measurement"
 msgstr "Mjerenje"
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 #, fuzzy
 msgid "Latest Waterlevel"
 msgstr "Mjerenje"
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 #, fuzzy
 msgid "Latest Waterlevel Date"
 msgstr "Mjerenje"
@@ -1171,11 +1196,16 @@
 msgid "Length"
 msgstr "Duljina"
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+#, fuzzy
+msgid "Loading Error"
+msgstr "Greška Servera"
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr "Prijava"
@@ -1199,12 +1229,12 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr "LOS"
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr "Uvoz pokrenut ručno: #"
 
@@ -1224,22 +1254,26 @@
 msgid "Mar"
 msgstr "Ožujak"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr "Ožujak"
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr "Maksimalna Širina"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 msgid "May"
 msgstr "Svibanj"
@@ -1257,17 +1291,17 @@
 msgid "Measurement"
 msgstr "Mjerenje"
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 #, fuzzy
 msgid "Measurement is within"
 msgstr "Mjerenje"
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 #, fuzzy
 msgid "measurements"
 msgstr "Mjerenje"
@@ -1282,21 +1316,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr "prošlo minuta"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr "Minimalna Širina"
 
@@ -1305,25 +1339,25 @@
 msgid "Mon"
 msgstr "na"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr "Ponedjeljak"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr "mjesec"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 #, fuzzy
 msgid "monthly"
 msgstr "Mjesečno"
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr "Mjesečno"
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1331,17 +1365,17 @@
 msgid "Name"
 msgstr "Naziv"
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr ""
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr ""
 
@@ -1359,10 +1393,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr ""
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1382,7 +1412,7 @@
 msgid "New stretch"
 msgstr "Nova dionica"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr ""
 
@@ -1392,11 +1422,16 @@
 msgid "No data available."
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+msgid "No data selectable"
+msgstr ""
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr "Nema identificiranih objekata."
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 #, fuzzy
 msgid "No measurement available"
 msgstr "Mjerenje"
@@ -1405,7 +1440,7 @@
 msgid "No results."
 msgstr "Nema rezultata."
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr ""
 
@@ -1413,7 +1448,7 @@
 msgid "No style-changes"
 msgstr ""
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr ""
 
@@ -1431,8 +1466,8 @@
 msgid "No valid waterlevel data available."
 msgstr "Mjerenje"
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1440,14 +1475,14 @@
 msgid "Nov"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr "Studeni"
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr ""
 
@@ -1457,7 +1492,7 @@
 msgid "Numbers"
 msgstr "Studeni"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 msgid "o' clock"
 msgstr "sati"
 
@@ -1470,13 +1505,13 @@
 msgid "Oct"
 msgstr "Listopad"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr "Listopad"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr "od"
 
@@ -1488,11 +1523,11 @@
 msgid "Old"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr "na"
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 #, fuzzy
 msgid "Onetime Imports"
 msgstr "Obrisan uvoz: #"
@@ -1506,17 +1541,17 @@
 msgid "Owner"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr "Lozinka"
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr "Lozinka"
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr "lozinka ponovo"
 
@@ -1524,7 +1559,8 @@
 msgid "Password reset requested!"
 msgstr "Zatraženo je poništavanje lozinke!"
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
@@ -1532,7 +1568,7 @@
 "Lozinka bi trebala sadržavati barem 8 znakova uključujući 1 broj i 1 "
 "specijalni znak poput $"
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr "Lozinke se ne podudaraju!"
 
@@ -1545,15 +1581,15 @@
 msgid "pending"
 msgstr "Na čekanju"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 msgid "Please choose a country"
 msgstr "Odaberite zemlju"
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr "Odaberite ulogu"
 
@@ -1562,7 +1598,7 @@
 msgid "Please enter a date"
 msgstr "Unesite datum"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr "Unesite dubinu"
 
@@ -1575,15 +1611,15 @@
 msgid "Please enter a Featuretype"
 msgstr "Unesite tip elementa"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr "Unesite razinu usluge"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr "Unesite maksimalnu širinu"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr "Unesite minimalnu širinu"
 
@@ -1605,7 +1641,7 @@
 msgid "Please enter a source organization"
 msgstr "Unesite organizaciju izvora"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr "Unesite organizaciju izvora"
 
@@ -1654,28 +1690,29 @@
 msgid "Please enter an originator"
 msgstr "Unesite završnu točku"
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr "Unesite točne koordinate u formatu: Lat,Lon,Lat,Lon"
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr "Unesite Razvrstaj po"
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr "Odaberite kritični sektor"
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+#, fuzzy
+msgid "Please select a report to update"
+msgstr "Odaberite jedno"
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr "Odaberite jedno"
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+#, fuzzy
+msgid "Please select stats to update"
+msgstr "Odaberite jedno"
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1684,7 +1721,7 @@
 msgid "portrait"
 msgstr "uspravno"
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr ""
 
@@ -1699,7 +1736,7 @@
 msgid "Prediction"
 msgstr "Projekcija"
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr ""
 
@@ -1711,11 +1748,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr "Profil obrisan!"
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr "Profil spremljen!"
 
@@ -1735,21 +1772,30 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+#, fuzzy
+msgid "Reactivate user"
+msgstr "Brisanje "
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 #, fuzzy
 msgid "Recency of Bottleneck Surveys"
 msgstr "Kritični sektori"
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr ""
 
@@ -1762,15 +1808,20 @@
 msgid "Refresh"
 msgstr "Osvježi"
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 #, fuzzy
 msgid "Regular Imports"
 msgstr "Obrisan uvoz: #"
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr "Ponovi Lozinku"
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+#, fuzzy
+msgid "Reports"
+msgstr "Uvozi"
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr "Zatraži poništavanje lozinke!"
@@ -1787,15 +1838,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1813,11 +1864,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr "Uloga"
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1830,25 +1881,24 @@
 msgid "Sat"
 msgstr "na"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr "Subota"
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr "Spremljeni poprečni profili"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 msgid "Saved import: #"
 msgstr "Spremljen uvoz: #"
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr ""
 
@@ -1857,15 +1907,15 @@
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr "Raspored"
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 msgid "Scheduled"
 msgstr "Planiran"
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 #, fuzzy
 msgid "Section"
 msgstr "Projekcija"
@@ -1891,7 +1941,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 #, fuzzy
 msgid "Select bottleneck"
 msgstr "Odaberi Kritični sektor"
@@ -1926,7 +1976,7 @@
 msgid "Send all"
 msgstr "Pošalji testni e-mail"
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr "Pošalji testni e-mail"
 
@@ -1934,13 +1984,13 @@
 msgid "Sep"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr "Rujan"
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr ""
 
@@ -1948,7 +1998,7 @@
 msgid "Show Hydrological Conditions"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr ""
 
@@ -1960,11 +2010,11 @@
 msgid "Signer"
 msgstr "Potpisnik"
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr ""
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1993,7 +2043,7 @@
 msgid "Sounding Result Comparison"
 msgstr "Rezultat Hidrografskog mjerenja"
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 #, fuzzy
 msgid "Sounding results"
 msgstr "Rezultat Hidrografskog mjerenja"
@@ -2012,17 +2062,17 @@
 msgid "Source organization"
 msgstr "Organizacija izvora"
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 #, fuzzy
 msgid "Source Organization"
 msgstr "Organizacija izvora"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr "Organizacija izvora"
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr "izvorni kod"
 
@@ -2031,7 +2081,7 @@
 msgid "Staging Area"
 msgstr "Pristanište"
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr "Početak"
 
@@ -2039,7 +2089,7 @@
 msgid "Start rhm"
 msgstr "Početni rhm"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr "započinje uvoz za "
 
@@ -2067,12 +2117,16 @@
 msgid "Starting Year"
 msgstr "Pristanište"
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 #, fuzzy
 msgid "Status"
 msgstr "Stanje"
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 #, fuzzy
 msgid "Stretch"
 msgstr "Definiraj dionice"
@@ -2083,13 +2137,18 @@
 msgstr "Definiraj dionice"
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr "Predaj"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+#, fuzzy
+msgid "successfully"
+msgstr "Uspješno"
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -2098,17 +2157,17 @@
 msgid "Sun"
 msgstr "Nedjelja"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr "Nedjelja"
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr ""
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr ""
 
@@ -2116,12 +2175,12 @@
 msgid "Survey from:"
 msgstr ""
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 #, fuzzy
 msgid "Survey type"
 msgstr "Tip elementa/ Vrsta značajke"
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr ""
 
@@ -2129,7 +2188,7 @@
 msgid "Sysadmin"
 msgstr "Sistem admin"
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 msgid "System-Administrator"
 msgstr "Sistem-Administrator"
 
@@ -2141,11 +2200,17 @@
 msgid "Systemconfiguration"
 msgstr "Konfiguracija sutava"
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 #, fuzzy
 msgid "Testmail sent"
 msgstr "E-mail je poslan"
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2233,9 +2298,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2243,7 +2308,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2255,12 +2320,12 @@
 msgid "Thu"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr "Četvrtak"
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2282,21 +2347,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 msgid "Trigger import"
 msgstr "Pokretanje uvoza"
 
@@ -2305,7 +2370,7 @@
 msgid "Tue"
 msgstr "Utorak"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr "Utorak"
@@ -2320,11 +2385,15 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 msgid "update import: #"
 msgstr "ažuriraj uvoz: #"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr "Učitaj"
 
@@ -2348,7 +2417,7 @@
 msgid "uploaded successfully"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2363,26 +2432,35 @@
 msgid "URL"
 msgstr "URL"
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 #, fuzzy
 msgid "User Manual"
 msgstr "Korisničko ime"
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr "Korisničko ime"
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr "Korisnici"
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2398,7 +2476,7 @@
 msgid "Value"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2424,17 +2502,17 @@
 msgstr ""
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 msgid "Waterlevel [m]"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 msgid "Waterway Admin"
 msgstr "Admin Plovnog puta"
 
@@ -2443,7 +2521,7 @@
 msgid "Waterway area"
 msgstr "Područje plovnog puta"
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 #, fuzzy
 msgid "Waterway Area"
 msgstr "Područje plovnog puta"
@@ -2452,7 +2530,7 @@
 msgid "Waterway axis"
 msgstr "Os plovnog puta"
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 #, fuzzy
 msgid "Waterway Axis"
 msgstr "Os plovnog puta"
@@ -2461,7 +2539,7 @@
 msgid "Waterway gauges"
 msgstr "Vodomjerna stanica"
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 #, fuzzy
 msgid "Waterway Profile"
 msgstr "Uvoz Profila Plovnog Puta"
@@ -2472,7 +2550,7 @@
 msgstr "Uvoz Profila Plovnog Puta"
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 msgid "Waterway User"
 msgstr "Korisnik plovnog puta"
 
@@ -2480,16 +2558,16 @@
 msgid "Wed"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr "Srijeda"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr "tjedan"
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr "Tjedno"
 
@@ -2505,21 +2583,21 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr "godina"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 #, fuzzy
 msgid "yearly"
 msgstr "godina"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 #, fuzzy
 msgid "yes"
 msgstr "Slojevi"
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
@@ -2527,6 +2605,14 @@
 "Sada možete odabrati ove koordinate iz izbornika \"Spremljeni poprečni "
 "profili\" da biste vratili ovaj poprečni profil."
 
+#: src/components/identify/formatter.js:127
+#, fuzzy
+msgid "ZPG exception"
+msgstr "Projekcija"
+
+#~ msgid "Please enter SortBy"
+#~ msgstr "Unesite Razvrstaj po"
+
 #~ msgid "Error while saving user"
 #~ msgstr "Greška kod spremanja korisnika"
 
@@ -2571,10 +2657,6 @@
 #~ msgid "Delete Section"
 #~ msgstr "Definiraj dionice"
 
-#, fuzzy
-#~ msgid "Please select template type"
-#~ msgstr "Odaberite jedno"
-
 #~ msgid "Author"
 #~ msgstr "Autor"
 
--- a/client/src/locale/hu_HU/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/hu_HU/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -23,7 +23,7 @@
 msgid " does not match any template's element"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
 msgstr " sikeresen feltöltve"
 
@@ -35,19 +35,19 @@
 msgid "%{layerName} Fill Color"
 msgstr ""
 
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
 msgstr ""
 
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
 msgstr ""
 
@@ -55,7 +55,7 @@
 msgid "120 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr "15 perc"
 
@@ -63,7 +63,7 @@
 msgid "200 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
 msgstr ""
 
@@ -71,11 +71,11 @@
 msgid "30 Days"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:678
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
 msgstr ""
 
@@ -108,8 +108,8 @@
 msgid "According gauge data:"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr "Felhasználó hozzáadása"
 
@@ -121,7 +121,7 @@
 msgid "AM"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:466
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
 msgstr ""
 
@@ -134,8 +134,8 @@
 msgid "Apr"
 msgstr "Április"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr "Április"
@@ -144,30 +144,34 @@
 msgid "Area"
 msgstr "terület"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr ""
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 #, fuzzy
 msgid "Aug"
 msgstr "Augusztus"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr "Augusztus"
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 msgid "Avail: Latest measurement from "
 msgstr ""
 
-#: src/components/identify/Identify.vue:436
+#: src/components/identify/Identify.vue:505
 msgid "Avail: Latest measurement older than"
 msgstr ""
 
@@ -182,7 +186,7 @@
 msgid "Available fairway depth"
 msgstr "hajóút mélysége"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 #, fuzzy
 msgid "Available Fairway Depth"
 msgstr "hajóút mélysége"
@@ -192,14 +196,14 @@
 msgid "Available fairway depth vs LNWL"
 msgstr "hajóút mélysége"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 #, fuzzy
 msgid "Available Fairway Depth vs LNWL:"
 msgstr "hajóút mélysége"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 #, fuzzy
 msgid "Available Fairway Depth:"
 msgstr "hajóút mélysége"
@@ -217,56 +221,60 @@
 msgid "back to login"
 msgstr "vissza a bejelentkezéshez"
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -277,25 +285,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr "Backend Error"
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -304,8 +313,8 @@
 msgid "BeamType"
 msgstr "Típus"
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 #, fuzzy
 msgid "Bottleneck"
@@ -315,67 +324,71 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 #, fuzzy
 msgid "Bottleneck Surveys"
 msgstr "Gázlók"
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 #, fuzzy
 msgid "Bottleneck:"
 msgstr "Gázlók, szűkületek"
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr "Gázlók"
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr ""
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 msgid "Cancel"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr ""
 
@@ -395,11 +408,11 @@
 msgid "Choose color"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr ""
 
@@ -425,11 +438,11 @@
 msgid "Compare with"
 msgstr ""
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr ""
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr ""
 
@@ -439,25 +452,25 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 #, fuzzy
 msgid "Country"
 msgstr "Ország"
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr ""
 
@@ -465,7 +478,7 @@
 msgid "Current Waterlevel"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr ""
 
@@ -473,15 +486,19 @@
 msgid "Data Availability/Accuracy"
 msgstr ""
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr ""
 
@@ -496,7 +513,7 @@
 msgid "Date info"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr ""
 
@@ -504,13 +521,13 @@
 msgid "Day"
 msgstr ""
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -518,8 +535,8 @@
 msgid "Dec"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr ""
@@ -544,14 +561,14 @@
 msgid "Define Stretches"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 msgid "Delete"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 msgid "Delete cross profile"
 msgstr ""
 
@@ -563,11 +580,11 @@
 msgid "Delete Template"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 msgid "Delete user"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 msgid "Delete User"
 msgstr ""
 
@@ -583,13 +600,13 @@
 msgid "deleted successfully"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr ""
 
@@ -601,7 +618,7 @@
 msgid "Depth Reference"
 msgstr ""
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr ""
 
@@ -617,11 +634,11 @@
 msgid "Depthreference"
 msgstr ""
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 msgid "Distance Mark"
 msgstr ""
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 msgid "Distance Mark ashore"
 msgstr ""
 
@@ -633,7 +650,7 @@
 msgid "Distance marks virtual"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr ""
 
@@ -641,7 +658,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr ""
 
@@ -667,12 +684,21 @@
 msgid "Download Meta.json"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:273
+msgid "Edit user"
+msgstr ""
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 #, fuzzy
 msgid "Email"
 msgstr "E-mail"
@@ -708,11 +734,11 @@
 msgid "Enqueued"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr ""
 
@@ -732,11 +758,11 @@
 msgid "Errorlog"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 msgid "Every"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr ""
 
@@ -789,15 +815,15 @@
 msgid "Fairway (LOS 3)"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr ""
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 msgid "Fairway Critical"
 msgstr ""
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 msgid "Fairway Date"
 msgstr ""
 
@@ -805,17 +831,17 @@
 msgid "Fairway dimension"
 msgstr ""
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 msgid "Fairway Dimensions"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 msgid "FairwayAvailability"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr ""
 
@@ -841,21 +867,21 @@
 msgid "Feb"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 msgid "File Import"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr ""
 
@@ -872,7 +898,7 @@
 msgid "Fri"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr ""
@@ -887,11 +913,11 @@
 msgid "From"
 msgstr ""
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr ""
 
@@ -907,11 +933,11 @@
 msgid "Gauge measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 msgid "Gauge Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr ""
 
@@ -919,25 +945,25 @@
 msgid "Gauges"
 msgstr ""
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr ""
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 #, fuzzy
 msgid "Generated by"
 msgstr "- létrehozta:"
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 msgid "Generated PDFs use font:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr ""
 
@@ -967,21 +993,21 @@
 msgid "ID"
 msgstr ""
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 msgid "Identified Features"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -991,7 +1017,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 msgid "Import import: #"
 msgstr ""
 
@@ -1004,7 +1030,7 @@
 msgid "Import Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr ""
 
@@ -1016,7 +1042,7 @@
 msgid "Import via"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 msgid "Import Waterway Profiles"
 msgstr ""
 
@@ -1035,11 +1061,11 @@
 msgid "Invalid element"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr ""
 
@@ -1047,8 +1073,8 @@
 msgid "Jan"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr ""
@@ -1057,8 +1083,8 @@
 msgid "Jul"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr ""
@@ -1067,8 +1093,8 @@
 msgid "Jun"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr ""
@@ -1089,21 +1115,21 @@
 msgid "Later"
 msgstr ""
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 msgid "Latest measurement"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 msgid "Latest Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 msgid "Latest Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 msgid "Latest Waterlevel Date"
 msgstr ""
 
@@ -1116,11 +1142,16 @@
 msgid "Length"
 msgstr ""
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+#, fuzzy
+msgid "Loading Error"
+msgstr "Backend Error"
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr ""
@@ -1144,12 +1175,12 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr ""
 
@@ -1168,22 +1199,26 @@
 msgid "Mar"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 msgid "May"
 msgstr ""
@@ -1200,16 +1235,16 @@
 msgid "Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 msgid "Measurement is within"
 msgstr ""
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 msgid "measurements"
 msgstr ""
 
@@ -1223,21 +1258,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr ""
 
@@ -1245,24 +1280,24 @@
 msgid "Mon"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 msgid "monthly"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1271,17 +1306,17 @@
 msgid "Name"
 msgstr "Név"
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr ""
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr ""
 
@@ -1299,10 +1334,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr ""
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1320,7 +1351,7 @@
 msgid "New stretch"
 msgstr ""
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr ""
 
@@ -1330,11 +1361,16 @@
 msgid "No data available."
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+msgid "No data selectable"
+msgstr ""
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr ""
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 msgid "No measurement available"
 msgstr ""
 
@@ -1342,7 +1378,7 @@
 msgid "No results."
 msgstr ""
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr ""
 
@@ -1350,7 +1386,7 @@
 msgid "No style-changes"
 msgstr ""
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr ""
 
@@ -1366,8 +1402,8 @@
 msgid "No valid waterlevel data available."
 msgstr ""
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1375,14 +1411,14 @@
 msgid "Nov"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr ""
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr ""
 
@@ -1391,7 +1427,7 @@
 msgid "Numbers"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 msgid "o' clock"
 msgstr ""
 
@@ -1403,13 +1439,13 @@
 msgid "Oct"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr ""
 
@@ -1421,11 +1457,11 @@
 msgid "Old"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 msgid "Onetime Imports"
 msgstr ""
 
@@ -1438,17 +1474,17 @@
 msgid "Owner"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr "Jelszó"
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr "Jelszó"
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr ""
 
@@ -1456,13 +1492,14 @@
 msgid "Password reset requested!"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr ""
 
@@ -1474,16 +1511,16 @@
 msgid "pending"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 #, fuzzy
 msgid "Please choose a country"
 msgstr "Kérem, válasszon országot"
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr ""
 
@@ -1492,7 +1529,7 @@
 msgid "Please enter a date"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr ""
 
@@ -1505,15 +1542,15 @@
 msgid "Please enter a Featuretype"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr ""
 
@@ -1535,7 +1572,7 @@
 msgid "Please enter a source organization"
 msgstr "Kérem, válasszon országot"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr ""
 
@@ -1583,28 +1620,27 @@
 msgid "Please enter an originator"
 msgstr "Kérem, válasszon országot"
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr ""
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+msgid "Please select a report to update"
+msgstr ""
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+msgid "Please select stats to update"
+msgstr ""
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1613,7 +1649,7 @@
 msgid "portrait"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr ""
 
@@ -1626,7 +1662,7 @@
 msgid "Prediction"
 msgstr ""
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr ""
 
@@ -1638,11 +1674,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr ""
 
@@ -1662,21 +1698,29 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+msgid "Reactivate user"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 #, fuzzy
 msgid "Recency of Bottleneck Surveys"
 msgstr "Gázlók"
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr ""
 
@@ -1688,14 +1732,18 @@
 msgid "Refresh"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 msgid "Regular Imports"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr ""
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+msgid "Reports"
+msgstr ""
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr ""
@@ -1712,15 +1760,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1738,11 +1786,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1754,25 +1802,24 @@
 msgid "Sat"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 msgid "Saved import: #"
 msgstr ""
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr ""
 
@@ -1781,15 +1828,15 @@
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 msgid "Scheduled"
 msgstr ""
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 msgid "Section"
 msgstr ""
 
@@ -1813,7 +1860,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 #, fuzzy
 msgid "Select bottleneck"
 msgstr "Gázlók, szűkületek"
@@ -1848,7 +1895,7 @@
 msgid "Send all"
 msgstr "Küldés"
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr ""
 
@@ -1856,13 +1903,13 @@
 msgid "Sep"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr ""
 
@@ -1870,7 +1917,7 @@
 msgid "Show Hydrological Conditions"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr ""
 
@@ -1882,11 +1929,11 @@
 msgid "Signer"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr ""
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1910,7 +1957,7 @@
 msgid "Sounding Result Comparison"
 msgstr ""
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 msgid "Sounding results"
 msgstr ""
 
@@ -1927,16 +1974,16 @@
 msgid "Source organization"
 msgstr ""
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 msgid "Source Organization"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr ""
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr ""
 
@@ -1945,7 +1992,7 @@
 msgid "Staging Area"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr ""
 
@@ -1953,7 +2000,7 @@
 msgid "Start rhm"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr ""
 
@@ -1977,11 +2024,15 @@
 msgid "Starting Year"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 msgid "Status"
 msgstr ""
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 msgid "Stretch"
 msgstr ""
 
@@ -1990,13 +2041,18 @@
 msgstr ""
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+#, fuzzy
+msgid "successfully"
+msgstr " sikeresen feltöltve"
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -2004,17 +2060,17 @@
 msgid "Sun"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr ""
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr ""
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr ""
 
@@ -2022,11 +2078,11 @@
 msgid "Survey from:"
 msgstr ""
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 msgid "Survey type"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr ""
 
@@ -2034,7 +2090,7 @@
 msgid "Sysadmin"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 msgid "System-Administrator"
 msgstr ""
 
@@ -2046,10 +2102,16 @@
 msgid "Systemconfiguration"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 msgid "Testmail sent"
 msgstr ""
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2137,9 +2199,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2147,7 +2209,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2157,12 +2219,12 @@
 msgid "Thu"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2184,21 +2246,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 msgid "Trigger import"
 msgstr ""
 
@@ -2206,7 +2268,7 @@
 msgid "Tue"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr ""
@@ -2222,11 +2284,15 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 msgid "update import: #"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr ""
 
@@ -2250,7 +2316,7 @@
 msgid "uploaded successfully"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2265,25 +2331,34 @@
 msgid "URL"
 msgstr ""
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 msgid "User Manual"
 msgstr ""
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr ""
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr ""
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2295,7 +2370,7 @@
 msgid "Value"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2320,17 +2395,17 @@
 msgstr ""
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 msgid "Waterlevel [m]"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 msgid "Waterway Admin"
 msgstr ""
 
@@ -2338,7 +2413,7 @@
 msgid "Waterway area"
 msgstr ""
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 msgid "Waterway Area"
 msgstr ""
 
@@ -2346,7 +2421,7 @@
 msgid "Waterway axis"
 msgstr ""
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 msgid "Waterway Axis"
 msgstr ""
 
@@ -2354,7 +2429,7 @@
 msgid "Waterway gauges"
 msgstr ""
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 msgid "Waterway Profile"
 msgstr ""
 
@@ -2363,7 +2438,7 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 msgid "Waterway User"
 msgstr ""
 
@@ -2371,16 +2446,16 @@
 msgid "Wed"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr ""
 
@@ -2396,26 +2471,30 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr "Év"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 #, fuzzy
 msgid "yearly"
 msgstr "Év"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 #, fuzzy
 msgid "yes"
 msgstr "Rétegek"
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
 msgstr ""
 
+#: src/components/identify/formatter.js:127
+msgid "ZPG exception"
+msgstr ""
+
 #~ msgid "Bottleneck Areas fill-color"
 #~ msgstr "Gázló színe"
 
--- a/client/src/locale/ro_RO/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/ro_RO/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -24,7 +24,7 @@
 msgid " does not match any template's element"
 msgstr " 'niciun element din template nu se potriveste"
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
 msgstr " a fost încărcat cu succes."
 
@@ -36,19 +36,19 @@
 msgid "%{layerName} Fill Color"
 msgstr "%{layerName} Culoarea de umplere"
 
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
 msgstr ""
 
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
 msgstr "0 inseamna nicio intrare"
 
@@ -56,7 +56,7 @@
 msgid "120 dpi"
 msgstr "120 dpi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr "15 minute"
 
@@ -64,7 +64,7 @@
 msgid "200 dpi"
 msgstr "200 dpi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
 msgstr "2h45m pentru doua ore si 45 de minute"
 
@@ -72,11 +72,11 @@
 msgid "30 Days"
 msgstr "30 zile"
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
 msgstr "30m pentru 30 minute"
 
-#: src/components/importconfiguration/ScheduledImports.vue:678
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
 msgstr "60 pentru 60 secunde "
 
@@ -108,8 +108,8 @@
 msgid "According gauge data:"
 msgstr "Conform date statie de masura nivel:"
 
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr "Adauga utilizator"
 
@@ -121,7 +121,7 @@
 msgid "AM"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:466
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
 msgstr "aprobat"
 
@@ -134,8 +134,8 @@
 msgid "Apr"
 msgstr "Aprilie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr "Aprilie"
@@ -144,30 +144,34 @@
 msgid "Area"
 msgstr "Zona"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr "la"
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 #, fuzzy
 msgid "Aug"
 msgstr "August"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr "August"
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr "Disponibil: Sub prag"
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 msgid "Avail: Latest measurement from "
 msgstr "DUltima Masuratoare "
 
-#: src/components/identify/Identify.vue:436
+#: src/components/identify/Identify.vue:505
 msgid "Avail: Latest measurement older than"
 msgstr "Disponibil :Ultima masuratoare mai veche decat"
 
@@ -182,7 +186,7 @@
 msgid "Available fairway depth"
 msgstr "Adâncimi disponibile în şenal"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 #, fuzzy
 msgid "Available Fairway Depth"
 msgstr "Adâncimi disponibile în şenal"
@@ -191,14 +195,14 @@
 msgid "Available fairway depth vs LNWL"
 msgstr "Adâncimi disponibile în şenal vs LNWL"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 #, fuzzy
 msgid "Available Fairway Depth vs LNWL:"
 msgstr "Adâncimi disponibile în şenal vs LNWL"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 msgid "Available Fairway Depth:"
 msgstr "Adâncimi disponibile în şenal:"
 
@@ -215,56 +219,60 @@
 msgid "back to login"
 msgstr "inapoi la login"
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -275,25 +283,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr "Eroare Server"
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -301,8 +310,8 @@
 msgid "BeamType"
 msgstr "Tip fascicul"
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 msgid "Bottleneck"
 msgstr "Punct critic"
@@ -311,65 +320,69 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr "Izobate"
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 msgid "Bottleneck Surveys"
 msgstr "Masuratori Puncte critice"
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 msgid "Bottleneck:"
 msgstr "Punct critic:"
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr "Puncte critice"
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr "Calcul diferente"
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 msgid "Cancel"
 msgstr "Anulaţi"
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr "Secţiunea"
 
@@ -389,11 +402,11 @@
 msgid "Choose color"
 msgstr "Alege o culoare"
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr "alege fisier sa incarci"
 
@@ -423,11 +436,11 @@
 msgid "Compare with"
 msgstr "Compara cu"
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr "Sigure pentru 24 ore"
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr "Sigure pentru 72 de ore"
 
@@ -437,24 +450,24 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr "Confirmă"
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr "Coordonate copiate in memorie !"
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 msgid "Country"
 msgstr "Ţara"
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr "Sir cronologic"
 
@@ -462,7 +475,7 @@
 msgid "Current Waterlevel"
 msgstr "Nivelul apei actual"
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr ""
 
@@ -470,15 +483,19 @@
 msgid "Data Availability/Accuracy"
 msgstr "Disponibilitate Date/ Acuratete"
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr "Date prea vechi. Limita:"
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr "Date in limita revizuita"
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr "Date cu timp de revizuire"
 
@@ -493,7 +510,7 @@
 msgid "Date info"
 msgstr "Dată informaţii"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr "zi"
 
@@ -501,13 +518,13 @@
 msgid "Day"
 msgstr "Ziua"
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -515,8 +532,8 @@
 msgid "Dec"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr "Decembrie"
@@ -541,14 +558,14 @@
 msgid "Define Stretches"
 msgstr "Defineşte sectoarele"
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 msgid "Delete"
 msgstr "Șterge"
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 msgid "Delete cross profile"
 msgstr "Sterge profile transversale"
 
@@ -560,11 +577,11 @@
 msgid "Delete Template"
 msgstr "Sterge templat-ul"
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 msgid "Delete user"
 msgstr "Șterge utilizator"
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 msgid "Delete User"
 msgstr "Șterge utilizator"
 
@@ -580,13 +597,13 @@
 msgid "deleted successfully"
 msgstr "sterse cu succes"
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr "Șterge "
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr "Adâncime"
 
@@ -598,7 +615,7 @@
 msgid "Depth Reference"
 msgstr "Adâncimea de referinţă"
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr "Adâncime relativă la"
 
@@ -614,11 +631,11 @@
 msgid "Depthreference"
 msgstr "Adâncimea de eeferinţă"
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 msgid "Distance Mark"
 msgstr "Marcaj distanță"
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 msgid "Distance Mark ashore"
 msgstr "Marcajul distanței pe uscat"
 
@@ -630,7 +647,7 @@
 msgid "Distance marks virtual"
 msgstr "Marcaj distanță virtual"
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr "Chiar vrei să ştergi profilul transversal:"
 
@@ -638,7 +655,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr "Chiar vrei să ştergi următorul cont de utilizator:"
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr "Chiar vrei să ştergi următorul cont de utilizator:"
 
@@ -664,12 +681,22 @@
 msgid "Download Meta.json"
 msgstr "Descarcă Meta.json"
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr "Mai devreme"
 
+#: src/components/usermanagement/Usermanagement.vue:273
+#, fuzzy
+msgid "Edit user"
+msgstr "Introdu nume utilizator"
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 msgid "Email"
 msgstr "E-mail"
 
@@ -704,11 +731,11 @@
 msgid "Enqueued"
 msgstr "In asteptare"
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr "Introdu coordonatele manual"
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr "Introdu eticheta pentru profil transversal"
 
@@ -728,11 +755,11 @@
 msgid "Errorlog"
 msgstr "Jurnal de erori"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 msgid "Every"
 msgstr "Orice"
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr "Exemple:"
 
@@ -785,15 +812,15 @@
 msgid "Fairway (LOS 3)"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr "Disponibilitate Senal navigabil"
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 msgid "Fairway Critical"
 msgstr "Senal navigabil critic"
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 #, fuzzy
 msgid "Fairway Date"
 msgstr "Aria caii navigabile"
@@ -802,17 +829,17 @@
 msgid "Fairway dimension"
 msgstr "Dimensiune șenal navigabil"
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 msgid "Fairway Dimensions"
 msgstr "Dimensiunile șenalului navigabil"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 msgid "FairwayAvailability"
 msgstr "Disponibilitatea Senalului navigabil"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr "Disponibilitate senal navigabil vs LNWL"
 
@@ -839,21 +866,21 @@
 msgid "Feb"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr "Februarie"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr "Fisier"
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 msgid "File Import"
 msgstr "Importa fisier"
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr "Finalizare reviziune"
 
@@ -870,7 +897,7 @@
 msgid "Fri"
 msgstr "Vineri"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr "Vineri"
@@ -885,11 +912,11 @@
 msgid "From"
 msgstr "De la"
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr "Mira"
 
@@ -905,11 +932,11 @@
 msgid "Gauge measurement"
 msgstr "Masurare nivel"
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 msgid "Gauge Waterlevel"
 msgstr "Nivelul apei"
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr "Data Nivel apa"
 
@@ -917,24 +944,24 @@
 msgid "Gauges"
 msgstr "Mire"
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr "Genereaza PDF"
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 msgid "Generated by"
 msgstr "Generat de"
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 msgid "Generated PDFs use font:"
 msgstr "Genereaza PDF-uri:"
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr "Siguranta maxima"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr "ora"
 
@@ -964,21 +991,21 @@
 msgid "ID"
 msgstr "Eticheta"
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 msgid "Identified Features"
 msgstr "Functionalitati identificate"
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr "Daca nu sunt erori in timpul importului, nu vor mai fi reluari"
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -988,7 +1015,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr "Importa niveluri oficiale"
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 msgid "Import import: #"
 msgstr "importă importul: #"
 
@@ -1001,7 +1028,7 @@
 msgid "Import Schedule"
 msgstr "Import plan"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr "Import rezultate masuratori"
 
@@ -1013,7 +1040,7 @@
 msgid "Import via"
 msgstr "Calea de import"
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 msgid "Import Waterway Profiles"
 msgstr "Importa profilele caii navigabile"
 
@@ -1032,11 +1059,11 @@
 msgid "Invalid element"
 msgstr "Element invalid"
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr "adresa de email nevalabila"
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr "Inregistrare nevalida"
 
@@ -1044,8 +1071,8 @@
 msgid "Jan"
 msgstr "Ianuarie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr "Ianuarie"
@@ -1054,8 +1081,8 @@
 msgid "Jul"
 msgstr "Iulie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr "Iulie"
@@ -1064,8 +1091,8 @@
 msgid "Jun"
 msgstr "Iunie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr "Iunie"
@@ -1086,21 +1113,21 @@
 msgid "Later"
 msgstr "Mai tarziu"
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 msgid "Latest measurement"
 msgstr "Ultima Masuratoare"
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 msgid "Latest Measurement"
 msgstr "Ultima Masuratoare"
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 msgid "Latest Waterlevel"
 msgstr "Ultimul nivel al apei"
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 msgid "Latest Waterlevel Date"
 msgstr "Data ultimului nivel al apei"
 
@@ -1112,11 +1139,16 @@
 msgid "Length"
 msgstr "Lungime"
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+#, fuzzy
+msgid "Loading Error"
+msgstr "Eroare formatare"
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr "Logare"
@@ -1140,12 +1172,12 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr "LOS"
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr "Declansare import  manual: #"
 
@@ -1163,22 +1195,26 @@
 msgid "Mar"
 msgstr "Martie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr "Martie"
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr "Maxim incercari"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr "Latime maxima"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 msgid "May"
 msgstr "Mai"
@@ -1195,16 +1231,16 @@
 msgid "Measurement"
 msgstr "Masuratoare"
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr "Masuratori in ultimele 14 zile"
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 msgid "Measurement is within"
 msgstr "Masuratoare este in"
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 msgid "measurements"
 msgstr "Masuratori"
 
@@ -1218,21 +1254,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr "Min. nivel masurat in ultimele 14 zile"
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr "minute trecute"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr "Latime minima"
 
@@ -1240,24 +1276,24 @@
 msgid "Mon"
 msgstr "Luni"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr "Luni"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr "luna"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 msgid "monthly"
 msgstr "Lunar"
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr "Lunar"
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1265,17 +1301,17 @@
 msgid "Name"
 msgstr "Nume"
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr "Nash-Sutcliffe"
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr "Nash-Sutcliffe nu este disponbil"
 
@@ -1293,10 +1329,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr "Anuleaza valorile Z in fisierul XYZ"
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr ""
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1314,7 +1346,7 @@
 msgid "New stretch"
 msgstr "Sector nou"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr "nu"
 
@@ -1324,11 +1356,17 @@
 msgid "No data available."
 msgstr "Nu sunt disponibile date."
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+#, fuzzy
+msgid "No data selectable"
+msgstr "Nu sunt disponibile date."
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr "Nicio caracteristica identificata."
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 msgid "No measurement available"
 msgstr "Nu sunt disponibile date."
 
@@ -1336,7 +1374,7 @@
 msgid "No results."
 msgstr "Niciun rezultat."
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr "Nu e definit timpul de revizuire"
 
@@ -1344,7 +1382,7 @@
 msgid "No style-changes"
 msgstr "Nicio schimbare a stilului"
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr "Nu sunt disponibile date despre sondaj"
 
@@ -1362,8 +1400,8 @@
 msgid "No valid waterlevel data available."
 msgstr "Nu sunt disponibile date."
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1371,14 +1409,14 @@
 msgid "Nov"
 msgstr "Noiembrie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr "Noiembrie"
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr "Acum"
 
@@ -1387,7 +1425,7 @@
 msgid "Numbers"
 msgstr "Numere"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 msgid "o' clock"
 msgstr "ora"
 
@@ -1399,13 +1437,13 @@
 msgid "Oct"
 msgstr "Octombrie"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr "Octombrie"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr "al"
 
@@ -1417,11 +1455,11 @@
 msgid "Old"
 msgstr "Vechi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr "inchis, in"
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 msgid "Onetime Imports"
 msgstr "Importa o singura data"
 
@@ -1434,17 +1472,17 @@
 msgid "Owner"
 msgstr "Proprietar"
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr "parola"
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr "Parola"
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr "parola din nou"
 
@@ -1452,7 +1490,8 @@
 msgid "Password reset requested!"
 msgstr "Solicitat resetare parola!"
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
@@ -1460,7 +1499,7 @@
 "Parola trebuie sa fie de 8 caractere lungime sa includa 1 digit si 1 "
 "caracter special , de ex. $"
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr "Parola nu corespunde!"
 
@@ -1472,15 +1511,15 @@
 msgid "pending"
 msgstr "in asteptare"
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr "Procent"
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 msgid "Please choose a country"
 msgstr "Selectați o țară"
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr "Selectati un rol"
 
@@ -1489,7 +1528,7 @@
 msgid "Please enter a date"
 msgstr "Introduceti o data"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr "Introduceti o adancime"
 
@@ -1502,15 +1541,15 @@
 msgid "Please enter a Featuretype"
 msgstr "Introduceti  un tip de caracteristica"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr "Introduceti un nivel de servicii"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr "Introduceti o latime maxima"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr "Introduceti o latime minima"
 
@@ -1531,7 +1570,7 @@
 msgid "Please enter a source organization"
 msgstr "Introduceti o sursa (organizatie)"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr "Introduceti o sursa (organizatie)"
 
@@ -1578,28 +1617,29 @@
 msgid "Please enter an originator"
 msgstr "Introduceti un initiator"
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr "Introduceti coordonatele corecte, in format: Lat,Lon,Lat,Lon"
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr "Introduceti Sortat dupa"
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr "Selectati un punct critic"
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+#, fuzzy
+msgid "Please select a report to update"
+msgstr "Selectati unul"
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr "Selectati unul"
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+#, fuzzy
+msgid "Please select stats to update"
+msgstr "Selectati unul"
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1608,7 +1648,7 @@
 msgid "portrait"
 msgstr "vertical"
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr "Valorile pozitive sunt mai sus decat limita pentru reluari"
 
@@ -1621,7 +1661,7 @@
 msgid "Prediction"
 msgstr "Predictie"
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr "Nu sunt disponibile predictii"
 
@@ -1633,11 +1673,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr "Profil sters!"
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr "Profil salvat!"
 
@@ -1657,20 +1697,29 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+#, fuzzy
+msgid "Reactivate user"
+msgstr "Șterge utilizator"
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 msgid "Recency of Bottleneck Surveys"
 msgstr "Ultimile sondaje ale punctelor critice"
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr "Mira de referinta"
 
@@ -1682,14 +1731,19 @@
 msgid "Refresh"
 msgstr "Actualizare"
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 msgid "Regular Imports"
 msgstr "Importuri regulate"
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr "Repeta parola"
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+#, fuzzy
+msgid "Reports"
+msgstr "Importuri"
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr "Solicitare resetare parola!"
@@ -1706,15 +1760,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1732,11 +1786,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr "Rol"
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1748,25 +1802,24 @@
 msgid "Sat"
 msgstr "Sambata"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr "Sambata"
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr "Salvare"
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr "Profile transversale salvate"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 msgid "Saved import: #"
 msgstr "Import salvat: #"
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr "Scara"
 
@@ -1775,15 +1828,15 @@
 msgstr "Scara de 1:"
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr "Plan, orar"
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 msgid "Scheduled"
 msgstr "Programat"
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 msgid "Section"
 msgstr "Sectiune"
 
@@ -1807,7 +1860,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 msgid "Select bottleneck"
 msgstr "Selecteaza punctul critic"
 
@@ -1839,7 +1892,7 @@
 msgid "Send all"
 msgstr "Trimite tot"
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr "Trimite email de test"
 
@@ -1847,13 +1900,13 @@
 msgid "Sep"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr "Septembrie"
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr "Arata diferentele"
 
@@ -1861,7 +1914,7 @@
 msgid "Show Hydrological Conditions"
 msgstr "Arată Condițiile Hidrologice"
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr "Arata masuratoare"
 
@@ -1873,11 +1926,11 @@
 msgid "Signer"
 msgstr "Semnatar"
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr ""
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1904,7 +1957,7 @@
 msgid "Sounding Result Comparison"
 msgstr "Compara rezultatele sondajelor"
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 msgid "Sounding results"
 msgstr "Rezultatele sondajului"
 
@@ -1921,16 +1974,16 @@
 msgid "Source organization"
 msgstr "Organizatia sursa"
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 msgid "Source Organization"
 msgstr "Organizatia sursa"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr "Organizatia sursa"
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr "cod sursa"
 
@@ -1939,7 +1992,7 @@
 msgid "Staging Area"
 msgstr "Debarcader"
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr "Porneste"
 
@@ -1947,7 +2000,7 @@
 msgid "Start rhm"
 msgstr "Rhm de pornire"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr "Incepe importul pentru: "
 
@@ -1971,11 +2024,15 @@
 msgid "Starting Year"
 msgstr "Anul de inceput"
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 msgid "Status"
 msgstr "Stare"
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 msgid "Stretch"
 msgstr "Sector"
 
@@ -1984,13 +2041,18 @@
 msgstr "Sctoare"
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr "Trimis"
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+#, fuzzy
+msgid "successfully"
+msgstr "sterse cu succes"
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -1998,17 +2060,17 @@
 msgid "Sun"
 msgstr "Duminica"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr "Duminica"
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr "Masuratoare"
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr "Data masuratorii"
 
@@ -2016,11 +2078,11 @@
 msgid "Survey from:"
 msgstr "Sondaj de la:"
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 msgid "Survey type"
 msgstr "Tipul sondajului"
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr "Sondaje"
 
@@ -2028,7 +2090,7 @@
 msgid "Sysadmin"
 msgstr "Administrator de sistem"
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 msgid "System-Administrator"
 msgstr "Administrator de sistem"
 
@@ -2040,10 +2102,16 @@
 msgid "Systemconfiguration"
 msgstr "Configurare de sistem"
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 msgid "Testmail sent"
 msgstr "E-mail-ul de test a fost trimis"
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2131,9 +2199,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2141,7 +2209,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2154,12 +2222,12 @@
 msgid "Thu"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr "Joi"
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2181,21 +2249,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr "Toleranta pentru captura axei"
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 msgid "Trigger import"
 msgstr "Declanseaza Importul"
 
@@ -2203,7 +2271,7 @@
 msgid "Tue"
 msgstr "Marti"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr "Marti"
@@ -2218,11 +2286,15 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 msgid "update import: #"
 msgstr "actualizare import: #"
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr "Incarca"
 
@@ -2246,7 +2318,7 @@
 msgid "uploaded successfully"
 msgstr "incarcate cu succes"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2261,25 +2333,34 @@
 msgid "URL"
 msgstr "URL"
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 msgid "User Manual"
 msgstr "Manualul utilizatrorului"
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr "Nume utilizator"
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr "Utilizatori"
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2295,7 +2376,7 @@
 msgid "Value"
 msgstr "Valoare"
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2320,18 +2401,18 @@
 msgstr "Nivelul apei"
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 #, fuzzy
 msgid "Waterlevel [m]"
 msgstr "Nivelul apei [cm]"
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr "Nivelul apei"
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 msgid "Waterway Admin"
 msgstr "Administrator de cale navigabila"
 
@@ -2339,7 +2420,7 @@
 msgid "Waterway area"
 msgstr "Aria caii navigabile"
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 msgid "Waterway Area"
 msgstr "Aria caii navigabile"
 
@@ -2347,7 +2428,7 @@
 msgid "Waterway axis"
 msgstr "Axa caii navigabile"
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 msgid "Waterway Axis"
 msgstr "Axa caii navigabile"
 
@@ -2355,7 +2436,7 @@
 msgid "Waterway gauges"
 msgstr "Mire ale caii navigabile"
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 msgid "Waterway Profile"
 msgstr "Profil al caii navigabile"
 
@@ -2364,7 +2445,7 @@
 msgstr "Profile ale caii navigabile"
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 msgid "Waterway User"
 msgstr "Utilizator cale navigabila"
 
@@ -2372,16 +2453,16 @@
 msgid "Wed"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr "Miercuri"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr "saptamana"
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr "Saptamanal"
 
@@ -2397,19 +2478,19 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr "an"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 msgid "yearly"
 msgstr "anual"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "yes"
 msgstr "da"
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
@@ -2417,6 +2498,14 @@
 "Acum poti selecta aceste coordonate din meniul \"Profile transversale salvate"
 "\" pentru a restaura profilul transversal."
 
+#: src/components/identify/formatter.js:127
+#, fuzzy
+msgid "ZPG exception"
+msgstr "Predictie"
+
+#~ msgid "Please enter SortBy"
+#~ msgstr "Introduceti Sortat dupa"
+
 #~ msgid "Error while saving user"
 #~ msgstr "Eroare la salvare utilizator"
 
@@ -2483,10 +2572,6 @@
 #~ msgid "Do you really want to delete this section:"
 #~ msgstr "Chiar vrei să ştergi acest sector:"
 
-#, fuzzy
-#~ msgid "Please select template type"
-#~ msgstr "Selectati unul"
-
 #~ msgid "( New )"
 #~ msgstr "(Nou)"
 
--- a/client/src/locale/sk_SK/LC_MESSAGES/app.po	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/locale/sk_SK/LC_MESSAGES/app.po	Tue Feb 08 10:20:26 2022 +0100
@@ -23,7 +23,7 @@
 msgid " does not match any template's element"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:181
 msgid " was successfully uploaded."
 msgstr ""
 
@@ -35,19 +35,19 @@
 msgid "%{layerName} Fill Color"
 msgstr ""
 
-#: src/components/TimeSlider.vue:349
-#: src/components/gauge/HydrologicalConditions.vue:688
+#: src/components/TimeSlider.vue:352
+#: src/components/gauge/HydrologicalConditions.vue:684
 #: src/components/gauge/Waterlevel.vue:419
 msgid "%a %d"
 msgstr ""
 
-#: src/components/TimeSlider.vue:350
-#: src/components/gauge/HydrologicalConditions.vue:689
+#: src/components/TimeSlider.vue:353
+#: src/components/gauge/HydrologicalConditions.vue:685
 #: src/components/gauge/Waterlevel.vue:420
 msgid "%b %d"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "0 means no retry"
 msgstr ""
 
@@ -55,7 +55,7 @@
 msgid "120 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1115
+#: src/components/importconfiguration/ScheduledImports.vue:1142
 msgid "15 minutes"
 msgstr ""
 
@@ -63,7 +63,7 @@
 msgid "200 dpi"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "2h45m for for two hours and 45 Minutes"
 msgstr ""
 
@@ -71,11 +71,11 @@
 msgid "30 Days"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:679
+#: src/components/importconfiguration/ScheduledImports.vue:684
 msgid "30m for 30 Minutes"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:678
+#: src/components/importconfiguration/ScheduledImports.vue:683
 msgid "60 for 60 Seconds "
 msgstr ""
 
@@ -107,8 +107,8 @@
 msgid "According gauge data:"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:242
-#: src/components/usermanagement/Usermanagement.vue:82
+#: src/components/usermanagement/Userdetail.vue:274
+#: src/components/usermanagement/Usermanagement.vue:126
 msgid "Add User"
 msgstr ""
 
@@ -120,7 +120,7 @@
 msgid "AM"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:466
+#: src/components/importoverview/ImportOverview.vue:465
 msgid "approved"
 msgstr ""
 
@@ -132,8 +132,8 @@
 msgid "Apr"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:912
-#: src/components/importconfiguration/ScheduledImports.vue:1135
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
+#: src/components/importconfiguration/ScheduledImports.vue:1162
 #: src/lib/datelocalization.js:29
 msgid "April"
 msgstr ""
@@ -142,29 +142,33 @@
 msgid "Area"
 msgstr "Oblasť"
 
-#: src/components/importconfiguration/ScheduledImports.vue:1112
+#: src/components/importconfiguration/ScheduledImports.vue:1139
 msgid "at"
 msgstr ""
 
+#: src/components/importconfiguration/ScheduledImports.vue:686
+msgid "At least 5 Seconds "
+msgstr ""
+
 #: src/lib/datelocalization.js:47
 msgid "Aug"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
-#: src/components/importconfiguration/ScheduledImports.vue:1139
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:922
+#: src/components/importconfiguration/ScheduledImports.vue:1166
 #: src/lib/datelocalization.js:33
 msgid "August"
 msgstr ""
 
-#: src/components/identify/Identify.vue:430
+#: src/components/identify/Identify.vue:499
 msgid "Avail: Below treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:422
+#: src/components/identify/Identify.vue:491
 msgid "Avail: Latest measurement from "
 msgstr ""
 
-#: src/components/identify/Identify.vue:436
+#: src/components/identify/Identify.vue:505
 msgid "Avail: Latest measurement older than"
 msgstr ""
 
@@ -178,7 +182,7 @@
 msgid "Available fairway depth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:864
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:870
 msgid "Available Fairway Depth"
 msgstr ""
 
@@ -186,13 +190,13 @@
 msgid "Available fairway depth vs LNWL"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:227
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:372
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:230
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:378
 msgid "Available Fairway Depth vs LNWL:"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:250
-#: src/components/fairway/AvailableFairwayDepth.vue:380
+#: src/components/fairway/AvailableFairwayDepth.vue:253
+#: src/components/fairway/AvailableFairwayDepth.vue:383
 msgid "Available Fairway Depth:"
 msgstr ""
 
@@ -209,56 +213,60 @@
 msgid "back to login"
 msgstr ""
 
-#: src/components/App.vue:128 src/components/Bottlenecks.vue:195
+#: src/components/App.vue:128 src/components/Bottlenecks.vue:197
 #: src/components/Login.vue:238 src/components/Logs.vue:167
-#: src/components/Pdftool.vue:241 src/components/Pdftool.vue:312
-#: src/components/Pdftool.vue:929 src/components/Search.vue:269
-#: src/components/Search.vue:317 src/components/Sidebar.vue:167
+#: src/components/Pdftool.vue:259 src/components/Pdftool.vue:343
+#: src/components/Pdftool.vue:1021 src/components/Search.vue:310
+#: src/components/Search.vue:358 src/components/Sidebar.vue:158
+#: src/components/Sidebar.vue:178
 #: src/components/fairway/AvailableFairwayDepth.vue:181
-#: src/components/fairway/AvailableFairwayDepth.vue:373
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:777
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:822
+#: src/components/fairway/AvailableFairwayDepth.vue:376
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:783
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:828
 #: src/components/fairway/AvailableFairwayDepthLNWL.vue:176
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:365
-#: src/components/fairway/BottleneckDialogue.vue:617
-#: src/components/fairway/BottleneckDialogue.vue:765
-#: src/components/fairway/BottleneckDialogue.vue:824
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:371
+#: src/components/fairway/BottleneckDialogue.vue:629
+#: src/components/fairway/BottleneckDialogue.vue:777
+#: src/components/fairway/BottleneckDialogue.vue:836
 #: src/components/fairway/Fairwayprofile.vue:441
-#: src/components/fairway/Fairwayprofile.vue:916
+#: src/components/fairway/Fairwayprofile.vue:919
 #: src/components/gauge/Gauges.vue:213 src/components/gauge/Gauges.vue:244
 #: src/components/gauge/HydrologicalConditions.vue:329
-#: src/components/gauge/HydrologicalConditions.vue:1151
+#: src/components/gauge/HydrologicalConditions.vue:1156
 #: src/components/gauge/Waterlevel.vue:320
-#: src/components/gauge/Waterlevel.vue:1304
+#: src/components/gauge/Waterlevel.vue:1312
+#: src/components/identify/Identify.vue:465
 #: src/components/importconfiguration/Import.vue:138
 #: src/components/importconfiguration/Import.vue:159
 #: src/components/importconfiguration/Import.vue:182
 #: src/components/importconfiguration/Import.vue:216
 #: src/components/importconfiguration/Import.vue:301
-#: src/components/importconfiguration/ScheduledImports.vue:862
-#: src/components/importconfiguration/ScheduledImports.vue:874
-#: src/components/importconfiguration/ScheduledImports.vue:954
-#: src/components/importconfiguration/ScheduledImports.vue:1042
-#: src/components/importconfiguration/ScheduledImports.vue:1054
-#: src/components/importconfiguration/ScheduledImports.vue:1080
-#: src/components/importconfiguration/ScheduledImports.vue:1092
+#: src/components/importconfiguration/ScheduledImports.vue:875
+#: src/components/importconfiguration/ScheduledImports.vue:887
+#: src/components/importconfiguration/ScheduledImports.vue:974
+#: src/components/importconfiguration/ScheduledImports.vue:1069
+#: src/components/importconfiguration/ScheduledImports.vue:1081
+#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1119
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:151
-#: src/components/importconfiguration/types/Soundingresults.vue:281
-#: src/components/importconfiguration/types/Soundingresults.vue:325
-#: src/components/importconfiguration/types/Soundingresults.vue:368
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:197
+#: src/components/importconfiguration/types/DQLReport.vue:65
+#: src/components/importconfiguration/types/Soundingresults.vue:282
+#: src/components/importconfiguration/types/Soundingresults.vue:337
+#: src/components/importconfiguration/types/Soundingresults.vue:376
+#: src/components/importconfiguration/types/Statsupdate.vue:79
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:189
 #: src/components/importoverview/BottleneckDetail.vue:154
-#: src/components/importoverview/ImportOverview.vue:287
-#: src/components/importoverview/ImportOverview.vue:316
-#: src/components/importoverview/ImportOverview.vue:434
-#: src/components/importoverview/ImportOverview.vue:450
-#: src/components/importoverview/ImportOverview.vue:523
-#: src/components/importoverview/ImportOverview.vue:548
+#: src/components/importoverview/ImportOverview.vue:286
+#: src/components/importoverview/ImportOverview.vue:315
+#: src/components/importoverview/ImportOverview.vue:433
+#: src/components/importoverview/ImportOverview.vue:449
+#: src/components/importoverview/ImportOverview.vue:522
+#: src/components/importoverview/ImportOverview.vue:547
 #: src/components/importoverview/LogEntry.vue:171
 #: src/components/importoverview/SectionDetails.vue:112
 #: src/components/importoverview/StretchDetails.vue:143
-#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:275
-#: src/components/map/Map.vue:468 src/components/sections/SectionForm.vue:343
+#: src/components/layers/Layerselect.vue:184 src/components/map/Map.vue:281
+#: src/components/map/Map.vue:492 src/components/sections/SectionForm.vue:343
 #: src/components/sections/Sections.vue:183
 #: src/components/sections/Sections.vue:197
 #: src/components/sections/Sections.vue:243
@@ -269,25 +277,26 @@
 #: src/components/systemconfiguration/PDFTemplates.vue:172
 #: src/components/systemconfiguration/PDFTemplates.vue:261
 #: src/components/systemconfiguration/PDFTemplates.vue:301
-#: src/components/usermanagement/Userdetail.vue:334
-#: src/components/usermanagement/Userdetail.vue:347
-#: src/components/usermanagement/Usermanagement.vue:220
-#: src/components/usermanagement/Usermanagement.vue:261
-#: src/components/usermanagement/Usermanagement.vue:273
-#: src/components/usermanagement/Usermanagement.vue:318 src/lib/session.js:32
+#: src/components/usermanagement/Userdetail.vue:378
+#: src/components/usermanagement/Userdetail.vue:391
+#: src/components/usermanagement/Usermanagement.vue:312
+#: src/components/usermanagement/Usermanagement.vue:338
+#: src/components/usermanagement/Usermanagement.vue:390
+#: src/components/usermanagement/Usermanagement.vue:402
+#: src/components/usermanagement/Usermanagement.vue:447 src/lib/session.js:32
 msgid "Backend Error"
 msgstr ""
 
-#: src/components/identify/Identify.vue:556
+#: src/components/identify/Identify.vue:625
 msgid "Beacon, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:560
-#: src/components/importconfiguration/types/Fairwaymarks.vue:132
+#: src/components/identify/Identify.vue:629
+#: src/components/importconfiguration/types/Fairwaymarks.vue:125
 msgid "Beacon, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:559
+#: src/components/identify/Identify.vue:628
 msgid "Beacon, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -296,8 +305,8 @@
 msgid "BeamType"
 msgstr "Typ"
 
-#: src/components/Pdftool.vue:806 src/components/identify/formatter.js:27
-#: src/components/identify/formatter.js:123
+#: src/components/Pdftool.vue:828 src/components/identify/formatter.js:30
+#: src/components/identify/formatter.js:126
 #: src/components/importconfiguration/types/Soundingresults.vue:13
 msgid "Bottleneck"
 msgstr "Brody a úžiny"
@@ -306,67 +315,71 @@
 msgid "Bottleneck Morphology Classbreaks"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:390
+#: src/components/fairway/BottleneckDialogue.vue:402
 #: src/components/toolbar/Profiles.vue:50
 #, fuzzy
 msgid "Bottleneck Surveys"
 msgstr "Brody a úžiny"
 
+#: src/components/Pdftool.vue:864
+msgid "Bottleneck with ZPG Exception"
+msgstr ""
+
 #: src/components/importoverview/SoundingResultDetail.vue:7
 #, fuzzy
 msgid "Bottleneck:"
 msgstr "Brody a úžiny"
 
-#: src/components/Bottlenecks.vue:107 src/components/Sidebar.vue:19
+#: src/components/Bottlenecks.vue:109 src/components/Sidebar.vue:19
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:24
 #: src/components/importconfiguration/ImportDetails.vue:43
 msgid "Bottlenecks"
 msgstr ""
 
-#: src/components/identify/Identify.vue:561
-#: src/components/importconfiguration/types/Fairwaymarks.vue:133
+#: src/components/identify/Identify.vue:630
+#: src/components/importconfiguration/types/Fairwaymarks.vue:126
 msgid "Buoy, cardinal (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:562
+#: src/components/identify/Identify.vue:631
 msgid "Buoy, isolated danger (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:564
-#: src/components/importconfiguration/types/Fairwaymarks.vue:136
+#: src/components/identify/Identify.vue:633
+#: src/components/importconfiguration/types/Fairwaymarks.vue:129
 msgid "Buoy, lateral (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:563
-#: src/components/importconfiguration/types/Fairwaymarks.vue:135
+#: src/components/identify/Identify.vue:632
+#: src/components/importconfiguration/types/Fairwaymarks.vue:128
 msgid "Buoy, lateral (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:565
-#: src/components/importconfiguration/types/Fairwaymarks.vue:137
+#: src/components/identify/Identify.vue:634
+#: src/components/importconfiguration/types/Fairwaymarks.vue:130
 msgid "Buoy, safe water (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:566
-#: src/components/importconfiguration/types/Fairwaymarks.vue:138
+#: src/components/identify/Identify.vue:635
+#: src/components/importconfiguration/types/Fairwaymarks.vue:131
 msgid "Buoy, special purpose/general (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:123
+#: src/components/fairway/BottleneckDialogue.vue:124
 msgid "Calculating differences"
 msgstr ""
 
-#: src/components/Pdftool.vue:83 src/components/Popup.vue:45
-#: src/components/fairway/BottleneckDialogue.vue:795
+#: src/components/Pdftool.vue:84 src/components/Popup.vue:45
+#: src/components/fairway/BottleneckDialogue.vue:807
 #: src/components/importconfiguration/Import.vue:223
-#: src/components/importoverview/ImportOverview.vue:294
-#: src/components/importoverview/ImportOverview.vue:533
+#: src/components/importoverview/ImportOverview.vue:293
+#: src/components/importoverview/ImportOverview.vue:532
 #: src/components/systemconfiguration/PDFTemplates.vue:345
-#: src/components/usermanagement/Usermanagement.vue:280
+#: src/components/usermanagement/Usermanagement.vue:409
 msgid "Cancel"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:119
+#: src/components/Bottlenecks.vue:121
 msgid "Chainage"
 msgstr ""
 
@@ -386,11 +399,11 @@
 msgid "Choose color"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:512
+#: src/components/importconfiguration/ScheduledImports.vue:529
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:97
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:110
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:159
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:138
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
 msgid "choose file to upload"
 msgstr ""
 
@@ -416,11 +429,11 @@
 msgid "Compare with"
 msgstr ""
 
-#: src/components/identify/Identify.vue:461
+#: src/components/identify/Identify.vue:530
 msgid "Confidence per 24h"
 msgstr ""
 
-#: src/components/identify/Identify.vue:458
+#: src/components/identify/Identify.vue:527
 msgid "Confidence per 72h"
 msgstr ""
 
@@ -430,24 +443,24 @@
 
 #: src/components/Popup.vue:59
 #: src/components/importconfiguration/types/Soundingresults.vue:188
-#: src/components/importconfiguration/types/Soundingresults.vue:444
+#: src/components/importconfiguration/types/Soundingresults.vue:452
 msgid "Confirm"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:663
+#: src/components/fairway/BottleneckDialogue.vue:675
 msgid "Coordinates copied to clipboard!"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:110
+#: src/components/Bottlenecks.vue:112
 #: src/components/importconfiguration/Import.vue:239
 #: src/components/importoverview/ImportOverview.vue:185
 #: src/components/systemconfiguration/PDFTemplates.vue:123
 #: src/components/usermanagement/Userdetail.vue:28
-#: src/components/usermanagement/Usermanagement.vue:172
+#: src/components/usermanagement/Usermanagement.vue:222
 msgid "Country"
 msgstr "Štát"
 
-#: src/components/importconfiguration/ScheduledImports.vue:375
+#: src/components/importconfiguration/ScheduledImports.vue:386
 msgid "Cronstring"
 msgstr ""
 
@@ -455,7 +468,7 @@
 msgid "Current Waterlevel"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:158
+#: src/components/fairway/BottleneckDialogue.vue:159
 msgid "Custom Depth"
 msgstr ""
 
@@ -463,15 +476,19 @@
 msgid "Data Availability/Accuracy"
 msgstr ""
 
-#: src/components/identify/Identify.vue:497
+#: src/components/importconfiguration/ImportDetails.vue:57
+msgid "Data Quality Report"
+msgstr ""
+
+#: src/components/identify/Identify.vue:566
 msgid "Data too old. Treshold:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:492
+#: src/components/identify/Identify.vue:561
 msgid "Data within revisiting treshold"
 msgstr ""
 
-#: src/components/identify/Identify.vue:487
+#: src/components/identify/Identify.vue:556
 msgid "Data within the revisiting time"
 msgstr ""
 
@@ -486,7 +503,7 @@
 msgid "Date info"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1117
+#: src/components/importconfiguration/ScheduledImports.vue:1144
 msgid "day"
 msgstr ""
 
@@ -495,13 +512,13 @@
 msgid "Day"
 msgstr "Mapa"
 
-#: src/components/identify/Identify.vue:570
-#: src/components/importconfiguration/types/Fairwaymarks.vue:142
+#: src/components/identify/Identify.vue:639
+#: src/components/importconfiguration/types/Fairwaymarks.vue:135
 msgid "Daymark (IENC feature)"
 msgstr ""
 
-#: src/components/identify/Identify.vue:569
-#: src/components/importconfiguration/types/Fairwaymarks.vue:141
+#: src/components/identify/Identify.vue:638
+#: src/components/importconfiguration/types/Fairwaymarks.vue:134
 msgid "Daymark (MARITIME/Hydro feature)"
 msgstr ""
 
@@ -509,8 +526,8 @@
 msgid "Dec"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
-#: src/components/importconfiguration/ScheduledImports.vue:1143
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:926
+#: src/components/importconfiguration/ScheduledImports.vue:1170
 #: src/lib/datelocalization.js:37
 msgid "December"
 msgstr ""
@@ -535,14 +552,14 @@
 msgid "Define Stretches"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:780
+#: src/components/fairway/BottleneckDialogue.vue:792
 #: src/components/importconfiguration/Import.vue:197
 #: src/components/systemconfiguration/PDFTemplates.vue:317
-#: src/components/usermanagement/Usermanagement.vue:246
+#: src/components/usermanagement/Usermanagement.vue:364
 msgid "Delete"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:773
+#: src/components/fairway/BottleneckDialogue.vue:785
 msgid "Delete cross profile"
 msgstr ""
 
@@ -554,11 +571,11 @@
 msgid "Delete Template"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:163
+#: src/components/usermanagement/Usermanagement.vue:213
 msgid "Delete user"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:238
+#: src/components/usermanagement/Usermanagement.vue:356
 msgid "Delete User"
 msgstr ""
 
@@ -574,13 +591,13 @@
 msgid "deleted successfully"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:754
+#: src/components/fairway/BottleneckDialogue.vue:766
 #: src/components/sections/Sections.vue:214
 #: src/components/stretches/Stretches.vue:229
 msgid "Deleting "
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:86
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:79
 msgid "Depth"
 msgstr ""
 
@@ -592,7 +609,7 @@
 msgid "Depth Reference"
 msgstr ""
 
-#: src/components/Pdftool.vue:812
+#: src/components/Pdftool.vue:835
 msgid "Depth relativ to"
 msgstr ""
 
@@ -608,11 +625,11 @@
 msgid "Depthreference"
 msgstr ""
 
-#: src/components/identify/formatter.js:68
+#: src/components/identify/formatter.js:71
 msgid "Distance Mark"
 msgstr ""
 
-#: src/components/identify/formatter.js:71
+#: src/components/identify/formatter.js:74
 msgid "Distance Mark ashore"
 msgstr ""
 
@@ -624,7 +641,7 @@
 msgid "Distance marks virtual"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:776
+#: src/components/fairway/BottleneckDialogue.vue:788
 msgid "Do you really want to delete the cross profile:"
 msgstr ""
 
@@ -632,7 +649,7 @@
 msgid "Do you really want to delete the following template:"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:240
+#: src/components/usermanagement/Usermanagement.vue:358
 msgid "Do you really want to delete the following user account:"
 msgstr ""
 
@@ -658,12 +675,21 @@
 msgid "Download Meta.json"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:6
+#: src/components/usermanagement/Usermanagement.vue:204
+msgid "DQL Report"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:32
 msgid "Earlier"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:273
+msgid "Edit user"
+msgstr ""
+
 #: src/components/importconfiguration/Import.vue:283
-#: src/components/usermanagement/Usermanagement.vue:175
+#: src/components/usermanagement/Usermanagement.vue:225
 msgid "Email"
 msgstr "E-mail"
 
@@ -698,11 +724,11 @@
 msgid "Enqueued"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:211
+#: src/components/fairway/BottleneckDialogue.vue:212
 msgid "Enter coordinates manually"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:275
+#: src/components/fairway/BottleneckDialogue.vue:276
 msgid "Enter label for cross profile"
 msgstr ""
 
@@ -722,11 +748,11 @@
 msgid "Errorlog"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1108
+#: src/components/importconfiguration/ScheduledImports.vue:1135
 msgid "Every"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:676
+#: src/components/importconfiguration/ScheduledImports.vue:681
 msgid "Examples:"
 msgstr ""
 
@@ -779,15 +805,15 @@
 msgid "Fairway (LOS 3)"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:168
+#: src/components/map/MapPopup.vue:169
 msgid "Fairway Availability"
 msgstr ""
 
-#: src/components/identify/formatter.js:33
+#: src/components/identify/formatter.js:36
 msgid "Fairway Critical"
 msgstr ""
 
-#: src/components/identify/formatter.js:32
+#: src/components/identify/formatter.js:35
 msgid "Fairway Date"
 msgstr ""
 
@@ -795,17 +821,17 @@
 msgid "Fairway dimension"
 msgstr ""
 
-#: src/components/identify/formatter.js:56
+#: src/components/identify/formatter.js:59
 msgid "Fairway Dimensions"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:223
-#: src/components/fairway/AvailableFairwayDepth.vue:231
+#: src/components/fairway/AvailableFairwayDepth.vue:226
+#: src/components/fairway/AvailableFairwayDepth.vue:234
 msgid "FairwayAvailability"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:218
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:381
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:221
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:387
 msgid "FairwayAvailabilityVsLNWL"
 msgstr ""
 
@@ -831,21 +857,21 @@
 msgid "Feb"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:910
-#: src/components/importconfiguration/ScheduledImports.vue:1133
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:916
+#: src/components/importconfiguration/ScheduledImports.vue:1160
 #: src/lib/datelocalization.js:27
 msgid "February"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1106
+#: src/components/importconfiguration/ScheduledImports.vue:1133
 msgid "File"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:851
+#: src/components/importconfiguration/ScheduledImports.vue:864
 msgid "File Import"
 msgstr ""
 
-#: src/components/importoverview/ImportOverview.vue:474
+#: src/components/importoverview/ImportOverview.vue:473
 msgid "Finish Review"
 msgstr ""
 
@@ -862,7 +888,7 @@
 msgid "Fri"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1127
+#: src/components/importconfiguration/ScheduledImports.vue:1154
 #: src/lib/datelocalization.js:13
 msgid "Friday"
 msgstr ""
@@ -877,11 +903,11 @@
 msgid "From"
 msgstr ""
 
-#: src/components/identify/formatter.js:40
+#: src/components/identify/formatter.js:43
 msgid "G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:102
+#: src/components/identify/formatter.js:105
 msgid "Gauge"
 msgstr ""
 
@@ -897,11 +923,11 @@
 msgid "Gauge measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:38
+#: src/components/identify/formatter.js:41
 msgid "Gauge Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:37
+#: src/components/identify/formatter.js:40
 msgid "Gauge Waterlevel Date"
 msgstr ""
 
@@ -909,24 +935,24 @@
 msgid "Gauges"
 msgstr ""
 
-#: src/components/Pdftool.vue:73 src/components/Pdftool.vue:210
+#: src/components/Pdftool.vue:74 src/components/Pdftool.vue:211
 #: src/components/toolbar/Pdftool.vue:32
 msgid "Generate PDF"
 msgstr ""
 
-#: src/components/Pdftool.vue:166
+#: src/components/Pdftool.vue:167
 msgid "Generated by"
 msgstr ""
 
-#: src/components/identify/Identify.vue:217
+#: src/components/identify/Identify.vue:241
 msgid "Generated PDFs use font:"
 msgstr ""
 
-#: src/components/identify/Identify.vue:453
+#: src/components/identify/Identify.vue:522
 msgid "Highest confidence"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1116
+#: src/components/importconfiguration/ScheduledImports.vue:1143
 msgid "hour"
 msgstr ""
 
@@ -956,21 +982,21 @@
 msgid "ID"
 msgstr ""
 
-#: src/components/identify/Identify.vue:300 src/components/map/MapPopup.vue:148
+#: src/components/identify/Identify.vue:334 src/components/map/MapPopup.vue:149
 #: src/components/toolbar/Identify.vue:49
 msgid "Identified Features"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "If there is no error during import, there will be no retry"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:943
-#: src/components/importconfiguration/ScheduledImports.vue:1029
-#: src/components/importconfiguration/ScheduledImports.vue:1067
+#: src/components/importconfiguration/ScheduledImports.vue:963
+#: src/components/importconfiguration/ScheduledImports.vue:1056
+#: src/components/importconfiguration/ScheduledImports.vue:1094
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:137
-#: src/components/importconfiguration/types/Soundingresults.vue:354
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:187
+#: src/components/importconfiguration/types/Soundingresults.vue:362
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:179
 #: src/components/sections/SectionForm.vue:328
 #: src/components/stretches/StretchForm.vue:83
 msgid "Import"
@@ -980,7 +1006,7 @@
 msgid "Import approved gaugemeasurements"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:852
+#: src/components/importconfiguration/ScheduledImports.vue:865
 msgid "Import import: #"
 msgstr ""
 
@@ -993,7 +1019,7 @@
 msgid "Import Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:389
+#: src/components/importconfiguration/types/Soundingresults.vue:397
 msgid "Import Soundingresults"
 msgstr ""
 
@@ -1005,7 +1031,7 @@
 msgid "Import via"
 msgstr ""
 
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:152
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:145
 msgid "Import Waterway Profiles"
 msgstr ""
 
@@ -1024,11 +1050,11 @@
 msgid "Invalid element"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:307
+#: src/components/usermanagement/Userdetail.vue:351
 msgid "invalid email"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:705
+#: src/components/fairway/BottleneckDialogue.vue:717
 msgid "Invalid input"
 msgstr ""
 
@@ -1036,8 +1062,8 @@
 msgid "Jan"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:909
-#: src/components/importconfiguration/ScheduledImports.vue:1132
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
+#: src/components/importconfiguration/ScheduledImports.vue:1159
 #: src/lib/datelocalization.js:26
 msgid "January"
 msgstr ""
@@ -1046,8 +1072,8 @@
 msgid "Jul"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:915
-#: src/components/importconfiguration/ScheduledImports.vue:1138
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:921
+#: src/components/importconfiguration/ScheduledImports.vue:1165
 #: src/lib/datelocalization.js:32
 msgid "July"
 msgstr ""
@@ -1056,8 +1082,8 @@
 msgid "Jun"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:914
-#: src/components/importconfiguration/ScheduledImports.vue:1137
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:920
+#: src/components/importconfiguration/ScheduledImports.vue:1164
 #: src/lib/datelocalization.js:31
 msgid "June"
 msgstr ""
@@ -1078,21 +1104,21 @@
 msgid "Later"
 msgstr ""
 
-#: src/components/identify/Identify.vue:489
-#: src/components/identify/Identify.vue:494
-#: src/components/identify/Identify.vue:499
+#: src/components/identify/Identify.vue:558
+#: src/components/identify/Identify.vue:563
+#: src/components/identify/Identify.vue:568
 msgid "Latest measurement"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:116
+#: src/components/Bottlenecks.vue:118
 msgid "Latest Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:106
+#: src/components/identify/formatter.js:109
 msgid "Latest Waterlevel"
 msgstr ""
 
-#: src/components/identify/formatter.js:105
+#: src/components/identify/formatter.js:108
 msgid "Latest Waterlevel Date"
 msgstr ""
 
@@ -1105,11 +1131,15 @@
 msgid "Length"
 msgstr ""
 
-#: src/components/identify/Identify.vue:571
-#: src/components/importconfiguration/types/Fairwaymarks.vue:143
+#: src/components/identify/Identify.vue:640
+#: src/components/importconfiguration/types/Fairwaymarks.vue:136
 msgid "Light (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/map/Map.vue:299
+msgid "Loading Error"
+msgstr ""
+
 #: src/components/Login.vue:58
 msgid "Login"
 msgstr ""
@@ -1133,12 +1163,12 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:130
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:67
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:60
 msgid "LOS"
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:172
-#: src/components/importconfiguration/ScheduledImports.vue:944
+#: src/components/importconfiguration/ScheduledImports.vue:964
 msgid "Manually triggered import: #"
 msgstr ""
 
@@ -1158,22 +1188,26 @@
 msgid "Mar"
 msgstr "Mapa"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:911
-#: src/components/importconfiguration/ScheduledImports.vue:1134
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
+#: src/components/importconfiguration/ScheduledImports.vue:1161
 #: src/lib/datelocalization.js:28
 msgid "March"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:684
+#: src/components/importconfiguration/ScheduledImports.vue:697
+msgid "Maximum of 200"
+msgstr ""
+
+#: src/components/importconfiguration/ScheduledImports.vue:690
 msgid "Maximum retry count"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:131
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:124
 msgid "MaxWidth"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:913
-#: src/components/importconfiguration/ScheduledImports.vue:1136
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
+#: src/components/importconfiguration/ScheduledImports.vue:1163
 #: src/lib/datelocalization.js:30 src/lib/datelocalization.js:44
 #, fuzzy
 msgid "May"
@@ -1191,16 +1225,16 @@
 msgid "Measurement"
 msgstr ""
 
-#: src/components/identify/formatter.js:108
+#: src/components/identify/formatter.js:111
 msgid "Measurement Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/Identify.vue:424
+#: src/components/identify/Identify.vue:493
 msgid "Measurement is within"
 msgstr ""
 
-#: src/components/identify/Identify.vue:425
-#: src/components/identify/Identify.vue:431
+#: src/components/identify/Identify.vue:494
+#: src/components/identify/Identify.vue:500
 msgid "measurements"
 msgstr ""
 
@@ -1214,21 +1248,21 @@
 msgid "Median"
 msgstr ""
 
-#: src/components/identify/formatter.js:85
-#: src/components/identify/formatter.js:96
+#: src/components/identify/formatter.js:88
+#: src/components/identify/formatter.js:99
 msgid "Min. G.W. Count in Last 14 Days"
 msgstr ""
 
-#: src/components/identify/formatter.js:83
-#: src/components/identify/formatter.js:94
+#: src/components/identify/formatter.js:86
+#: src/components/identify/formatter.js:97
 msgid "Min. Gauge Waterlevel Date"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1109
+#: src/components/importconfiguration/ScheduledImports.vue:1136
 msgid "minutes past"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:110
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:103
 msgid "MinWidth"
 msgstr ""
 
@@ -1236,24 +1270,24 @@
 msgid "Mon"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1123
+#: src/components/importconfiguration/ScheduledImports.vue:1150
 #: src/lib/datelocalization.js:9
 msgid "Monday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1119
+#: src/components/importconfiguration/ScheduledImports.vue:1146
 msgid "month"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:866
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:872
 msgid "monthly"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:239
+#: src/components/importconfiguration/ScheduledImports.vue:250
 msgid "Monthly"
 msgstr ""
 
-#: src/components/Bottlenecks.vue:113 src/components/identify/formatter.js:7
+#: src/components/Bottlenecks.vue:115 src/components/identify/formatter.js:7
 #: src/components/identify/formatter.js:8
 #: src/components/sections/Sections.vue:130
 #: src/components/stretches/Stretches.vue:131
@@ -1261,17 +1295,17 @@
 msgid "Name"
 msgstr "Názov"
 
-#: src/components/identify/Identify.vue:323
-#: src/components/identify/Identify.vue:327
-#: src/components/identify/Identify.vue:330
-#: src/components/identify/Identify.vue:354
-#: src/components/identify/Identify.vue:358
-#: src/components/identify/Identify.vue:361
+#: src/components/identify/Identify.vue:360
+#: src/components/identify/Identify.vue:364
+#: src/components/identify/Identify.vue:367
+#: src/components/identify/Identify.vue:391
+#: src/components/identify/Identify.vue:395
+#: src/components/identify/Identify.vue:398
 msgid "Nash-Sutcliffe"
 msgstr ""
 
-#: src/components/identify/Identify.vue:332
-#: src/components/identify/Identify.vue:363
+#: src/components/identify/Identify.vue:369
+#: src/components/identify/Identify.vue:400
 msgid "Nash-Sutcliffe not available"
 msgstr ""
 
@@ -1289,10 +1323,6 @@
 msgid "Negate Z values in XYZ files"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:687
-msgid "Negative values mean endless retry"
-msgstr ""
-
 #: src/components/importoverview/AGMLogItem.vue:14
 #: src/components/importoverview/AGMLogItem.vue:29
 msgid "New"
@@ -1310,7 +1340,7 @@
 msgid "New stretch"
 msgstr ""
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 msgid "no"
 msgstr ""
 
@@ -1320,11 +1350,16 @@
 msgid "No data available."
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:15
+#: src/components/importconfiguration/types/Statsupdate.vue:15
+msgid "No data selectable"
+msgstr ""
+
 #: src/components/identify/Identify.vue:179
 msgid "No features identified."
 msgstr ""
 
-#: src/components/identify/Identify.vue:418
+#: src/components/identify/Identify.vue:487
 msgid "No measurement available"
 msgstr ""
 
@@ -1332,7 +1367,7 @@
 msgid "No results."
 msgstr ""
 
-#: src/components/identify/Identify.vue:475
+#: src/components/identify/Identify.vue:544
 msgid "No revisiting time defined"
 msgstr ""
 
@@ -1340,7 +1375,7 @@
 msgid "No style-changes"
 msgstr ""
 
-#: src/components/identify/Identify.vue:477
+#: src/components/identify/Identify.vue:546
 msgid "No survey-data available"
 msgstr ""
 
@@ -1356,8 +1391,8 @@
 msgid "No valid waterlevel data available."
 msgstr ""
 
-#: src/components/identify/Identify.vue:576
-#: src/components/importconfiguration/types/Fairwaymarks.vue:146
+#: src/components/identify/Identify.vue:645
+#: src/components/importconfiguration/types/Fairwaymarks.vue:139
 msgid "Notice mark (IENC feature)"
 msgstr ""
 
@@ -1365,14 +1400,14 @@
 msgid "Nov"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:919
-#: src/components/importconfiguration/ScheduledImports.vue:1142
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:925
+#: src/components/importconfiguration/ScheduledImports.vue:1169
 #: src/lib/datelocalization.js:36
 msgid "November"
 msgstr ""
 
-#: src/components/gauge/HydrologicalConditions.vue:736
-#: src/components/gauge/Waterlevel.vue:846
+#: src/components/gauge/HydrologicalConditions.vue:732
+#: src/components/gauge/Waterlevel.vue:842
 msgid "Now"
 msgstr ""
 
@@ -1381,7 +1416,7 @@
 msgid "Numbers"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1113
+#: src/components/importconfiguration/ScheduledImports.vue:1140
 msgid "o' clock"
 msgstr ""
 
@@ -1393,13 +1428,13 @@
 msgid "Oct"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:918
-#: src/components/importconfiguration/ScheduledImports.vue:1141
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:924
+#: src/components/importconfiguration/ScheduledImports.vue:1168
 #: src/lib/datelocalization.js:35
 msgid "October"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1111
+#: src/components/importconfiguration/ScheduledImports.vue:1138
 msgid "of"
 msgstr ""
 
@@ -1411,11 +1446,11 @@
 msgid "Old"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1110
+#: src/components/importconfiguration/ScheduledImports.vue:1137
 msgid "on"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:133
+#: src/components/importconfiguration/ImportDetails.vue:145
 msgid "Onetime Imports"
 msgstr ""
 
@@ -1428,17 +1463,17 @@
 msgid "Owner"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:212
+#: src/components/usermanagement/Userdetail.vue:232
 msgid "password"
 msgstr ""
 
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:45
 #: src/components/importconfiguration/types/Waterwaygauges.vue:45
-#: src/components/usermanagement/Userdetail.vue:210
+#: src/components/usermanagement/Userdetail.vue:230
 msgid "Password"
 msgstr "Heslo"
 
-#: src/components/usermanagement/Userdetail.vue:213
+#: src/components/usermanagement/Userdetail.vue:233
 msgid "password again"
 msgstr ""
 
@@ -1446,13 +1481,14 @@
 msgid "Password reset requested!"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:300
+#: src/components/usermanagement/Userdetail.vue:336
+#: src/components/usermanagement/Userdetail.vue:343
 msgid ""
 "Password should at least be 8 char long including 1 digit and 1 special char "
 "like $"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:296
+#: src/components/usermanagement/Userdetail.vue:331
 msgid "Passwords do not match!"
 msgstr ""
 
@@ -1464,15 +1500,15 @@
 msgid "pending"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:768
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:774
 msgid "Percent"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:285
+#: src/components/usermanagement/Userdetail.vue:320
 msgid "Please choose a country"
 msgstr "Vyberte krajinu"
 
-#: src/components/usermanagement/Userdetail.vue:290
+#: src/components/usermanagement/Userdetail.vue:325
 msgid "Please choose a role"
 msgstr ""
 
@@ -1481,7 +1517,7 @@
 msgid "Please enter a date"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:100
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:93
 msgid "Please enter a depth"
 msgstr ""
 
@@ -1494,15 +1530,15 @@
 msgid "Please enter a Featuretype"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:78
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:71
 msgid "Please enter a level of service"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:144
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:137
 msgid "Please enter a maximum width"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:123
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:116
 msgid "Please enter a minimum width"
 msgstr ""
 
@@ -1524,7 +1560,7 @@
 msgid "Please enter a source organization"
 msgstr "Vyberte krajinu"
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:168
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:161
 msgid "Please enter a source orgranization"
 msgstr ""
 
@@ -1572,28 +1608,27 @@
 msgid "Please enter an originator"
 msgstr "Vyberte krajinu"
 
-#: src/components/fairway/BottleneckDialogue.vue:706
+#: src/components/fairway/BottleneckDialogue.vue:718
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 
-#: src/components/importconfiguration/types/Distancemarksashore.vue:57
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:57
-#: src/components/importconfiguration/types/Fairwaymarks.vue:76
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:79
-#: src/components/importconfiguration/types/Waterwayarea.vue:57
-#: src/components/importconfiguration/types/Waterwayaxis.vue:57
-msgid "Please enter SortBy"
-msgstr ""
-
 #: src/components/importconfiguration/types/Soundingresults.vue:33
 msgid "Please select a bottleneck"
 msgstr ""
 
+#: src/components/importconfiguration/types/DQLReport.vue:29
+msgid "Please select a report to update"
+msgstr ""
+
 #: src/components/usermanagement/Userdetail.vue:35
 #: src/components/usermanagement/Userdetail.vue:76
 msgid "Please select one"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:29
+msgid "Please select stats to update"
+msgstr ""
+
 #: src/lib/datelocalization.js:6
 msgid "PM"
 msgstr ""
@@ -1602,7 +1637,7 @@
 msgid "portrait"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:690
+#: src/components/importconfiguration/ScheduledImports.vue:694
 msgid "Positive values are the upper limit for retries"
 msgstr ""
 
@@ -1615,7 +1650,7 @@
 msgid "Prediction"
 msgstr ""
 
-#: src/components/identify/Identify.vue:463
+#: src/components/identify/Identify.vue:532
 msgid "Predictions not available"
 msgstr ""
 
@@ -1627,11 +1662,11 @@
 msgid "Press ESC to stop drawing."
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:791
+#: src/components/fairway/BottleneckDialogue.vue:803
 msgid "Profile deleted!"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:733
+#: src/components/fairway/BottleneckDialogue.vue:745
 msgid "Profile saved!"
 msgstr ""
 
@@ -1651,21 +1686,29 @@
 msgid "Q75%"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:867
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:873
 msgid "quarterly"
 msgstr ""
 
-#: src/components/identify/Identify.vue:572
-#: src/components/importconfiguration/types/Fairwaymarks.vue:144
+#: src/components/identify/Identify.vue:641
+#: src/components/importconfiguration/types/Fairwaymarks.vue:137
 msgid "Radar transponder beacon (MARITIME/Hydro feature)"
 msgstr ""
 
+#: src/components/usermanagement/Usermanagement.vue:274
+msgid "Reactivate user"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:6
 #, fuzzy
 msgid "Recency of Bottleneck Surveys"
 msgstr "Brody a úžiny"
 
-#: src/components/Pdftool.vue:810
+#: src/components/usermanagement/Userdetail.vue:113
+msgid "Recipient for DQL Report"
+msgstr ""
+
+#: src/components/Pdftool.vue:833
 msgid "Ref gauge"
 msgstr ""
 
@@ -1677,14 +1720,18 @@
 msgid "Refresh"
 msgstr ""
 
-#: src/components/importconfiguration/ImportDetails.vue:136
+#: src/components/importconfiguration/ImportDetails.vue:148
 msgid "Regular Imports"
 msgstr ""
 
-#: src/components/usermanagement/Userdetail.vue:211
+#: src/components/usermanagement/Userdetail.vue:231
 msgid "Repeat Password"
 msgstr ""
 
+#: src/components/importconfiguration/ImportDetails.vue:142
+msgid "Reports"
+msgstr ""
+
 #: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr ""
@@ -1701,15 +1748,15 @@
 msgid "Reset to defaults"
 msgstr ""
 
-#: src/components/identify/formatter.js:31
+#: src/components/identify/formatter.js:34
 msgid "Responsible Country"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:201
+#: src/components/importconfiguration/ScheduledImports.vue:212
 msgid "Retry on failure"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:696
+#: src/components/importconfiguration/ScheduledImports.vue:701
 msgid "retryDescription"
 msgstr ""
 
@@ -1727,11 +1774,11 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:69
-#: src/components/usermanagement/Usermanagement.vue:166
+#: src/components/usermanagement/Usermanagement.vue:216
 msgid "Role"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:492
+#: src/components/fairway/BottleneckDialogue.vue:504
 msgid "Rotate Maps"
 msgstr ""
 
@@ -1743,25 +1790,24 @@
 msgid "Sat"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1128
+#: src/components/importconfiguration/ScheduledImports.vue:1155
 #: src/lib/datelocalization.js:14
 msgid "Saturday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:461
-#: src/components/usermanagement/Userdetail.vue:118
+#: src/components/importconfiguration/ScheduledImports.vue:476
 msgid "Save"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:184
+#: src/components/fairway/BottleneckDialogue.vue:185
 msgid "Saved cross profiles"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1030
+#: src/components/importconfiguration/ScheduledImports.vue:1057
 msgid "Saved import: #"
 msgstr ""
 
-#: src/components/Pdftool.vue:560
+#: src/components/Pdftool.vue:574
 msgid "Scale"
 msgstr ""
 
@@ -1770,15 +1816,15 @@
 msgstr ""
 
 #: src/components/importconfiguration/Import.vue:280
-#: src/components/importconfiguration/ScheduledImports.vue:229
+#: src/components/importconfiguration/ScheduledImports.vue:240
 msgid "Schedule"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:153
+#: src/components/importconfiguration/ScheduledImports.vue:164
 msgid "Scheduled"
 msgstr ""
 
-#: src/components/identify/formatter.js:91
+#: src/components/identify/formatter.js:94
 msgid "Section"
 msgstr ""
 
@@ -1802,7 +1848,7 @@
 msgstr ""
 
 #: src/components/fairway/AvailableFairwayDepthDialogue.vue:562
-#: src/components/importconfiguration/types/Soundingresults.vue:411
+#: src/components/importconfiguration/types/Soundingresults.vue:419
 #, fuzzy
 msgid "Select bottleneck"
 msgstr "Brody a úžiny"
@@ -1836,7 +1882,7 @@
 msgid "Send all"
 msgstr "Poslať"
 
-#: src/components/usermanagement/Usermanagement.vue:160
+#: src/components/usermanagement/Usermanagement.vue:210
 msgid "Send testmail"
 msgstr ""
 
@@ -1844,13 +1890,13 @@
 msgid "Sep"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:917
-#: src/components/importconfiguration/ScheduledImports.vue:1140
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:923
+#: src/components/importconfiguration/ScheduledImports.vue:1167
 #: src/lib/datelocalization.js:34
 msgid "September"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:133
+#: src/components/fairway/BottleneckDialogue.vue:134
 msgid "Show differences"
 msgstr ""
 
@@ -1858,7 +1904,7 @@
 msgid "Show Hydrological Conditions"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:130
+#: src/components/fairway/BottleneckDialogue.vue:131
 msgid "Show survey"
 msgstr ""
 
@@ -1870,11 +1916,11 @@
 msgid "Signer"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:175
+#: src/components/importconfiguration/ScheduledImports.vue:186
 msgid "Simple"
 msgstr ""
 
-#: src/components/identify/Identify.vue:204
+#: src/components/identify/Identify.vue:228
 msgid ""
 "Some data ©\n"
 "        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
@@ -1898,7 +1944,7 @@
 msgid "Sounding Result Comparison"
 msgstr ""
 
-#: src/components/identify/formatter.js:118
+#: src/components/identify/formatter.js:121
 msgid "Sounding results"
 msgstr ""
 
@@ -1915,16 +1961,16 @@
 msgid "Source organization"
 msgstr ""
 
-#: src/components/identify/formatter.js:35
+#: src/components/identify/formatter.js:38
 #: src/components/sections/SectionForm.vue:161
 msgid "Source Organization"
 msgstr ""
 
-#: src/components/importconfiguration/types/Fairwaydimensions.vue:155
+#: src/components/importconfiguration/types/Fairwaydimensions.vue:148
 msgid "Source orgranization"
 msgstr ""
 
-#: src/components/identify/Identify.vue:201
+#: src/components/identify/Identify.vue:225
 msgid "source-code"
 msgstr ""
 
@@ -1933,7 +1979,7 @@
 msgid "Staging Area"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:230
+#: src/components/fairway/BottleneckDialogue.vue:231
 msgid "Start"
 msgstr ""
 
@@ -1941,7 +1987,7 @@
 msgid "Start rhm"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:356
+#: src/components/importconfiguration/types/Soundingresults.vue:364
 msgid "Starting import for "
 msgstr ""
 
@@ -1965,11 +2011,15 @@
 msgid "Starting Year"
 msgstr ""
 
+#: src/components/importconfiguration/types/Statsupdate.vue:6
+msgid "Stats Update"
+msgstr ""
+
 #: src/components/importoverview/ImportOverview.vue:209
 msgid "Status"
 msgstr ""
 
-#: src/components/identify/formatter.js:80
+#: src/components/identify/formatter.js:83
 msgid "Stretch"
 msgstr ""
 
@@ -1978,13 +2028,17 @@
 msgstr ""
 
 #: src/components/importconfiguration/types/ApprovedGaugeMeasurement.vue:66
-#: src/components/importconfiguration/types/WaterwayProfiles.vue:113
+#: src/components/importconfiguration/types/WaterwayProfiles.vue:106
 #: src/components/sections/SectionForm.vue:185
 #: src/components/stretches/StretchForm.vue:26
 msgid "Submit"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:838
+#: src/components/usermanagement/Usermanagement.vue:379
+msgid "successfully"
+msgstr ""
+
+#: src/components/fairway/AvailableFairwayDepth.vue:844
 msgid "Sum of days"
 msgstr ""
 
@@ -1992,17 +2046,17 @@
 msgid "Sun"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1129
+#: src/components/importconfiguration/ScheduledImports.vue:1156
 #: src/lib/datelocalization.js:8
 msgid "Sunday"
 msgstr ""
 
 #: src/components/fairway/BottleneckDialogue.vue:76
-#: src/components/fairway/BottleneckDialogue.vue:752
+#: src/components/fairway/BottleneckDialogue.vue:764
 msgid "Survey"
 msgstr ""
 
-#: src/components/Pdftool.vue:808
+#: src/components/Pdftool.vue:830
 msgid "Survey date"
 msgstr ""
 
@@ -2010,11 +2064,11 @@
 msgid "Survey from:"
 msgstr ""
 
-#: src/components/identify/formatter.js:122
+#: src/components/identify/formatter.js:125
 msgid "Survey type"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:165
+#: src/components/map/MapPopup.vue:166
 msgid "Surveys"
 msgstr ""
 
@@ -2022,7 +2076,7 @@
 msgid "Sysadmin"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:300
+#: src/components/usermanagement/Usermanagement.vue:429
 msgid "System-Administrator"
 msgstr ""
 
@@ -2034,10 +2088,16 @@
 msgid "Systemconfiguration"
 msgstr ""
 
-#: src/components/usermanagement/Usermanagement.vue:209
+#: src/components/usermanagement/Usermanagement.vue:327
 msgid "Testmail sent"
 msgstr ""
 
+#: src/components/map/Map.vue:300
+msgid ""
+"The ECDIS chart could not be loaded completely, the map might be corrupted. "
+"Please retry later"
+msgstr ""
+
 #: src/components/systemconfiguration/DataAccuracy.vue:204
 msgid ""
 "The highest confidence value is less than\n"
@@ -2125,9 +2185,9 @@
 msgid "There are less than"
 msgstr ""
 
-#: src/components/fairway/AvailableFairwayDepth.vue:254
-#: src/components/fairway/AvailableFairwayDepthLNWL.vue:231
-#: src/components/fairway/BottleneckDialogue.vue:495
+#: src/components/fairway/AvailableFairwayDepth.vue:257
+#: src/components/fairway/AvailableFairwayDepthLNWL.vue:234
+#: src/components/fairway/BottleneckDialogue.vue:507
 #: src/components/importconfiguration/types/Soundingresults.vue:232
 #: src/components/importconfiguration/types/Soundingresults.vue:251
 #: src/components/layers/Layerselect.vue:86
@@ -2135,7 +2195,7 @@
 msgid "this"
 msgstr ""
 
-#: src/components/identify/Identify.vue:195
+#: src/components/identify/Identify.vue:219
 msgid ""
 "This app uses <i>gemma</i>, which is Free Software under <br/>\n"
 "        %{ license } without warranty, see docs for details."
@@ -2145,12 +2205,12 @@
 msgid "Thu"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1126
+#: src/components/importconfiguration/ScheduledImports.vue:1153
 #: src/lib/datelocalization.js:12
 msgid "Thursday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:674
+#: src/components/importconfiguration/ScheduledImports.vue:679
 msgid "Time between retries. Valid units are 's' , 'm' and 'h' "
 msgstr ""
 
@@ -2172,21 +2232,21 @@
 msgid "Tolerance for snapping to axis"
 msgstr ""
 
-#: src/components/fairway/BottleneckDialogue.vue:611
+#: src/components/fairway/BottleneckDialogue.vue:623
 msgid ""
 "Too many difference calculations already in progress. Please try again later."
 msgstr ""
 
-#: src/components/identify/Identify.vue:575
-#: src/components/importconfiguration/types/Fairwaymarks.vue:145
+#: src/components/identify/Identify.vue:644
+#: src/components/importconfiguration/types/Fairwaymarks.vue:138
 msgid "Topmark (MARITIME/Hydro feature)"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:391
+#: src/components/importconfiguration/ScheduledImports.vue:402
 msgid "Tries"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:453
+#: src/components/importconfiguration/ScheduledImports.vue:468
 msgid "Trigger import"
 msgstr ""
 
@@ -2194,7 +2254,7 @@
 msgid "Tue"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1124
+#: src/components/importconfiguration/ScheduledImports.vue:1151
 #: src/lib/datelocalization.js:10
 msgid "Tuesday"
 msgstr ""
@@ -2209,11 +2269,15 @@
 msgid "Type of mark"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1068
+#: src/components/importconfiguration/ScheduledImports.vue:1095
 msgid "update import: #"
 msgstr ""
 
-#: src/components/importconfiguration/types/Soundingresults.vue:441
+#: src/components/importconfiguration/ImportDetails.vue:60
+msgid "Update Stats"
+msgstr ""
+
+#: src/components/importconfiguration/types/Soundingresults.vue:449
 msgid "Upload"
 msgstr ""
 
@@ -2237,7 +2301,7 @@
 msgid "uploaded successfully"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1107
+#: src/components/importconfiguration/ScheduledImports.vue:1134
 #: src/components/importconfiguration/types/Availablefairwaydepth.vue:5
 #: src/components/importconfiguration/types/Bottleneck.vue:7
 #: src/components/importconfiguration/types/Distancemarksashore.vue:5
@@ -2252,25 +2316,34 @@
 msgid "URL"
 msgstr ""
 
-#: src/components/identify/Identify.vue:191
-#: src/components/identify/Identify.vue:303
+#: src/components/usermanagement/Usermanagement.vue:375
+msgid "user account"
+msgstr ""
+
+#: src/components/identify/Identify.vue:214
+#: src/components/identify/Identify.vue:340
 msgid "User Manual"
 msgstr ""
 
+#: src/components/usermanagement/Userdetail.vue:271
+#: src/components/usermanagement/Usermanagement.vue:207
+msgid "User receives Data Quality Report"
+msgstr ""
+
 #: src/components/importconfiguration/types/Distancemarksvirtual.vue:25
 #: src/components/importconfiguration/types/Waterwaygauges.vue:25
 #: src/components/usermanagement/Userdetail.vue:11
-#: src/components/usermanagement/Userdetail.vue:246
-#: src/components/usermanagement/Usermanagement.vue:169
+#: src/components/usermanagement/Userdetail.vue:278
+#: src/components/usermanagement/Usermanagement.vue:219
 msgid "Username"
 msgstr ""
 
 #: src/components/Sidebar.vue:59
-#: src/components/usermanagement/Usermanagement.vue:157
+#: src/components/usermanagement/Usermanagement.vue:201
 msgid "Users"
 msgstr ""
 
-#: src/components/identify/Identify.vue:210
+#: src/components/identify/Identify.vue:234
 msgid ""
 "Uses\n"
 "        <a href=\"https://download.geonames.org/export/dump/readme.txt"
@@ -2282,7 +2355,7 @@
 msgid "Value"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:408
+#: src/components/importconfiguration/ScheduledImports.vue:421
 msgid "Wait to retry"
 msgstr ""
 
@@ -2307,17 +2380,17 @@
 msgstr ""
 
 #: src/components/fairway/Fairwayprofile.vue:668
-#: src/components/gauge/HydrologicalConditions.vue:769
-#: src/components/gauge/Waterlevel.vue:724
+#: src/components/gauge/HydrologicalConditions.vue:765
+#: src/components/gauge/Waterlevel.vue:720
 msgid "Waterlevel [m]"
 msgstr ""
 
-#: src/components/map/MapPopup.vue:171
+#: src/components/map/MapPopup.vue:172
 msgid "Waterlevels"
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:82
-#: src/components/usermanagement/Usermanagement.vue:301
+#: src/components/usermanagement/Usermanagement.vue:430
 msgid "Waterway Admin"
 msgstr ""
 
@@ -2325,7 +2398,7 @@
 msgid "Waterway area"
 msgstr ""
 
-#: src/components/identify/formatter.js:65
+#: src/components/identify/formatter.js:68
 msgid "Waterway Area"
 msgstr ""
 
@@ -2333,7 +2406,7 @@
 msgid "Waterway axis"
 msgstr ""
 
-#: src/components/identify/formatter.js:74
+#: src/components/identify/formatter.js:77
 msgid "Waterway Axis"
 msgstr ""
 
@@ -2341,7 +2414,7 @@
 msgid "Waterway gauges"
 msgstr ""
 
-#: src/components/identify/formatter.js:77
+#: src/components/identify/formatter.js:80
 msgid "Waterway Profile"
 msgstr ""
 
@@ -2350,7 +2423,7 @@
 msgstr ""
 
 #: src/components/usermanagement/Userdetail.vue:85
-#: src/components/usermanagement/Usermanagement.vue:302
+#: src/components/usermanagement/Usermanagement.vue:431
 msgid "Waterway User"
 msgstr ""
 
@@ -2358,16 +2431,16 @@
 msgid "Wed"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1125
+#: src/components/importconfiguration/ScheduledImports.vue:1152
 #: src/lib/datelocalization.js:11
 msgid "Wednesday"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1118
+#: src/components/importconfiguration/ScheduledImports.vue:1145
 msgid "week"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:238
+#: src/components/importconfiguration/ScheduledImports.vue:249
 msgid "Weekly"
 msgstr ""
 
@@ -2383,26 +2456,30 @@
 msgid "Widthlimit 2 [m]"
 msgstr ""
 
-#: src/components/importconfiguration/ScheduledImports.vue:1120
+#: src/components/importconfiguration/ScheduledImports.vue:1147
 msgid "year"
 msgstr "Rok"
 
-#: src/components/fairway/AvailableFairwayDepthDialogue.vue:868
+#: src/components/fairway/AvailableFairwayDepthDialogue.vue:874
 #, fuzzy
 msgid "yearly"
 msgstr "Rok"
 
-#: src/components/identify/formatter.js:10
+#: src/components/identify/formatter.js:14
 #, fuzzy
 msgid "yes"
 msgstr "Vrstvy"
 
-#: src/components/fairway/BottleneckDialogue.vue:734
+#: src/components/fairway/BottleneckDialogue.vue:746
 msgid ""
 "You can now select these coordinates from the \"Saved cross profiles\" menu "
 "to restore this cross profile."
 msgstr ""
 
+#: src/components/identify/formatter.js:127
+msgid "ZPG exception"
+msgstr ""
+
 #, fuzzy
 #~ msgid "Chose preset"
 #~ msgstr "Vyberte formát"
--- a/client/src/main.js	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/main.js	Tue Feb 08 10:20:26 2022 +0100
@@ -106,6 +106,7 @@
   faWater,
   faWrench,
   faRedo,
+  faUndo,
   faSync,
   faCrosshairs
 } from "@fortawesome/free-solid-svg-icons";
@@ -178,6 +179,7 @@
   faWater,
   faWrench,
   faRedo,
+  faUndo,
   faSync,
   faWindowMinimize,
   faWindowMaximize,
--- a/client/src/store/fairwayavailability.js	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/store/fairwayavailability.js	Tue Feb 08 10:20:26 2022 +0100
@@ -70,8 +70,8 @@
     limitingFactor: null,
     depthlimit1: 230,
     depthlimit2: 250,
-    widthlimit1: null,
-    widthlimit2: null,
+    widthlimit1: 80,
+    widthlimit2: 150,
     csv: null,
     fwData: null,
     fwLNWLData: null,
--- a/client/src/store/usermanagement.js	Wed Jul 21 15:14:40 2021 +0200
+++ b/client/src/store/usermanagement.js	Tue Feb 08 10:20:26 2022 +0100
@@ -32,7 +32,8 @@
     role: null,
     isNew: true,
     password: "",
-    roleLabel: ""
+    roleLabel: "",
+    active: true
   };
 };
 
@@ -130,17 +131,38 @@
         });
       } else {
         return new Promise((resolve, reject) => {
-          HTTP.put("/users/" + path, user, {
-            headers: { "X-Gemma-Auth": localStorage.getItem("token") }
-          })
-            .then(response => {
-              commit("setUserDetailsInvisible");
-              commit("clearCurrentUser");
-              resolve(response);
+          // Reactivate User
+          if (!user.active) {
+            HTTP.patch(
+              "/users/" + path,
+              { active: true, email: user.email },
+              {
+                headers: {
+                  "X-Gemma-Auth": localStorage.getItem("token")
+                }
+              }
+            )
+              .then(response => {
+                commit("setUserDetailsInvisible");
+                commit("clearCurrentUser");
+                resolve(response);
+              })
+              .catch(error => {
+                reject(error);
+              });
+          } else {
+            HTTP.put("/users/" + path, user, {
+              headers: { "X-Gemma-Auth": localStorage.getItem("token") }
             })
-            .catch(error => {
-              reject(error);
-            });
+              .then(response => {
+                commit("setUserDetailsInvisible");
+                commit("clearCurrentUser");
+                resolve(response);
+              })
+              .catch(error => {
+                reject(error);
+              });
+          }
         });
       }
     },
--- a/cmd/gemma/main.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/cmd/gemma/main.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,7 +18,7 @@
 import (
 	"context"
 	"fmt"
-	"log"
+	lg "log"
 	"net/http"
 	"os"
 	"os/signal"
@@ -34,6 +34,7 @@
 	"gemma.intevation.de/gemma/pkg/controllers"
 	"gemma.intevation.de/gemma/pkg/geoserver"
 	"gemma.intevation.de/gemma/pkg/imports"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/middleware"
 	"gemma.intevation.de/gemma/pkg/scheduler"
 )
@@ -49,11 +50,18 @@
 
 func start(cmd *cobra.Command, args []string) {
 
+	if lf := config.LogFile(); lf != "" {
+		log.SetupLog(lf, 0666)
+		defer log.ShutdownLog()
+	}
+
+	log.SetLogLevel(config.LogLevel())
+
 	config.Ready()
 
 	web, err := filepath.Abs(config.Web())
 	if err != nil {
-		log.Fatalf("error: %v\n", err)
+		log.Fatalf("%v\n", err)
 	}
 
 	prepareSessionStore()
@@ -73,7 +81,7 @@
 	m.PathPrefix("/").Handler(dir)
 
 	addr := fmt.Sprintf("%s:%d", config.WebHost(), config.WebPort())
-	log.Printf("info: listen on %s\n", addr)
+	log.Infof("listen on %s\n", addr)
 
 	var h http.Handler
 
@@ -102,7 +110,7 @@
 	select {
 	case err := <-done:
 		if err != nil && err != http.ErrServerClosed {
-			log.Fatalf("error: %v\n", err)
+			log.Fatalf("%v\n", err)
 		}
 	case <-sigChan:
 	}
@@ -112,14 +120,13 @@
 	<-done
 
 	if err := auth.Sessions.Shutdown(); err != nil {
-		log.Fatalf("error: %v\n", err)
+		log.Fatalf("%v\n", err)
 	}
 }
 
 func main() {
 	config.RootCmd.Run = start
-	log.SetFlags(log.LstdFlags | log.Lshortfile)
 	if err := config.RootCmd.Execute(); err != nil {
-		log.Fatalln(err)
+		lg.Fatalln(err)
 	}
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/gmaggregate/README.md	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,89 @@
+# gmaggregate
+
+*Attention:* This is a copy of [gmaggregate](https://heptapod.host/intevation/gemma/gmaggregate).
+
+A log message transformation tool for gauge measurement (gm) imports
+in the gemma server.
+
+We recognized that the logging of the gm imports is producing a lot
+of data itself by been very verbose and redundant. The has led
+to the fact that over 99% of the log messages of all imports
+in the gemma server are stemming from the gm imports ...
+hundreds of millions of log lines.
+
+The logging itself is now done in a more compact and aggregated
+way increasing the readability of the logs, too.
+To get rid of the repetitive old logs entries without losing
+information these logs has to be aggregated in the same way,
+too.
+
+Normally, we use SQL or PL/pgSQL scripts for this kind of migrations.
+We had a version of this for this task but first experiments
+had shown that its run time would only be acceptable
+for small data sets, but not for the multi million data sets
+of the production system. It also had no to very little potential
+to be significantly improved. Therefore we re-crafted this tool in Go.
+
+## Build
+
+You need a working Go build environment (tested successfully with 1.17).
+
+```(shell)
+hg clone https://heptapod.host/intevation/gemma/gmaggregate
+cd gmaggregate
+go build
+```
+
+Place the resulting `gmaggregate` binary into the `PATH` of your
+database server. It needs execution rights for the `postgres` user.
+
+If you've modified the expressions in [matcher.rl](matcher.rl) you need
+an installation of the [Ragel](http://www.colm.net/open-source/ragel/) FSM compiler.
+Compile the modified sources with:
+
+```(shell)
+go generate
+go build
+```
+
+## Usage
+
+`gmaggregate` works in two phases: **filter** and **transfer**.  
+The **filter** phase creates a new table in the database in which
+the aggregated logs of the gm import logs are stored. In this
+phase the original logs are __not__ modified. The modifications
+are done in the **transfer** phase. In this phase the original
+log lines are removed from the database which are associated
+with the gm imports leading to the entries in the table
+created in the first phase. All other log lines are not
+touched. After the deletion off the old lines the content
+of the new table is copied back into the log table and
+the new table is dropped. All operations in the transfer
+phase are are encapsulated within a transaction so that
+no harm is done if the execution is failing.
+
+`gmaggregate` runs the two phases **filter** and **transfer**
+one right after each other. If you want to run them
+separated by hand you can can do this this the `-phases`
+flag.
+
+> **CSV export**: For debugging purposes `gmaggregate` supports
+> exporting the aggregated log lines as a CSV file. Use the
+> `-c` flag to specify the file to write it to. When running
+> the CVS export the new table in the database is not created.
+> So the transfer phase will fail. Therefore you should use
+> the CSV export togetjer with the `-phase=filter` flag.
+
+For more options see `gmaggregate --help`.
+
+> Tip: After running the `gmaggregate` migration you should consider running  
+> `VACCUM FULL; CLUSTER import.import_logs USING import_logs_import_id;`  
+> from a `psql` shell on the database to recover the space
+> used by the original log lines and physically order the data
+> in a way corresponing to the process of logging.
+
+## License
+
+This is Free Software covered by the terms of the
+GNU Affero General Public License version 3.0 or later.
+See [AGPL-3.0.txt](../../LICENSES/AGPL-3.0.txt) for details.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/gmaggregate/go.mod	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,17 @@
+module heptapod.host/intevation/gemma/gmaggregate
+
+go 1.17
+
+require github.com/jackc/pgx/v4 v4.13.0
+
+require (
+	github.com/jackc/chunkreader/v2 v2.0.1 // indirect
+	github.com/jackc/pgconn v1.10.0 // indirect
+	github.com/jackc/pgio v1.0.0 // indirect
+	github.com/jackc/pgpassfile v1.0.0 // indirect
+	github.com/jackc/pgproto3/v2 v2.1.1 // indirect
+	github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect
+	github.com/jackc/pgtype v1.8.1 // indirect
+	golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
+	golang.org/x/text v0.3.6 // indirect
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/gmaggregate/go.sum	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,176 @@
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
+github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
+github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw=
+github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0=
+github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo=
+github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8=
+github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk=
+github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA=
+github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE=
+github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s=
+github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o=
+github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY=
+github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU=
+github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI=
+github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE=
+github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8=
+github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE=
+github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc=
+github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak=
+github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
+github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
+github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A=
+github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA=
+github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM=
+github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI=
+github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg=
+github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E=
+github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg=
+github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc=
+github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw=
+github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM=
+github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs=
+github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4=
+github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y=
+github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM=
+github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc=
+github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs=
+github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570=
+github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0=
+github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8=
+github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
+github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU=
+github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ=
+github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
+go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
+go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
+go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
+go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/gmaggregate/main.go	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,765 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSE
+//
+// Copyright (C) 2021 by via donau
+//   - Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+//go:generate ragel -Z -G2 -o matcher.go matcher.rl
+//go:generate go fmt matcher.go
+
+package main
+
+import (
+	"container/heap"
+	"context"
+	"database/sql"
+	"encoding/csv"
+	"flag"
+	"fmt"
+	"log"
+	"os"
+	"runtime"
+	"sort"
+	"strconv"
+	"strings"
+	"sync"
+	"time"
+
+	_ "github.com/jackc/pgx/v4/stdlib"
+)
+
+const (
+	selectOldGMLogsSQL = `
+  SELECT
+    lo.import_id,
+    lo.time,
+    lo.kind,
+    lo.msg
+  FROM import.imports im
+  JOIN import.import_logs lo
+    ON lo.import_id = im.id
+  WHERE im.kind = 'gm'
+  ORDER BY lo.import_id`
+
+	createFilteredLogsSQL = `
+  CREATE TABLE filtered_logs (
+    import_id integer                  NOT NULL,
+    time      timestamp with time zone NOT NULL,
+    kind      log_type                 NOT NULL,
+    msg       text                     NOT NULL
+  )`
+
+	insertFilteredLogsSQL = `
+  INSERT INTO filtered_logs (import_id, time, kind, msg)
+    VALUES ($1, $2, $3::log_type, $4)`
+
+	deleteOldGMLogsSQL = `
+  DELETE FROM import.import_logs WHERE import_id IN (
+    SELECT import_id FROM filtered_logs)`
+
+	copyDataSQL = `
+  INSERT INTO import.import_logs (import_id, time, kind, msg)
+  SELECT import_id, time, kind, msg
+  FROM filtered_logs`
+
+	dropFilteredLogsSQL = `DROP TABLE filtered_logs`
+)
+
+type phases int
+
+const (
+	nonePhase   phases = 0
+	filterPhase phases = 1 << iota
+	transferPhase
+)
+
+type gauge struct {
+	gid           string
+	unknown       bool
+	assumeZPG     bool
+	ignMeasCodes  []string
+	rescaleErrors []string
+	missingValues []string
+	assumeCM      int
+	badValues     int
+	measurements  int
+	predictions   int
+}
+
+type aggregator struct {
+	current string
+	hold    *line
+
+	lastGauge *gauge
+	gauges    []*gauge
+
+	stack [4]string
+}
+
+type line struct {
+	time time.Time
+	kind string
+	msg  string
+}
+
+type importLines struct {
+	seq   int
+	id    int64
+	lines []line
+}
+
+type processor struct {
+	cond       *sync.Cond
+	aggregated []*importLines
+	nextOutSeq int
+	done       bool
+}
+
+type writer interface {
+	prepare(context.Context, *sql.Conn) error
+	write(*importLines)
+	finish()
+	error() error
+}
+
+type csvWriter struct {
+	err  error
+	file *os.File
+	out  *csv.Writer
+	row  [1 + 1 + 1 + 1]string
+}
+
+type sqlWriter struct {
+	err  error
+	ctx  context.Context
+	tx   *sql.Tx
+	stmt *sql.Stmt
+}
+
+func (ps phases) has(p phases) bool {
+	return ps&p == p
+}
+
+func parsePhases(s string) (phases, error) {
+	ps := nonePhase
+	for _, x := range strings.Split(s, ",") {
+		switch strings.ToLower(strings.TrimSpace(x)) {
+		case "transfer":
+			ps |= transferPhase
+		case "filter":
+			ps |= filterPhase
+		default:
+			return nonePhase, fmt.Errorf("invalid phase '%s'", x)
+		}
+	}
+	return ps, nil
+}
+
+func (g *gauge) getAssumeZPG() bool               { return g.assumeZPG }
+func (g *gauge) getUnknown() bool                 { return g.unknown }
+func (g *gauge) getIgnoredMeasureCodes() []string { return g.ignMeasCodes }
+func (g *gauge) getRescaleErrors() []string       { return g.rescaleErrors }
+func (g *gauge) getMissingValues() []string       { return g.missingValues }
+func (g *gauge) getAssumeCM() int                 { return g.assumeCM }
+func (g *gauge) getBadValues() int                { return g.badValues }
+func (g *gauge) getPredictions() int              { return g.predictions }
+func (g *gauge) getMeasurements() int             { return g.measurements }
+func (g *gauge) nothingChanged() bool             { return g.measurements == 0 && g.predictions == 0 }
+
+func (agg *aggregator) reset() {
+	agg.current = ""
+	agg.hold = nil
+	agg.lastGauge = nil
+	agg.gauges = nil
+}
+
+func (agg *aggregator) find(name string) *gauge {
+	if agg.lastGauge != nil && name == agg.lastGauge.gid {
+		return agg.lastGauge
+	}
+	for _, g := range agg.gauges {
+		if g.gid == name {
+			agg.lastGauge = g
+			return g
+		}
+	}
+	g := &gauge{gid: name}
+	agg.gauges = append(agg.gauges, g)
+	agg.lastGauge = g
+	return g
+}
+
+func extend(haystack []string, needle string) []string {
+	for _, straw := range haystack {
+		if straw == needle {
+			return haystack
+		}
+	}
+	return append(haystack, needle)
+}
+
+func (agg *aggregator) logBool(
+	access func(*gauge) bool,
+	header string,
+	log func(string),
+) {
+	var sb strings.Builder
+	for _, g := range agg.gauges {
+		if access(g) {
+			if sb.Len() == 0 {
+				sb.WriteString(header)
+			} else {
+				sb.WriteString(", ")
+			}
+			sb.WriteString(g.gid)
+		}
+	}
+	if sb.Len() > 0 {
+		log(sb.String())
+	}
+}
+
+func (agg *aggregator) logInt(
+	access func(*gauge) int,
+	header string,
+	log func(string),
+) {
+	gs := make([]*gauge, 0, len(agg.gauges))
+	for _, g := range agg.gauges {
+		if access(g) > 0 {
+			gs = append(gs, g)
+		}
+	}
+
+	if len(gs) == 0 {
+		return
+	}
+
+	sort.SliceStable(gs, func(i, j int) bool {
+		return access(gs[i]) < access(gs[j])
+	})
+
+	var sb strings.Builder
+	var last int
+
+	for _, g := range gs {
+		if c := access(g); c != last {
+			if sb.Len() == 0 {
+				sb.WriteString(header)
+			} else {
+				sb.WriteString("); ")
+			}
+			sb.WriteString(strconv.Itoa(c))
+			sb.WriteString(" (")
+			last = c
+		} else {
+			sb.WriteString(", ")
+		}
+		sb.WriteString(g.gid)
+	}
+
+	sb.WriteByte(')')
+	log(sb.String())
+}
+
+func (agg *aggregator) logString(
+	access func(*gauge) []string,
+	header string,
+	log func(string),
+) {
+	var sb strings.Builder
+	for _, g := range agg.gauges {
+		if s := access(g); len(s) > 0 {
+			if sb.Len() == 0 {
+				sb.WriteString(header)
+			} else {
+				sb.WriteString(", ")
+			}
+			sb.WriteString(g.gid)
+			sb.WriteString(" (")
+			for i, v := range s {
+				if i > 0 {
+					sb.WriteString("; ")
+				}
+				sb.WriteString(v)
+			}
+			sb.WriteByte(')')
+		}
+	}
+	if sb.Len() > 0 {
+		log(sb.String())
+	}
+}
+
+func (agg *aggregator) aggregate(out []line, last time.Time) []line {
+
+	// Guarantee that new lines has a time after already put out lines.
+	if n := len(out); n > 0 && !out[n-1].time.Before(last) {
+		last = out[n-1].time.Add(time.Millisecond)
+	}
+
+	log := func(kind, msg string) {
+		out = append(out, line{last, kind, msg})
+		last = last.Add(time.Millisecond)
+	}
+
+	infoLog := func(msg string) { log("info", msg) }
+	warnLog := func(msg string) { log("warn", msg) }
+	errLog := func(msg string) { log("error", msg) }
+
+	agg.logBool(
+		(*gauge).getUnknown,
+		"Cannot find following gauges: ",
+		warnLog)
+
+	agg.logBool(
+		(*gauge).getAssumeZPG,
+		"'Reference_code' not specified. Assuming 'ZPG': ",
+		warnLog)
+
+	agg.logInt(
+		(*gauge).getAssumeCM,
+		"'Unit' not specified. Assuming 'cm': ",
+		warnLog)
+
+	agg.logInt(
+		(*gauge).getBadValues,
+		"Ignored measurements with value -99999: ",
+		warnLog)
+
+	agg.logString(
+		(*gauge).getMissingValues,
+		"Missing mandatory values: ",
+		warnLog)
+
+	agg.logString(
+		(*gauge).getRescaleErrors,
+		"Cannot convert units: ",
+		errLog)
+
+	agg.logString(
+		(*gauge).getRescaleErrors,
+		"Ignored measure codes: ",
+		warnLog)
+
+	agg.logInt(
+		(*gauge).getPredictions,
+		"New predictions: ",
+		infoLog)
+
+	agg.logInt(
+		(*gauge).getMeasurements,
+		"New measurements: ",
+		infoLog)
+
+	agg.logBool(
+		(*gauge).nothingChanged,
+		"No changes for: ",
+		infoLog)
+
+	if agg.hold != nil {
+		agg.hold.time = last
+		out = append(out, *agg.hold)
+	}
+	return out
+}
+
+func (agg *aggregator) run(
+	wg *sync.WaitGroup,
+	logs <-chan *importLines,
+	pr *processor,
+) {
+	defer wg.Done()
+	for l := range logs {
+		// Do sorting by time in user land to take advantage
+		// of concurrent workers.
+		lines := l.lines
+		sort.Slice(lines, func(i, j int) bool {
+			return lines[i].time.Before(lines[j].time)
+		})
+
+		out := lines[:0:len(lines)]
+		for i := range lines {
+			line := &lines[i]
+			if !agg.match(line.msg, line) {
+				out = append(out, *line)
+			}
+		}
+		l.lines = agg.aggregate(out, lines[len(lines)-1].time)
+		pr.consume(l)
+		agg.reset()
+	}
+}
+
+const timeFormat = "2006-01-02 15:04:05.999999-07"
+
+func newCSVWriter(filename string) (*csvWriter, error) {
+
+	f, err := os.Create(filename)
+	if err != nil {
+		return nil, err
+	}
+
+	return &csvWriter{
+		file: f,
+		out:  csv.NewWriter(f),
+	}, nil
+}
+
+func (cw *csvWriter) prepare(context.Context, *sql.Conn) error {
+	return nil
+}
+
+func (cw *csvWriter) error() error { return cw.err }
+
+func (cw *csvWriter) write(entry *importLines) {
+	if cw.err != nil {
+		return
+	}
+	row := cw.row[:]
+	row[0] = strconv.FormatInt(entry.id, 10)
+	for _, l := range entry.lines {
+		row[1] = l.time.Format(timeFormat)
+		row[2] = l.kind
+		row[3] = l.msg
+		if cw.err = cw.out.Write(row); cw.err != nil {
+			log.Printf("error: Writing to CSV file failed: %v\n", cw.err)
+			return
+		}
+	}
+}
+
+func (cw *csvWriter) finish() {
+	cw.out.Flush()
+	if err := cw.out.Error(); err != nil {
+		log.Printf("error: flushing CSV file failed: %v\n", err)
+	}
+	if err := cw.file.Close(); err != nil {
+		log.Printf("Closing CSV file failed: %v\n", err)
+	}
+}
+
+func (sw *sqlWriter) prepare(ctx context.Context, conn *sql.Conn) error {
+
+	tx, err := conn.BeginTx(ctx, nil)
+	if err != nil {
+		return err
+	}
+
+	if _, err := tx.ExecContext(ctx, createFilteredLogsSQL); err != nil {
+		tx.Rollback()
+		return fmt.Errorf("cannot create new log table: %v\n", err)
+	}
+
+	stmt, err := tx.PrepareContext(ctx, insertFilteredLogsSQL)
+	if err != nil {
+		tx.Rollback()
+		return err
+	}
+
+	sw.ctx = ctx
+	sw.tx = tx
+	sw.stmt = stmt
+	return nil
+}
+
+func (sw *sqlWriter) error() error { return sw.err }
+
+func (sw *sqlWriter) write(entry *importLines) {
+	if sw.err != nil {
+		return
+	}
+	for _, l := range entry.lines {
+		if _, sw.err = sw.stmt.ExecContext(
+			sw.ctx,
+			entry.id,
+			l.time,
+			l.kind,
+			l.msg,
+		); sw.err != nil {
+			log.Printf("error: writing log line to db failed: %v\n", sw.err)
+			return
+		}
+	}
+}
+
+func (sw *sqlWriter) finish() {
+	if err := sw.stmt.Close(); err != nil {
+		log.Printf("error: close stmt failed: %v\n", err)
+	}
+	if sw.err == nil {
+		if err := sw.tx.Commit(); err != nil {
+			log.Printf("error: Commiting transaction failed: %v\n", err)
+		}
+	} else if err := sw.tx.Rollback(); err != nil {
+		log.Printf("error: Rollback transaction failed: %v\n", err)
+	}
+}
+
+func (pr *processor) Push(x interface{}) {
+	pr.aggregated = append(pr.aggregated, x.(*importLines))
+}
+
+func (pr *processor) Pop() interface{} {
+	n := len(pr.aggregated)
+	x := pr.aggregated[n-1]
+	pr.aggregated[n-1] = nil
+	pr.aggregated = pr.aggregated[:n-1]
+	return x
+}
+
+func (pr *processor) Len() int { return len(pr.aggregated) }
+
+func (pr *processor) Less(i, j int) bool {
+	return pr.aggregated[i].seq < pr.aggregated[j].seq
+}
+
+func (pr *processor) Swap(i, j int) {
+	pr.aggregated[i], pr.aggregated[j] = pr.aggregated[j], pr.aggregated[i]
+}
+
+func (pr *processor) consume(l *importLines) {
+	pr.cond.L.Lock()
+	heap.Push(pr, l)
+	pr.cond.L.Unlock()
+	pr.cond.Signal()
+}
+
+func (pr *processor) quit() {
+	pr.cond.L.Lock()
+	pr.done = true
+	pr.cond.L.Unlock()
+	pr.cond.Signal()
+}
+
+func (pr *processor) drain(write func(*importLines)) {
+
+	for {
+		pr.cond.L.Lock()
+		for !pr.done &&
+			(len(pr.aggregated) == 0 || pr.aggregated[0].seq != pr.nextOutSeq) {
+			pr.cond.Wait()
+		}
+		if pr.done {
+			for len(pr.aggregated) > 0 {
+				write(heap.Pop(pr).(*importLines))
+			}
+			pr.cond.L.Unlock()
+			return
+		}
+		l := heap.Pop(pr).(*importLines)
+		//log.Printf("%d %p\n", c.nextOutSeq, l)
+		pr.nextOutSeq++
+		pr.cond.L.Unlock()
+		write(l)
+	}
+}
+
+func (pr *processor) filterPhase(db *sql.DB, worker int, wr writer) error {
+
+	log.Println("filter phase started")
+
+	ctx := context.Background()
+
+	con1, err := db.Conn(ctx)
+	if err != nil {
+		return err
+	}
+	defer con1.Close()
+
+	con2, err := db.Conn(ctx)
+	if err != nil {
+		return err
+	}
+	defer con2.Close()
+
+	tx, err := con1.BeginTx(ctx, &sql.TxOptions{ReadOnly: true})
+	if err != nil {
+		return err
+	}
+	defer tx.Rollback()
+
+	if err := wr.prepare(ctx, con2); err != nil {
+		return err
+	}
+	defer wr.finish()
+
+	logs := make(chan *importLines)
+	var wg sync.WaitGroup
+
+	for i := 0; i < worker; i++ {
+		wg.Add(1)
+		go new(aggregator).run(&wg, logs, pr)
+	}
+
+	writeDone := make(chan struct{})
+
+	go func() {
+		defer close(writeDone)
+		pr.drain(wr.write)
+	}()
+
+	log.Println("Querying for old logs started. (Can take a while.)")
+	rows, err := tx.QueryContext(ctx, selectOldGMLogsSQL)
+	if err != nil {
+		return err
+	}
+	defer rows.Close()
+
+	log.Println("Querying done. (Maybe restart the gemma server, now?)")
+
+	var (
+		count    int64
+		current  *importLines
+		seq      int
+		l        line
+		importID int64
+		start    = time.Now()
+		last     = start
+	)
+
+	log.Println("Filtering started.")
+	for rows.Next() {
+		if err := rows.Scan(&importID, &l.time, &l.kind, &l.msg); err != nil {
+			return err
+		}
+
+		if current == nil || importID != current.id {
+			if current != nil {
+				logs <- current
+			}
+			current = &importLines{
+				seq: seq,
+				id:  importID,
+			}
+			seq++
+		}
+		current.lines = append(current.lines, l)
+
+		if count++; count%1_000_000 == 0 {
+			now := time.Now()
+			diff := now.Sub(last)
+			log.Printf("lines: %d rate: %.2f lines/s\n",
+				count,
+				1_000_000/diff.Seconds())
+			last = now
+		}
+	}
+	if current != nil && len(current.lines) > 0 {
+		logs <- current
+	}
+	close(logs)
+	wg.Wait()
+
+	pr.quit()
+
+	<-writeDone
+
+	rate := float64(count) / time.Since(start).Seconds()
+	log.Printf("lines: %d rate: %.2f lines/s imports: %d\n",
+		count, rate, seq)
+	return nil
+}
+
+func (pr *processor) transferPhase(db *sql.DB) error {
+	log.Println("Transfer phase started.")
+	ctx := context.Background()
+	conn, err := db.Conn(ctx)
+	if err != nil {
+		return err
+	}
+	defer conn.Close()
+	tx, err := conn.BeginTx(ctx, nil)
+	if err != nil {
+		return err
+	}
+	defer tx.Rollback()
+
+	for _, sql := range []string{
+		deleteOldGMLogsSQL,
+		copyDataSQL,
+		dropFilteredLogsSQL,
+	} {
+		if _, err := tx.ExecContext(ctx, sql); err != nil {
+			return err
+		}
+	}
+	return tx.Commit()
+}
+
+func newProcessor() *processor {
+	return &processor{
+		cond: sync.NewCond(new(sync.Mutex)),
+	}
+}
+
+func process(
+	host, dbname string, port int,
+	worker int,
+	csvFile string,
+	ps phases,
+) error {
+
+	p := newProcessor()
+	var wr writer
+
+	if csvFile != "" {
+		var err error
+		if wr, err = newCSVWriter(csvFile); err != nil {
+			return fmt.Errorf("error: Cannot create CSV file: %v", err)
+		}
+	} else {
+		wr = new(sqlWriter)
+	}
+
+	dsn := fmt.Sprintf("host=%s dbname=%s port=%d", host, dbname, port)
+	db, err := sql.Open("pgx", dsn)
+	if err != nil {
+		return err
+	}
+	defer db.Close()
+
+	if ps.has(filterPhase) {
+		if err := p.filterPhase(db, worker, wr); err != nil {
+			return err
+		}
+	}
+	if ps.has(transferPhase) {
+		if err := p.transferPhase(db); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func main() {
+	var (
+		host   = flag.String("h", "/var/run/postgresql", "database host")
+		dbname = flag.String("d", "gemma", "database")
+		port   = flag.Int("p", 5432, "database port")
+		worker = flag.Int("w", runtime.NumCPU(), "workers to aggregate")
+		csv    = flag.String("c", "", "CSV file to be written")
+		phases = flag.String("phases", "filter,transfer", "Phases filter and/or transfer")
+	)
+
+	flag.Parse()
+
+	ps, err := parsePhases(*phases)
+	if err != nil {
+		log.Fatalf("error: %v\n", err)
+	}
+
+	start := time.Now()
+	if err := process(*host, *dbname, *port, *worker, *csv, ps); err != nil {
+		log.Fatalf("error: %v\n", err)
+	}
+	log.Printf("time took: %s\n", time.Since(start))
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/gmaggregate/matcher.go	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,5744 @@
+//line matcher.rl:1
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSE
+//
+// Copyright (C) 2021 by via donau
+//   - Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+package main
+
+import "strconv"
+
+//line matcher.go:21
+const expression_start int = 1
+const expression_first_final int = 408
+const expression_error int = 0
+
+const expression_en_expr int = 1
+
+//line matcher.rl:20
+
+func (agg *aggregator) match(data string, l *line) bool {
+
+	// data := []rune(line)
+
+	var cs int
+
+	p, pe := 0, len(data)
+
+	stack := agg.stack[:0]
+	var pos int
+
+	var g *gauge
+	var v int
+
+	current := func() string { return string(data[pos+1 : p+1]) }
+
+	pop := func() string {
+		s := stack[len(stack)-1]
+		stack = stack[:len(stack)-1]
+		return s
+	}
+
+//line matcher.rl:138
+
+//line matcher.go:59
+	{
+		cs = expression_start
+	}
+
+//line matcher.rl:141
+
+//line matcher.go:66
+	{
+		if p == pe {
+			goto _test_eof
+		}
+		switch cs {
+		case 1:
+			goto st_case_1
+		case 0:
+			goto st_case_0
+		case 2:
+			goto st_case_2
+		case 3:
+			goto st_case_3
+		case 4:
+			goto st_case_4
+		case 5:
+			goto st_case_5
+		case 6:
+			goto st_case_6
+		case 7:
+			goto st_case_7
+		case 8:
+			goto st_case_8
+		case 9:
+			goto st_case_9
+		case 10:
+			goto st_case_10
+		case 11:
+			goto st_case_11
+		case 12:
+			goto st_case_12
+		case 13:
+			goto st_case_13
+		case 14:
+			goto st_case_14
+		case 15:
+			goto st_case_15
+		case 16:
+			goto st_case_16
+		case 17:
+			goto st_case_17
+		case 18:
+			goto st_case_18
+		case 19:
+			goto st_case_19
+		case 20:
+			goto st_case_20
+		case 21:
+			goto st_case_21
+		case 22:
+			goto st_case_22
+		case 23:
+			goto st_case_23
+		case 24:
+			goto st_case_24
+		case 25:
+			goto st_case_25
+		case 26:
+			goto st_case_26
+		case 27:
+			goto st_case_27
+		case 28:
+			goto st_case_28
+		case 29:
+			goto st_case_29
+		case 30:
+			goto st_case_30
+		case 31:
+			goto st_case_31
+		case 32:
+			goto st_case_32
+		case 33:
+			goto st_case_33
+		case 34:
+			goto st_case_34
+		case 35:
+			goto st_case_35
+		case 36:
+			goto st_case_36
+		case 37:
+			goto st_case_37
+		case 38:
+			goto st_case_38
+		case 39:
+			goto st_case_39
+		case 40:
+			goto st_case_40
+		case 41:
+			goto st_case_41
+		case 42:
+			goto st_case_42
+		case 43:
+			goto st_case_43
+		case 44:
+			goto st_case_44
+		case 45:
+			goto st_case_45
+		case 46:
+			goto st_case_46
+		case 408:
+			goto st_case_408
+		case 47:
+			goto st_case_47
+		case 48:
+			goto st_case_48
+		case 49:
+			goto st_case_49
+		case 50:
+			goto st_case_50
+		case 51:
+			goto st_case_51
+		case 52:
+			goto st_case_52
+		case 53:
+			goto st_case_53
+		case 54:
+			goto st_case_54
+		case 55:
+			goto st_case_55
+		case 56:
+			goto st_case_56
+		case 57:
+			goto st_case_57
+		case 58:
+			goto st_case_58
+		case 59:
+			goto st_case_59
+		case 60:
+			goto st_case_60
+		case 61:
+			goto st_case_61
+		case 62:
+			goto st_case_62
+		case 63:
+			goto st_case_63
+		case 64:
+			goto st_case_64
+		case 65:
+			goto st_case_65
+		case 66:
+			goto st_case_66
+		case 67:
+			goto st_case_67
+		case 68:
+			goto st_case_68
+		case 69:
+			goto st_case_69
+		case 70:
+			goto st_case_70
+		case 71:
+			goto st_case_71
+		case 72:
+			goto st_case_72
+		case 73:
+			goto st_case_73
+		case 74:
+			goto st_case_74
+		case 75:
+			goto st_case_75
+		case 76:
+			goto st_case_76
+		case 77:
+			goto st_case_77
+		case 78:
+			goto st_case_78
+		case 79:
+			goto st_case_79
+		case 80:
+			goto st_case_80
+		case 81:
+			goto st_case_81
+		case 82:
+			goto st_case_82
+		case 83:
+			goto st_case_83
+		case 84:
+			goto st_case_84
+		case 85:
+			goto st_case_85
+		case 86:
+			goto st_case_86
+		case 87:
+			goto st_case_87
+		case 88:
+			goto st_case_88
+		case 89:
+			goto st_case_89
+		case 90:
+			goto st_case_90
+		case 91:
+			goto st_case_91
+		case 92:
+			goto st_case_92
+		case 93:
+			goto st_case_93
+		case 94:
+			goto st_case_94
+		case 95:
+			goto st_case_95
+		case 96:
+			goto st_case_96
+		case 97:
+			goto st_case_97
+		case 98:
+			goto st_case_98
+		case 99:
+			goto st_case_99
+		case 100:
+			goto st_case_100
+		case 101:
+			goto st_case_101
+		case 102:
+			goto st_case_102
+		case 103:
+			goto st_case_103
+		case 104:
+			goto st_case_104
+		case 105:
+			goto st_case_105
+		case 106:
+			goto st_case_106
+		case 107:
+			goto st_case_107
+		case 108:
+			goto st_case_108
+		case 109:
+			goto st_case_109
+		case 110:
+			goto st_case_110
+		case 111:
+			goto st_case_111
+		case 112:
+			goto st_case_112
+		case 113:
+			goto st_case_113
+		case 114:
+			goto st_case_114
+		case 115:
+			goto st_case_115
+		case 116:
+			goto st_case_116
+		case 117:
+			goto st_case_117
+		case 118:
+			goto st_case_118
+		case 119:
+			goto st_case_119
+		case 120:
+			goto st_case_120
+		case 121:
+			goto st_case_121
+		case 122:
+			goto st_case_122
+		case 123:
+			goto st_case_123
+		case 124:
+			goto st_case_124
+		case 125:
+			goto st_case_125
+		case 126:
+			goto st_case_126
+		case 127:
+			goto st_case_127
+		case 128:
+			goto st_case_128
+		case 129:
+			goto st_case_129
+		case 130:
+			goto st_case_130
+		case 131:
+			goto st_case_131
+		case 132:
+			goto st_case_132
+		case 133:
+			goto st_case_133
+		case 134:
+			goto st_case_134
+		case 135:
+			goto st_case_135
+		case 136:
+			goto st_case_136
+		case 137:
+			goto st_case_137
+		case 138:
+			goto st_case_138
+		case 139:
+			goto st_case_139
+		case 140:
+			goto st_case_140
+		case 141:
+			goto st_case_141
+		case 142:
+			goto st_case_142
+		case 143:
+			goto st_case_143
+		case 144:
+			goto st_case_144
+		case 145:
+			goto st_case_145
+		case 146:
+			goto st_case_146
+		case 147:
+			goto st_case_147
+		case 148:
+			goto st_case_148
+		case 149:
+			goto st_case_149
+		case 150:
+			goto st_case_150
+		case 151:
+			goto st_case_151
+		case 152:
+			goto st_case_152
+		case 153:
+			goto st_case_153
+		case 154:
+			goto st_case_154
+		case 155:
+			goto st_case_155
+		case 156:
+			goto st_case_156
+		case 157:
+			goto st_case_157
+		case 158:
+			goto st_case_158
+		case 159:
+			goto st_case_159
+		case 160:
+			goto st_case_160
+		case 161:
+			goto st_case_161
+		case 162:
+			goto st_case_162
+		case 163:
+			goto st_case_163
+		case 164:
+			goto st_case_164
+		case 165:
+			goto st_case_165
+		case 166:
+			goto st_case_166
+		case 167:
+			goto st_case_167
+		case 168:
+			goto st_case_168
+		case 169:
+			goto st_case_169
+		case 170:
+			goto st_case_170
+		case 171:
+			goto st_case_171
+		case 172:
+			goto st_case_172
+		case 173:
+			goto st_case_173
+		case 174:
+			goto st_case_174
+		case 175:
+			goto st_case_175
+		case 176:
+			goto st_case_176
+		case 177:
+			goto st_case_177
+		case 178:
+			goto st_case_178
+		case 179:
+			goto st_case_179
+		case 180:
+			goto st_case_180
+		case 181:
+			goto st_case_181
+		case 182:
+			goto st_case_182
+		case 183:
+			goto st_case_183
+		case 184:
+			goto st_case_184
+		case 185:
+			goto st_case_185
+		case 186:
+			goto st_case_186
+		case 187:
+			goto st_case_187
+		case 188:
+			goto st_case_188
+		case 189:
+			goto st_case_189
+		case 190:
+			goto st_case_190
+		case 191:
+			goto st_case_191
+		case 192:
+			goto st_case_192
+		case 193:
+			goto st_case_193
+		case 194:
+			goto st_case_194
+		case 195:
+			goto st_case_195
+		case 196:
+			goto st_case_196
+		case 197:
+			goto st_case_197
+		case 198:
+			goto st_case_198
+		case 199:
+			goto st_case_199
+		case 200:
+			goto st_case_200
+		case 201:
+			goto st_case_201
+		case 202:
+			goto st_case_202
+		case 203:
+			goto st_case_203
+		case 204:
+			goto st_case_204
+		case 205:
+			goto st_case_205
+		case 206:
+			goto st_case_206
+		case 207:
+			goto st_case_207
+		case 208:
+			goto st_case_208
+		case 209:
+			goto st_case_209
+		case 210:
+			goto st_case_210
+		case 211:
+			goto st_case_211
+		case 212:
+			goto st_case_212
+		case 213:
+			goto st_case_213
+		case 214:
+			goto st_case_214
+		case 215:
+			goto st_case_215
+		case 216:
+			goto st_case_216
+		case 217:
+			goto st_case_217
+		case 218:
+			goto st_case_218
+		case 219:
+			goto st_case_219
+		case 220:
+			goto st_case_220
+		case 221:
+			goto st_case_221
+		case 222:
+			goto st_case_222
+		case 223:
+			goto st_case_223
+		case 224:
+			goto st_case_224
+		case 225:
+			goto st_case_225
+		case 226:
+			goto st_case_226
+		case 227:
+			goto st_case_227
+		case 228:
+			goto st_case_228
+		case 229:
+			goto st_case_229
+		case 230:
+			goto st_case_230
+		case 231:
+			goto st_case_231
+		case 232:
+			goto st_case_232
+		case 233:
+			goto st_case_233
+		case 234:
+			goto st_case_234
+		case 235:
+			goto st_case_235
+		case 236:
+			goto st_case_236
+		case 237:
+			goto st_case_237
+		case 409:
+			goto st_case_409
+		case 238:
+			goto st_case_238
+		case 239:
+			goto st_case_239
+		case 240:
+			goto st_case_240
+		case 241:
+			goto st_case_241
+		case 242:
+			goto st_case_242
+		case 243:
+			goto st_case_243
+		case 244:
+			goto st_case_244
+		case 245:
+			goto st_case_245
+		case 246:
+			goto st_case_246
+		case 247:
+			goto st_case_247
+		case 248:
+			goto st_case_248
+		case 249:
+			goto st_case_249
+		case 250:
+			goto st_case_250
+		case 251:
+			goto st_case_251
+		case 252:
+			goto st_case_252
+		case 253:
+			goto st_case_253
+		case 254:
+			goto st_case_254
+		case 255:
+			goto st_case_255
+		case 256:
+			goto st_case_256
+		case 257:
+			goto st_case_257
+		case 258:
+			goto st_case_258
+		case 259:
+			goto st_case_259
+		case 260:
+			goto st_case_260
+		case 261:
+			goto st_case_261
+		case 262:
+			goto st_case_262
+		case 263:
+			goto st_case_263
+		case 264:
+			goto st_case_264
+		case 265:
+			goto st_case_265
+		case 266:
+			goto st_case_266
+		case 267:
+			goto st_case_267
+		case 268:
+			goto st_case_268
+		case 269:
+			goto st_case_269
+		case 270:
+			goto st_case_270
+		case 271:
+			goto st_case_271
+		case 272:
+			goto st_case_272
+		case 273:
+			goto st_case_273
+		case 274:
+			goto st_case_274
+		case 275:
+			goto st_case_275
+		case 276:
+			goto st_case_276
+		case 277:
+			goto st_case_277
+		case 278:
+			goto st_case_278
+		case 279:
+			goto st_case_279
+		case 280:
+			goto st_case_280
+		case 281:
+			goto st_case_281
+		case 282:
+			goto st_case_282
+		case 283:
+			goto st_case_283
+		case 284:
+			goto st_case_284
+		case 285:
+			goto st_case_285
+		case 286:
+			goto st_case_286
+		case 287:
+			goto st_case_287
+		case 288:
+			goto st_case_288
+		case 289:
+			goto st_case_289
+		case 290:
+			goto st_case_290
+		case 291:
+			goto st_case_291
+		case 292:
+			goto st_case_292
+		case 293:
+			goto st_case_293
+		case 294:
+			goto st_case_294
+		case 295:
+			goto st_case_295
+		case 296:
+			goto st_case_296
+		case 297:
+			goto st_case_297
+		case 298:
+			goto st_case_298
+		case 299:
+			goto st_case_299
+		case 300:
+			goto st_case_300
+		case 301:
+			goto st_case_301
+		case 302:
+			goto st_case_302
+		case 303:
+			goto st_case_303
+		case 304:
+			goto st_case_304
+		case 305:
+			goto st_case_305
+		case 306:
+			goto st_case_306
+		case 307:
+			goto st_case_307
+		case 308:
+			goto st_case_308
+		case 309:
+			goto st_case_309
+		case 310:
+			goto st_case_310
+		case 311:
+			goto st_case_311
+		case 312:
+			goto st_case_312
+		case 313:
+			goto st_case_313
+		case 314:
+			goto st_case_314
+		case 315:
+			goto st_case_315
+		case 316:
+			goto st_case_316
+		case 317:
+			goto st_case_317
+		case 318:
+			goto st_case_318
+		case 319:
+			goto st_case_319
+		case 320:
+			goto st_case_320
+		case 321:
+			goto st_case_321
+		case 322:
+			goto st_case_322
+		case 323:
+			goto st_case_323
+		case 324:
+			goto st_case_324
+		case 325:
+			goto st_case_325
+		case 326:
+			goto st_case_326
+		case 327:
+			goto st_case_327
+		case 328:
+			goto st_case_328
+		case 329:
+			goto st_case_329
+		case 330:
+			goto st_case_330
+		case 331:
+			goto st_case_331
+		case 332:
+			goto st_case_332
+		case 333:
+			goto st_case_333
+		case 334:
+			goto st_case_334
+		case 335:
+			goto st_case_335
+		case 336:
+			goto st_case_336
+		case 337:
+			goto st_case_337
+		case 338:
+			goto st_case_338
+		case 339:
+			goto st_case_339
+		case 340:
+			goto st_case_340
+		case 341:
+			goto st_case_341
+		case 342:
+			goto st_case_342
+		case 343:
+			goto st_case_343
+		case 344:
+			goto st_case_344
+		case 345:
+			goto st_case_345
+		case 346:
+			goto st_case_346
+		case 347:
+			goto st_case_347
+		case 348:
+			goto st_case_348
+		case 349:
+			goto st_case_349
+		case 350:
+			goto st_case_350
+		case 351:
+			goto st_case_351
+		case 352:
+			goto st_case_352
+		case 353:
+			goto st_case_353
+		case 354:
+			goto st_case_354
+		case 355:
+			goto st_case_355
+		case 356:
+			goto st_case_356
+		case 357:
+			goto st_case_357
+		case 358:
+			goto st_case_358
+		case 359:
+			goto st_case_359
+		case 360:
+			goto st_case_360
+		case 361:
+			goto st_case_361
+		case 362:
+			goto st_case_362
+		case 363:
+			goto st_case_363
+		case 364:
+			goto st_case_364
+		case 365:
+			goto st_case_365
+		case 366:
+			goto st_case_366
+		case 367:
+			goto st_case_367
+		case 368:
+			goto st_case_368
+		case 369:
+			goto st_case_369
+		case 370:
+			goto st_case_370
+		case 371:
+			goto st_case_371
+		case 372:
+			goto st_case_372
+		case 373:
+			goto st_case_373
+		case 374:
+			goto st_case_374
+		case 375:
+			goto st_case_375
+		case 376:
+			goto st_case_376
+		case 377:
+			goto st_case_377
+		case 378:
+			goto st_case_378
+		case 379:
+			goto st_case_379
+		case 380:
+			goto st_case_380
+		case 381:
+			goto st_case_381
+		case 382:
+			goto st_case_382
+		case 383:
+			goto st_case_383
+		case 384:
+			goto st_case_384
+		case 385:
+			goto st_case_385
+		case 386:
+			goto st_case_386
+		case 387:
+			goto st_case_387
+		case 388:
+			goto st_case_388
+		case 389:
+			goto st_case_389
+		case 390:
+			goto st_case_390
+		case 391:
+			goto st_case_391
+		case 392:
+			goto st_case_392
+		case 393:
+			goto st_case_393
+		case 394:
+			goto st_case_394
+		case 395:
+			goto st_case_395
+		case 396:
+			goto st_case_396
+		case 397:
+			goto st_case_397
+		case 398:
+			goto st_case_398
+		case 399:
+			goto st_case_399
+		case 400:
+			goto st_case_400
+		case 401:
+			goto st_case_401
+		case 402:
+			goto st_case_402
+		case 403:
+			goto st_case_403
+		case 404:
+			goto st_case_404
+		case 405:
+			goto st_case_405
+		case 406:
+			goto st_case_406
+		case 407:
+			goto st_case_407
+		}
+		goto st_out
+	st_case_1:
+		switch data[p] {
+		case 39:
+			goto st2
+		case 67:
+			goto st80
+		case 70:
+			goto st119
+		case 73:
+			goto st173
+		case 77:
+			goto st351
+		case 101:
+			goto st379
+		case 117:
+			goto st394
+		}
+		goto st0
+	st_case_0:
+	st0:
+		cs = 0
+		goto _out
+	st2:
+		if p++; p == pe {
+			goto _test_eof2
+		}
+	st_case_2:
+		switch data[p] {
+		case 82:
+			goto st3
+		case 85:
+			goto st47
+		}
+		goto st0
+	st3:
+		if p++; p == pe {
+			goto _test_eof3
+		}
+	st_case_3:
+		if data[p] == 101 {
+			goto st4
+		}
+		goto st0
+	st4:
+		if p++; p == pe {
+			goto _test_eof4
+		}
+	st_case_4:
+		if data[p] == 102 {
+			goto st5
+		}
+		goto st0
+	st5:
+		if p++; p == pe {
+			goto _test_eof5
+		}
+	st_case_5:
+		if data[p] == 101 {
+			goto st6
+		}
+		goto st0
+	st6:
+		if p++; p == pe {
+			goto _test_eof6
+		}
+	st_case_6:
+		if data[p] == 114 {
+			goto st7
+		}
+		goto st0
+	st7:
+		if p++; p == pe {
+			goto _test_eof7
+		}
+	st_case_7:
+		if data[p] == 101 {
+			goto st8
+		}
+		goto st0
+	st8:
+		if p++; p == pe {
+			goto _test_eof8
+		}
+	st_case_8:
+		if data[p] == 110 {
+			goto st9
+		}
+		goto st0
+	st9:
+		if p++; p == pe {
+			goto _test_eof9
+		}
+	st_case_9:
+		if data[p] == 99 {
+			goto st10
+		}
+		goto st0
+	st10:
+		if p++; p == pe {
+			goto _test_eof10
+		}
+	st_case_10:
+		if data[p] == 101 {
+			goto st11
+		}
+		goto st0
+	st11:
+		if p++; p == pe {
+			goto _test_eof11
+		}
+	st_case_11:
+		if data[p] == 95 {
+			goto st12
+		}
+		goto st0
+	st12:
+		if p++; p == pe {
+			goto _test_eof12
+		}
+	st_case_12:
+		if data[p] == 99 {
+			goto st13
+		}
+		goto st0
+	st13:
+		if p++; p == pe {
+			goto _test_eof13
+		}
+	st_case_13:
+		if data[p] == 111 {
+			goto st14
+		}
+		goto st0
+	st14:
+		if p++; p == pe {
+			goto _test_eof14
+		}
+	st_case_14:
+		if data[p] == 100 {
+			goto st15
+		}
+		goto st0
+	st15:
+		if p++; p == pe {
+			goto _test_eof15
+		}
+	st_case_15:
+		if data[p] == 101 {
+			goto st16
+		}
+		goto st0
+	st16:
+		if p++; p == pe {
+			goto _test_eof16
+		}
+	st_case_16:
+		if data[p] == 39 {
+			goto st17
+		}
+		goto st0
+	st17:
+		if p++; p == pe {
+			goto _test_eof17
+		}
+	st_case_17:
+		if data[p] == 32 {
+			goto st18
+		}
+		goto st0
+	st18:
+		if p++; p == pe {
+			goto _test_eof18
+		}
+	st_case_18:
+		if data[p] == 110 {
+			goto st19
+		}
+		goto st0
+	st19:
+		if p++; p == pe {
+			goto _test_eof19
+		}
+	st_case_19:
+		if data[p] == 111 {
+			goto st20
+		}
+		goto st0
+	st20:
+		if p++; p == pe {
+			goto _test_eof20
+		}
+	st_case_20:
+		if data[p] == 116 {
+			goto st21
+		}
+		goto st0
+	st21:
+		if p++; p == pe {
+			goto _test_eof21
+		}
+	st_case_21:
+		if data[p] == 32 {
+			goto st22
+		}
+		goto st0
+	st22:
+		if p++; p == pe {
+			goto _test_eof22
+		}
+	st_case_22:
+		if data[p] == 115 {
+			goto st23
+		}
+		goto st0
+	st23:
+		if p++; p == pe {
+			goto _test_eof23
+		}
+	st_case_23:
+		if data[p] == 112 {
+			goto st24
+		}
+		goto st0
+	st24:
+		if p++; p == pe {
+			goto _test_eof24
+		}
+	st_case_24:
+		if data[p] == 101 {
+			goto st25
+		}
+		goto st0
+	st25:
+		if p++; p == pe {
+			goto _test_eof25
+		}
+	st_case_25:
+		if data[p] == 99 {
+			goto st26
+		}
+		goto st0
+	st26:
+		if p++; p == pe {
+			goto _test_eof26
+		}
+	st_case_26:
+		if data[p] == 105 {
+			goto st27
+		}
+		goto st0
+	st27:
+		if p++; p == pe {
+			goto _test_eof27
+		}
+	st_case_27:
+		if data[p] == 102 {
+			goto st28
+		}
+		goto st0
+	st28:
+		if p++; p == pe {
+			goto _test_eof28
+		}
+	st_case_28:
+		if data[p] == 105 {
+			goto st29
+		}
+		goto st0
+	st29:
+		if p++; p == pe {
+			goto _test_eof29
+		}
+	st_case_29:
+		if data[p] == 101 {
+			goto st30
+		}
+		goto st0
+	st30:
+		if p++; p == pe {
+			goto _test_eof30
+		}
+	st_case_30:
+		if data[p] == 100 {
+			goto st31
+		}
+		goto st0
+	st31:
+		if p++; p == pe {
+			goto _test_eof31
+		}
+	st_case_31:
+		if data[p] == 46 {
+			goto st32
+		}
+		goto st0
+	st32:
+		if p++; p == pe {
+			goto _test_eof32
+		}
+	st_case_32:
+		if data[p] == 32 {
+			goto st33
+		}
+		goto st0
+	st33:
+		if p++; p == pe {
+			goto _test_eof33
+		}
+	st_case_33:
+		if data[p] == 65 {
+			goto st34
+		}
+		goto st0
+	st34:
+		if p++; p == pe {
+			goto _test_eof34
+		}
+	st_case_34:
+		if data[p] == 115 {
+			goto st35
+		}
+		goto st0
+	st35:
+		if p++; p == pe {
+			goto _test_eof35
+		}
+	st_case_35:
+		if data[p] == 115 {
+			goto st36
+		}
+		goto st0
+	st36:
+		if p++; p == pe {
+			goto _test_eof36
+		}
+	st_case_36:
+		if data[p] == 117 {
+			goto st37
+		}
+		goto st0
+	st37:
+		if p++; p == pe {
+			goto _test_eof37
+		}
+	st_case_37:
+		if data[p] == 109 {
+			goto st38
+		}
+		goto st0
+	st38:
+		if p++; p == pe {
+			goto _test_eof38
+		}
+	st_case_38:
+		if data[p] == 105 {
+			goto st39
+		}
+		goto st0
+	st39:
+		if p++; p == pe {
+			goto _test_eof39
+		}
+	st_case_39:
+		if data[p] == 110 {
+			goto st40
+		}
+		goto st0
+	st40:
+		if p++; p == pe {
+			goto _test_eof40
+		}
+	st_case_40:
+		if data[p] == 103 {
+			goto st41
+		}
+		goto st0
+	st41:
+		if p++; p == pe {
+			goto _test_eof41
+		}
+	st_case_41:
+		if data[p] == 32 {
+			goto st42
+		}
+		goto st0
+	st42:
+		if p++; p == pe {
+			goto _test_eof42
+		}
+	st_case_42:
+		if data[p] == 39 {
+			goto st43
+		}
+		goto st0
+	st43:
+		if p++; p == pe {
+			goto _test_eof43
+		}
+	st_case_43:
+		if data[p] == 90 {
+			goto st44
+		}
+		goto st0
+	st44:
+		if p++; p == pe {
+			goto _test_eof44
+		}
+	st_case_44:
+		if data[p] == 80 {
+			goto st45
+		}
+		goto st0
+	st45:
+		if p++; p == pe {
+			goto _test_eof45
+		}
+	st_case_45:
+		if data[p] == 71 {
+			goto st46
+		}
+		goto st0
+	st46:
+		if p++; p == pe {
+			goto _test_eof46
+		}
+	st_case_46:
+		if data[p] == 39 {
+			goto tr53
+		}
+		goto st0
+	tr53:
+//line matcher.rl:68
+
+		agg.find(agg.current).assumeZPG = true
+		return true
+
+		goto st408
+	tr86:
+//line matcher.rl:84
+
+		agg.find(agg.current).assumeCM++
+		return true
+
+		goto st408
+	tr125:
+//line matcher.rl:79
+
+		agg.find(pop()).unknown = true
+		return true
+
+		goto st408
+	tr179:
+//line matcher.rl:49
+
+		agg.current = current()
+		return true
+
+		goto st408
+	tr221:
+//line matcher.rl:73
+
+		v, _ = strconv.Atoi(pop())
+		agg.find(agg.current).badValues += v
+		return true
+
+		goto st408
+	tr279:
+//line matcher.rl:107
+
+		agg.hold = l
+		return true
+
+		goto st408
+	tr326:
+//line matcher.rl:54
+
+		g = agg.find(current())
+		v, _ = strconv.Atoi(pop())
+		g.measurements += v
+		return true
+
+		goto st408
+	tr361:
+//line matcher.rl:61
+
+		g = agg.find(current())
+		v, _ = strconv.Atoi(pop())
+		g.predictions += v
+		return true
+
+		goto st408
+	tr389:
+//line matcher.rl:95
+
+		g = agg.find(agg.current)
+		g.missingValues = extend(g.missingValues, pop())
+		return true
+
+		goto st408
+	tr418:
+//line matcher.rl:101
+
+		g = agg.find(agg.current)
+		g.rescaleErrors = extend(g.rescaleErrors, pop())
+		return true
+
+		goto st408
+	st408:
+		if p++; p == pe {
+			goto _test_eof408
+		}
+	st_case_408:
+//line matcher.go:1406
+		goto st0
+	st47:
+		if p++; p == pe {
+			goto _test_eof47
+		}
+	st_case_47:
+		if data[p] == 110 {
+			goto st48
+		}
+		goto st0
+	st48:
+		if p++; p == pe {
+			goto _test_eof48
+		}
+	st_case_48:
+		if data[p] == 105 {
+			goto st49
+		}
+		goto st0
+	st49:
+		if p++; p == pe {
+			goto _test_eof49
+		}
+	st_case_49:
+		if data[p] == 116 {
+			goto st50
+		}
+		goto st0
+	st50:
+		if p++; p == pe {
+			goto _test_eof50
+		}
+	st_case_50:
+		if data[p] == 39 {
+			goto st51
+		}
+		goto st0
+	st51:
+		if p++; p == pe {
+			goto _test_eof51
+		}
+	st_case_51:
+		if data[p] == 32 {
+			goto st52
+		}
+		goto st0
+	st52:
+		if p++; p == pe {
+			goto _test_eof52
+		}
+	st_case_52:
+		if data[p] == 110 {
+			goto st53
+		}
+		goto st0
+	st53:
+		if p++; p == pe {
+			goto _test_eof53
+		}
+	st_case_53:
+		if data[p] == 111 {
+			goto st54
+		}
+		goto st0
+	st54:
+		if p++; p == pe {
+			goto _test_eof54
+		}
+	st_case_54:
+		if data[p] == 116 {
+			goto st55
+		}
+		goto st0
+	st55:
+		if p++; p == pe {
+			goto _test_eof55
+		}
+	st_case_55:
+		if data[p] == 32 {
+			goto st56
+		}
+		goto st0
+	st56:
+		if p++; p == pe {
+			goto _test_eof56
+		}
+	st_case_56:
+		if data[p] == 115 {
+			goto st57
+		}
+		goto st0
+	st57:
+		if p++; p == pe {
+			goto _test_eof57
+		}
+	st_case_57:
+		if data[p] == 112 {
+			goto st58
+		}
+		goto st0
+	st58:
+		if p++; p == pe {
+			goto _test_eof58
+		}
+	st_case_58:
+		if data[p] == 101 {
+			goto st59
+		}
+		goto st0
+	st59:
+		if p++; p == pe {
+			goto _test_eof59
+		}
+	st_case_59:
+		if data[p] == 99 {
+			goto st60
+		}
+		goto st0
+	st60:
+		if p++; p == pe {
+			goto _test_eof60
+		}
+	st_case_60:
+		if data[p] == 105 {
+			goto st61
+		}
+		goto st0
+	st61:
+		if p++; p == pe {
+			goto _test_eof61
+		}
+	st_case_61:
+		if data[p] == 102 {
+			goto st62
+		}
+		goto st0
+	st62:
+		if p++; p == pe {
+			goto _test_eof62
+		}
+	st_case_62:
+		if data[p] == 105 {
+			goto st63
+		}
+		goto st0
+	st63:
+		if p++; p == pe {
+			goto _test_eof63
+		}
+	st_case_63:
+		if data[p] == 101 {
+			goto st64
+		}
+		goto st0
+	st64:
+		if p++; p == pe {
+			goto _test_eof64
+		}
+	st_case_64:
+		if data[p] == 100 {
+			goto st65
+		}
+		goto st0
+	st65:
+		if p++; p == pe {
+			goto _test_eof65
+		}
+	st_case_65:
+		if data[p] == 46 {
+			goto st66
+		}
+		goto st0
+	st66:
+		if p++; p == pe {
+			goto _test_eof66
+		}
+	st_case_66:
+		if data[p] == 32 {
+			goto st67
+		}
+		goto st0
+	st67:
+		if p++; p == pe {
+			goto _test_eof67
+		}
+	st_case_67:
+		if data[p] == 65 {
+			goto st68
+		}
+		goto st0
+	st68:
+		if p++; p == pe {
+			goto _test_eof68
+		}
+	st_case_68:
+		if data[p] == 115 {
+			goto st69
+		}
+		goto st0
+	st69:
+		if p++; p == pe {
+			goto _test_eof69
+		}
+	st_case_69:
+		if data[p] == 115 {
+			goto st70
+		}
+		goto st0
+	st70:
+		if p++; p == pe {
+			goto _test_eof70
+		}
+	st_case_70:
+		if data[p] == 117 {
+			goto st71
+		}
+		goto st0
+	st71:
+		if p++; p == pe {
+			goto _test_eof71
+		}
+	st_case_71:
+		if data[p] == 109 {
+			goto st72
+		}
+		goto st0
+	st72:
+		if p++; p == pe {
+			goto _test_eof72
+		}
+	st_case_72:
+		if data[p] == 105 {
+			goto st73
+		}
+		goto st0
+	st73:
+		if p++; p == pe {
+			goto _test_eof73
+		}
+	st_case_73:
+		if data[p] == 110 {
+			goto st74
+		}
+		goto st0
+	st74:
+		if p++; p == pe {
+			goto _test_eof74
+		}
+	st_case_74:
+		if data[p] == 103 {
+			goto st75
+		}
+		goto st0
+	st75:
+		if p++; p == pe {
+			goto _test_eof75
+		}
+	st_case_75:
+		if data[p] == 32 {
+			goto st76
+		}
+		goto st0
+	st76:
+		if p++; p == pe {
+			goto _test_eof76
+		}
+	st_case_76:
+		if data[p] == 39 {
+			goto st77
+		}
+		goto st0
+	st77:
+		if p++; p == pe {
+			goto _test_eof77
+		}
+	st_case_77:
+		if data[p] == 99 {
+			goto st78
+		}
+		goto st0
+	st78:
+		if p++; p == pe {
+			goto _test_eof78
+		}
+	st_case_78:
+		if data[p] == 109 {
+			goto st79
+		}
+		goto st0
+	st79:
+		if p++; p == pe {
+			goto _test_eof79
+		}
+	st_case_79:
+		if data[p] == 39 {
+			goto tr86
+		}
+		goto st0
+	st80:
+		if p++; p == pe {
+			goto _test_eof80
+		}
+	st_case_80:
+		if data[p] == 97 {
+			goto st81
+		}
+		goto st0
+	st81:
+		if p++; p == pe {
+			goto _test_eof81
+		}
+	st_case_81:
+		if data[p] == 110 {
+			goto st82
+		}
+		goto st0
+	st82:
+		if p++; p == pe {
+			goto _test_eof82
+		}
+	st_case_82:
+		if data[p] == 110 {
+			goto st83
+		}
+		goto st0
+	st83:
+		if p++; p == pe {
+			goto _test_eof83
+		}
+	st_case_83:
+		if data[p] == 111 {
+			goto st84
+		}
+		goto st0
+	st84:
+		if p++; p == pe {
+			goto _test_eof84
+		}
+	st_case_84:
+		if data[p] == 116 {
+			goto st85
+		}
+		goto st0
+	st85:
+		if p++; p == pe {
+			goto _test_eof85
+		}
+	st_case_85:
+		if data[p] == 32 {
+			goto st86
+		}
+		goto st0
+	st86:
+		if p++; p == pe {
+			goto _test_eof86
+		}
+	st_case_86:
+		if data[p] == 102 {
+			goto st87
+		}
+		goto st0
+	st87:
+		if p++; p == pe {
+			goto _test_eof87
+		}
+	st_case_87:
+		if data[p] == 105 {
+			goto st88
+		}
+		goto st0
+	st88:
+		if p++; p == pe {
+			goto _test_eof88
+		}
+	st_case_88:
+		if data[p] == 110 {
+			goto st89
+		}
+		goto st0
+	st89:
+		if p++; p == pe {
+			goto _test_eof89
+		}
+	st_case_89:
+		if data[p] == 100 {
+			goto st90
+		}
+		goto st0
+	st90:
+		if p++; p == pe {
+			goto _test_eof90
+		}
+	st_case_90:
+		if data[p] == 32 {
+			goto st91
+		}
+		goto st0
+	st91:
+		if p++; p == pe {
+			goto _test_eof91
+		}
+	st_case_91:
+		if data[p] == 103 {
+			goto st92
+		}
+		goto st0
+	st92:
+		if p++; p == pe {
+			goto _test_eof92
+		}
+	st_case_92:
+		if data[p] == 97 {
+			goto st93
+		}
+		goto st0
+	st93:
+		if p++; p == pe {
+			goto _test_eof93
+		}
+	st_case_93:
+		if data[p] == 117 {
+			goto st94
+		}
+		goto st0
+	st94:
+		if p++; p == pe {
+			goto _test_eof94
+		}
+	st_case_94:
+		if data[p] == 103 {
+			goto st95
+		}
+		goto st0
+	st95:
+		if p++; p == pe {
+			goto _test_eof95
+		}
+	st_case_95:
+		if data[p] == 101 {
+			goto st96
+		}
+		goto st0
+	st96:
+		if p++; p == pe {
+			goto _test_eof96
+		}
+	st_case_96:
+		if data[p] == 32 {
+			goto st97
+		}
+		goto st0
+	st97:
+		if p++; p == pe {
+			goto _test_eof97
+		}
+	st_case_97:
+		if data[p] == 34 {
+			goto tr104
+		}
+		goto st0
+	tr104:
+//line matcher.rl:45
+		pos = p
+		goto st98
+	st98:
+		if p++; p == pe {
+			goto _test_eof98
+		}
+	st_case_98:
+//line matcher.go:1876
+		goto st99
+	st99:
+		if p++; p == pe {
+			goto _test_eof99
+		}
+	st_case_99:
+		goto st100
+	st100:
+		if p++; p == pe {
+			goto _test_eof100
+		}
+	st_case_100:
+		goto st101
+	st101:
+		if p++; p == pe {
+			goto _test_eof101
+		}
+	st_case_101:
+		goto st102
+	st102:
+		if p++; p == pe {
+			goto _test_eof102
+		}
+	st_case_102:
+		goto st103
+	st103:
+		if p++; p == pe {
+			goto _test_eof103
+		}
+	st_case_103:
+		goto st104
+	st104:
+		if p++; p == pe {
+			goto _test_eof104
+		}
+	st_case_104:
+		goto st105
+	st105:
+		if p++; p == pe {
+			goto _test_eof105
+		}
+	st_case_105:
+		goto st106
+	st106:
+		if p++; p == pe {
+			goto _test_eof106
+		}
+	st_case_106:
+		goto st107
+	st107:
+		if p++; p == pe {
+			goto _test_eof107
+		}
+	st_case_107:
+		goto st108
+	st108:
+		if p++; p == pe {
+			goto _test_eof108
+		}
+	st_case_108:
+		goto st109
+	st109:
+		if p++; p == pe {
+			goto _test_eof109
+		}
+	st_case_109:
+		goto st110
+	st110:
+		if p++; p == pe {
+			goto _test_eof110
+		}
+	st_case_110:
+		goto st111
+	st111:
+		if p++; p == pe {
+			goto _test_eof111
+		}
+	st_case_111:
+		goto st112
+	st112:
+		if p++; p == pe {
+			goto _test_eof112
+		}
+	st_case_112:
+		goto st113
+	st113:
+		if p++; p == pe {
+			goto _test_eof113
+		}
+	st_case_113:
+		goto st114
+	st114:
+		if p++; p == pe {
+			goto _test_eof114
+		}
+	st_case_114:
+		goto st115
+	st115:
+		if p++; p == pe {
+			goto _test_eof115
+		}
+	st_case_115:
+		goto st116
+	st116:
+		if p++; p == pe {
+			goto _test_eof116
+		}
+	st_case_116:
+		goto st117
+	st117:
+		if p++; p == pe {
+			goto _test_eof117
+		}
+	st_case_117:
+		goto tr124
+	tr124:
+//line matcher.rl:47
+		stack = append(stack, current())
+		goto st118
+	st118:
+		if p++; p == pe {
+			goto _test_eof118
+		}
+	st_case_118:
+//line matcher.go:2001
+		if data[p] == 34 {
+			goto tr125
+		}
+		goto st0
+	st119:
+		if p++; p == pe {
+			goto _test_eof119
+		}
+	st_case_119:
+		if data[p] == 111 {
+			goto st120
+		}
+		goto st0
+	st120:
+		if p++; p == pe {
+			goto _test_eof120
+		}
+	st_case_120:
+		if data[p] == 117 {
+			goto st121
+		}
+		goto st0
+	st121:
+		if p++; p == pe {
+			goto _test_eof121
+		}
+	st_case_121:
+		if data[p] == 110 {
+			goto st122
+		}
+		goto st0
+	st122:
+		if p++; p == pe {
+			goto _test_eof122
+		}
+	st_case_122:
+		if data[p] == 100 {
+			goto st123
+		}
+		goto st0
+	st123:
+		if p++; p == pe {
+			goto _test_eof123
+		}
+	st_case_123:
+		if data[p] == 32 {
+			goto st124
+		}
+		goto st0
+	st124:
+		if p++; p == pe {
+			goto _test_eof124
+		}
+	st_case_124:
+		if data[p] == 109 {
+			goto st125
+		}
+		goto st0
+	st125:
+		if p++; p == pe {
+			goto _test_eof125
+		}
+	st_case_125:
+		if data[p] == 101 {
+			goto st126
+		}
+		goto st0
+	st126:
+		if p++; p == pe {
+			goto _test_eof126
+		}
+	st_case_126:
+		if data[p] == 97 {
+			goto st127
+		}
+		goto st0
+	st127:
+		if p++; p == pe {
+			goto _test_eof127
+		}
+	st_case_127:
+		if data[p] == 115 {
+			goto st128
+		}
+		goto st0
+	st128:
+		if p++; p == pe {
+			goto _test_eof128
+		}
+	st_case_128:
+		if data[p] == 117 {
+			goto st129
+		}
+		goto st0
+	st129:
+		if p++; p == pe {
+			goto _test_eof129
+		}
+	st_case_129:
+		if data[p] == 114 {
+			goto st130
+		}
+		goto st0
+	st130:
+		if p++; p == pe {
+			goto _test_eof130
+		}
+	st_case_130:
+		if data[p] == 101 {
+			goto st131
+		}
+		goto st0
+	st131:
+		if p++; p == pe {
+			goto _test_eof131
+		}
+	st_case_131:
+		if data[p] == 109 {
+			goto st132
+		}
+		goto st0
+	st132:
+		if p++; p == pe {
+			goto _test_eof132
+		}
+	st_case_132:
+		if data[p] == 101 {
+			goto st133
+		}
+		goto st0
+	st133:
+		if p++; p == pe {
+			goto _test_eof133
+		}
+	st_case_133:
+		if data[p] == 110 {
+			goto st134
+		}
+		goto st0
+	st134:
+		if p++; p == pe {
+			goto _test_eof134
+		}
+	st_case_134:
+		if data[p] == 116 {
+			goto st135
+		}
+		goto st0
+	st135:
+		if p++; p == pe {
+			goto _test_eof135
+		}
+	st_case_135:
+		if data[p] == 115 {
+			goto st136
+		}
+		goto st0
+	st136:
+		if p++; p == pe {
+			goto _test_eof136
+		}
+	st_case_136:
+		if data[p] == 47 {
+			goto st137
+		}
+		goto st0
+	st137:
+		if p++; p == pe {
+			goto _test_eof137
+		}
+	st_case_137:
+		if data[p] == 112 {
+			goto st138
+		}
+		goto st0
+	st138:
+		if p++; p == pe {
+			goto _test_eof138
+		}
+	st_case_138:
+		if data[p] == 114 {
+			goto st139
+		}
+		goto st0
+	st139:
+		if p++; p == pe {
+			goto _test_eof139
+		}
+	st_case_139:
+		if data[p] == 101 {
+			goto st140
+		}
+		goto st0
+	st140:
+		if p++; p == pe {
+			goto _test_eof140
+		}
+	st_case_140:
+		if data[p] == 100 {
+			goto st141
+		}
+		goto st0
+	st141:
+		if p++; p == pe {
+			goto _test_eof141
+		}
+	st_case_141:
+		if data[p] == 105 {
+			goto st142
+		}
+		goto st0
+	st142:
+		if p++; p == pe {
+			goto _test_eof142
+		}
+	st_case_142:
+		if data[p] == 99 {
+			goto st143
+		}
+		goto st0
+	st143:
+		if p++; p == pe {
+			goto _test_eof143
+		}
+	st_case_143:
+		if data[p] == 116 {
+			goto st144
+		}
+		goto st0
+	st144:
+		if p++; p == pe {
+			goto _test_eof144
+		}
+	st_case_144:
+		if data[p] == 105 {
+			goto st145
+		}
+		goto st0
+	st145:
+		if p++; p == pe {
+			goto _test_eof145
+		}
+	st_case_145:
+		if data[p] == 111 {
+			goto st146
+		}
+		goto st0
+	st146:
+		if p++; p == pe {
+			goto _test_eof146
+		}
+	st_case_146:
+		if data[p] == 110 {
+			goto st147
+		}
+		goto st0
+	st147:
+		if p++; p == pe {
+			goto _test_eof147
+		}
+	st_case_147:
+		if data[p] == 115 {
+			goto st148
+		}
+		goto st0
+	st148:
+		if p++; p == pe {
+			goto _test_eof148
+		}
+	st_case_148:
+		if data[p] == 32 {
+			goto st149
+		}
+		goto st0
+	st149:
+		if p++; p == pe {
+			goto _test_eof149
+		}
+	st_case_149:
+		if data[p] == 102 {
+			goto st150
+		}
+		goto st0
+	st150:
+		if p++; p == pe {
+			goto _test_eof150
+		}
+	st_case_150:
+		if data[p] == 111 {
+			goto st151
+		}
+		goto st0
+	st151:
+		if p++; p == pe {
+			goto _test_eof151
+		}
+	st_case_151:
+		if data[p] == 114 {
+			goto st152
+		}
+		goto st0
+	st152:
+		if p++; p == pe {
+			goto _test_eof152
+		}
+	st_case_152:
+		if data[p] == 32 {
+			goto tr159
+		}
+		goto st0
+	tr159:
+//line matcher.rl:45
+		pos = p
+		goto st153
+	st153:
+		if p++; p == pe {
+			goto _test_eof153
+		}
+	st_case_153:
+//line matcher.go:2321
+		goto st154
+	st154:
+		if p++; p == pe {
+			goto _test_eof154
+		}
+	st_case_154:
+		goto st155
+	st155:
+		if p++; p == pe {
+			goto _test_eof155
+		}
+	st_case_155:
+		goto st156
+	st156:
+		if p++; p == pe {
+			goto _test_eof156
+		}
+	st_case_156:
+		goto st157
+	st157:
+		if p++; p == pe {
+			goto _test_eof157
+		}
+	st_case_157:
+		goto st158
+	st158:
+		if p++; p == pe {
+			goto _test_eof158
+		}
+	st_case_158:
+		goto st159
+	st159:
+		if p++; p == pe {
+			goto _test_eof159
+		}
+	st_case_159:
+		goto st160
+	st160:
+		if p++; p == pe {
+			goto _test_eof160
+		}
+	st_case_160:
+		goto st161
+	st161:
+		if p++; p == pe {
+			goto _test_eof161
+		}
+	st_case_161:
+		goto st162
+	st162:
+		if p++; p == pe {
+			goto _test_eof162
+		}
+	st_case_162:
+		goto st163
+	st163:
+		if p++; p == pe {
+			goto _test_eof163
+		}
+	st_case_163:
+		goto st164
+	st164:
+		if p++; p == pe {
+			goto _test_eof164
+		}
+	st_case_164:
+		goto st165
+	st165:
+		if p++; p == pe {
+			goto _test_eof165
+		}
+	st_case_165:
+		goto st166
+	st166:
+		if p++; p == pe {
+			goto _test_eof166
+		}
+	st_case_166:
+		goto st167
+	st167:
+		if p++; p == pe {
+			goto _test_eof167
+		}
+	st_case_167:
+		goto st168
+	st168:
+		if p++; p == pe {
+			goto _test_eof168
+		}
+	st_case_168:
+		goto st169
+	st169:
+		if p++; p == pe {
+			goto _test_eof169
+		}
+	st_case_169:
+		goto st170
+	st170:
+		if p++; p == pe {
+			goto _test_eof170
+		}
+	st_case_170:
+		goto st171
+	st171:
+		if p++; p == pe {
+			goto _test_eof171
+		}
+	st_case_171:
+		goto st172
+	st172:
+		if p++; p == pe {
+			goto _test_eof172
+		}
+	st_case_172:
+		goto tr179
+	st173:
+		if p++; p == pe {
+			goto _test_eof173
+		}
+	st_case_173:
+		switch data[p] {
+		case 103:
+			goto st174
+		case 109:
+			goto st238
+		case 110:
+			goto st270
+		}
+		goto st0
+	st174:
+		if p++; p == pe {
+			goto _test_eof174
+		}
+	st_case_174:
+		if data[p] == 110 {
+			goto st175
+		}
+		goto st0
+	st175:
+		if p++; p == pe {
+			goto _test_eof175
+		}
+	st_case_175:
+		if data[p] == 111 {
+			goto st176
+		}
+		goto st0
+	st176:
+		if p++; p == pe {
+			goto _test_eof176
+		}
+	st_case_176:
+		if data[p] == 114 {
+			goto st177
+		}
+		goto st0
+	st177:
+		if p++; p == pe {
+			goto _test_eof177
+		}
+	st_case_177:
+		if data[p] == 101 {
+			goto st178
+		}
+		goto st0
+	st178:
+		if p++; p == pe {
+			goto _test_eof178
+		}
+	st_case_178:
+		if data[p] == 100 {
+			goto st179
+		}
+		goto st0
+	st179:
+		if p++; p == pe {
+			goto _test_eof179
+		}
+	st_case_179:
+		if data[p] == 32 {
+			goto tr188
+		}
+		goto st0
+	tr188:
+//line matcher.rl:45
+		pos = p
+		goto st180
+	st180:
+		if p++; p == pe {
+			goto _test_eof180
+		}
+	st_case_180:
+//line matcher.go:2514
+		if data[p] == 109 {
+			goto st212
+		}
+		if 48 <= data[p] && data[p] <= 57 {
+			goto tr189
+		}
+		goto st0
+	tr189:
+//line matcher.rl:47
+		stack = append(stack, current())
+		goto st181
+	st181:
+		if p++; p == pe {
+			goto _test_eof181
+		}
+	st_case_181:
+//line matcher.go:2531
+		if data[p] == 32 {
+			goto st182
+		}
+		if 48 <= data[p] && data[p] <= 57 {
+			goto tr189
+		}
+		goto st0
+	st182:
+		if p++; p == pe {
+			goto _test_eof182
+		}
+	st_case_182:
+		if data[p] == 109 {
+			goto st183
+		}
+		goto st0
+	st183:
+		if p++; p == pe {
+			goto _test_eof183
+		}
+	st_case_183:
+		if data[p] == 101 {
+			goto st184
+		}
+		goto st0
+	st184:
+		if p++; p == pe {
+			goto _test_eof184
+		}
+	st_case_184:
+		if data[p] == 97 {
+			goto st185
+		}
+		goto st0
+	st185:
+		if p++; p == pe {
+			goto _test_eof185
+		}
+	st_case_185:
+		if data[p] == 115 {
+			goto st186
+		}
+		goto st0
+	st186:
+		if p++; p == pe {
+			goto _test_eof186
+		}
+	st_case_186:
+		if data[p] == 117 {
+			goto st187
+		}
+		goto st0
+	st187:
+		if p++; p == pe {
+			goto _test_eof187
+		}
+	st_case_187:
+		if data[p] == 114 {
+			goto st188
+		}
+		goto st0
+	st188:
+		if p++; p == pe {
+			goto _test_eof188
+		}
+	st_case_188:
+		if data[p] == 101 {
+			goto st189
+		}
+		goto st0
+	st189:
+		if p++; p == pe {
+			goto _test_eof189
+		}
+	st_case_189:
+		if data[p] == 109 {
+			goto st190
+		}
+		goto st0
+	st190:
+		if p++; p == pe {
+			goto _test_eof190
+		}
+	st_case_190:
+		if data[p] == 101 {
+			goto st191
+		}
+		goto st0
+	st191:
+		if p++; p == pe {
+			goto _test_eof191
+		}
+	st_case_191:
+		if data[p] == 110 {
+			goto st192
+		}
+		goto st0
+	st192:
+		if p++; p == pe {
+			goto _test_eof192
+		}
+	st_case_192:
+		if data[p] == 116 {
+			goto st193
+		}
+		goto st0
+	st193:
+		if p++; p == pe {
+			goto _test_eof193
+		}
+	st_case_193:
+		if data[p] == 115 {
+			goto st194
+		}
+		goto st0
+	st194:
+		if p++; p == pe {
+			goto _test_eof194
+		}
+	st_case_194:
+		if data[p] == 32 {
+			goto st195
+		}
+		goto st0
+	st195:
+		if p++; p == pe {
+			goto _test_eof195
+		}
+	st_case_195:
+		if data[p] == 119 {
+			goto st196
+		}
+		goto st0
+	st196:
+		if p++; p == pe {
+			goto _test_eof196
+		}
+	st_case_196:
+		if data[p] == 105 {
+			goto st197
+		}
+		goto st0
+	st197:
+		if p++; p == pe {
+			goto _test_eof197
+		}
+	st_case_197:
+		if data[p] == 116 {
+			goto st198
+		}
+		goto st0
+	st198:
+		if p++; p == pe {
+			goto _test_eof198
+		}
+	st_case_198:
+		if data[p] == 104 {
+			goto st199
+		}
+		goto st0
+	st199:
+		if p++; p == pe {
+			goto _test_eof199
+		}
+	st_case_199:
+		if data[p] == 32 {
+			goto st200
+		}
+		goto st0
+	st200:
+		if p++; p == pe {
+			goto _test_eof200
+		}
+	st_case_200:
+		if data[p] == 118 {
+			goto st201
+		}
+		goto st0
+	st201:
+		if p++; p == pe {
+			goto _test_eof201
+		}
+	st_case_201:
+		if data[p] == 97 {
+			goto st202
+		}
+		goto st0
+	st202:
+		if p++; p == pe {
+			goto _test_eof202
+		}
+	st_case_202:
+		if data[p] == 108 {
+			goto st203
+		}
+		goto st0
+	st203:
+		if p++; p == pe {
+			goto _test_eof203
+		}
+	st_case_203:
+		if data[p] == 117 {
+			goto st204
+		}
+		goto st0
+	st204:
+		if p++; p == pe {
+			goto _test_eof204
+		}
+	st_case_204:
+		if data[p] == 101 {
+			goto st205
+		}
+		goto st0
+	st205:
+		if p++; p == pe {
+			goto _test_eof205
+		}
+	st_case_205:
+		if data[p] == 32 {
+			goto st206
+		}
+		goto st0
+	st206:
+		if p++; p == pe {
+			goto _test_eof206
+		}
+	st_case_206:
+		if data[p] == 45 {
+			goto st207
+		}
+		goto st0
+	st207:
+		if p++; p == pe {
+			goto _test_eof207
+		}
+	st_case_207:
+		if data[p] == 57 {
+			goto st208
+		}
+		goto st0
+	st208:
+		if p++; p == pe {
+			goto _test_eof208
+		}
+	st_case_208:
+		if data[p] == 57 {
+			goto st209
+		}
+		goto st0
+	st209:
+		if p++; p == pe {
+			goto _test_eof209
+		}
+	st_case_209:
+		if data[p] == 57 {
+			goto st210
+		}
+		goto st0
+	st210:
+		if p++; p == pe {
+			goto _test_eof210
+		}
+	st_case_210:
+		if data[p] == 57 {
+			goto st211
+		}
+		goto st0
+	st211:
+		if p++; p == pe {
+			goto _test_eof211
+		}
+	st_case_211:
+		if data[p] == 57 {
+			goto tr221
+		}
+		goto st0
+	st212:
+		if p++; p == pe {
+			goto _test_eof212
+		}
+	st_case_212:
+		if data[p] == 101 {
+			goto st213
+		}
+		goto st0
+	st213:
+		if p++; p == pe {
+			goto _test_eof213
+		}
+	st_case_213:
+		if data[p] == 115 {
+			goto st214
+		}
+		goto st0
+	st214:
+		if p++; p == pe {
+			goto _test_eof214
+		}
+	st_case_214:
+		if data[p] == 115 {
+			goto st215
+		}
+		goto st0
+	st215:
+		if p++; p == pe {
+			goto _test_eof215
+		}
+	st_case_215:
+		if data[p] == 97 {
+			goto st216
+		}
+		goto st0
+	st216:
+		if p++; p == pe {
+			goto _test_eof216
+		}
+	st_case_216:
+		if data[p] == 103 {
+			goto st217
+		}
+		goto st0
+	st217:
+		if p++; p == pe {
+			goto _test_eof217
+		}
+	st_case_217:
+		if data[p] == 101 {
+			goto st218
+		}
+		goto st0
+	st218:
+		if p++; p == pe {
+			goto _test_eof218
+		}
+	st_case_218:
+		if data[p] == 32 {
+			goto st219
+		}
+		goto st0
+	st219:
+		if p++; p == pe {
+			goto _test_eof219
+		}
+	st_case_219:
+		if data[p] == 119 {
+			goto st220
+		}
+		goto st0
+	st220:
+		if p++; p == pe {
+			goto _test_eof220
+		}
+	st_case_220:
+		if data[p] == 105 {
+			goto st221
+		}
+		goto st0
+	st221:
+		if p++; p == pe {
+			goto _test_eof221
+		}
+	st_case_221:
+		if data[p] == 116 {
+			goto st222
+		}
+		goto st0
+	st222:
+		if p++; p == pe {
+			goto _test_eof222
+		}
+	st_case_222:
+		if data[p] == 104 {
+			goto st223
+		}
+		goto st0
+	st223:
+		if p++; p == pe {
+			goto _test_eof223
+		}
+	st_case_223:
+		if data[p] == 32 {
+			goto st224
+		}
+		goto st0
+	st224:
+		if p++; p == pe {
+			goto _test_eof224
+		}
+	st_case_224:
+		if data[p] == 109 {
+			goto st225
+		}
+		goto st0
+	st225:
+		if p++; p == pe {
+			goto _test_eof225
+		}
+	st_case_225:
+		if data[p] == 101 {
+			goto st226
+		}
+		goto st0
+	st226:
+		if p++; p == pe {
+			goto _test_eof226
+		}
+	st_case_226:
+		if data[p] == 97 {
+			goto st227
+		}
+		goto st0
+	st227:
+		if p++; p == pe {
+			goto _test_eof227
+		}
+	st_case_227:
+		if data[p] == 115 {
+			goto st228
+		}
+		goto st0
+	st228:
+		if p++; p == pe {
+			goto _test_eof228
+		}
+	st_case_228:
+		if data[p] == 117 {
+			goto st229
+		}
+		goto st0
+	st229:
+		if p++; p == pe {
+			goto _test_eof229
+		}
+	st_case_229:
+		if data[p] == 114 {
+			goto st230
+		}
+		goto st0
+	st230:
+		if p++; p == pe {
+			goto _test_eof230
+		}
+	st_case_230:
+		if data[p] == 101 {
+			goto st231
+		}
+		goto st0
+	st231:
+		if p++; p == pe {
+			goto _test_eof231
+		}
+	st_case_231:
+		if data[p] == 95 {
+			goto st232
+		}
+		goto st0
+	st232:
+		if p++; p == pe {
+			goto _test_eof232
+		}
+	st_case_232:
+		if data[p] == 99 {
+			goto st233
+		}
+		goto st0
+	st233:
+		if p++; p == pe {
+			goto _test_eof233
+		}
+	st_case_233:
+		if data[p] == 111 {
+			goto st234
+		}
+		goto st0
+	st234:
+		if p++; p == pe {
+			goto _test_eof234
+		}
+	st_case_234:
+		if data[p] == 100 {
+			goto st235
+		}
+		goto st0
+	st235:
+		if p++; p == pe {
+			goto _test_eof235
+		}
+	st_case_235:
+		if data[p] == 101 {
+			goto st236
+		}
+		goto st0
+	st236:
+		if p++; p == pe {
+			goto _test_eof236
+		}
+	st_case_236:
+		if data[p] == 32 {
+			goto tr246
+		}
+		goto st0
+	tr246:
+//line matcher.rl:45
+		pos = p
+		goto st237
+	st237:
+		if p++; p == pe {
+			goto _test_eof237
+		}
+	st_case_237:
+//line matcher.go:3043
+		goto tr247
+	tr247:
+//line matcher.rl:89
+
+		g = agg.find(agg.current)
+		g.ignMeasCodes = extend(g.ignMeasCodes, current())
+		return true
+
+		goto st409
+	st409:
+		if p++; p == pe {
+			goto _test_eof409
+		}
+	st_case_409:
+//line matcher.go:3058
+		goto tr247
+	st238:
+		if p++; p == pe {
+			goto _test_eof238
+		}
+	st_case_238:
+		if data[p] == 112 {
+			goto st239
+		}
+		goto st0
+	st239:
+		if p++; p == pe {
+			goto _test_eof239
+		}
+	st_case_239:
+		if data[p] == 111 {
+			goto st240
+		}
+		goto st0
+	st240:
+		if p++; p == pe {
+			goto _test_eof240
+		}
+	st_case_240:
+		if data[p] == 114 {
+			goto st241
+		}
+		goto st0
+	st241:
+		if p++; p == pe {
+			goto _test_eof241
+		}
+	st_case_241:
+		if data[p] == 116 {
+			goto st242
+		}
+		goto st0
+	st242:
+		if p++; p == pe {
+			goto _test_eof242
+		}
+	st_case_242:
+		if data[p] == 105 {
+			goto st243
+		}
+		goto st0
+	st243:
+		if p++; p == pe {
+			goto _test_eof243
+		}
+	st_case_243:
+		if data[p] == 110 {
+			goto st244
+		}
+		goto st0
+	st244:
+		if p++; p == pe {
+			goto _test_eof244
+		}
+	st_case_244:
+		if data[p] == 103 {
+			goto st245
+		}
+		goto st0
+	st245:
+		if p++; p == pe {
+			goto _test_eof245
+		}
+	st_case_245:
+		if data[p] == 32 {
+			goto st246
+		}
+		goto st0
+	st246:
+		if p++; p == pe {
+			goto _test_eof246
+		}
+	st_case_246:
+		if data[p] == 103 {
+			goto st247
+		}
+		goto st0
+	st247:
+		if p++; p == pe {
+			goto _test_eof247
+		}
+	st_case_247:
+		if data[p] == 97 {
+			goto st248
+		}
+		goto st0
+	st248:
+		if p++; p == pe {
+			goto _test_eof248
+		}
+	st_case_248:
+		if data[p] == 117 {
+			goto st249
+		}
+		goto st0
+	st249:
+		if p++; p == pe {
+			goto _test_eof249
+		}
+	st_case_249:
+		if data[p] == 103 {
+			goto st250
+		}
+		goto st0
+	st250:
+		if p++; p == pe {
+			goto _test_eof250
+		}
+	st_case_250:
+		if data[p] == 101 {
+			goto st251
+		}
+		goto st0
+	st251:
+		if p++; p == pe {
+			goto _test_eof251
+		}
+	st_case_251:
+		if data[p] == 32 {
+			goto st252
+		}
+		goto st0
+	st252:
+		if p++; p == pe {
+			goto _test_eof252
+		}
+	st_case_252:
+		if data[p] == 109 {
+			goto st253
+		}
+		goto st0
+	st253:
+		if p++; p == pe {
+			goto _test_eof253
+		}
+	st_case_253:
+		if data[p] == 101 {
+			goto st254
+		}
+		goto st0
+	st254:
+		if p++; p == pe {
+			goto _test_eof254
+		}
+	st_case_254:
+		if data[p] == 97 {
+			goto st255
+		}
+		goto st0
+	st255:
+		if p++; p == pe {
+			goto _test_eof255
+		}
+	st_case_255:
+		if data[p] == 115 {
+			goto st256
+		}
+		goto st0
+	st256:
+		if p++; p == pe {
+			goto _test_eof256
+		}
+	st_case_256:
+		if data[p] == 117 {
+			goto st257
+		}
+		goto st0
+	st257:
+		if p++; p == pe {
+			goto _test_eof257
+		}
+	st_case_257:
+		if data[p] == 114 {
+			goto st258
+		}
+		goto st0
+	st258:
+		if p++; p == pe {
+			goto _test_eof258
+		}
+	st_case_258:
+		if data[p] == 101 {
+			goto st259
+		}
+		goto st0
+	st259:
+		if p++; p == pe {
+			goto _test_eof259
+		}
+	st_case_259:
+		if data[p] == 109 {
+			goto st260
+		}
+		goto st0
+	st260:
+		if p++; p == pe {
+			goto _test_eof260
+		}
+	st_case_260:
+		if data[p] == 101 {
+			goto st261
+		}
+		goto st0
+	st261:
+		if p++; p == pe {
+			goto _test_eof261
+		}
+	st_case_261:
+		if data[p] == 110 {
+			goto st262
+		}
+		goto st0
+	st262:
+		if p++; p == pe {
+			goto _test_eof262
+		}
+	st_case_262:
+		if data[p] == 116 {
+			goto st263
+		}
+		goto st0
+	st263:
+		if p++; p == pe {
+			goto _test_eof263
+		}
+	st_case_263:
+		if data[p] == 115 {
+			goto st264
+		}
+		goto st0
+	st264:
+		if p++; p == pe {
+			goto _test_eof264
+		}
+	st_case_264:
+		if data[p] == 32 {
+			goto st265
+		}
+		goto st0
+	st265:
+		if p++; p == pe {
+			goto _test_eof265
+		}
+	st_case_265:
+		if data[p] == 116 {
+			goto st266
+		}
+		goto st0
+	st266:
+		if p++; p == pe {
+			goto _test_eof266
+		}
+	st_case_266:
+		if data[p] == 111 {
+			goto st267
+		}
+		goto st0
+	st267:
+		if p++; p == pe {
+			goto _test_eof267
+		}
+	st_case_267:
+		if data[p] == 111 {
+			goto st268
+		}
+		goto st0
+	st268:
+		if p++; p == pe {
+			goto _test_eof268
+		}
+	st_case_268:
+		if data[p] == 107 {
+			goto st269
+		}
+		goto st0
+	st269:
+		if p++; p == pe {
+			goto _test_eof269
+		}
+	st_case_269:
+		if data[p] == 32 {
+			goto tr279
+		}
+		goto st0
+	st270:
+		if p++; p == pe {
+			goto _test_eof270
+		}
+	st_case_270:
+		if data[p] == 115 {
+			goto st271
+		}
+		goto st0
+	st271:
+		if p++; p == pe {
+			goto _test_eof271
+		}
+	st_case_271:
+		if data[p] == 101 {
+			goto st272
+		}
+		goto st0
+	st272:
+		if p++; p == pe {
+			goto _test_eof272
+		}
+	st_case_272:
+		if data[p] == 114 {
+			goto st273
+		}
+		goto st0
+	st273:
+		if p++; p == pe {
+			goto _test_eof273
+		}
+	st_case_273:
+		if data[p] == 116 {
+			goto st274
+		}
+		goto st0
+	st274:
+		if p++; p == pe {
+			goto _test_eof274
+		}
+	st_case_274:
+		if data[p] == 101 {
+			goto st275
+		}
+		goto st0
+	st275:
+		if p++; p == pe {
+			goto _test_eof275
+		}
+	st_case_275:
+		if data[p] == 100 {
+			goto st276
+		}
+		goto st0
+	st276:
+		if p++; p == pe {
+			goto _test_eof276
+		}
+	st_case_276:
+		if data[p] == 32 {
+			goto tr286
+		}
+		goto st0
+	tr286:
+//line matcher.rl:45
+		pos = p
+		goto st277
+	st277:
+		if p++; p == pe {
+			goto _test_eof277
+		}
+	st_case_277:
+//line matcher.go:3420
+		if 48 <= data[p] && data[p] <= 57 {
+			goto tr287
+		}
+		goto st0
+	tr287:
+//line matcher.rl:47
+		stack = append(stack, current())
+		goto st278
+	st278:
+		if p++; p == pe {
+			goto _test_eof278
+		}
+	st_case_278:
+//line matcher.go:3434
+		if data[p] == 32 {
+			goto st279
+		}
+		if 48 <= data[p] && data[p] <= 57 {
+			goto tr287
+		}
+		goto st0
+	st279:
+		if p++; p == pe {
+			goto _test_eof279
+		}
+	st_case_279:
+		switch data[p] {
+		case 109:
+			goto st280
+		case 112:
+			goto st316
+		}
+		goto st0
+	st280:
+		if p++; p == pe {
+			goto _test_eof280
+		}
+	st_case_280:
+		if data[p] == 101 {
+			goto st281
+		}
+		goto st0
+	st281:
+		if p++; p == pe {
+			goto _test_eof281
+		}
+	st_case_281:
+		if data[p] == 97 {
+			goto st282
+		}
+		goto st0
+	st282:
+		if p++; p == pe {
+			goto _test_eof282
+		}
+	st_case_282:
+		if data[p] == 115 {
+			goto st283
+		}
+		goto st0
+	st283:
+		if p++; p == pe {
+			goto _test_eof283
+		}
+	st_case_283:
+		if data[p] == 117 {
+			goto st284
+		}
+		goto st0
+	st284:
+		if p++; p == pe {
+			goto _test_eof284
+		}
+	st_case_284:
+		if data[p] == 114 {
+			goto st285
+		}
+		goto st0
+	st285:
+		if p++; p == pe {
+			goto _test_eof285
+		}
+	st_case_285:
+		if data[p] == 101 {
+			goto st286
+		}
+		goto st0
+	st286:
+		if p++; p == pe {
+			goto _test_eof286
+		}
+	st_case_286:
+		if data[p] == 109 {
+			goto st287
+		}
+		goto st0
+	st287:
+		if p++; p == pe {
+			goto _test_eof287
+		}
+	st_case_287:
+		if data[p] == 101 {
+			goto st288
+		}
+		goto st0
+	st288:
+		if p++; p == pe {
+			goto _test_eof288
+		}
+	st_case_288:
+		if data[p] == 110 {
+			goto st289
+		}
+		goto st0
+	st289:
+		if p++; p == pe {
+			goto _test_eof289
+		}
+	st_case_289:
+		if data[p] == 116 {
+			goto st290
+		}
+		goto st0
+	st290:
+		if p++; p == pe {
+			goto _test_eof290
+		}
+	st_case_290:
+		if data[p] == 115 {
+			goto st291
+		}
+		goto st0
+	st291:
+		if p++; p == pe {
+			goto _test_eof291
+		}
+	st_case_291:
+		if data[p] == 32 {
+			goto st292
+		}
+		goto st0
+	st292:
+		if p++; p == pe {
+			goto _test_eof292
+		}
+	st_case_292:
+		if data[p] == 102 {
+			goto st293
+		}
+		goto st0
+	st293:
+		if p++; p == pe {
+			goto _test_eof293
+		}
+	st_case_293:
+		if data[p] == 111 {
+			goto st294
+		}
+		goto st0
+	st294:
+		if p++; p == pe {
+			goto _test_eof294
+		}
+	st_case_294:
+		if data[p] == 114 {
+			goto st295
+		}
+		goto st0
+	st295:
+		if p++; p == pe {
+			goto _test_eof295
+		}
+	st_case_295:
+		if data[p] == 32 {
+			goto tr306
+		}
+		goto st0
+	tr306:
+//line matcher.rl:45
+		pos = p
+		goto st296
+	st296:
+		if p++; p == pe {
+			goto _test_eof296
+		}
+	st_case_296:
+//line matcher.go:3607
+		goto st297
+	st297:
+		if p++; p == pe {
+			goto _test_eof297
+		}
+	st_case_297:
+		goto st298
+	st298:
+		if p++; p == pe {
+			goto _test_eof298
+		}
+	st_case_298:
+		goto st299
+	st299:
+		if p++; p == pe {
+			goto _test_eof299
+		}
+	st_case_299:
+		goto st300
+	st300:
+		if p++; p == pe {
+			goto _test_eof300
+		}
+	st_case_300:
+		goto st301
+	st301:
+		if p++; p == pe {
+			goto _test_eof301
+		}
+	st_case_301:
+		goto st302
+	st302:
+		if p++; p == pe {
+			goto _test_eof302
+		}
+	st_case_302:
+		goto st303
+	st303:
+		if p++; p == pe {
+			goto _test_eof303
+		}
+	st_case_303:
+		goto st304
+	st304:
+		if p++; p == pe {
+			goto _test_eof304
+		}
+	st_case_304:
+		goto st305
+	st305:
+		if p++; p == pe {
+			goto _test_eof305
+		}
+	st_case_305:
+		goto st306
+	st306:
+		if p++; p == pe {
+			goto _test_eof306
+		}
+	st_case_306:
+		goto st307
+	st307:
+		if p++; p == pe {
+			goto _test_eof307
+		}
+	st_case_307:
+		goto st308
+	st308:
+		if p++; p == pe {
+			goto _test_eof308
+		}
+	st_case_308:
+		goto st309
+	st309:
+		if p++; p == pe {
+			goto _test_eof309
+		}
+	st_case_309:
+		goto st310
+	st310:
+		if p++; p == pe {
+			goto _test_eof310
+		}
+	st_case_310:
+		goto st311
+	st311:
+		if p++; p == pe {
+			goto _test_eof311
+		}
+	st_case_311:
+		goto st312
+	st312:
+		if p++; p == pe {
+			goto _test_eof312
+		}
+	st_case_312:
+		goto st313
+	st313:
+		if p++; p == pe {
+			goto _test_eof313
+		}
+	st_case_313:
+		goto st314
+	st314:
+		if p++; p == pe {
+			goto _test_eof314
+		}
+	st_case_314:
+		goto st315
+	st315:
+		if p++; p == pe {
+			goto _test_eof315
+		}
+	st_case_315:
+		goto tr326
+	st316:
+		if p++; p == pe {
+			goto _test_eof316
+		}
+	st_case_316:
+		if data[p] == 114 {
+			goto st317
+		}
+		goto st0
+	st317:
+		if p++; p == pe {
+			goto _test_eof317
+		}
+	st_case_317:
+		if data[p] == 101 {
+			goto st318
+		}
+		goto st0
+	st318:
+		if p++; p == pe {
+			goto _test_eof318
+		}
+	st_case_318:
+		if data[p] == 100 {
+			goto st319
+		}
+		goto st0
+	st319:
+		if p++; p == pe {
+			goto _test_eof319
+		}
+	st_case_319:
+		if data[p] == 105 {
+			goto st320
+		}
+		goto st0
+	st320:
+		if p++; p == pe {
+			goto _test_eof320
+		}
+	st_case_320:
+		if data[p] == 99 {
+			goto st321
+		}
+		goto st0
+	st321:
+		if p++; p == pe {
+			goto _test_eof321
+		}
+	st_case_321:
+		if data[p] == 116 {
+			goto st322
+		}
+		goto st0
+	st322:
+		if p++; p == pe {
+			goto _test_eof322
+		}
+	st_case_322:
+		if data[p] == 105 {
+			goto st323
+		}
+		goto st0
+	st323:
+		if p++; p == pe {
+			goto _test_eof323
+		}
+	st_case_323:
+		if data[p] == 111 {
+			goto st324
+		}
+		goto st0
+	st324:
+		if p++; p == pe {
+			goto _test_eof324
+		}
+	st_case_324:
+		if data[p] == 110 {
+			goto st325
+		}
+		goto st0
+	st325:
+		if p++; p == pe {
+			goto _test_eof325
+		}
+	st_case_325:
+		if data[p] == 115 {
+			goto st326
+		}
+		goto st0
+	st326:
+		if p++; p == pe {
+			goto _test_eof326
+		}
+	st_case_326:
+		if data[p] == 32 {
+			goto st327
+		}
+		goto st0
+	st327:
+		if p++; p == pe {
+			goto _test_eof327
+		}
+	st_case_327:
+		if data[p] == 102 {
+			goto st328
+		}
+		goto st0
+	st328:
+		if p++; p == pe {
+			goto _test_eof328
+		}
+	st_case_328:
+		if data[p] == 111 {
+			goto st329
+		}
+		goto st0
+	st329:
+		if p++; p == pe {
+			goto _test_eof329
+		}
+	st_case_329:
+		if data[p] == 114 {
+			goto st330
+		}
+		goto st0
+	st330:
+		if p++; p == pe {
+			goto _test_eof330
+		}
+	st_case_330:
+		if data[p] == 32 {
+			goto tr341
+		}
+		goto st0
+	tr341:
+//line matcher.rl:45
+		pos = p
+		goto st331
+	st331:
+		if p++; p == pe {
+			goto _test_eof331
+		}
+	st_case_331:
+//line matcher.go:3867
+		goto st332
+	st332:
+		if p++; p == pe {
+			goto _test_eof332
+		}
+	st_case_332:
+		goto st333
+	st333:
+		if p++; p == pe {
+			goto _test_eof333
+		}
+	st_case_333:
+		goto st334
+	st334:
+		if p++; p == pe {
+			goto _test_eof334
+		}
+	st_case_334:
+		goto st335
+	st335:
+		if p++; p == pe {
+			goto _test_eof335
+		}
+	st_case_335:
+		goto st336
+	st336:
+		if p++; p == pe {
+			goto _test_eof336
+		}
+	st_case_336:
+		goto st337
+	st337:
+		if p++; p == pe {
+			goto _test_eof337
+		}
+	st_case_337:
+		goto st338
+	st338:
+		if p++; p == pe {
+			goto _test_eof338
+		}
+	st_case_338:
+		goto st339
+	st339:
+		if p++; p == pe {
+			goto _test_eof339
+		}
+	st_case_339:
+		goto st340
+	st340:
+		if p++; p == pe {
+			goto _test_eof340
+		}
+	st_case_340:
+		goto st341
+	st341:
+		if p++; p == pe {
+			goto _test_eof341
+		}
+	st_case_341:
+		goto st342
+	st342:
+		if p++; p == pe {
+			goto _test_eof342
+		}
+	st_case_342:
+		goto st343
+	st343:
+		if p++; p == pe {
+			goto _test_eof343
+		}
+	st_case_343:
+		goto st344
+	st344:
+		if p++; p == pe {
+			goto _test_eof344
+		}
+	st_case_344:
+		goto st345
+	st345:
+		if p++; p == pe {
+			goto _test_eof345
+		}
+	st_case_345:
+		goto st346
+	st346:
+		if p++; p == pe {
+			goto _test_eof346
+		}
+	st_case_346:
+		goto st347
+	st347:
+		if p++; p == pe {
+			goto _test_eof347
+		}
+	st_case_347:
+		goto st348
+	st348:
+		if p++; p == pe {
+			goto _test_eof348
+		}
+	st_case_348:
+		goto st349
+	st349:
+		if p++; p == pe {
+			goto _test_eof349
+		}
+	st_case_349:
+		goto st350
+	st350:
+		if p++; p == pe {
+			goto _test_eof350
+		}
+	st_case_350:
+		goto tr361
+	st351:
+		if p++; p == pe {
+			goto _test_eof351
+		}
+	st_case_351:
+		if data[p] == 105 {
+			goto st352
+		}
+		goto st0
+	st352:
+		if p++; p == pe {
+			goto _test_eof352
+		}
+	st_case_352:
+		if data[p] == 115 {
+			goto st353
+		}
+		goto st0
+	st353:
+		if p++; p == pe {
+			goto _test_eof353
+		}
+	st_case_353:
+		if data[p] == 115 {
+			goto st354
+		}
+		goto st0
+	st354:
+		if p++; p == pe {
+			goto _test_eof354
+		}
+	st_case_354:
+		if data[p] == 105 {
+			goto st355
+		}
+		goto st0
+	st355:
+		if p++; p == pe {
+			goto _test_eof355
+		}
+	st_case_355:
+		if data[p] == 110 {
+			goto st356
+		}
+		goto st0
+	st356:
+		if p++; p == pe {
+			goto _test_eof356
+		}
+	st_case_356:
+		if data[p] == 103 {
+			goto st357
+		}
+		goto st0
+	st357:
+		if p++; p == pe {
+			goto _test_eof357
+		}
+	st_case_357:
+		if data[p] == 32 {
+			goto st358
+		}
+		goto st0
+	st358:
+		if p++; p == pe {
+			goto _test_eof358
+		}
+	st_case_358:
+		if data[p] == 109 {
+			goto st359
+		}
+		goto st0
+	st359:
+		if p++; p == pe {
+			goto _test_eof359
+		}
+	st_case_359:
+		if data[p] == 97 {
+			goto st360
+		}
+		goto st0
+	st360:
+		if p++; p == pe {
+			goto _test_eof360
+		}
+	st_case_360:
+		if data[p] == 110 {
+			goto st361
+		}
+		goto st0
+	st361:
+		if p++; p == pe {
+			goto _test_eof361
+		}
+	st_case_361:
+		if data[p] == 100 {
+			goto st362
+		}
+		goto st0
+	st362:
+		if p++; p == pe {
+			goto _test_eof362
+		}
+	st_case_362:
+		if data[p] == 97 {
+			goto st363
+		}
+		goto st0
+	st363:
+		if p++; p == pe {
+			goto _test_eof363
+		}
+	st_case_363:
+		if data[p] == 116 {
+			goto st364
+		}
+		goto st0
+	st364:
+		if p++; p == pe {
+			goto _test_eof364
+		}
+	st_case_364:
+		if data[p] == 111 {
+			goto st365
+		}
+		goto st0
+	st365:
+		if p++; p == pe {
+			goto _test_eof365
+		}
+	st_case_365:
+		if data[p] == 114 {
+			goto st366
+		}
+		goto st0
+	st366:
+		if p++; p == pe {
+			goto _test_eof366
+		}
+	st_case_366:
+		if data[p] == 121 {
+			goto st367
+		}
+		goto st0
+	st367:
+		if p++; p == pe {
+			goto _test_eof367
+		}
+	st_case_367:
+		if data[p] == 32 {
+			goto st368
+		}
+		goto st0
+	st368:
+		if p++; p == pe {
+			goto _test_eof368
+		}
+	st_case_368:
+		if data[p] == 118 {
+			goto st369
+		}
+		goto st0
+	st369:
+		if p++; p == pe {
+			goto _test_eof369
+		}
+	st_case_369:
+		if data[p] == 97 {
+			goto st370
+		}
+		goto st0
+	st370:
+		if p++; p == pe {
+			goto _test_eof370
+		}
+	st_case_370:
+		if data[p] == 108 {
+			goto st371
+		}
+		goto st0
+	st371:
+		if p++; p == pe {
+			goto _test_eof371
+		}
+	st_case_371:
+		if data[p] == 117 {
+			goto st372
+		}
+		goto st0
+	st372:
+		if p++; p == pe {
+			goto _test_eof372
+		}
+	st_case_372:
+		if data[p] == 101 {
+			goto st373
+		}
+		goto st0
+	st373:
+		if p++; p == pe {
+			goto _test_eof373
+		}
+	st_case_373:
+		if data[p] == 32 {
+			goto st374
+		}
+		goto st0
+	st374:
+		if p++; p == pe {
+			goto _test_eof374
+		}
+	st_case_374:
+		if data[p] == 97 {
+			goto st375
+		}
+		goto st0
+	st375:
+		if p++; p == pe {
+			goto _test_eof375
+		}
+	st_case_375:
+		if data[p] == 116 {
+			goto st376
+		}
+		goto st0
+	st376:
+		if p++; p == pe {
+			goto _test_eof376
+		}
+	st_case_376:
+		if data[p] == 32 {
+			goto tr387
+		}
+		goto st0
+	tr387:
+//line matcher.rl:45
+		pos = p
+		goto st377
+	st377:
+		if p++; p == pe {
+			goto _test_eof377
+		}
+	st_case_377:
+//line matcher.go:4226
+		if data[p] == 46 {
+			goto st0
+		}
+		goto tr388
+	tr388:
+//line matcher.rl:47
+		stack = append(stack, current())
+		goto st378
+	st378:
+		if p++; p == pe {
+			goto _test_eof378
+		}
+	st_case_378:
+//line matcher.go:4240
+		if data[p] == 46 {
+			goto tr389
+		}
+		goto tr388
+	st379:
+		if p++; p == pe {
+			goto _test_eof379
+		}
+	st_case_379:
+		if data[p] == 114 {
+			goto st380
+		}
+		goto st0
+	st380:
+		if p++; p == pe {
+			goto _test_eof380
+		}
+	st_case_380:
+		if data[p] == 114 {
+			goto st381
+		}
+		goto st0
+	st381:
+		if p++; p == pe {
+			goto _test_eof381
+		}
+	st_case_381:
+		if data[p] == 111 {
+			goto st382
+		}
+		goto st0
+	st382:
+		if p++; p == pe {
+			goto _test_eof382
+		}
+	st_case_382:
+		if data[p] == 114 {
+			goto st383
+		}
+		goto st0
+	st383:
+		if p++; p == pe {
+			goto _test_eof383
+		}
+	st_case_383:
+		if data[p] == 32 {
+			goto st384
+		}
+		goto st0
+	st384:
+		if p++; p == pe {
+			goto _test_eof384
+		}
+	st_case_384:
+		if data[p] == 105 {
+			goto st385
+		}
+		goto st0
+	st385:
+		if p++; p == pe {
+			goto _test_eof385
+		}
+	st_case_385:
+		if data[p] == 110 {
+			goto st386
+		}
+		goto st0
+	st386:
+		if p++; p == pe {
+			goto _test_eof386
+		}
+	st_case_386:
+		if data[p] == 32 {
+			goto st387
+		}
+		goto st0
+	st387:
+		if p++; p == pe {
+			goto _test_eof387
+		}
+	st_case_387:
+		if data[p] == 105 {
+			goto st388
+		}
+		goto st0
+	st388:
+		if p++; p == pe {
+			goto _test_eof388
+		}
+	st_case_388:
+		if data[p] == 109 {
+			goto st389
+		}
+		goto st0
+	st389:
+		if p++; p == pe {
+			goto _test_eof389
+		}
+	st_case_389:
+		if data[p] == 112 {
+			goto st390
+		}
+		goto st0
+	st390:
+		if p++; p == pe {
+			goto _test_eof390
+		}
+	st_case_390:
+		if data[p] == 111 {
+			goto st391
+		}
+		goto st0
+	st391:
+		if p++; p == pe {
+			goto _test_eof391
+		}
+	st_case_391:
+		if data[p] == 114 {
+			goto st392
+		}
+		goto st0
+	st392:
+		if p++; p == pe {
+			goto _test_eof392
+		}
+	st_case_392:
+		if data[p] == 116 {
+			goto st393
+		}
+		goto st0
+	st393:
+		if p++; p == pe {
+			goto _test_eof393
+		}
+	st_case_393:
+		if data[p] == 58 {
+			goto st269
+		}
+		goto st0
+	st394:
+		if p++; p == pe {
+			goto _test_eof394
+		}
+	st_case_394:
+		if data[p] == 110 {
+			goto st395
+		}
+		goto st0
+	st395:
+		if p++; p == pe {
+			goto _test_eof395
+		}
+	st_case_395:
+		if data[p] == 107 {
+			goto st396
+		}
+		goto st0
+	st396:
+		if p++; p == pe {
+			goto _test_eof396
+		}
+	st_case_396:
+		if data[p] == 110 {
+			goto st397
+		}
+		goto st0
+	st397:
+		if p++; p == pe {
+			goto _test_eof397
+		}
+	st_case_397:
+		if data[p] == 111 {
+			goto st398
+		}
+		goto st0
+	st398:
+		if p++; p == pe {
+			goto _test_eof398
+		}
+	st_case_398:
+		if data[p] == 119 {
+			goto st399
+		}
+		goto st0
+	st399:
+		if p++; p == pe {
+			goto _test_eof399
+		}
+	st_case_399:
+		if data[p] == 110 {
+			goto st400
+		}
+		goto st0
+	st400:
+		if p++; p == pe {
+			goto _test_eof400
+		}
+	st_case_400:
+		if data[p] == 32 {
+			goto st401
+		}
+		goto st0
+	st401:
+		if p++; p == pe {
+			goto _test_eof401
+		}
+	st_case_401:
+		if data[p] == 117 {
+			goto st402
+		}
+		goto st0
+	st402:
+		if p++; p == pe {
+			goto _test_eof402
+		}
+	st_case_402:
+		if data[p] == 110 {
+			goto st403
+		}
+		goto st0
+	st403:
+		if p++; p == pe {
+			goto _test_eof403
+		}
+	st_case_403:
+		if data[p] == 105 {
+			goto st404
+		}
+		goto st0
+	st404:
+		if p++; p == pe {
+			goto _test_eof404
+		}
+	st_case_404:
+		if data[p] == 116 {
+			goto st405
+		}
+		goto st0
+	st405:
+		if p++; p == pe {
+			goto _test_eof405
+		}
+	st_case_405:
+		if data[p] == 32 {
+			goto st406
+		}
+		goto st0
+	st406:
+		if p++; p == pe {
+			goto _test_eof406
+		}
+	st_case_406:
+		if data[p] == 39 {
+			goto tr416
+		}
+		goto st0
+	tr416:
+//line matcher.rl:45
+		pos = p
+		goto st407
+	tr417:
+//line matcher.rl:47
+		stack = append(stack, current())
+		goto st407
+	st407:
+		if p++; p == pe {
+			goto _test_eof407
+		}
+	st_case_407:
+//line matcher.go:4510
+		if data[p] == 39 {
+			goto tr418
+		}
+		goto tr417
+	st_out:
+	_test_eof2:
+		cs = 2
+		goto _test_eof
+	_test_eof3:
+		cs = 3
+		goto _test_eof
+	_test_eof4:
+		cs = 4
+		goto _test_eof
+	_test_eof5:
+		cs = 5
+		goto _test_eof
+	_test_eof6:
+		cs = 6
+		goto _test_eof
+	_test_eof7:
+		cs = 7
+		goto _test_eof
+	_test_eof8:
+		cs = 8
+		goto _test_eof
+	_test_eof9:
+		cs = 9
+		goto _test_eof
+	_test_eof10:
+		cs = 10
+		goto _test_eof
+	_test_eof11:
+		cs = 11
+		goto _test_eof
+	_test_eof12:
+		cs = 12
+		goto _test_eof
+	_test_eof13:
+		cs = 13
+		goto _test_eof
+	_test_eof14:
+		cs = 14
+		goto _test_eof
+	_test_eof15:
+		cs = 15
+		goto _test_eof
+	_test_eof16:
+		cs = 16
+		goto _test_eof
+	_test_eof17:
+		cs = 17
+		goto _test_eof
+	_test_eof18:
+		cs = 18
+		goto _test_eof
+	_test_eof19:
+		cs = 19
+		goto _test_eof
+	_test_eof20:
+		cs = 20
+		goto _test_eof
+	_test_eof21:
+		cs = 21
+		goto _test_eof
+	_test_eof22:
+		cs = 22
+		goto _test_eof
+	_test_eof23:
+		cs = 23
+		goto _test_eof
+	_test_eof24:
+		cs = 24
+		goto _test_eof
+	_test_eof25:
+		cs = 25
+		goto _test_eof
+	_test_eof26:
+		cs = 26
+		goto _test_eof
+	_test_eof27:
+		cs = 27
+		goto _test_eof
+	_test_eof28:
+		cs = 28
+		goto _test_eof
+	_test_eof29:
+		cs = 29
+		goto _test_eof
+	_test_eof30:
+		cs = 30
+		goto _test_eof
+	_test_eof31:
+		cs = 31
+		goto _test_eof
+	_test_eof32:
+		cs = 32
+		goto _test_eof
+	_test_eof33:
+		cs = 33
+		goto _test_eof
+	_test_eof34:
+		cs = 34
+		goto _test_eof
+	_test_eof35:
+		cs = 35
+		goto _test_eof
+	_test_eof36:
+		cs = 36
+		goto _test_eof
+	_test_eof37:
+		cs = 37
+		goto _test_eof
+	_test_eof38:
+		cs = 38
+		goto _test_eof
+	_test_eof39:
+		cs = 39
+		goto _test_eof
+	_test_eof40:
+		cs = 40
+		goto _test_eof
+	_test_eof41:
+		cs = 41
+		goto _test_eof
+	_test_eof42:
+		cs = 42
+		goto _test_eof
+	_test_eof43:
+		cs = 43
+		goto _test_eof
+	_test_eof44:
+		cs = 44
+		goto _test_eof
+	_test_eof45:
+		cs = 45
+		goto _test_eof
+	_test_eof46:
+		cs = 46
+		goto _test_eof
+	_test_eof408:
+		cs = 408
+		goto _test_eof
+	_test_eof47:
+		cs = 47
+		goto _test_eof
+	_test_eof48:
+		cs = 48
+		goto _test_eof
+	_test_eof49:
+		cs = 49
+		goto _test_eof
+	_test_eof50:
+		cs = 50
+		goto _test_eof
+	_test_eof51:
+		cs = 51
+		goto _test_eof
+	_test_eof52:
+		cs = 52
+		goto _test_eof
+	_test_eof53:
+		cs = 53
+		goto _test_eof
+	_test_eof54:
+		cs = 54
+		goto _test_eof
+	_test_eof55:
+		cs = 55
+		goto _test_eof
+	_test_eof56:
+		cs = 56
+		goto _test_eof
+	_test_eof57:
+		cs = 57
+		goto _test_eof
+	_test_eof58:
+		cs = 58
+		goto _test_eof
+	_test_eof59:
+		cs = 59
+		goto _test_eof
+	_test_eof60:
+		cs = 60
+		goto _test_eof
+	_test_eof61:
+		cs = 61
+		goto _test_eof
+	_test_eof62:
+		cs = 62
+		goto _test_eof
+	_test_eof63:
+		cs = 63
+		goto _test_eof
+	_test_eof64:
+		cs = 64
+		goto _test_eof
+	_test_eof65:
+		cs = 65
+		goto _test_eof
+	_test_eof66:
+		cs = 66
+		goto _test_eof
+	_test_eof67:
+		cs = 67
+		goto _test_eof
+	_test_eof68:
+		cs = 68
+		goto _test_eof
+	_test_eof69:
+		cs = 69
+		goto _test_eof
+	_test_eof70:
+		cs = 70
+		goto _test_eof
+	_test_eof71:
+		cs = 71
+		goto _test_eof
+	_test_eof72:
+		cs = 72
+		goto _test_eof
+	_test_eof73:
+		cs = 73
+		goto _test_eof
+	_test_eof74:
+		cs = 74
+		goto _test_eof
+	_test_eof75:
+		cs = 75
+		goto _test_eof
+	_test_eof76:
+		cs = 76
+		goto _test_eof
+	_test_eof77:
+		cs = 77
+		goto _test_eof
+	_test_eof78:
+		cs = 78
+		goto _test_eof
+	_test_eof79:
+		cs = 79
+		goto _test_eof
+	_test_eof80:
+		cs = 80
+		goto _test_eof
+	_test_eof81:
+		cs = 81
+		goto _test_eof
+	_test_eof82:
+		cs = 82
+		goto _test_eof
+	_test_eof83:
+		cs = 83
+		goto _test_eof
+	_test_eof84:
+		cs = 84
+		goto _test_eof
+	_test_eof85:
+		cs = 85
+		goto _test_eof
+	_test_eof86:
+		cs = 86
+		goto _test_eof
+	_test_eof87:
+		cs = 87
+		goto _test_eof
+	_test_eof88:
+		cs = 88
+		goto _test_eof
+	_test_eof89:
+		cs = 89
+		goto _test_eof
+	_test_eof90:
+		cs = 90
+		goto _test_eof
+	_test_eof91:
+		cs = 91
+		goto _test_eof
+	_test_eof92:
+		cs = 92
+		goto _test_eof
+	_test_eof93:
+		cs = 93
+		goto _test_eof
+	_test_eof94:
+		cs = 94
+		goto _test_eof
+	_test_eof95:
+		cs = 95
+		goto _test_eof
+	_test_eof96:
+		cs = 96
+		goto _test_eof
+	_test_eof97:
+		cs = 97
+		goto _test_eof
+	_test_eof98:
+		cs = 98
+		goto _test_eof
+	_test_eof99:
+		cs = 99
+		goto _test_eof
+	_test_eof100:
+		cs = 100
+		goto _test_eof
+	_test_eof101:
+		cs = 101
+		goto _test_eof
+	_test_eof102:
+		cs = 102
+		goto _test_eof
+	_test_eof103:
+		cs = 103
+		goto _test_eof
+	_test_eof104:
+		cs = 104
+		goto _test_eof
+	_test_eof105:
+		cs = 105
+		goto _test_eof
+	_test_eof106:
+		cs = 106
+		goto _test_eof
+	_test_eof107:
+		cs = 107
+		goto _test_eof
+	_test_eof108:
+		cs = 108
+		goto _test_eof
+	_test_eof109:
+		cs = 109
+		goto _test_eof
+	_test_eof110:
+		cs = 110
+		goto _test_eof
+	_test_eof111:
+		cs = 111
+		goto _test_eof
+	_test_eof112:
+		cs = 112
+		goto _test_eof
+	_test_eof113:
+		cs = 113
+		goto _test_eof
+	_test_eof114:
+		cs = 114
+		goto _test_eof
+	_test_eof115:
+		cs = 115
+		goto _test_eof
+	_test_eof116:
+		cs = 116
+		goto _test_eof
+	_test_eof117:
+		cs = 117
+		goto _test_eof
+	_test_eof118:
+		cs = 118
+		goto _test_eof
+	_test_eof119:
+		cs = 119
+		goto _test_eof
+	_test_eof120:
+		cs = 120
+		goto _test_eof
+	_test_eof121:
+		cs = 121
+		goto _test_eof
+	_test_eof122:
+		cs = 122
+		goto _test_eof
+	_test_eof123:
+		cs = 123
+		goto _test_eof
+	_test_eof124:
+		cs = 124
+		goto _test_eof
+	_test_eof125:
+		cs = 125
+		goto _test_eof
+	_test_eof126:
+		cs = 126
+		goto _test_eof
+	_test_eof127:
+		cs = 127
+		goto _test_eof
+	_test_eof128:
+		cs = 128
+		goto _test_eof
+	_test_eof129:
+		cs = 129
+		goto _test_eof
+	_test_eof130:
+		cs = 130
+		goto _test_eof
+	_test_eof131:
+		cs = 131
+		goto _test_eof
+	_test_eof132:
+		cs = 132
+		goto _test_eof
+	_test_eof133:
+		cs = 133
+		goto _test_eof
+	_test_eof134:
+		cs = 134
+		goto _test_eof
+	_test_eof135:
+		cs = 135
+		goto _test_eof
+	_test_eof136:
+		cs = 136
+		goto _test_eof
+	_test_eof137:
+		cs = 137
+		goto _test_eof
+	_test_eof138:
+		cs = 138
+		goto _test_eof
+	_test_eof139:
+		cs = 139
+		goto _test_eof
+	_test_eof140:
+		cs = 140
+		goto _test_eof
+	_test_eof141:
+		cs = 141
+		goto _test_eof
+	_test_eof142:
+		cs = 142
+		goto _test_eof
+	_test_eof143:
+		cs = 143
+		goto _test_eof
+	_test_eof144:
+		cs = 144
+		goto _test_eof
+	_test_eof145:
+		cs = 145
+		goto _test_eof
+	_test_eof146:
+		cs = 146
+		goto _test_eof
+	_test_eof147:
+		cs = 147
+		goto _test_eof
+	_test_eof148:
+		cs = 148
+		goto _test_eof
+	_test_eof149:
+		cs = 149
+		goto _test_eof
+	_test_eof150:
+		cs = 150
+		goto _test_eof
+	_test_eof151:
+		cs = 151
+		goto _test_eof
+	_test_eof152:
+		cs = 152
+		goto _test_eof
+	_test_eof153:
+		cs = 153
+		goto _test_eof
+	_test_eof154:
+		cs = 154
+		goto _test_eof
+	_test_eof155:
+		cs = 155
+		goto _test_eof
+	_test_eof156:
+		cs = 156
+		goto _test_eof
+	_test_eof157:
+		cs = 157
+		goto _test_eof
+	_test_eof158:
+		cs = 158
+		goto _test_eof
+	_test_eof159:
+		cs = 159
+		goto _test_eof
+	_test_eof160:
+		cs = 160
+		goto _test_eof
+	_test_eof161:
+		cs = 161
+		goto _test_eof
+	_test_eof162:
+		cs = 162
+		goto _test_eof
+	_test_eof163:
+		cs = 163
+		goto _test_eof
+	_test_eof164:
+		cs = 164
+		goto _test_eof
+	_test_eof165:
+		cs = 165
+		goto _test_eof
+	_test_eof166:
+		cs = 166
+		goto _test_eof
+	_test_eof167:
+		cs = 167
+		goto _test_eof
+	_test_eof168:
+		cs = 168
+		goto _test_eof
+	_test_eof169:
+		cs = 169
+		goto _test_eof
+	_test_eof170:
+		cs = 170
+		goto _test_eof
+	_test_eof171:
+		cs = 171
+		goto _test_eof
+	_test_eof172:
+		cs = 172
+		goto _test_eof
+	_test_eof173:
+		cs = 173
+		goto _test_eof
+	_test_eof174:
+		cs = 174
+		goto _test_eof
+	_test_eof175:
+		cs = 175
+		goto _test_eof
+	_test_eof176:
+		cs = 176
+		goto _test_eof
+	_test_eof177:
+		cs = 177
+		goto _test_eof
+	_test_eof178:
+		cs = 178
+		goto _test_eof
+	_test_eof179:
+		cs = 179
+		goto _test_eof
+	_test_eof180:
+		cs = 180
+		goto _test_eof
+	_test_eof181:
+		cs = 181
+		goto _test_eof
+	_test_eof182:
+		cs = 182
+		goto _test_eof
+	_test_eof183:
+		cs = 183
+		goto _test_eof
+	_test_eof184:
+		cs = 184
+		goto _test_eof
+	_test_eof185:
+		cs = 185
+		goto _test_eof
+	_test_eof186:
+		cs = 186
+		goto _test_eof
+	_test_eof187:
+		cs = 187
+		goto _test_eof
+	_test_eof188:
+		cs = 188
+		goto _test_eof
+	_test_eof189:
+		cs = 189
+		goto _test_eof
+	_test_eof190:
+		cs = 190
+		goto _test_eof
+	_test_eof191:
+		cs = 191
+		goto _test_eof
+	_test_eof192:
+		cs = 192
+		goto _test_eof
+	_test_eof193:
+		cs = 193
+		goto _test_eof
+	_test_eof194:
+		cs = 194
+		goto _test_eof
+	_test_eof195:
+		cs = 195
+		goto _test_eof
+	_test_eof196:
+		cs = 196
+		goto _test_eof
+	_test_eof197:
+		cs = 197
+		goto _test_eof
+	_test_eof198:
+		cs = 198
+		goto _test_eof
+	_test_eof199:
+		cs = 199
+		goto _test_eof
+	_test_eof200:
+		cs = 200
+		goto _test_eof
+	_test_eof201:
+		cs = 201
+		goto _test_eof
+	_test_eof202:
+		cs = 202
+		goto _test_eof
+	_test_eof203:
+		cs = 203
+		goto _test_eof
+	_test_eof204:
+		cs = 204
+		goto _test_eof
+	_test_eof205:
+		cs = 205
+		goto _test_eof
+	_test_eof206:
+		cs = 206
+		goto _test_eof
+	_test_eof207:
+		cs = 207
+		goto _test_eof
+	_test_eof208:
+		cs = 208
+		goto _test_eof
+	_test_eof209:
+		cs = 209
+		goto _test_eof
+	_test_eof210:
+		cs = 210
+		goto _test_eof
+	_test_eof211:
+		cs = 211
+		goto _test_eof
+	_test_eof212:
+		cs = 212
+		goto _test_eof
+	_test_eof213:
+		cs = 213
+		goto _test_eof
+	_test_eof214:
+		cs = 214
+		goto _test_eof
+	_test_eof215:
+		cs = 215
+		goto _test_eof
+	_test_eof216:
+		cs = 216
+		goto _test_eof
+	_test_eof217:
+		cs = 217
+		goto _test_eof
+	_test_eof218:
+		cs = 218
+		goto _test_eof
+	_test_eof219:
+		cs = 219
+		goto _test_eof
+	_test_eof220:
+		cs = 220
+		goto _test_eof
+	_test_eof221:
+		cs = 221
+		goto _test_eof
+	_test_eof222:
+		cs = 222
+		goto _test_eof
+	_test_eof223:
+		cs = 223
+		goto _test_eof
+	_test_eof224:
+		cs = 224
+		goto _test_eof
+	_test_eof225:
+		cs = 225
+		goto _test_eof
+	_test_eof226:
+		cs = 226
+		goto _test_eof
+	_test_eof227:
+		cs = 227
+		goto _test_eof
+	_test_eof228:
+		cs = 228
+		goto _test_eof
+	_test_eof229:
+		cs = 229
+		goto _test_eof
+	_test_eof230:
+		cs = 230
+		goto _test_eof
+	_test_eof231:
+		cs = 231
+		goto _test_eof
+	_test_eof232:
+		cs = 232
+		goto _test_eof
+	_test_eof233:
+		cs = 233
+		goto _test_eof
+	_test_eof234:
+		cs = 234
+		goto _test_eof
+	_test_eof235:
+		cs = 235
+		goto _test_eof
+	_test_eof236:
+		cs = 236
+		goto _test_eof
+	_test_eof237:
+		cs = 237
+		goto _test_eof
+	_test_eof409:
+		cs = 409
+		goto _test_eof
+	_test_eof238:
+		cs = 238
+		goto _test_eof
+	_test_eof239:
+		cs = 239
+		goto _test_eof
+	_test_eof240:
+		cs = 240
+		goto _test_eof
+	_test_eof241:
+		cs = 241
+		goto _test_eof
+	_test_eof242:
+		cs = 242
+		goto _test_eof
+	_test_eof243:
+		cs = 243
+		goto _test_eof
+	_test_eof244:
+		cs = 244
+		goto _test_eof
+	_test_eof245:
+		cs = 245
+		goto _test_eof
+	_test_eof246:
+		cs = 246
+		goto _test_eof
+	_test_eof247:
+		cs = 247
+		goto _test_eof
+	_test_eof248:
+		cs = 248
+		goto _test_eof
+	_test_eof249:
+		cs = 249
+		goto _test_eof
+	_test_eof250:
+		cs = 250
+		goto _test_eof
+	_test_eof251:
+		cs = 251
+		goto _test_eof
+	_test_eof252:
+		cs = 252
+		goto _test_eof
+	_test_eof253:
+		cs = 253
+		goto _test_eof
+	_test_eof254:
+		cs = 254
+		goto _test_eof
+	_test_eof255:
+		cs = 255
+		goto _test_eof
+	_test_eof256:
+		cs = 256
+		goto _test_eof
+	_test_eof257:
+		cs = 257
+		goto _test_eof
+	_test_eof258:
+		cs = 258
+		goto _test_eof
+	_test_eof259:
+		cs = 259
+		goto _test_eof
+	_test_eof260:
+		cs = 260
+		goto _test_eof
+	_test_eof261:
+		cs = 261
+		goto _test_eof
+	_test_eof262:
+		cs = 262
+		goto _test_eof
+	_test_eof263:
+		cs = 263
+		goto _test_eof
+	_test_eof264:
+		cs = 264
+		goto _test_eof
+	_test_eof265:
+		cs = 265
+		goto _test_eof
+	_test_eof266:
+		cs = 266
+		goto _test_eof
+	_test_eof267:
+		cs = 267
+		goto _test_eof
+	_test_eof268:
+		cs = 268
+		goto _test_eof
+	_test_eof269:
+		cs = 269
+		goto _test_eof
+	_test_eof270:
+		cs = 270
+		goto _test_eof
+	_test_eof271:
+		cs = 271
+		goto _test_eof
+	_test_eof272:
+		cs = 272
+		goto _test_eof
+	_test_eof273:
+		cs = 273
+		goto _test_eof
+	_test_eof274:
+		cs = 274
+		goto _test_eof
+	_test_eof275:
+		cs = 275
+		goto _test_eof
+	_test_eof276:
+		cs = 276
+		goto _test_eof
+	_test_eof277:
+		cs = 277
+		goto _test_eof
+	_test_eof278:
+		cs = 278
+		goto _test_eof
+	_test_eof279:
+		cs = 279
+		goto _test_eof
+	_test_eof280:
+		cs = 280
+		goto _test_eof
+	_test_eof281:
+		cs = 281
+		goto _test_eof
+	_test_eof282:
+		cs = 282
+		goto _test_eof
+	_test_eof283:
+		cs = 283
+		goto _test_eof
+	_test_eof284:
+		cs = 284
+		goto _test_eof
+	_test_eof285:
+		cs = 285
+		goto _test_eof
+	_test_eof286:
+		cs = 286
+		goto _test_eof
+	_test_eof287:
+		cs = 287
+		goto _test_eof
+	_test_eof288:
+		cs = 288
+		goto _test_eof
+	_test_eof289:
+		cs = 289
+		goto _test_eof
+	_test_eof290:
+		cs = 290
+		goto _test_eof
+	_test_eof291:
+		cs = 291
+		goto _test_eof
+	_test_eof292:
+		cs = 292
+		goto _test_eof
+	_test_eof293:
+		cs = 293
+		goto _test_eof
+	_test_eof294:
+		cs = 294
+		goto _test_eof
+	_test_eof295:
+		cs = 295
+		goto _test_eof
+	_test_eof296:
+		cs = 296
+		goto _test_eof
+	_test_eof297:
+		cs = 297
+		goto _test_eof
+	_test_eof298:
+		cs = 298
+		goto _test_eof
+	_test_eof299:
+		cs = 299
+		goto _test_eof
+	_test_eof300:
+		cs = 300
+		goto _test_eof
+	_test_eof301:
+		cs = 301
+		goto _test_eof
+	_test_eof302:
+		cs = 302
+		goto _test_eof
+	_test_eof303:
+		cs = 303
+		goto _test_eof
+	_test_eof304:
+		cs = 304
+		goto _test_eof
+	_test_eof305:
+		cs = 305
+		goto _test_eof
+	_test_eof306:
+		cs = 306
+		goto _test_eof
+	_test_eof307:
+		cs = 307
+		goto _test_eof
+	_test_eof308:
+		cs = 308
+		goto _test_eof
+	_test_eof309:
+		cs = 309
+		goto _test_eof
+	_test_eof310:
+		cs = 310
+		goto _test_eof
+	_test_eof311:
+		cs = 311
+		goto _test_eof
+	_test_eof312:
+		cs = 312
+		goto _test_eof
+	_test_eof313:
+		cs = 313
+		goto _test_eof
+	_test_eof314:
+		cs = 314
+		goto _test_eof
+	_test_eof315:
+		cs = 315
+		goto _test_eof
+	_test_eof316:
+		cs = 316
+		goto _test_eof
+	_test_eof317:
+		cs = 317
+		goto _test_eof
+	_test_eof318:
+		cs = 318
+		goto _test_eof
+	_test_eof319:
+		cs = 319
+		goto _test_eof
+	_test_eof320:
+		cs = 320
+		goto _test_eof
+	_test_eof321:
+		cs = 321
+		goto _test_eof
+	_test_eof322:
+		cs = 322
+		goto _test_eof
+	_test_eof323:
+		cs = 323
+		goto _test_eof
+	_test_eof324:
+		cs = 324
+		goto _test_eof
+	_test_eof325:
+		cs = 325
+		goto _test_eof
+	_test_eof326:
+		cs = 326
+		goto _test_eof
+	_test_eof327:
+		cs = 327
+		goto _test_eof
+	_test_eof328:
+		cs = 328
+		goto _test_eof
+	_test_eof329:
+		cs = 329
+		goto _test_eof
+	_test_eof330:
+		cs = 330
+		goto _test_eof
+	_test_eof331:
+		cs = 331
+		goto _test_eof
+	_test_eof332:
+		cs = 332
+		goto _test_eof
+	_test_eof333:
+		cs = 333
+		goto _test_eof
+	_test_eof334:
+		cs = 334
+		goto _test_eof
+	_test_eof335:
+		cs = 335
+		goto _test_eof
+	_test_eof336:
+		cs = 336
+		goto _test_eof
+	_test_eof337:
+		cs = 337
+		goto _test_eof
+	_test_eof338:
+		cs = 338
+		goto _test_eof
+	_test_eof339:
+		cs = 339
+		goto _test_eof
+	_test_eof340:
+		cs = 340
+		goto _test_eof
+	_test_eof341:
+		cs = 341
+		goto _test_eof
+	_test_eof342:
+		cs = 342
+		goto _test_eof
+	_test_eof343:
+		cs = 343
+		goto _test_eof
+	_test_eof344:
+		cs = 344
+		goto _test_eof
+	_test_eof345:
+		cs = 345
+		goto _test_eof
+	_test_eof346:
+		cs = 346
+		goto _test_eof
+	_test_eof347:
+		cs = 347
+		goto _test_eof
+	_test_eof348:
+		cs = 348
+		goto _test_eof
+	_test_eof349:
+		cs = 349
+		goto _test_eof
+	_test_eof350:
+		cs = 350
+		goto _test_eof
+	_test_eof351:
+		cs = 351
+		goto _test_eof
+	_test_eof352:
+		cs = 352
+		goto _test_eof
+	_test_eof353:
+		cs = 353
+		goto _test_eof
+	_test_eof354:
+		cs = 354
+		goto _test_eof
+	_test_eof355:
+		cs = 355
+		goto _test_eof
+	_test_eof356:
+		cs = 356
+		goto _test_eof
+	_test_eof357:
+		cs = 357
+		goto _test_eof
+	_test_eof358:
+		cs = 358
+		goto _test_eof
+	_test_eof359:
+		cs = 359
+		goto _test_eof
+	_test_eof360:
+		cs = 360
+		goto _test_eof
+	_test_eof361:
+		cs = 361
+		goto _test_eof
+	_test_eof362:
+		cs = 362
+		goto _test_eof
+	_test_eof363:
+		cs = 363
+		goto _test_eof
+	_test_eof364:
+		cs = 364
+		goto _test_eof
+	_test_eof365:
+		cs = 365
+		goto _test_eof
+	_test_eof366:
+		cs = 366
+		goto _test_eof
+	_test_eof367:
+		cs = 367
+		goto _test_eof
+	_test_eof368:
+		cs = 368
+		goto _test_eof
+	_test_eof369:
+		cs = 369
+		goto _test_eof
+	_test_eof370:
+		cs = 370
+		goto _test_eof
+	_test_eof371:
+		cs = 371
+		goto _test_eof
+	_test_eof372:
+		cs = 372
+		goto _test_eof
+	_test_eof373:
+		cs = 373
+		goto _test_eof
+	_test_eof374:
+		cs = 374
+		goto _test_eof
+	_test_eof375:
+		cs = 375
+		goto _test_eof
+	_test_eof376:
+		cs = 376
+		goto _test_eof
+	_test_eof377:
+		cs = 377
+		goto _test_eof
+	_test_eof378:
+		cs = 378
+		goto _test_eof
+	_test_eof379:
+		cs = 379
+		goto _test_eof
+	_test_eof380:
+		cs = 380
+		goto _test_eof
+	_test_eof381:
+		cs = 381
+		goto _test_eof
+	_test_eof382:
+		cs = 382
+		goto _test_eof
+	_test_eof383:
+		cs = 383
+		goto _test_eof
+	_test_eof384:
+		cs = 384
+		goto _test_eof
+	_test_eof385:
+		cs = 385
+		goto _test_eof
+	_test_eof386:
+		cs = 386
+		goto _test_eof
+	_test_eof387:
+		cs = 387
+		goto _test_eof
+	_test_eof388:
+		cs = 388
+		goto _test_eof
+	_test_eof389:
+		cs = 389
+		goto _test_eof
+	_test_eof390:
+		cs = 390
+		goto _test_eof
+	_test_eof391:
+		cs = 391
+		goto _test_eof
+	_test_eof392:
+		cs = 392
+		goto _test_eof
+	_test_eof393:
+		cs = 393
+		goto _test_eof
+	_test_eof394:
+		cs = 394
+		goto _test_eof
+	_test_eof395:
+		cs = 395
+		goto _test_eof
+	_test_eof396:
+		cs = 396
+		goto _test_eof
+	_test_eof397:
+		cs = 397
+		goto _test_eof
+	_test_eof398:
+		cs = 398
+		goto _test_eof
+	_test_eof399:
+		cs = 399
+		goto _test_eof
+	_test_eof400:
+		cs = 400
+		goto _test_eof
+	_test_eof401:
+		cs = 401
+		goto _test_eof
+	_test_eof402:
+		cs = 402
+		goto _test_eof
+	_test_eof403:
+		cs = 403
+		goto _test_eof
+	_test_eof404:
+		cs = 404
+		goto _test_eof
+	_test_eof405:
+		cs = 405
+		goto _test_eof
+	_test_eof406:
+		cs = 406
+		goto _test_eof
+	_test_eof407:
+		cs = 407
+		goto _test_eof
+
+	_test_eof:
+		{
+		}
+	_out:
+		{
+		}
+	}
+
+//line matcher.rl:142
+
+	return false
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/gmaggregate/matcher.rl	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,144 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSE
+//
+// Copyright (C) 2021 by via donau
+//   - Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+package main
+
+import "strconv"
+
+%%{
+	machine expression;
+	write data;
+}%%
+
+func (agg *aggregator) match(data string, l *line) bool {
+
+	// data := []rune(line)
+
+	var cs int
+
+	p, pe := 0, len(data)
+
+	stack := agg.stack[:0]
+	var pos int
+
+	var g *gauge
+	var v int
+
+	current := func() string { return string(data[pos+1:p+1]) }
+
+	pop := func() string {
+		s := stack[len(stack)-1]
+		stack = stack[:len(stack)-1]
+		return s
+	}
+
+%%{
+	action mark { pos = p }
+
+	action push { stack = append(stack, current()) }
+
+	action foundMeasure {
+		agg.current = current()
+		return true
+	}
+
+	action insertedMeas {
+		g = agg.find(current())
+		v, _ = strconv.Atoi(pop())
+		g.measurements += v
+		return true
+	}
+
+	action insertedPreds {
+		g = agg.find(current())
+		v , _ = strconv.Atoi(pop())
+		g.predictions += v
+		return true
+	}
+
+	action referenceCodeNotSpecified {
+		agg.find(agg.current).assumeZPG = true
+		return true
+	}
+
+	action ignoredMeassurements {
+		v, _ = strconv.Atoi(pop())
+		agg.find(agg.current).badValues += v
+		return true
+	}
+
+	action cannotFindGauge {
+		agg.find(pop()).unknown = true
+		return true
+	}
+
+	action unitNotSpecified {
+		agg.find(agg.current).assumeCM++
+		return true
+	}
+
+	action ignoredMessage {
+		g = agg.find(agg.current)
+		g.ignMeasCodes = extend(g.ignMeasCodes, current())
+		return true
+	}
+
+	action missingMandatoryValue {
+		g = agg.find(agg.current)
+		g.missingValues = extend(g.missingValues, pop())
+		return true
+	}
+
+	action unknownUnit {
+		g = agg.find(agg.current)
+		g.rescaleErrors = extend(g.rescaleErrors, pop())
+		return true
+	}
+
+	action holdBack {
+		agg.hold = l
+		return true
+	}
+
+	expr :=
+		'Found measurements/predictions for ' @mark any{20}
+		@foundMeasure
+	| 'Inserted ' @mark digit+ @push ' measurements for ' @mark any{20}
+		@insertedMeas
+	| 'Inserted ' @mark digit+ @push ' predictions for ' @mark any{20}
+		@insertedPreds
+	| '\'Reference_code\' not specified. Assuming \'ZPG\''
+		@referenceCodeNotSpecified
+	| 'Ignored ' @mark digit+ @push ' measurements with value -99999'
+		@ignoredMeassurements
+	| 'Cannot find gauge "' @mark any{20} @push '"'
+		@cannotFindGauge
+	| '\'Unit\' not specified. Assuming \'cm\''
+		@unitNotSpecified
+	| 'Ignored message with measure_code ' @mark any+
+		@ignoredMessage
+	| 'Missing mandatory value at ' @mark [^.]+ @push '.'
+		@missingMandatoryValue
+	| 'unknown unit \'' @mark [^']* @push '\''
+		@unknownUnit
+	| 'Importing gauge measurements took '
+		@holdBack
+	| 'error in import: '
+		@holdBack
+	;
+}%%
+
+	%% write init;
+	%% write exec;
+
+	return false
+}
--- a/example_conf.toml	Wed Jul 21 15:14:40 2021 +0200
+++ b/example_conf.toml	Tue Feb 08 10:20:26 2022 +0100
@@ -89,3 +89,8 @@
 # schema-dirs = "$PATH_TO_SCHEMATA"
 # published-config ="$PATH/pub-config.json"
 # report-path = "$PATH_TO_XSLX_AND_YAML_PAIRS"
+
+# File to log to. Default empty -> stderr
+# log-file = ""
+# Level of logging. Possible values: trace, debug, info, warn, error, fatal.
+# log-level = "info"
--- a/go.mod	Wed Jul 21 15:14:40 2021 +0200
+++ b/go.mod	Tue Feb 08 10:20:26 2022 +0100
@@ -3,39 +3,32 @@
 go 1.13
 
 require (
-	github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.0
-	github.com/PaesslerAG/gval v1.1.0
+	github.com/PaesslerAG/gval v1.1.1
 	github.com/cockroachdb/apd v1.1.0 // indirect
 	github.com/fatih/structs v1.1.0
 	github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199
-	github.com/fsnotify/fsnotify v1.4.9 // indirect
 	github.com/gofrs/uuid v3.2.0+incompatible // indirect
 	github.com/gorilla/mux v1.8.0
 	github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 // indirect
 	github.com/jackc/pgx v3.6.2+incompatible
 	github.com/jonas-p/go-shp v0.1.2-0.20190401125246-9fd306ae10a6
 	github.com/lib/pq v1.2.0 // indirect
-	github.com/magiconair/properties v1.8.5 // indirect
 	github.com/mitchellh/go-homedir v1.1.0
-	github.com/mitchellh/mapstructure v1.4.1 // indirect
-	github.com/pelletier/go-toml v1.9.1 // indirect
-	github.com/rs/cors v1.7.0
+	github.com/rs/cors v1.8.0
 	github.com/sergi/go-diff v1.0.0
 	github.com/shopspring/decimal v0.0.0-20190905144223-a36b5d85f337 // indirect
-	github.com/spf13/afero v1.6.0 // indirect
-	github.com/spf13/cast v1.3.1 // indirect
-	github.com/spf13/cobra v1.1.3
-	github.com/spf13/jwalterweatherman v1.1.0 // indirect
-	github.com/spf13/viper v1.7.1
-	github.com/tidwall/rtree v1.2.8
-	go.etcd.io/bbolt v1.3.5
-	golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a // indirect
-	golang.org/x/net v0.0.0-20210525063256-abc453219eb5
-	golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea // indirect
-	gonum.org/v1/gonum v0.9.1
+	github.com/spf13/cobra v1.2.1
+	github.com/spf13/viper v1.9.0
+	github.com/tidwall/rtree v1.3.1
+	github.com/xuri/excelize/v2 v2.4.1
+	go.etcd.io/bbolt v1.3.6
+	golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect
+	golang.org/x/net v0.0.0-20211020060615-d418f374d309
+	golang.org/x/sys v0.0.0-20211020174200-9d6173849985 // indirect
+	golang.org/x/text v0.3.7 // indirect
+	gonum.org/v1/gonum v0.9.3
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
-	gopkg.in/ini.v1 v1.62.0 // indirect
 	gopkg.in/robfig/cron.v1 v1.2.0
 	gopkg.in/yaml.v2 v2.4.0
 )
--- a/go.sum	Wed Jul 21 15:14:40 2021 +0200
+++ b/go.sum	Tue Feb 08 10:20:26 2022 +0100
@@ -5,108 +5,202 @@
 cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
 cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
 cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
+cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
+cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
+cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
+cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
+cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
 cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/firestore v1.6.0/go.mod h1:afJwI0vaXwAG54kI7A//lP/lSPDkQORQuMkv56TxEPU=
 cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
 cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
-github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.0 h1:X+2CWGf5W1tm2+W7Y/LLrAPLFSNlHATnqDudGoIzaxY=
-github.com/360EntSecGroup-Skylar/excelize/v2 v2.4.0/go.mod h1:p9lGPoVX3HYEbFRfjgrPWaaKsHe/2u4EM9DB/qoctgU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
-github.com/PaesslerAG/gval v1.1.0 h1:k3RuxeZDO3eejD4cMPSt+74tUSvTnbGvLx0df4mdwFc=
-github.com/PaesslerAG/gval v1.1.0/go.mod h1:y/nm5yEyTeX6av0OfKJNp9rBNj2XrGhAf5+v24IBN1I=
+github.com/PaesslerAG/gval v1.1.1 h1:4d7pprU9876+m3rc08X33UjGip8oV1kkm8Gh5GBuTss=
+github.com/PaesslerAG/gval v1.1.1/go.mod h1:Fa8gfkCmUsELXgayr8sfL/sw+VzCVoa03dcOcR/if2w=
 github.com/PaesslerAG/jsonpath v0.1.0 h1:gADYeifvlqK3R3i2cR5B4DGgxLXIPb3TRTH1mGi0jPI=
 github.com/PaesslerAG/jsonpath v0.1.0/go.mod h1:4BzmtoM/PI8fPO4aQGIusjGxGir2BzcV0grWtFzq1Y8=
 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
-github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
 github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
+github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
 github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
-github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
-github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
 github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
-github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
-github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
 github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
-github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199 h1:kufr0u0RIG5ACpjFsPRbbuHa0FhMWsS3tnSFZ2hf07s=
 github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199/go.mod h1:mqaaaP4j7nTF8T/hx5OCljA7BYWHmrH2uh+Q023OchE=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
+github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
 github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g=
 github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks=
 github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY=
 github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
+github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
 github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
+github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE=
 github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
-github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
+github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
 github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
-github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
-github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
-github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
-github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
 github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M=
 github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
 github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
 github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
 github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
 github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
 github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
 github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
@@ -118,8 +212,13 @@
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY=
 github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
 github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
+github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk=
+github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
+github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
@@ -128,34 +227,40 @@
 github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
 github.com/jonas-p/go-shp v0.1.2-0.20190401125246-9fd306ae10a6 h1:h5O7ee4tlSPVjdC75eSLX7jXZiHftthuHio/GtrhaSM=
 github.com/jonas-p/go-shp v0.1.2-0.20190401125246-9fd306ae10a6/go.mod h1:MRIhyxDQ6VVp0oYeD7yPGr5RSTNScUFKCDsI5DR7PtI=
-github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
-github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
-github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
-github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
 github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
 github.com/lib/pq v1.2.0 h1:LXpIM/LZ5xGFhOpXAQUIMM1HdyqzVYM13zNdjCEEcA0=
 github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
 github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
+github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
+github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
 github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
+github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
 github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
 github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
 github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
 github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
@@ -164,21 +269,20 @@
 github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
 github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
-github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
 github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/mitchellh/mapstructure v1.4.2 h1:6h7AQ0yhTcIsmFmnAwQls75jp2Gzs4iB8W7pjMO+rqo=
+github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
-github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
-github.com/pelletier/go-toml v1.9.1 h1:a6qW1EVNZWH9WGI6CsYdD8WAylkoXBS5yv0XHlh17Tc=
-github.com/pelletier/go-toml v1.9.1/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
+github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
+github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY=
 github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -186,63 +290,51 @@
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
-github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
-github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/richardlehane/mscfb v1.0.3 h1:rD8TBkYWkObWO0oLDFCbwMeZ4KoalxQy+QgniCj3nKI=
 github.com/richardlehane/mscfb v1.0.3/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
 github.com/richardlehane/msoleps v1.0.1 h1:RfrALnSNXzmXLbGct/P2b4xkFz4e8Gmj/0Vj9M9xC1o=
 github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
-github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
-github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik=
-github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
+github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so=
+github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
 github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE=
 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
 github.com/shopspring/decimal v0.0.0-20190905144223-a36b5d85f337 h1:Da9XEUfFxgyDOqUfwgoTDcWzmnlOnCGi6i4iPS+8Fbw=
 github.com/shopspring/decimal v0.0.0-20190905144223-a36b5d85f337/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
 github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
-github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
-github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
-github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
-github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
-github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
 github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
 github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
-github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
-github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M=
-github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
-github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
+github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw=
+github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
 github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
-github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
 github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
-github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
-github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk=
-github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
+github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
+github.com/spf13/viper v1.9.0 h1:yR6EXjTp0y0cLN8OZg1CRZmOBdI88UcGkhgyJhu6nZk=
+github.com/spf13/viper v1.9.0/go.mod h1:+i6ajR7OX2XaiBkrcZJFK21htRk7eDeLg7+O6bhUPP4=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/tidwall/cities v0.1.0 h1:CVNkmMf7NEC9Bvokf5GoSsArHCKRMTgLuubRTHnH0mE=
@@ -251,29 +343,47 @@
 github.com/tidwall/geoindex v1.4.4/go.mod h1:rvVVNEFfkJVWGUdEfU8QaoOg/9zFX0h9ofWzA60mz1I=
 github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8=
 github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8=
-github.com/tidwall/rtree v1.2.8 h1:KzqIidAdzviaRM3BQoAHMym1zy2HYE2ta+UOPse9Pyo=
-github.com/tidwall/rtree v1.2.8/go.mod h1:S+JSsqPTI8LfWA4xHBo5eXzie8WJLVFeppAutSegl6M=
-github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
-github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/tidwall/rtree v1.3.1 h1:xu3vJPKJrmGce7YJcFUCoqLrp9DTUEJBnVgdPSXHgHs=
+github.com/tidwall/rtree v1.3.1/go.mod h1:S+JSsqPTI8LfWA4xHBo5eXzie8WJLVFeppAutSegl6M=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
 github.com/xuri/efp v0.0.0-20210322160811-ab561f5b45e3 h1:EpI0bqf/eX9SdZDwlMmahKM+CDBgNbsXMhsN28XrM8o=
 github.com/xuri/efp v0.0.0-20210322160811-ab561f5b45e3/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
-go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
-go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0=
-go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
+github.com/xuri/excelize/v2 v2.4.1 h1:veeeFLAJwsNEBPBlDepzPIYS1eLyBVcXNZUW79exZ1E=
+github.com/xuri/excelize/v2 v2.4.1/go.mod h1:rSu0C3papjzxQA3sdK8cU544TebhrPUoTOaGPIh0Q1A=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU=
+go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
+go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
+go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
 go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
 go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
-golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/crypto v0.0.0-20210415154028-4f45737414dc/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a h1:kr2P4QFmQr29mSLA43kwrOcgcReGTfbE9N577tCTuBc=
-golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
+golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -282,8 +392,13 @@
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
 golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE=
-golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw=
 golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@@ -302,16 +417,26 @@
 golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
 golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
@@ -320,50 +445,137 @@
 golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20210415231046-e915ea6b2b7d/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo=
-golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211020060615-d418f374d309 h1:A0lJIi+hcTR6aajJH4YqKWwohY4aW9RO7oRMcdv+HKI=
+golang.org/x/net v0.0.0-20211020060615-d418f374d309/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea h1:+WiDlPBBaO+h9vPNZi8uJ3k4BkKQB7Iow3aqwHVA5hI=
-golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211020174200-9d6173849985 h1:LOlKVhfDyahgmqa97awczplwkjzNaELFg3zRIJ13RYo=
+golang.org/x/sys v0.0.0-20211020174200-9d6173849985/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
@@ -375,19 +587,62 @@
 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
 golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
+golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
 gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
-gonum.org/v1/gonum v0.9.1 h1:HCWmqqNoELL0RAQeKBXWtkp04mGk8koafcB4He6+uhc=
-gonum.org/v1/gonum v0.9.1/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
+gonum.org/v1/gonum v0.9.3 h1:DnoIG+QAMaF5NvxnGe/oKsgKcAc6PcUyl8q0VetfQ8s=
+gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0=
 gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc=
 gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
 gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
@@ -397,10 +652,36 @@
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
 google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
+google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8=
+google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
+google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
+google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
+google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
+google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
+google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
@@ -410,35 +691,120 @@
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
 google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
+google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24=
+google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k=
+google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
+google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
 google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
+google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
+google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
+gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
-gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
 gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
-gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
+gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c=
+gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/robfig/cron.v1 v1.2.0 h1:PSJsm0uPEND0Rumxxbo7qNb7bxQUTIWDIdpPS59/tcw=
 gopkg.in/robfig/cron.v1 v1.2.0/go.mod h1:3I22DCB+7VAStCIqyArwi2xY9a7IioCiNjrsnCqs+HE=
-gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
+rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
--- a/pkg/auth/opendb.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/auth/opendb.go	Tue Feb 08 10:20:26 2022 +0100
@@ -104,7 +104,7 @@
 )
 SELECT rolname FROM pg_roles
 WHERE oid IN (SELECT oid FROM cte) AND rolname <> current_user
-AND EXISTS (SELECT 1 FROM users.list_users WHERE username = current_user)`
+AND EXISTS (SELECT 1 FROM users.list_users WHERE username = current_user AND active)`
 
 // AllOtherRoles loggs in as user with password and returns a list
 // of all roles the logged in user has in the system.
--- a/pkg/auth/store.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/auth/store.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,11 +16,12 @@
 import (
 	"bytes"
 	"errors"
-	"log"
 	"time"
 
+	bolt "go.etcd.io/bbolt"
+
 	"gemma.intevation.de/gemma/pkg/config"
-	bolt "go.etcd.io/bbolt"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // ErrNoSuchToken is returned if a given token does not
@@ -130,7 +131,7 @@
 		return b.Delete([]byte(token))
 	})
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
 
@@ -163,7 +164,7 @@
 		return b.Put([]byte(token), buf.Bytes())
 	})
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
 
@@ -252,10 +253,10 @@
 // If using the persistent mode the backing session database is closed.
 func (ss *SessionStore) Shutdown() error {
 	if db := ss.storage; db != nil {
-		log.Println("info: shutdown persistent session store.")
+		log.Infof("shutdown persistent session store.")
 		ss.storage = nil
 		return db.Close()
 	}
-	log.Println("info: shutdown in-memory session store.")
+	log.Infof("shutdown in-memory session store.")
 	return nil
 }
--- a/pkg/common/attributes.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/common/attributes.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,10 +15,11 @@
 package common
 
 import (
-	"log"
 	"strconv"
 	"strings"
 	"time"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 type (
@@ -126,7 +127,7 @@
 	}
 	d, err := time.Parse(DateFormat, s)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return time.Time{}, false
 	}
 	return d, true
@@ -147,7 +148,7 @@
 	}
 	t, err := time.Parse(TimeFormat, s)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return time.Time{}, false
 	}
 	return t, true
@@ -171,7 +172,7 @@
 	}
 	i, err := strconv.Atoi(s)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return 0, false
 	}
 	return i, true
@@ -194,7 +195,7 @@
 	}
 	f, err := strconv.ParseFloat(s, 64)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return 0, false
 	}
 	return f, true
@@ -217,7 +218,7 @@
 	}
 	d, err := time.ParseDuration(s)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return 0, false
 	}
 	return d, true
--- a/pkg/common/random.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/common/random.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,11 +17,12 @@
 	"bytes"
 	"crypto/rand"
 	"io"
-	"log"
 	"math"
 	"math/big"
 	mrand "math/rand"
 	"time"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // GenerateRandomKey generates a cryptographically secure random key
@@ -54,7 +55,7 @@
 		for i := range out {
 			v, err := rand.Int(rand.Reader, max)
 			if err != nil {
-				log.Panicf("error: %v\n", err)
+				log.Panicf("%v\n", err)
 			}
 			out[i] = alphabet[v.Int64()]
 		}
@@ -63,7 +64,7 @@
 			return string(out)
 		}
 	}
-	log.Println("warn: Your random generator may be broken.")
+	log.Warnf("Your random generator may be broken.")
 	out[0] = special[0]
 	return string(out)
 }
@@ -77,7 +78,7 @@
 
 	var seed int64
 	if seedInt, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt64)); err != nil {
-		log.Printf("warn: Generating good random seed failed: %v\n", err)
+		log.Warnf("Generating good random seed failed: %v\n", err)
 		seed = time.Now().Unix()
 	} else {
 		seed = seedInt.Int64()
--- a/pkg/config/config.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/config/config.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,7 +17,7 @@
 import (
 	"crypto/sha256"
 	"fmt"
-	"log"
+	lg "log"
 	"sync"
 	"time"
 
@@ -27,6 +27,7 @@
 	"github.com/spf13/viper"
 
 	"gemma.intevation.de/gemma/pkg/common"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // This is not part of the persistent config.
@@ -125,6 +126,12 @@
 // ReportPath is a path where report templates are stored.
 func ReportPath() string { return viper.GetString("report-path") }
 
+// LogFile is the path to the log file.
+func LogFile() string { return viper.GetString("log-file") }
+
+// LogLevel is the log level of the application.
+func LogLevel() log.LogLevel { return log.ParseLogLevel(viper.GetString("log-level")) }
+
 var (
 	proxyKeyOnce       sync.Once
 	proxyKey           []byte
@@ -192,7 +199,7 @@
 		if sessionTimeout == 0 {
 			sessionTimeout = viper.GetDuration("session-timeout")
 			if sessionTimeout <= 0 {
-				log.Println("warn: non-positive session-timeout configured.")
+				lg.Println("warn: non-positive session-timeout configured.")
 			}
 		}
 	}
@@ -296,6 +303,10 @@
 	str("report-path", "", "path to a report templates.")
 
 	d("soap-timeout", 3*time.Minute, "Timeout till a SOAP request is canceled.")
+
+	str("log-file", "", "path to a file to log to.")
+	str("log-level", log.InfoLogLevel.String(), "path to a file to log to.")
+
 }
 
 var (
@@ -332,7 +343,7 @@
 		// Find home directory.
 		home, err := homedir.Dir()
 		if err != nil {
-			log.Fatalf("error: %v\n", err)
+			lg.Fatalf("error: %v\n", err)
 		}
 
 		// Search config in home directory with name ".cobra" (without extension).
@@ -344,6 +355,6 @@
 			// Don't bother if not found.
 			return
 		}
-		log.Fatalf("Can't read config: %v\n", err)
+		lg.Fatalf("Can't read config: %v\n", err)
 	}
 }
--- a/pkg/controllers/common.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/common.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,11 +15,12 @@
 
 import (
 	"fmt"
-	"log"
 	"strconv"
 	"strings"
 
 	"github.com/jackc/pgx/pgtype"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 type (
@@ -94,7 +95,7 @@
 	}
 	var ia pgtype.Int8Array
 	if err := ia.Set(ints); err != nil {
-		log.Printf("warn: %v\n", err)
+		log.Warnf("%v\n", err)
 		return nil
 	}
 	return &ia
@@ -106,7 +107,7 @@
 	}
 	var ta pgtype.TextArray
 	if err := ta.Set(s); err != nil {
-		log.Printf("warn: %v\n", err)
+		log.Warnf("%v\n", err)
 		return nil
 	}
 	return &ta
--- a/pkg/controllers/cross.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/cross.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,10 +17,10 @@
 	"context"
 	"database/sql"
 	"fmt"
-	"log"
 	"net/http"
 	"time"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/mesh"
 	"gemma.intevation.de/gemma/pkg/models"
 
@@ -78,7 +78,7 @@
 		ctx, conn,
 		csi.Properties.Bottleneck, csi.Properties.Date.Time)
 
-	log.Printf("info: loading mesh took %s\n", time.Since(start))
+	log.Infof("loading mesh took %s\n", time.Since(start))
 	if err != nil {
 		return
 	}
@@ -110,7 +110,7 @@
 
 	coords, err := reproject(ctx, rp, csi.Geometry.Coordinates)
 
-	log.Printf("info: transforming input coords took %s\n", time.Since(start))
+	log.Infof("transforming input coords took %s\n", time.Since(start))
 	if err != nil {
 		return
 	}
@@ -133,16 +133,16 @@
 		})
 
 		if len(line) > 0 {
-			log.Printf("info: line length: %d\n", len(line))
+			log.Infof("line length: %d\n", len(line))
 			// They are all on the segment (c1.Lat, c1.Lon) - (c2.Lat, c2.Lon).
 			// Sort them by project them on this line.
 			joined := line.JoinOnLine(c1.Lat, c1.Lon, c2.Lat, c2.Lon)
-			log.Printf("info: joined length: %d\n", len(joined))
+			log.Infof("joined length: %d\n", len(joined))
 			segments = append(segments, joined...)
 		}
 
 	}
-	log.Printf("info: mesh traversal took %s\n", time.Since(start))
+	log.Infof("mesh traversal took %s\n", time.Since(start))
 
 	start = time.Now()
 
@@ -153,7 +153,7 @@
 		conn,
 	)
 
-	log.Printf("info: projecting back took %s\n", time.Since(start))
+	log.Infof("projecting back took %s\n", time.Since(start))
 	if err != nil {
 		return
 	}
--- a/pkg/controllers/diff.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/diff.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,13 +18,13 @@
 	"database/sql"
 	"errors"
 	"fmt"
-	"log"
 	"net/http"
 	"runtime"
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/mesh"
 	"gemma.intevation.de/gemma/pkg/models"
 
@@ -166,7 +166,7 @@
 		ctx, conn,
 		dci.Bottleneck, dci.Minuend.Time)
 
-	log.Printf("info: loading minuend mesh took %s\n", time.Since(start))
+	log.Infof("loading minuend mesh took %s\n", time.Since(start))
 	if err != nil {
 		return 0, err
 	}
@@ -199,13 +199,13 @@
 		return 0, errors.New("intersection is empty")
 	}
 
-	log.Printf("info: bbox of intersection: (%.2f, %.2f) - (%.2f, %.2f)\n",
+	log.Infof("bbox of intersection: (%.2f, %.2f) - (%.2f, %.2f)\n",
 		box.X1, box.Y1, box.X2, box.Y2)
 
 	start = time.Now()
 	raster := mesh.NewRaster(box, isoCellSize)
 	raster.Rasterize(minuendTree.Value)
-	log.Printf("info: rasterizing minuend took %v\n", time.Since(start))
+	log.Infof("rasterizing minuend took %v\n", time.Since(start))
 
 	minuendTree = nil
 
@@ -215,7 +215,7 @@
 		ctx, conn,
 		dci.Bottleneck, dci.Subtrahend.Time)
 
-	log.Printf("info: loading subtrahend mesh took %s\n", time.Since(start))
+	log.Infof("loading subtrahend mesh took %s\n", time.Since(start))
 	if err != nil {
 		return 0, err
 	}
@@ -234,7 +234,7 @@
 
 	start = time.Now()
 	raster.Diff(subtrahendTree.Value)
-	log.Printf("info: A - B took %v\n", time.Since(start))
+	log.Infof("A - B took %v\n", time.Since(start))
 	subtrahendTree = nil
 
 	// XXX: Maybe we should start this transaction earlier!?
@@ -249,7 +249,7 @@
 		return 0, errors.New("scans do not have common points")
 	}
 
-	log.Printf("info: z range: %.3f - %.3f\n", zMin, zMax)
+	log.Infof("z range: %.3f - %.3f\n", zMin, zMax)
 
 	var heights mesh.ClassBreaks
 
@@ -257,7 +257,7 @@
 		ctx, tx,
 		"morphology_classbreaks_compare")
 	if err != nil {
-		log.Printf("warn: Loading class breaks failed: %v\n", err)
+		log.Warnf("Loading class breaks failed: %v\n", err)
 		err = nil
 		heights = mesh.SampleDiffHeights(zMin, zMax, contourStep)
 	} else {
@@ -266,7 +266,7 @@
 
 	heights = common.DedupFloat64s(heights)
 
-	log.Printf("info: num heights: %d\n", len(heights))
+	log.Infof("num heights: %d\n", len(heights))
 
 	var isoStmt *sql.Stmt
 	if isoStmt, err = tx.PrepareContext(ctx, insertDiffIsoAreasQL); err != nil {
@@ -308,18 +308,18 @@
 		}
 	}
 
-	log.Printf("info: Transferred WKB size: %.2fMB.\n",
+	log.Infof("Transferred WKB size: %.2fMB.\n",
 		float64(size)/(1024*1024))
 
-	log.Printf("info: calculating and storing iso areas took %v\n",
+	log.Infof("calculating and storing iso areas took %v\n",
 		time.Since(start))
 
 	if err = tx.Commit(); err != nil {
-		log.Printf("info: difference calculation failed after %v\n",
+		log.Infof("difference calculation failed after %v\n",
 			time.Since(begin))
 		return 0, err
 	}
-	log.Printf("info: difference calculation succeed after %v\n",
+	log.Infof("difference calculation succeed after %v\n",
 		time.Since(begin))
 
 	return id, nil
@@ -443,7 +443,7 @@
 			}
 		}
 	case <-ctx.Done():
-		log.Println("request canceled")
+		log.Infoln("request canceled")
 	}
 
 	return
--- a/pkg/controllers/fwa.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/fwa.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,7 +18,6 @@
 	"database/sql"
 	"encoding/csv"
 	"fmt"
-	"log"
 	"net/http"
 	"sort"
 	"strconv"
@@ -28,6 +27,7 @@
 	"github.com/gorilla/mux"
 
 	"gemma.intevation.de/gemma/pkg/common"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/middleware"
 )
 
@@ -219,7 +219,7 @@
 	}
 
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "cannot extract bottlenecks", http.StatusBadRequest)
 		return
 	}
@@ -233,37 +233,45 @@
 	// load validities and limiting factors
 	for i := range bns {
 		if err := bns[i].loadLimitingValidities(ctx, conn, from, to); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "cannot load validities", http.StatusInternalServerError)
 			return
 		}
 		// load LCDs
 		if err := bns[i].loadLDCs(ctx, conn, from, to); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "cannot load LDCs", http.StatusInternalServerError)
 			return
 		}
 		// load values
 		if err := bns[i].loadValues(ctx, conn, from, to, los); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "cannot load values", http.StatusInternalServerError)
 			return
 		}
 	}
 
 	// separate breaks for depth and width
-	var (
-		breaks       = parseBreaks(req.FormValue("breaks"), afdRefs)
-		depthBreaks  = parseBreaks(req.FormValue("depthbreaks"), breaks)
-		widthBreaks  = parseBreaks(req.FormValue("widthbreaks"), breaks)
-		chooseBreaks = [...][]float64{
-			limitingDepth: depthBreaks,
-			limitingWidth: widthBreaks,
-		}
+	breaks, ok := parseBreaks(rw, req, "breaks", afdRefs)
+	if !ok {
+		return
+	}
+	depthBreaks, ok := parseBreaks(rw, req, "depthbreaks", breaks)
+	if !ok {
+		return
+	}
+	widthBreaks, ok := parseBreaks(rw, req, "widthbreaks", breaks)
+	if !ok {
+		return
+	}
 
-		useDepth = bns.hasLimiting(limitingDepth, from, to)
-		useWidth = bns.hasLimiting(limitingWidth, from, to)
-	)
+	chooseBreaks := [...][]float64{
+		limitingDepth: depthBreaks,
+		limitingWidth: widthBreaks,
+	}
+
+	useDepth := bns.hasLimiting(limitingDepth, from, to)
+	useWidth := bns.hasLimiting(limitingWidth, from, to)
 
 	if useDepth && useWidth && len(widthBreaks) != len(depthBreaks) {
 		http.Error(
@@ -292,7 +300,7 @@
 
 	if err := out.Write(record); err != nil {
 		// Too late for HTTP status message.
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 
@@ -384,12 +392,12 @@
 				}
 			}
 
-			if min := minClass(bns[i].measurements.classify(
+			classes := bns[i].measurements.classify(
 				current, next,
 				chooseBreaks[vs.limiting],
-				limitingAccess[vs.limiting]),
-				12*time.Hour,
-			); min < lowest {
+				limitingAccess[vs.limiting])
+
+			if min := minClass(classes, 12*time.Hour); min < lowest {
 				lowest = min
 			}
 		}
@@ -409,7 +417,7 @@
 		if finish(next) {
 			if err := write(); err != nil {
 				// Too late for HTTP status message.
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 				return
 			}
 
@@ -427,14 +435,14 @@
 	if totalDays > 0 {
 		if err := write(); err != nil {
 			// Too late for HTTP status message.
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return
 		}
 	}
 
 	for i, days := range missingLDCs {
 		if missingLDCs[i] > 0 {
-			log.Printf("warn: Missing LDCs for %s on %d days.\n",
+			log.Warnf("warn: Missing LDCs for %s on %d days.\n",
 				bns[i].id, days)
 		}
 	}
@@ -442,7 +450,7 @@
 	out.Flush()
 	if err := out.Error(); err != nil {
 		// Too late for HTTP status message.
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
 
@@ -488,25 +496,42 @@
 	}
 }
 
-func breaksToReferenceValue(breaks string) []float64 {
+func breaksToReferenceValue(breaks string) ([]float64, error) {
 	parts := strings.Split(breaks, ",")
 	var values []float64
 
 	for _, part := range parts {
 		part = strings.TrimSpace(part)
-		if v, err := strconv.ParseFloat(part, 64); err == nil {
-			values = append(values, v)
+		v, err := strconv.ParseFloat(part, 64)
+		if err != nil {
+			return nil, err
 		}
+		values = append(values, v)
 	}
 
-	return common.DedupFloat64s(values)
+	return common.DedupFloat64s(values), nil
 }
 
-func parseBreaks(breaks string, defaults []float64) []float64 {
-	if breaks != "" {
-		return breaksToReferenceValue(breaks)
+func parseBreaks(
+	rw http.ResponseWriter, req *http.Request,
+	parameter string,
+	defaults []float64,
+) ([]float64, bool) {
+
+	breaks := strings.TrimSpace(req.FormValue(parameter))
+	if breaks == "" {
+		return defaults, true
 	}
-	return defaults
+
+	defaults, err := breaksToReferenceValue(breaks)
+	if err != nil {
+		msg := fmt.Sprintf("Parameter '%s' is invalid: %s.", parameter, err)
+		log.Errorf("%s\n", msg)
+		http.Error(rw, msg, http.StatusBadRequest)
+		return nil, false
+	}
+
+	return defaults, true
 }
 
 func (tr *timeRange) intersects(from, to time.Time) bool {
@@ -561,7 +586,7 @@
 	case "width":
 		return limitingWidth
 	default:
-		log.Printf("warn: unknown limitation '%s'. default to 'depth'\n", limiting)
+		log.Warnf("unknown limitation '%s'. default to 'depth'\n", limiting)
 		return limitingDepth
 	}
 }
--- a/pkg/controllers/gauges.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/gauges.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,7 +18,6 @@
 	"database/sql"
 	"encoding/csv"
 	"fmt"
-	"log"
 	"math"
 	"net/http"
 	"sort"
@@ -31,6 +30,7 @@
 	"gonum.org/v1/gonum/stat"
 
 	"gemma.intevation.de/gemma/pkg/common"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 
 	mw "gemma.intevation.de/gemma/pkg/middleware"
@@ -193,8 +193,8 @@
 	begin := time.Date(year, time.January, 1, 0, 0, 0, 0, time.UTC)
 	end := time.Date(year+1, time.January, 1, 0, 0, 0, 0, time.UTC).Add(-time.Microsecond)
 
-	log.Printf("info: begin %s\n", begin)
-	log.Printf("info: end   %s\n", end)
+	log.Infof("begin %s\n", begin)
+	log.Infof("end   %s\n", end)
 
 	rows, err := conn.QueryContext(
 		ctx,
@@ -235,7 +235,7 @@
 		var when time.Time
 		var value float64
 		if err := rows.Scan(&when, &value); err != nil {
-			log.Printf("error: %v", err)
+			log.Errorf("%v", err)
 			// Too late for an HTTP error code.
 			return
 		}
@@ -243,7 +243,7 @@
 		day, month := when.Day(), int(when.Month())
 		if day != lastDay || month != lastMonth {
 			if err := write(); err != nil {
-				log.Printf("error: %v", err)
+				log.Errorf("%v", err)
 				// Too late for an HTTP error code.
 				return
 			}
@@ -253,13 +253,13 @@
 	}
 
 	if err := rows.Err(); err != nil {
-		log.Printf("error: %v", err)
+		log.Errorf("%v", err)
 		// Too late for an HTTP error code.
 		return
 	}
 
 	if err := write(); err != nil {
-		log.Printf("error: %v", err)
+		log.Errorf("%v", err)
 		// Too late for an HTTP error code.
 	}
 }
@@ -364,9 +364,9 @@
 		return
 	}
 
-	log.Printf("info: loading entries took %s\n", time.Since(start))
+	log.Infof("loading entries took %s\n", time.Since(start))
 
-	log.Printf("info: days found: %d\n", len(results))
+	log.Infof("days found: %d\n", len(results))
 
 	sort.Slice(results, func(i, j int) bool {
 		if d := results[i].month - results[j].month; d != 0 {
@@ -392,7 +392,7 @@
 	}
 
 	if err := out.Write(record); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		// Too late for an HTTP error code.
 		return
 	}
@@ -408,7 +408,7 @@
 	}
 
 	if err := out.Write(record); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		// Too late for an HTTP error code.
 		return
 	}
@@ -423,7 +423,7 @@
 		record[5] = float64format(r.q25)
 		record[6] = float64format(r.q75)
 		if err := out.Write(record); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			// Too late for an HTTP error code.
 			return
 		}
@@ -431,7 +431,7 @@
 
 	out.Flush()
 	if err := out.Error(); err != nil {
-		log.Printf("error: %v", err)
+		log.Errorf("%v", err)
 		// Too late for an HTTP error code.
 		return
 	}
@@ -557,10 +557,10 @@
 	}
 
 	// for i := range values {
-	// 	log.Printf("%v %f %d\n", values[i].when, values[i].observed, len(values[i].predicted))
+	// 	log.Debugf("%v %f %d\n", values[i].when, values[i].observed, len(values[i].predicted))
 	// 	if len(values[i].predicted) > 0 {
 	// 		for j := range values[i].predicted {
-	// 			log.Printf("\t%v %f\n", values[i].predicted[j].When, values[i].predicted[j].Value)
+	// 			log.Debugf("\t%v %f\n", values[i].predicted[j].When, values[i].predicted[j].Value)
 	// 		}
 	// 	}
 	// }
@@ -599,7 +599,7 @@
 		return
 	}
 
-	log.Printf("info: found %d value(s) for Nash Sutcliffe.\n", len(values))
+	log.Infof("found %d value(s) for Nash Sutcliffe.\n", len(values))
 
 	type coeff struct {
 		Value   float64 `json:"value"`
@@ -746,7 +746,7 @@
 	}
 
 	if err := out.Write(record); err != nil {
-		log.Printf("error: %v", err)
+		log.Errorf("%v", err)
 		// Too late for an HTTP error code.
 		return
 	}
@@ -766,7 +766,7 @@
 			&valueMax,
 			&predicted,
 		); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			// Too late for an HTTP error code.
 			return
 		}
@@ -777,21 +777,21 @@
 		record[4] = boolFormat(predicted)
 
 		if err := out.Write(record); err != nil {
-			log.Printf("error: %v", err)
+			log.Errorf("%v", err)
 			// Too late for an HTTP error code.
 			return
 		}
 	}
 
 	if err := rows.Err(); err != nil {
-		log.Printf("error: %v", err)
+		log.Errorf("%v", err)
 		// Too late for an HTTP error code.
 		return
 	}
 
 	out.Flush()
 	if err := out.Error(); err != nil {
-		log.Printf("error: %v", err)
+		log.Errorf("%v", err)
 		// Too late for an HTTP error code.
 		return
 	}
--- a/pkg/controllers/geostyling.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/geostyling.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,12 +17,12 @@
 	"bytes"
 	"fmt"
 	"io"
-	"log"
 	"net/http"
 
 	"github.com/gorilla/mux"
 
 	"gemma.intevation.de/gemma/pkg/geoserver"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 )
 
@@ -68,15 +68,15 @@
 
 	style, err := extractStyle(req)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
 		return
 	}
 
-	log.Printf("info: uploaded file length: %d\n", len(style))
+	log.Infof("uploaded file length: %d\n", len(style))
 
 	if err := models.UpdateInternalStyle(req, feature, style); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 		return
 	}
--- a/pkg/controllers/importqueue.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/importqueue.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,7 +19,6 @@
 	"encoding/csv"
 	"encoding/json"
 	"fmt"
-	"log"
 	"net/http"
 	"strconv"
 	"strings"
@@ -31,6 +30,7 @@
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/imports"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 
 	mw "gemma.intevation.de/gemma/pkg/middleware"
@@ -251,7 +251,7 @@
 	case err == sql.ErrNoRows:
 		return nil
 	case err != nil:
-		log.Printf("warn: %v\n", err)
+		log.Warnf("%v\n", err)
 		return nil
 	}
 	return &models.ImportTime{Time: when.UTC()}
@@ -283,7 +283,7 @@
 
 	if err := out.Write(record); err != nil {
 		// Too late for HTTP status message.
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 
@@ -291,7 +291,7 @@
 	ctx := req.Context()
 	var rows *sql.Rows
 	if rows, err = conn.QueryContext(ctx, list.stmt.String(), list.args...); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 	defer rows.Close()
@@ -341,10 +341,10 @@
 		if jc := imports.FindJobCreator(imports.JobKind(kind)); jc != nil {
 			job := jc.Create()
 			if err := common.FromJSONString(data, job); err != nil {
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 			} else if desc, ok := job.(Description); ok {
 				if description, err = desc.Description(); err != nil {
-					log.Printf("error: %v\n", err)
+					log.Errorf("%v\n", err)
 				}
 			}
 		}
@@ -361,18 +361,18 @@
 		record[9] = strings.Replace(description, ",", "|", -1)
 
 		if err := out.Write(record); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return
 		}
 	}
 
 	out.Flush()
 	if err := out.Error(); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 
 	if err = rows.Err(); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 }
--- a/pkg/controllers/manualimports.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/manualimports.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,7 +15,6 @@
 package controllers
 
 import (
-	"log"
 	"net/http"
 	"time"
 
@@ -24,6 +23,7 @@
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/imports"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 
 	mw "gemma.intevation.de/gemma/pkg/middleware"
@@ -33,7 +33,7 @@
 	kind := mux.Vars(req)["kind"]
 	ctor := imports.ImportModelForJobKind(imports.JobKind(kind))
 	if ctor == nil {
-		log.Printf("error: Unknown job kind '%s'.\n", kind)
+		log.Errorf("unknown job kind '%s'.\n", kind)
 		panic(http.ErrAbortHandler)
 	}
 	return ctor()
@@ -94,7 +94,7 @@
 		return
 	}
 
-	log.Printf("info: added import #%d to queue\n", jobID)
+	log.Infof("added import #%d to queue\n", jobID)
 
 	result := struct {
 		ID int64 `json:"id"`
--- a/pkg/controllers/proxy.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/proxy.go	Tue Feb 08 10:20:26 2022 +0100
@@ -22,7 +22,6 @@
 	"encoding/xml"
 	"io"
 	"io/ioutil"
-	"log"
 	"net/http"
 	"net/url"
 	"regexp"
@@ -32,6 +31,7 @@
 	"golang.org/x/net/html/charset"
 
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/middleware"
 )
 
@@ -53,10 +53,10 @@
 
 	return func(req *http.Request) {
 
-		//log.Printf("proxyDirector: %s\n", req.RequestURI)
+		//log.Debugf("proxyDirector: %s\n", req.RequestURI)
 
 		abort := func(format string, args ...interface{}) {
-			log.Printf(format, args...)
+			log.Errorf(format, args...)
 			panic(http.ErrAbortHandler)
 		}
 
@@ -66,7 +66,7 @@
 
 		if entry, found := vars["entry"]; found {
 			if s, found = lookup(entry); !found {
-				log.Printf("warn: cannot find entry '%s'\n", entry)
+				log.Warnf("cannot find entry '%s'\n", entry)
 				panic(middleware.ErrNotFound)
 			}
 		} else {
@@ -91,7 +91,7 @@
 		}
 
 		nURL := s + "?" + req.URL.RawQuery
-		//log.Printf("%v\n", nURL)
+		//log.Debugf("%v\n", nURL)
 
 		u, err := url.Parse(nURL)
 		if err != nil {
@@ -101,7 +101,7 @@
 
 		req.Host = u.Host
 		//req.Header.Del("If-None-Match")
-		//log.Printf("headers: %v\n", req.Header)
+		//log.Debugf("headers: %v\n", req.Header)
 	}
 }
 
@@ -117,7 +117,7 @@
 ) {
 	switch enc := h.Get("Content-Encoding"); {
 	case strings.Contains(enc, "gzip"):
-		//log.Println("info: gzip compression")
+		//log.Debugf("gzip compression")
 		return func(r io.Reader) (io.ReadCloser, error) {
 				return gzip.NewReader(r)
 			},
@@ -125,7 +125,7 @@
 				return gzip.NewWriter(w), nil
 			}
 	case strings.Contains(enc, "deflate"):
-		//log.Println("info: deflate compression")
+		//log.Debugf("deflate compression")
 		return func(r io.Reader) (io.ReadCloser, error) {
 				return flate.NewReader(r), nil
 			},
@@ -133,7 +133,7 @@
 				return flate.NewWriter(w, flate.DefaultCompression)
 			}
 	default:
-		//log.Println("info: no content compression")
+		//log.Debugf("no content compression")
 		return func(r io.Reader) (io.ReadCloser, error) {
 				if r2, ok := r.(io.ReadCloser); ok {
 					return r2, nil
@@ -184,10 +184,10 @@
 				w.Close()
 				pw.Close()
 				force.Close()
-				//log.Printf("info: rewrite took %s\n", time.Since(start))
+				//log.Debugf("rewrite took %s\n", time.Since(start))
 			}()
 			if err := rewrite(suffix, w, r); err != nil {
-				log.Printf("error: rewrite failed: %v\n", err)
+				log.Errorf("rewrite failed: %v\n", err)
 				return
 			}
 		}(resp.Body)
--- a/pkg/controllers/pwreset.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/pwreset.go	Tue Feb 08 10:20:26 2022 +0100
@@ -22,7 +22,6 @@
 	"encoding/hex"
 	"errors"
 	"io"
-	"log"
 	"net/http"
 	"os/exec"
 	"strconv"
@@ -40,6 +39,7 @@
 	"gemma.intevation.de/gemma/pkg/misc"
 	"gemma.intevation.de/gemma/pkg/models"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	mw "gemma.intevation.de/gemma/pkg/middleware"
 )
 
@@ -142,7 +142,7 @@
 				return err
 			})
 		if err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 		}
 	}
 }
@@ -159,7 +159,7 @@
 	}
 	var buf bytes.Buffer
 	if err := passwordResetRequestMailTmpl.Execute(&buf, &content); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 	return buf.String()
 }
@@ -245,7 +245,7 @@
 		config.WaitReady()
 		host := config.ExternalURL()
 		if err := backgroundRequest(host, user); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 		}
 	}(mw.JSONInput(req).(*models.PWResetUser))
 
@@ -312,7 +312,7 @@
 	}
 
 	if err := changedMessageBody(rw, user, password); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
 
@@ -326,6 +326,6 @@
 			return err
 		},
 	); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
--- a/pkg/controllers/report.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/report.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,7 +16,6 @@
 import (
 	"database/sql"
 	"fmt"
-	"log"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -27,10 +26,11 @@
 	"gemma.intevation.de/gemma/pkg/middleware"
 	"gemma.intevation.de/gemma/pkg/xlsx"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	mw "gemma.intevation.de/gemma/pkg/middleware"
 
-	"github.com/360EntSecGroup-Skylar/excelize/v2"
 	"github.com/gorilla/mux"
+	"github.com/xuri/excelize/v2"
 )
 
 func listReports(req *http.Request) (jr mw.JSONResult, err error) {
@@ -47,7 +47,7 @@
 
 	dir, err := os.Open(path)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		err = mw.JSONError{
 			Code:    http.StatusInternalServerError,
 			Message: "Listing report templates failed.",
@@ -57,7 +57,7 @@
 	defer dir.Close()
 	files, err := dir.Readdirnames(-1)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		err = mw.JSONError{
 			Code:    http.StatusInternalServerError,
 			Message: "Listing report templates failed.",
@@ -110,15 +110,15 @@
 
 	if stat, err := os.Stat(path); err != nil {
 		if os.IsNotExist(err) {
-			log.Printf("error: report dir '%s' does not exists.\n", path)
+			log.Errorf("report dir '%s' does not exists.\n", path)
 			http.NotFound(rw, req)
 		} else {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
 		}
 		return
 	} else if !stat.Mode().IsDir() {
-		log.Printf("error: report dir '%s' is not a directory.\n", path)
+		log.Errorf("report dir '%s' is not a directory.\n", path)
 		http.NotFound(rw, req)
 		return
 	}
@@ -134,7 +134,7 @@
 			if os.IsNotExist(err) {
 				http.NotFound(rw, req)
 			} else {
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 				http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
 			}
 			return
@@ -143,7 +143,7 @@
 
 	template, err := excelize.OpenFile(xlsxFilename)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
 		return
 	}
@@ -151,7 +151,7 @@
 	action, err := xlsx.ActionFromFile(yamlFilename)
 	if err != nil {
 		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 
@@ -162,7 +162,7 @@
 	defer tx.Rollback()
 
 	if err := action.Execute(ctx, tx, template); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "Error: "+err.Error(), http.StatusInternalServerError)
 		return
 	}
@@ -174,6 +174,6 @@
 		"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
 
 	if _, err := template.WriteTo(rw); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
--- a/pkg/controllers/routes.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/routes.go	Tue Feb 08 10:20:26 2022 +0100
@@ -340,7 +340,7 @@
 	// Handler for reporting
 
 	api.Handle("/data/reports",
-		waterwayAdmin(&mw.JSONHandler{
+		any(&mw.JSONHandler{
 			Handle: listReports,
 			NoConn: true,
 		})).Methods(http.MethodGet)
--- a/pkg/controllers/shapestretches.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/shapestretches.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,7 +19,6 @@
 	"fmt"
 	"io"
 	"io/ioutil"
-	"log"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -30,6 +29,7 @@
 	"github.com/jonas-p/go-shp"
 
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/middleware"
 	"gemma.intevation.de/gemma/pkg/wkb"
 )
@@ -305,7 +305,7 @@
 			_, err = io.Copy(out, srcFile)
 			return err
 		}(); err != nil {
-			log.Printf("error: cannot write file: %v\n", err)
+			log.Errorf("cannot write file: %v\n", err)
 			return
 		}
 	}
--- a/pkg/controllers/srimports.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/srimports.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,7 +17,6 @@
 	"archive/zip"
 	"encoding/hex"
 	"fmt"
-	"log"
 	"net/http"
 	"os"
 	"path/filepath"
@@ -32,6 +31,7 @@
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/config"
 	"gemma.intevation.de/gemma/pkg/imports"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/misc"
 	"gemma.intevation.de/gemma/pkg/models"
 
@@ -149,14 +149,14 @@
 	sr := new(imports.SoundingResult)
 
 	if err := fetchSoundingResultMetaOverrides(sr, req); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
 		return
 	}
 
 	dir, err := fetchSoundingResult(req)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 		return
 	}
@@ -164,7 +164,7 @@
 
 	serialized, err := common.ToJSONString(sr)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 		return
 	}
@@ -183,12 +183,12 @@
 		serialized)
 
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 		return
 	}
 
-	log.Printf("info: added import #%d to queue\n", jobID)
+	log.Infof("added import #%d to queue\n", jobID)
 
 	result := struct {
 		ID int64 `json:"id"`
@@ -283,11 +283,11 @@
 	if noXYZ {
 		code = http.StatusBadRequest
 		if err2 := os.RemoveAll(dir); err2 != nil {
-			log.Printf("error: %v\n", err2)
+			log.Errorf("%v\n", err2)
 		}
 	} else if result.Token, err = misc.MakeTempFile(dir); err != nil {
 		if err2 := os.RemoveAll(dir); err2 != nil {
-			log.Printf("error: %v\n", err2)
+			log.Errorf("%v\n", err2)
 		}
 		return
 	}
--- a/pkg/controllers/statsupdates.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/statsupdates.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,11 +15,12 @@
 
 import (
 	"database/sql"
-	"log"
 	"net/http"
 
+	"github.com/gorilla/mux"
+
+	"gemma.intevation.de/gemma/pkg/log"
 	mw "gemma.intevation.de/gemma/pkg/middleware"
-	"github.com/gorilla/mux"
 )
 
 const (
@@ -34,7 +35,7 @@
 
 	rows, err2 := conn.QueryContext(ctx, listStatsUpdatesSQL)
 	if err2 != nil {
-		log.Printf("error: %v\n", err2)
+		log.Errorf("%v\n", err2)
 		err = mw.JSONError{
 			Code:    http.StatusInternalServerError,
 			Message: "Listing stats update failed.",
@@ -48,7 +49,7 @@
 	for rows.Next() {
 		var name string
 		if err2 := rows.Scan(&name); err2 != nil {
-			log.Printf("error: %v\n", err2)
+			log.Errorf("%v\n", err2)
 			err = mw.JSONError{
 				Code:    http.StatusInternalServerError,
 				Message: "Fetching stats update names failed.",
@@ -59,7 +60,7 @@
 	}
 
 	if err2 := rows.Err(); err2 != nil {
-		log.Printf("error: %v\n", err2)
+		log.Errorf("%v\n", err2)
 		err = mw.JSONError{
 			Code:    http.StatusInternalServerError,
 			Message: "Fetching stats update names failed.",
@@ -92,7 +93,7 @@
 		}
 		return
 	case err2 != nil:
-		log.Printf("error: %v\n", err2)
+		log.Errorf("%v\n", err2)
 		err = mw.JSONError{
 			Code:    http.StatusInternalServerError,
 			Message: "Loading update script failed.",
@@ -101,7 +102,7 @@
 	}
 
 	if _, err2 := conn.ExecContext(ctx, script); err2 != nil {
-		log.Printf("error: %v\n", err2)
+		log.Errorf("%v\n", err2)
 		err = mw.JSONError{
 			Code:    http.StatusInternalServerError,
 			Message: "Loading update script failed.",
--- a/pkg/controllers/system.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/system.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,7 +19,6 @@
 	"database/sql"
 	"fmt"
 	"io/ioutil"
-	"log"
 	"net/http"
 	"regexp"
 	"strings"
@@ -33,6 +32,7 @@
 	"gemma.intevation.de/gemma/pkg/config"
 	"gemma.intevation.de/gemma/pkg/geoserver"
 	"gemma.intevation.de/gemma/pkg/imports"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 
 	mw "gemma.intevation.de/gemma/pkg/middleware"
@@ -197,7 +197,7 @@
 	styles := strings.Split(which, ",")
 
 	doBoth := func(req *http.Request) {
-		log.Printf("info: Trigger re-calculation of %s.", which)
+		log.Infof("trigger re-calculation of %s.", which)
 		for _, style := range styles {
 			geoserver.ReconfigureStyle(style)
 		}
@@ -210,7 +210,7 @@
 
 	oldCVs, err := models.ParseColorValues(old.String)
 	if err != nil {
-		log.Printf("warn: old config value is broken: %v\n", err)
+		log.Warnf("old config value is broken: %v\n", err)
 		return doBoth, nil
 	}
 
@@ -231,7 +231,7 @@
 
 	// Only the color changed -> no expensive recalc needed.
 	if colorChanged {
-		log.Println("info: Only colors changed.")
+		log.Infof("only colors changed.")
 		return func(*http.Request) {
 			for _, style := range styles {
 				geoserver.ReconfigureStyle(style)
@@ -287,7 +287,7 @@
 	job := &imports.IsoRefresh{ClassBreaks: breaks}
 	serialized, err := common.ToJSONString(job)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 	var jobID int64
@@ -300,11 +300,11 @@
 		false,
 		serialized,
 	); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
-	log.Printf(
-		"info: Recalculate sounding results contours in job %d.\n",
+	log.Infof(
+		"recalculate sounding results contours in job %d.\n",
 		jobID)
 
 }
@@ -319,7 +319,7 @@
 			return err
 		},
 	); err != nil {
-		log.Printf("error: Cleaning sounding diffs cache failed: %v\n", err)
+		log.Errorf("cleaning sounding diffs cache failed: %v\n", err)
 	}
 }
 
--- a/pkg/controllers/token.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/token.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,12 +16,12 @@
 import (
 	"encoding/json"
 	"fmt"
-	"log"
 	"net/http"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/models"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	mw "gemma.intevation.de/gemma/pkg/middleware"
 )
 
@@ -33,7 +33,7 @@
 		http.NotFound(rw, req)
 		return
 	case err != nil:
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, fmt.Sprintf("error: %v", err), http.StatusInternalServerError)
 		return
 	}
@@ -73,7 +73,7 @@
 	}
 	defer req.Body.Close()
 	if err := json.NewDecoder(req.Body).Decode(&input); err != nil {
-		log.Printf("%v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, "error: "+err.Error(), http.StatusBadRequest)
 		return
 	}
@@ -87,7 +87,7 @@
 		string(input.User),
 		input.Password)
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		http.Error(rw, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
 		return
 	}
--- a/pkg/controllers/uploadedimports.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/uploadedimports.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,7 +15,6 @@
 
 import (
 	"fmt"
-	"log"
 	"net/http"
 	"os"
 	"strconv"
@@ -24,6 +23,7 @@
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/imports"
+	"gemma.intevation.de/gemma/pkg/log"
 	mw "gemma.intevation.de/gemma/pkg/middleware"
 	"gemma.intevation.de/gemma/pkg/misc"
 )
@@ -162,7 +162,7 @@
 			fname,
 			maxUploadSize)
 		if err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 			return
 		}
@@ -170,20 +170,20 @@
 		job, err := create(req, dir)
 		if err != nil {
 			if err2 := os.RemoveAll(dir); err2 != nil {
-				log.Printf("warn: %v\n", err2)
+				log.Warnf("%v\n", err2)
 			}
 			if err2, ok := err.(badUploadParameterError); ok {
 				http.Error(rw, string(err2), http.StatusBadRequest)
 				return
 			}
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 			return
 		}
 
 		serialized, err := common.ToJSONString(job)
 		if err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 			return
 		}
@@ -202,12 +202,12 @@
 			serialized)
 
 		if err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, "error: "+err.Error(), http.StatusInternalServerError)
 			return
 		}
 
-		log.Printf("info: added import #%d to queue\n", jobID)
+		log.Infof("added import #%d to queue\n", jobID)
 
 		result := struct {
 			ID int64 `json:"id"`
--- a/pkg/controllers/user.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/controllers/user.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,7 +19,6 @@
 	"bytes"
 	"database/sql"
 	"fmt"
-	"log"
 	"net/http"
 	"strconv"
 	"strings"
@@ -29,6 +28,7 @@
 	"github.com/gorilla/mux"
 
 	"gemma.intevation.de/gemma/pkg/auth"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/misc"
 	"gemma.intevation.de/gemma/pkg/models"
 	"gemma.intevation.de/gemma/pkg/pgxutils"
@@ -39,10 +39,10 @@
 
 const (
 	createUserSQL = `INSERT INTO users.list_users
-  VALUES ($1, $2, $3, $4, NULL, $5, $6)`
+  VALUES ($1, $2, $3, $4, NULL, $5, $6, true)`
 	createUserExtentSQL = `INSERT INTO users.list_users
   VALUES ($1, $2, $3, $4,
-  ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9, $10)`
+  ST_MakeBox2D(ST_Point($5, $6), ST_Point($7, $8)), $9, $10, true)`
 
 	updateUserUnprivSQL = `UPDATE users.list_users
   SET (pw, map_extent, email_address)
@@ -57,7 +57,23 @@
   = ($2, $3, $4, $5, ST_MakeBox2D(ST_Point($6, $7), ST_Point($8, $9)), $10, $11)
   WHERE username = $1`
 
-	deleteUserSQL = `DELETE FROM users.list_users WHERE username = $1`
+	deleteUserSQL = `
+  WITH del AS (
+    DELETE FROM users.list_users
+    WHERE username = $1 AND (
+      rolname NOT IN ('waterway_admin', 'sys_admin')
+      OR NOT EXISTS (SELECT 1 FROM import.imports WHERE username = $1))
+    RETURNING *
+  ),
+  up AS (
+    UPDATE users.list_users
+    SET (email_address, report_reciever, active) = ('nomail@example.com', false, false)
+    WHERE username = $1 AND NOT EXISTS (SELECT * FROM del)
+    RETURNING *
+  )
+  SELECT
+    EXISTS (SELECT * FROM del) AS deleted,
+    EXISTS (SELECT * FROM up)  AS updated`
 
 	listUsersSQL = `SELECT
   rolname,
@@ -66,7 +82,8 @@
   email_address,
   ST_XMin(map_extent), ST_YMin(map_extent),
   ST_XMax(map_extent), ST_YMax(map_extent),
-  report_reciever
+  report_reciever,
+  active
 FROM users.list_users`
 
 	listUserSQL = `SELECT
@@ -141,27 +158,44 @@
 			go func() { scheduler.UnbindByIDs(ids) }()
 		}
 	} else {
-		log.Printf("error: %v\n", err2)
+		log.Errorf("%v\n", err2)
 	}
 
-	var res sql.Result
-
-	if res, err = db.ExecContext(ctx, deleteUserSQL, user); err != nil {
+	var deleted, updated bool
+	if err = db.QueryRowContext(ctx, deleteUserSQL, user).Scan(&deleted, &updated); err != nil {
 		return
 	}
 
-	if n, err2 := res.RowsAffected(); err2 == nil && n == 0 {
+	var action string
+
+	switch {
+	case !deleted && !updated:
 		err = mw.JSONError{
 			Code:    http.StatusNotFound,
 			Message: fmt.Sprintf("Cannot find user %s.", user),
 		}
 		return
+	case deleted:
+		action = "deleted"
+	case updated:
+		action = "deactivated"
+	default:
+		log.Errorf("Should not happen: user '%s' updated and deleted.\n", user)
+		action = "deleted"
 	}
 
 	// Running in a go routine should not be necessary.
 	go func() { auth.Sessions.Logout(user) }()
 
-	jr = mw.JSONResult{Code: http.StatusNoContent}
+	log.Infof("User '%s' %s.\n", user, action)
+
+	jr = mw.JSONResult{
+		Result: struct {
+			Action string `json:"action"`
+		}{
+			Action: action,
+		},
+	}
 	return
 }
 
@@ -245,6 +279,8 @@
 		go func() { auth.Sessions.Logout(string(user)) }()
 	}
 
+	log.Infof("User '%s' updated.\n", user)
+
 	jr = mw.JSONResult{
 		Code: http.StatusCreated,
 		Result: struct {
@@ -325,6 +361,9 @@
 	if patch.Reports != nil && priv {
 		update("report_reciever", *patch.Reports)
 	}
+	if patch.Active != nil && priv {
+		update("active", *patch.Active)
+	}
 	if patch.Extent != nil {
 		updateBox("map_extent", patch.Extent)
 	}
@@ -376,6 +415,14 @@
 		go func() { auth.Sessions.Logout(string(user)) }()
 	}
 
+	// Log if the user should be reactivated, even if he is already active.
+	var reactivated string
+	if patch.Active != nil && *patch.Active && priv {
+		reactivated = " (reactivation requested)"
+	}
+
+	log.Infof("User '%s' modified%s.\n", user, reactivated)
+
 	jr = mw.JSONResult{
 		Code: http.StatusCreated,
 		Result: struct {
@@ -423,6 +470,8 @@
 		return
 	}
 
+	log.Infof("User '%s' created.\n", user.User)
+
 	jr = mw.JSONResult{
 		Code: http.StatusCreated,
 		Result: struct {
@@ -454,6 +503,7 @@
 			&user.Extent.X1, &user.Extent.Y1,
 			&user.Extent.X2, &user.Extent.Y2,
 			&user.Reports,
+			&user.Active,
 		); err != nil {
 			return
 		}
@@ -571,7 +621,7 @@
 
 	var buf bytes.Buffer
 	if err := bodyTmpl.Execute(&buf, &tmplVars); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 
 	err = misc.SendMail(string(userData.Email), subject, buf.String())
--- a/pkg/geoserver/boot.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/geoserver/boot.go	Tue Feb 08 10:20:26 2022 +0100
@@ -20,7 +20,6 @@
 	"encoding/xml"
 	"fmt"
 	"io"
-	"log"
 	"net/http"
 	"net/url"
 	"strings"
@@ -29,6 +28,7 @@
 	"golang.org/x/net/html/charset"
 
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 )
 
@@ -55,7 +55,7 @@
 
 	if err := json.NewEncoder(&buf).Encode(x); err != nil {
 		// Should not happen
-		log.Printf("warn: bad JSON: %v\n", err)
+		log.Warnf("bad JSON: %v\n", err)
 	}
 	return bytes.NewReader(buf.Bytes())
 }
@@ -66,7 +66,7 @@
 	buf := bytes.NewBufferString(xml.Header)
 	if err := xml.NewEncoder(buf).Encode(x); err != nil {
 		// Should not happen
-		log.Printf("warn: bad XML: %v\n", err)
+		log.Warnf("bad XML: %v\n", err)
 	}
 	return bytes.NewReader(buf.Bytes())
 }
@@ -102,13 +102,13 @@
 	}
 
 	if resp.StatusCode != http.StatusNotFound {
-		log.Println("info: workspace " + workspaceName + " already exists.")
+		log.Infof("workspace " + workspaceName + " already exists.")
 		return nil
 	}
 
 	// Create workspace
 
-	log.Println("info: creating workspace " + workspaceName)
+	log.Infof("creating workspace " + workspaceName)
 
 	const createJSON = `{"workspace":{"name":"` + workspaceName + `"}}`
 
@@ -158,12 +158,12 @@
 	}
 
 	if resp.StatusCode != http.StatusNotFound {
-		log.Println("info: datastore " + datastoreName + " already exists.")
+		log.Infof("datastore " + datastoreName + " already exists.")
 		return nil
 	}
 
 	// Create datastore.
-	log.Println("info: creating datastore " + datastoreName)
+	log.Infoln("creating datastore " + datastoreName)
 
 	type entry struct {
 		Key   interface{} `json:"@key"`
@@ -221,11 +221,11 @@
 func ensureFeatures() error {
 	tables := models.InternalServices.Filter(models.IntWFS)
 	if len(tables) == 0 {
-		log.Println("info: no tables to publish")
+		log.Infoln("no tables to publish")
 		return nil
 	}
 
-	log.Printf("info: number of tables to publish %d\n", len(tables))
+	log.Infof("number of tables to publish %d\n", len(tables))
 
 	var (
 		geoURL   = config.GeoServerURL()
@@ -283,7 +283,7 @@
 
 	defer func() {
 		if len(already) > 0 {
-			log.Printf("info: already having featuretypes: %s\n",
+			log.Infof("already having featuretypes: %s\n",
 				strings.Join(already, ", "))
 		}
 	}()
@@ -297,7 +297,7 @@
 		}
 
 		// Create featuretype.
-		log.Printf("info: creating featuretype %s.\n", table)
+		log.Infof("creating featuretype %s.\n", table)
 
 		var req *http.Request
 
@@ -400,11 +400,11 @@
 
 	groups := models.InternalServices.LayerGroups()
 	if len(groups) == 0 {
-		log.Println("info: no groups layers to publish")
+		log.Infoln("info: no groups layers to publish")
 		return nil
 	}
 
-	log.Printf("info: number of layer groups to publish %d\n", len(groups))
+	log.Infof("number of layer groups to publish %d\n", len(groups))
 
 	var (
 		geoURL   = config.GeoServerURL()
@@ -457,7 +457,7 @@
 
 	defer func() {
 		if len(already) > 0 {
-			log.Printf("info: already having layer groups: %s\n",
+			log.Infof("already having layer groups: %s\n",
 				strings.Join(already, ", "))
 		}
 	}()
@@ -468,7 +468,7 @@
 			continue
 		}
 
-		log.Printf("info: creating layer group %s.\n", groups[i].Name)
+		log.Infof("creating layer group %s.\n", groups[i].Name)
 
 		type (
 			Layers struct {
@@ -529,7 +529,7 @@
 		return nil
 	}
 
-	log.Println("info: delete workspace " + workspaceName)
+	log.Infoln("info: delete workspace " + workspaceName)
 	var (
 		geoURL   = config.GeoServerURL()
 		user     = config.GeoServerUser()
@@ -626,7 +626,7 @@
 
 func updateStyle(entry *models.IntEntry, create bool) error {
 
-	log.Printf("info: creating style %s\n", entry.Name)
+	log.Infof("creating style %s\n", entry.Name)
 
 	// Try to load the style data.
 	binary, err := entry.LoadStyle()
@@ -761,7 +761,7 @@
 		case tok == nil && err == io.EOF:
 			return false
 		case err != nil:
-			log.Printf("warn: invalid XML: %v\n", err)
+			log.Warnf("invalid XML: %v\n", err)
 			return false
 		}
 		if t, ok := tok.(xml.StartElement); ok &&
@@ -772,7 +772,7 @@
 }
 
 func ensureStyles() error {
-	log.Println("info: creating styles")
+	log.Infoln("creating styles")
 
 	var stls styles
 	if err := stls.load(); err != nil {
@@ -788,7 +788,7 @@
 
 	defer func() {
 		if len(already) > 0 {
-			log.Printf("info: already having styles: %s\n",
+			log.Infof("already having styles: %s\n",
 				strings.Join(already, ", "))
 		}
 	}()
@@ -812,12 +812,12 @@
 func PrepareGeoServer() error {
 
 	if config.DBUser() == "" {
-		log.Println("info: Need metamorphic db user to configure GeoServer")
+		log.Infoln("need metamorphic db user to configure GeoServer")
 		return nil
 	}
 
 	if config.GeoServerURL() == "" {
-		log.Println("info: No URL to GeoServer configured")
+		log.Infoln("no URL to GeoServer configured")
 		return nil
 	}
 
--- a/pkg/geoserver/reconf.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/geoserver/reconf.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,12 +15,12 @@
 
 import (
 	"container/list"
-	"log"
 	"net"
 	"net/url"
 	"sync"
 	"time"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 )
 
@@ -43,13 +43,13 @@
 		fn = confQueue.Remove(confQueue.Front()).(func() error)
 		confQueueCond.L.Unlock()
 		if err := reconfigure(fn); err != nil {
-			log.Printf("warn: configure GeoServer failed: %v\n", err)
+			log.Warnf("configure GeoServer failed: %v\n", err)
 		}
 	}
 }
 
 func reconfigure(fn func() error) error {
-	log.Println("info: configure GeoServer...")
+	log.Infof("configure GeoServer...")
 	const (
 		maxTries = 10
 		sleep    = time.Second * 5
@@ -62,7 +62,7 @@
 		if try < maxTries {
 			if uerr, ok := err.(*url.Error); ok {
 				if oerr, ok := uerr.Err.(*net.OpError); ok && oerr.Op == "dial" {
-					log.Printf("warn: failed attempt %d of %d to configure GeoServer. "+
+					log.Warnf("failed attempt %d of %d to configure GeoServer. "+
 						"Will try again in %s...\n", try, maxTries, sleep)
 					time.Sleep(sleep)
 					continue
--- a/pkg/imports/dsec.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/dsec.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,7 +18,8 @@
 	"database/sql"
 	"errors"
 	"fmt"
-	"log"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // DeleteSection is a Job to delete a section from the database.
@@ -71,8 +72,8 @@
 	}
 	n, err := res.RowsAffected()
 	if err != nil {
-		log.Println(
-			"error: RowsAffected returned an error. Missing driver support?")
+		log.Errorf(
+			"RowsAffected returned an error. Missing driver support?")
 		return nil
 	}
 	if n == 0 {
--- a/pkg/imports/email.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/email.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,12 +16,12 @@
 import (
 	"context"
 	"database/sql"
-	"log"
 	"strings"
 	"text/template"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/misc"
 )
 
@@ -62,7 +62,7 @@
 			return conn.QueryRowContext(ctx, selectEmailSQL, user).Scan(&email)
 		},
 	); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 
@@ -82,11 +82,11 @@
 
 	var body strings.Builder
 	if err := importNotificationMailTmpl.Execute(&body, &data); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return
 	}
 
 	if err := misc.SendMail(email, importNotificationMailSubject, body.String()); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
--- a/pkg/imports/erdms.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/erdms.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,9 +18,9 @@
 	"context"
 	"database/sql"
 	"fmt"
-	"log"
 	"strings"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/soap"
 	"gemma.intevation.de/gemma/pkg/soap/erdms"
 )
@@ -102,7 +102,7 @@
 		data, err := client.GetRisDataXML(request)
 		if err != nil {
 			if t, ok := err.(interface{ Timeout() bool }); ok && t.Timeout() && tries < maxTries {
-				log.Println("warn: ERDMS SOAP request timed out. Trying again.")
+				log.Warnln("warn: ERDMS SOAP request timed out. Trying again.")
 				tries++
 				goto again
 			}
--- a/pkg/imports/gm.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/gm.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,15 +19,17 @@
 	"context"
 	"database/sql"
 	"fmt"
-	"log"
 	"sort"
+	"strconv"
 	"strings"
 	"time"
 
+	"github.com/jackc/pgx/pgtype"
+
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 	"gemma.intevation.de/gemma/pkg/pgxutils"
 	"gemma.intevation.de/gemma/pkg/soap/nts"
-	"github.com/jackc/pgx/pgtype"
 )
 
 // GaugeMeasurement is an import job to import
@@ -185,7 +187,7 @@
 
 		if err != nil {
 			if t, ok := err.(interface{ Timeout() bool }); ok && t.Timeout() && tries < maxTries {
-				log.Println("warn: NtS SOAP request timed out. Trying again.")
+				log.Warnln("NtS SOAP request timed out. Trying again.")
 				tries++
 				goto again
 			}
@@ -320,6 +322,223 @@
 	return fn, nil
 }
 
+type gmLog struct {
+	gid                 string
+	unknown             bool
+	assumedZPG          bool
+	ignoredMeasureCodes []string
+	rescaleErrors       []string
+	missingValues       []string
+	assumedCM           int
+	badValues           int
+	measurements        int
+	predictions         int
+}
+
+type gmLogs []*gmLog
+
+func extend(haystack []string, needle string) []string {
+	for _, straw := range haystack {
+		if straw == needle {
+			return haystack
+		}
+	}
+	return append(haystack, needle)
+}
+
+func (gl *gmLog) addRescaleError(err error) {
+	gl.rescaleErrors = extend(gl.rescaleErrors, err.Error())
+}
+
+func (gl *gmLog) ignoreMeasureCode(mc nts.Measure_code_enum) {
+	gl.ignoredMeasureCodes = extend(gl.ignoredMeasureCodes, string(mc))
+}
+
+func (gls gmLogs) find(gid string) *gmLog {
+	for _, gl := range gls {
+		if gl.gid == gid {
+			return gl
+		}
+	}
+	return nil
+}
+
+func (gls gmLogs) logging(feedback Feedback) {
+
+	gls.logBool(
+		(*gmLog).getUnknown,
+		"Cannot find following gauges: ",
+		feedback.Warn)
+
+	gls.logBool(
+		(*gmLog).getAssumedZPG,
+		"'Reference_code' not specified. Assuming 'ZPG': ",
+		feedback.Warn)
+
+	gls.logInt(
+		(*gmLog).getAssumedCM,
+		"'Unit' not specified. Assuming 'cm': ",
+		feedback.Warn)
+
+	gls.logInt(
+		(*gmLog).getBadValues,
+		"Ignored measurements with value -99999: ",
+		feedback.Warn)
+
+	gls.logString(
+		(*gmLog).getMissingValues,
+		"Missing mandatory values: ",
+		feedback.Warn)
+
+	gls.logString(
+		(*gmLog).getRescaleErrors,
+		"Cannot convert units: ",
+		feedback.Error)
+
+	gls.logString(
+		(*gmLog).getRescaleErrors,
+		"Ignored measure codes: ",
+		feedback.Warn)
+
+	gls.logInt(
+		(*gmLog).getPredictions,
+		"New predictions: ",
+		feedback.Info)
+
+	gls.logInt(
+		(*gmLog).getMeasurements,
+		"New measurements: ",
+		feedback.Info)
+
+	gls.logBool(
+		(*gmLog).nothingChanged,
+		"No changes for: ",
+		feedback.Info)
+}
+
+func (gl *gmLog) getAssumedZPG() bool              { return gl.assumedZPG }
+func (gl *gmLog) getUnknown() bool                 { return gl.unknown }
+func (gl *gmLog) getIgnoredMeasureCodes() []string { return gl.ignoredMeasureCodes }
+func (gl *gmLog) getRescaleErrors() []string       { return gl.rescaleErrors }
+func (gl *gmLog) getMissingValues() []string       { return gl.missingValues }
+func (gl *gmLog) getAssumedCM() int                { return gl.assumedCM }
+func (gl *gmLog) getBadValues() int                { return gl.badValues }
+func (gl *gmLog) getPredictions() int              { return gl.predictions }
+func (gl *gmLog) getMeasurements() int             { return gl.measurements }
+func (gl *gmLog) nothingChanged() bool             { return gl.measurements == 0 && gl.predictions == 0 }
+
+func (gls gmLogs) logBool(
+	access func(*gmLog) bool,
+	header string,
+	log func(string, ...interface{}),
+) {
+	var sb strings.Builder
+	for _, gl := range gls {
+		if access(gl) {
+			if sb.Len() == 0 {
+				sb.WriteString(header)
+			} else {
+				sb.WriteString(", ")
+			}
+			sb.WriteString(gl.gid)
+		}
+	}
+	if sb.Len() > 0 {
+		log(sb.String())
+	}
+}
+
+func (gls gmLogs) logInt(
+	access func(*gmLog) int,
+	header string,
+	log func(string, ...interface{}),
+) {
+	gs := make(gmLogs, 0, len(gls))
+	for _, g := range gls {
+		if access(g) > 0 {
+			gs = append(gs, g)
+		}
+	}
+
+	if len(gs) == 0 {
+		return
+	}
+
+	sort.SliceStable(gs, func(i, j int) bool {
+		return access(gs[i]) < access(gs[j])
+	})
+
+	var sb strings.Builder
+	var last int
+
+	for _, g := range gs {
+		if c := access(g); c != last {
+			if sb.Len() == 0 {
+				sb.WriteString(header)
+			} else {
+				sb.WriteString("); ")
+			}
+			sb.WriteString(strconv.Itoa(c))
+			sb.WriteString(" (")
+			last = c
+		} else {
+			sb.WriteString(", ")
+		}
+		sb.WriteString(g.gid)
+	}
+
+	sb.WriteByte(')')
+	log(sb.String())
+}
+
+func (gls gmLogs) logString(
+	access func(*gmLog) []string,
+	header string,
+	log func(string, ...interface{}),
+) {
+	var sb strings.Builder
+	for _, gl := range gls {
+		if s := access(gl); len(s) > 0 {
+			if sb.Len() == 0 {
+				sb.WriteString(header)
+			} else {
+				sb.WriteString(", ")
+			}
+			sb.WriteString(gl.gid)
+			sb.WriteString(" (")
+			for i, v := range s {
+				if i > 0 {
+					sb.WriteString("; ")
+				}
+				sb.WriteString(v)
+			}
+			sb.WriteByte(')')
+		}
+	}
+	if sb.Len() > 0 {
+		log(sb.String())
+	}
+}
+
+// logFinder is a helper to search recently used logs
+// or create a new one if no log for a given gauge
+// existed before.
+func logFinder(logs *gmLogs) func(string) *gmLog {
+	var lastLog *gmLog
+	return func(gid string) *gmLog {
+		if lastLog != nil && lastLog.gid == gid {
+			return lastLog
+		}
+		if ll := logs.find(gid); ll != nil {
+			lastLog = ll
+			return ll
+		}
+		lastLog = &gmLog{gid: gid}
+		*logs = append(*logs, lastLog)
+		return lastLog
+	}
+}
+
 func doForGM(
 	ctx context.Context,
 	gauges []string,
@@ -352,6 +571,14 @@
 	}
 
 	var gids []string
+
+	// To prevent spamming the log actual logging
+	// is defered to be presented in an aggregated way.
+	var logs gmLogs
+	defer func() { logs.logging(feedback) }()
+
+	findLog := logFinder(&logs)
+
 	for _, msg := range result {
 		for _, wrm := range msg.Wrm {
 			curr := string(*wrm.Geo_object.Id)
@@ -361,45 +588,45 @@
 				feedback.Warn("Invalid ISRS code %v", err)
 				continue
 			}
-			feedback.Info("Found measurements/predictions for %s", curr)
+			logger := findLog(curr)
+			gids = append(gids, curr)
+
 			if !isKnown(curr) {
-				feedback.Warn("Cannot find gauge %q for import", curr)
+				logger.unknown = true
 				continue
 			}
 
 			var referenceCode string
 			if wrm.Reference_code == nil {
-				feedback.Info("'Reference_code' not specified. Assuming 'ZPG'")
+				logger.assumedZPG = true
 				referenceCode = "ZPG"
 			} else {
 				referenceCode = string(*wrm.Reference_code)
 			}
 
-			badValue := 0
-			newM, newP := 0, 0
 			for _, measure := range wrm.Measure {
 				var unit string
 				if *measure.Measure_code != nts.Measure_code_enumWAL {
-					feedback.Warn("Ignored message with measure_code %s",
-						*measure.Measure_code)
+					logger.ignoreMeasureCode(*measure.Measure_code)
 					continue
 				}
 				if measure.Unit == nil {
-					feedback.Info("'Unit' not specified. Assuming 'cm'")
+					logger.assumedCM++
 					unit = "cm"
 				} else {
 					unit = string(*measure.Unit)
 				}
 
 				if measure.Value == nil {
-					feedback.Warn("Missing mandatory value at %s. Ignored (bad service)",
-						measure.Measuredate.Format(time.RFC3339))
+					logger.missingValues = append(
+						logger.missingValues,
+						measure.Measuredate.Time.Format(time.RFC3339))
 					continue
 				}
 
 				convert, err := rescale(unit)
 				if err != nil {
-					feedback.Error(err.Error())
+					logger.addRescaleError(err)
 					continue
 				}
 				convert(measure.Value)
@@ -408,7 +635,7 @@
 
 				// -99999 is used by some gauges to signal an error
 				if *measure.Value == -99999 {
-					badValue++
+					logger.badValues++
 					continue
 				}
 
@@ -458,7 +685,7 @@
 					case err != nil:
 						feedback.Error(pgxutils.ReadableError{Err: err}.Error())
 					default:
-						newP++
+						logger.predictions++
 					}
 				} else {
 					err = insertGMStmt.QueryRowContext(
@@ -484,19 +711,10 @@
 					case err != nil:
 						feedback.Error(pgxutils.ReadableError{Err: err}.Error())
 					default:
-						newM++
+						logger.measurements++
 					}
 				}
 			}
-			if badValue > 0 {
-				feedback.Warn("Ignored %d measurements with value -99999",
-					badValue)
-			}
-			feedback.Info("Inserted %d measurements for %s",
-				newM, curr)
-			feedback.Info("Inserted %d predictions for %s",
-				newP, curr)
-			gids = append(gids, curr)
 		}
 	}
 	return gids, nil
--- a/pkg/imports/isr.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/isr.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,9 +16,9 @@
 import (
 	"context"
 	"database/sql"
-	"log"
 	"time"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/mesh"
 	"gemma.intevation.de/gemma/pkg/models"
 )
@@ -341,7 +341,7 @@
 				}
 			}
 		default:
-			log.Printf("error: unknown survey type '%s'\n", sr.surveyType)
+			log.Errorf("unknown survey type '%s'\n", sr.surveyType)
 		}
 	}
 	feedback.Info("Scan types: Single/Multi: %d Marking: %d", beams, markings)
--- a/pkg/imports/queue.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/queue.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,7 +19,6 @@
 	"encoding/json"
 	"errors"
 	"fmt"
-	"log"
 	"runtime/debug"
 	"sort"
 	"strings"
@@ -31,6 +30,7 @@
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/pgxutils"
 )
 
@@ -121,8 +121,8 @@
 
 const (
 	ReviewJobSuffix  = "#review"
-	reviewJobRetries = 10
-	reviewJobWait    = time.Minute
+	reviewJobRetries = 200
+	reviewJobWait    = 10 * time.Minute
 )
 
 const (
@@ -381,7 +381,7 @@
 func LogImportKindNames() {
 	kinds := ImportKindNames()
 	sort.Strings(kinds)
-	log.Printf("info: registered import kinds: %s",
+	log.Infof("registered import kinds: %s",
 		strings.Join(kinds, ", "))
 }
 
@@ -440,7 +440,7 @@
 	if idj.waitRetry.Status == pgtype.Present {
 		var d time.Duration
 		if err := idj.waitRetry.AssignTo(&d); err != nil {
-			log.Printf("error: converting waitRetry failed: %v\n", err)
+			log.Errorf("converting waitRetry failed: %v\n", err)
 		} else {
 			now = now.Add(d)
 		}
@@ -462,7 +462,7 @@
 	}
 	d := new(time.Duration)
 	if err := idj.waitRetry.AssignTo(d); err != nil {
-		log.Printf("error: converting waitRetry failed: %v\n", err)
+		log.Errorf("converting waitRetry failed: %v\n", err)
 		return nil
 	}
 	return d
@@ -560,7 +560,7 @@
 				data).Scan(&id)
 
 			if err == nil && sync {
-				log.Printf("info: register wait for %d\n", id)
+				log.Infof("register wait for %d\n", id)
 				done = make(chan struct{})
 				q.waiting[id] = done
 			}
@@ -675,7 +675,7 @@
 	if err != nil {
 		return nil, err
 	}
-	log.Printf("info: add review job %d\n", rID)
+	log.Infof("add review job %d\n", rID)
 	_, err = tx.ExecContext(ctx, updateStateSQL, "reviewed", id)
 	if err != nil && done != nil {
 		go func() {
@@ -741,7 +741,7 @@
 		return err
 	})
 	if err != nil {
-		log.Printf("error: logging failed: %v\n", err)
+		log.Errorf("logging failed: %v\n", err)
 	}
 }
 
@@ -868,7 +868,7 @@
 		if err = auth.RunAs(ctx, queueUser, fn); err == nil || try == maxTries {
 			return err
 		}
-		log.Printf("warn: [try %d/%d] Storing state failed: %v (try again in %s).\n",
+		log.Warnf("[try %d/%d] Storing state failed: %v (try again in %s).\n",
 			try, maxTries, err, sleep)
 
 		time.Sleep(sleep)
@@ -935,7 +935,7 @@
 	// re-enqueue the jobs that are in state running.
 	// They where in progess when the server went down.
 	if err := reEnqueueRunning(); err != nil {
-		log.Printf("error: re-enqueuing failed: %v", err)
+		log.Errorf("re-enqueuing failed: %v", err)
 	}
 
 	for {
@@ -944,7 +944,7 @@
 
 		for {
 			if idj, err = q.fetchJob(); err != nil && err != sql.ErrNoRows {
-				log.Printf("error: db: %v\n", err)
+				log.Errorf("error: db: %v\n", err)
 			}
 			if idj != nil {
 				break
@@ -957,7 +957,7 @@
 			}
 		}
 
-		log.Printf("info: starting import #%d\n", idj.id)
+		log.Infof("starting import #%d\n", idj.id)
 
 		jc := q.jobCreator(idj.kind)
 		if jc == nil {
@@ -978,7 +978,7 @@
 				// Unlock waiting.
 				q.cmdCh <- func(q *importQueue) {
 					if w := q.waiting[idj.id]; w != nil {
-						log.Printf("info: unlock waiting %d\n", idj.id)
+						log.Infof("unlock waiting %d\n", idj.id)
 						if retry {
 							w <- struct{}{}
 						} else {
@@ -1050,9 +1050,9 @@
 			}
 			if !remove {
 				if err := updateStateSummary(ctx, idj.id, state, summary); err != nil {
-					log.Printf("error: setting state of job %d failed: %v\n", idj.id, err)
+					log.Errorf("setting state of job %d failed: %v\n", idj.id, err)
 				}
-				log.Printf("info: import #%d finished: %s\n", idj.id, state)
+				log.Infof("info: import #%d finished: %s\n", idj.id, state)
 			}
 			if idj.sendEmail {
 				go sendNotificationMail(idj.user, jc.Description(), state, idj.id)
@@ -1068,14 +1068,14 @@
 					idj.data,
 					false)
 				if err != nil {
-					log.Printf("error: retry enqueue failed: %v\n", err)
+					log.Errorf("retry enqueue failed: %v\n", err)
 				} else {
-					log.Printf("info: re-enqueued job with id %d\n", nid)
+					log.Infof("re-enqueued job with id %d\n", nid)
 				}
 			}
 			if remove {
 				if err := deleteJob(ctx, idj.id); err != nil {
-					log.Printf("error: deleting job %d failed: %v\n", idj.id, err)
+					log.Errorf("deleting job %d failed: %v\n", idj.id, err)
 				}
 			}
 		}(jc, idj)
--- a/pkg/imports/report.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/report.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,7 +19,6 @@
 	"database/sql"
 	"errors"
 	"fmt"
-	"log"
 	"os"
 	"path/filepath"
 	"strings"
@@ -29,11 +28,12 @@
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/misc"
 	"gemma.intevation.de/gemma/pkg/models"
 	"gemma.intevation.de/gemma/pkg/xlsx"
 
-	"github.com/360EntSecGroup-Skylar/excelize/v2"
+	"github.com/xuri/excelize/v2"
 )
 
 type Report struct {
@@ -207,19 +207,19 @@
 	var admin misc.EmailReceiver
 	if err := tx.QueryRowContext(
 		ctx, selectCurrentUserSQL).Scan(&admin.Name, &admin.Address); err != nil {
-		log.Printf("error: Cannot find sender: %v\n")
+		log.Errorf("cannot find sender: %v\n")
 		return nil, fmt.Errorf("cannot find sender: %v", err)
 	}
 
 	// Generate the actual report.
 	if err := action.Execute(ctx, tx, template); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return nil, fmt.Errorf("Generating report failed: %v", err)
 	}
 
 	var buf bytes.Buffer
 	if _, err := template.WriteTo(&buf); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		return nil, fmt.Errorf("generating report failed: %v", err)
 	}
 
--- a/pkg/imports/scheduled.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/scheduled.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,10 +17,10 @@
 	"context"
 	"database/sql"
 	"fmt"
-	"log"
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/common"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 	"gemma.intevation.de/gemma/pkg/scheduler"
 )
@@ -29,10 +29,10 @@
 	run := func(cfgID int64) {
 		jobID, err := RunConfiguredImport(cfgID)
 		if err != nil {
-			log.Printf("error: running scheduled import failed: %v\n", err)
+			log.Errorf("running scheduled import failed: %v\n", err)
 			return
 		}
-		log.Printf("info: added import #%d to queue\n", jobID)
+		log.Infof("added import #%d to queue\n", jobID)
 	}
 
 	for kind := range kindToImportModel {
--- a/pkg/imports/sr.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/imports/sr.go	Tue Feb 08 10:20:26 2022 +0100
@@ -303,6 +303,7 @@
 	var xform vertexTransform
 
 	if sr.negateZ() {
+		feedback.Info("Z values will be negated.")
 		xform = negateZTransform
 	} else {
 		xform = identityTransform
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/log/log.go	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,208 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSES/AGPL-3.0.txt
+//
+// Copyright (C) 2021 by via donau
+//   – Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+package log
+
+import (
+	"fmt"
+	lg "log"
+	"os"
+	"strings"
+	"sync"
+	"sync/atomic"
+)
+
+type LogLevel uint32
+
+const (
+	TraceLogLevel = LogLevel(iota)
+	DebugLogLevel
+	InfoLogLevel
+	WarnLogLevel
+	ErrorLogLevel
+	FatalLogLevel
+)
+
+var (
+	logLevel  = uint32(InfoLogLevel)
+	logFileMu sync.Mutex
+	logFile   *os.File
+)
+
+func init() {
+	lg.SetFlags(lg.LstdFlags | lg.Lshortfile)
+}
+
+const callDepth = 2
+
+func SetupLog(filename string, perm os.FileMode) error {
+	f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, perm)
+	if err != nil {
+		return err
+	}
+	logFileMu.Lock()
+	defer logFileMu.Unlock()
+	if logFile != nil {
+		logFile.Close()
+	}
+	logFile = f
+	lg.SetOutput(logFile)
+	return nil
+}
+
+func ShutdownLog() {
+	logFileMu.Lock()
+	defer logFileMu.Unlock()
+	if logFile != nil {
+		logFile.Close()
+		logFile = nil
+	}
+	lg.SetOutput(os.Stderr)
+}
+
+func ParseLogLevel(s string) LogLevel {
+	switch strings.ToLower(s) {
+	case "trace":
+		return TraceLogLevel
+	case "debug":
+		return DebugLogLevel
+	case "info":
+		return InfoLogLevel
+	case "warn":
+		return WarnLogLevel
+	case "error":
+		return ErrorLogLevel
+	case "fatal":
+		return FatalLogLevel
+	default:
+		return InfoLogLevel
+	}
+}
+
+func (level LogLevel) String() string {
+	switch level {
+	case TraceLogLevel:
+		return "trace"
+	case DebugLogLevel:
+		return "debug"
+	case InfoLogLevel:
+		return "info"
+	case WarnLogLevel:
+		return "warn"
+	case ErrorLogLevel:
+		return "error"
+	case FatalLogLevel:
+		return "fatal"
+	default:
+		return "unknown"
+	}
+}
+
+func GetLogLevel() LogLevel {
+	return LogLevel(atomic.LoadUint32(&logLevel))
+}
+
+func SetLogLevel(level LogLevel) {
+	atomic.StoreUint32(&logLevel, uint32(level))
+}
+
+func Tracef(f string, args ...interface{}) {
+	if TraceLogLevel >= GetLogLevel() {
+		s := fmt.Sprintf(f, args...)
+		lg.Output(callDepth, "[TRACE] "+s)
+	}
+}
+
+func Traceln(s string) {
+	if TraceLogLevel >= GetLogLevel() {
+		lg.Output(callDepth, "[TRACE] "+s)
+	}
+}
+
+func Debugf(f string, args ...interface{}) {
+	if DebugLogLevel >= GetLogLevel() {
+		s := fmt.Sprintf(f, args...)
+		lg.Output(callDepth, "[DEBUG] "+s)
+	}
+}
+
+func Debugln(s string) {
+	if DebugLogLevel >= GetLogLevel() {
+		lg.Output(callDepth, "[DEBUG] "+s)
+	}
+}
+
+func Infof(f string, args ...interface{}) {
+	if InfoLogLevel >= GetLogLevel() {
+		s := fmt.Sprintf(f, args...)
+		lg.Output(callDepth, "[INFO] "+s)
+	}
+}
+
+func Infoln(s string) {
+	if InfoLogLevel >= GetLogLevel() {
+		lg.Output(callDepth, "[INFO] "+s)
+	}
+}
+
+func Warnf(f string, args ...interface{}) {
+	if WarnLogLevel >= GetLogLevel() {
+		s := fmt.Sprintf(f, args...)
+		lg.Output(callDepth, "[WARN] "+s)
+	}
+}
+
+func Warnln(s string) {
+	if WarnLogLevel >= GetLogLevel() {
+		lg.Output(callDepth, "[WARN] "+s)
+	}
+}
+
+func Errorf(f string, args ...interface{}) {
+	if ErrorLogLevel >= GetLogLevel() {
+		s := fmt.Sprintf(f, args...)
+		lg.Output(callDepth, "[ERROR] "+s)
+	}
+}
+
+func Errorln(s string) {
+	if ErrorLogLevel >= GetLogLevel() {
+		lg.Output(callDepth, "[ERROR] "+s)
+	}
+}
+
+func Fatalf(f string, args ...interface{}) {
+	if FatalLogLevel >= GetLogLevel() {
+		s := fmt.Sprintf(f, args...)
+		lg.Output(callDepth, "[FATAL] "+s)
+		os.Exit(1)
+	}
+}
+
+func Fatalln(s string) {
+	if FatalLogLevel >= GetLogLevel() {
+		lg.Output(callDepth, "[FATAL] "+s)
+		os.Exit(1)
+	}
+}
+
+func Panicf(f string, args ...interface{}) {
+	s := fmt.Sprintf(f, args...)
+	lg.Output(callDepth, "[PANIC] "+s)
+	panic(s)
+}
+
+func Panicln(s string) {
+	lg.Output(callDepth, "[PANIC] "+s)
+	panic(s)
+}
--- a/pkg/mesh/loader.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/loader.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,7 +18,8 @@
 	"bytes"
 	"compress/gzip"
 	"encoding/binary"
-	"log"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 func (s *STRTree) deserializeIndex(r *bufio.Reader) error {
@@ -104,7 +105,7 @@
 		return err
 	}
 
-	log.Printf("info: EPSG: %d\n", t.EPSG)
+	log.Infof("EPSG: %d\n", t.EPSG)
 
 	if err := t.Min.Read(r); err != nil {
 		return err
@@ -114,7 +115,7 @@
 		return err
 	}
 
-	log.Printf("info: BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
+	log.Infof("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
 		t.Min.X, t.Min.Y, t.Min.Z,
 		t.Max.X, t.Max.Y, t.Max.Z)
 
@@ -123,7 +124,7 @@
 		return err
 	}
 
-	log.Printf("info: vertices: %d\n", numVertices)
+	log.Infof("vertices: %d\n", numVertices)
 
 	vertices := make([]Vertex, numVertices)
 	t.Vertices = vertices
@@ -139,7 +140,7 @@
 		return err
 	}
 
-	log.Printf("info: triangles: %d\n", numTriangles)
+	log.Infof("triangles: %d\n", numTriangles)
 
 	indices := make([]int32, 3*numTriangles)
 	triangles := make([][]int32, numTriangles)
--- a/pkg/mesh/polygon.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/polygon.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,11 +17,11 @@
 	"bytes"
 	"encoding/binary"
 	"fmt"
-	"log"
 	"math"
 
 	"github.com/tidwall/rtree"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/wkb"
 )
 
@@ -464,7 +464,7 @@
 
 	rngs := make([]ring, numRings)
 
-	log.Printf("info: Number of rings: %d\n", len(rngs))
+	log.Infof("number of rings: %d\n", len(rngs))
 
 	for rng := uint32(0); rng < numRings; rng++ {
 		var numVertices uint32
@@ -472,7 +472,7 @@
 			return err
 		}
 
-		log.Printf("info: Number of vertices in ring %d: %d\n", rng, numVertices)
+		log.Infof("number of vertices in ring %d: %d\n", rng, numVertices)
 
 		numVertices *= 2
 		vertices := make([]float64, numVertices)
--- a/pkg/mesh/raster.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/raster.go	Tue Feb 08 10:20:26 2022 +0100
@@ -14,7 +14,6 @@
 package mesh
 
 import (
-	"log"
 	"math"
 	"runtime"
 	"sync"
@@ -23,6 +22,7 @@
 	"github.com/fogleman/contourmap"
 
 	"gemma.intevation.de/gemma/pkg/common"
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/wkb"
 )
 
@@ -40,12 +40,12 @@
 
 	width, height := bbox.Size()
 
-	log.Printf("info raster extent: %.2f / %.2f", width, height)
+	log.Infof("raster extent: %.2f / %.2f", width, height)
 
 	xCells := int(math.Ceil(width / cellSize))
 	yCells := int(math.Ceil(height / cellSize))
 
-	log.Printf("info raster size: %d / %d\n", xCells, yCells)
+	log.Infof("raster size: %d / %d\n", xCells, yCells)
 
 	size := (xCells + 2) * (yCells + 2)
 	cells := make([]float64, size)
@@ -231,7 +231,7 @@
 	close(cnts)
 
 	wg.Wait()
-	log.Printf("info: Tracing areas took %v\n", time.Since(start))
+	log.Infof("Tracing areas took %v\n", time.Since(start))
 
 	return areas
 }
@@ -362,7 +362,7 @@
 		forest.insertRoot(contour(cnt))
 	}
 
-	//log.Printf("cnts: %d roots: %d\n", len(cnts), len(bf.roots))
+	//log.Debugf("cnts: %d roots: %d\n", len(cnts), len(bf.roots))
 
 	var mp wkb.MultiPolygonGeom
 
--- a/pkg/mesh/strtree.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/strtree.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,9 +18,10 @@
 	"compress/gzip"
 	"encoding/binary"
 	"io"
-	"log"
 	"math"
 	"sort"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // STRTreeDefaultEntries is the default number of children per node and leaf.
@@ -275,7 +276,7 @@
 		last = x
 	}
 
-	log.Printf("info: compressed index in bytes: %d %.2f (%d %.2f)\n",
+	log.Infof("compressed index in bytes: %d %.2f (%d %.2f)\n",
 		written,
 		float64(written)/(1024*1024),
 		4*len(s.index),
--- a/pkg/mesh/tin.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/tin.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,9 +19,9 @@
 	"errors"
 	"fmt"
 	"io"
-	"log"
 	"math"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/models"
 	"gemma.intevation.de/gemma/pkg/wkb"
 )
@@ -56,7 +56,7 @@
 // Shared vertices are identified and referenced by the
 // same index.
 func (t *Tin) FromWKB(data []byte) error {
-	log.Printf("info: data length %d\n", len(data))
+	log.Infof("data length %d\n", len(data))
 
 	r := bytes.NewReader(data)
 
@@ -180,7 +180,7 @@
 		triangles = append(triangles, triangle)
 	}
 
-	log.Printf("info: bbox: [[%f, %f], [%f, %f]]\n",
+	log.Infof("bbox: [[%f, %f], [%f, %f]]\n",
 		min.X, min.Y, max.X, max.Y)
 
 	*t = Tin{
@@ -240,7 +240,7 @@
 	if err != nil {
 		return err
 	}
-	log.Printf("info: vertices %d (%d)\n", len(t.Vertices), len(t.Vertices)*3*8)
+	log.Infof("vertices %d (%d)\n", len(t.Vertices), len(t.Vertices)*3*8)
 
 	if err := binary.Write(
 		w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil {
@@ -264,7 +264,7 @@
 			last = idx
 		}
 	}
-	log.Printf("info: compressed tin indices in bytes: %d (%d)\n",
+	log.Infof("compressed tin indices in bytes: %d (%d)\n",
 		written, 3*4*len(t.Triangles))
 
 	return nil
--- a/pkg/mesh/triangulation.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/triangulation.go	Tue Feb 08 10:20:26 2022 +0100
@@ -20,9 +20,9 @@
 package mesh
 
 import (
-	"log"
 	"math"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gonum.org/v1/gonum/stat"
 )
 
@@ -115,7 +115,7 @@
 
 	var newCandidates []int32
 
-	log.Printf("info: candidates: %d\n", len(candidates))
+	log.Infof("candidates: %d\n", len(candidates))
 	for len(candidates) > 0 {
 
 		oldRemoved := len(removed)
@@ -137,9 +137,9 @@
 		newCandidates = newCandidates[:0]
 	}
 
-	log.Printf("info: candidates left: %d\n", len(candidates))
-	log.Printf("info: triangles: %d\n", len(t.Triangles)/3)
-	log.Printf("info: triangles to remove: %d\n", len(removed))
+	log.Infof("candidates left: %d\n", len(candidates))
+	log.Infof("triangles: %d\n", len(t.Triangles)/3)
+	log.Infof("info: triangles to remove: %d\n", len(removed))
 
 	type edge struct {
 		a, b       int32
@@ -213,11 +213,11 @@
 	}
 
 	if len(open) > 0 {
-		log.Printf("warn: open vertices left: %d\n", len(open))
+		log.Warnf("open vertices left: %d\n", len(open))
 	}
 
 	if len(rings) == 0 {
-		log.Println("warn: no ring found")
+		log.Warnln("no ring found")
 		return nil, removed
 	}
 
@@ -234,7 +234,7 @@
 
 	polygon = append(polygon, t.Points[rings[0].a])
 
-	log.Printf("length of boundary: %d\n", len(polygon))
+	log.Infof("length of boundary: %d\n", len(polygon))
 
 	return polygon, removed
 }
--- a/pkg/mesh/vertex.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/mesh/vertex.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,10 +18,10 @@
 	"encoding/binary"
 	"fmt"
 	"io"
-	"log"
 	"math"
 	"sort"
 
+	"gemma.intevation.de/gemma/pkg/log"
 	"gemma.intevation.de/gemma/pkg/wkb"
 )
 
@@ -571,7 +571,7 @@
 		out = append(out, curr)
 	}
 
-	log.Printf("info: ignored parts: %d\n", ignored)
+	log.Infof("ignored parts: %d\n", ignored)
 
 	return out
 }
@@ -787,7 +787,7 @@
 		}
 	}
 
-	// log.Printf("segments before/after merge: %d/%d (%d rings)\n",
+	// log.Debugf("segments before/after merge: %d/%d (%d rings)\n",
 	// len(mls), len(out), rings)
 
 	return out
--- a/pkg/middleware/dbconn.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/middleware/dbconn.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,10 +17,10 @@
 	"context"
 	"database/sql"
 	"fmt"
-	"log"
 	"net/http"
 
 	"gemma.intevation.de/gemma/pkg/auth"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 type wrapDBKeyType int
@@ -61,7 +61,7 @@
 			next.ServeHTTP(rw, req)
 			return nil
 		}); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			http.Error(rw, fmt.Sprintf("error: %v", err), http.StatusInternalServerError)
 		}
 	})
--- a/pkg/middleware/jsonhandler.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/middleware/jsonhandler.go	Tue Feb 08 10:20:26 2022 +0100
@@ -19,12 +19,12 @@
 	"encoding/json"
 	"fmt"
 	"io"
-	"log"
 	"net/http"
 
 	"github.com/jackc/pgx"
 
 	"gemma.intevation.de/gemma/pkg/auth"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // JSONResult defines the return type of JSONHandler handler function.
@@ -137,7 +137,7 @@
 	}
 
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 		switch e := err.(type) {
 		case pgx.PgError:
 			var res = struct {
@@ -152,7 +152,7 @@
 			rw.Header().Set("Content-Type", "application/json")
 			rw.WriteHeader(http.StatusInternalServerError)
 			if err := json.NewEncoder(rw).Encode(&res); err != nil {
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 			}
 		case JSONError:
 			rw.Header().Set("Content-Type", "application/json")
@@ -166,7 +166,7 @@
 				Message: e.Message,
 			}
 			if err := json.NewEncoder(rw).Encode(&res); err != nil {
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 			}
 		default:
 			http.Error(rw,
@@ -194,7 +194,7 @@
 			err = json.NewEncoder(rw).Encode(jr.Result)
 		}
 		if err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 		}
 	}
 }
@@ -206,6 +206,6 @@
 	rw.Header().Set("X-Content-Type-Options", "nosniff")
 	rw.WriteHeader(code)
 	if err := json.NewEncoder(rw).Encode(data); err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
--- a/pkg/middleware/modifyquery.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/middleware/modifyquery.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,12 +15,12 @@
 
 import (
 	"encoding/hex"
-	"log"
 	"net/http"
 	"net/url"
 	"strings"
 
 	"gemma.intevation.de/gemma/pkg/auth"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // ParseQuery is a modified version of the internal query
@@ -76,13 +76,13 @@
 		parameters := make(url.Values)
 
 		if err := ParseQuery(parameters, req.URL.RawQuery, "&", "=", nil); err != nil {
-			log.Printf("parsing query failed: %v\n", err)
+			log.Errorf("parsing query failed: %v\n", err)
 			http.Error(rw, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
 			return
 		}
 
 		if err := modify(req, parameters); err != nil {
-			log.Printf("modifying query parameters failed: %v\n", err)
+			log.Errorf("modifying query parameters failed: %v\n", err)
 			http.Error(rw, http.StatusText(http.StatusBadRequest), http.StatusBadRequest)
 		}
 
@@ -101,7 +101,7 @@
 	parameters.Del("env")
 
 	if session, ok := auth.GetSession(req); ok {
-		// log.Printf("info: injecting user %s\n", session.User)
+		// log.Infof("injecting user %s\n", session.User)
 		parameters.Set("env", "user:"+hex.EncodeToString([]byte(session.User)))
 	}
 	return nil
--- a/pkg/misc/tmpfiles.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/misc/tmpfiles.go	Tue Feb 08 10:20:26 2022 +0100
@@ -15,7 +15,6 @@
 
 import (
 	"encoding/hex"
-	"log"
 	"os"
 	"path/filepath"
 	"sort"
@@ -24,6 +23,7 @@
 
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 const (
@@ -40,7 +40,7 @@
 		config.WaitReady()
 		for {
 			if err := cleanupTmpFiles(); err != nil {
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 			}
 			time.Sleep(tmpfilesCleanUp)
 		}
--- a/pkg/models/extservices.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/models/extservices.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,11 +16,11 @@
 import (
 	"context"
 	"database/sql"
-	"log"
 	"sort"
 	"sync"
 
 	"gemma.intevation.de/gemma/pkg/auth"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 type ExtEntry struct {
@@ -45,7 +45,7 @@
 
 	if es.entries == nil {
 		if err := es.load(); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return "", false
 		}
 	}
@@ -99,7 +99,7 @@
 	defer es.mu.Unlock()
 	if es.entries == nil {
 		if err := es.load(); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return nil
 		}
 	}
--- a/pkg/models/intservices.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/models/intservices.go	Tue Feb 08 10:20:26 2022 +0100
@@ -17,12 +17,12 @@
 import (
 	"context"
 	"database/sql"
-	"log"
 	"net/http"
 	"sync"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 const DatabaseScheme = "waterway"
@@ -120,7 +120,7 @@
 
 	if ps.entries == nil {
 		if err := ps.load(); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return nil
 		}
 	}
@@ -142,7 +142,7 @@
 
 	if ps.entries == nil {
 		if err := ps.load(); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return "", false
 		}
 	}
@@ -261,7 +261,7 @@
 	defer ps.mu.Unlock()
 	if ps.entries == nil {
 		if err := ps.load(); err != nil {
-			log.Printf("error: %v\n", err)
+			log.Errorf("%v\n", err)
 			return nil
 		}
 	}
--- a/pkg/models/user.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/models/user.go	Tue Feb 08 10:20:26 2022 +0100
@@ -47,6 +47,7 @@
 		Email    Email        `json:"email"`
 		Country  Country      `json:"country"`
 		Reports  bool         `json:"reports"`
+		Active   bool         `json:"active"`
 		Extent   *BoundingBox `json:"extent"`
 	}
 
@@ -58,6 +59,7 @@
 		Email    *Email       `json:"email,omitempty"`
 		Country  *Country     `json:"country,omitempty"`
 		Reports  *bool        `json:"reports,omitempty"`
+		Active   *bool        `json:"active,omitempty"`
 		Extent   *BoundingBox `json:"extent,omitempty"`
 	}
 
--- a/pkg/scheduler/boot.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/scheduler/boot.go	Tue Feb 08 10:20:26 2022 +0100
@@ -16,10 +16,10 @@
 import (
 	"context"
 	"database/sql"
-	"log"
 
 	"gemma.intevation.de/gemma/pkg/auth"
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 const (
@@ -50,7 +50,7 @@
 // the database which have a schedule.
 func boot() {
 	config.WaitReady()
-	log.Println("info: booting scheduler from database.")
+	log.Infoln("booting scheduler from database.")
 	ctx := context.Background()
 	err := auth.RunAs(
 		ctx, bootRole,
@@ -84,7 +84,7 @@
 			return rows.Err()
 		})
 	if err != nil {
-		log.Printf("error: %v\n", err)
+		log.Errorf("%v\n", err)
 	}
 }
 
--- a/pkg/scheduler/scheduler.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/scheduler/scheduler.go	Tue Feb 08 10:20:26 2022 +0100
@@ -14,12 +14,13 @@
 package scheduler
 
 import (
-	"log"
 	"sort"
 	"strings"
 	"sync"
 
 	cron "gopkg.in/robfig/cron.v1"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 // Action is called with a configuration id.
@@ -42,7 +43,7 @@
 	if a := ua.scheduler.action(ua.name); a != nil {
 		a(ua.cfgID)
 	} else {
-		log.Printf("warn: scheduled action '%s' not found.", ua.name)
+		log.Warnf("scheduled action '%s' not found.", ua.name)
 	}
 }
 
@@ -104,7 +105,7 @@
 		numJobs++
 	}
 
-	log.Printf("info: booting %d scheduler jobs from database.\n", numJobs)
+	log.Infof("booting %d scheduler jobs from database.\n", numJobs)
 
 	s.mu.Lock()
 	defer s.mu.Unlock()
@@ -299,7 +300,7 @@
 func LogActionNames() {
 	names := global.actionNames()
 	sort.Strings(names)
-	log.Printf("info: actions registered to scheduler: %s\n",
+	log.Infof("actions registered to scheduler: %s\n",
 		strings.Join(names, ", "))
 }
 
--- a/pkg/soap/soap.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/soap/soap.go	Tue Feb 08 10:20:26 2022 +0100
@@ -20,7 +20,6 @@
 	"encoding/xml"
 	"fmt"
 	"io/ioutil"
-	"log"
 	"math/rand"
 	"net"
 	"net/http"
@@ -28,6 +27,7 @@
 	"time"
 
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 type SOAPEnvelope struct {
@@ -312,11 +312,11 @@
 		return err
 	}
 	if len(rawbody) == 0 {
-		log.Println("warn: empty response")
+		log.Warnln("empty response")
 		return nil
 	}
 
-	//log.Println(string(rawbody))
+	//log.Debugln(string(rawbody))
 	respEnvelope := new(SOAPEnvelope)
 	respEnvelope.Body = SOAPBody{Content: response}
 	err = xml.Unmarshal(rawbody, respEnvelope)
--- a/pkg/wfs/download.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/wfs/download.go	Tue Feb 08 10:20:26 2022 +0100
@@ -20,13 +20,14 @@
 	"errors"
 	"fmt"
 	"io"
-	"log"
 	"net/http"
 	"net/url"
 	"strconv"
 	"strings"
 
 	"golang.org/x/net/html/charset"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 var (
@@ -155,7 +156,7 @@
 	var numFeatures int
 
 	if supportsPaging {
-		log.Printf("info: Paging supported with %d feature per page.\n",
+		log.Infof("Paging supported with %d feature per page.\n",
 			featuresPerPage)
 
 		if !op.SupportsHits() {
@@ -163,12 +164,12 @@
 		} else {
 			numFeatures, err = numberFeaturesGET(getU, featureTypeName, wfsVersion)
 			if err != nil {
-				log.Printf("error: %v\n", err)
+				log.Errorf("%v\n", err)
 				supportsPaging = false
 			} else if numFeatures == 0 {
 				return nil, nil
 			} else {
-				log.Printf("info: Number of features: %d\n", numFeatures)
+				log.Infof("Number of features: %d\n", numFeatures)
 			}
 		}
 	}
@@ -224,10 +225,10 @@
 		}
 		if numFeatures > 0 {
 			if numFeatures <= featuresPerPage {
-				log.Println("info: All features can be fetched in one page.")
+				log.Infof("all features can be fetched in one page.")
 				downloadURLs = []string{pagedURL(0, numFeatures)}
 			} else {
-				log.Println("info: Features need to be downloaded in pages.")
+				log.Infof("features need to be downloaded in pages.")
 				for pos := 0; pos < numFeatures; {
 					var count int
 					if rest := numFeatures - pos; rest >= numFeatures {
--- a/pkg/wfs/global.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/wfs/global.go	Tue Feb 08 10:20:26 2022 +0100
@@ -18,12 +18,13 @@
 	"fmt"
 	"io"
 	"io/ioutil"
-	"log"
 	"os"
 	"os/exec"
 	"path/filepath"
+	"sync"
 
 	"gemma.intevation.de/gemma/pkg/config"
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 var (
@@ -53,17 +54,30 @@
 	GMLDownloader []string
 )
 
-// GetFeatures is the default Downloader in this Gemma server.
-var GetFeatures = setup()
+var (
+	getFeaturesOnce sync.Once
+	getFeatures     func(*Capabilities, string, string) (Downloader, error)
+)
 
-func setup() func(*Capabilities, string, string) (Downloader, error) {
+func getFeaturesOnceFunc() {
 	path, err := exec.LookPath("ogr2ogr")
 	if err != nil {
-		log.Println("info: ogr2ogr not installed. Using direct GeoJSON WFS download.")
-		return getFeaturesGeoJSON
+		log.Infoln("ogr2ogr not installed. Using direct GeoJSON WFS download.")
+		getFeatures = getFeaturesGeoJSON
+	} else {
+		log.Infof("ogr2ogr found at %s. Using GML WFS download.\n", path)
+		getFeatures = getFeaturesGML
 	}
-	log.Printf("info: ogr2ogr found at %s. Using GML WFS download.\n", path)
-	return getFeaturesGML
+}
+
+// GetFeatures is the default Downloader in this Gemma server.
+func GetFeatures(
+	caps *Capabilities,
+	featureTypeName string,
+	sortBy string,
+) (Downloader, error) {
+	getFeaturesOnce.Do(getFeaturesOnceFunc)
+	return getFeatures(caps, featureTypeName, sortBy)
 }
 
 func getFeaturesGeoJSON(
--- a/pkg/xlsx/templater.go	Wed Jul 21 15:14:40 2021 +0200
+++ b/pkg/xlsx/templater.go	Tue Feb 08 10:20:26 2022 +0100
@@ -20,15 +20,16 @@
 	"errors"
 	"fmt"
 	"io"
-	"log"
 	"os"
 	"strconv"
 	"strings"
 
-	"github.com/360EntSecGroup-Skylar/excelize/v2"
+	"github.com/xuri/excelize/v2"
 	"gopkg.in/yaml.v2"
 
 	"github.com/PaesslerAG/gval"
+
+	"gemma.intevation.de/gemma/pkg/log"
 )
 
 type Action struct {
@@ -291,7 +292,7 @@
 
 	var areas []area
 
-	//log.Println("merged cells")
+	//log.Debugln("merged cells")
 	if mcs, err := e.template.GetMergeCells(e.sourceSheet); err == nil {
 		areas = make([]area, 0, len(mcs))
 		for _, mc := range mcs {
@@ -522,7 +523,7 @@
 	}
 	num, err := excelize.ColumnNameToNumber(name)
 	if err != nil {
-		log.Printf("error: invalid column name '%v'\n", col)
+		log.Errorf("invalid column name '%v'\n", col)
 		return 1
 	}
 	return num
@@ -554,18 +555,18 @@
 func coord2cell(ix, iy interface{}) interface{} {
 	x, err := asInt(ix)
 	if err != nil {
-		log.Printf("error: invalid x value: %v\n", err)
+		log.Errorf("invalid x value: %v\n", err)
 		return "A1"
 	}
 	y, err := asInt(iy)
 	if err != nil {
-		log.Printf("error: invalid y value: %v\n", err)
+		log.Errorf("invalid y value: %v\n", err)
 		return "A1"
 	}
 
 	cell, err := excelize.CoordinatesToCellName(x, y)
 	if err != nil {
-		log.Printf("error: invalid cell coord (%d, %d)\n", x, y)
+		log.Errorf("invalid cell coord (%d, %d)\n", x, y)
 		return "A1"
 	}
 	return cell
@@ -621,7 +622,7 @@
 		}
 		s, err = eval.EvalString(e.ctx, vars)
 		if err != nil {
-			log.Printf("error: '%s' '%s' %v\n", str, s, err)
+			log.Errorf("'%s' '%s' %v\n", str, s, err)
 		}
 		return s
 	}
@@ -652,7 +653,7 @@
 		repCount++
 		last, err = eval(e.ctx, vars)
 		if err != nil {
-			log.Printf("error: '%s' '%s' %v\n", str, s, err)
+			log.Errorf("'%s' '%s' %v\n", str, s, err)
 		}
 		return fmt.Sprintf("%v", last)
 	}
Binary file report-templates/data-quality-report.xlsx has changed
--- a/report-templates/data-quality-report.yaml	Wed Jul 21 15:14:40 2021 +0200
+++ b/report-templates/data-quality-report.yaml	Tue Feb 08 10:20:26 2022 +0100
@@ -17,7 +17,7 @@
     # BN names
     - type: select
       statement: >
-        SELECT DISTINCT objnam AS bnnam, hm 
+        SELECT DISTINCT objnam AS bnnam, hm
           FROM waterway.dqr_bottleneck_stats
           WHERE cc = {{ cc }} ORDER BY hm, objnam;
       actions:
--- a/schema/gemma.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/gemma.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -385,7 +385,8 @@
         country char(2) NOT NULL REFERENCES countries,
         map_extent box2d NOT NULL,
         email_address varchar NOT NULL,
-        report_reciever boolean NOT NULL DEFAULT false
+        report_reciever boolean NOT NULL DEFAULT false,
+        active boolean NOT NULL DEFAULT true
     )
 ;
 
@@ -500,7 +501,8 @@
             p.country,
             p.map_extent,
             p.email_address,
-            p.report_reciever
+            p.report_reciever,
+            p.active
         FROM internal.user_profiles p
             JOIN pg_roles u ON p.username = u.rolname
             JOIN pg_auth_members a ON u.oid = a.member
--- a/schema/isrs_functions.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/isrs_functions.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -65,7 +65,8 @@
                 geom AS wtwaxs,
                 ST_Boundary(geom) AS bdr
             FROM waterway.waterway_axis,
-                ST_Dump(ST_Transform(wtwaxs::geometry, z));
+                ST_Dump(ST_Transform(wtwaxs::geometry, z))
+            WHERE validity @> current_timestamp;
     CREATE INDEX axs_bdr ON axis USING GiST (bdr);
     ANALYZE axis;
 
@@ -89,8 +90,7 @@
             -- to find the contiguous axis on which given distance marks lie
             (SELECT ARRAY[id] AS ids, wtwaxs
                 FROM axis, points
-                WHERE ST_Intersects(
-                    ST_Buffer(axis.wtwaxs, 0.0001), points.geom)
+                WHERE ST_DWithin(axis.wtwaxs, points.geom, 0.0001)
                 FETCH FIRST ROW ONLY)
             UNION
             -- Connect endpoint of next linestring with closest
@@ -102,29 +102,25 @@
                         SELECT refgeom
                         UNION
                         -- Fill eventual gap
-                        SELECT ST_ShortestLine(
-                                ST_Boundary(refgeom), bdr)
+                        SELECT ST_ShortestLine(refbdr, bdr)
                         UNION
                         -- Linestring to be added
                         SELECT geom)))
                 FROM axis_snapped AS axis_snapped (refids, refgeom),
                     axis AS axis (id, geom, bdr),
-                    (SELECT ST_Collect(points.geom) AS pts
-                        FROM points) AS points
+                    ST_Boundary(refgeom) AS refbdr (refbdr)
                 WHERE id <> ALL(refids)
-                    AND ST_DWithin(
-                        ST_Boundary(refgeom), bdr, tolerance)
-                    AND NOT ST_Covers(ST_Buffer(refgeom, 0.0001), points.pts)
-                ORDER BY ST_Boundary(refgeom) <-> bdr
+                    AND ST_DWithin(refbdr, bdr, tolerance)
+                    -- Stop if refgeom goes through both distance marks
+                    AND NOT 0.0001 >= ALL(SELECT refgeom <-> geom FROM points)
+                ORDER BY refbdr <-> bdr
                 FETCH FIRST ROW ONLY)),
         axis_segment AS (
             -- Fetch end result from snapping
             SELECT wtwaxs AS line
-                FROM axis_snapped,
-                    (SELECT ST_Collect(points.geom) AS pts
-                        FROM points) AS points
+                FROM axis_snapped
                 -- Return end result only if both distance marks were connected
-                WHERE ST_Covers(ST_Buffer(wtwaxs, 0.0001), points.pts))
+                WHERE 0.0001 >= ALL(SELECT wtwaxs <-> geom FROM points))
         -- Use linear referencing to clip axis between distance marks.
         -- Simplification is used to work-around the problem, that
         -- ST_LineSubstring might generate very small line segments at an
@@ -202,7 +198,8 @@
                 FROM rotated_ends)
         -- From the polygons returned by the last CTE, select only those
         -- around the clipped axis
-        SELECT ST_Multi(ST_Transform(ST_Union(range_area.geom), ST_SRID(area)))
+        SELECT ST_Multi(ST_CollectionExtract(ST_MakeValid(ST_Transform(
+                ST_Union(range_area.geom), ST_SRID(area))), 3))
             INTO result_geom
             FROM range_area
             WHERE ST_Intersects(ST_Buffer(range_area.geom, -0.0001), axis);
--- a/schema/manage_users.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/manage_users.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -82,8 +82,18 @@
     END IF;
 
     INSERT INTO internal.user_profiles (
-        username, country, map_extent, email_address)
-        VALUES (NEW.username, NEW.country, NEW.map_extent, NEW.email_address);
+        username, country, map_extent, email_address,
+        report_reciever, active)
+        VALUES (NEW.username, NEW.country, NEW.map_extent, NEW.email_address,
+                NEW.report_reciever, NEW.active);
+
+    IF NEW.active THEN
+        EXECUTE format(
+            'ALTER ROLE %I LOGIN', NEW.username);
+    ELSE
+        EXECUTE format(
+            'ALTER ROLE %I NOLOGIN', NEW.username);
+    END IF;
 
     -- Do not leak new password
     NEW.pw = '';
@@ -152,8 +162,10 @@
     END IF;
 
     UPDATE internal.user_profiles p
-        SET (username, country, map_extent, email_address)
-        = (NEW.username, NEW.country, NEW.map_extent, NEW.email_address)
+        SET (username, country, map_extent, email_address,
+             report_reciever, active)
+        = (NEW.username, NEW.country, NEW.map_extent, NEW.email_address,
+           NEW.report_reciever, NEW.active)
         WHERE p.username = cur_username;
 
     IF NEW.rolname <> OLD.rolname
@@ -172,6 +184,16 @@
             internal.check_password(NEW.pw));
     END IF;
 
+    IF NEW.active <> OLD.active THEN
+        IF NEW.active THEN
+            EXECUTE format(
+                'ALTER ROLE %I LOGIN', cur_username);
+        ELSE
+            EXECUTE format(
+                'ALTER ROLE %I NOLOGIN', cur_username);
+        END IF;
+    END IF;
+
     -- Do not leak new password
     NEW.pw = '';
     RETURN NEW;
@@ -212,7 +234,6 @@
 CREATE TRIGGER delete_user INSTEAD OF DELETE ON users.list_users FOR EACH ROW
     EXECUTE PROCEDURE internal.delete_user();
 
-
 -- To set a role from a hex-encoded user name (which is save from SQL injections).
 CREATE OR REPLACE FUNCTION public.setrole(role text) RETURNS void
 AS $$
--- a/schema/manage_users_tests.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/manage_users_tests.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -74,7 +74,7 @@
 --
 SELECT lives_ok($$
     INSERT INTO users.list_users VALUES (
-        'waterway_user', 'test1', 'secret1$', 'AT', NULL, 'test1')
+        'waterway_user', 'test1', 'secret1$', 'AT', NULL, 'test1', false, true)
     $$,
     'New waterway user can be added');
 
@@ -112,7 +112,7 @@
     INSERT INTO users.list_users VALUES (
         'waterway_user',
         'Test Nutzer AT, Test User RO, Täst Nützer ÄT, Täst Üser RÖ',
-        'secret1$', 'AT', NULL, 'test4')
+        'secret1$', 'AT', NULL, 'test4', false, true)
     $$,
     23514, NULL,
     'User name length is restricted to 63 bytes');
@@ -201,7 +201,7 @@
 
 SELECT lives_ok($$
     INSERT INTO users.list_users VALUES (
-        'waterway_user', 'test2', 'secret1$', 'AT', NULL, 'test2');
+        'waterway_user', 'test2', 'secret1$', 'AT', NULL, 'test2', false, true);
     UPDATE users.list_users
         SET (rolname, username, pw, country, map_extent, email_address)
             = ('waterway_user', 'test2_new', 'new_secret1$', 'AT',
@@ -336,7 +336,7 @@
 -- See also comments in function definition.
 SELECT lives_ok($$
     INSERT INTO users.list_users VALUES (
-        'waterway_user', 'test3', 'secret1$', 'AT', NULL, 'test3');
+        'waterway_user', 'test3', 'secret1$', 'AT', NULL, 'test3', false, true);
     DELETE FROM users.list_users WHERE username = 'test3'
     $$,
     'Existing user can be deleted');
--- a/schema/std_login_roles.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/std_login_roles.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -52,7 +52,7 @@
     -- Initial Admin account used to bootstrap the personalized accounts
     IF to_regrole(admin) IS NULL THEN
         INSERT INTO users.list_users VALUES (
-            adminrole, admin, adminpw, dummy_country, box, '');
+            adminrole, admin, adminpw, dummy_country, box, '', false, true);
         RAISE NOTICE 'Default admin user ''%'' created with password ''%''',
             admin, adminpw;
     ELSE
--- a/schema/tap_tests_data.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/tap_tests_data.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -52,17 +52,17 @@
 INSERT INTO users.stretch_countries SELECT id, objnam FROM insert_st;
 
 INSERT INTO users.list_users VALUES (
-    'waterway_user', 'test_user_at', 'user_at1$', 'AT', NULL, 'xxx');
+    'waterway_user', 'test_user_at', 'user_at1$', 'AT', NULL, 'xxx', false, true);
 INSERT INTO users.list_users VALUES (
-    'waterway_user', 'test_user_ro', 'user_ro1$', 'RO', NULL, 'xxy');
+    'waterway_user', 'test_user_ro', 'user_ro1$', 'RO', NULL, 'xxy', false, true);
 INSERT INTO users.list_users VALUES (
-    'waterway_admin', 'test_admin_at', 'admin_at1$', 'AT', NULL, 'yyy');
+    'waterway_admin', 'test_admin_at', 'admin_at1$', 'AT', NULL, 'yyy', false, true);
 INSERT INTO users.list_users VALUES (
-    'waterway_admin', 'test_admin_at2', 'admin_at2$', 'AT', NULL, 'yyy');
+    'waterway_admin', 'test_admin_at2', 'admin_at2$', 'AT', NULL, 'yyy', false, true);
 INSERT INTO users.list_users VALUES (
-    'waterway_admin', 'test_admin_ro', 'admin_ro1$', 'RO', NULL, 'yyx');
+    'waterway_admin', 'test_admin_ro', 'admin_ro1$', 'RO', NULL, 'yyx', false, true);
 INSERT INTO users.list_users VALUES (
-    'sys_admin', 'test_sys_admin1', 'sys_admin1$', 'AT', NULL, 'zzz');
+    'sys_admin', 'test_sys_admin1', 'sys_admin1$', 'AT', NULL, 'zzz', false, true);
 
 INSERT INTO limiting_factors VALUES ('depth'), ('width');
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1464/01.active.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,100 @@
+ALTER TABLE internal.user_profiles
+  ADD COLUMN active boolean NOT NULL DEFAULT true;
+
+CREATE OR REPLACE VIEW users.list_users WITH (security_barrier) AS
+    SELECT
+        r.rolname,
+        p.username,
+        CAST('' AS varchar) AS pw,
+        p.country,
+        p.map_extent,
+        p.email_address,
+        p.report_reciever,
+        p.active
+    FROM internal.user_profiles p
+        JOIN pg_roles u ON p.username = u.rolname
+        JOIN pg_auth_members a ON u.oid = a.member
+        JOIN pg_roles r ON a.roleid = r.oid
+    WHERE p.username = current_user
+        OR pg_has_role('waterway_admin', 'MEMBER')
+            AND p.country = (
+                SELECT country FROM internal.user_profiles
+                    WHERE username = current_user)
+            AND r.rolname <> 'sys_admin'
+        OR pg_has_role('sys_admin', 'MEMBER');
+
+CREATE OR REPLACE FUNCTION internal.update_user() RETURNS trigger
+AS $$
+DECLARE
+    cur_username varchar;
+BEGIN
+    cur_username = OLD.username;
+
+    IF NEW.username <> cur_username
+    THEN
+        EXECUTE format(
+            'ALTER ROLE %I RENAME TO %I', cur_username, NEW.username);
+        cur_username = NEW.username;
+    END IF;
+
+    UPDATE internal.user_profiles p
+        SET (username, country, map_extent, email_address, report_reciever, active)
+        = (NEW.username, NEW.country, NEW.map_extent, NEW.email_address, NEW.report_reciever, NEW.active)
+        WHERE p.username = cur_username;
+
+    IF NEW.rolname <> OLD.rolname
+    THEN
+        EXECUTE format(
+            'REVOKE %I FROM %I', OLD.rolname, cur_username);
+        EXECUTE format(
+            'GRANT %I TO %I', NEW.rolname, cur_username);
+    END IF;
+
+    IF NEW.pw IS NOT NULL AND NEW.pw <> ''
+    THEN
+        EXECUTE format(
+            'ALTER ROLE %I PASSWORD %L',
+            cur_username,
+            internal.check_password(NEW.pw));
+    END IF;
+
+    -- Do not leak new password
+    NEW.pw = '';
+    RETURN NEW;
+END;
+$$
+    LANGUAGE plpgsql
+    SECURITY DEFINER;
+
+CREATE OR REPLACE FUNCTION internal.create_user() RETURNS trigger
+AS $$
+BEGIN
+    IF NEW.map_extent IS NULL
+    THEN
+        NEW.map_extent = ST_Extent(CAST(area AS geometry))
+            FROM users.stretches st
+                JOIN users.stretch_countries stc ON stc.stretch_id = st.id
+            WHERE stc.country = NEW.country;
+    END IF;
+
+    IF NEW.username IS NOT NULL
+    -- otherwise let the constraint on user_profiles speak
+    THEN
+        EXECUTE format(
+            'CREATE ROLE %I IN ROLE %I LOGIN PASSWORD %L',
+            NEW.username,
+            NEW.rolname,
+            internal.check_password(NEW.pw));
+    END IF;
+
+    INSERT INTO internal.user_profiles (
+        username, country, map_extent, email_address, report_reciever, active)
+        VALUES (NEW.username, NEW.country, NEW.map_extent, NEW.email_address, NEW.report_reciever, NEW.active);
+
+    -- Do not leak new password
+    NEW.pw = '';
+    RETURN NEW;
+END;
+$$
+    LANGUAGE plpgsql
+    SECURITY DEFINER;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1465/01.delete_user.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,98 @@
+
+CREATE OR REPLACE FUNCTION internal.create_user() RETURNS trigger
+AS $$
+BEGIN
+    IF NEW.map_extent IS NULL
+    THEN
+        NEW.map_extent = ST_Extent(CAST(area AS geometry))
+            FROM users.stretches st
+                JOIN users.stretch_countries stc ON stc.stretch_id = st.id
+            WHERE stc.country = NEW.country;
+    END IF;
+
+    IF NEW.username IS NOT NULL
+    -- otherwise let the constraint on user_profiles speak
+    THEN
+        EXECUTE format(
+            'CREATE ROLE %I IN ROLE %I LOGIN PASSWORD %L',
+            NEW.username,
+            NEW.rolname,
+            internal.check_password(NEW.pw));
+    END IF;
+
+    INSERT INTO internal.user_profiles (
+        username, country, map_extent, email_address,
+        report_reciever, active)
+        VALUES (NEW.username, NEW.country, NEW.map_extent, NEW.email_address,
+                NEW.report_reciever, NEW.active);
+
+    IF NEW.active THEN
+        EXECUTE format(
+            'ALTER ROLE %I LOGIN', NEW.username);
+    ELSE
+        EXECUTE format(
+            'ALTER ROLE %I NOLOGIN', NEW.username);
+    END IF;
+
+    -- Do not leak new password
+    NEW.pw = '';
+    RETURN NEW;
+END;
+$$
+    LANGUAGE plpgsql
+    SECURITY DEFINER;
+
+CREATE OR REPLACE FUNCTION internal.update_user() RETURNS trigger
+AS $$
+DECLARE
+    cur_username varchar;
+BEGIN
+    cur_username = OLD.username;
+
+    IF NEW.username <> cur_username
+    THEN
+        EXECUTE format(
+            'ALTER ROLE %I RENAME TO %I', cur_username, NEW.username);
+        cur_username = NEW.username;
+    END IF;
+
+    UPDATE internal.user_profiles p
+        SET (username, country, map_extent, email_address,
+             report_reciever, active)
+        = (NEW.username, NEW.country, NEW.map_extent, NEW.email_address,
+           NEW.report_reciever, NEW.active)
+        WHERE p.username = cur_username;
+
+    IF NEW.rolname <> OLD.rolname
+    THEN
+        EXECUTE format(
+            'REVOKE %I FROM %I', OLD.rolname, cur_username);
+        EXECUTE format(
+            'GRANT %I TO %I', NEW.rolname, cur_username);
+    END IF;
+
+    IF NEW.pw IS NOT NULL AND NEW.pw <> ''
+    THEN
+        EXECUTE format(
+            'ALTER ROLE %I PASSWORD %L',
+            cur_username,
+            internal.check_password(NEW.pw));
+    END IF;
+
+    IF NEW.active <> OLD.active THEN
+        IF NEW.active THEN
+            EXECUTE format(
+                'ALTER ROLE %I LOGIN', cur_username);
+        ELSE
+            EXECUTE format(
+                'ALTER ROLE %I NOLOGIN', cur_username);
+        END IF;
+    END IF;
+
+    -- Do not leak new password
+    NEW.pw = '';
+    RETURN NEW;
+END;
+$$
+    LANGUAGE plpgsql
+    SECURITY DEFINER;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1466/01.fix_ISRSrange_axis.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,106 @@
+CREATE OR REPLACE FUNCTION ISRSrange_axis(
+    stretch isrsrange,
+    tolerance float
+    -- in m, up to which linestrings will be connected at their boundary
+) RETURNS geometry
+AS $$
+DECLARE z int;
+DECLARE result_geom geometry;
+BEGIN
+    -- Find best matchting UTM zone
+    z = best_utm(stretch);
+
+    CREATE TEMP TABLE axis AS
+        SELECT row_number() OVER () AS id,
+                geom AS wtwaxs,
+                ST_Boundary(geom) AS bdr
+            FROM waterway.waterway_axis,
+                ST_Dump(ST_Transform(wtwaxs::geometry, z))
+            WHERE validity @> current_timestamp;
+    CREATE INDEX axs_bdr ON axis USING GiST (bdr);
+    ANALYZE axis;
+
+    WITH RECURSIVE
+        -- In order to guarantee the following ST_Covers to work,
+        -- snap distance mark coordinates to axis
+        points0 AS (
+            SELECT ST_ClosestPoint(
+                    wtwaxs,
+                    ST_Transform(geom, z)) AS geom
+                FROM ST_Dump(ISRSrange_points(stretch)), (
+                    SELECT ST_Collect(wtwaxs) AS wtwaxs
+                        FROM axis) AS ax),
+        -- Ensure two distinct points on axis have been found
+        points AS (
+            SELECT geom
+                FROM points0
+                WHERE 2 = (SELECT count(DISTINCT geom) FROM points0)),
+        axis_snapped AS (
+            -- Iteratively connect non-contiguous axis chunks
+            -- to find the contiguous axis on which given distance marks lie
+            (SELECT ARRAY[id] AS ids, wtwaxs
+                FROM axis, points
+                WHERE ST_Intersects(
+                    ST_Buffer(axis.wtwaxs, 0.0001), points.geom)
+                FETCH FIRST ROW ONLY)
+            UNION
+            -- Connect endpoint of next linestring with closest
+            -- endpoint of merged linestring until a contiguous
+            -- linestring connecting both distance marks is build up
+            (SELECT refids || id,
+                    ST_LineMerge(ST_Collect(ARRAY(
+                        -- Linestring build up so far
+                        SELECT refgeom
+                        UNION
+                        -- Fill eventual gap
+                        SELECT ST_ShortestLine(
+                                ST_Boundary(refgeom), bdr)
+                        UNION
+                        -- Linestring to be added
+                        SELECT geom)))
+                FROM axis_snapped AS axis_snapped (refids, refgeom),
+                    axis AS axis (id, geom, bdr),
+                    (SELECT ST_Collect(points.geom) AS pts
+                        FROM points) AS points
+                WHERE id <> ALL(refids)
+                    AND ST_DWithin(
+                        ST_Boundary(refgeom), bdr, tolerance)
+                    AND NOT ST_Covers(ST_Buffer(refgeom, 0.0001), points.pts)
+                ORDER BY ST_Boundary(refgeom) <-> bdr
+                FETCH FIRST ROW ONLY)),
+        axis_segment AS (
+            -- Fetch end result from snapping
+            SELECT wtwaxs AS line
+                FROM axis_snapped,
+                    (SELECT ST_Collect(points.geom) AS pts
+                        FROM points) AS points
+                -- Return end result only if both distance marks were connected
+                WHERE ST_Covers(ST_Buffer(wtwaxs, 0.0001), points.pts))
+        -- Use linear referencing to clip axis between distance marks.
+        -- Simplification is used to work-around the problem, that
+        -- ST_LineSubstring might generate very small line segments at an
+        -- end of the resulting linestring, that significantly differ from
+        -- the direction of the input linestring due to finite precision
+        -- of the calculation. The generated small segment of the
+        -- resulting line would lead e.g. to unexpected results in an area
+        -- generated by ISRSrange_area().
+        SELECT ST_SimplifyPreserveTopology(ST_LineSubstring(
+                    axis_segment.line, min(fractions.f), max(fractions.f)),
+                0.0001) AS line
+        INTO STRICT result_geom
+        FROM axis_segment, LATERAL (
+            SELECT ST_LineLocatePoint(axis_segment.line, points.geom) AS f
+                FROM points) AS fractions
+        GROUP BY axis_segment.line;
+
+    -- Drop temporary table to avoid side effects on PostgreSQL's MVCC,
+    -- because otherwise subsequent invocations of the function will not see
+    -- changes on the underlying waterway.waterway_axis that might have
+    -- occured.
+    DROP TABLE axis;
+
+    RETURN result_geom;
+END;
+    $$
+    LANGUAGE plpgsql
+    PARALLEL RESTRICTED;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1466/02.fix_bn_areas.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,43 @@
+DO $$
+DECLARE
+    bns CURSOR FOR SELECT * FROM waterway.bottlenecks FOR UPDATE;
+    call_stack text;
+BEGIN
+    FOR cur_bn IN bns LOOP
+        BEGIN
+            UPDATE waterway.bottlenecks bn SET area = ISRSrange_area(
+                ISRSrange_axis(stretch,
+                    COALESCE((
+                        -- Guess tolerance from the last successful
+                        -- bottleneck import owned by a waterway_admin of
+                        -- the country matching the bottleneck_id
+                        SELECT DISTINCT ON (usr.country)
+                                CAST(substring(msg FROM '((\d*\.)?\d+)$')
+                                    AS float)
+                            FROM import.import_logs log
+                                JOIN import.imports imp
+                                    ON log.import_id = imp.id
+                                JOIN users.list_users usr USING (username)
+                            WHERE starts_with(log.msg,
+                                    'Tolerance used to snap waterway axis:')
+                                AND imp.kind = 'bn'
+                                AND imp.state IN('accepted', 'reviewed')
+                                AND usr.rolname = 'waterway_admin'
+                                AND usr.country = substring(
+                                    bn.bottleneck_id FROM 1 FOR 2)
+                            ORDER BY usr.country, imp.changed DESC),
+                        -- Use default tolerance if originally used cannot
+                        -- be determined
+                        5)),
+                (SELECT ST_Collect(CAST(area AS geometry))
+                    FROM waterway.waterway_area))
+            WHERE CURRENT OF bns;
+        EXCEPTION
+            WHEN no_data_found THEN
+                GET STACKED DIAGNOSTICS call_stack = PG_EXCEPTION_CONTEXT;
+                RAISE WARNING '% (%): %, CONTEXT: %',
+                    cur_bn.bottleneck_id, cur_bn.validity,
+                    SQLERRM, call_stack;
+        END;
+    END LOOP;
+END $$;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1467/01.improve_ISRSrange_axis.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,101 @@
+CREATE OR REPLACE FUNCTION ISRSrange_axis(
+    stretch isrsrange,
+    tolerance float
+    -- in m, up to which linestrings will be connected at their boundary
+) RETURNS geometry
+AS $$
+DECLARE z int;
+DECLARE result_geom geometry;
+BEGIN
+    -- Find best matchting UTM zone
+    z = best_utm(stretch);
+
+    CREATE TEMP TABLE axis AS
+        SELECT row_number() OVER () AS id,
+                geom AS wtwaxs,
+                ST_Boundary(geom) AS bdr
+            FROM waterway.waterway_axis,
+                ST_Dump(ST_Transform(wtwaxs::geometry, z))
+            WHERE validity @> current_timestamp;
+    CREATE INDEX axs_bdr ON axis USING GiST (bdr);
+    ANALYZE axis;
+
+    WITH RECURSIVE
+        -- In order to guarantee the following ST_Covers to work,
+        -- snap distance mark coordinates to axis
+        points0 AS (
+            SELECT ST_ClosestPoint(
+                    wtwaxs,
+                    ST_Transform(geom, z)) AS geom
+                FROM ST_Dump(ISRSrange_points(stretch)), (
+                    SELECT ST_Collect(wtwaxs) AS wtwaxs
+                        FROM axis) AS ax),
+        -- Ensure two distinct points on axis have been found
+        points AS (
+            SELECT geom
+                FROM points0
+                WHERE 2 = (SELECT count(DISTINCT geom) FROM points0)),
+        axis_snapped AS (
+            -- Iteratively connect non-contiguous axis chunks
+            -- to find the contiguous axis on which given distance marks lie
+            (SELECT ARRAY[id] AS ids, wtwaxs
+                FROM axis, points
+                WHERE ST_DWithin(axis.wtwaxs, points.geom, 0.0001)
+                FETCH FIRST ROW ONLY)
+            UNION
+            -- Connect endpoint of next linestring with closest
+            -- endpoint of merged linestring until a contiguous
+            -- linestring connecting both distance marks is build up
+            (SELECT refids || id,
+                    ST_LineMerge(ST_Collect(ARRAY(
+                        -- Linestring build up so far
+                        SELECT refgeom
+                        UNION
+                        -- Fill eventual gap
+                        SELECT ST_ShortestLine(refbdr, bdr)
+                        UNION
+                        -- Linestring to be added
+                        SELECT geom)))
+                FROM axis_snapped AS axis_snapped (refids, refgeom),
+                    axis AS axis (id, geom, bdr),
+                    ST_Boundary(refgeom) AS refbdr (refbdr)
+                WHERE id <> ALL(refids)
+                    AND ST_DWithin(refbdr, bdr, tolerance)
+                    -- Stop if refgeom goes through both distance marks
+                    AND NOT 0.0001 >= ALL(SELECT refgeom <-> geom FROM points)
+                ORDER BY refbdr <-> bdr
+                FETCH FIRST ROW ONLY)),
+        axis_segment AS (
+            -- Fetch end result from snapping
+            SELECT wtwaxs AS line
+                FROM axis_snapped
+                -- Return end result only if both distance marks were connected
+                WHERE 0.0001 >= ALL(SELECT wtwaxs <-> geom FROM points))
+        -- Use linear referencing to clip axis between distance marks.
+        -- Simplification is used to work-around the problem, that
+        -- ST_LineSubstring might generate very small line segments at an
+        -- end of the resulting linestring, that significantly differ from
+        -- the direction of the input linestring due to finite precision
+        -- of the calculation. The generated small segment of the
+        -- resulting line would lead e.g. to unexpected results in an area
+        -- generated by ISRSrange_area().
+        SELECT ST_SimplifyPreserveTopology(ST_LineSubstring(
+                    axis_segment.line, min(fractions.f), max(fractions.f)),
+                0.0001) AS line
+        INTO STRICT result_geom
+        FROM axis_segment, LATERAL (
+            SELECT ST_LineLocatePoint(axis_segment.line, points.geom) AS f
+                FROM points) AS fractions
+        GROUP BY axis_segment.line;
+
+    -- Drop temporary table to avoid side effects on PostgreSQL's MVCC,
+    -- because otherwise subsequent invocations of the function will not see
+    -- changes on the underlying waterway.waterway_axis that might have
+    -- occured.
+    DROP TABLE axis;
+
+    RETURN result_geom;
+END;
+    $$
+    LANGUAGE plpgsql
+    PARALLEL RESTRICTED;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1468/01.makevalid_isrsrange_area.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,51 @@
+CREATE OR REPLACE FUNCTION ISRSrange_area(
+    axis geometry,
+    area geometry
+) RETURNS geometry
+AS $$
+DECLARE
+    area_subset geometry;
+    result_geom geometry;
+BEGIN
+    -- In case area is a multipolygon, process the union of those
+    -- polygons, which intersect with the axis. The union is to avoid
+    -- problems with invalid/self-intersecting multipolygons
+    SELECT ST_Union(a_dmp.geom)
+        INTO STRICT area_subset
+        FROM (SELECT ST_MakeValid(ST_Transform(geom, ST_SRID(axis)))
+                FROM ST_Dump(area)) AS a_dmp (geom)
+        WHERE ST_Intersects(a_dmp.geom, axis)
+        HAVING ST_Union(a_dmp.geom) IS NOT NULL;
+
+    WITH
+        rotated_ends AS (
+            SELECT ST_Collect(ST_Scale(
+                    ST_Translate(e,
+                        (ST_X(p1) - ST_X(p2)) / 2,
+                        (ST_Y(p1) - ST_Y(p2)) / 2),
+                    ST_Point(d, d), p1)) AS blade
+                FROM (SELECT i, ST_PointN(axis, i) AS p1
+                        FROM (VALUES (1), (-1)) AS idx (i)) AS ep,
+                    ST_Rotate(ST_PointN(axis, i*2), pi()/2, p1) AS ep2 (p2),
+                    ST_Makeline(p1, p2) AS e (e),
+                    LATERAL (
+                        SELECT (ST_MaxDistance(p1, area_subset) / ST_Length(e))
+                            * 2) AS d (d)),
+        range_area AS (
+            -- Split area by orthogonal lines at the ends of the clipped axis
+            SELECT (ST_Dump(ST_CollectionExtract(
+                    ST_Split(area_subset, blade), 3))).geom
+                FROM rotated_ends)
+        -- From the polygons returned by the last CTE, select only those
+        -- around the clipped axis
+        SELECT ST_Multi(ST_MakeValid(ST_Transform(
+                ST_Union(range_area.geom), ST_SRID(area))))
+            INTO result_geom
+            FROM range_area
+            WHERE ST_Intersects(ST_Buffer(range_area.geom, -0.0001), axis);
+
+    RETURN result_geom;
+END;
+    $$
+    LANGUAGE plpgsql
+    STABLE PARALLEL SAFE;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/schema/updates/1469/01.fix_isrsrange_area.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -0,0 +1,51 @@
+CREATE OR REPLACE FUNCTION ISRSrange_area(
+    axis geometry,
+    area geometry
+) RETURNS geometry
+AS $$
+DECLARE
+    area_subset geometry;
+    result_geom geometry;
+BEGIN
+    -- In case area is a multipolygon, process the union of those
+    -- polygons, which intersect with the axis. The union is to avoid
+    -- problems with invalid/self-intersecting multipolygons
+    SELECT ST_Union(a_dmp.geom)
+        INTO STRICT area_subset
+        FROM (SELECT ST_MakeValid(ST_Transform(geom, ST_SRID(axis)))
+                FROM ST_Dump(area)) AS a_dmp (geom)
+        WHERE ST_Intersects(a_dmp.geom, axis)
+        HAVING ST_Union(a_dmp.geom) IS NOT NULL;
+
+    WITH
+        rotated_ends AS (
+            SELECT ST_Collect(ST_Scale(
+                    ST_Translate(e,
+                        (ST_X(p1) - ST_X(p2)) / 2,
+                        (ST_Y(p1) - ST_Y(p2)) / 2),
+                    ST_Point(d, d), p1)) AS blade
+                FROM (SELECT i, ST_PointN(axis, i) AS p1
+                        FROM (VALUES (1), (-1)) AS idx (i)) AS ep,
+                    ST_Rotate(ST_PointN(axis, i*2), pi()/2, p1) AS ep2 (p2),
+                    ST_Makeline(p1, p2) AS e (e),
+                    LATERAL (
+                        SELECT (ST_MaxDistance(p1, area_subset) / ST_Length(e))
+                            * 2) AS d (d)),
+        range_area AS (
+            -- Split area by orthogonal lines at the ends of the clipped axis
+            SELECT (ST_Dump(ST_CollectionExtract(
+                    ST_Split(area_subset, blade), 3))).geom
+                FROM rotated_ends)
+        -- From the polygons returned by the last CTE, select only those
+        -- around the clipped axis
+        SELECT ST_Multi(ST_CollectionExtract(ST_MakeValid(ST_Transform(
+                ST_Union(range_area.geom), ST_SRID(area))), 3))
+            INTO result_geom
+            FROM range_area
+            WHERE ST_Intersects(ST_Buffer(range_area.geom, -0.0001), axis);
+
+    RETURN result_geom;
+END;
+    $$
+    LANGUAGE plpgsql
+    STABLE PARALLEL SAFE;
--- a/schema/version.sql	Wed Jul 21 15:14:40 2021 +0200
+++ b/schema/version.sql	Tue Feb 08 10:20:26 2022 +0100
@@ -1,1 +1,1 @@
-INSERT INTO gemma_schema_version(version) VALUES (1463);
+INSERT INTO gemma_schema_version(version) VALUES (1468);