changeset 1485:22b2e0c7c411

translations: merge translations with new strings
author Bernhard Reiter <bernhard@intevation.de>
date Tue, 04 Dec 2018 12:52:31 +0100
parents 5ef81251af18 (diff) 5e4dcc768f90 (current diff)
children 035d8ecce9eb
files client/src/locale/de_AT/LC_MESSAGES/app.po
diffstat 44 files changed, 1651 insertions(+), 1074 deletions(-) [+]
line wrap: on
line diff
--- a/client/package.json	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/package.json	Tue Dec 04 12:52:31 2018 +0100
@@ -32,30 +32,30 @@
     "font-awesome": "^4.7.0",
     "glob-all": "^3.1.0",
     "locale2": "^2.2.0",
-    "ol": "^5.0.0",
+    "ol": "^5.3.0",
     "path": "^0.12.7",
-    "purgecss-webpack-plugin": "^1.2.1",
+    "purgecss-webpack-plugin": "^1.4.0",
     "v-tooltip": "^2.0.0-rc.33",
     "vue": "^2.5.16",
     "vue-clipboard2": "^0.2.1",
     "vue-color": "^2.6.0",
     "vue-highlightjs": "^1.3.3",
-    "vue-router": "^3.0.1",
+    "vue-router": "^3.0.2",
     "vue-snotify": "^3.2.1",
     "vuex": "^3.0.1",
     "webpack-cli": "^3.1.2"
   },
   "devDependencies": {
-    "@vue/cli-plugin-babel": "^3.1.1",
-    "@vue/cli-plugin-e2e-nightwatch": "^3.1.1",
-    "@vue/cli-plugin-eslint": "^3.1.4",
-    "@vue/cli-plugin-unit-jest": "^3.1.1",
-    "@vue/cli-service": "^3.1.2",
-    "@vue/eslint-config-prettier": "^4.0.0",
-    "@vue/test-utils": "^1.0.0-beta.20",
+    "@vue/cli-plugin-babel": "^3.2.0",
+    "@vue/cli-plugin-e2e-nightwatch": "^3.2.0",
+    "@vue/cli-plugin-eslint": "^3.2.1",
+    "@vue/cli-plugin-unit-jest": "^3.2.0",
+    "@vue/cli-service": "^3.2.0",
+    "@vue/eslint-config-prettier": "^4.0.1",
+    "@vue/test-utils": "^1.0.0-beta.26",
     "babel-core": "7.0.0-bridge.0",
     "babel-jest": "^23.0.1",
-    "concurrently": "^4.0.1",
+    "concurrently": "^4.1.0",
     "copy-webpack-plugin": "^4.6.0",
     "easygettext": "^2.7.0",
     "node-sass": "^4.10.0",
--- a/client/src/components/App.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/App.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -27,9 +27,7 @@
       </div>
       <Zoom v-if="routeName == 'mainview'"></Zoom>
     </div>
-    <div class="d-flex flex-column">
-      <router-view/>
-    </div>
+    <div class="d-flex flex-column"><router-view /></div>
     <vue-snotify></vue-snotify>
   </div>
 </template>
--- a/client/src/components/Login.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/Login.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -3,16 +3,19 @@
     <div class="m-5">
       <!-- logo section -->
       <div class="d-flex flex-row justify-content-center mb-3">
-        <div class="logo mr-3">
-          <img src="../assets/logo.png">
-        </div>
+        <div class="logo mr-3"><img src="../assets/logo.png" /></div>
         <div class="title">
           <h1>{{ appTitle }}</h1>
         </div>
       </div>
       <!-- end logo section -->
       <form class="loginform mx-auto" @submit.prevent="login">
-        <div id="alert" :style="errorMessageStyle" :class="errorMessageClass" role="alert">
+        <div
+          id="alert"
+          :style="errorMessageStyle"
+          :class="errorMessageClass"
+          role="alert"
+        >
           <span>{{ errorMessage }}</span>
         </div>
         <div class="input-group mb-3">
@@ -24,7 +27,7 @@
             :placeholder="usernameLabel"
             required
             autofocus
-          >
+          />
         </div>
         <div class="input-group mb-3">
           <input
@@ -35,16 +38,20 @@
             :placeholder="passwordLabel"
             :required="!showPasswordReset"
             :disabled="showPasswordReset"
-          >
+          />
           <div class="input-group-append">
-            <span class="input-group-text disabled" id="basic-addon2" @click="showPassword">
-              <font-awesome-icon icon="eye" v-if="!readablePassword"/>
-              <font-awesome-icon icon="eye-slash" v-if="readablePassword"/>
+            <span
+              class="input-group-text disabled"
+              id="basic-addon2"
+              @click="showPassword"
+            >
+              <font-awesome-icon icon="eye" v-if="!readablePassword" />
+              <font-awesome-icon icon="eye-slash" v-if="readablePassword" />
             </span>
           </div>
         </div>
         <button
-          v-if="showPasswordReset==false"
+          v-if="showPasswordReset == false"
           class="btn btn-primary btn-block shadow-sm"
           :disabled="submitted || showPasswordReset"
           type="submit"
@@ -52,7 +59,11 @@
           <translate>Login</translate>
         </button>
         <div v-if="showPasswordReset" class="passwordreset">
-          <button class="btn btn-block btn-info" type="button" @click="resetPassword">
+          <button
+            class="btn btn-block btn-info"
+            type="button"
+            @click="resetPassword"
+          >
             <translate>Request password reset!</translate>
           </button>
           <div class="pull-right">
@@ -70,11 +81,11 @@
 
       <!-- bottom logo section -->
       <div class="mb-3 secondary-logo mx-auto mb-auto">
-        <img :src="secondaryLogo">
+        <img :src="secondaryLogo" />
       </div>
     </div>
-  </div>
-</template>)
+  </div> </template
+>)
 
 <style lang="scss" scoped>
 .login {
--- a/client/src/components/Sidebar.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/Sidebar.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -8,7 +8,10 @@
     </div>
     <div class="menu text-nowrap text-left">
       <router-link to="/">
-        <font-awesome-icon icon="map-marked-alt" fixed-width></font-awesome-icon>
+        <font-awesome-icon
+          icon="map-marked-alt"
+          fixed-width
+        ></font-awesome-icon>
         <span v-translate class="fix-trans-space">Map</span>
       </router-link>
       <a
@@ -26,20 +29,25 @@
           :class="['secondary', { active: isActive('imports') }]"
         >
           <font-awesome-icon icon="upload" fixed-width></font-awesome-icon>
-          <span v-translate class="fix-trans-space">Import soundingresults</span>
+          <span v-translate class="fix-trans-space"
+            >Import soundingresults</span
+          >
         </a>
         <a
           href="#"
           @click="toggleContextBox('staging')"
           :class="['secondary', { active: isActive('staging') }]"
         >
-          <font-awesome-icon icon="clipboard-check" fixed-width></font-awesome-icon>
+          <font-awesome-icon
+            icon="clipboard-check"
+            fixed-width
+          ></font-awesome-icon>
           <span v-translate class="fix-trans-space">Staging area</span>
         </a>
         <small class="text-muted pl-3">
           <translate>Systemadministration</translate>
         </small>
-        <hr class="m-0">
+        <hr class="m-0" />
         <router-link to="usermanagement">
           <font-awesome-icon icon="users-cog" fixed-width></font-awesome-icon>
           <span v-translate class="fix-trans-space">Users</span>
@@ -60,14 +68,13 @@
         </router-link>
         <router-link v-if="this.$options.IMPORTSCHEDULE" to="importschedule">
           <font-awesome-icon icon="clock" fixed-width></font-awesome-icon>
-          <translate>Importschedule</translate>
+          <translate class="fix-trans-space">Importschedule</translate>
         </router-link>
       </div>
-      <hr class="m-0">
+      <hr class="m-0" />
       <a href="#" @click="logoff">
         <font-awesome-icon icon="power-off" fixed-width></font-awesome-icon>
-        <span v-translate class="fix-trans-space">Logout</span>
-        {{ user }}
+        <span v-translate class="fix-trans-space">Logout</span> {{ user }}
       </a>
     </div>
   </div>
--- a/client/src/components/admin/Importqueue.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/Importqueue.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -3,7 +3,9 @@
     <div :class="spacerStyle"></div>
     <div class="mt-3">
       <div class="card importqueuecard shadow-xs">
-        <h6 class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center">
+        <h6
+          class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+        >
           <font-awesome-icon icon="tasks" class="mr-2"></font-awesome-icon>
           <translate class="headline">Importqueue</translate>
         </h6>
@@ -23,10 +25,13 @@
                   placeholder
                   aria-label="Search"
                   aria-describedby="search"
-                >
+                />
               </div>
               <div class="filters">
-                <button @click="setFilter('successful')" :class="successfulStyle">
+                <button
+                  @click="setFilter('successful')"
+                  :class="successfulStyle"
+                >
                   <translate>Successful</translate>
                 </button>
                 <button @click="setFilter('failed')" :class="failedStyle">
@@ -46,26 +51,18 @@
             <table class="table">
               <thead>
                 <tr>
-                  <th>
-                    <translate>Enqueued</translate>
-                  </th>
-                  <th>
-                    <translate>Kind</translate>
-                  </th>
-                  <th>
-                    <translate>User</translate>
-                  </th>
-                  <th>
-                    <translate>State</translate>
-                  </th>
+                  <th><translate>Enqueued</translate></th>
+                  <th><translate>Kind</translate></th>
+                  <th><translate>User</translate></th>
+                  <th><translate>State</translate></th>
                 </tr>
               </thead>
               <tbody>
                 <tr v-for="job in filteredImports" :key="job.id">
-                  <td>{{job.enqueued}}</td>
-                  <td>{{job.kind}}</td>
-                  <td>{{job.user}}</td>
-                  <td>{{job.state}}</td>
+                  <td>{{ job.enqueued }}</td>
+                  <td>{{ job.kind }}</td>
+                  <td>{{ job.user }}</td>
+                  <td>{{ job.state }}</td>
                 </tr>
               </tbody>
             </table>
@@ -134,7 +131,7 @@
       this.$store.dispatch("imports/getImports").catch(error => {
         const { status, data } = error.response;
         displayError({
-          title: "Backend Error",
+          title: this.$gettext("Backend Error"),
           message: `${status}: ${data.message || data}`
         });
       });
--- a/client/src/components/admin/Logs.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/Logs.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -2,44 +2,54 @@
   <div class="main d-flex flex-column">
     <div class="d-flex flex-row">
       <div :class="spacer"></div>
-      <div class="logoutput text-left bg-white shadow-xs mt-3 mx-3">
-        <pre id="code" v-highlightjs="logs"><code class="bash hljs hljs-string"></code></pre>
-      </div>
-    </div>
-    <div class="d-flex flex-row logmenu">
-      <div class="d-flex align-self-center">
-        <ul class="nav nav-pills">
-          <li class="nav-item">
-            <a
-              @click="fetch('system/log/apache2/access.log', 'accesslog')"
-              :class="accesslogStyle"
-              href="#"
-            >
-              <translate>Accesslog</translate>
-            </a>
-          </li>
-          <li class="nav-item">
-            <a
-              @click="fetch('system/log/apache2/error.log', 'errorlog')"
-              :class="errorlogStyle"
-              href="#"
-            >
-              <translate>Errorlog</translate>
-            </a>
-          </li>
-        </ul>
-      </div>
-      <div class="statuscontainer d-flex flex-row">
-        <div class="statusline ml-3 mt-1 align-self-center">
-          <h3>
-            <translate>Last refresh:</translate>
-            {{refreshed}}
-          </h3>
+      <div class="card logs shadow-xs mt-3 mr-3">
+        <h6
+          class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+        >
+          <font-awesome-icon icon="book" class="mr-2"></font-awesome-icon>
+          <translate class="headline">Logs</translate>
+        </h6>
+        <div class="logoutput text-left bg-white">
+          <pre id="code" v-highlightjs="logs">
+          <code class="bash hljs hljs-string"></code>
+          </pre>
         </div>
-        <div class="refresh">
-          <button class="btn btn-dark" @click="fetch(currentFile, currentLog)">
-            <translate>Refresh</translate>
-          </button>
+        <div class="logmenu">
+          <div class="d-flex align-self-center">
+            <ul class="nav nav-pills">
+              <li class="nav-item">
+                <a
+                  @click="fetch('system/log/apache2/access.log', 'accesslog')"
+                  :class="accesslogStyle"
+                  href="#"
+                >
+                  <translate>Accesslog</translate>
+                </a>
+              </li>
+              <li class="nav-item">
+                <a
+                  @click="fetch('system/log/apache2/error.log', 'errorlog')"
+                  :class="errorlogStyle"
+                  href="#"
+                >
+                  <translate>Errorlog</translate>
+                </a>
+              </li>
+            </ul>
+          </div>
+          <div class="statuscontainer d-flex flex-row mb-3">
+            <div class="statusline align-self-center">
+              <h3><translate>Last refresh:</translate> {{ refreshed }}</h3>
+            </div>
+            <div class="refresh">
+              <button
+                class="btn btn-dark"
+                @click="fetch(currentFile, currentLog)"
+              >
+                <translate>Refresh</translate>
+              </button>
+            </div>
+          </div>
         </div>
       </div>
     </div>
@@ -53,8 +63,13 @@
 }
 
 .logmenu {
-  margin-left: 5rem;
-  min-width: 60vw;
+  position: relative;
+  margin-left: $offset;
+  margin-top: $offset;
+}
+
+.logs {
+  height: 85vh;
 }
 
 #code {
@@ -63,12 +78,15 @@
 
 .refresh {
   position: absolute;
-  right: 0;
+  right: $offset;
+  bottom: 0;
 }
 
 .logoutput {
-  width: 95%;
-  height: 85vh;
+  margin-left: $offset;
+  margin-right: $offset;
+  margin-top: $offset;
+  height: 90%;
   overflow: auto;
   transition: $transition-fast;
 }
@@ -90,6 +108,11 @@
   position: absolute;
   right: 0;
   margin-right: 7rem;
+  bottom: -0.5rem;
+}
+
+.statuscontainer {
+  width: 100%;
 }
 </style>
 
--- a/client/src/components/admin/Systemconfiguration.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/Systemconfiguration.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -2,7 +2,9 @@
   <div class="d-flex flex-row">
     <div :class="spacerStyle"></div>
     <div class="card sysconfig mt-3 shadow-xs">
-      <h6 class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center">
+      <h6
+        class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+      >
         <font-awesome-icon icon="wrench" class="mr-2"></font-awesome-icon>
         <translate class="headline">Systemconfiguration</translate>
       </h6>
@@ -11,13 +13,13 @@
           <h4 class="card-title">
             <translate>Bottleneck Areas stroke-color</translate>
           </h4>
-          <compact-picker v-model="strokeColor"/>
+          <compact-picker v-model="strokeColor" />
         </section>
         <section>
           <h4 class="card-title">
             <translate>Bottleneck Areas fill-color</translate>
           </h4>
-          <chrome-picker v-model="fillColor"/>
+          <chrome-picker v-model="fillColor" />
         </section>
         <div class="sendbutton">
           <a @click.prevent="submit" class="btn btn-info text-white">
@@ -128,7 +130,7 @@
         .catch(error => {
           const { status, data } = error.response;
           displayError({
-            title: "Backend Error",
+            title: this.$gettext("Backend Error"),
             message: `${status}: ${data.message || data}`
           });
         });
@@ -143,7 +145,7 @@
         .catch(error => {
           const { status, data } = error.response;
           displayError({
-            title: "Backend Error",
+            title: this.$gettext("Backend Error"),
             message: `${status}: ${data.message || data}`
           });
         });
@@ -162,7 +164,7 @@
       .catch(error => {
         const { status, data } = error.response;
         displayError({
-          title: "Backend Error",
+          title: this.$gettext("Backend Error"),
           message: `${status}: ${data.message || data}`
         });
       });
@@ -179,7 +181,7 @@
       .catch(error => {
         const { status, data } = error.response;
         displayError({
-          title: "Backend Error",
+          title: this.$gettext("Backend Error"),
           message: `${status}: ${data.message || data}`
         });
       });
--- a/client/src/components/admin/importschedule/Importschedule.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/importschedule/Importschedule.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -3,7 +3,9 @@
     <div :class="spacerStyle"></div>
     <div class="mt-3">
       <div class="card schedulecard shadow-xs">
-        <h6 class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center">
+        <h6
+          class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+        >
           <font-awesome-icon icon="clock" class="mr-2"></font-awesome-icon>
           <translate class="headline">Importschedule</translate>
         </h6>
@@ -23,27 +25,17 @@
                   placeholder
                   aria-label="Search"
                   aria-describedby="search"
-                >
+                />
               </div>
             </div>
             <table v-if="schedules.length" class="table">
               <thead>
                 <tr>
-                  <th>
-                    <translate>Import</translate>
-                  </th>
-                  <th>
-                    <translate>Type</translate>
-                  </th>
-                  <th>
-                    <translate>Author</translate>
-                  </th>
-                  <th>
-                    <translate>Schedule</translate>
-                  </th>
-                  <th>
-                    <translate>Email</translate>
-                  </th>
+                  <th><translate>Import</translate></th>
+                  <th><translate>Type</translate></th>
+                  <th><translate>Author</translate></th>
+                  <th><translate>Schedule</translate></th>
+                  <th><translate>Email</translate></th>
                   <th>&nbsp;</th>
                   <th>&nbsp;</th>
                 </tr>
@@ -56,10 +48,17 @@
                   <td></td>
                   <td></td>
                   <td>
-                    <font-awesome-icon icon="pencil-alt" fixed-width></font-awesome-icon>
+                    <font-awesome-icon
+                      icon="pencil-alt"
+                      fixed-width
+                    ></font-awesome-icon>
                   </td>
                   <td>
-                    <font-awesome-icon @click="deleteSchedule" icon="trash" fixed-width></font-awesome-icon>
+                    <font-awesome-icon
+                      @click="deleteSchedule"
+                      icon="trash"
+                      fixed-width
+                    ></font-awesome-icon>
                   </td>
                 </tr>
               </tbody>
@@ -67,7 +66,10 @@
             <div v-else class="mt-4 small text-center py-3">
               <translate>No schedules</translate>
             </div>
-            <button @click="newImport" class="btn btn-info position-absolute newbutton">
+            <button
+              @click="newImport"
+              class="btn btn-info position-absolute newbutton"
+            >
               <translate>New Import</translate>
             </button>
           </div>
--- a/client/src/components/admin/importschedule/Importscheduledetail.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/importschedule/Importscheduledetail.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,9 @@
 <template>
   <div class="importscheduledetails" v-if="importScheduleDetailVisible">
     <div class="card shadow-xs">
-      <h6 class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center">
+      <h6
+        class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+      >
         <translate>New import</translate>
         <span @click="closeDetailview" class="closebutton">
           <font-awesome-icon icon="times"></font-awesome-icon>
--- a/client/src/components/admin/usermanagement/Passwordfield.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/usermanagement/Passwordfield.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,6 +1,6 @@
 <template>
   <div>
-    <label for="password">{{this.label}}</label>
+    <label for="password">{{ this.label }}</label>
     <div class="d-flex d-row">
       <input
         :type="isPasswordVisible"
@@ -8,15 +8,17 @@
         class="form-control"
         :placeholder="placeholder"
         :required="required"
-      >
+      />
       <span class="input-group-text" @click="showPassword">
-        <font-awesome-icon :icon="readablePassword ? 'eye-slash' : 'eye'"></font-awesome-icon>
+        <font-awesome-icon
+          :icon="readablePassword ? 'eye-slash' : 'eye'"
+        ></font-awesome-icon>
       </span>
     </div>
     <div v-show="passworderrors" class="text-danger">
       <small>
         <font-awesome-icon icon="exclamation-triangle"></font-awesome-icon>
-        {{ this.passworderrors}}
+        {{ this.passworderrors }}
       </small>
     </div>
   </div>
--- a/client/src/components/admin/usermanagement/Userdetail.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/usermanagement/Userdetail.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,9 @@
 <template>
   <div class="userdetails h-100 mt-3 mr-auto shadow fadeIn animated">
     <div class="card">
-      <h6 class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center">
+      <h6
+        class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+      >
         {{ this.cardHeader }}
         <span @click="closeDetailview" class="closebutton">
           <font-awesome-icon icon="times"></font-awesome-icon>
@@ -11,9 +13,7 @@
         <form @submit.prevent="save" class="ml-3">
           <div class="formfields">
             <div v-if="currentUser.isNew" class="form-group row">
-              <label for="user">
-                <translate>Username</translate>
-              </label>
+              <label for="user"> <translate>Username</translate> </label>
               <input
                 type="user"
                 :placeholder="userNamePlaceholder"
@@ -21,18 +21,18 @@
                 id="user"
                 aria-describedby="userHelp"
                 v-model="currentUser.user"
-              >
+              />
               <div v-show="errors.user" class="text-danger">
                 <small>
-                  <font-awesome-icon icon="exclamation-triangle"></font-awesome-icon>
+                  <font-awesome-icon
+                    icon="exclamation-triangle"
+                  ></font-awesome-icon>
                   {{ errors.user }}
                 </small>
               </div>
             </div>
             <div class="form-group row">
-              <label for="country">
-                <translate>Country</translate>
-              </label>
+              <label for="country"> <translate>Country</translate> </label>
               <select
                 class="form-control form-control-sm"
                 v-on:change="validateCountry"
@@ -45,19 +45,20 @@
                   v-for="country in countries"
                   v-bind:value="country"
                   v-bind:key="country"
-                >{{country}}</option>
+                  >{{ country }}</option
+                >
               </select>
               <div v-show="errors.country" class="text-danger">
                 <small>
-                  <font-awesome-icon icon="exclamation-triangle"></font-awesome-icon>
+                  <font-awesome-icon
+                    icon="exclamation-triangle"
+                  ></font-awesome-icon>
                   {{ errors.country }}
                 </small>
               </div>
             </div>
             <div class="form-group row">
-              <label for="email">
-                <translate>Email address</translate>
-              </label>
+              <label for="email"> <translate>Email address</translate> </label>
               <input
                 type="email"
                 v-on:change="validateEmailaddress"
@@ -65,18 +66,18 @@
                 id="email"
                 aria-describedby="emailHelp"
                 v-model="currentUser.email"
-              >
+              />
               <div v-show="errors.email" class="text-danger">
                 <small>
-                  <font-awesome-icon icon="exclamation-triangle"></font-awesome-icon>
+                  <font-awesome-icon
+                    icon="exclamation-triangle"
+                  ></font-awesome-icon>
                   {{ errors.email }}
                 </small>
               </div>
             </div>
             <div class="form-group row">
-              <label for="role">
-                <translate>Role</translate>
-              </label>
+              <label for="role"> <translate>Role</translate> </label>
               <select
                 class="form-control form-control-sm"
                 v-on:change="validateRole"
@@ -97,7 +98,9 @@
               </select>
               <div v-show="errors.role" class="text-danger">
                 <small>
-                  <font-awesome-icon icon="exclamation-triangle"></font-awesome-icon>
+                  <font-awesome-icon
+                    icon="exclamation-triangle"
+                  ></font-awesome-icon>
                   {{ errors.role }}
                 </small>
               </div>
@@ -120,21 +123,23 @@
             </div>
           </div>
           <div>
-            <button type="submit" :disabled="submitted" class="shadow-sm btn btn-info pull-right">
+            <button
+              type="submit"
+              :disabled="submitted"
+              class="shadow-sm btn btn-info pull-right"
+            >
               <translate>Submit</translate>
             </button>
           </div>
           <div
-            v-if="currentUser.role !='waterway_user' "
+            v-if="currentUser.role != 'waterway_user'"
             class="form-group row d-flex flex-row justify-content-start mailbutton"
           >
             <a @click="sendTestMail" class="btn btn-light">
               <font-awesome-icon icon="paper-plane"></font-awesome-icon>
               <translate>Send testmail</translate>
             </a>
-            <div v-if="mailsent">
-              <translate>Mail was sent</translate>
-            </div>
+            <div v-if="mailsent"><translate>Mail was sent</translate></div>
           </div>
         </form>
       </div>
@@ -219,10 +224,10 @@
   data() {
     return {
       mailsent: false,
-      passwordLabel: "Password",
-      passwordReLabel: "Repeat Password",
-      passwordPlaceholder: "password",
-      passwordRePlaceholder: "password again",
+      passwordLabel: this.$gettext("Password"),
+      passwordReLabel: this.$gettext("Repeat Password"),
+      passwordPlaceholder: this.$gettext("password"),
+      passwordRePlaceholder: this.$gettext("password again"),
       password: "",
       passwordre: "",
       currentUser: {},
@@ -288,7 +293,7 @@
           this.submitted = false;
           const { status, data } = error.response;
           displayError({
-            title: "Backend Error",
+            title: this.$gettext("Backend Error"),
             message: `${status}: ${data.message || data}`
           });
         });
@@ -315,23 +320,29 @@
     validateCountry() {
       this.errors.country = this.currentUser.country
         ? ""
-        : "Please choose a country";
+        : this.$gettext("Please choose a country");
     },
     validateRole() {
-      this.errors.role = this.currentUser.role ? "" : "Please choose a role";
+      this.errors.role = this.currentUser.role
+        ? ""
+        : this.$gettext("Please choose a role");
     },
     validatePassword() {
       this.errors.passwordre =
-        this.password === this.passwordre ? "" : "Passwords do not match!";
+        this.password === this.passwordre
+          ? ""
+          : this.$gettext("Passwords do not match!");
       this.errors.password =
         this.password === "" || !violatedPasswordRules(this.password)
           ? ""
-          : "Password should at least be 8 char long including 1 digit and 1 special char like $";
+          : 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)
         ? ""
-        : "invalid email";
+        : this.$gettext("invalid email");
     },
     validate() {
       this.validateCountry();
@@ -354,7 +365,7 @@
           this.$store.dispatch("usermanagement/loadUsers").catch(error => {
             const { status, data } = error.response;
             displayError({
-              title: "Backend Error",
+              title: this.$gettext("Backend Error"),
               message: `${status}: ${data.message || data}`
             });
           });
@@ -363,7 +374,7 @@
           this.submitted = false;
           const { status, data } = error.response;
           displayError({
-            title: "Error while saving user",
+            title: this.$gettext("Error while saving user"),
             message: `${status}: ${data.message || data}`
           });
         });
--- a/client/src/components/admin/usermanagement/Usermanagement.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/admin/usermanagement/Usermanagement.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -5,8 +5,13 @@
       <div class="d-flex flex-row">
         <div :class="userlistStyle">
           <div class="card">
-            <h6 class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center">
-              <font-awesome-icon icon="users-cog" class="mr-2"></font-awesome-icon>
+            <h6
+              class="mb-0 py-2 px-3 border-bottom d-flex text-info align-items-center"
+            >
+              <font-awesome-icon
+                icon="users-cog"
+                class="mr-2"
+              ></font-awesome-icon>
               <translate class="headline">Users</translate>
             </h6>
             <div class="card-body">
@@ -14,38 +19,64 @@
                 <thead>
                   <tr>
                     <th scope="col" @click="sortBy('user')">
-                      <span>Username&nbsp;
-                        <font-awesome-icon v-if="sortCriterion=='user'" icon="angle-down"></font-awesome-icon>
+                      <span
+                        >Username&nbsp;
+                        <font-awesome-icon
+                          v-if="sortCriterion == 'user'"
+                          icon="angle-down"
+                        ></font-awesome-icon>
                       </span>
                     </th>
                     <th scope="col" @click="sortBy('country')">
-                      <span>Country&nbsp;
-                        <font-awesome-icon v-if="sortCriterion=='country'" icon="angle-down"></font-awesome-icon>
+                      <span
+                        >Country&nbsp;
+                        <font-awesome-icon
+                          v-if="sortCriterion == 'country'"
+                          icon="angle-down"
+                        ></font-awesome-icon>
                       </span>
                     </th>
                     <th scope="col" @click="sortBy('email')">
-                      <span>Email&nbsp;
-                        <font-awesome-icon v-if="sortCriterion=='email'" icon="angle-down"></font-awesome-icon>
+                      <span
+                        >Email&nbsp;
+                        <font-awesome-icon
+                          v-if="sortCriterion == 'email'"
+                          icon="angle-down"
+                        ></font-awesome-icon>
                       </span>
                     </th>
                     <th scope="col" @click="sortBy('role')">
-                      <span>Role&nbsp;
-                        <font-awesome-icon v-if="sortCriterion=='role'" icon="angle-down"></font-awesome-icon>
+                      <span
+                        >Role&nbsp;
+                        <font-awesome-icon
+                          v-if="sortCriterion == 'role'"
+                          icon="angle-down"
+                        ></font-awesome-icon>
                       </span>
                     </th>
                     <th scope="col"></th>
                   </tr>
                 </thead>
                 <tbody>
-                  <tr v-for="user in users" :key="user.user" @click="selectUser(user.user)">
+                  <tr
+                    v-for="user in users"
+                    :key="user.user"
+                    @click="selectUser(user.user)"
+                  >
                     <td>{{ user.user }}</td>
                     <td>{{ user.country }}</td>
-                    <td>{{ user.email}}</td>
+                    <td>{{ user.email }}</td>
                     <td>
-                      <font-awesome-icon :icon="roleIcon(user.role)" @click="deleteUser(user.user)"></font-awesome-icon>
+                      <font-awesome-icon
+                        :icon="roleIcon(user.role)"
+                        @click="deleteUser(user.user)"
+                      ></font-awesome-icon>
                     </td>
                     <td>
-                      <font-awesome-icon icon="trash" @click="deleteUser(user.user)"></font-awesome-icon>
+                      <font-awesome-icon
+                        icon="trash"
+                        @click="deleteUser(user.user)"
+                      ></font-awesome-icon>
                     </td>
                   </tr>
                 </tbody>
@@ -59,7 +90,7 @@
               >
                 <font-awesome-icon icon="angle-left"></font-awesome-icon>
               </button>
-              {{this.currentPage}} / {{this.pages}}
+              {{ this.currentPage }} / {{ this.pages }}
               <button
                 @click="nextPage"
                 v-if="this.currentPage !== this.pages"
@@ -69,13 +100,16 @@
               </button>
             </div>
             <div class="mr-3 pb-3">
-              <button @click="addUser " class="btn btn-info pull-right shadow-sm">
+              <button
+                @click="addUser"
+                class="btn btn-info pull-right shadow-sm"
+              >
                 <translate>Add User</translate>
               </button>
             </div>
           </div>
         </div>
-        <Userdetail v-if="isUserDetailsVisible "></Userdetail>
+        <Userdetail v-if="isUserDetailsVisible"></Userdetail>
       </div>
     </div>
   </div>
@@ -263,7 +297,7 @@
           this.$store.dispatch("usermanagement/loadUsers").catch(error => {
             const { status, data } = error.response;
             displayError({
-              title: "Backend Error",
+              title: this.$gettext("Backend Error"),
               message: `${status}: ${data.message || data}`
             });
           });
@@ -271,7 +305,7 @@
         .catch(error => {
           const { status, data } = error.response;
           displayError({
-            title: "Backend Error",
+            title: this.$gettext("Backend Error"),
             message: `${status}: ${data.message || data}`
           });
         });
@@ -297,7 +331,7 @@
       .catch(error => {
         const { status, data } = error.response;
         displayError({
-          title: "Backend Error",
+          title: this.$gettext("Backend Error"),
           message: `${status}: ${data}`
         });
       });
--- a/client/src/components/map/Identify.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/Identify.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,5 +1,10 @@
 <template>
-  <div :class="['box ui-element rounded bg-white text-nowrap', { expanded: showIdentify }]">
+  <div
+    :class="[
+      'box ui-element rounded bg-white text-nowrap',
+      { expanded: showIdentify }
+    ]"
+  >
     <div style="width: 20rem">
       <h6 class="mb-0 py-2 px-3 border-bottom d-flex align-items-center">
         <font-awesome-icon icon="info" class="mr-2"></font-awesome-icon>
@@ -13,17 +18,30 @@
       <div class="d-flex flex-column features p-3 flex-grow-1 text-left">
         <div v-if="currentMeasurement">
           <b>
-            {{ currentMeasurement.quantity }}
-            ({{ currentMeasurement.unitSymbol }}):
+            {{ currentMeasurement.quantity }} ({{
+              currentMeasurement.unitSymbol
+            }}):
           </b>
-          <br>
+          <br />
           <small>{{ currentMeasurement.value }}</small>
         </div>
         <div v-for="(feature, i) of identifiedFeatures" :key="feature.getId()">
           <div v-if="feature.getId()" :class="{ 'mt-2': i }">
-            <b>{{ feature.getId().replace(/[.][^.]*$/,"") /* cut away everything from the last . to the end */}}:</b>
-            <small v-for="(value, key) in prepareProperties(feature)" :key="key">
-              <div v-if="value">{{key}}:{{value}}</div>
+            <b
+              >{{
+                feature
+                  .getId()
+                  .replace(
+                    /[.][^.]*$/,
+                    ""
+                  ) /* cut away everything from the last . to the end */
+              }}:</b
+            >
+            <small
+              v-for="(value, key) in prepareProperties(feature)"
+              :key="key"
+            >
+              <div v-if="value">{{ key }}:{{ value }}</div>
             </small>
           </div>
         </div>
@@ -35,22 +53,29 @@
         </div>
       </div>
       <div class="versioninfo border-top p-3 text-left">
-        <translate>This app uses</translate>
-        <i>gemma</i>,
-        <translate>which is Free Software under</translate>
-        <br>AGPL-3.0-or-later
-        <translate>without warranty, see docs for details.</translate>
-        <br>
-
+        <span v-translate="{ license: 'AGPL-3.0-or-later' }">
+          This app uses <i>gemma</i>, which is Free Software under <br />
+          %{ license } without warranty, see docs for details.
+        </span>
+        <br />
         <a href="https://hg.intevation.de/gemma/file/tip">
           <translate>source-code</translate>
         </a>
-        {{ versionStr }}
-        <br>© via donau. &#x24D4; Intevation.
-        <br>
-        <translate>Some data</translate>©
-        <a href="https://www.openstreetmap.org/copyright">OpenSteetMap</a>
-        <span v-translate class="fix-trans-space">contributors.</span>
+        {{ versionStr }} <br />© via donau. &#x24D4; Intevation. <br />
+        <span v-translate="{ name: 'OpenSteetMap' }"
+          >Some data ©
+          <a href="https://www.openstreetmap.org/copyright">%{ name }</a>
+          contributors.
+        </span>
+        <p v-translate="{geoLicense: 'CC-BY-4.0',data: 'data sources' }">
+          Geonames data source is licensed under
+          <a
+            href="https://creativecommons.org/licenses/by/4.0/"
+          >%{ geoLicense }</a> without warranty, see docs for details
+          <a
+            href="http://www.geonames.org/data-sources.html"
+          >%{ data }</a>.
+        </p>
       </div>
     </div>
   </div>
--- a/client/src/components/map/Pdftool.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/Pdftool.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,8 +1,14 @@
 <template>
-  <div :class="['box ui-element rounded bg-white text-nowrap', { expanded: showPdfTool }]">
+  <div
+    :class="[
+      'box ui-element rounded bg-white text-nowrap',
+      { expanded: showPdfTool }
+    ]"
+  >
     <div style="width: 20rem">
       <h6 class="mb-0 py-2 px-3 border-bottom d-flex align-items-center">
-        <font-awesome-icon icon="file-pdf" class="mr-2"></font-awesome-icon><translate>Generate PDF</translate>
+        <font-awesome-icon icon="file-pdf" class="mr-2"></font-awesome-icon
+        ><translate>Generate PDF</translate>
         <font-awesome-icon
           icon="times"
           class="ml-auto text-muted"
@@ -22,21 +28,27 @@
             value="download"
             v-model="form.downloadType"
             selected
+          />
+          <label for="pdfexport-downloadtype-download" class="ml-1 mr-2"
+            ><translate>Download</translate></label
           >
-          <label for="pdfexport-downloadtype-download" class="ml-1 mr-2"><translate>Download</translate></label>
           <input
             type="radio"
             id="pdfexport-downloadtype-open"
             value="open"
             v-model="form.downloadType"
+          />
+          <label for="pdfexport-downloadtype-open" class="ml-1"
+            ><translate>Open in new window</translate></label
           >
-          <label for="pdfexport-downloadtype-open" class="ml-1"><translate>Open in new window</translate></label>
         </small>
         <button
           @click="download"
           type="button"
           class="btn btn-sm btn-info d-block w-100"
-        ><translate>Generate PDF</translate></button>
+        >
+          <translate>Generate PDF</translate>
+        </button>
       </div>
     </div>
   </div>
--- a/client/src/components/map/Search.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/Search.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -6,7 +6,15 @@
       </span>
     </div>
     <div
-      :class="['searchgroup', {'searchgroup-collapsed': !showSearchbar, big: showContextBox && ['bottlenecks', 'staging'].indexOf(contextBoxContent) !== -1 }]"
+      :class="[
+        'searchgroup',
+        {
+          'searchgroup-collapsed': !showSearchbar,
+          big:
+            showContextBox &&
+            ['bottlenecks', 'staging'].indexOf(contextBoxContent) !== -1
+        }
+      ]"
     >
       <input
         @keyup.enter="takeFirstSearchresult"
@@ -14,22 +22,40 @@
         v-model="searchQuery"
         type="text"
         :class="searchInputStyle"
-      >
+      />
     </div>
     <div
       v-if="showSearchbar && searchResults !== null && !showContextBox"
       class="searchresults border-top ui-element bg-white rounded-bottom d-print-none position-absolute"
     >
-      <div v-for="entry of searchResults" :key="entry.name" class="border-top text-left">
-        <a href="#" @click.prevent="moveToSearchResult(entry)" class="p-2 d-block text-nowrap">
+      <div
+        v-for="entry of searchResults"
+        :key="entry.name"
+        class="border-top text-left"
+      >
+        <a
+          href="#"
+          @click.prevent="moveToSearchResult(entry)"
+          class="p-2 d-block text-nowrap"
+        >
           <font-awesome-icon
             icon="ship"
             v-if="entry.type === 'bottleneck'"
             class="mr-1"
             fixed-width
           />
-          <font-awesome-icon icon="water" v-if="entry.type === 'rhm'" class="mr-1" fixed-width/>
-          <font-awesome-icon icon="city" v-if="entry.type === 'city'" class="mr-1" fixed-width/>
+          <font-awesome-icon
+            icon="water"
+            v-if="entry.type === 'rhm'"
+            class="mr-1"
+            fixed-width
+          />
+          <font-awesome-icon
+            icon="city"
+            v-if="entry.type === 'city'"
+            class="mr-1"
+            fixed-width
+          />
           {{ entry.name }}
         </a>
       </div>
--- a/client/src/components/map/Zoom.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/Zoom.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -3,7 +3,10 @@
     class="d-flex buttoncontainer shadow-xs mb-3 position-absolute"
     :style="showSplitscreen ? 'margin-bottom: 51vh !important' : ''"
   >
-    <button class="zoomButton border-0 bg-white rounded-left ui-element" @click="zoomOut">
+    <button
+      class="zoomButton border-0 bg-white rounded-left ui-element"
+      @click="zoomOut"
+    >
       <font-awesome-icon icon="minus"></font-awesome-icon>
     </button>
     <button
--- a/client/src/components/map/contextbox/Bottlenecks.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/contextbox/Bottlenecks.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -9,21 +9,32 @@
         <a href="#" @click="sortBy('name')" class="sort-link">
           <translate>Name</translate>
         </a>
-        <font-awesome-icon :icon="sortIcon" class="ml-1" v-if="sortColumn === 'name'"></font-awesome-icon>
+        <font-awesome-icon
+          :icon="sortIcon"
+          class="ml-1"
+          v-if="sortColumn === 'name'"
+        ></font-awesome-icon>
       </div>
       <div class="col-2">
         <a href="#" @click="sortBy('latestMeasurement')" class="sort-link">
-          <translate>Latest</translate>
-          <br>
+          <translate>Latest</translate> <br />
           <translate>Measurement</translate>
         </a>
-        <font-awesome-icon :icon="sortIcon" class="ml-1" v-if="sortColumn === 'latestMeasurement'"></font-awesome-icon>
+        <font-awesome-icon
+          :icon="sortIcon"
+          class="ml-1"
+          v-if="sortColumn === 'latestMeasurement'"
+        ></font-awesome-icon>
       </div>
       <div class="col-3">
         <a href="#" @click="sortBy('chainage')" class="sort-link">
           <translate>Chainage</translate>
         </a>
-        <font-awesome-icon :icon="sortIcon" class="ml-1" v-if="sortColumn === 'chainage'"></font-awesome-icon>
+        <font-awesome-icon
+          :icon="sortIcon"
+          class="ml-1"
+          v-if="sortColumn === 'chainage'"
+        ></font-awesome-icon>
       </div>
       <div class="col-2"></div>
     </div>
@@ -38,12 +49,21 @@
         class="border-top row bottleneck-row mx-0"
       >
         <div class="col-5 py-2 text-left">
-          <a href="#" @click="selectBottleneck(bottleneck)">{{ bottleneck.properties.name }}</a>
+          <a href="#" @click="selectBottleneck(bottleneck)">{{
+            bottleneck.properties.name
+          }}</a>
+        </div>
+        <div class="col-2 py-2">
+          {{ displayCurrentSurvey(bottleneck.properties.current) }}
         </div>
-        <div class="col-2 py-2">{{ displayCurrentSurvey(bottleneck.properties.current) }}</div>
-        <div
-          class="col-3 py-2"
-        >{{ displayCurrentChainage(bottleneck.properties.from, bottleneck.properties.from) }}</div>
+        <div class="col-3 py-2">
+          {{
+            displayCurrentChainage(
+              bottleneck.properties.from,
+              bottleneck.properties.from
+            )
+          }}
+        </div>
         <div class="col-2 pr-0 text-right">
           <button
             type="button"
@@ -60,17 +80,27 @@
             <font-awesome-icon
               icon="angle-down"
               fixed-width
-              v-if="loading !== bottleneck.properties.name && openBottleneck !== bottleneck.properties.name"
+              v-if="
+                loading !== bottleneck.properties.name &&
+                  openBottleneck !== bottleneck.properties.name
+              "
             ></font-awesome-icon>
             <font-awesome-icon
               icon="angle-up"
               fixed-width
-              v-if="loading !== bottleneck.properties.name && openBottleneck === bottleneck.properties.name"
+              v-if="
+                loading !== bottleneck.properties.name &&
+                  openBottleneck === bottleneck.properties.name
+              "
             ></font-awesome-icon>
           </button>
         </div>
         <div
-          :class="['col-12 p-0', 'surveys', {open: openBottleneck === bottleneck.properties.name}]"
+          :class="[
+            'col-12 p-0',
+            'surveys',
+            { open: openBottleneck === bottleneck.properties.name }
+          ]"
         >
           <a
             href="#"
@@ -78,7 +108,8 @@
             v-for="(survey, index) in openBottleneckSurveys"
             :key="index"
             @click="selectSurvey(survey, bottleneck)"
-          >{{ survey.date_info }}</a>
+            >{{ survey.date_info }}</a
+          >
         </div>
       </div>
     </div>
@@ -218,7 +249,7 @@
           .catch(error => {
             const { status, data } = error.response;
             displayError({
-              title: "Backend Error",
+              title: this.$gettext("Backend Error"),
               message: `${status}: ${data.message || data}`
             });
           })
--- a/client/src/components/map/contextbox/ImportSoundingresults.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/contextbox/ImportSoundingresults.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -12,7 +12,11 @@
               <translate>Bottleneck</translate>
             </small>
             <select v-model="bottleneck" class="custom-select">
-              <option v-for="bottleneck in availableBottlenecks" :key="bottleneck">{{bottleneck}}</option>
+              <option
+                v-for="bottleneck in availableBottlenecks"
+                :key="bottleneck"
+                >{{ bottleneck }}</option
+              >
             </select>
             <span class="text-danger">
               <small v-if="!bottleneck">
@@ -20,16 +24,17 @@
               </small>
             </span>
           </div>
-          <div class="mt-1 text-left w-50 mr-2">
+          <div class="d-flex flex-column mt-1 text-left w-50 mr-2">
             <small class="text-muted">
-              <translate>Projection</translate>
+              <translate>Projection</translate>&nbsp;(EPSG)
             </small>
-            <select v-model="projection" class="custom-select" id="depthreference">
-              <option
-                v-for="projection in this.$options.projections"
-                :key="projection"
-              >{{ projection }}</option>
-            </select>
+            <input
+              class="form-control"
+              v-model="projection"
+              value="4326"
+              placeholder="e.g. 4326"
+              type="number"
+            />
             <span class="text-left text-danger">
               <small v-if="!projection">
                 <translate>Please enter a projection</translate>
@@ -42,11 +47,16 @@
             <small class="text-muted">
               <translate>Depthreference</translate>
             </small>
-            <select v-model="depthReference" class="custom-select" id="depthreference">
+            <select
+              v-model="depthReference"
+              class="custom-select"
+              id="depthreference"
+            >
               <option
                 v-for="option in this.$options.depthReferenceOptions"
                 :key="option"
-              >{{ option }}</option>
+                >{{ option }}</option
+              >
             </select>
             <span class="text-left text-danger">
               <small v-if="!depthReference">
@@ -55,9 +65,7 @@
             </span>
           </div>
           <div class="mt-1 text-left w-50 mr-2">
-            <small class="text-muted">
-              <translate>Date</translate>
-            </small>
+            <small class="text-muted"> <translate>Date</translate> </small>
             <input
               id="importdate"
               type="date"
@@ -66,7 +74,7 @@
               aria-label="bottleneck"
               aria-describedby="bottlenecklabel"
               v-model="importDate"
-            >
+            />
             <span class="text-left text-danger">
               <small v-if="!importDate">
                 <translate>Please enter a date</translate>
@@ -77,9 +85,7 @@
       </div>
       <div class="ml-2 mt-2 text-left">
         <small v-for="(message, index) in messages" :key="index">
-          {{
-          message
-          }}
+          {{ message }}
         </small>
       </div>
     </div>
@@ -92,11 +98,9 @@
             @change="fileSelected"
             class="custom-file-input"
             id="uploadFile"
-          >
+          />
           <label class="custom-file-label" for="uploadFile">
-            {{
-            uploadLabel
-            }}
+            {{ uploadLabel }}
           </label>
         </div>
       </div>
@@ -109,7 +113,12 @@
         >
           <translate>Download Meta.json</translate>
         </a>
-        <button v-if="editState" @click="deleteTempData" class="btn btn-danger" type="button">
+        <button
+          v-if="editState"
+          @click="deleteTempData"
+          class="btn btn-danger"
+          type="button"
+        >
           <translate>Cancel Upload</translate>
         </button>
         <button
@@ -117,7 +126,9 @@
           @click="submit"
           class="btn btn-info"
           type="button"
-        >{{ uploadState ? Upload : Confirm }}</button>
+        >
+          {{ uploadState ? Upload : Confirm }}
+        </button>
       </div>
     </div>
   </div>
@@ -317,7 +328,6 @@
       );
     }
   },
-  projections: ["", "4326"],
   depthReferenceOptions: [
     "",
     // "NAP",
--- a/client/src/components/map/contextbox/Staging.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/contextbox/Staging.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,27 +1,20 @@
 <template>
   <div class="w-90">
     <h6 class="mb-0 py-2 px-3 border-bottom d-flex align-items-center">
-      <font-awesome-icon icon="clipboard-check" class="mr-2"></font-awesome-icon>
+      <font-awesome-icon
+        icon="clipboard-check"
+        class="mr-2"
+      ></font-awesome-icon>
       <translate>Staging Area</translate>
     </h6>
     <table class="table mb-0">
       <thead>
         <tr>
-          <th>
-            <translate>Name</translate>
-          </th>
-          <th>
-            <translate>Type</translate>
-          </th>
-          <th>
-            <translate>Date</translate>
-          </th>
-          <th>
-            <translate>Imported</translate>
-          </th>
-          <th>
-            <translate>Username</translate>
-          </th>
+          <th><translate>Name</translate></th>
+          <th><translate>Type</translate></th>
+          <th><translate>Date</translate></th>
+          <th><translate>Imported</translate></th>
+          <th><translate>Username</translate></th>
           <th>&nbsp;</th>
           <th>&nbsp;</th>
         </tr>
@@ -29,7 +22,9 @@
       <tbody v-if="filteredData.length">
         <tr v-for="data in filteredData" :key="data.id">
           <td>
-            <a @click="zoomTo(data.id)" href="#">{{ data.summary.bottleneck }}</a>
+            <a @click="zoomTo(data.id)" href="#">{{
+              data.summary.bottleneck
+            }}</a>
           </td>
           <td>{{ data.kind.toUpperCase() }}</td>
           <td>{{ data.summary.date }}</td>
@@ -38,7 +33,12 @@
           <td>
             <button
               @click="toggleApproval(data.id, $options.STATES.APPROVED)"
-              :class="{btn:true, 'btn-sm':true, 'btn-outline-success':needsApproval(data) || isRejected(data), 'btn-success':isApproved(data)}"
+              :class="{
+                btn: true,
+                'btn-sm': true,
+                'btn-outline-success': needsApproval(data) || isRejected(data),
+                'btn-success': isApproved(data)
+              }"
             >
               <font-awesome-icon icon="check"></font-awesome-icon>
             </button>
@@ -46,7 +46,12 @@
           <td>
             <button
               @click="toggleApproval(data.id, $options.STATES.REJECTED)"
-              :class="{btn:true,  'btn-sm':true, 'btn-outline-danger':needsApproval(data) || isApproved(data), 'btn-danger':isRejected(data)}"
+              :class="{
+                btn: true,
+                'btn-sm': true,
+                'btn-outline-danger': needsApproval(data) || isApproved(data),
+                'btn-danger': isRejected(data)
+              }"
             >
               <font-awesome-icon icon="times"></font-awesome-icon>
             </button>
@@ -85,6 +90,7 @@
  * Markus Kottländer <markus@intevation.de>
  */
 import { mapState } from "vuex";
+import { HTTP } from "../../../lib/http.js";
 import { STATES } from "../../../store/imports.js";
 import { displayError, displayInfo } from "../../../lib/errors.js";
 
@@ -93,13 +99,7 @@
     return {};
   },
   mounted() {
-    this.$store.dispatch("imports/getStaging").catch(error => {
-      const { status, data } = error.response;
-      displayError({
-        title: this.$gettext("Backend Error"),
-        message: `${status}: ${data.message || data}`
-      });
-    });
+    this.loadData();
   },
   computed: {
     ...mapState("application", ["searchQuery"]),
@@ -115,16 +115,55 @@
   },
   STATES: STATES,
   methods: {
+    loadData() {
+      this.$store.dispatch("imports/getStaging").catch(error => {
+        const { status, data } = error.response;
+        displayError({
+          title: "Backend Error",
+          message: `${status}: ${data.message || data}`
+        });
+      });
+    },
     confirmReview() {
-      const message = this.staging
-        .map(x => {
-          return x.id + ": " + x.status;
+      const reviewResults = this.staging
+        .filter(x => x.status !== STATES.NEEDSAPPROVAL)
+        .map(r => {
+          return {
+            id: r.id,
+            state: r.status
+          };
+        });
+      if (!reviewResults.length) return;
+      HTTP.patch("/imports", reviewResults, {
+        headers: {
+          "X-Gemma-Auth": localStorage.getItem("token"),
+          "Content-type": "application/json"
+        }
+      })
+        .then(response => {
+          const messages = response.data
+            .map(x => {
+              if (x.message) return x.message;
+              if (x.error) return x.error;
+            })
+            .join("\n\n");
+          displayInfo({
+            title: "Staging Area",
+            message: messages,
+            options: {
+              timeout: 0,
+              buttons: [{ text: "Ok", action: null, bold: true }]
+            }
+          });
+          this.loadData();
         })
-        .join("\n");
-      displayInfo({
-        title: this.$gettext("Staging Area"),
-        message: message
-      });
+        .catch(error => {
+          const { status, data } = error.response;
+          displayError({
+            title: "Backend Error",
+            message: `${status}: ${data.message || data}`
+          });
+        });
     },
     needsApproval(item) {
       return item.status === STATES.NEEDSAPPROVAL;
--- a/client/src/components/map/fairway/Fairwayprofile.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/fairway/Fairwayprofile.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,30 +1,32 @@
 <template>
-  <div :class="['position-relative', {show: showSplitscreen}]">
+  <div :class="['position-relative', { show: showSplitscreen }]">
     <button
       class="rounded-bottom bg-white border-0 position-absolute splitscreen-toggle"
       @click="$store.commit('application/showSplitscreen', false)"
       v-if="showSplitscreen"
     >
-      <font-awesome-icon icon="angle-down"/>
+      <font-awesome-icon icon="angle-down" />
     </button>
     <button
       class="rounded-bottom bg-white border-0 position-absolute clear-selection"
-      @click="$store.dispatch('fairwayprofile/clearSelection');"
+      @click="$store.dispatch('fairwayprofile/clearSelection')"
       v-if="showSplitscreen"
     >
-      <font-awesome-icon icon="times"/>
+      <font-awesome-icon icon="times" />
     </button>
     <div class="profile bg-white position-relative d-flex flex-column">
       <h5
         class="headline border-bottom mb-0 py-2"
         v-if="selectedBottleneck && selectedSurvey"
-      >{{ selectedBottleneck }} ({{ selectedSurvey.date_info }})</h5>
+      >
+        {{ selectedBottleneck }} ({{ selectedSurvey.date_info }})
+      </h5>
       <div class="d-flex flex-fill">
         <div
           class="loading d-flex justify-content-center align-items-center"
           v-if="surveysLoading || profileLoading"
         >
-          <font-awesome-icon icon="spinner" spin/>
+          <font-awesome-icon icon="spinner" spin />
         </div>
         <div class="fairwayprofile m-3 mt-0 bg-white flex-grow-1"></div>
       </div>
--- a/client/src/components/map/fairway/Infobar.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/fairway/Infobar.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -5,8 +5,7 @@
   >
     <div class="d-flex flex-row justify-content-between h-100">
       <h6 class="my-auto px-2">
-        {{ selectedBottleneck }}
-        ({{ selectedSurvey.date_info }})
+        {{ selectedBottleneck }} ({{ selectedSurvey.date_info }})
       </h6>
       <span
         class="p-2 border-left d-flex align-items-center"
--- a/client/src/components/map/fairway/Profiles.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/fairway/Profiles.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,5 +1,10 @@
 <template>
-  <div :class="['box ui-element rounded bg-white text-nowrap', { expanded: showProfiles }]">
+  <div
+    :class="[
+      'box ui-element rounded bg-white text-nowrap',
+      { expanded: showProfiles }
+    ]"
+  >
     <div style="width: 20rem">
       <h6 class="mb-0 py-2 px-3 border-bottom d-flex align-items-center">
         <font-awesome-icon icon="chart-area" class="mr-2"></font-awesome-icon>
@@ -10,12 +15,14 @@
           @click="$store.commit('application/showProfiles', false)"
         ></font-awesome-icon>
       </h6>
-      <div class="d-flex flex-column p-3 flex-grow-1 text-left position-relative">
+      <div
+        class="d-flex flex-column p-3 flex-grow-1 text-left position-relative"
+      >
         <div
           class="loading d-flex justify-content-center align-items-center"
           v-if="surveysLoading || profileLoading"
         >
-          <font-awesome-icon icon="spinner" spin/>
+          <font-awesome-icon icon="spinner" spin />
         </div>
         <select
           @click="moveToBottleneck"
@@ -29,7 +36,8 @@
             v-for="bn in bottlenecks"
             :key="bn.properties.name"
             :value="bn.properties.name"
-          >{{ bn.properties.name }}</option>
+            >{{ bn.properties.name }}</option
+          >
         </select>
         <div v-if="selectedBottleneck">
           <div class="d-flex mt-2">
@@ -37,60 +45,79 @@
               <small class="text-muted">
                 <translate>Sounding Result</translate>:
               </small>
-              <select v-model="selectedSurvey" class="form-control form-control-sm">
+              <select
+                v-model="selectedSurvey"
+                class="form-control form-control-sm"
+              >
                 <option
                   v-for="survey in surveys"
                   :key="survey.date_info"
                   :value="survey"
-                >{{ survey.date_info }}</option>
+                  >{{ survey.date_info }}</option
+                >
               </select>
             </div>
-            <div class="flex-fill ml-3" v-if="selectedSurvey && surveys.length > 1">
+            <div
+              class="flex-fill ml-3"
+              v-if="selectedSurvey && surveys.length > 1"
+            >
               <small class="text-muted mt-1">
                 <translate>Compare with</translate>:
               </small>
-              <select v-model="additionalSurvey" class="form-control form-control-sm">
+              <select
+                v-model="additionalSurvey"
+                class="form-control form-control-sm"
+              >
                 <option :value="null">None</option>
                 <option
                   v-for="survey in additionalSurveys"
                   :key="survey.date_info"
                   :value="survey"
-                >{{ survey.date_info }}</option>
+                  >{{ survey.date_info }}</option
+                >
               </select>
             </div>
           </div>
-          <hr class="w-100 mb-0">
+          <hr class="w-100 mb-0" />
           <small class="text-muted d-block mt-2">
             <translate>Saved cross profiles</translate>:
           </small>
           <div class="d-flex">
             <select
-              :class="['form-control form-control-sm flex-fill', { 'rounded-left-only': selectedCut }]"
+              :class="[
+                'form-control form-control-sm flex-fill',
+                { 'rounded-left-only': selectedCut }
+              ]"
               v-model="selectedCut"
             >
               <option></option>
-              <option v-for="(cut, index) in previousCuts" :value="cut" :key="index">{{ cut.label }}</option>
+              <option
+                v-for="(cut, index) in previousCuts"
+                :value="cut"
+                :key="index"
+                >{{ cut.label }}</option
+              >
             </select>
             <button
               class="btn btn-sm btn-danger input-button-right"
               @click="confirmDeleteSelectedCut = true"
               v-if="selectedCut && !confirmDeleteSelectedCut"
             >
-              <font-awesome-icon icon="trash"/>
+              <font-awesome-icon icon="trash" />
             </button>
             <button
               class="btn btn-sm btn-info rounded-0"
               @click="confirmDeleteSelectedCut = false"
               v-if="selectedCut && confirmDeleteSelectedCut"
             >
-              <font-awesome-icon icon="times"/>
+              <font-awesome-icon icon="times" />
             </button>
             <button
               class="btn btn-sm btn-danger input-button-right"
               @click="deleteSelectedCut"
               v-if="selectedCut && confirmDeleteSelectedCut"
             >
-              <font-awesome-icon icon="check"/>
+              <font-awesome-icon icon="check" />
             </button>
           </div>
           <small class="text-muted d-block mt-2">
@@ -101,31 +128,25 @@
               class="form-control form-control-sm pr-5"
               placeholder="Lat,Lon,Lat,Lon"
               v-model="coordinatesInput"
-            >
+            />
             <button
               class="btn btn-sm btn-info position-absolute input-button-right"
               @click="applyManualCoordinates"
               style="top: 0; right: 0;"
               v-if="coordinatesInputIsValid"
             >
-              <font-awesome-icon icon="check"/>
+              <font-awesome-icon icon="check" />
             </button>
           </div>
           <small class="d-flex text-left mt-2" v-if="startPoint && endPoint">
             <div class="text-nowrap mr-3">
-              <b>
-                <translate>Start</translate>:
-              </b>
-              <br>
-              Lat: {{ startPoint[1] }}
-              <br>
+              <b> <translate>Start</translate>: </b> <br />
+              Lat: {{ startPoint[1] }} <br />
               Lon: {{ startPoint[0] }}
             </div>
             <div class="text-nowrap">
-              <b>End:</b>
-              <br>
-              Lat: {{ endPoint[1] }}
-              <br>
+              <b>End:</b> <br />
+              Lat: {{ endPoint[1] }} <br />
               Lon: {{ endPoint[0] }}
             </div>
             <button
@@ -133,19 +154,29 @@
               v-clipboard:success="onCopyCoordinates"
               class="btn btn-info btn-sm ml-auto mt-auto"
             >
-              <font-awesome-icon icon="copy"/>
+              <font-awesome-icon icon="copy" />
             </button>
           </small>
           <div class="d-flex mt-3">
-            <div class="pr-3 w-50" v-if="startPoint && endPoint && !selectedCut">
-              <button class="btn btn-info btn-sm w-100" @click="showLabelInput = !showLabelInput">
-                <font-awesome-icon :icon="showLabelInput ? 'times' : 'check'"/>
+            <div
+              class="pr-3 w-50"
+              v-if="startPoint && endPoint && !selectedCut"
+            >
+              <button
+                class="btn btn-info btn-sm w-100"
+                @click="showLabelInput = !showLabelInput"
+              >
+                <font-awesome-icon :icon="showLabelInput ? 'times' : 'check'" />
                 {{ showLabelInput ? "Cancel" : "Save" }}
               </button>
             </div>
-            <div :class="startPoint && endPoint && !selectedCut ? 'w-50' : 'w-100'">
+            <div
+              :class="startPoint && endPoint && !selectedCut ? 'w-50' : 'w-100'"
+            >
               <button class="btn btn-info btn-sm w-100" @click="toggleCutTool">
-                <font-awesome-icon :icon="cutTool && cutTool.getActive() ? 'times' : 'plus'"></font-awesome-icon>
+                <font-awesome-icon
+                  :icon="cutTool && cutTool.getActive() ? 'times' : 'plus'"
+                ></font-awesome-icon>
                 {{ cutTool && cutTool.getActive() ? "Cancel" : "New" }}
               </button>
             </div>
@@ -155,14 +186,17 @@
               <translate>Enter label for cross profile</translate>:
             </small>
             <div class="position-relative">
-              <input class="form-control form-control-sm pr-5" v-model="cutLabel">
+              <input
+                class="form-control form-control-sm pr-5"
+                v-model="cutLabel"
+              />
               <button
                 class="btn btn-sm btn-info position-absolute input-button-right"
                 @click="saveCut"
                 v-if="cutLabel"
                 style="top: 0; right: 0;"
               >
-                <font-awesome-icon icon="check"/>
+                <font-awesome-icon icon="check" />
               </button>
             </div>
           </div>
--- a/client/src/components/map/layers/Layers.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/layers/Layers.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,8 +1,14 @@
 <template>
-  <div :class="['box ui-element rounded bg-white text-nowrap', { expanded: showLayers }]">
+  <div
+    :class="[
+      'box ui-element rounded bg-white text-nowrap',
+      { expanded: showLayers }
+    ]"
+  >
     <div style="width: 20rem">
       <h6 class="mb-0 py-2 px-3 border-bottom d-flex align-items-center">
-        <font-awesome-icon icon="layer-group" class="mr-2"></font-awesome-icon><translate>Layers</translate>
+        <font-awesome-icon icon="layer-group" class="mr-2"></font-awesome-icon
+        ><translate>Layers</translate>
         <font-awesome-icon
           icon="times"
           class="ml-auto text-muted"
--- a/client/src/components/map/layers/Layerselect.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/layers/Layerselect.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -7,12 +7,17 @@
         :id="layername"
         type="checkbox"
         :checked="isVisible"
-      >
-      <LegendElement :layername="layername" :layerindex="layerindex"></LegendElement>
-      <label class="layername form-check-label" @click="visibilityToggled">{{layername}}</label>
+      />
+      <LegendElement
+        :layername="layername"
+        :layerindex="layerindex"
+      ></LegendElement>
+      <label class="layername form-check-label" @click="visibilityToggled">{{
+        layername
+      }}</label>
     </div>
-    <div v-if="isVisible && (layername == 'Bottleneck isolines')">
-      <img class="rounded my-1 d-block" :src="isolinesLegendImgUrl">
+    <div v-if="isVisible && layername == 'Bottleneck isolines'">
+      <img class="rounded my-1 d-block" :src="isolinesLegendImgUrl" />
     </div>
   </div>
 </template>
@@ -26,7 +31,6 @@
 }
 </style>
 
-
 <script>
 /* This is Free Software under GNU Affero General Public License v >= 3.0
  * without warranty, see README.md and license for details.
--- a/client/src/components/map/toolbar/Identify.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Identify.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,10 +1,24 @@
 <template>
-    <div @click="$store.commit('application/showIdentify', !showIdentify)" class="toolbar-button">
-        <font-awesome-icon icon="info" :class="{'text-info': showIdentify}"></font-awesome-icon>
-        <span :class="['indicator', { show: !showIdentify && (identifiedFeatures.length || currentMeasurement) }]">
-          {{ badgeCount }}
-        </span>
-    </div>
+  <div
+    @click="$store.commit('application/showIdentify', !showIdentify)"
+    class="toolbar-button"
+  >
+    <font-awesome-icon
+      icon="info"
+      :class="{ 'text-info': showIdentify }"
+    ></font-awesome-icon>
+    <span
+      :class="[
+        'indicator',
+        {
+          show:
+            !showIdentify && (identifiedFeatures.length || currentMeasurement)
+        }
+      ]"
+    >
+      {{ badgeCount }}
+    </span>
+  </div>
 </template>
 
 <script>
--- a/client/src/components/map/toolbar/Layers.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Layers.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,13 @@
 <template>
-    <div @click="$store.commit('application/showLayers', !showLayers)" class="toolbar-button">
-        <font-awesome-icon icon="layer-group" :class="{'text-info': showLayers}"></font-awesome-icon>
-    </div>
+  <div
+    @click="$store.commit('application/showLayers', !showLayers)"
+    class="toolbar-button"
+  >
+    <font-awesome-icon
+      icon="layer-group"
+      :class="{ 'text-info': showLayers }"
+    ></font-awesome-icon>
+  </div>
 </template>
 
 <script>
--- a/client/src/components/map/toolbar/Linetool.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Linetool.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,10 @@
 <template>
-    <div @click="toggleLineTool" class="toolbar-button">
-        <font-awesome-icon icon="ruler" :class="{'text-info': lineTool && lineTool.getActive()}"></font-awesome-icon>
-    </div>
+  <div @click="toggleLineTool" class="toolbar-button">
+    <font-awesome-icon
+      icon="ruler"
+      :class="{ 'text-info': lineTool && lineTool.getActive() }"
+    ></font-awesome-icon>
+  </div>
 </template>
 
 <script>
--- a/client/src/components/map/toolbar/Pdftool.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Pdftool.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,13 @@
 <template>
-    <div @click="$store.commit('application/showPdfTool', !showPdfTool)" class="toolbar-button">
-        <font-awesome-icon icon="file-pdf" :class="{'text-info': showPdfTool}"></font-awesome-icon>
-    </div>
+  <div
+    @click="$store.commit('application/showPdfTool', !showPdfTool)"
+    class="toolbar-button"
+  >
+    <font-awesome-icon
+      icon="file-pdf"
+      :class="{ 'text-info': showPdfTool }"
+    ></font-awesome-icon>
+  </div>
 </template>
 
 <script>
--- a/client/src/components/map/toolbar/Polygontool.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Polygontool.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,10 @@
 <template>
-    <div @click="togglePolygonTool" class="toolbar-button">
-        <font-awesome-icon icon="draw-polygon" :class="{'text-info': polygonTool && polygonTool.getActive()}"></font-awesome-icon>
-    </div>
+  <div @click="togglePolygonTool" class="toolbar-button">
+    <font-awesome-icon
+      icon="draw-polygon"
+      :class="{ 'text-info': polygonTool && polygonTool.getActive() }"
+    ></font-awesome-icon>
+  </div>
 </template>
 
 <script>
--- a/client/src/components/map/toolbar/Profiles.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Profiles.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,13 @@
 <template>
-    <div @click="$store.commit('application/showProfiles', !showProfiles)" class="toolbar-button">
-        <font-awesome-icon icon="chart-area" :class="{ 'text-info': showProfiles }"></font-awesome-icon>
-    </div>
+  <div
+    @click="$store.commit('application/showProfiles', !showProfiles)"
+    class="toolbar-button"
+  >
+    <font-awesome-icon
+      icon="chart-area"
+      :class="{ 'text-info': showProfiles }"
+    ></font-awesome-icon>
+  </div>
 </template>
 
 <script>
--- a/client/src/components/map/toolbar/Toolbar.vue	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/components/map/toolbar/Toolbar.vue	Tue Dec 04 12:52:31 2018 +0100
@@ -1,6 +1,11 @@
 <template>
   <div class="ml-2">
-    <div :class="'rounded-top toolbar toolbar-' + (expandToolbar ? 'expanded' : 'collapsed')">
+    <div
+      :class="
+        'rounded-top toolbar toolbar-' +
+          (expandToolbar ? 'expanded' : 'collapsed')
+      "
+    >
       <Identify></Identify>
       <Layers></Layers>
       <Profiles></Profiles>
@@ -12,7 +17,9 @@
       @click="$store.commit('application/expandToolbar', !expandToolbar)"
       class="toolbar-button toolbar-toggle rounded-bottom bg-info text-white"
     >
-      <font-awesome-icon :icon="expandToolbar ? 'angle-up' : 'angle-down'"></font-awesome-icon>
+      <font-awesome-icon
+        :icon="expandToolbar ? 'angle-up' : 'angle-down'"
+      ></font-awesome-icon>
     </div>
   </div>
 </template>
--- a/client/src/lib/errors.js	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/lib/errors.js	Tue Dec 04 12:52:31 2018 +0100
@@ -14,21 +14,26 @@
 
 import app from "../main";
 
-const displayOptions = {
-  timeout: 2000,
+let displayOptions = {
+  timeout: 2500,
   showProgressBar: false,
-  closeOnClick: false,
+  closeOnClick: true,
   pauseOnHover: true,
   oneAtTime: true,
-  bodyMaxLength: 250
+  bodyMaxLength: 1024
 };
 
-const displayError = ({ title, message }) => {
+const displayError = ({ title, message, options }) => {
+  if (!options) options = {};
+  const mergedOptions = { ...displayOptions, ...options };
+  app.$snotify.info(message, title, mergedOptions);
   app.$snotify.error(message, title, displayOptions);
 };
 
-const displayInfo = ({ title, message }) => {
-  app.$snotify.info(message, title, displayOptions);
+const displayInfo = ({ title, message, options }) => {
+  if (!options) options = {};
+  const mergedOptions = { ...displayOptions, ...options };
+  app.$snotify.info(message, title, mergedOptions);
 };
 
 export { displayError, displayInfo };
--- a/client/src/locale/de_AT/LC_MESSAGES/app.po	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/locale/de_AT/LC_MESSAGES/app.po	Tue Dec 04 12:52:31 2018 +0100
@@ -95,11 +95,7 @@
 msgid "Confirm"
 msgstr "Bestätigen"
 
-#: src/components/map/Identify.vue:52
-msgid "contributors."
-msgstr "Mitwirkende."
-
-#: src/components/map/fairway/Profiles.vue:340
+#: src/components/map/fairway/Profiles.vue:374
 msgid "Coordinates copied to clipboard!"
 msgstr "Koordinaten auf die Zwischenablage kopiert!"
 
@@ -149,10 +145,15 @@
 msgstr "Passphrase eingeben"
 
 #: src/components/Login.vue:149
+#, fuzzy
 msgid "Enter username"
 msgstr "Benutzername eingeben"
 
-#: src/components/admin/Logs.vue:26
+#: src/components/admin/usermanagement/Userdetail.vue:377
+msgid "Error while saving user"
+msgstr ""
+
+#: src/components/admin/Logs.vue:29
 msgid "Errorlog"
 msgstr "Fehlerprotokoll"
 
@@ -168,7 +169,14 @@
 msgid "Generate PDF"
 msgstr "PDF generieren"
 
-#: src/components/map/Identify.vue:5
+#: src/components/map/Identify.vue:69
+msgid ""
+"Geonames data source is licensed under\n"
+"        <a href=\"https://creativecommons.org/licenses/by/4.0/\">%{ geoLicense }</a> without warranty, see docs for details\n"
+"        <a href=\"http://www.geonames.org/data-sources.html\">%{ data }</a>."
+msgstr ""
+
+#: src/components/map/Identify.vue:10
 msgid "Identified"
 msgstr "Identifiziert"
 
@@ -276,15 +284,46 @@
 msgid "Open in new window"
 msgstr "In neuem Fenster öffnen"
 
-#: src/components/Login.vue:142
+#: src/components/admin/usermanagement/Userdetail.vue:229
+#, fuzzy
+msgid "password"
+msgstr "Passwort vergessen"
+
+#: src/components/admin/usermanagement/Userdetail.vue:227
+#, fuzzy
+msgid "Password"
+msgstr "Passwort vergessen"
+
+#: src/components/admin/usermanagement/Userdetail.vue:230
+msgid "password again"
+msgstr ""
+
+#: src/components/Login.vue:153
 msgid "Password reset requested!"
 msgstr "Passwort Zurücksetzung angefragt!"
 
-#: src/components/admin/Importqueue.vue:34
+#: src/components/admin/usermanagement/Userdetail.vue:338
+#: src/components/admin/usermanagement/Userdetail.vue:339
+msgid "Password should at least be 8 char long including 1 digit and 1 special char like $"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:334
+msgid "Passwords do not match!"
+msgstr ""
+
+#: src/components/admin/Importqueue.vue:40
 msgid "Pending"
 msgstr "Ausstehend"
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:71
+#: src/components/admin/usermanagement/Userdetail.vue:323
+msgid "Please choose a country"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:328
+msgid "Please choose a role"
+msgstr ""
+
+#: src/components/map/contextbox/ImportSoundingresults.vue:79
 msgid "Please enter a date"
 msgstr "Bitte ein Datum eingeben"
 
@@ -338,7 +377,11 @@
 msgid "Rejected"
 msgstr "Abgelehnt"
 
-#: src/components/Login.vue:55
+#: src/components/admin/usermanagement/Userdetail.vue:228
+msgid "Repeat Password"
+msgstr ""
+
+#: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr "Passwort-Zurücksetzung anfragen!"
 
@@ -366,9 +409,12 @@
 msgid "Send testmail"
 msgstr "Test-E-Mail versenden"
 
-#: src/components/map/Identify.vue:50
-msgid "Some data"
-msgstr "-/-"
+#: src/components/map/Identify.vue:64
+msgid ""
+"Some data ©\n"
+"        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
+"        contributors."
+msgstr ""
 
 #: src/components/map/fairway/Profiles.vue:37
 msgid "Sounding Result"
@@ -423,9 +469,11 @@
 msgid "Systemconfiguration"
 msgstr "System-Konfiguation"
 
-#: src/components/map/Identify.vue:37
-msgid "This app uses"
-msgstr "Diese Anwendung verwendet"
+#: src/components/map/Identify.vue:55
+msgid ""
+"This app uses <i>gemma</i>, which is Free Software under <br/>\n"
+"        %{ license } without warranty, see docs for details."
+msgstr ""
 
 #: src/components/admin/importschedule/Importschedule.vue:34
 #: src/components/map/contextbox/Staging.vue:13
@@ -442,6 +490,7 @@
 
 #: src/components/admin/usermanagement/Userdetail.vue:14
 #: src/components/map/contextbox/Staging.vue:22
+#, fuzzy
 msgid "Username"
 msgstr "Benutzername"
 
@@ -460,11 +509,11 @@
 
 #: src/components/map/Identify.vue:39
 msgid "which is Free Software under"
-msgstr "welches Freie Software unter"
+msgstr ""
 
 #: src/components/map/Identify.vue:41
 msgid "without warranty, see docs for details."
-msgstr "ohne Garantieansprüche. Details in der Dokumentation."
+msgstr ""
 
 #: src/components/map/fairway/Profiles.vue:401
 #: src/components/map/fairway/Profiles.vue:402
--- a/client/src/locale/en_GB/LC_MESSAGES/app.po	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/locale/en_GB/LC_MESSAGES/app.po	Tue Dec 04 12:52:31 2018 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: wamosjs 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-12-03 10:57+0100\n"
+"POT-Creation-Date: 2018-12-04 11:29+0100\n"
 "PO-Revision-Date: 2018-07-03 17:18+0200\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -17,31 +17,41 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/components/admin/Importqueue.vue:40
+#: src/components/admin/Importqueue.vue:46
 msgid "Accepted"
 msgstr ""
 
-#: src/components/admin/Logs.vue:17
+#: src/components/admin/Logs.vue:20
 msgid "Accesslog"
 msgstr ""
 
-#: src/components/admin/usermanagement/Usermanagement.vue:71
+#: src/components/admin/usermanagement/Usermanagement.vue:106
 msgid "Add User"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:37
+#: src/components/admin/importschedule/Importschedule.vue:35
 msgid "Author"
 msgstr ""
 
-#: src/components/Login.vue:59
+#: src/components/Login.vue:70
 msgid "back to login"
 msgstr ""
 
-#: src/components/map/Search.vue:231
-#: src/components/map/contextbox/ImportSoundingresults.vue:194
-#: src/components/map/contextbox/ImportSoundingresults.vue:233
-#: src/components/map/contextbox/ImportSoundingresults.vue:264
-#: src/components/map/contextbox/Staging.vue:99
+#: src/components/admin/Importqueue.vue:134
+#: src/components/admin/Systemconfiguration.vue:133
+#: src/components/admin/Systemconfiguration.vue:148
+#: src/components/admin/Systemconfiguration.vue:167
+#: src/components/admin/Systemconfiguration.vue:184
+#: src/components/admin/usermanagement/Userdetail.vue:296
+#: src/components/admin/usermanagement/Userdetail.vue:368
+#: src/components/admin/usermanagement/Usermanagement.vue:300
+#: src/components/admin/usermanagement/Usermanagement.vue:308
+#: src/components/admin/usermanagement/Usermanagement.vue:334
+#: src/components/map/Search.vue:257
+#: src/components/map/contextbox/Bottlenecks.vue:252
+#: src/components/map/contextbox/ImportSoundingresults.vue:205
+#: src/components/map/contextbox/ImportSoundingresults.vue:244
+#: src/components/map/contextbox/ImportSoundingresults.vue:275
 msgid "Backend Error"
 msgstr ""
 
@@ -49,132 +59,139 @@
 msgid "Bottleneck"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:15
+#: src/components/admin/Systemconfiguration.vue:19
 msgid "Bottleneck Areas fill-color"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:9
+#: src/components/admin/Systemconfiguration.vue:13
 msgid "Bottleneck Areas stroke-color"
 msgstr ""
 
-#: src/components/Sidebar.vue:19
+#: src/components/Sidebar.vue:22
 #: src/components/map/contextbox/Bottlenecks.vue:4
 msgid "Bottlenecks"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:112
+#: src/components/map/contextbox/ImportSoundingresults.vue:121
 msgid "Cancel Upload"
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:23
+#: src/components/map/contextbox/Bottlenecks.vue:30
 msgid "Chainage"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:156
-#: src/components/map/contextbox/ImportSoundingresults.vue:170
+#: src/components/map/contextbox/ImportSoundingresults.vue:167
+#: src/components/map/contextbox/ImportSoundingresults.vue:181
 msgid "choose .zip- file"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:12
+#: src/components/map/Pdftool.vue:18
 msgid "Chose format:"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:49
+#: src/components/map/fairway/Profiles.vue:64
 msgid "Compare with"
 msgstr ""
 
-#: src/components/Sidebar.vue:50
+#: src/components/Sidebar.vue:58
 msgid "Configuration"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:305
-#: src/components/map/contextbox/Staging.vue:65
+#: src/components/map/contextbox/ImportSoundingresults.vue:316
+#: src/components/map/contextbox/Staging.vue:70
 msgid "Confirm"
 msgstr ""
 
-#: src/components/map/Identify.vue:52
-msgid "contributors."
-msgstr ""
-
-#: src/components/map/fairway/Profiles.vue:340
+#: src/components/map/fairway/Profiles.vue:374
 msgid "Coordinates copied to clipboard!"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:33
+#: src/components/admin/usermanagement/Userdetail.vue:34
 msgid "Country"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:58
-#: src/components/map/contextbox/Staging.vue:16
+#: src/components/map/contextbox/ImportSoundingresults.vue:67
+#: src/components/map/contextbox/Staging.vue:14
 msgid "Date"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:42
+#: src/components/map/contextbox/ImportSoundingresults.vue:47
 msgid "Depthreference"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:25
+#: src/components/map/Pdftool.vue:32
 msgid "Download"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:109
+#: src/components/map/contextbox/ImportSoundingresults.vue:113
 msgid "Download Meta.json"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:43
+#: src/components/admin/importschedule/Importschedule.vue:37
 msgid "Email"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:58
+#: src/components/admin/usermanagement/Userdetail.vue:60
 msgid "Email address"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:48
+#: src/components/admin/Importqueue.vue:53
 msgid "Enqueued"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:96
+#: src/components/map/fairway/Profiles.vue:123
 msgid "Enter coordinates manually"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:154
+#: src/components/map/fairway/Profiles.vue:185
 msgid "Enter label for cross profile"
 msgstr ""
 
-#: src/components/Login.vue:146
+#: src/components/Login.vue:157
 msgid "Enter passphrase"
 msgstr ""
 
-#: src/components/Login.vue:149
+#: src/components/Login.vue:160
 msgid "Enter username"
 msgstr ""
 
-#: src/components/admin/Logs.vue:26
+#: src/components/admin/usermanagement/Userdetail.vue:377
+msgid "Error while saving user"
+msgstr ""
+
+#: src/components/admin/Logs.vue:29
 msgid "Errorlog"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:31
+#: src/components/admin/Importqueue.vue:37
 msgid "Failed"
 msgstr ""
 
-#: src/components/Login.vue:65
+#: src/components/Login.vue:76
 msgid "Forgot password"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:4 src/components/map/Pdftool.vue:38
+#: src/components/map/Pdftool.vue:10 src/components/map/Pdftool.vue:49
 msgid "Generate PDF"
 msgstr ""
 
-#: src/components/map/Identify.vue:5
+#: src/components/map/Identify.vue:69
+msgid ""
+"Geonames data source is licensed under\n"
+"        <a href=\"https://creativecommons.org/licenses/by/4.0/\">%{ geoLicense }</a> without warranty, see docs for details\n"
+"        <a href=\"http://www.geonames.org/data-sources.html\">%{ data }</a>."
+msgstr ""
+
+#: src/components/map/Identify.vue:10
 msgid "Identified"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:31
-#: src/components/map/contextbox/ImportSoundingresults.vue:256
+#: src/components/admin/importschedule/Importschedule.vue:33
+#: src/components/map/contextbox/ImportSoundingresults.vue:267
 msgid "Import"
 msgstr ""
 
-#: src/components/Sidebar.vue:28
+#: src/components/Sidebar.vue:31
 msgid "Import soundingresults"
 msgstr ""
 
@@ -182,86 +199,94 @@
 msgid "Import Soundingresults"
 msgstr ""
 
-#: src/components/map/contextbox/Staging.vue:19
+#: src/components/map/contextbox/Staging.vue:15
 msgid "Imported"
 msgstr ""
 
-#: src/components/Sidebar.vue:58 src/components/admin/Importqueue.vue:6
+#: src/components/Sidebar.vue:66 src/components/admin/Importqueue.vue:9
 msgid "Importqueue"
 msgstr ""
 
-#: src/components/Sidebar.vue:62
-#: src/components/admin/importschedule/Importschedule.vue:6
+#: src/components/Sidebar.vue:70
+#: src/components/admin/importschedule/Importschedule.vue:9
 msgid "Importschedule"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:374
+#: src/components/admin/usermanagement/Userdetail.vue:345
+msgid "invalid email"
+msgstr ""
+
+#: src/components/map/fairway/Profiles.vue:408
 msgid "Invalid input"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:51
+#: src/components/admin/Importqueue.vue:54
 msgid "Kind"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:14
+#: src/components/map/Pdftool.vue:20
 msgid "landscape"
 msgstr ""
 
-#: src/components/admin/Logs.vue:34
+#: src/components/admin/Logs.vue:36
 msgid "Last refresh:"
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:15
+#: src/components/map/contextbox/Bottlenecks.vue:19
 msgid "Latest"
 msgstr ""
 
-#: src/components/map/layers/Layers.vue:4
+#: src/components/map/layers/Layers.vue:10
 msgid "Layers"
 msgstr ""
 
-#: src/components/Login.vue:51
+#: src/components/Login.vue:58
 msgid "Login"
 msgstr ""
 
-#: src/components/Login.vue:140
+#: src/components/Login.vue:151
 msgid "Login failed"
 msgstr ""
 
-#: src/components/Sidebar.vue:68
+#: src/components/Sidebar.vue:76
 msgid "Logout"
 msgstr ""
 
-#: src/components/Sidebar.vue:54
+#: src/components/Sidebar.vue:62
 msgid "Logs"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:135
+#: src/components/admin/usermanagement/Userdetail.vue:141
 msgid "Mail was sent"
 msgstr ""
 
-#: src/components/Sidebar.vue:11
+#: src/components/Sidebar.vue:14
 msgid "Map"
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:17
+#: src/components/map/contextbox/Bottlenecks.vue:20
 msgid "Measurement"
 msgstr ""
 
 #: src/components/map/contextbox/Bottlenecks.vue:9
-#: src/components/map/contextbox/Staging.vue:10
+#: src/components/map/contextbox/Staging.vue:12
 msgid "Name"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:69
+#: src/components/admin/importschedule/Importscheduledetail.vue:6
+msgid "New import"
+msgstr ""
+
+#: src/components/admin/importschedule/Importschedule.vue:72
 msgid "New Import"
 msgstr ""
 
-#: src/components/map/Identify.vue:33
+#: src/components/map/Identify.vue:51
 msgid "No features identified."
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:85
-#: src/components/map/contextbox/Staging.vue:58
+#: src/components/map/contextbox/Bottlenecks.vue:116
+#: src/components/map/contextbox/Staging.vue:63
 msgid "No results."
 msgstr ""
 
@@ -269,159 +294,196 @@
 msgid "No schedules"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:32
+#: src/components/map/Pdftool.vue:41
 msgid "Open in new window"
 msgstr ""
 
-#: src/components/Login.vue:142
+#: src/components/admin/usermanagement/Userdetail.vue:229
+msgid "password"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:227
+msgid "Password"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:230
+msgid "password again"
+msgstr ""
+
+#: src/components/Login.vue:153
 msgid "Password reset requested!"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:34
+#: src/components/admin/usermanagement/Userdetail.vue:338
+#: src/components/admin/usermanagement/Userdetail.vue:339
+msgid "Password should at least be 8 char long including 1 digit and 1 special char like $"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:334
+msgid "Passwords do not match!"
+msgstr ""
+
+#: src/components/admin/Importqueue.vue:40
 msgid "Pending"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:71
+#: src/components/admin/usermanagement/Userdetail.vue:323
+msgid "Please choose a country"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:328
+msgid "Please choose a role"
+msgstr ""
+
+#: src/components/map/contextbox/ImportSoundingresults.vue:79
 msgid "Please enter a date"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:34
+#: src/components/map/contextbox/ImportSoundingresults.vue:39
 msgid "Please enter a projection"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:52
+#: src/components/map/contextbox/ImportSoundingresults.vue:62
 msgid "Please enter a reference"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:375
-#: src/components/map/fairway/Profiles.vue:376
+#: src/components/map/fairway/Profiles.vue:409
+#: src/components/map/fairway/Profiles.vue:410
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:18
+#: src/components/map/contextbox/ImportSoundingresults.vue:22
 msgid "Please select a bottleneck"
 msgstr ""
 
 #: src/components/admin/usermanagement/Userdetail.vue:41
-#: src/components/admin/usermanagement/Userdetail.vue:85
+#: src/components/admin/usermanagement/Userdetail.vue:86
 msgid "Please select one"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:15
+#: src/components/map/Pdftool.vue:21
 msgid "portrait"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:414
+#: src/components/map/fairway/Profiles.vue:448
 msgid "Profile deleted!"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:400
+#: src/components/map/fairway/Profiles.vue:434
 msgid "Profile saved!"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:5
+#: src/components/map/fairway/Profiles.vue:10
 msgid "Profiles"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:24
+#: src/components/map/contextbox/ImportSoundingresults.vue:28
 msgid "Projection"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:72 src/components/admin/Logs.vue:40
+#: src/components/admin/Importqueue.vue:70 src/components/admin/Logs.vue:40
 msgid "Refresh"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:37
+#: src/components/admin/Importqueue.vue:43
 msgid "Rejected"
 msgstr ""
 
-#: src/components/Login.vue:55
+#: src/components/admin/usermanagement/Userdetail.vue:228
+msgid "Repeat Password"
+msgstr ""
+
+#: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:77
+#: src/components/admin/usermanagement/Userdetail.vue:79
 msgid "Role"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:63
+#: src/components/map/fairway/Profiles.vue:82
 msgid "Saved cross profiles"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:40
+#: src/components/admin/importschedule/Importschedule.vue:36
 msgid "Schedule"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:25
+#: src/components/map/fairway/Profiles.vue:32
 msgid "Select Bottleneck"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:21
+#: src/components/admin/Systemconfiguration.vue:25
 msgid "Send"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:132
+#: src/components/admin/usermanagement/Userdetail.vue:139
 msgid "Send testmail"
 msgstr ""
 
-#: src/components/map/Identify.vue:50
-msgid "Some data"
+#: src/components/map/Identify.vue:64
+msgid ""
+"Some data ©\n"
+"        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
+"        contributors."
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:37
+#: src/components/map/fairway/Profiles.vue:45
 msgid "Sounding Result"
 msgstr ""
 
-#: src/components/map/Identify.vue:45
+#: src/components/map/Identify.vue:61
 msgid "source-code"
 msgstr ""
 
-#: src/components/Sidebar.vue:36
+#: src/components/Sidebar.vue:44
 msgid "Staging area"
 msgstr ""
 
-#: src/components/map/contextbox/Staging.vue:4
-#: src/components/map/contextbox/Staging.vue:125
+#: src/components/map/contextbox/Staging.vue:7
 msgid "Staging Area"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:116
+#: src/components/map/fairway/Profiles.vue:142
 msgid "Start"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:257
+#: src/components/map/contextbox/ImportSoundingresults.vue:268
 msgid "Starting import for "
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:57
+#: src/components/admin/Importqueue.vue:56
 msgid "State"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:123
+#: src/components/admin/usermanagement/Userdetail.vue:130
 msgid "Submit"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:339
+#: src/components/map/fairway/Profiles.vue:373
 msgid "Success"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:28
+#: src/components/admin/Importqueue.vue:34
 msgid "Successful"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:88
+#: src/components/admin/usermanagement/Userdetail.vue:89
 msgid "Sysadmin"
 msgstr ""
 
-#: src/components/Sidebar.vue:39
+#: src/components/Sidebar.vue:47
 msgid "Systemadministration"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:4
+#: src/components/admin/Systemconfiguration.vue:8
 msgid "Systemconfiguration"
 msgstr ""
 
-#: src/components/map/Identify.vue:37
-msgid "This app uses"
+#: src/components/map/Identify.vue:55
+msgid ""
+"This app uses <i>gemma</i>, which is Free Software under <br/>\n"
+"        %{ license } without warranty, see docs for details."
 msgstr ""
 
 #: src/components/admin/importschedule/Importschedule.vue:34
@@ -429,41 +491,33 @@
 msgid "Type"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:302
+#: src/components/map/contextbox/ImportSoundingresults.vue:313
 msgid "Upload"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:54
+#: src/components/admin/Importqueue.vue:55
 msgid "User"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:14
-#: src/components/map/contextbox/Staging.vue:22
+#: src/components/admin/usermanagement/Userdetail.vue:15
+#: src/components/map/contextbox/Staging.vue:16
 msgid "Username"
 msgstr ""
 
-#: src/components/Sidebar.vue:44
-#: src/components/admin/usermanagement/Usermanagement.vue:8
+#: src/components/Sidebar.vue:52
+#: src/components/admin/usermanagement/Usermanagement.vue:14
 msgid "Users"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:91
+#: src/components/admin/usermanagement/Userdetail.vue:92
 msgid "Waterway Admin"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:94
+#: src/components/admin/usermanagement/Userdetail.vue:95
 msgid "Waterway User"
 msgstr ""
 
-#: src/components/map/Identify.vue:39
-msgid "which is Free Software under"
-msgstr ""
-
-#: src/components/map/Identify.vue:41
-msgid "without warranty, see docs for details."
-msgstr ""
-
-#: src/components/map/fairway/Profiles.vue:401
-#: src/components/map/fairway/Profiles.vue:402
+#: src/components/map/fairway/Profiles.vue:435
+#: src/components/map/fairway/Profiles.vue:436
 msgid "You can now select these coordinates from the \"Saved cross profiles\" menu to restore this cross profile."
 msgstr ""
--- a/client/src/locale/sk_SK/LC_MESSAGES/app.po	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/locale/sk_SK/LC_MESSAGES/app.po	Tue Dec 04 12:52:31 2018 +0100
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: wamosjs 0.1.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-12-03 10:57+0100\n"
+"POT-Creation-Date: 2018-12-04 11:29+0100\n"
 "PO-Revision-Date: 2018-07-03 17:18+0200\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -17,31 +17,41 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: src/components/admin/Importqueue.vue:40
+#: src/components/admin/Importqueue.vue:46
 msgid "Accepted"
 msgstr ""
 
-#: src/components/admin/Logs.vue:17
+#: src/components/admin/Logs.vue:20
 msgid "Accesslog"
 msgstr ""
 
-#: src/components/admin/usermanagement/Usermanagement.vue:71
+#: src/components/admin/usermanagement/Usermanagement.vue:106
 msgid "Add User"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:37
+#: src/components/admin/importschedule/Importschedule.vue:35
 msgid "Author"
 msgstr ""
 
-#: src/components/Login.vue:59
+#: src/components/Login.vue:70
 msgid "back to login"
 msgstr ""
 
-#: src/components/map/Search.vue:231
-#: src/components/map/contextbox/ImportSoundingresults.vue:194
-#: src/components/map/contextbox/ImportSoundingresults.vue:233
-#: src/components/map/contextbox/ImportSoundingresults.vue:264
-#: src/components/map/contextbox/Staging.vue:99
+#: src/components/admin/Importqueue.vue:134
+#: src/components/admin/Systemconfiguration.vue:133
+#: src/components/admin/Systemconfiguration.vue:148
+#: src/components/admin/Systemconfiguration.vue:167
+#: src/components/admin/Systemconfiguration.vue:184
+#: src/components/admin/usermanagement/Userdetail.vue:296
+#: src/components/admin/usermanagement/Userdetail.vue:368
+#: src/components/admin/usermanagement/Usermanagement.vue:300
+#: src/components/admin/usermanagement/Usermanagement.vue:308
+#: src/components/admin/usermanagement/Usermanagement.vue:334
+#: src/components/map/Search.vue:257
+#: src/components/map/contextbox/Bottlenecks.vue:252
+#: src/components/map/contextbox/ImportSoundingresults.vue:205
+#: src/components/map/contextbox/ImportSoundingresults.vue:244
+#: src/components/map/contextbox/ImportSoundingresults.vue:275
 msgid "Backend Error"
 msgstr ""
 
@@ -49,132 +59,139 @@
 msgid "Bottleneck"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:15
+#: src/components/admin/Systemconfiguration.vue:19
 msgid "Bottleneck Areas fill-color"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:9
+#: src/components/admin/Systemconfiguration.vue:13
 msgid "Bottleneck Areas stroke-color"
 msgstr ""
 
-#: src/components/Sidebar.vue:19
+#: src/components/Sidebar.vue:22
 #: src/components/map/contextbox/Bottlenecks.vue:4
 msgid "Bottlenecks"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:112
+#: src/components/map/contextbox/ImportSoundingresults.vue:121
 msgid "Cancel Upload"
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:23
+#: src/components/map/contextbox/Bottlenecks.vue:30
 msgid "Chainage"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:156
-#: src/components/map/contextbox/ImportSoundingresults.vue:170
+#: src/components/map/contextbox/ImportSoundingresults.vue:167
+#: src/components/map/contextbox/ImportSoundingresults.vue:181
 msgid "choose .zip- file"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:12
+#: src/components/map/Pdftool.vue:18
 msgid "Chose format:"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:49
+#: src/components/map/fairway/Profiles.vue:64
 msgid "Compare with"
 msgstr ""
 
-#: src/components/Sidebar.vue:50
+#: src/components/Sidebar.vue:58
 msgid "Configuration"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:305
-#: src/components/map/contextbox/Staging.vue:65
+#: src/components/map/contextbox/ImportSoundingresults.vue:316
+#: src/components/map/contextbox/Staging.vue:70
 msgid "Confirm"
 msgstr ""
 
-#: src/components/map/Identify.vue:52
-msgid "contributors."
-msgstr ""
-
-#: src/components/map/fairway/Profiles.vue:340
+#: src/components/map/fairway/Profiles.vue:374
 msgid "Coordinates copied to clipboard!"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:33
+#: src/components/admin/usermanagement/Userdetail.vue:34
 msgid "Country"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:58
-#: src/components/map/contextbox/Staging.vue:16
+#: src/components/map/contextbox/ImportSoundingresults.vue:67
+#: src/components/map/contextbox/Staging.vue:14
 msgid "Date"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:42
+#: src/components/map/contextbox/ImportSoundingresults.vue:47
 msgid "Depthreference"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:25
+#: src/components/map/Pdftool.vue:32
 msgid "Download"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:109
+#: src/components/map/contextbox/ImportSoundingresults.vue:113
 msgid "Download Meta.json"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:43
+#: src/components/admin/importschedule/Importschedule.vue:37
 msgid "Email"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:58
+#: src/components/admin/usermanagement/Userdetail.vue:60
 msgid "Email address"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:48
+#: src/components/admin/Importqueue.vue:53
 msgid "Enqueued"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:96
+#: src/components/map/fairway/Profiles.vue:123
 msgid "Enter coordinates manually"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:154
+#: src/components/map/fairway/Profiles.vue:185
 msgid "Enter label for cross profile"
 msgstr ""
 
-#: src/components/Login.vue:146
+#: src/components/Login.vue:157
 msgid "Enter passphrase"
 msgstr ""
 
-#: src/components/Login.vue:149
+#: src/components/Login.vue:160
 msgid "Enter username"
 msgstr ""
 
-#: src/components/admin/Logs.vue:26
+#: src/components/admin/usermanagement/Userdetail.vue:377
+msgid "Error while saving user"
+msgstr ""
+
+#: src/components/admin/Logs.vue:29
 msgid "Errorlog"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:31
+#: src/components/admin/Importqueue.vue:37
 msgid "Failed"
 msgstr ""
 
-#: src/components/Login.vue:65
+#: src/components/Login.vue:76
 msgid "Forgot password"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:4 src/components/map/Pdftool.vue:38
+#: src/components/map/Pdftool.vue:10 src/components/map/Pdftool.vue:49
 msgid "Generate PDF"
 msgstr ""
 
-#: src/components/map/Identify.vue:5
+#: src/components/map/Identify.vue:69
+msgid ""
+"Geonames data source is licensed under\n"
+"        <a href=\"https://creativecommons.org/licenses/by/4.0/\">%{ geoLicense }</a> without warranty, see docs for details\n"
+"        <a href=\"http://www.geonames.org/data-sources.html\">%{ data }</a>."
+msgstr ""
+
+#: src/components/map/Identify.vue:10
 msgid "Identified"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:31
-#: src/components/map/contextbox/ImportSoundingresults.vue:256
+#: src/components/admin/importschedule/Importschedule.vue:33
+#: src/components/map/contextbox/ImportSoundingresults.vue:267
 msgid "Import"
 msgstr ""
 
-#: src/components/Sidebar.vue:28
+#: src/components/Sidebar.vue:31
 msgid "Import soundingresults"
 msgstr ""
 
@@ -182,86 +199,94 @@
 msgid "Import Soundingresults"
 msgstr ""
 
-#: src/components/map/contextbox/Staging.vue:19
+#: src/components/map/contextbox/Staging.vue:15
 msgid "Imported"
 msgstr ""
 
-#: src/components/Sidebar.vue:58 src/components/admin/Importqueue.vue:6
+#: src/components/Sidebar.vue:66 src/components/admin/Importqueue.vue:9
 msgid "Importqueue"
 msgstr ""
 
-#: src/components/Sidebar.vue:62
-#: src/components/admin/importschedule/Importschedule.vue:6
+#: src/components/Sidebar.vue:70
+#: src/components/admin/importschedule/Importschedule.vue:9
 msgid "Importschedule"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:374
+#: src/components/admin/usermanagement/Userdetail.vue:345
+msgid "invalid email"
+msgstr ""
+
+#: src/components/map/fairway/Profiles.vue:408
 msgid "Invalid input"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:51
+#: src/components/admin/Importqueue.vue:54
 msgid "Kind"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:14
+#: src/components/map/Pdftool.vue:20
 msgid "landscape"
 msgstr ""
 
-#: src/components/admin/Logs.vue:34
+#: src/components/admin/Logs.vue:36
 msgid "Last refresh:"
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:15
+#: src/components/map/contextbox/Bottlenecks.vue:19
 msgid "Latest"
 msgstr ""
 
-#: src/components/map/layers/Layers.vue:4
+#: src/components/map/layers/Layers.vue:10
 msgid "Layers"
 msgstr ""
 
-#: src/components/Login.vue:51
+#: src/components/Login.vue:58
 msgid "Login"
 msgstr ""
 
-#: src/components/Login.vue:140
+#: src/components/Login.vue:151
 msgid "Login failed"
 msgstr ""
 
-#: src/components/Sidebar.vue:68
+#: src/components/Sidebar.vue:76
 msgid "Logout"
 msgstr ""
 
-#: src/components/Sidebar.vue:54
+#: src/components/Sidebar.vue:62
 msgid "Logs"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:135
+#: src/components/admin/usermanagement/Userdetail.vue:141
 msgid "Mail was sent"
 msgstr ""
 
-#: src/components/Sidebar.vue:11
+#: src/components/Sidebar.vue:14
 msgid "Map"
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:17
+#: src/components/map/contextbox/Bottlenecks.vue:20
 msgid "Measurement"
 msgstr ""
 
 #: src/components/map/contextbox/Bottlenecks.vue:9
-#: src/components/map/contextbox/Staging.vue:10
+#: src/components/map/contextbox/Staging.vue:12
 msgid "Name"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:69
+#: src/components/admin/importschedule/Importscheduledetail.vue:6
+msgid "New import"
+msgstr ""
+
+#: src/components/admin/importschedule/Importschedule.vue:72
 msgid "New Import"
 msgstr ""
 
-#: src/components/map/Identify.vue:33
+#: src/components/map/Identify.vue:51
 msgid "No features identified."
 msgstr ""
 
-#: src/components/map/contextbox/Bottlenecks.vue:85
-#: src/components/map/contextbox/Staging.vue:58
+#: src/components/map/contextbox/Bottlenecks.vue:116
+#: src/components/map/contextbox/Staging.vue:63
 msgid "No results."
 msgstr ""
 
@@ -269,159 +294,196 @@
 msgid "No schedules"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:32
+#: src/components/map/Pdftool.vue:41
 msgid "Open in new window"
 msgstr ""
 
-#: src/components/Login.vue:142
+#: src/components/admin/usermanagement/Userdetail.vue:229
+msgid "password"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:227
+msgid "Password"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:230
+msgid "password again"
+msgstr ""
+
+#: src/components/Login.vue:153
 msgid "Password reset requested!"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:34
+#: src/components/admin/usermanagement/Userdetail.vue:338
+#: src/components/admin/usermanagement/Userdetail.vue:339
+msgid "Password should at least be 8 char long including 1 digit and 1 special char like $"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:334
+msgid "Passwords do not match!"
+msgstr ""
+
+#: src/components/admin/Importqueue.vue:40
 msgid "Pending"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:71
+#: src/components/admin/usermanagement/Userdetail.vue:323
+msgid "Please choose a country"
+msgstr ""
+
+#: src/components/admin/usermanagement/Userdetail.vue:328
+msgid "Please choose a role"
+msgstr ""
+
+#: src/components/map/contextbox/ImportSoundingresults.vue:79
 msgid "Please enter a date"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:34
+#: src/components/map/contextbox/ImportSoundingresults.vue:39
 msgid "Please enter a projection"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:52
+#: src/components/map/contextbox/ImportSoundingresults.vue:62
 msgid "Please enter a reference"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:375
-#: src/components/map/fairway/Profiles.vue:376
+#: src/components/map/fairway/Profiles.vue:409
+#: src/components/map/fairway/Profiles.vue:410
 msgid "Please enter correct coordinates in the format: Lat,Lon,Lat,Lon"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:18
+#: src/components/map/contextbox/ImportSoundingresults.vue:22
 msgid "Please select a bottleneck"
 msgstr ""
 
 #: src/components/admin/usermanagement/Userdetail.vue:41
-#: src/components/admin/usermanagement/Userdetail.vue:85
+#: src/components/admin/usermanagement/Userdetail.vue:86
 msgid "Please select one"
 msgstr ""
 
-#: src/components/map/Pdftool.vue:15
+#: src/components/map/Pdftool.vue:21
 msgid "portrait"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:414
+#: src/components/map/fairway/Profiles.vue:448
 msgid "Profile deleted!"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:400
+#: src/components/map/fairway/Profiles.vue:434
 msgid "Profile saved!"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:5
+#: src/components/map/fairway/Profiles.vue:10
 msgid "Profiles"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:24
+#: src/components/map/contextbox/ImportSoundingresults.vue:28
 msgid "Projection"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:72 src/components/admin/Logs.vue:40
+#: src/components/admin/Importqueue.vue:70 src/components/admin/Logs.vue:40
 msgid "Refresh"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:37
+#: src/components/admin/Importqueue.vue:43
 msgid "Rejected"
 msgstr ""
 
-#: src/components/Login.vue:55
+#: src/components/admin/usermanagement/Userdetail.vue:228
+msgid "Repeat Password"
+msgstr ""
+
+#: src/components/Login.vue:66
 msgid "Request password reset!"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:77
+#: src/components/admin/usermanagement/Userdetail.vue:79
 msgid "Role"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:63
+#: src/components/map/fairway/Profiles.vue:82
 msgid "Saved cross profiles"
 msgstr ""
 
-#: src/components/admin/importschedule/Importschedule.vue:40
+#: src/components/admin/importschedule/Importschedule.vue:36
 msgid "Schedule"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:25
+#: src/components/map/fairway/Profiles.vue:32
 msgid "Select Bottleneck"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:21
+#: src/components/admin/Systemconfiguration.vue:25
 msgid "Send"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:132
+#: src/components/admin/usermanagement/Userdetail.vue:139
 msgid "Send testmail"
 msgstr ""
 
-#: src/components/map/Identify.vue:50
-msgid "Some data"
+#: src/components/map/Identify.vue:64
+msgid ""
+"Some data ©\n"
+"        <a href=\"https://www.openstreetmap.org/copyright\">%{ name }</a>\n"
+"        contributors."
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:37
+#: src/components/map/fairway/Profiles.vue:45
 msgid "Sounding Result"
 msgstr ""
 
-#: src/components/map/Identify.vue:45
+#: src/components/map/Identify.vue:61
 msgid "source-code"
 msgstr ""
 
-#: src/components/Sidebar.vue:36
+#: src/components/Sidebar.vue:44
 msgid "Staging area"
 msgstr ""
 
-#: src/components/map/contextbox/Staging.vue:4
-#: src/components/map/contextbox/Staging.vue:125
+#: src/components/map/contextbox/Staging.vue:7
 msgid "Staging Area"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:116
+#: src/components/map/fairway/Profiles.vue:142
 msgid "Start"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:257
+#: src/components/map/contextbox/ImportSoundingresults.vue:268
 msgid "Starting import for "
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:57
+#: src/components/admin/Importqueue.vue:56
 msgid "State"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:123
+#: src/components/admin/usermanagement/Userdetail.vue:130
 msgid "Submit"
 msgstr ""
 
-#: src/components/map/fairway/Profiles.vue:339
+#: src/components/map/fairway/Profiles.vue:373
 msgid "Success"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:28
+#: src/components/admin/Importqueue.vue:34
 msgid "Successful"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:88
+#: src/components/admin/usermanagement/Userdetail.vue:89
 msgid "Sysadmin"
 msgstr ""
 
-#: src/components/Sidebar.vue:39
+#: src/components/Sidebar.vue:47
 msgid "Systemadministration"
 msgstr ""
 
-#: src/components/admin/Systemconfiguration.vue:4
+#: src/components/admin/Systemconfiguration.vue:8
 msgid "Systemconfiguration"
 msgstr ""
 
-#: src/components/map/Identify.vue:37
-msgid "This app uses"
+#: src/components/map/Identify.vue:55
+msgid ""
+"This app uses <i>gemma</i>, which is Free Software under <br/>\n"
+"        %{ license } without warranty, see docs for details."
 msgstr ""
 
 #: src/components/admin/importschedule/Importschedule.vue:34
@@ -429,41 +491,33 @@
 msgid "Type"
 msgstr ""
 
-#: src/components/map/contextbox/ImportSoundingresults.vue:302
+#: src/components/map/contextbox/ImportSoundingresults.vue:313
 msgid "Upload"
 msgstr ""
 
-#: src/components/admin/Importqueue.vue:54
+#: src/components/admin/Importqueue.vue:55
 msgid "User"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:14
-#: src/components/map/contextbox/Staging.vue:22
+#: src/components/admin/usermanagement/Userdetail.vue:15
+#: src/components/map/contextbox/Staging.vue:16
 msgid "Username"
 msgstr ""
 
-#: src/components/Sidebar.vue:44
-#: src/components/admin/usermanagement/Usermanagement.vue:8
+#: src/components/Sidebar.vue:52
+#: src/components/admin/usermanagement/Usermanagement.vue:14
 msgid "Users"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:91
+#: src/components/admin/usermanagement/Userdetail.vue:92
 msgid "Waterway Admin"
 msgstr ""
 
-#: src/components/admin/usermanagement/Userdetail.vue:94
+#: src/components/admin/usermanagement/Userdetail.vue:95
 msgid "Waterway User"
 msgstr ""
 
-#: src/components/map/Identify.vue:39
-msgid "which is Free Software under"
-msgstr ""
-
-#: src/components/map/Identify.vue:41
-msgid "without warranty, see docs for details."
-msgstr ""
-
-#: src/components/map/fairway/Profiles.vue:401
-#: src/components/map/fairway/Profiles.vue:402
+#: src/components/map/fairway/Profiles.vue:435
+#: src/components/map/fairway/Profiles.vue:436
 msgid "You can now select these coordinates from the \"Saved cross profiles\" menu to restore this cross profile."
 msgstr ""
--- a/client/src/store/bottlenecks.js	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/store/bottlenecks.js	Tue Dec 04 12:52:31 2018 +0100
@@ -100,8 +100,8 @@
           }
         })
           .then(response => {
-            const surveys = response.data.surveys.sort(
-              (a, b) => (a.date_info < b.date_info ? 1 : -1)
+            const surveys = response.data.surveys.sort((a, b) =>
+              a.date_info < b.date_info ? 1 : -1
             );
             commit("selectedSurvey", surveys[0]);
             commit("setSurveys", surveys);
--- a/client/src/store/imports.js	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/src/store/imports.js	Tue Dec 04 12:52:31 2018 +0100
@@ -17,9 +17,9 @@
 /* eslint-disable no-unused-vars */
 /* eslint-disable no-unreachable */
 const STATES = {
-  NEEDSAPPROVAL: "NEEDSAPPROVAL",
-  APPROVED: "APPROVED",
-  REJECTED: "REJECTED"
+  NEEDSAPPROVAL: "pending",
+  APPROVED: "accepted",
+  REJECTED: "declined"
 };
 
 const SCHEDULES = {
--- a/client/vue.config.js	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/vue.config.js	Tue Dec 04 12:52:31 2018 +0100
@@ -1,7 +1,4 @@
 const CopyWebpackPlugin = require("copy-webpack-plugin");
-const PurgecssPlugin = require("purgecss-webpack-plugin");
-const glob = require("glob-all");
-const path = require("path");
 
 module.exports = {
   outputDir: "../web",
@@ -13,15 +10,6 @@
       .use(CopyWebpackPlugin, [[{ from: vendorImgPath, to: "img" }]], {
         copyUnmodified: true
       });
-    config.plugin("PurgecssPlugin").use(PurgecssPlugin, [
-      {
-        paths: glob.sync([
-          path.join(__dirname, "./src/index.html"),
-          path.join(__dirname, "./**/*.vue"),
-          path.join(__dirname, "./src/**/*.js")
-        ])
-      }
-    ]);
   },
   css: {
     loaderOptions: {
--- a/client/yarn.lock	Mon Dec 03 16:14:18 2018 +0000
+++ b/client/yarn.lock	Tue Dec 04 12:52:31 2018 +0100
@@ -10,31 +10,31 @@
     "@babel/highlight" "^7.0.0"
 
 "@babel/core@^7.0.0":
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.2.tgz#f8d2a9ceb6832887329a7b60f9d035791400ba4e"
-  integrity sha512-IFeSSnjXdhDaoysIlev//UzHZbdEmm7D0EIH2qtse9xK7mXEZQpYjs2P00XlP1qYsYvid79p+Zgg6tz1mp6iVw==
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.1.6.tgz#3733cbee4317429bc87c62b29cf8587dba7baeb3"
+  integrity sha512-Hz6PJT6e44iUNpAn8AoyAs6B3bl60g7MJQaI0rZEar6ECzh6+srYO1xlIdssio34mPaUtAb1y+XlkkSJzok3yw==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.1.2"
-    "@babel/helpers" "^7.1.2"
-    "@babel/parser" "^7.1.2"
+    "@babel/generator" "^7.1.6"
+    "@babel/helpers" "^7.1.5"
+    "@babel/parser" "^7.1.6"
     "@babel/template" "^7.1.2"
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.1.2"
+    "@babel/traverse" "^7.1.6"
+    "@babel/types" "^7.1.6"
     convert-source-map "^1.1.0"
-    debug "^3.1.0"
-    json5 "^0.5.0"
+    debug "^4.1.0"
+    json5 "^2.1.0"
     lodash "^4.17.10"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.1.2", "@babel/generator@^7.1.3":
-  version "7.1.3"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673"
-  integrity sha512-ZoCZGcfIJFJuZBqxcY9OjC1KW2lWK64qrX1o4UYL3yshVhwKFYgzpWZ0vvtGMNJdTlvkw0W+HR1VnYN8q3QPFQ==
-  dependencies:
-    "@babel/types" "^7.1.3"
+"@babel/generator@^7.1.6":
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.6.tgz#001303cf87a5b9d093494a4bf251d7b5d03d3999"
+  integrity sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ==
+  dependencies:
+    "@babel/types" "^7.1.6"
     jsesc "^2.5.1"
     lodash "^4.17.10"
     source-map "^0.5.0"
@@ -195,14 +195,14 @@
     "@babel/traverse" "^7.1.0"
     "@babel/types" "^7.0.0"
 
-"@babel/helpers@^7.1.2":
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.2.tgz#ab752e8c35ef7d39987df4e8586c63b8846234b5"
-  integrity sha512-Myc3pUE8eswD73aWcartxB16K6CGmHDv9KxOmD2CeOs/FaEAQodr3VYGmlvOmog60vNQ2w8QbatuahepZwrHiA==
+"@babel/helpers@^7.1.5":
+  version "7.1.5"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.1.5.tgz#68bfc1895d685f2b8f1995e788dbfe1f6ccb1996"
+  integrity sha512-2jkcdL02ywNBry1YNFAH/fViq4fXG0vdckHqeJk+75fpQ2OH+Az6076tX/M0835zA45E0Cqa6pV5Kiv9YOqjEg==
   dependencies:
     "@babel/template" "^7.1.2"
-    "@babel/traverse" "^7.1.0"
-    "@babel/types" "^7.1.2"
+    "@babel/traverse" "^7.1.5"
+    "@babel/types" "^7.1.5"
 
 "@babel/highlight@^7.0.0":
   version "7.0.0"
@@ -213,10 +213,10 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.3":
-  version "7.1.3"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77"
-  integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w==
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.6":
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.6.tgz#16e97aca1ec1062324a01c5a6a7d0df8dd189854"
+  integrity sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ==
 
 "@babel/plugin-proposal-async-generator-functions@^7.1.0":
   version "7.1.0"
@@ -239,10 +239,10 @@
     "@babel/helper-replace-supers" "^7.1.0"
     "@babel/plugin-syntax-class-properties" "^7.0.0"
 
-"@babel/plugin-proposal-decorators@^7.0.0":
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.2.tgz#79829bd75fced6581ec6c7ab1930e8d738e892e7"
-  integrity sha512-YooynBO6PmBgHvAd0fl5e5Tq/a0pEC6RqF62ouafme8FzdIVH41Mz/u1dn8fFVm4jzEJ+g/MsOxouwybJPuP8Q==
+"@babel/plugin-proposal-decorators@^7.1.0":
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.1.6.tgz#460c31edbd01953efe45d491583b3ec31661d689"
+  integrity sha512-U42f8KhUbtlhUDyV/wK4Rq/wWh8vWyttYABckG/v0vVnMPvayOewZC/83CbVdmyP+UhEqI368FEQ7hHMfhBpQA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/helper-replace-supers" "^7.1.0"
@@ -361,10 +361,10 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-block-scoping@^7.0.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc"
-  integrity sha512-GWEMCrmHQcYWISilUrk9GDqH4enf3UmhOEbNbNrlNAX1ssH3MsS1xLOS6rdjRVPgA7XXVPn87tRkdTEoA/dxEg==
+"@babel/plugin-transform-block-scoping@^7.1.5":
+  version "7.1.5"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.1.5.tgz#3e8e0bc9a5104519923302a24f748f72f2f61f37"
+  integrity sha512-jlYcDrz+5ayWC7mxgpn1Wj8zj0mmjCT2w0mPIMSwO926eXBRxpEgoN/uQVRBfjtr8ayjcmS+xk2G1jaP8JjMJQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     lodash "^4.17.10"
@@ -564,9 +564,9 @@
     regexpu-core "^4.1.3"
 
 "@babel/preset-env@^7.0.0":
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.0.tgz#e67ea5b0441cfeab1d6f41e9b5c79798800e8d11"
-  integrity sha512-ZLVSynfAoDHB/34A17/JCZbyrzbQj59QC1Anyueb4Bwjh373nVPq5/HMph0z+tCmcDjXDe+DlKQq9ywQuvWrQg==
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.1.6.tgz#a0bf4b96b6bfcf6e000afc5b72b4abe7cc13ae97"
+  integrity sha512-YIBfpJNQMBkb6MCkjz/A9J76SNCSuGVamOVBgoUkLzpJD/z8ghHi9I42LQ4pulVX68N/MmImz6ZTixt7Azgexw==
   dependencies:
     "@babel/helper-module-imports" "^7.0.0"
     "@babel/helper-plugin-utils" "^7.0.0"
@@ -581,7 +581,7 @@
     "@babel/plugin-transform-arrow-functions" "^7.0.0"
     "@babel/plugin-transform-async-to-generator" "^7.1.0"
     "@babel/plugin-transform-block-scoped-functions" "^7.0.0"
-    "@babel/plugin-transform-block-scoping" "^7.0.0"
+    "@babel/plugin-transform-block-scoping" "^7.1.5"
     "@babel/plugin-transform-classes" "^7.1.0"
     "@babel/plugin-transform-computed-properties" "^7.0.0"
     "@babel/plugin-transform-destructuring" "^7.0.0"
@@ -611,9 +611,9 @@
     semver "^5.3.0"
 
 "@babel/runtime@^7.0.0":
-  version "7.1.2"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3"
-  integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==
+  version "7.1.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39"
+  integrity sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA==
   dependencies:
     regenerator-runtime "^0.12.0"
 
@@ -626,25 +626,25 @@
     "@babel/parser" "^7.1.2"
     "@babel/types" "^7.1.2"
 
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0":
-  version "7.1.4"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4"
-  integrity sha512-my9mdrAIGdDiSVBuMjpn/oXYpva0/EZwWL3sm3Wcy/AVWO2eXnsoZruOT9jOGNRXU8KbCIu5zsKnXcAJ6PcV6Q==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6":
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.6.tgz#c8db9963ab4ce5b894222435482bd8ea854b7b5c"
+  integrity sha512-CXedit6GpISz3sC2k2FsGCUpOhUqKdyL0lqNrImQojagnUMXf8hex4AxYFRuMkNGcvJX5QAFGzB5WJQmSv8SiQ==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.1.3"
+    "@babel/generator" "^7.1.6"
     "@babel/helper-function-name" "^7.1.0"
     "@babel/helper-split-export-declaration" "^7.0.0"
-    "@babel/parser" "^7.1.3"
-    "@babel/types" "^7.1.3"
-    debug "^3.1.0"
+    "@babel/parser" "^7.1.6"
+    "@babel/types" "^7.1.6"
+    debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.10"
 
-"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3":
-  version "7.1.3"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d"
-  integrity sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==
+"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.5", "@babel/types@^7.1.6":
+  version "7.1.6"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.6.tgz#0adb330c3a281348a190263aceb540e10f04bcce"
+  integrity sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w==
   dependencies:
     esutils "^2.0.2"
     lodash "^4.17.10"
@@ -705,7 +705,7 @@
     call-me-maybe "^1.0.1"
     glob-to-regexp "^0.3.0"
 
-"@nodelib/fs.stat@^1.0.1":
+"@nodelib/fs.stat@^1.1.2":
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
@@ -778,9 +778,9 @@
     "@types/babel-types" "*"
 
 "@types/node@*", "@types/node@^10.11.7":
-  version "10.12.2"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.2.tgz#d77f9faa027cadad9c912cd47f4f8b07b0fb0864"
-  integrity sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ==
+  version "10.12.11"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.11.tgz#715c476c99a5f6898a1ae61caf9825e43c03912e"
+  integrity sha512-3iIOhNiPGTdcUNVCv9e5G7GotfvJJe2pc9w2UgDXlUwnxSZ3RgcUocIU+xYm+rTU54jIKih998QE4dMOyMN1NQ==
 
 "@types/semver@^5.5.0":
   version "5.5.0"
@@ -797,13 +797,13 @@
   resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
   integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==
 
-"@vue/babel-preset-app@^3.1.0":
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-3.1.1.tgz#1bb6395c5ddc84bc8e993ace47151b0d95d382a7"
-  integrity sha512-YLswSHTCgmYjxm0ZJYK6+HfjdiTen2WmxQ8BWkeE+ZI7kOJlEkEMM7+RLmEvEKY8Z0lQharBkjNJdRfWt8D4SQ==
+"@vue/babel-preset-app@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-3.2.0.tgz#a443acdbd34f66d7645db271d9ac58fbe4fe870d"
+  integrity sha512-yDPMhdeOnQ49EOsOnHXJZQ4aR+g+TZVkImUjRBN90MKv9V1C9HXxhU73Je6pWUQaJ0yugMr5jl058ns6Mx6mNA==
   dependencies:
     "@babel/plugin-proposal-class-properties" "^7.0.0"
-    "@babel/plugin-proposal-decorators" "^7.0.0"
+    "@babel/plugin-proposal-decorators" "^7.1.0"
     "@babel/plugin-syntax-dynamic-import" "^7.0.0"
     "@babel/plugin-syntax-jsx" "^7.0.0"
     "@babel/plugin-transform-runtime" "^7.0.0"
@@ -814,72 +814,72 @@
     babel-plugin-transform-vue-jsx "^4.0.1"
     core-js "^2.5.7"
 
-"@vue/cli-overlay@^3.1.0":
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.1.0.tgz#47db870055060c30189454919dbf9381be8695f2"
-  integrity sha512-id6FtCzfbYQ812vRP9AA5qelmQTfhYvYmU+AGm+eZmSbdk8eZqbUtiraFPa5JsqnPN8twUvpPLmvqmPHoK+VEw==
-
-"@vue/cli-plugin-babel@^3.1.1":
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-3.1.1.tgz#443441456ea1141b3a8070255034342dd47809e0"
-  integrity sha512-Wvaoru+9lYz+jAr2nqQrP8mX/0tq3doU4pJC41Ggtq3kUtTnnTf4MBl4SffN1qpW5eW6zFidQ0HjiAp1sfSmyg==
+"@vue/cli-overlay@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-3.2.0.tgz#bb5d781914bb5af97d92410babbaa3720707b728"
+  integrity sha512-RKMSfgTtRs4VOXQhmbrNZJaCCheshebji9NcPNGyXzukCMBtoAbu3cG9HxizCSUA//oFFAdPP5BGeHvv0cpu/A==
+
+"@vue/cli-plugin-babel@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-3.2.0.tgz#5548e052f07512156942f50dcf18948ad29be7ec"
+  integrity sha512-HRhwsUIZ9DZYH+cVS8O0Qfk2W43vKpl5/JcvCS8YWWmRjwZjjHtRDifnfQuLC3Q0cUMTcv4bv8vnPMtkAbvXKg==
   dependencies:
     "@babel/core" "^7.0.0"
-    "@vue/babel-preset-app" "^3.1.0"
+    "@vue/babel-preset-app" "^3.2.0"
     babel-loader "^8.0.4"
 
-"@vue/cli-plugin-e2e-nightwatch@^3.1.1":
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-e2e-nightwatch/-/cli-plugin-e2e-nightwatch-3.1.1.tgz#f01290a79e76e988d6b259383e37a3715ad10b0e"
-  integrity sha512-8VhABC7k3XQ0nE36oNLBWFHnx07j1z+81Lf3NUI778xAL373b61htifqr4r4Si2duWayOCkiuv4oy7uWKSmc4Q==
-  dependencies:
-    "@vue/cli-shared-utils" "^3.1.1"
-    chromedriver "^2.43.1"
+"@vue/cli-plugin-e2e-nightwatch@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-e2e-nightwatch/-/cli-plugin-e2e-nightwatch-3.2.0.tgz#e90b650d63ce184d443c3c7287a91126b2e21bd7"
+  integrity sha512-WZYEFqvDX3pi4igKJv7+atYSZ6ZDWMHZbXD6cU0N2+uHyaULteMq79nW4jqyP9WANJRTtNSsAkMBkNV7bxdXJQ==
+  dependencies:
+    "@vue/cli-shared-utils" "^3.2.0"
+    chromedriver "^2.44.0"
     deepmerge "^2.2.1"
     execa "^1.0.0"
     nightwatch "^0.9.21"
-    selenium-server "^3.14.0"
-
-"@vue/cli-plugin-eslint@^3.1.4":
-  version "3.1.4"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.1.4.tgz#7cf1a4a4540db9210a5e418eae3c19e1eb302275"
-  integrity sha512-1ET67AfYEMb5Lesd8YC6X8WLdrt/Mqr9x/oQjrc6hIYInIThOVo6hkWZXgznru5A1lD1kw4GQWq/DCUKfw6v2g==
-  dependencies:
-    "@vue/cli-shared-utils" "^3.1.1"
+    selenium-server "^3.141.59"
+
+"@vue/cli-plugin-eslint@^3.2.1":
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-3.2.1.tgz#4dc353add93023363bf4c6b347e64472d1f2f432"
+  integrity sha512-Z/eQw18FjTypMMryNg8WCYJxEBmSAtnzukRWWNFwqNnh2zM/2J6yR4dYhsyjNtMEMUOnQsAsJnqgw45rLu8sJg==
+  dependencies:
+    "@vue/cli-shared-utils" "^3.2.0"
     babel-eslint "^10.0.1"
     eslint "^4.19.1"
     eslint-loader "^2.1.1"
     eslint-plugin-vue "^4.7.1"
     globby "^8.0.1"
 
-"@vue/cli-plugin-unit-jest@^3.1.1":
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.1.1.tgz#8ea47d0c953088c8f04eb8cecaac21227b1bc317"
-  integrity sha512-6019ikvxRhCK9hSs2mQJllS4DA0BV1yxSUKMbIad5z987uJL6hNZIJqfuzXdtvHOq5AVgcQsY+JH4WWtqShr7g==
-  dependencies:
-    "@vue/cli-shared-utils" "^3.1.1"
+"@vue/cli-plugin-unit-jest@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/cli-plugin-unit-jest/-/cli-plugin-unit-jest-3.2.0.tgz#5f3d3d83b3cf2ea834af23d445f68a16387ace23"
+  integrity sha512-I3d2W7O1Gb7/jNzZJ8Vt7FEn2Az0WmjGPxEGQecPPhD4cKG6xas1eKoWngiNV1NMIJfTO99UN+PlmUUE7hxb1A==
+  dependencies:
+    "@vue/cli-shared-utils" "^3.2.0"
     babel-jest "^23.6.0"
     babel-plugin-transform-es2015-modules-commonjs "^6.26.2"
     jest "^23.6.0"
     jest-serializer-vue "^2.0.2"
     jest-transform-stub "^1.0.0"
-    vue-jest "^3.0.0"
-
-"@vue/cli-service@^3.1.2":
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.1.2.tgz#e3ca43cefd7c9b5fa5e148a8d1f667de9ddc2579"
-  integrity sha512-hJHXvtQ4+aynKn+wknSqM7RoEbg35yA5W9L74vvjOQDyU+nEf2uQHt/xNj5O/PwSxK5QBn80vWH8CrUSCBF0eg==
+    vue-jest "^3.0.1"
+
+"@vue/cli-service@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-3.2.0.tgz#96e8ee7b33a911ab71710c126ab55cd64c2a4c51"
+  integrity sha512-HTiaz1IBXV/JCfrmyhHJvDOYpPTBK0uQAekSVRTt5AddCeOV68ktdUqHbDe3VPDfrWFA5x3d3kIHlJd6WK31mA==
   dependencies:
     "@intervolga/optimize-cssnano-plugin" "^1.0.5"
-    "@vue/cli-overlay" "^3.1.0"
-    "@vue/cli-shared-utils" "^3.1.1"
+    "@vue/cli-overlay" "^3.2.0"
+    "@vue/cli-shared-utils" "^3.2.0"
     "@vue/preload-webpack-plugin" "^1.1.0"
     "@vue/web-component-wrapper" "^1.2.0"
-    acorn "^6.0.2"
-    acorn-walk "^6.1.0"
+    acorn "^6.0.4"
+    acorn-walk "^6.1.1"
     address "^1.0.3"
     autoprefixer "^8.6.5"
-    cache-loader "1.2.2"
+    cache-loader "^1.2.5"
     case-sensitive-paths-webpack-plugin "^2.1.2"
     chalk "^2.4.1"
     clipboardy "^1.2.3"
@@ -891,7 +891,7 @@
     escape-string-regexp "^1.0.5"
     file-loader "^2.0.0"
     friendly-errors-webpack-plugin "^1.7.0"
-    fs-extra "^7.0.0"
+    fs-extra "^7.0.1"
     globby "^8.0.1"
     hash-sum "^1.0.2"
     html-webpack-plugin "^3.2.0"
@@ -899,7 +899,7 @@
     lodash.defaultsdeep "^4.6.0"
     lodash.mapvalues "^4.6.0"
     lodash.transform "^4.6.0"
-    mini-css-extract-plugin "^0.4.4"
+    mini-css-extract-plugin "^0.4.5"
     minimist "^1.2.0"
     ora "^3.0.0"
     portfinder "^1.0.19"
@@ -914,17 +914,17 @@
     thread-loader "^1.2.0"
     url-loader "^1.1.2"
     vue-loader "^15.4.2"
-    webpack "^4.23.1"
+    webpack "^4.26.1"
     webpack-bundle-analyzer "^3.0.3"
     webpack-chain "^4.11.0"
     webpack-dev-server "^3.1.10"
     webpack-merge "^4.1.4"
     yorkie "^2.0.0"
 
-"@vue/cli-shared-utils@^3.1.1":
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.1.1.tgz#ab8638c25318e5812b57877d7cfc65cd2af43740"
-  integrity sha512-r+R+5LI6IHHPI5tbOSDy5DpiY5O9eTy8LPr/QCPb5RIOg+Pg03VlElW4BL69hePXEHCQZZDsOzgItSmat6mBhg==
+"@vue/cli-shared-utils@^3.2.0":
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-3.2.0.tgz#504037063c2a4a346dc35c9652bd3863da4816e7"
+  integrity sha512-FCX5ABFg5pWhomyXLpCaogJktMvjsS5d4Mn5BfvqcJxCvzOX6ze8ihFK3u//XMeM78dOFpHSjxnRSvHtkEwgsg==
   dependencies:
     chalk "^2.4.1"
     execa "^1.0.0"
@@ -969,25 +969,26 @@
     source-map "^0.5.6"
     vue-template-es2015-compiler "^1.6.0"
 
-"@vue/eslint-config-prettier@^4.0.0":
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-4.0.0.tgz#d408b6490a00864c79df69885ef9d82977312bdc"
-  integrity sha512-NVFubMdP8KPkWJy2Z4AdDI1payw4dt1n/IN2VTGWSZd8Wva4TtdibRWFDjBZs4eqeeZepThxg6PDV9242zEM9w==
-  dependencies:
-    eslint-config-prettier "^3.1.0"
+"@vue/eslint-config-prettier@^4.0.1":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-4.0.1.tgz#a036d0d2193c5c836542b35a3a7c35c4e1c68c97"
+  integrity sha512-rJEDXPb61Hfgg8GllO3XXFP98bcIxdNNHSrNcxP/vBSukOolgOwQyZJ5f5z/c7ViPyh5/IDlC4qBnhx/0n+I4g==
+  dependencies:
+    eslint-config-prettier "^3.3.0"
     eslint-plugin-prettier "^3.0.0"
-    prettier "^1.14.3"
+    prettier "^1.15.2"
 
 "@vue/preload-webpack-plugin@^1.1.0":
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.0.tgz#d768dba004261c029b53a77c5ea2d5f9ee4f3cce"
   integrity sha512-rcn2KhSHESBFMPj5vc5X2pI9bcBNQQixvJXhD5gZ4rN2iym/uH2qfDSQfUS5+qwiz0a85TCkeUs6w6jxFDudbw==
 
-"@vue/test-utils@^1.0.0-beta.20":
-  version "1.0.0-beta.25"
-  resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.0.0-beta.25.tgz#4703076de3076bac42cdd242cd53e6fb8752ed8c"
-  integrity sha512-mfvguEmEpAn0BuT4u+qm+0J1NTKgQS+ffUyWHY1QeSovIkJcy98fj1rO+PJgiZSEvGjjnDNX+qmofYFPLrofbA==
-  dependencies:
+"@vue/test-utils@^1.0.0-beta.26":
+  version "1.0.0-beta.26"
+  resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-1.0.0-beta.26.tgz#1ae7e1dc2bef4f49f9dbfdfecad342d17d6c5c88"
+  integrity sha512-2bvTgdh4Rh9NqeIrH+rah6AjXUHYxFqLO+NoOMqWXYqSvk1PGgvI5o5sT6Pty4HklIReOZxWxsMpgnJFK9rW+A==
+  dependencies:
+    dom-event-types "^1.0.0"
     lodash "^4.17.4"
 
 "@vue/web-component-wrapper@^1.2.0":
@@ -1259,10 +1260,10 @@
     acorn-optional-catch-binding "^0.1.0"
     acorn-private-methods "^0.1.1"
 
-acorn-walk@^6.0.1, acorn-walk@^6.1.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.0.tgz#c957f4a1460da46af4a0388ce28b4c99355b0cbc"
-  integrity sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==
+acorn-walk@^6.0.1, acorn-walk@^6.1.1:
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
+  integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
 
 acorn@^3.0.4, acorn@^3.1.0:
   version "3.3.0"
@@ -1279,7 +1280,7 @@
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
   integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
 
-acorn@^6.0.1, acorn@^6.0.2:
+acorn@^6.0.1, acorn@^6.0.4:
   version "6.0.4"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754"
   integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==
@@ -1322,10 +1323,10 @@
     fast-json-stable-stringify "^2.0.0"
     json-schema-traverse "^0.3.0"
 
-ajv@^6.1.0:
-  version "6.5.5"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1"
-  integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==
+ajv@^6.1.0, ajv@^6.5.5:
+  version "6.6.1"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61"
+  integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww==
   dependencies:
     fast-deep-equal "^2.0.1"
     fast-json-stable-stringify "^2.0.0"
@@ -1476,9 +1477,9 @@
   integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
 
 array-flatten@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
-  integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+  integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
 
 array-map@~0.0.0:
   version "0.0.0"
@@ -1512,7 +1513,7 @@
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
   integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
 
-arrify@^1.0.0, arrify@^1.0.1:
+arrify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
   integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=
@@ -1561,9 +1562,9 @@
   integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
 
 ast-types@0.x.x:
-  version "0.11.6"
-  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.6.tgz#4e2266c2658829aef3b40cc33ad599c4e9eb89ef"
-  integrity sha512-nHiuV14upVGl7MWwFUYbzJ6YlfwWS084CU9EA8HajfYQjMSli5TQi3UTRygGF58LFWVkXxS1rbgRhROEqlQkXg==
+  version "0.11.7"
+  resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.11.7.tgz#f318bf44e339db6a320be0009ded64ec1471f46c"
+  integrity sha512-2mP3TwtkY/aTv5X3ZsMpNAbOnyoC/aMJwJSoaELPkHId0nSQgFcnU4dRW3isxiz7+zBexk0ym3WNVjMiQBnJSw==
 
 astral-regex@^1.0.0:
   version "1.0.0"
@@ -1925,9 +1926,9 @@
     inherits "~2.0.0"
 
 bluebird@^3.1.1, bluebird@^3.5.1:
-  version "3.5.2"
-  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
-  integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==
+  version "3.5.3"
+  resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
+  integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
 
 bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   version "4.11.8"
@@ -2095,13 +2096,13 @@
     electron-to-chromium "^1.3.47"
 
 browserslist@^4.0.0, browserslist@^4.1.0:
-  version "4.3.4"
-  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.4.tgz#4477b737db6a1b07077275b24791e680d4300425"
-  integrity sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA==
-  dependencies:
-    caniuse-lite "^1.0.30000899"
-    electron-to-chromium "^1.3.82"
-    node-releases "^1.0.1"
+  version "4.3.5"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7"
+  integrity sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==
+  dependencies:
+    caniuse-lite "^1.0.30000912"
+    electron-to-chromium "^1.3.86"
+    node-releases "^1.0.5"
 
 bser@^2.0.0:
   version "2.0.0"
@@ -2203,10 +2204,10 @@
     union-value "^1.0.0"
     unset-value "^1.0.0"
 
-cache-loader@1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-1.2.2.tgz#6d5c38ded959a09cc5d58190ab5af6f73bd353f5"
-  integrity sha512-rsGh4SIYyB9glU+d0OcHwiXHXBoUgDhHZaQ1KAbiXqfz1CDPxtTboh1gPbJ0q2qdO8a9lfcjgC5CJ2Ms32y5bw==
+cache-loader@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/cache-loader/-/cache-loader-1.2.5.tgz#9ab15b0ae5f546f376083a695fc1a75f546cb266"
+  integrity sha512-enWKEQ4kO3YreDFd7AtVRjtJBmNiqh/X9hVDReu0C4qm8gsGmySkwuWtdc+N5O+vq5FzxL1mIZc30NyXCB7o/Q==
   dependencies:
     loader-utils "^1.1.0"
     mkdirp "^0.5.1"
@@ -2218,6 +2219,13 @@
   resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
   integrity sha1-JtII6onje1y95gJQoV8DHBak1ms=
 
+caller-callsite@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
+  integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=
+  dependencies:
+    callsites "^2.0.0"
+
 caller-path@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
@@ -2225,6 +2233,13 @@
   dependencies:
     callsites "^0.2.0"
 
+caller-path@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4"
+  integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=
+  dependencies:
+    caller-callsite "^2.0.0"
+
 callsites@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
@@ -2271,6 +2286,11 @@
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
   integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
 
+camelcase@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
+  integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
+
 caniuse-api@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
@@ -2281,10 +2301,10 @@
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30000899:
-  version "1.0.30000906"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000906.tgz#7c44e498a2504f7a5db3b4f91285bbc821157a77"
-  integrity sha512-ME7JFX6h0402om/nC/8Lw+q23QvPe2ust9U0ntLmkX9F2zaGwq47fZkjlyHKirFBuq1EM+T/LXBcDdW4bvkCTA==
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000864, caniuse-lite@^1.0.30000912:
+  version "1.0.30000913"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000913.tgz#560311ecf242eaf12159b720e64b11ebd759b5e4"
+  integrity sha512-PP7Ypc35XY1mNduHqweGNOp0qfNUCmaQauGOYDByvirlFjrzRyY72pBRx7jnBidOB8zclg00DAzsy2H475BouQ==
 
 capture-exit@^1.2.0:
   version "1.2.0"
@@ -2400,17 +2420,16 @@
   dependencies:
     tslib "^1.9.0"
 
-chromedriver@^2.43.1:
-  version "2.43.1"
-  resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.43.1.tgz#b5ee75857f012ab540e74638206c062a0a962044"
-  integrity sha512-AqUEHpS+IzYm7HkBwElzVGe26Rs7hQwBoUSA4l7ju6Uymr1l0EtYpYfA3mDBqvvFif80yYh7blR0gLsc7h6Qpw==
+chromedriver@^2.44.0:
+  version "2.44.1"
+  resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.44.1.tgz#bb4dd614cb92b9a816e499ebaa692500011f4a3e"
+  integrity sha512-IPM8XQzQYVNJ9Rfec5cy0aGbrZno5xUlDNLLuph9bjkTJVoi14zqjvtmRd8Dc1P5vTw0MwNQ5JD89zibXp/W5A==
   dependencies:
     del "^3.0.0"
     extract-zip "^1.6.7"
-    kew "^0.7.0"
     mkdirp "^0.5.1"
-    request "^2.87.0"
-    tcp-port-used "^1.0.0"
+    request "^2.88.0"
+    tcp-port-used "^1.0.1"
 
 ci-info@^1.5.0:
   version "1.6.0"
@@ -2625,11 +2644,6 @@
   dependencies:
     graceful-readlink ">= 1.0.0"
 
-commander@~2.13.0:
-  version "2.13.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
-  integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==
-
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -2675,16 +2689,16 @@
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
-concurrently@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.0.1.tgz#f6310fbadf2f476dd95df952edb5c0ab789f672c"
-  integrity sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q==
+concurrently@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.0.tgz#17fdf067da71210685d9ea554423ef239da30d33"
+  integrity sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg==
   dependencies:
     chalk "^2.4.1"
     date-fns "^1.23.0"
     lodash "^4.17.10"
     read-pkg "^4.0.1"
-    rxjs "6.2.2"
+    rxjs "^6.3.3"
     spawn-command "^0.0.2-1"
     supports-color "^4.5.0"
     tree-kill "^1.1.0"
@@ -2825,10 +2839,11 @@
     require-from-string "^2.0.1"
 
 cosmiconfig@^5.0.0:
-  version "5.0.6"
-  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39"
-  integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==
-  dependencies:
+  version "5.0.7"
+  resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04"
+  integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA==
+  dependencies:
+    import-fresh "^2.0.0"
     is-directory "^0.3.1"
     js-yaml "^3.9.0"
     parse-json "^4.0.0"
@@ -3220,9 +3235,9 @@
   integrity sha512-Z18Dprj96ExragQ0DeGi+SYPQ7pPfRMtUXtsg/ChVIKNBCzjO8XYJvRTC1usblx52lqge56V5ect+frYTQc8WQ==
 
 d3-geo@1:
-  version "1.11.1"
-  resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.1.tgz#3f35e582c0d29296618b02a8ade0fdffb2c0e63c"
-  integrity sha512-GsG7x9G9sykseLviOVSJ3h5yjw0ItLopOtuDQKUt1TRklEegCw5WAmnIpYYiCkSH/QgUMleAeE2xZK38Qb+1+Q==
+  version "1.11.3"
+  resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.11.3.tgz#5bb08388f45e4b281491faa72d3abd43215dbd1c"
+  integrity sha512-n30yN9qSKREvV2fxcrhmHUdXP9TNH7ZZj3C/qnaoU0cVf/Ea85+yT7HY7i8ySPwkwjCNYtmKqQFTvLFngfkItQ==
   dependencies:
     d3-array "1"
 
@@ -3448,7 +3463,7 @@
   dependencies:
     ms "^2.1.1"
 
-decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
   integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
@@ -3557,19 +3572,6 @@
     escodegen "1.x.x"
     esprima "3.x.x"
 
-del@^2.0.2:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
-  integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=
-  dependencies:
-    globby "^5.0.0"
-    is-path-cwd "^1.0.0"
-    is-path-in-cwd "^1.0.0"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-    rimraf "^2.2.8"
-
 del@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
@@ -3703,6 +3705,11 @@
   dependencies:
     utila "~0.4"
 
+dom-event-types@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/dom-event-types/-/dom-event-types-1.0.0.tgz#5830a0a29e1bf837fe50a70cd80a597232813cae"
+  integrity sha512-2G2Vwi2zXTHBGqXHsJ4+ak/iP0N8Ar+G8a7LiD2oup5o4sQWytwqqrZu/O6hIMV0KMID2PL69OhpshLO0n7UJQ==
+
 dom-serializer@0, dom-serializer@~0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
@@ -3851,10 +3858,10 @@
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
   integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
 
-electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.82:
-  version "1.3.83"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.83.tgz#74584eb0972bb6777811c5d68d988c722f5e6666"
-  integrity sha512-DqJoDarxq50dcHsOOlMLNoy+qQitlMNbYb6wwbE0oUw2veHdRkpNrhmngiUYKMErdJ8SJ48rpJsZTQgy5SoEAA==
+electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.86:
+  version "1.3.87"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.87.tgz#f0481ca84824752bced51673396e9a6c74fe5ec7"
+  integrity sha512-EV5FZ68Hu+n9fHVhOc9AcG3Lvf+E1YqR36ulJUpwaQTkf4LwdvBqmGIazaIrt4kt6J8Gw3Kv7r9F+PQjAkjWeA==
 
 elliptic@^6.0.0:
   version "6.4.1"
@@ -3963,10 +3970,10 @@
   optionalDependencies:
     source-map "~0.6.1"
 
-eslint-config-prettier@^3.1.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-3.1.0.tgz#2c26d2cdcfa3a05f0642cd7e6e4ef3316cdabfa2"
-  integrity sha512-QYGfmzuc4q4J6XIhlp8vRKdI/fI0tQfQPy1dME3UOLprE+v4ssH/3W9LM2Q7h5qBcy5m0ehCrBDU2YF8q6OY8w==
+eslint-config-prettier@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-3.3.0.tgz#41afc8d3b852e757f06274ed6c44ca16f939a57d"
+  integrity sha512-Bc3bh5bAcKNvs3HOpSi6EfGA2IIp7EzWcg2tS4vP7stnXu/J1opihHDM7jI9JCIckyIDTgZLSWn7J3HY0j2JfA==
   dependencies:
     get-stdin "^6.0.0"
 
@@ -4377,15 +4384,15 @@
   integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
 
 fast-glob@^2.0.2:
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.3.tgz#d09d378e9ef6b0076a0fa1ba7519d9d4d9699c28"
-  integrity sha512-NiX+JXjnx43RzvVFwRWfPKo4U+1BrK5pJPsHQdKMlLoFHrrGktXglQhHliSihWAq+m1z6fHk3uwGHrtRbS9vLA==
+  version "2.2.4"
+  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.4.tgz#e54f4b66d378040e0e4d6a68ec36bbc5b04363c0"
+  integrity sha512-FjK2nCGI/McyzgNtTESqaWP3trPvHyRyoyY70hxjc3oKPNmDe8taohLZpoVKoUjW85tbU5txaYUZCNtVzygl1g==
   dependencies:
     "@mrmlnc/readdir-enhanced" "^2.2.1"
-    "@nodelib/fs.stat" "^1.0.1"
+    "@nodelib/fs.stat" "^1.1.2"
     glob-parent "^3.1.0"
     is-glob "^4.0.0"
-    merge2 "^1.2.1"
+    merge2 "^1.2.3"
     micromatch "^3.1.10"
 
 fast-json-stable-stringify@^2.0.0:
@@ -4574,13 +4581,13 @@
     locate-path "^3.0.0"
 
 flat-cache@^1.2.1:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
-  integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=
+  version "1.3.4"
+  resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f"
+  integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
   dependencies:
     circular-json "^0.3.1"
-    del "^2.0.2"
     graceful-fs "^4.1.2"
+    rimraf "~2.6.2"
     write "^0.2.1"
 
 flush-write-stream@^1.0.0:
@@ -4592,9 +4599,9 @@
     readable-stream "^2.0.4"
 
 follow-redirects@^1.0.0, follow-redirects@^1.3.0:
-  version "1.5.9"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6"
-  integrity sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w==
+  version "1.5.10"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a"
+  integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==
   dependencies:
     debug "=3.1.0"
 
@@ -4675,10 +4682,10 @@
     inherits "^2.0.1"
     readable-stream "^2.0.0"
 
-fs-extra@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.0.tgz#8cc3f47ce07ef7b3593a11b9fb245f7e34c041d6"
-  integrity sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==
+fs-extra@^7.0.1:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9"
+  integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==
   dependencies:
     graceful-fs "^4.1.2"
     jsonfile "^4.0.0"
@@ -4885,32 +4892,20 @@
     path-is-absolute "^1.0.0"
 
 global-modules-path@^2.3.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc"
-  integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931"
+  integrity sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==
 
 globals@^11.0.1, globals@^11.1.0:
-  version "11.8.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d"
-  integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA==
+  version "11.9.0"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249"
+  integrity sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==
 
 globals@^9.18.0:
   version "9.18.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
   integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
 
-globby@^5.0.0:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
-  integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=
-  dependencies:
-    array-union "^1.0.1"
-    arrify "^1.0.0"
-    glob "^7.0.3"
-    object-assign "^4.0.1"
-    pify "^2.0.0"
-    pinkie-promise "^2.0.0"
-
 globby@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -5013,11 +5008,11 @@
   integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
 
 har-validator@~5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29"
-  integrity sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==
-  dependencies:
-    ajv "^5.3.0"
+  version "5.1.3"
+  resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080"
+  integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==
+  dependencies:
+    ajv "^6.5.5"
     har-schema "^2.0.0"
 
 has-ansi@^2.0.0:
@@ -5104,9 +5099,9 @@
   integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=
 
 hash.js@^1.0.0, hash.js@^1.0.3:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
-  integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==
+  version "1.1.7"
+  resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42"
+  integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==
   dependencies:
     inherits "^2.0.3"
     minimalistic-assert "^1.0.1"
@@ -5141,9 +5136,9 @@
   integrity sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==
 
 hoek@6.x.x:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.0.1.tgz#15ae90f8d30ad114e2feabe4967567014a783078"
-  integrity sha512-3PvUwBerLNVJiIVQdpkWF9F/M0ekgb2NPJWOhsE28RXSQPsY42YSnaJ8d1kZjcAz58TZ/Fk9Tw64xJsENFlJNw==
+  version "6.1.2"
+  resolved "https://registry.yarnpkg.com/hoek/-/hoek-6.1.2.tgz#99e6d070561839de74ee427b61aa476bd6bddfd6"
+  integrity sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==
 
 home-or-tmp@^2.0.0:
   version "2.0.0"
@@ -5374,6 +5369,14 @@
   dependencies:
     import-from "^2.1.0"
 
+import-fresh@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
+  integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY=
+  dependencies:
+    caller-path "^2.0.0"
+    resolve-from "^3.0.0"
+
 import-from@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1"
@@ -6408,9 +6411,9 @@
   integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
 
 jsesc@^2.5.1:
-  version "2.5.1"
-  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
-  integrity sha1-5CGiqOINawgZ3yiQj3glJrlt0f4=
+  version "2.5.2"
+  resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+  integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
 
 jsesc@~0.5.0:
   version "0.5.0"
@@ -6457,6 +6460,13 @@
   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
   integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
 
+json5@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850"
+  integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==
+  dependencies:
+    minimist "^1.2.0"
+
 jsonfile@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -6487,11 +6497,6 @@
     is-promise "^2.0.0"
     promise "^7.0.1"
 
-kew@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
-  integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=
-
 killable@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -6884,9 +6889,9 @@
   integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
 
 lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3:
-  version "4.1.3"
-  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
-  integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+  integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
   dependencies:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
@@ -6911,9 +6916,9 @@
     tmpl "1.0.x"
 
 map-age-cleaner@^0.1.1:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74"
-  integrity sha512-UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==
+  version "0.1.3"
+  resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a"
+  integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==
   dependencies:
     p-defer "^1.0.0"
 
@@ -7022,7 +7027,7 @@
   dependencies:
     readable-stream "^2.0.1"
 
-merge2@^1.2.1:
+merge2@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.3.tgz#7ee99dbd69bb6481689253f018488a1b902b0ed5"
   integrity sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==
@@ -7101,19 +7106,19 @@
   integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==
 
 mime@^2.0.3, mime@^2.3.1:
-  version "2.3.1"
-  resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369"
-  integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6"
+  integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==
 
 mimic-fn@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
   integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
 
-mini-css-extract-plugin@^0.4.4:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d"
-  integrity sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ==
+mini-css-extract-plugin@^0.4.5:
+  version "0.4.5"
+  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.5.tgz#c99e9e78d54f3fa775633aee5933aeaa4e80719a"
+  integrity sha512-dqBanNfktnp2hwL2YguV9Jh91PFX7gu7nRLs4TGsbAfAG6WOtlynFRYzwDwmmeSb5uIwHo9nx1ta0f7vAZVp2w==
   dependencies:
     loader-utils "^1.1.0"
     schema-utils "^1.0.0"
@@ -7484,10 +7489,10 @@
     semver "^5.3.0"
     tar "^4"
 
-node-releases@^1.0.1:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.3.tgz#3414ed84595096459c251699bfcb47d88324a9e4"
-  integrity sha512-ZaZWMsbuDcetpHmYeKWPO6e63pSXLb50M7lJgCbcM2nC/nQC3daNifmtp5a2kp7EWwYfhuvH6zLPWkrF8IiDdw==
+node-releases@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.5.tgz#a641adcc968b039a27345d92ef10b093e5cbd41d"
+  integrity sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ==
   dependencies:
     semver "^5.3.0"
 
@@ -7635,9 +7640,9 @@
     kind-of "^3.0.3"
 
 object-hash@^1.1.4:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2"
-  integrity sha512-05KzQ70lSeGSrZJQXE5wNDiTkBJDlUT/myi6RX9dVIvz7a7Qh4oH93BQdiPMn27nldYvVQCKMUaM83AfizZlsQ==
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
+  integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
 
 object-keys@^1.0.11, object-keys@^1.0.12:
   version "1.0.12"
@@ -7699,10 +7704,10 @@
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
   integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
 
-ol@^5.0.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/ol/-/ol-5.2.0.tgz#5659ba9762def144deb8dcba97357aa5f8cc8a05"
-  integrity sha512-/sXlXKMT7W/4txYmEJiqZousQ5GScDoqVrltyQDl0himUD1oEV460bH74eD49AMm0OmQL9+TIn6DXKqOYzjTLw==
+ol@^5.3.0:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/ol/-/ol-5.3.0.tgz#106b870561fabb9b790b5869b3d93025cb03d389"
+  integrity sha512-UrOJGNI5XdYfE9n43RJdsMq25SjI4nIi5Kf0kxi+q6vEknzeRxM/wgYf8FMs7Ss3URuIbsKmetW9dVMOYB/DkQ==
   dependencies:
     pbf "3.1.0"
     pixelworks "1.1.0"
@@ -7930,9 +7935,9 @@
     thunkify "~2.1.1"
 
 pako@~1.0.5:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
-  integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27"
+  integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==
 
 parallel-transform@^1.1.0:
   version "1.1.0"
@@ -8172,14 +8177,14 @@
   integrity sha512-Vy9eH1dRD9wHjYt/QqXcTz+RnX/zg53xK+KljFSX30PvdDMb2z+c6uDUeblUGqqJgz3QFsdlA0IJvHziPmWtQg==
 
 popper.js@^1.12.9:
-  version "1.14.4"
-  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.4.tgz#8eec1d8ff02a5a3a152dd43414a15c7b79fd69b6"
-  integrity sha1-juwdj/AqWjoVLdQ0FKFce3n9abY=
+  version "1.14.6"
+  resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.14.6.tgz#ab20dd4edf9288b8b3b6531c47c361107b60b4b0"
+  integrity sha512-AGwHGQBKumlk/MDfrSOf0JHhJCImdDMcGNoqKmKkU+68GFazv3CQ6q9r7Ja1sKDZmYWTckY/uLyEznheTDycnA==
 
 portfinder@^1.0.19, portfinder@^1.0.9:
-  version "1.0.19"
-  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.19.tgz#07e87914a55242dcda5b833d42f018d6875b595f"
-  integrity sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw==
+  version "1.0.20"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
+  integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==
   dependencies:
     async "^1.5.2"
     debug "^2.2.0"
@@ -8520,9 +8525,9 @@
     supports-color "^5.4.0"
 
 postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5:
-  version "7.0.5"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55"
-  integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ==
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2"
+  integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==
   dependencies:
     chalk "^2.4.1"
     source-map "^0.6.1"
@@ -8550,10 +8555,10 @@
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.13.7.tgz#850f3b8af784a49a6ea2d2eaa7ed1428a34b7281"
   integrity sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==
 
-prettier@^1.13.0, prettier@^1.14.3:
-  version "1.14.3"
-  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895"
-  integrity sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg==
+prettier@^1.13.0, prettier@^1.15.2:
+  version "1.15.3"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.3.tgz#1feaac5bdd181237b54dbe65d874e02a1472786a"
+  integrity sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==
 
 pretty-error@^2.0.2:
   version "2.1.1"
@@ -8607,9 +8612,9 @@
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
 progress@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31"
-  integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.2.tgz#db9476f916bcc9ebe8a04efb22b18b0740376c61"
+  integrity sha512-/OLz5F9beZUWwSHZDreXgap1XShX6W+DCHQCqwCF7uZ88s6uTlD2cR3JBE77SegCmNtb1Idst+NfmwcdU6KVhw==
 
 promise-inflight@^1.0.1:
   version "1.0.1"
@@ -8673,7 +8678,7 @@
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
   integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
 
-psl@^1.1.24:
+psl@^1.1.24, psl@^1.1.28:
   version "1.1.29"
   resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
   integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==
@@ -8825,7 +8830,7 @@
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
   integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
 
-punycode@2.x.x, punycode@^2.1.0:
+punycode@2.x.x, punycode@^2.1.0, punycode@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
   integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
@@ -8835,13 +8840,13 @@
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
   integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
 
-purgecss-webpack-plugin@^1.2.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/purgecss-webpack-plugin/-/purgecss-webpack-plugin-1.3.1.tgz#530d30d4f27fe5515d2844addda0799c6bee45d0"
-  integrity sha512-RdiVF9AN6QNzx3yIqg1uUI8PcoUOeSkgTa9BS8pMZYXirBHizpuFvAZN2pKpmV9UoJ0cbBJS4watKFrhO8Td3A==
+purgecss-webpack-plugin@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/purgecss-webpack-plugin/-/purgecss-webpack-plugin-1.4.0.tgz#accf6f8f41a7d48fe830da16a4c94d1ab884d6c0"
+  integrity sha512-kCVR8RvmtJ6IwzxMBNFmAucItyvY6db0Ui5DBmQHCe8GvY2ST03a26wFCU8XwfzN8gpKUGZPyuD3OtL+9WOT0w==
   dependencies:
     purgecss "^1.1.0"
-    webpack-sources "^1.2.0"
+    webpack-sources "^1.3.0"
 
 purgecss@^1.1.0:
   version "1.1.0"
@@ -8970,7 +8975,7 @@
     parse-json "^4.0.0"
     pify "^3.0.0"
 
-"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6:
+"readable-stream@1 || 2", readable-stream@2, readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6:
   version "2.3.6"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
   integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -9309,7 +9314,7 @@
   dependencies:
     align-text "^0.1.1"
 
-rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+rimraf@2, rimraf@^2.2.8, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2:
   version "2.6.2"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
   integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==
@@ -9360,10 +9365,10 @@
   resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
   integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=
 
-rxjs@6.2.2:
-  version "6.2.2"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9"
-  integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==
+rxjs@^6.3.3:
+  version "6.3.3"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55"
+  integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==
   dependencies:
     tslib "^1.9.0"
 
@@ -9427,7 +9432,7 @@
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-schema-utils@^0.4.2, schema-utils@^0.4.4, schema-utils@^0.4.5:
+schema-utils@^0.4.2, schema-utils@^0.4.4:
   version "0.4.7"
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187"
   integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==
@@ -9462,10 +9467,10 @@
   resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d"
   integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=
 
-selenium-server@^3.14.0:
-  version "3.141.0"
-  resolved "https://registry.yarnpkg.com/selenium-server/-/selenium-server-3.141.0.tgz#20e550518a36a50d05f11741e6cdf6a0597c09c9"
-  integrity sha512-p58Zk2a1xNJumR5nm7vFXpd9U+hDrtwYdtM86qvVk3ZqGSEtCCjCgvdrVzPOYzJszZV4cY7pCBXKxMneLuHGGw==
+selenium-server@^3.141.59:
+  version "3.141.59"
+  resolved "https://registry.yarnpkg.com/selenium-server/-/selenium-server-3.141.59.tgz#cbefdf50aae636ee4c67b819532a8233ce3fd6b0"
+  integrity sha512-pL7T1YtAqOEXiBbTx0KdZMkE2U7PYucemd7i0nDLcxcR1APXYZlJfNr5hrvL3mZgwXb7AJEZPINzC6mDU3eP5g==
 
 selfsigned@^1.9.1:
   version "1.10.4"
@@ -9882,9 +9887,9 @@
   integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
 
 stack-utils@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620"
-  integrity sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
+  integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
 
 stackframe@^1.0.4:
   version "1.0.4"
@@ -9996,10 +10001,10 @@
     es-abstract "^1.4.3"
     function-bind "^1.0.2"
 
-string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
-  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+string_decoder@^1.0.0, string_decoder@^1.1.1:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d"
+  integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==
   dependencies:
     safe-buffer "~5.1.0"
 
@@ -10008,6 +10013,13 @@
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
   integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
 
+string_decoder@~1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+  integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+  dependencies:
+    safe-buffer "~5.1.0"
+
 strip-ansi@^3.0.0, strip-ansi@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -10136,9 +10148,9 @@
     string-width "^2.1.1"
 
 tapable@^1.0.0, tapable@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c"
-  integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e"
+  integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==
 
 tar@^2.0.0:
   version "2.2.1"
@@ -10150,9 +10162,9 @@
     inherits "2"
 
 tar@^4:
-  version "4.4.7"
-  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.7.tgz#14df45023ffdcd0c233befa2fc01ebb76ee39e7c"
-  integrity sha512-mR3MzsCdN0IEWjZRuF/J9gaWHnTwOvzjqPTcvi1xXgfKTDQRp39gRETPQEfPByAdEOGmZfx1HrRsn8estaEvtA==
+  version "4.4.8"
+  resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
+  integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
   dependencies:
     chownr "^1.1.1"
     fs-minipass "^1.2.5"
@@ -10162,7 +10174,7 @@
     safe-buffer "^5.1.2"
     yallist "^3.0.2"
 
-tcp-port-used@^1.0.0:
+tcp-port-used@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.1.tgz#46061078e2d38c73979a2c2c12b5a674e6689d70"
   integrity sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==
@@ -10185,9 +10197,9 @@
     worker-farm "^1.5.2"
 
 terser@^3.8.1:
-  version "3.10.11"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-3.10.11.tgz#e063da74b194dde9faf0a561f3a438c549d2da3f"
-  integrity sha512-iruZ7j14oBbRYJC5cP0/vTU7YOWjN+J1ZskEGoF78tFzXdkK2hbCL/3TRZN8XB+MuvFhvOHMp7WkOCBO4VEL5g==
+  version "3.11.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0"
+  integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ==
   dependencies:
     commander "~2.17.1"
     source-map "~0.6.1"
@@ -10224,11 +10236,11 @@
   integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
 
 through2@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
-  integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=
-  dependencies:
-    readable-stream "^2.1.5"
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+  integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+  dependencies:
+    readable-stream "~2.3.6"
     xtend "~4.0.1"
 
 through@^2.3.6:
@@ -10337,7 +10349,15 @@
   resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
   integrity sha1-LmhELZ9k7HILjMieZEOsbKqVACk=
 
-tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3:
+tough-cookie@>=2.3.3, tough-cookie@^2.3.4:
+  version "2.5.0"
+  resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+  integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+  dependencies:
+    psl "^1.1.28"
+    punycode "^2.1.1"
+
+tough-cookie@~2.4.3:
   version "2.4.3"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
   integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==
@@ -10436,14 +10456,6 @@
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
-uglify-es@^3.3.4:
-  version "3.3.9"
-  resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
-  integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==
-  dependencies:
-    commander "~2.13.0"
-    source-map "~0.6.1"
-
 uglify-js@3.4.x, uglify-js@^3.1.4:
   version "3.4.9"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
@@ -10467,20 +10479,6 @@
   resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
   integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=
 
-uglifyjs-webpack-plugin@^1.2.4:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de"
-  integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==
-  dependencies:
-    cacache "^10.0.4"
-    find-cache-dir "^1.0.0"
-    schema-utils "^0.4.5"
-    serialize-javascript "^1.4.0"
-    source-map "^0.6.1"
-    uglify-es "^3.3.4"
-    webpack-sources "^1.1.0"
-    worker-farm "^1.5.2"
-
 unicode-canonical-property-names-ecmascript@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@@ -10754,10 +10752,10 @@
   resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.1.tgz#b2d3d95402a811602380783ea4f566eb875569a2"
   integrity sha512-AA86yKZ5uOKz87/q1UpngEXhbRkaYg1b7HMMVRobNV1IVKqZe8oLIzo6iMocVwZXnYitlGwf2k4ZRLOZlS8oPQ==
 
-vue-jest@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.0.tgz#e5b0ad60c37bbeebe214124420de9eb911596cdc"
-  integrity sha512-naYRHx600YmwfUCoCUsbNlgQ6uk8L0Nn76bVZyMIJYOLlvS+f/1BqOX7ASXlYnNqNobYSC5AtWSlNzRBtYz/mw==
+vue-jest@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.1.tgz#127cded1a57cdfcf01fa8a10ce29579e2cb3a04d"
+  integrity sha512-otS+n341cTsp0pF7tuTu2x43b23x/+K0LZdAXV+ewKYIMZRqhuQaJTECWEt/cN/YZw2JC6hUM6xybdnOB4ZQ+g==
   dependencies:
     babel-plugin-transform-es2015-modules-commonjs "^6.26.0"
     chalk "^2.1.0"
@@ -10786,10 +10784,10 @@
   resolved "https://registry.yarnpkg.com/vue-resize/-/vue-resize-0.4.4.tgz#dee9b8dd1b189e7e3f6ec47f86c60694a241bb17"
   integrity sha512-Lb/cnE2N9Y42ZJPw8wpjkpuX5a9ReerWNGcQRcbNCwfCnkHG6++FurNNmLIdU8dcCTH4c5rtTPdxBqFoRMK2cQ==
 
-vue-router@^3.0.1:
-  version "3.0.1"
-  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9"
-  integrity sha512-vLLoY452L+JBpALMP5UHum9+7nzR9PeIBCghU9ZtJ1eWm6ieUI8Zb/DI3MYxH32bxkjzYV1LRjNv4qr8d+uX/w==
+vue-router@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.2.tgz#dedc67afe6c4e2bc25682c8b1c2a8c0d7c7e56be"
+  integrity sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg==
 
 vue-snotify@^3.2.1:
   version "3.2.1"
@@ -10978,7 +10976,7 @@
   dependencies:
     lodash "^4.17.5"
 
-webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0:
+webpack-sources@^1.1.0, webpack-sources@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
   integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==
@@ -10986,10 +10984,10 @@
     source-list-map "^2.0.0"
     source-map "~0.6.1"
 
-webpack@^4.23.1:
-  version "4.25.1"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.25.1.tgz#4f459fbaea0f93440dc86c89f771bb3a837cfb6d"
-  integrity sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA==
+webpack@^4.26.1:
+  version "4.26.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.26.1.tgz#ff3a9283d363c07b3494dfa702d08f4f2ef6cb39"
+  integrity sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug==
   dependencies:
     "@webassemblyjs/ast" "1.7.11"
     "@webassemblyjs/helper-module-context" "1.7.11"
@@ -11012,7 +11010,7 @@
     node-libs-browser "^2.0.0"
     schema-utils "^0.4.4"
     tapable "^1.1.0"
-    uglifyjs-webpack-plugin "^1.2.4"
+    terser-webpack-plugin "^1.1.0"
     watchpack "^1.5.0"
     webpack-sources "^1.3.0"
 
@@ -11037,9 +11035,9 @@
     iconv-lite "0.4.24"
 
 whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171"
-  integrity sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+  integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
 
 whatwg-url@^6.4.1:
   version "6.5.0"
@@ -11155,9 +11153,9 @@
     async-limiter "~1.0.0"
 
 ws@^6.0.0:
-  version "6.1.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.0.tgz#119a9dbf92c54e190ec18d10e871d55c95cf9373"
-  integrity sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==
+  version "6.1.2"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
+  integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
   dependencies:
     async-limiter "~1.0.0"
 
@@ -11197,9 +11195,9 @@
   integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
 
 yallist@^3.0.0, yallist@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
-  integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9"
+  integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==
 
 yargs-parser@^10.1.0:
   version "10.1.0"
@@ -11208,6 +11206,14 @@
   dependencies:
     camelcase "^4.1.0"
 
+yargs-parser@^11.1.1:
+  version "11.1.1"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4"
+  integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==
+  dependencies:
+    camelcase "^5.0.0"
+    decamelize "^1.2.0"
+
 yargs-parser@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
@@ -11222,7 +11228,7 @@
   dependencies:
     camelcase "^4.1.0"
 
-yargs@12.0.2, yargs@^12.0.1, yargs@^12.0.2:
+yargs@12.0.2:
   version "12.0.2"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc"
   integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==
@@ -11258,6 +11264,24 @@
     y18n "^3.2.1"
     yargs-parser "^9.0.2"
 
+yargs@^12.0.1, yargs@^12.0.2:
+  version "12.0.5"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13"
+  integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==
+  dependencies:
+    cliui "^4.0.0"
+    decamelize "^1.2.0"
+    find-up "^3.0.0"
+    get-caller-file "^1.0.1"
+    os-locale "^3.0.0"
+    require-directory "^2.1.1"
+    require-main-filename "^1.0.1"
+    set-blocking "^2.0.0"
+    string-width "^2.0.0"
+    which-module "^2.0.0"
+    y18n "^3.2.1 || ^4.0.0"
+    yargs-parser "^11.1.1"
+
 yargs@^7.0.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
--- a/pkg/controllers/importqueue.go	Mon Dec 03 16:14:18 2018 +0000
+++ b/pkg/controllers/importqueue.go	Tue Dec 04 12:52:31 2018 +0100
@@ -334,6 +334,39 @@
 INSERT INTO waterway.import_logs (import_id, msg) VALUES ($1, $2)`
 )
 
+func reviewImports(
+	reviews interface{},
+	req *http.Request,
+	conn *sql.Conn,
+) (JSONResult, error) {
+
+	rs := *reviews.(*[]models.Review)
+
+	type reviewResult struct {
+		ID      int64  `json:"id"`
+		Message string `json:"message,omitempty"`
+		Error   string `json:"error,omitempty"`
+	}
+
+	results := make([]reviewResult, len(rs))
+
+	for i := range rs {
+		rev := &rs[i]
+		msg, err := decideImport(req, conn, rev.ID, string(rev.State))
+		var errString string
+		if err != nil {
+			errString = err.Error()
+		}
+		results[i] = reviewResult{
+			ID:      rev.ID,
+			Message: msg,
+			Error:   errString,
+		}
+	}
+
+	return JSONResult{Result: results}, nil
+}
+
 func reviewImport(
 	_ interface{},
 	req *http.Request,
@@ -344,6 +377,27 @@
 	id, _ := strconv.ParseInt(vars["id"], 10, 64)
 	state := vars["state"]
 
+	var msg string
+	if msg, err = decideImport(req, conn, id, state); err != nil {
+		return
+	}
+
+	result := struct {
+		Message string `json:"message"`
+	}{
+		Message: msg,
+	}
+
+	jr = JSONResult{Result: &result}
+	return
+}
+
+func decideImport(
+	req *http.Request,
+	conn *sql.Conn,
+	id int64,
+	state string,
+) (message string, err error) {
 	ctx := req.Context()
 	var tx *sql.Tx
 	if tx, err = conn.BeginTx(ctx, nil); err != nil {
@@ -357,18 +411,12 @@
 	err = tx.QueryRowContext(ctx, isPendingSQL, id).Scan(&pending, &kind)
 	switch {
 	case err == sql.ErrNoRows:
-		err = JSONError{
-			Code:    http.StatusNotFound,
-			Message: fmt.Sprintf("Cannot find import #%d.", id),
-		}
+		err = fmt.Errorf("Cannot find import #%d.", id)
 		return
 	case err != nil:
 		return
 	case !pending:
-		err = JSONError{
-			Code:    http.StatusBadRequest,
-			Message: fmt.Sprintf("Import %d is not pending.", id),
-		}
+		err = fmt.Errorf("Import %d is not pending.", id)
 		return
 	}
 
@@ -407,13 +455,8 @@
 		return
 	}
 
-	result := struct {
-		Message string `json:"message"`
-	}{
-		Message: fmt.Sprintf("Import #%d successfully changed to state '%s'.",
-			id, state),
-	}
+	message = fmt.Sprintf(
+		"Import #%d successfully changed to state '%s'.", id, state)
 
-	jr = JSONResult{Result: &result}
 	return
 }
--- a/pkg/controllers/routes.go	Mon Dec 03 16:14:18 2018 +0000
+++ b/pkg/controllers/routes.go	Tue Dec 04 12:52:31 2018 +0100
@@ -182,6 +182,11 @@
 		Handle: importLogs,
 	})).Methods(http.MethodGet)
 
+	api.Handle("/imports", waterwayAdmin(&JSONHandler{
+		Input:  func() interface{} { return &[]models.Review{} },
+		Handle: reviewImports,
+	})).Methods(http.MethodPatch)
+
 	api.Handle("/imports/{id:[0-9]+}", waterwayAdmin(&JSONHandler{
 		Handle: deleteImport,
 	})).Methods(http.MethodDelete)
--- a/pkg/geoserver/boot.go	Mon Dec 03 16:14:18 2018 +0000
+++ b/pkg/geoserver/boot.go	Tue Dec 04 12:52:31 2018 +0100
@@ -537,6 +537,8 @@
 	return nil
 }
 
+// PrepareGeoServer sets up the GeoServer to work together with the gemma server.
+// It sets up a workspace, a datastore and exposes the features and styles.
 func PrepareGeoServer() error {
 
 	if config.DBUser() == "" {
@@ -564,6 +566,8 @@
 	return nil
 }
 
+// ReconfigureStyle returns a function to update a style
+// in the GeoServer to be in sync with the database.
 func ReconfigureStyle(name string) {
 	Reconfigure(func() error {
 		var stls styles
--- a/pkg/geoserver/reconf.go	Mon Dec 03 16:14:18 2018 +0000
+++ b/pkg/geoserver/reconf.go	Tue Dec 04 12:52:31 2018 +0100
@@ -72,6 +72,10 @@
 	return err
 }
 
+// Reconfigure adds a function to a queue of functions to update
+// the GeoServer async. The functions are run again a number
+// of times if network errors apppear indicating that the
+// GeoServer is down.
 func Reconfigure(fn func() error) {
 	confQueueCond.L.Lock()
 	defer confQueueCond.L.Unlock()
--- a/pkg/models/import.go	Mon Dec 03 16:14:18 2018 +0000
+++ b/pkg/models/import.go	Tue Dec 04 12:52:31 2018 +0100
@@ -15,6 +15,7 @@
 
 import (
 	"encoding/json"
+	"errors"
 	"time"
 )
 
@@ -36,8 +37,29 @@
 		Kind    string     `json:"kind"`
 		Message string     `json:"message"`
 	}
+
+	ReviewState string
+
+	Review struct {
+		ID    int64       `json:"id"`
+		State ReviewState `json:"state"`
+	}
 )
 
+var errInvalidReviewState = errors.New("state is wether 'accepted' nor 'declined'")
+
+func (rs *ReviewState) UnmarshalJSON(data []byte) error {
+	var s string
+	if err := json.Unmarshal(data, &s); err != nil {
+		return err
+	}
+	if s != "accepted" && s != "declined" {
+		return errInvalidReviewState
+	}
+	*rs = ReviewState(s)
+	return nil
+}
+
 func (it ImportTime) MarshalJSON() ([]byte, error) {
 	return json.Marshal(it.Format("2006-01-02T15:04:05"))
 }