diff --git a/.token.json b/.token.json
new file mode 100644
index 0000000000000000000000000000000000000000..6362b27ea746f4c3c814a36fcf8e611dde93e746
--- /dev/null
+++ b/.token.json
@@ -0,0 +1 @@
+{"oauthOptions":{"clientID":"e6c1051a9a73b2153511c725f600585b","clientName":"cli-client-9","clientKind":"","clientSecret":"F373BJTE5Uezr6lskyXjpzvreceBIfId","clientURI":"","registrationAccessToken":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJyZWdpc3RyYXRpb24iLCJpYXQiOjE1OTg4NjAwNTYsImlzcyI6ImNvenkudG9vbHM6ODA4MCIsInN1YiI6ImU2YzEwNTFhOWE3M2IyMTUzNTExYzcyNWY2MDA1ODViIn0.eBaaP3IyTu2-R6iJJzoR5uAlgMGNVTXG-hrvRW1xlfSMRCFrOBYi6VhzYYPE2Gew93qe8j97pRxIfuAj-AX5iw","redirectURI":"http://localhost:3333/do_access","softwareID":"dev-connector","softwareVersion":"","logoURI":"","policyURI":"","notificationPlatform":"","notificationDeviceToken":""},"token":{"tokenType":"bearer","accessToken":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhY2Nlc3MiLCJpYXQiOjE1OTg4NjAwNjAsImlzcyI6ImNvenkudG9vbHM6ODA4MCIsInN1YiI6ImU2YzEwNTFhOWE3M2IyMTUzNTExYzcyNWY2MDA1ODViIiwic2NvcGUiOiJpby5jb3p5LmFwcHMgaW8uY296eS5zZXR0aW5ncyBpby5jb3p5LmFjY291bnRzIGlvLmNvenkua29ubmVjdG9ycyBpby5jb3p5LnRyaWdnZXJzIGlvLmNvenkuam9icyBjb20uZ3JhbmRseW9uLmVuZWRpcy4qIGNvbS5ncmFuZGx5b24uZ3JkZi4qIGNvbS5ncmFuZGx5b24uZWdsLiogY29tLmdyYW5kbHlvbi5lY29seW8uKiJ9.fYEG_VXhI3Yl_GKs248AF2oMU4d0uEnIavZgQoGGIEycovIbQHylC2D9j0O9oU6rsBm9Ewu8v23ZI5YwcTZxSA","refreshToken":"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJyZWZyZXNoIiwiaWF0IjoxNTk4ODYwMDYwLCJpc3MiOiJjb3p5LnRvb2xzOjgwODAiLCJzdWIiOiJlNmMxMDUxYTlhNzNiMjE1MzUxMWM3MjVmNjAwNTg1YiIsInNjb3BlIjoiaW8uY296eS5hcHBzIGlvLmNvenkuc2V0dGluZ3MgaW8uY296eS5hY2NvdW50cyBpby5jb3p5Lmtvbm5lY3RvcnMgaW8uY296eS50cmlnZ2VycyBpby5jb3p5LmpvYnMgY29tLmdyYW5kbHlvbi5lbmVkaXMuKiBjb20uZ3JhbmRseW9uLmdyZGYuKiBjb20uZ3JhbmRseW9uLmVnbC4qIGNvbS5ncmFuZGx5b24uZWNvbHlvLioifQ.3DvqlWeJz-urjyb-rUATiUaz_ITo4GaOt2Hrp6loZ7yyW17qnh9XtkQwIm68cqe4ZrrWbb219-3q1ANy9SOhrg","scope":"io.cozy.apps io.cozy.settings io.cozy.accounts io.cozy.konnectors io.cozy.triggers io.cozy.jobs com.grandlyon.enedis.* com.grandlyon.grdf.* com.grandlyon.egl.* com.grandlyon.ecolyo.*"}}
\ No newline at end of file
diff --git a/app.config.environment.dev.js b/app.config.environment.dev.js
new file mode 100644
index 0000000000000000000000000000000000000000..89351061569e9cdffa4006144c6bf1dcb23f1a31
--- /dev/null
+++ b/app.config.environment.dev.js
@@ -0,0 +1,54 @@
+'use strict'
+
+const webpack = require('webpack')
+const merge = require('webpack-merge')
+const { useHotReload, devtool } = require('cozy-scripts/config/webpack.vars')
+
+let plugins = [
+  new webpack.DefinePlugin({
+    __DEVELOPMENT__: true,
+  }),
+]
+
+// In development, the bar and cozy-client-js are provided automatically. We use the ProvidePlugin
+// since it allows us to use in production the cozy.bar and cozy.client declared by the <script />
+// line injected by the stack, while in developement to have it "served" from
+// our node_modules
+const stackProvidedLibsConfig = {
+  plugins: [
+    new webpack.DefinePlugin({
+      __STACK_ASSETS__: true,
+    }),
+  ],
+  module: {
+    rules: [
+      {
+        test: /cozy-bar(\/|\\)dist(\/|\\)cozy-bar\.min\.js$/,
+        // Automatically import the CSS if the JS is imported.
+        // imports-loader@0.8.0 works but imports-loader@1.0.0 does not
+        loader: 'imports-loader?css=./cozy-bar.min.css',
+      },
+    ],
+  },
+}
+
+const output = {}
+if (useHotReload) {
+  plugins = plugins.concat([new webpack.HotModuleReplacementPlugin()])
+  output.globalObject = 'this'
+}
+
+module.exports = merge(
+  {
+    devtool: devtool || 'cheap-module-eval-source-map',
+    mode: 'development',
+    externals: ['cozy'],
+    plugins,
+    output,
+    optimization: {
+      removeAvailableModules: false,
+      removeEmptyChunks: false,
+    },
+  },
+  stackProvidedLibsConfig
+)
diff --git a/app.config.js b/app.config.js
index e358ccca9f01aef0b999a736a209bd143d53ec1b..ab21d2835e48b5b0fed0889f79e3ab55bcb8ccab 100644
--- a/app.config.js
+++ b/app.config.js
@@ -24,18 +24,19 @@ const configs = [
   require('cozy-scripts/config/webpack.config.intents'),
   require('cozy-scripts/config/webpack.config.public'),
   require('cozy-scripts/config/webpack.config.pictures'),
-  require('cozy-scripts/config/webpack.config.assets'),
+  require('cozy-scripts/config/webpack.config.vendors'),
   require('cozy-scripts/config/webpack.config.manifest'),
   require('cozy-scripts/config/webpack.config.progress'),
   addAnalyzer ? require('cozy-scripts/config/webpack.config.analyzer') : null,
-  require('cozy-scripts/config/webpack.config.services'),
+  // require('cozy-scripts/config/webpack.config.services'),
+  require('./app.config.services'), // Override the services config
   require(`cozy-scripts/config/webpack.target.${target}`),
 ]
 
 if (environment === 'production') {
   configs.push(require('cozy-scripts/config/webpack.environment.prod'))
 } else {
-  configs.push(require('cozy-scripts/config/webpack.environment.dev'))
+  configs.push(require('./app.config.environment.dev'))
 }
 
 //module.exports = merge.apply(null, configs)
diff --git a/app.config.react.js b/app.config.react.js
index ad7fba4510f43342feff1f3f6e372cb289dc701d..5fc8e0046410637bb222b1c733ef0081c523004a 100644
--- a/app.config.react.js
+++ b/app.config.react.js
@@ -22,7 +22,7 @@ module.exports = {
     rules: [
       {
         test: /\.(ts|js)x?$/, // Add TS extensions
-        exclude: /node_modules\/(?!(cozy-ui))/,
+        exclude: /node_modules(\/|\\)(?!(cozy-ui))/,
         loader: require.resolve('cozy-scripts/node_modules/babel-loader'), // Add full path
         options: {
           cacheDirectory: 'node_modules/.cache/babel-loader/react',
diff --git a/app.config.services.js b/app.config.services.js
new file mode 100644
index 0000000000000000000000000000000000000000..f57c7eee54b045b1ce8d1047fef8a8b8100aa2dc
--- /dev/null
+++ b/app.config.services.js
@@ -0,0 +1,91 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
+'use strict'
+
+/**
+ * This file overrides the default services webpack config.
+ * This services config enables the use of TypeScript.
+ *
+ * @override node_modules/cozy-scripts/config/webpack.config.services.js
+ */
+
+const webpack = require('webpack')
+const path = require('path')
+const fs = require('fs-extra')
+const paths = require('cozy-scripts/utils/paths')
+const {
+  eslintFix,
+  getFilename,
+  target,
+} = require('cozy-scripts/config/webpack.vars')
+
+const servicesFolder = paths.appServicesFolder()
+const servicesPaths = fs.existsSync(servicesFolder)
+  ? fs.readdirSync(servicesFolder)
+  : []
+
+const servicesEntries = {}
+servicesPaths.forEach(file => {
+  if (!file.match(/^[^.]*.ts$/)) return
+  const filename = file.match(/^([^.]*).ts$/)[1]
+  servicesEntries[filename] = path.resolve(path.join(servicesFolder, file))
+})
+
+const config = {
+  __mergeStrategy: {
+    smart: false,
+    strategy: {
+      plugins: 'replace',
+      output: 'replace',
+      entry: 'replace',
+      optimization: 'replace',
+      module: 'replace',
+      externals: 'replace',
+    },
+  },
+  entry: servicesEntries,
+  output: {
+    path: paths.appServicesBuild(),
+    filename: `${getFilename(false)}.js`,
+  },
+  target: 'node',
+  optimization: {}, // reset optimization property
+  devtool: false,
+  externals: [], // reset externals property
+  module: {
+    rules: [
+      {
+        enforce: 'pre',
+        test: /\.ts$/,
+        loader: require.resolve('cozy-scripts/node_modules/eslint-loader'),
+        exclude: /node_modules/,
+        options: {
+          extends: ['cozy-app'],
+          fix: eslintFix,
+          emitWarning: true,
+        },
+      },
+      {
+        test: /\.ts$/,
+        exclude: /(node_modules|cozy-(bar|client-js))/,
+        loader: require.resolve('cozy-scripts/node_modules/babel-loader'),
+        options: {
+          cacheDirectory: 'cozy-scripts/node_modules/.cache/babel-loader/node',
+          babelrc: false,
+          presets: [['cozy-app', { node: true, react: false }]],
+        },
+      },
+    ],
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      __TARGET__: JSON.stringify('services'),
+    }),
+  ],
+}
+
+/* We don't build services if no services and if on mobile build */
+const addServicesConfig =
+  target === 'browser' && Object.keys(servicesEntries).length
+
+// only for browser target (services are usable only on cozy-stack)
+module.exports = addServicesConfig ? { multiple: { services: config } } : {}
diff --git a/config.json b/config.json
index 2984308a115be5b06c643a6b4cb842772fc4cfcd..97b6afd35d485ef36d3b7a831733288265a4bed6 100644
--- a/config.json
+++ b/config.json
@@ -9,10 +9,9 @@
         "name": "Enedis",
         "type": "ELECTRICITY",
         "oauth": true,
-        "slug": "enedisgrandlyon",
-        "cron": "0 30 6 * * *"
+        "slug": "enedisgrandlyon"
       },
-      "siteLink": "https://mon-compte-client.enedis.fr/"
+      "siteLink": "https://mon-compte-particulier.enedis.fr/donnees/"
     },
     {
       "fluidTypeId": 1,
@@ -23,8 +22,7 @@
         "name": "Eau du Grand Lyon",
         "type": "WATER",
         "oauth": false,
-        "slug": "eglgrandlyon",
-        "cron": "0 30 6 * * *"
+        "slug": "eglgrandlyon"
       },
       "siteLink": "https://agence.eaudugrandlyon.com/inscription.aspx"
     },
@@ -37,8 +35,7 @@
         "name": "GRDF",
         "type": "GAS",
         "oauth": false,
-        "slug": "grdfgrandlyon",
-        "cron": "0 30 6 * * *"
+        "slug": "grdfgrandlyon"
       },
       "siteLink": "https://monespace.grdf.fr/monespace/connexion"
     }
diff --git a/konnector-dev-config.json b/konnector-dev-config.json
new file mode 100644
index 0000000000000000000000000000000000000000..10ca55a3767664acf807dd1c9ef2ddd966238fb6
--- /dev/null
+++ b/konnector-dev-config.json
@@ -0,0 +1,4 @@
+{
+  "COZY_URL": "http://cozy.tools:8080",
+  "fields": {}
+}
\ No newline at end of file
diff --git a/manifest.webapp b/manifest.webapp
index cd41c91e7791b705a999b6a6b6536377a0cf30d6..a87b9627ebe4cebacdf2319ec1cb138d7a63b5c8 100644
--- a/manifest.webapp
+++ b/manifest.webapp
@@ -3,7 +3,7 @@
   "slug": "ecolyo",
   "icon": "icon.svg",
   "categories": ["energy"],
-  "version": "0.1.9",
+  "version": "0.2.0",
   "licence": "AGPL-3.0",
   "editor": "Métropole de Lyon",
   "default_locale": "fr",
diff --git a/package.json b/package.json
index 9b3078f2a6497ba92e4a5e726f6526f2070ba367..b08ff042f9eb45b8e9b465a60679df109a450239 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
 {
   "name": "ecolyo",
-  "version": "0.1.9",
+  "version": "0.2.0",
   "scripts": {
     "tx": "tx pull --all || true",
     "lint": "yarn lint:js && yarn lint:styles",
-    "lint:js": "cs lint '{src,test}/**/*.{js,jsx,ts,tsx}'",
+    "lint:js": "cs lint {src,test}/**/*.{js,jsx,ts,tsx}",
     "lint:styles": "stylint src/styles --config ./.stylintrc",
     "prebuild": "yarn lint",
     "build:cs": "build:browser",
@@ -25,7 +25,8 @@
     "release": "standard-version --no-verify",
     "winstack": "start powershell -command docker run --rm -it -p 8080:8080 -p 5984:5984 -p 8025:8025 -v $PWD/build:/data/cozy-app/ecolyo -v $PWD/data/konnectors_sources/:/data/cozy_konnectors/ -v $PWD/data:/usr/local/couchdb/data -v $PWD/docker/disableCSP.yaml:/etc/cozy/cozy.yaml registry.forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/cozy-env",
     "linuxstack": "docker run --rm -it -p 8080:8080 -p 5984:5984 -p 8025:8025 -v $(pwd)/build:/data/cozy-app/ecolyo -v ~/cozy/data/db/konnectors_sources/:/data/cozy_konnectors/ -v ~/cozy/data/db:/usr/local/couchdb/data -v ~/cozy/data/storage:/data/cozy-storage -v $(pwd)/docker/disableCSP.yaml:/etc/cozy/cozy.yaml registry.forge.grandlyon.com/web-et-numerique/llle_project/ecolyo/cozy-env",
-    "load-data": "cd test && importData.bat"
+    "load-data": "cd test && importData.bat",
+    "start-stack": "cs start --hot --browser --stack"
   },
   "repository": {
     "type": "git",
@@ -40,15 +41,19 @@
   "homepage": "https://forge.grandlyon.com/web-et-numerique/llle_project/ecolyo#readme",
   "devDependencies": {
     "@babel/preset-typescript": "^7.7.4",
+    "@types/classnames": "^2.2.10",
     "@types/d3": "^5.7.2",
     "@types/lodash": "^4.14.149",
     "@types/luxon": "^1.21.0",
+    "@types/node-fetch": "^2.5.7",
     "@types/react": "^16.9.15",
+    "@types/react-dom": "^16.9.8",
     "@types/react-router-dom": "^5.1.3",
     "@typescript-eslint/eslint-plugin": "^2.10.0",
     "@typescript-eslint/parser": "^2.10.0",
     "babel-preset-cozy-app": "1.5.2",
     "cozy-app-publish": "^0.22.3",
+    "cozy-jobs-cli": "^1.13.6",
     "enzyme": "3.10.0",
     "enzyme-adapter-react-16": "1.14.0",
     "eslint": "^6.7.2",
@@ -81,10 +86,11 @@
     "@types/react-lottie": "^1.2.3",
     "axios": "^0.19.0",
     "cozy-bar": "^7.7.10",
-    "cozy-client": "6.49.0",
-    "cozy-harvest-lib": "^1.15.3",
-    "cozy-scripts": "2.0.2",
-    "cozy-ui": "21.7.0",
+    "cozy-client": "13.18.0",
+    "cozy-harvest-lib": "2.16.0",
+    "cozy-realtime": "3.10.5",
+    "cozy-scripts": "4.3.3",
+    "cozy-ui": "35.45.0",
     "d3": "^5.15.0",
     "detect-browser": "^5.1.1",
     "eslint-config-cozy-app": "1.1.12",
@@ -95,11 +101,12 @@
     "moment-timezone": "^0.5.27",
     "node-sass": "^4.13.0",
     "object-hash": "^2.0.3",
-    "react": "16.8.6",
-    "react-dom": "16.8.6",
+    "react": "16.12.0",
+    "react-dom": "16.12.0",
     "react-lottie": "^1.2.3",
-    "react-router-dom": "5.0.1",
+    "react-router-dom": "5.2.0",
     "react-swipeable-views": "0.13.4",
+    "recoil": "^0.0.13",
     "sass-loader": "^8.0.0"
   },
   "husky": {
diff --git a/src/assets/icons/ico/coins.svg b/src/assets/icons/ico/coins.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1a398fdce675c429f39f37a01f8fcb555c940b7e
--- /dev/null
+++ b/src/assets/icons/ico/coins.svg
@@ -0,0 +1,83 @@
+<svg width="35" height="35" viewBox="0 0 35 35" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.78865 33.3019C3.32505 33.233 3 32.8332 3 32.3645L3 30.1667C3 29.6144 3.44772 29.1667 4 29.1667L31.1667 29.1667C31.719 29.1667 32.1667 29.6144 32.1667 30.1667L32.1667 32.3645C32.1667 32.8332 31.8416 33.233 31.378 33.3019C29.7904 33.5379 25.651 34.0001 17.5833 34.0001C9.51564 34.0001 5.37631 33.5379 3.78865 33.3019Z" fill="url(#paint0_linear)"/>
+<path d="M3 32.3645C3 32.8332 3.32505 33.2329 3.78865 33.3018C5.37631 33.5378 9.51564 34 17.5833 34C25.651 34 29.7904 33.5378 31.378 33.3018C31.8416 33.2329 32.1667 32.8332 32.1667 32.3645L32.1667 31.5311C32.1667 31.9998 31.8416 32.3996 31.378 32.4685C29.7904 32.7045 25.651 33.1666 17.5833 33.1666C9.51564 33.1666 5.37631 32.7045 3.78865 32.4685C3.32505 32.3996 3 31.9998 3 31.5311L3 32.3645Z" fill="#A95508"/>
+<path d="M3.83333 29.1666C3.3731 29.1666 3 28.7935 3 28.3333L32.1667 28.3333C32.1667 28.7935 31.7936 29.1666 31.3333 29.1666L3.83333 29.1666Z" fill="#A95508"/>
+<path d="M3 28.3333L3 25.1666C3 24.6144 3.44772 24.1666 4 24.1666L31.1667 24.1666C31.719 24.1666 32.1667 24.6144 32.1667 25.1666L32.1667 28.3333L3 28.3333Z" fill="url(#paint1_linear)"/>
+<path d="M3.83333 24.1666C3.37309 24.1666 3 23.7935 3 23.3333L32.1667 23.3333C32.1667 23.7935 31.7936 24.1666 31.3333 24.1666L3.83333 24.1666Z" fill="#A95508"/>
+<path d="M3 23.3333L3 20.1666C3 19.6144 3.44772 19.1666 4 19.1666L31.1667 19.1666C31.719 19.1666 32.1667 19.6144 32.1667 20.1666L32.1667 23.3333L3 23.3333Z" fill="url(#paint2_linear)"/>
+<path d="M3.83333 19.1666C3.3731 19.1666 3 18.7935 3 18.3333L32.1667 18.3333C32.1667 18.7935 31.7936 19.1666 31.3333 19.1666L3.83333 19.1666Z" fill="#A95508"/>
+<path d="M3 18.3333L3 15.1666C3 14.6144 3.44772 14.1666 4 14.1666L31.1667 14.1666C31.719 14.1666 32.1667 14.6144 32.1667 15.1666L32.1667 18.3333L3 18.3333Z" fill="url(#paint3_linear)"/>
+<path d="M3.83333 14.1667C3.3731 14.1667 3 13.7936 3 13.3334L32.1667 13.3334C32.1667 13.7936 31.7936 14.1667 31.3333 14.1667L3.83333 14.1667Z" fill="#A95508"/>
+<path d="M3 13.3334L3 10.1667C3 9.61442 3.44772 9.16671 4 9.16671L31.1667 9.16671C31.719 9.16671 32.1667 9.61442 32.1667 10.1667L32.1667 13.3334L3 13.3334Z" fill="url(#paint4_linear)"/>
+<path d="M3.875 9.16669C3.39175 9.16669 3 8.77494 3 8.29169L32.1667 8.29169C32.1667 8.77494 31.7749 9.16669 31.2917 9.16669L3.875 9.16669Z" fill="#A95508"/>
+<path d="M3 8.29169L3 4.04168C3 3.48939 3.44772 3.04168 4 3.04168L31.1667 3.04168C31.719 3.04168 32.1667 3.48939 32.1667 4.04168L32.1667 8.29169L3 8.29169Z" fill="url(#paint5_linear)"/>
+<path d="M32.1667 3.47919C32.1667 4.20406 23.4167 4.79169 17.5833 4.79169C11.75 4.79169 3 4.20406 3 3.47919C3 2.75431 9.52918 2.16669 17.5833 2.16669C25.6375 2.16669 32.1667 2.75431 32.1667 3.47919Z" fill="#FECA81"/>
+<defs>
+<linearGradient id="paint0_linear" x1="32.167" y1="31.2552" x2="3.00036" y2="31.2552" gradientUnits="userSpaceOnUse">
+<stop stop-color="#F2AA32"/>
+<stop offset="0.0677083" stop-color="#B3653D"/>
+<stop offset="0.1719" stop-color="#F8B116"/>
+<stop offset="0.3438" stop-color="#EBB12A"/>
+<stop offset="0.5417" stop-color="#9E5810"/>
+<stop offset="0.6771" stop-color="#E2AF0A"/>
+<stop offset="0.7969" stop-color="#FBE05B"/>
+<stop offset="0.8854" stop-color="#DC972D"/>
+<stop offset="1" stop-color="#EBC50B"/>
+</linearGradient>
+<linearGradient id="paint1_linear" x1="32.167" y1="26.2552" x2="3.00036" y2="26.2552" gradientUnits="userSpaceOnUse">
+<stop stop-color="#F2AA32"/>
+<stop offset="0.0677083" stop-color="#B3653D"/>
+<stop offset="0.1719" stop-color="#F8B116"/>
+<stop offset="0.3438" stop-color="#EBB12A"/>
+<stop offset="0.5417" stop-color="#9E5810"/>
+<stop offset="0.6771" stop-color="#E2AF0A"/>
+<stop offset="0.7969" stop-color="#FBE05B"/>
+<stop offset="0.8854" stop-color="#DC972D"/>
+<stop offset="1" stop-color="#EBC50B"/>
+</linearGradient>
+<linearGradient id="paint2_linear" x1="32.167" y1="21.2552" x2="3.00036" y2="21.2552" gradientUnits="userSpaceOnUse">
+<stop stop-color="#F2AA32"/>
+<stop offset="0.0677083" stop-color="#B3653D"/>
+<stop offset="0.1719" stop-color="#F8B116"/>
+<stop offset="0.3438" stop-color="#EBB12A"/>
+<stop offset="0.5417" stop-color="#9E5810"/>
+<stop offset="0.6771" stop-color="#E2AF0A"/>
+<stop offset="0.7969" stop-color="#FBE05B"/>
+<stop offset="0.8854" stop-color="#DC972D"/>
+<stop offset="1" stop-color="#EBC50B"/>
+</linearGradient>
+<linearGradient id="paint3_linear" x1="32.167" y1="16.2552" x2="3.00036" y2="16.2552" gradientUnits="userSpaceOnUse">
+<stop stop-color="#F2AA32"/>
+<stop offset="0.0677083" stop-color="#B3653D"/>
+<stop offset="0.1719" stop-color="#F8B116"/>
+<stop offset="0.3438" stop-color="#EBB12A"/>
+<stop offset="0.5417" stop-color="#9E5810"/>
+<stop offset="0.6771" stop-color="#E2AF0A"/>
+<stop offset="0.7969" stop-color="#FBE05B"/>
+<stop offset="0.8854" stop-color="#DC972D"/>
+<stop offset="1" stop-color="#EBC50B"/>
+</linearGradient>
+<linearGradient id="paint4_linear" x1="32.167" y1="11.2552" x2="3.00036" y2="11.2552" gradientUnits="userSpaceOnUse">
+<stop stop-color="#F2AA32"/>
+<stop offset="0.0677083" stop-color="#B3653D"/>
+<stop offset="0.1719" stop-color="#F8B116"/>
+<stop offset="0.3438" stop-color="#EBB12A"/>
+<stop offset="0.5417" stop-color="#9E5810"/>
+<stop offset="0.6771" stop-color="#E2AF0A"/>
+<stop offset="0.7969" stop-color="#FBE05B"/>
+<stop offset="0.8854" stop-color="#DC972D"/>
+<stop offset="1" stop-color="#EBC50B"/>
+</linearGradient>
+<linearGradient id="paint5_linear" x1="32.167" y1="5.67322" x2="3.00036" y2="5.67322" gradientUnits="userSpaceOnUse">
+<stop stop-color="#F2AA32"/>
+<stop offset="0.0677083" stop-color="#B3653D"/>
+<stop offset="0.1719" stop-color="#F8B116"/>
+<stop offset="0.3438" stop-color="#EBB12A"/>
+<stop offset="0.5417" stop-color="#9E5810"/>
+<stop offset="0.6771" stop-color="#E2AF0A"/>
+<stop offset="0.7969" stop-color="#FBE05B"/>
+<stop offset="0.8854" stop-color="#DC972D"/>
+<stop offset="1" stop-color="#EBC50B"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/src/assets/icons/ico/warn-cross.svg b/src/assets/icons/ico/warn-cross.svg
new file mode 100644
index 0000000000000000000000000000000000000000..38df8d8a7e717e9225e466dd8d6a7ac43e9d19d2
--- /dev/null
+++ b/src/assets/icons/ico/warn-cross.svg
@@ -0,0 +1,4 @@
+<svg width="42" height="40" viewBox="0 0 42 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M3.64258 36.1825L38.3566 3" stroke="#D25959" stroke-width="8"/>
+<path d="M38.3567 36.1825L3.64269 3" stroke="#D25959" stroke-width="8"/>
+</svg>
diff --git a/src/assets/icons/ico/warning-white.svg b/src/assets/icons/ico/warning-white.svg
new file mode 100644
index 0000000000000000000000000000000000000000..21e2fc158675ab964e3a95c81deec69b22525b4f
--- /dev/null
+++ b/src/assets/icons/ico/warning-white.svg
@@ -0,0 +1,3 @@
+<svg width="63" height="55" viewBox="0 0 63 55" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M33.3426 1.11412C32.4849 -0.37137 30.3408 -0.371375 29.4832 1.11412L0.301852 51.6576C-0.555796 53.1431 0.516259 55 2.23156 55H60.5942C62.3095 55 63.3816 53.1431 62.5239 51.6576L33.3426 1.11412ZM29.1746 32.5018V20.8405H33.5604V32.5018C33.5604 33.4617 33.505 34.4163 33.3941 35.3657C33.2832 36.3047 33.137 37.2646 32.9555 38.2453H29.7795C29.598 37.2646 29.4518 36.3047 29.3409 35.3657C29.23 34.4163 29.1746 33.4617 29.1746 32.5018ZM33.878 42.8463C34.0091 43.1698 34.0747 43.5193 34.0747 43.8949C34.0747 44.2705 34.0091 44.6252 33.878 44.9591C33.7369 45.2825 33.5504 45.5642 33.3185 45.8042C33.0765 46.0441 32.7942 46.2319 32.4715 46.3675C32.1489 46.5032 31.796 46.571 31.4129 46.571C31.0398 46.571 30.692 46.5032 30.3693 46.3675C30.0467 46.2319 29.7644 46.0441 29.5224 45.8042C29.2804 45.5642 29.0939 45.2825 28.9628 44.9591C28.8217 44.6252 28.7511 44.2705 28.7511 43.8949C28.7511 43.5193 28.8217 43.1698 28.9628 42.8463C29.0939 42.5229 29.2804 42.2412 29.5224 42.0013C29.7644 41.7613 30.0467 41.5735 30.3693 41.4379C30.692 41.2918 31.0398 41.2188 31.4129 41.2188C31.796 41.2188 32.1489 41.2918 32.4715 41.4379C32.7942 41.5735 33.0765 41.7613 33.3185 42.0013C33.5504 42.2412 33.7369 42.5229 33.878 42.8463Z" fill="#FFFFFF"/>
+</svg>
diff --git a/src/assets/icons/tabbar/conso/off.svg b/src/assets/icons/tabbar/conso/conso-off.svg
similarity index 100%
rename from src/assets/icons/tabbar/conso/off.svg
rename to src/assets/icons/tabbar/conso/conso-off.svg
diff --git a/src/assets/icons/tabbar/conso/on.svg b/src/assets/icons/tabbar/conso/conso-on.svg
similarity index 100%
rename from src/assets/icons/tabbar/conso/on.svg
rename to src/assets/icons/tabbar/conso/conso-on.svg
diff --git a/src/assets/icons/tabbar/defi/off.svg b/src/assets/icons/tabbar/defi/defi-off.svg
similarity index 100%
rename from src/assets/icons/tabbar/defi/off.svg
rename to src/assets/icons/tabbar/defi/defi-off.svg
diff --git a/src/assets/icons/tabbar/defi/on.svg b/src/assets/icons/tabbar/defi/defi-on.svg
similarity index 100%
rename from src/assets/icons/tabbar/defi/on.svg
rename to src/assets/icons/tabbar/defi/defi-on.svg
diff --git a/src/assets/icons/tabbar/defi/off-notif.svg b/src/assets/icons/tabbar/defi/off-notif.svg
deleted file mode 100644
index c4f4f42c5dc44cc279967480164b685a82e67efc..0000000000000000000000000000000000000000
--- a/src/assets/icons/tabbar/defi/off-notif.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg width="50" height="36" viewBox="0 0 50 36" fill="none" xmlns="http://www.w3.org/2000/svg">
-<path fill-rule="evenodd" clip-rule="evenodd" d="M25.0352 10.1551L24.5 9.80511L23.9527 10.1631C21.8729 11.5233 19.6608 12.3222 17.1758 12.4368L16.2772 12.4783L16.2236 13.3762C16.2058 13.6743 16.1874 13.9705 16.1691 14.2647L16.1691 14.2647C15.9702 17.4643 15.7863 20.4211 16.6118 22.9662C17.5579 25.8831 19.7604 28.1383 24.1208 29.9253L24.5 30.0807L24.8793 29.9253C29.2396 28.1383 31.4422 25.8831 32.3883 22.9662C32.6159 22.2645 32.7667 21.5316 32.8617 20.7709C32.5306 20.6987 32.2056 20.6102 31.8876 20.5062C31.4776 24.0783 29.7971 26.8291 24.5 29C16.4666 25.7077 16.7515 21.0816 17.1704 14.2794C17.1875 14.0018 17.2049 13.7206 17.2218 13.4358C19.9078 13.3119 22.2906 12.4449 24.5 11C24.6673 11.1094 24.8356 11.2155 25.005 11.3182C25.0017 11.2125 25 11.1065 25 11C25 10.7154 25.0119 10.4336 25.0352 10.1551Z" fill="#A0A0A0"/>
-<circle cx="35" cy="11" r="9" fill="#58FFFF"/>
-<circle cx="35" cy="11" r="9" fill="url(#paint0_radial)" fill-opacity="0.5"/>
-<defs>
-<radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(34.9419 14.75) rotate(-90) scale(11.625 18.945)">
-<stop stop-color="#0199A3"/>
-<stop offset="1" stop-color="white" stop-opacity="0"/>
-</radialGradient>
-</defs>
-</svg>
diff --git a/src/assets/icons/tabbar/ecogeste/off.svg b/src/assets/icons/tabbar/ecogeste/ecogeste-off.svg
similarity index 100%
rename from src/assets/icons/tabbar/ecogeste/off.svg
rename to src/assets/icons/tabbar/ecogeste/ecogeste-off.svg
diff --git a/src/assets/icons/tabbar/ecogeste/on.svg b/src/assets/icons/tabbar/ecogeste/ecogeste-on.svg
similarity index 100%
rename from src/assets/icons/tabbar/ecogeste/on.svg
rename to src/assets/icons/tabbar/ecogeste/ecogeste-on.svg
diff --git a/src/assets/icons/tabbar/parametre/off.svg b/src/assets/icons/tabbar/parametre/parametre-off.svg
similarity index 100%
rename from src/assets/icons/tabbar/parametre/off.svg
rename to src/assets/icons/tabbar/parametre/parametre-off.svg
diff --git a/src/assets/icons/tabbar/parametre/on.svg b/src/assets/icons/tabbar/parametre/parametre-on.svg
similarity index 100%
rename from src/assets/icons/tabbar/parametre/on.svg
rename to src/assets/icons/tabbar/parametre/parametre-on.svg
diff --git a/src/assets/icons/tabbar/profile/profile-off.svg b/src/assets/icons/tabbar/profile/profile-off.svg
new file mode 100644
index 0000000000000000000000000000000000000000..4fc19edd02653eb34830cac2f699a3cb5a17cfe7
--- /dev/null
+++ b/src/assets/icons/tabbar/profile/profile-off.svg
@@ -0,0 +1,4 @@
+<svg width="64" height="36" viewBox="0 0 64 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="31.5" cy="15.5" r="6" stroke="#ABABAB"/>
+<path d="M26.3256 22.6206L26.1536 22.4729L25.9292 22.505C24.0866 22.7686 22.7128 23.7203 21.8109 25.0837C20.9172 26.4346 20.5 28.1667 20.5 30V31V31.3904L20.8787 31.485L21 31C20.8787 31.485 20.8788 31.4851 20.879 31.4851L20.8793 31.4852L20.8802 31.4854L20.8831 31.4861L20.8933 31.4886L20.9311 31.4977C20.964 31.5055 21.0122 31.5167 21.0753 31.5309C21.2015 31.5591 21.3874 31.5991 21.63 31.6468C22.1154 31.7423 22.8279 31.8689 23.7442 31.9953C25.5765 32.248 28.2245 32.5 31.5 32.5C34.7755 32.5 37.4235 32.248 39.2558 31.9953C40.1721 31.8689 40.8846 31.7423 41.37 31.6468C41.6126 31.5991 41.7985 31.5591 41.9247 31.5309C41.9878 31.5167 42.036 31.5055 42.0689 31.4977L42.1067 31.4886L42.1169 31.4861L42.1198 31.4854L42.1207 31.4852L42.121 31.4851C42.1212 31.4851 42.1213 31.485 42 31L42.1213 31.485L42.5 31.3904V31V30C42.5 28.1667 42.0828 26.4346 41.1891 25.0837C40.2872 23.7203 38.9134 22.7686 37.0708 22.505L36.8816 22.478L36.7226 22.584C36.4258 22.7819 36.1612 22.9836 35.9205 23.1671C35.8447 23.2249 35.7713 23.2809 35.7 23.3344C35.3955 23.5628 35.1112 23.7604 34.7764 23.9278C34.1181 24.2569 33.2019 24.5 31.5 24.5C29.6215 24.5 27.5528 23.6738 26.3256 22.6206Z" stroke="#ABABAB"/>
+</svg>
diff --git a/src/assets/icons/tabbar/profile/profile-on.svg b/src/assets/icons/tabbar/profile/profile-on.svg
new file mode 100644
index 0000000000000000000000000000000000000000..03291d21d107f6390afb0f9e021b25496fca624a
--- /dev/null
+++ b/src/assets/icons/tabbar/profile/profile-on.svg
@@ -0,0 +1,4 @@
+<svg width="64" height="36" viewBox="0 0 64 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<circle cx="31.5" cy="15.5" r="5.5" fill="#E3B82A"/>
+<path d="M21 30C21 26.4735 22.6077 23.4852 26 23C27.3163 24.1296 29.5 25 31.5 25C35 25 35.5 24 37 23C40.3923 23.4852 42 26.4735 42 30V31C42 31 38 32 31.5 32C25 32 21 31 21 31V30Z" fill="#E3B82A"/>
+</svg>
diff --git a/src/assets/template/monthlyReport-template.html b/src/assets/template/monthlyReport-template.html
new file mode 100644
index 0000000000000000000000000000000000000000..c261cd3272216670efe291c66d030853dddc2509
--- /dev/null
+++ b/src/assets/template/monthlyReport-template.html
@@ -0,0 +1,355 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <title>Votre bilan hebdomadaire</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <style type="text/css">
+      @font-face {
+        font-family: 'Lato';
+        font-style: normal;
+        font-weight: 400;
+        src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v11/qIIYRU-oROkIk8vfvxw6QvesZW2xOQ-xsNqO47m55DA.woff) format('woff');
+      }
+      /* Fonts and Content */
+      body,
+      td {
+      font-family: "Lato", sans-serif;
+      font-size: 14px;
+      }
+      body {
+      background-color: #FFFFFF;
+      margin: 0;
+      padding: 0;
+      -webkit-text-size-adjust: none;
+      -ms-text-size-adjust: none;
+      }
+      h2 {
+      padding-top: 12px; /* ne fonctionnera pas sous Outlook 2007+ */
+      color: #ffffff;
+      font-size: 22px;
+      }
+    </style>
+  </head>
+  <body style="margin:0px; padding:0px; -webkit-text-size-adjust:none;">
+    <table
+      width="100%"
+      cellpadding="0"
+      cellspacing="0"
+      border="0"
+      style="background-color:#000000"
+      >
+      <tbody>
+        <tr>
+          <td align="center" bgcolor="#FFFFFF">
+            <table cellpadding="0" cellspacing="0" border="0">
+              <tbody>
+                <tr>
+                  <td class="w640" width="640" height="40"></td>
+                </tr>
+                <!-- entete -->
+                <tr class="pagetoplogo">
+                  <td class="w640" width="640">
+                    <table
+                      class="w640"
+                      width="640"
+                      cellpadding="0"
+                      cellspacing="0"
+                      border="0"
+                      bgcolor="#000000"
+                      >
+                      <tbody>
+                        <tr>
+                          <td class="w30" width="30"></td>
+                          <td
+                            class="w580"
+                            width="580"
+                            valign="middle"
+                            align="center"
+                            >
+                            <div class="pagetoplogo-content" style="color:#FFFFFF; font-size: 30px; font-weight: bold; margin-top: 15px; margin-bottom: 15px;">
+                              <img
+                                class="w580"
+                                style="text-decoration: none; display: block; margin-bottom: 10px;"
+                                src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAADDKSURBVHgB7d1fjF3VlefxdW+VXcb/HWMaCAzXPbaZuJKeYtJEbdrTsV9iK610QMI89AtG4SmJBCYiQuoYyhkeRokC5iGZFyJs9UsLIwUekgkZRS6SBo+SbuGoZTQzzQzl4CbGDnL997+698xZp+rY1+Uqu27VvXuvvff3I1W7MBDowq7922uvvXZFACQnOyo1WSav/N9fyuDlSTnwmX4ZFABJqQqApGTvyBOyVN6VTHZkmezt7pJ3/9d35UkBkJSKAEhC9mvZId3ynC785c+9/8urfz7/ZjB4uS47qQYAaSAAAJHLy/1rpSdf+OX6XX5zALj6N8jBsYYcuK9fhgRAtDgCACJW7Pp78nK/tFDir8iTq/Jjgf/zXdkrAKJFBQCIUNnk11zun82sFYAmlYocokkQiBMVACAyzU1+skhlk+C//pfiCAFARKgAAJEoyv1d8mL+ad98/56bVQCa0SQIxIUAAATuRk1+N9NKALj6D5SDkw15iSAAhI0jACBgebn/wZab/BarIk8u6ZKjNAkCYaMCAARovk1+N7OgCkATmgSBcFEBAAKi5f7sWF7ub1OT32JNNwl+QJMgEB4qAEAgppv8Xsk/rUmbLLYC0EybBOt12Xdvv7wuAMwjAADGFeX+nqK7/0Fps3YGgBLHAkAYOAIAjLqm3N+Bxb9TmB0AhIEKAGBQJ8r9s+lEBaCZHgs0Mjmw5Vk5JABMIQAAhrSru3++Oh0AShwLAPYQAAADimE+y+SJfOHvF4dcBYArGCIEmEEPAODZ9Oz+D1wv/l4wRAgwgwoA4Imrc/4bcV4BaEJ/AOAXAQBwrFj4u+U5C4N8fAaAJq9P1mUfxwKAWwQAwJHpBj9d+PeKEUYCQIFGQcAtAgDQYVca/BryZP47bq0YYikAXEGjIOAEAQDoEMsLf8lkAJCp/oBM5NDm/XJAAHQEAQDogKKzX7v6jS78JasBoESjINA5BACgjbK38/P9SjECtyYBsB4ASgQBoP0IAEAbWOrsb0UoAaBEEADahwAALEKoC38ptABQIggAi0cAABYg9IW/FGoAKBEEgIUjAAAtiGXhL4UeAEoEAaB1BABgHmJb+EuxBIASQQCYPwIAcAOhdfW3KrYAUCIIADdHAABmCGGAT7vEGgBKBAFgbgQAYFpKC//IeFWeO7ReRk+L7P38Obl91aTErJwsOFmXw4wYBqYQAJC86Ud6Hk1h4Vcv/3SNvHBknYxMVIs/1sVfQ8Due0clBTw6BEwhACBZsTb2zeVf/t/Soe/+/fq1x07cMuuf1yBw8CsfRV8NKGkQyCbl8OZ+GRAgQQQAJCf7lTwoS4pZ/TskAVru1x3/yz9bM6+//uE/G5aHPzucTBDIDWSZHKZPAKkhACAJKZ3vN3t1YKX0H7r1Srl/vlI7FlBlw2C9IQMcDyAFBABErSjzL5GvSr24zpfMwn/sxDJ54bV1Mle5f7423XpRnv/SxylVAwp6PNCYlJe29MtxASJFAEB0it3+0rzMX5VHUynzl1ot98+XVgJSuC0wC44HEC0CAKKRvS19+aL/1dTK/KWZ3f3tluKxQEmPB/L/M8DtAcSEAICgFbv9rqLMn0xT30xa7u8/vF5ODPaICxoEvvnAH2V7bUISRVUAUSAAIEjTV/i+mOpuX5060y37/tuGRZ/zL1TCxwIFqgIIHQEAwSh2+0tkb77j/2qqu32l5/x6xq/lfgsSvDY4m6IqwA0ChIQAAPOK3X7XdIk/0d1+qWjwy8/6O3XOv1Ap9wfMxIAhhIIAAJMo8V9Lz/n3/eg2OXW2WywjCFxVHhFwnRBWEQBgRnaseHL30fxjR8ol/mbtus/vms4PePqvzg7du+FS8uFNFY8RZfLSZENe54gAVhAA4BXn+rPz3eDXLqk3Cs6BfgGYQACAcyz6c9OF/wf5Of+Rt1ZJTAgCcyIMwBsCAJwoyvt1eZBFf3ZlZ7/FBr92IgjcEGEAThEA0DFXGvk4059TKgt/M138NQjs3jJKEJjb8UZD3qhk8joNhOgUAgDapijtd0tfio/vtCrFhX+mMgg89vlzQ5nwa2Uu5W0Crhai3QgAWJRrzvMb+eLPon9DLPzX4+rg/OXfsDUs6VHBGxwVYLEIAGjJNbv8RlHW7xPcFAv/zREEFuR4frw2kP9efIPqAFpFAMBNFa/sZcU0Pnb5LWLhbx1BYFEG8t+rb2R5dYDeAdwMAQDXubLgawNfnfG7C8HCv3gaBL66dWRo578fW0uzYOvK44L89/JbBALMhgAAFvw2YuFvP24NtAeBADMRABJz5Qy/vJ5HSb8tWPjdYI5A+0wHAr1u+FY1k4Gx/PP7+mVIkAwCQOSazu//4/Rd/JqgbX7/cffQi6+tW/vmb1ew8DtEEOiY45WKHM8rBL+jShA/AkAkip390mJx7ysW+0YxfKfG7r4zQn2kJzbF0UD+0XfHBUHH6LHB8bxa8Lv8+8pxQkE8CAABKhb7nqJ8X5ve2etVPK7jOcDCb1Pfnedl95Yxbg64oyFgUPsJNBRwfBAmAoBhxfx8Xdx1oe+We6Y/58zesfJ8/9WBVXLqbLfArvIK4fbauKzsaQjcKXsKtFqQ/+FJgoF9BADPrind6/l8dXqhp3zvHY194dIgoFUB+gT8uxIM8h8bjfwYIQ8I+e+mIcKBfwSADit28Y1iIddFfW2xk5fi52os8jZR5o8LfQJ2TYeDQZk6TtAfT+YhYZCA4AYBYAGKXfuy/EMX9kqxkOsirufxa4rPp87kp34OQdDdvpb43/yn5Sz8kWLCYJg0IFSmQsKQhoRGJsOVSv5zjal3EPJDucGNvImwIMkFgCuLt2pML+KqOr1YZ8WivvbKYj6lXORZ1CNzYnCp6BU+yvzp4HggXtNhQasGxUceFIbqdTmpf65aKaoNQ1lDhqpytbLQPRUu9CeGUqs4mA4AVxbryelFt6vYXU8tyuVCrapFWb1Uu/Lnr31itCbANMr8UNwewGw0RDSmQ8J09WHq5ytXP58ZLPTz5nChPzee/72WQ4XtAPCOHMp/eFSANqCpD3OhKoBOyAPDoU3fkcfEKNt3mqp5GZ6bPFgEXfR1t//yf1/Dbh9zOj3aLT//36uKD6oCSIXtAJDRIY+F0UVfz/a1sY/dPlpx/KNbio9D/7yuCAMPf25YNq2/JECrssz20TNTTRAN3e3//f9YPTTwu1vWstvHYjVXBe5YfXno0f80tFYDAUcEmK9MbG9irVcAagLcwCwlfqpGaLs/jCxZ+18HNhSf65TB7bUJjghwU1Xj349sNwG+LecYlIPZUOKHbzpqWMMAQ4YwF71BsGm/bBSjrN8CyASYxqIPq8pbBIQBzLR5v911lgAA03TRP/beLVzdQzA0DJSVAZoHMVaXdVZnAZgNANMv4X0gSE656L/61io5dYY+VYSLMICuitT+9DtTQ4OssfvddWrOPhJBeR8x0psEr/3LmuKDYwJYYzsAdAkipd375Rx+Fn2koPlaYRkGyhsFiFc9K5oAqQAgbc0v7p34oIdFH8lqDgOqDALMGYhPo273JpvdAFBlBkAMyvP8Y+8tYxQvMId/HFxRfKhN6y/mQeCCbN84zlFBBCpVAkDrMnoAQqS7/J//dnmx6L/5mxXs8oEWvf9JT/GhfQM6a6DvjvNUB9ARdgMAA4CC0HyW//N/WkHXPtBGYxers1YHNAxodUADAmyz/B4A363RknLBp6wPuNdcHVAaBPR6IccFdlUMjwO2XAGoCbxr3uGfOLmU5j3AkPLlwuZAoEGg79N5MPjUJSoEBlS7ZI0YZbkJcI3wa9e58gz/vcGeYod/Iv8RQBjKQCD/vK7447JCUP5IDwGa2W4CREeVu3td5HV3r2V9zvCBeMysEGgAKPsINt16kWMDB+gBgAlTi/1SdvdAonT+gH6UTYWqrA4UH3koYGRxe2X0ACyA4dRkne7sPzzbLcff7xn611NL1+pi/+GZJZzdA7jOlWODJs1HBtOVAn3MhqrsAlQJAAvAHIB50ZK9lu/f/7elQ+9/tGTtjDI+v2EBtGyWULBWjw6mjhCmKgXl5wiX3dcAeQr4inJHr+X7U2eXFJ+/l3/Orh6AbwSDm9u83+ZaSwAwolzkT+UfurDrrr5o0jvZQ2MegOBoELh91eUrRwn6efHjysnkrieO1WXdff0yJMaYXFmyY1KLbfnXRXw4362XC7z+qH/MTh5AjMqGw5n9BUoDgFYOVi5tTIeDqYBQ/HyE8wvWdBezAAgA89II4/xfd+j6US7sw+PVKyV6pYv78EQXO3gAaKIjjmcLBs2uhILpkFD8uHrqjzUgFJWE6c+xMHYDQJc4U96H1124LuJTP9dV/HG5wBeL/YSW6ZcUf55FHQA6p6wgzMdUQKhfCQPlMYMGhJ7ubGjd8sm15V+nXFcZ6plszH84KcawisnU/fg9B+4UAEB4poLCnMvZdbehDv7NR06HIDXqNm9k2Tx4rjIDAADQGXoE4VKlSgCYP8djgMszewBA/MYuOjxjFj3VJgDMX8XtF0vP+wEAaRi75LgCYPRtG6t3z9wGAK7gAUAynB8BUAFogfMKAAEAAFLhugJQ7ZI1YpDVJkCnXywqAACQDtcVAKtoAswNj9EDAACpcF0ByIy+bksAyI2c59lBAEiF8wBAD0BL3AYAKgAAkAznPQAEgBa4PgKgBwAAkuF6DgAVgFZwCwAA0CEemgAJAPORHXX/heIWAACkw/URgHq3314IsLfyLWP3DwDoLNdVgDXd9mYB2Fv9Jt1el2D3DwDpcV0FmJiUdWJM8qvfh2d4CAgAUuM6APR0cQRwc0YfTQAAxINhQBYDQBcvAQIAOuv0yBJJncUjgJo4NDzBFEAAQGdRATDo1FlSIACkxsdVQGvsfQUqNh9NAADEw/U1wK4uuUeMoQJwllsAAJCa06N877dYATCXkgAAWAx6AAz6kAoAACTnj+PdQ+KQxQeBLM4BqAkAAB006XjmjMUngakAnOEWAACk5vQo3/uTnwMAAECnZQbXNm4B0AMAAMnxcQvA2pPApgJAdozdPwAgTtaeBLZVAWi4TUfs/gEgXanPAkg6AAyPMQoSAOBGPZONYkjSK+DIBAEAAFJ1esxtBaBRpwdgblV6AAAAbrh+D6BSJQDMzfFgBqYAAkC6xi52iUsNY8OAbAWAitsvzsi42//4AIB0VTICwI24DQD0AABAslzfAqhQAbiBir1ZyQCAOI1dcrsEVruYAzC3qtsvDnMAACBdrpsA6w1ZJ4Yk3QQ4PEYPAADAjWqFCsDcHAeAkfMVAQCkyfUcgIwegBuiBwAA4ITzHgACwA24ngNwhvegASBVrucAUAG4EedzALgGCABwhgAwm+yo+y8McwAAIF0+XgN8t99OCLCzAi7j/B8A4Jbrq4Bruu3cBLATABw/BcwMAACA60bAiUk7swCSDQDDY5T/AQBu9XRxBHC9jHcAAABuuZ4F0KgTAK5nKBUBANLgugegUiUAXM/1DAB6AAAgea5nATQMXQW0EwB4CRAAELlKRgCYjeNbAEwBBIDUuZ4FUKECMAsqAACAyFW7mANwvarbLwpzAAAAPqYBWpFsEyAAAK5lmdTEiGQvw3MLAADgehKgpRcBLVUAagIAgEOuA0CVAODfyJjbu58AAHtOj6Z7I8xSAKiJQ8OMAgYAOJYJPQDejYwTAAAgda5HAVti4v/z7Kj7MxEeAwIAuO4BUO/22+gDsLEKLuMKIADAD9dVgDXdNoYB2QgADddjgLkCCACY4qMKYEGSAQAAAF/qmWwUA5KMPR+eoQIAAJhyesztmtCo0wNwVZUhQACANFSqBABvRsYZAgQAmHJ6JM1hQFYCQE0cGp6oCAAAPjSMjAOmAgAAgEMVI6/fphkAGAIEAJh2etRtE2CFCkCTCk2AAIA0VLsYBOQNg4AAACXXFQArrFQA7hEAABJQb8g6MSDJCsDwGE2AAAA/qhWOALwZOc81QADAFNeTADOaAJtkNAECANJQJQD4M8IRAABg2ulRJgH643gowjBzAAAAnnAE0KzCc8AAgGQQAHxhDgAAoMQcAE+yo+z+AQBpebff/9rnvwKwjAAAAEjLmm7/swCSq3tQ/k/HXbdNyrat5+XuDZOyECcGl+YfPfyaARKgxwC3r1rY94pQ+f/ONik14VYe2mT18oY8/tfD8sgXR4sA0A4aBF7+2Ro5duIWwgCAtpiYLMYBnxSPkvtuNjzGFcAY6cL/1CPn5PEvD0u79dYuyYtfP1ss/q8OrJIXjpgY4w0gYD1d9AA4N8IMgOj01i7KL75/qiOLf7O78qOEp/ack//5w98XnwOIh+txwBawGiJoe3aMypvf+zenC7L+s17r/0h677koALAQjToVAP03qAmwALvuHy9K8z5oCDjS/wdCAIAFqVQJAM59SBNXFHQB9rX4l1avaMiPv/1x0X8AIGynR9J7D4AjAARJS/C6APtW9gUAQGgsBICaAC3Qc39LTXh67VDnDQDAfGWZ/7UvvVsA4wwdCN23DO64qQIAYRu7lF5BnGuACIpe+bN4BW9b7wV6AYCAjV0kAACm7bp/Qqza/YVxAYD5qBh4Eth/AKjQA4D5s3zWvvWeSwIA81Ht8v8YUHIVAGa5h+3u2+xO4Lub6YBAsPQxoNRwBICgWB7B27uRoUAAwkEAAAAgQRZ6AO4RAAASUm+I92dFGQUMAEie6zkA1QpNgAAAeMcgIAAAkAQCAAAACfIfADL/05AAAHCpYuAhPAsVAKcBYGSMx4AAANeiByABwzwGBACYYexieptDVkMAABJEAAAAIEEEAAAAEkQAAAAgQVwDBADAsUz8r30WHgMiAAAAUkMAcO0UjwEBAGY4PZre2kAPAAAACSIAAACQIAIAAAAJIgAAAJAgAgAAAAkiAAAAkCACAAAACSIAAACQIAIAAAAJIgAAAJAgAgAAAAkiAAAAkCACAAAACSIAAACQIN7GBYAm23rPS+89l+SuDZOyekW9pb93ZLyreHL8xMmlcuzELQJYRgAAkDxd7B//8rA8smM0X/Qb0g4j41X5+W+XywtHPlWEAsAaC78qB/OPmjiyenlDRiY4+QAw9f3gqUfOFYt/2/+38yDxyI6x4uPVgZUEAeNWLm1P8GvBkHiW3ErYrnQPIGy9tYvyi++f6sjiP5OGgNf6P5Jd948LbFrZ43ZtqBAAAMC9PXmp/8hzfyhK/67oP+vHT38sT+05J4AFBAAASdGd/4tfP+utGqgBwEXVAbgZAgCAZJS7cN80BPTec1EAnwgAAJLxrXzhdVn2n4tWH174xlkBfCIAAEiC3u/Xs38remuXTP37wK0GTYCirZCD4tDdt10WAOl56mF7zXf0Athx+yq3awO3AADAAS37b+u9INZoFWDb1vMC+EAAABA9Lf9btev+CQF8IAAAiN4DW+3t/kt6LRHwwX8AyOSkOHS3gQ5gAG7dtcFu78/dt/E9yQLXo4AbmXhvAKECACB6lhdZC9cS4T4AdFXFe1cqAQAAgAQRAAAAyXP9GFCjzhGA9gAMikOU2wAAM7k+AsiYAwAAAHywUAFwmoJWL/fzAhgAwK6lXZn3HblrFkYBuw0AK+oCAECzTy2vrxWHKo7H4M+GIwAAABLkPwDU3VYA1izPBACAZrevdvwYEBUA4QgAAAAP/AeAKk2AAAC4llwAWLOSAAAAuNbtK93OiOmqyAfiGU2AAIDkuR4EZIH3AFDZxiRAAIBfrkcB/+l33L6EO5tuSZD2AYxMUPxAmu66bVLu3nC5pTA8Ml4tfs+c+KCH3zuIToq7f2UlAAzmHzVxZPUKAgDSsq33vOz54qjsvn+i+PW/GKfOdss7J5bJkbdWybETtwgQOte7/4r4vwKokqwArMkrAKcEiN+eHaPyrT3n2nr0pf9bj+wYKz40DPzgyDo5MrBKgFCt7EnzeriNAKADETKHFYCVzAJA3HSRfvHrZ/Kd/wXppKl/zlnZtvW89B+6lcoaguThJcBBMcDG71bHw4DuphEQEdNF+bX+jzq++DfTasAvvn+KJlsEKdUeABsBoCHDAmDRysXfx0Ls858NLIbrAGBhDLCyEQAcPwnMNyjEyMICrP/sHz99WoCQ3L7K7e+ZRt3GptfKgR3jgIFFanez30L11i7JU/m/CxAK17cAMsdr3lysBIBBcYgHgRAbXfi149+Kx788TKUNwbh9VXovAaokW3ZpAkRsDuz9o1iiswY0BAAhcF4BaFABuKrhNg3dfRsBAPHQnfau+yfEmkfyigTHbQiB6ybAahcB4Kpux0cAfFNCRHTKn0VaBeitXRTAOtcvAV6sEwCuuuC4CXAFAQDx2H3/uFhlsTIBzOT6COAyg4Cuqux0n4ZoUEIs7jJ8pEW/DaxzfQVQ3ddPBWCmQXFoDccAiETvPZfEqt6NHAHANuc3AIzs/pWlAMAwIACAU6m+A6DsBICq65sAblMfAMAe51MAMzuj7+0EAMfvAVABAAA4fwcgowJwvYxpgAAAtzbd6rZPxcoYYJVsEyDdyQAA11cArYwBVnYCgOPBCEwDBAC4HgJEAJjNEjkuDtEDAABw3QRoZQqgshMALjAMCADgjo8hQFamACozAaCYBpi5DQEMAwKAdLkeApQbsjIFUNl6Dtjx2QhTygAgXa7P/y0NAVK2AoDjYUAcAQBAulwfAWSZnBRDbAWAutsvzl0bmAYIAKlyPQPA0hAgZSsAOP7iWH5EBQDQWa5nADQMXQFUtgJAw/V7ABwBAECqNn3K7Saw0iAAzM3xLIDVKxqympsAAJAcfQPAdQXA0hVAZSsAeJgFwEhgAEiP6/N/9dl+t5vcmzEVAIpZAMJVQABAZ7l+BVAMPQJUslUBmOL0i7SVRkAASM6m9c6/95va/SuLAeB34hDPAgNAepxfATR2A0DZCwANtynpgd4LAgBIi+shQJMNt5vb+bAYAAbFIaYBAkB6XB8BWLsCqOwFgCXuz0kIAQCQDh83AKxdAVTmAkBlm/sv0gO95wUAkAbXjwApa1cAlcUmQDUoDnETAADS4br8nxm8AaBsBoCq2y8Ww4AAIB19n3Zb9bX2CmDJZgBw/Cogw4AAIB3OjwAyKgCtcPrF0iZA3gQAgPjpBEDXVwAJAK2oyoA41lujCgAAseMGwFUmA4CPmwC9NRoBASB2HkYAm7wBoKweASinX7CtVAAAIHp9dzpuADR6A0BZDgBOxyYyEhgA4uf6/N/qDQBlNwA0aAQEALSPNgB6mAEwIEbZDQAeuiZpBASAePloAOyqcATQukkfAYBGQACIVd8d7o96x+oEgJZVdsqQOL46sW0rfQAAECvnEwBFjt/XX6xlJlluAlRviUPbeBQIAKK16VOOz/8NNwAq2wHAcSPg6hUNngYGgAjp+f/KHreN3pYbAJXtAOChEZCngQEgPq53/8pyA6CyHQA8NAL+xVYCAADEpu9OGgBnMh0AfDQCMhAIAOLjYwKg5QZAZb0JUDltBNQeAPoAACAeOv3P9QTAqvHyv7IfABr0AQAAFm7TevcDgBoNt5vXhbAfALrkdXGMPgAAiMf22oS4dqlBBWDRiqeBM7fnKPQBAEA8XJ//54asPgHcLIQeAP23dP4wEH0AABA+H+f/YvgJ4GZhBIC6vCGO7b5/XAAAYeu7w/2Rbj1zv2YtRBgBwMNAoK28DAgAwdu+0f1mzvoAoFIYAUAHAjnuA9h9v/umEQBAe/l4AXDzftsjgEtBBIBiIFDV/bsA27gNAADB0uY/1/P/xfj8/2ZhVACUhzuV27gNAADB8nH9L4T7/6WQAsCAOEYFAADC5eH6n1SrVADarvKf8y+q4z4ArQCsXu68fAQAWCS9+rdpvfMXAIdCOf9X4VQAVNV9Z+UjO0YFABAWH9f/JJD7/6WwAoCHeQC7mAcAAMHxcf0vlPv/pbACgId3AXprlzgGAICArFza8NIAONkIp/yvggoAPt4F0OuAvQwFAoBg+Gj+y0QGQ5j/3yysCsCUw+LYHvoAACAYPnb/1UpYu38VXgCou/8i61RAjgEAIAzbax7O/yfDOv9XBIB54BgAAMKgi7+H6X8yEdAEwFJwAaAYC+yh1MIxAADY56P8nxu4r99tf1o7hNgD4Ol5YI4BAMA6H+X/LHPfm9YOYQYAD9cBOQYAANt8lf/rgV3/KwUZAIrrgB4mLj2155wAAGzafa/7o9osX4s+01+sScEJswKgPExcYigQANiks/+9nP8H9PrfTOEGgIaf2wC8DQAA9nia/S+XMjkkgQo2ABSvA4r7sgtvAwCAPbv/g5fyf3DT/5qFWwFQHo4B9InguzZMCgDABi3/991xQVwLcfpfs7ADQMP9bQDFMQAA2LH3834atEO9/lcKOgAUxwCZ++ELj395WAAANvh6/GfzfioAvr0kjmkz4LatfhpOAABX6d1/PQJwLfTyvwo/AHgawMBMAADwz8fdf3Vh0v3ms92CDwC+bgNoMyAzAQDAH193/0Pv/i/FcASg/zW8NGI8/tf0AgCALw9/zs/7O40s/N2/iiMAXJKD4gHNgADgj6eX/yTzdAOt3aIIAL6eCNZmwF33+/kFCAAp271l1EvzX24g1Nn/M8VRAVAenghWj385uCegASB4Pib/qdDv/jeLJwBclkM+ZgJoMyBXAgHAHb3372PynxqPpPyvuiUSegyQvVNUAR4Vx7QX4Nh7twg679WBlWLVyHiX+MDX5OZ+/psV+ZFdXRCH3VvGxIdKRQ7d1y/RlH0rEpHs17JDuuSoeLB1b01GJuIpqACARXru/w9/+3vxZGfo0/+aRbVi+ZoJoLgSCACd523ufwSjf2eKb8vqayZAfgzAYCAA6Bzd/fua/JevLQckMvEFAE8zAfRKIFUAAOgcb4t/rt6Ia/evogsAxUyAqp8uTaoAANA5evffB23+i+Xuf7M4u9Yu+xnTSBUAADrD4+CfqO7+N4syABTNgJ6eaqQKAADtt/fPaf5rt3jvrXmaDEgVAADay+fuP8bmv1K8AcDTZEBFFQAA2sfn7n/Ls/laEqloA0DRDCj0AgBAyHzu/quVOEv/pbhH13m6EqioAgDA4qzsaXjb/avLk/GW/1XUAcDnlUCqAACwOA9/btjb7j/Wq3/N4h9e7+lKoKIKAAALU0z92+Jv8M+FSX9rhyvRBwCfVwKpAgDAwujMf2+d/yIDn+2X4xK5NJ6v83iOo1WAuzZ4+0UMAMHxOvM/16jHv/tXSQQA31WAA4/+UQAA8+PrxT+lV//u7ffTO+ZaOg/Ye+wF2PWFCdm29bwAAG5s0/qLXnf/MQ/+mSmZAFD5qyLRDYonT+3xl2gBIBTP7/pYfIl98M9M6VQAlMdkt633guzZ4THVAoBxXkf+qoR2/6oiicnekQ/yH2riwch4Vf7iG/9ORibSyl0AcDO68B/8ykf+XvzT3f9+2SgJSW8l8pjwuBYIALPzOfSnkNjuXyVXAVA+qwBq19OflhMnewQAMLX7/4e//b34kuLuX6VZi/ac9Pr3fiIAgCnP7zotXiW4+1dJBoDKXxZdnoPiiTYE6oAgAEidNv5tWn9JfEmt879Zut1odXlMPNJrgbwTACBlWvr3+dpfIdHdv0o2APicDqi0IbB/LxMCAaTL87z/pHf/Ku37aJ7fen5kxxgTAgEkSUv/Xif+SdEF77US7FvSAcB3FUC9+I2zHAUASMrKnob30n+lIoc27/f7/d83JtJ4rgLoS4GMCQaQEt+lf3V5Mt2z/1LyAaCoAogcFo90OBBHAQBS0HfH+WLoj0+6+/9Mv7+bYFZQAVAX5UnJZEg84igAQOx01//MzrPi2RC7/ykEgFxlZ7H4e3suWHEUACB2Fkr/uZfY/U8hAJQuyUERv78o9Chg1/3jAgCxsdD1r9f+Nu+XfkGBADCtqALU/V8JefHrZ4tqAADEwsTAH5Xw0J/ZEACaWLgWqAOCXvz6GQGAWDyz44yF0v/rKQ/9mQ0B4HreqwC8FQAgFrrz77vzgvg2WZd9gmsQAGaobJNBC2UifTGQq4EAQlaU/j9vorn5AI1/16sIrpMdlbXSI+/mn9bEo1Nnu+VLT98lIxPkNABh0cX/4Fc+8l76L+b975eNguuwsszCSkOgNgPSDwAgRN/c9kcL5/40/t0AAWAO0xMCXxfPdn1hgn4AAEHRc//tGyfEN534R+Pf3AgAN1KRfb4nBCr6AQCEYtP6iybO/bX0z8S/GyMA3EDREFix8QtIRwUzHwCAZVryf37Xx2JCRuPfzdAEOA/ZMTma/2LaIZ6dGFwqu759lwCARS8/fCqvAFwSAwY275edghuiAjA/j1k4CuitXZL+Rz8RALDmmw98YmXxH5o00MQdAgLAPFg6CtD3AmgKBGCJNv35fuL3igql//niCKAFVo4C1J7+O+TYe7cIAPjUd8d5Ofg3fxAjKP23gApAa0wcBagfP/0xTYEAvNKmv2d2nhUjKP23iADQAktHAfpo0Gv9H8nq5Q0BANesTPorZZnso/TfGo4AFiB7R36S//CgGMDNAAA+GOr4Lwb+bPoOu/9WUQFYiIvFL7RBMUBvBjAuGIBLhjr+GfizCASABbDyVkBpz44xeWqPiRe3AETOVMe/FAGA0v8CEQAWqHgrIJOXxAgNAFwPBNBJuvgbed63dODe/f7fbAkVPQCLlL1TPBvcJ0bs++EGOfLWKgGAdtp976g8s8NMxz/P/LYBFYDFqshDVq4GqgN7P5Heey4KALSLPvBjafHPDdXr3PdfLALAIhVXA/ONtxih1wOP9P+BEACgLaau+5kZ9FPgyl97EADaoPKXcshSP4CGgB9/m0FBABanvOu/ssfOvJG89P/Slmfz77lYNHoA2iQ7KmulR46KoX6AU2e75eH+O4sfAaAV1gb9KM7924sKQJsUVwON9QNoBUCnBVIJANAKq4s/5/7tRQBoo6IfoJGHAEMIAQBaYXHxV9z3bz8CQJtNzwcwNZWKEABgPqwu/sJ9/46gB6BDLL0XUKInAMBcrC7++SL1+qb9tiqrsaAC0CmG3gsoUQkAMBvDZf/BUZ747RgCQIdMNwXutNQUqAgBAJpZXvy16e++flvfQ2NCAOggi02BihAAQBk+89fS/2M0/XUWAaDDiqZAQ5MCS4QAIG2WF//cgc37i++d6CACgAOVB+SgpUmBJUIAkKYAFv9+QcdxC8AhizcDlN4K+Nr3/kROnOwRAHHTh32e3/Wx1bI/Hf8OUQFwaepmwHExRisAPCAExK/vjvPFwz4WF386/t2jAuBYdkxq+a90fTOgJgbt++EGOfLWKgEQl933jlp70veKsuOfpj+3CAAeFCGgIe/mX/21YtALR9YVHwDisPfPz8nez58Ti1j8/eEIwIPieqDYmxFQemrPueIDQPgsL/65oXwVeojF3w8qAB5lb8ve/L/AK2LUyz9dI/2H1wuAMGnJX0v/VlUyeWzTs3JI4AUBwLPsHXky/+FFMerE4FL52vdv5/0AICArexrFNb9N6y+JYVz384wAYEBeCejP/0s8J0bxiBAQDuN3/Ess/gYQAIwIIQQwKwCwTe/46zU/rQAYxuJvBAHAEOshQPUfWi8v/2yNALDl4c8Nyzcf+ESMY/E3hABgTPaPckiq8qgYxjVBwBZd+DUAWJaJHN6yX/YKzCAAGBRCCHjzN8vlucO30hcAeKSl/ue/dFr67rwglrH420QAMCqEEEBzIOBPIM1+LP6GEQAMCyEEjIxX80rAejkywPhgwBW92//NbZ9Yb/Zj8TeOAGBcCCFA0RcAuGF8st8VLP72EQACEEoIOHZimez70W0cCQAdEMp5v2LxDwMBIBChhADmBQDtp/f7n9/1sfnzfsXiHw4CQEBCCQGKIwGgPQK5319g8Q8LASAw2dtyMP+v9oQE4NWBlXkI+BRHAsACaMn/mS+eke0bJyQE+eL/Ur74PykIBgEgQCFMDCxxVRBoXUgl/2lM+AsQASBQIYUAxZEAMD8hlfynsfgHigAQsNBCALcEgLnpbv+ZHWeC6PJvwuIfMAJA4LJ3ijO3FyUQuvj/IK8EMDgIuKrvjvNFyd/6YJ9mlUwe2/SsHBIEiwAQgexX8qB0ySv5f821EoiXf7qmOBIYmagKkCpd8HWoj/WHfGYYymPKY/ful9cFQSMARCI/DujL/2v+JP+0JoGgQRApC7DRTzv9B6UqD235OzkuCB4BICLZsXzxz+SoBBQCFA2CSI3u+nWkb0h08a/XZedn+vMQgCgQACITagigGoAU6G7/+V2n893/JQnM8cm6PMTiHxcCQISyo7JWeuSV/NMHJTBUAxArPefXnX9IjX5Kp/uN1+XJ+/plSBAVAkDEQrsmWKIagJgEer2vwHS/uBEAIhdqCFBUAxC6UHf9hYrs2/wdOSiIFgEgASFeEyxRDUCItMNfp/mFuOvPaan/oc37ZUAQNQJAIkJtDixRDUAIdKf/8GeHg+vwL9HpnxYCQEKKECB5JSCTHRIgrQJ87Xt/IidO9ghgjU7ze2bn2aDu9c8wMFaXh2j2SwcBIEEh9wUonhmGJYFO87sGzX5pIgAkKrQ3BGbiTQFYsHvLaHHWH2ST35ShfBU4QLNfmggACQu9L0C9+Zvl8tzhW6kGwKmQr/aVGOsLAkDiQu8LKNEkCBdCb/Jrwnk/CACYEnpfgOJYAJ0UQZNfgfN+lAgAuCIPAXunQ0BNAsaxANophnL/NJ7xxTUIALhGDH0BpZd/ukZe/tkaggAWJKJyv+IxH1yHAIBZ5dWAg/mvjickcBwLYCGCHuE7g5b8x+vSz3k/ZiIAYE7FkYBeFQxwhPBMDBHCfOg5v+74Iyj3q6FKJvs2PSuHBJgFAQA3FNORgGKIEGYT0Tl/iZI/booAgHmJ4ZZAM/oDoMpzfi35x1DuV3T5Y74IAJi34lXB7mJ6YE0iQH9A2srxvREt/IP5N/THeMUP80UAQEumjwT6808flUgQBNKyvTZejO8N/T7/DAz2QcsIAFiQ4i2BLD8SiKBBsKRBYN+PNsixE7cI4hNZg1+JWf5YMAIAFiy2BsHSsRPL8iBwG/0BkYh04Vc0+mFRCABYtNgaBEvcGAhbhJ39zQ7kZ/39AiwCAQBtEWs1QBEEwqILvzb47b53VGJDox/aiQCAtoq1GqAIArZFNrr3Okz0Q7sRANB2MVcDFEHAlhjv8jdj149OIQCgY2KuBiiCgF+xL/yKXT86iQCAjoq9GqAIAm4lsvCz60fHEQDgROzVAEUQ6KwUFv5pB8bqcpBdPzqNAABnUqgGKIJAe2lXvy76u7eMxr7wD2RV2bfl7+S4AA4QAOBcjFMEZ0MQWJyYr/PNwDQ/eEEAgBcxvikwF4JAayKe3Debgcm6PMY0P/hAAIBX2duyd7o3oCaR0xHDL7y2jrcG5pDSwk+THywgAMC77Gh+FLA0PxaIvEmwxOuD10psx8/VPphBAIAZ08cCP8k/7ZMEpBwEtJlv9+ZRefjPhmN7lvdGaPKDKQQAmJPSsYDSIPBqHgL0I/Y+gYSu8jUbyrJ84X9WDglgCAEAJhXVgEZxLPCEJCTWhsFN6y/K7nvHUrjKdw3K/bCMAADTiiBQkRfzMPCgJCSWhsHUzveb0N0P8wgACEJqxwKlEPsEyvP97RvHk1v46e5HSAgACMr0SGGdHVCThGgQeEerAoaPBxI93y9pif8lRvgiJAQABCelIUKz0T6BI2+tMnM8kHCZv8A5P0JFAECwUu0PKPk8Hki5zN9kIP84QLkfoSIAIHip9geUXB4PaDf/9tpEqmX+kt7j38fCj9ARABCN1IOA0tsDr+bHA+2uCqRe5p/Goz2ICgEA0Um1UbBZO4YLJd7U14wGP0SJAIAopd4o2OzN3ywvqgJv/nbFvP56dvtXsPALYkYAQNQIAlfdqCrAbv9alYocujwpBxjkg5gRAJAEgsC1yqrAx6eq7PavNSB09iMRBAAkpQgCIq/kYWCHQN7/pWDKgLDwIzEEACQp+3UeALrludSDAAGAhR/pIgAgaUUQ6MorAoneGEg4AAwICz8SRwAAJN0ZAgkGgAFh4QcKBACgSWpBIKEAMCAs/MA1CADALFLpEUggAAwICz8wKwIAcAOxB4GIA8CAsPADN0QAAOZhullwr0Q2RyDCADAgLPzAvBAAgBbENlAoogAwICz8QEsIAMACxBIEAg8AQ5WKvM7IXmBhCADAIjQFgS9KgDcHAg0APNIDtAEBAGiDIgg0ZEdoVwgDCwAs/EAbEQCANgtplkAgAeB4XmU5PNaQQyz8QPsQAIAOyX4lD8oSecLyFULjAWBAaOwDOoYAAHSY5YZBiwGgUpFDWb7jZ+EHOosAADhisWHQUADgfB9wjAAAeGClT8BAABjIQ9EbnO8D7hEAAI98Txj0GAAGhPN9wCsCAGCAr+MBxwGAMj9gCAEAMMbl8YCjAECZHzCIAAAY5eJ4oIMBQBf6gfzjJcr8gE0EAMC4Tk4Z7EAAoMwPBIIAAASkGC7UXVQEHpQ2aGMAGBCa+oCgEACAAE1XBZ7Mfwd/VRZRFVhkAGC3DwSMAAAEbrppUINAy1WBBQaAAWG3DwSPAABEYroqoGFAjwhq8/l7WggA7PaByBAAgAjN9wbBPALAgLDbB6JEAAAidrMbBHMEgOP5xxvs9oG4EQCARMxWFWgKAENZQw5XqvI6u30gDQQAIDFNVYEn8gAwxJQ+IE3/H8sxDxxw72RXAAAAAElFTkSuQmCC"
+                                alt="Ecolyo"
+                                width="96"
+                                height="96"
+                                />
+                                <span>Ecolyo</span>
+                            </div>
+                          </td>
+                        </tr>
+                      </tbody>
+                    </table>
+                  </td>
+                </tr>
+                <!-- separateur horizontal -->
+                <tr>
+                  <td
+                    class="w640"
+                    width="640"
+                    height="2"
+                    bgcolor="#e3b82a"
+                    ></td>
+                </tr>
+                <!-- contenu -->
+                <tr class="content">
+                  <td class="w640" width="640" bgcolor="#000000">
+                    <table
+                      class="w640"
+                      width="640"
+                      cellpadding="0"
+                      cellspacing="0"
+                      border="0"
+                      >
+                      <tbody>
+                        <tr>
+                          <td class="w30" width="30"></td>
+                          <td class="w580" width="580">
+                            <!-- content area -->
+                            <table
+                              class="w580"
+                              width="580"
+                              cellpadding="0"
+                              cellspacing="0"
+                              border="0"
+                              >
+                              <tbody>
+                                <tr>
+                                  <td class="w580" width="580" align="center">
+                                    <h2
+                                      style="color:#FFFFFF; font-size:22px; padding-top:12px;"
+                                      >
+                                      Coup d'oeil sur le mois passé
+                                    </h2>
+                                    <div
+                                      class="article-content"
+                                      style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                      >
+                                      <p>Mois d'aôut 2020</p>
+                                    </div>
+                                  </td>
+                                </tr>
+                                <tr>
+                                  <td class="w30" width="580" height="20"></td>
+                                </tr>
+                                <tr>
+                                  <td
+                                    class="w580"
+                                    width="580"
+                                    height="1"
+                                    bgcolor="#FFFFFF"
+                                    ></td>
+                                </tr>
+                              </tbody>
+                            </table>
+                            <!-- content area -->
+                            <table
+                              class="w580"
+                              width="580"
+                              cellspacing="0"
+                              cellpadding="0"
+                              border="0"
+                              >
+                              <tbody>
+                                <tr>
+                                  <td class="w580" width="580" align="left">
+                                    <h2
+                                      style="color:#FFFFFF; font-size:22px; padding-top:12px;"
+                                      >
+                                      Bonjour John Doe,
+                                    </h2>
+                                    <div
+                                      class="article-content"
+                                      style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                      >
+                                      <p>
+                                        Vous avez consommé XX% de moins par
+                                        rapport au mois précédent.
+                                      </p>
+                                      <p>
+                                        Voici un détail de vos consommations:
+                                      </p>
+                                    </div>
+                                  </td>
+                                </tr>
+                                <tr>
+                                  <td class="w30" width="580" height="20"></td>
+                                </tr>
+                                <tr>
+                            </table>
+                            <!-- content area -->
+                            <table
+                              class="w580"
+                              width="580"
+                              cellpadding="0"
+                              border="0"
+                              >
+                              <tbody>
+                                <tr>
+                                  <td colspan="3">
+                                    <h2
+                                      style="color:#FFFFFF; font-size:22px; padding-top:12px;"
+                                      >
+                                      Les facteurs d'influence sur ce mois:
+                                    </h2>
+                                  </td>
+                                </tr>
+                                <tr>
+                                  <td class="w275" width="275" valign="top">
+                                    <div
+                                      align="left"
+                                      class="article-content"
+                                      style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                      >
+                                      <p>Défavorable</p>
+                                      <ul>
+                                        <li>La météo</li>
+                                        <li>Autre</li>
+                                      </ul>
+                                    </div>
+                                  </td>
+                                  <td class="w30" width="30" class="w30"></td>
+                                  <td class="w275" width="275" valign="top">
+                                    <div
+                                      align="left"
+                                      class="article-content"
+                                      style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                      >
+                                      <p>Favorable</p>
+                                      <ul>
+                                        <li>La saisons</li>
+                                        <li>Autre</li>
+                                      </ul>
+                                    </div>
+                                  </td>
+                                </tr>
+                                <tr>
+                                  <td class="w30" width="580" height="20"></td>
+                                </tr>
+                                <tr>
+                                  <td
+                                    colspan="3"
+                                    class="w580"
+                                    height="1"
+                                    bgcolor="#c7c5c5"
+                                    ></td>
+                                </tr>
+                              </tbody>
+                            </table>
+                            <!-- content area -->
+                            <table
+                              class="w580"
+                              width="580"
+                              cellspacing="0"
+                              cellpadding="0"
+                              border="0"
+                              >
+                              <tbody>
+                                <tr>
+                                  <td class="w580" width="580" align="left">
+                                    <div
+                                      class="article-content"
+                                      style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                      >
+                                      <p>
+                                        Retrouvez l'analyse complète de vos
+                                        consommations dans votre application
+                                        Ecolyo
+                                      </p>
+                                    </div>
+                                  </td>
+                                </tr>
+                                <tr>
+                                  <td class="w580" width="580" align="center">
+                                    <div
+                                      class="article-content"
+                                      style="background-color:#e3b82a; font-size: 16px; font-weight: bold; width: 200px; height: 40px; border-radius: 3px;"
+                                      >
+                                      <a href="#" style="color: #000000; display: block; line-height: 40px; text-decoration: none; text-align: center;">
+                                        Allons-y
+                                      </a>
+                                    </div>
+                                  </td>
+                                </tr>
+                                <tr>
+                                  <td class="w30" width="580" height="20"></td>
+                                </tr>
+                              </tbody>
+                            </table>
+                        </tr>
+                      </tbody>
+                    </table>
+                  </td>
+                </tr>
+                <!--  separateur horizontal -->
+                <tr>
+                  <td
+                    class="w640"
+                    width="640"
+                    height="2"
+                    bgcolor="#e3b82a"
+                    ></td>
+                </tr>
+                <!-- pied de page -->
+                <tr class="pagebottom">
+                  <td class="w640" width="640">
+                    <table
+                      class="w640"
+                      width="640"
+                      cellpadding="0"
+                      cellspacing="0"
+                      border="0"
+                      bgcolor="#000000"
+                      >
+                      <tbody>
+                        <tr>
+                          <td colspan="5" height="10"></td>
+                        </tr>
+                        <tr>
+                          <td class="w30" width="30"></td>
+                          <td class="w580" width="580" valign="top">
+                            <p
+                              align="right"
+                              class="pagebottom-content-left"
+                              style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                              >
+                              Créé par votre application Ecolyo
+                            </p>
+                          </td>
+                          <td class="w30" width="30"></td>
+                        </tr>
+                        <tr>
+                          <td
+                            colspan="5"
+                            height="10"
+                            style="color:#FFFFFF; font-size:11px; padding-top:12px;"
+                            align="center"
+                            >
+                            Pour ne plus recevoir ces rapports hebdomadaires,
+                            désactivez ces emails dans votre profil Ecolyo
+                          </td>
+                        </tr>
+                        <tr>
+                          <td colspan="5" height="10"></td>
+                        </tr>
+                      </tbody>
+                    </table>
+                  </td>
+                </tr>
+                <tr>
+                  <td class="w640" width="640" height="60"></td>
+                </tr>
+              </tbody>
+            </table>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    </td>
+    </tr>
+    </tbody>
+    </table>
+  </body>
+</html>
\ No newline at end of file
diff --git a/src/atoms/challenge.state.ts b/src/atoms/challenge.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2a396a8b22102fc8c277aa60e21cba9245c152cf
--- /dev/null
+++ b/src/atoms/challenge.state.ts
@@ -0,0 +1,7 @@
+import { atom } from 'recoil'
+import { UserChallenge } from 'models'
+
+export const currentChallengeState = atom<UserChallenge | null>({
+  key: 'currentChallengeState',
+  default: null,
+})
diff --git a/src/atoms/chart.state.ts b/src/atoms/chart.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a0b25db8bd405ff4486b0be98d06434afc6e7619
--- /dev/null
+++ b/src/atoms/chart.state.ts
@@ -0,0 +1,12 @@
+import { TimeStep } from 'enum/timeStep.enum'
+import { atom } from 'recoil'
+
+export const previousTimeStepState = atom<TimeStep>({
+  key: 'previousTimeStepState',
+  default: TimeStep.DAY,
+})
+
+export const maxLoadsState = atom<Record<string, number | null>>({
+  key: 'maxLoadsState',
+  default: {},
+})
diff --git a/src/atoms/fluidState.state.ts b/src/atoms/fluidState.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2e3c9623a30da335bcac6fcd6e2bfb0be49ef7a1
--- /dev/null
+++ b/src/atoms/fluidState.state.ts
@@ -0,0 +1,38 @@
+import { atom, selector } from 'recoil'
+import { FluidType } from 'enum/fluid.enum'
+import { FluidStatus } from 'models'
+
+export const fluidStatusState = atom<FluidStatus[]>({
+  key: 'fluidStatusState',
+  default: [
+    {
+      fluidType: 0,
+      status: null,
+      lastDataDate: null,
+    },
+    {
+      fluidType: 1,
+      status: null,
+      lastDataDate: null,
+    },
+    {
+      fluidType: 2,
+      status: null,
+      lastDataDate: null,
+    },
+  ],
+})
+
+export const fluidTypeState = selector<FluidType[]>({
+  key: 'fluidTypeState',
+  get: ({ get }) => {
+    const fluidState: FluidStatus[] = get(fluidStatusState)
+    const fluidTypes: FluidType[] = []
+    fluidState.forEach(fluid => {
+      if (fluid.status) {
+        fluidTypes.push(fluid.fluidType)
+      }
+    })
+    return fluidTypes.sort()
+  },
+})
diff --git a/src/atoms/modal.state.ts b/src/atoms/modal.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8bf6adf56bdad5ab134017bc3954ad665adc14bf
--- /dev/null
+++ b/src/atoms/modal.state.ts
@@ -0,0 +1,7 @@
+import { ModalState } from 'models/modal.model'
+import { atom } from 'recoil'
+
+export const modalState = atom<ModalState>({
+  key: 'modalState',
+  default: { feedbackModal: false },
+})
diff --git a/src/atoms/notification.state.ts b/src/atoms/notification.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1065bca143e112e2f32cdec8dffba43f26712d85
--- /dev/null
+++ b/src/atoms/notification.state.ts
@@ -0,0 +1,6 @@
+import { atom } from 'recoil'
+
+export const challengeNotificationState = atom<boolean>({
+  key: 'challengeNotificationState',
+  default: false,
+})
diff --git a/src/atoms/screenType.state.ts b/src/atoms/screenType.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2dd09e49e2669a24c454373c52a22ad98ca0e6fe
--- /dev/null
+++ b/src/atoms/screenType.state.ts
@@ -0,0 +1,7 @@
+import { ScreenType } from 'enum/screen.enum'
+import { atom } from 'recoil'
+
+export const screenTypeState = atom<ScreenType>({
+  key: 'screenTypeState',
+  default: ScreenType.DESKTOP,
+})
diff --git a/src/atoms/userProfile.state.ts b/src/atoms/userProfile.state.ts
new file mode 100644
index 0000000000000000000000000000000000000000..848cb6127f05a896ca994b08c5003016f8614c70
--- /dev/null
+++ b/src/atoms/userProfile.state.ts
@@ -0,0 +1,16 @@
+import { UserProfile } from 'models'
+import { atom } from 'recoil'
+
+export const userProfileState = atom<UserProfile>({
+  key: 'userProfileState',
+  default: {
+    id: '',
+    level: 0,
+    challengeTypeHash: '',
+    ecogestureHash: '',
+    haveSeenWelcomeModal: false,
+    haveSeenOldFluidModal: false,
+    notificationEcogesture: [],
+    report: false,
+  },
+})
diff --git a/src/components/App.jsx b/src/components/App.jsx
index 39fda658ad41d39c84e008a0a0fd48bc2b87a440..12c2beccfa4dd3fdb6bce942cdf4fc27bd6687b1 100644
--- a/src/components/App.jsx
+++ b/src/components/App.jsx
@@ -1,9 +1,38 @@
 import React from 'react'
 import { hot } from 'react-hot-loader'
-import ViewContainer from 'components/ContainerComponents/ViewContainer/ViewContainer'
+import { RecoilRoot } from 'recoil'
+import { HashRouter } from 'react-router-dom'
+import { createBrowserHistory } from 'history'
+import { Layout, Main, Content } from 'cozy-ui/transpiled/react/Layout'
+
+import Routes from 'components/Routes/Routes'
+import Navbar from 'components/Navbar/Navbar'
+import SplashRoot from './Splash/SplashRoot'
+import SplashScreen from 'components/Splash/SplashScreen'
+import SplashScreenError from 'components/Splash/SplashScreenError'
+
+export const history = createBrowserHistory()
 
 export const App = () => {
-  return <ViewContainer />
+  return (
+    <HashRouter {...history}>
+      <Layout>
+        <RecoilRoot>
+          <SplashRoot
+            splashComponent={SplashScreen}
+            splashErrorComponent={SplashScreenError}
+          >
+            <Navbar />
+            <Main>
+              <Content className="app-content">
+                <Routes />
+              </Content>
+            </Main>
+          </SplashRoot>
+        </RecoilRoot>
+      </Layout>
+    </HashRouter>
+  )
 }
 
 /*
diff --git a/src/components/Challenge/AvailableChallengeDetailsView.tsx b/src/components/Challenge/AvailableChallengeDetailsView.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4d27c68daaae23c1f53079f9599135b6d01e2a9f
--- /dev/null
+++ b/src/components/Challenge/AvailableChallengeDetailsView.tsx
@@ -0,0 +1,216 @@
+import React, { useState, useEffect, useCallback } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+import { Redirect } from 'react-router-dom'
+import { useRecoilState, useRecoilValue } from 'recoil'
+import { DateTime } from 'luxon'
+import { Location } from 'history'
+
+import { ScreenType } from 'enum/screen.enum'
+import { ChallengeType, UserProfile } from 'models'
+import { userProfileState } from 'atoms/userProfile.state'
+import { screenTypeState } from 'atoms/screenType.state'
+import { fluidTypeState } from 'atoms/fluidState.state'
+import { currentChallengeState } from 'atoms/challenge.state'
+import ChallengeService from 'services/challenge.service'
+import ConsumptionService from 'services/consumption.service'
+import UserProfileService from 'services/userProfile.service'
+
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import { history } from 'components/App'
+import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
+import StyledButtonValid from 'components/CommonKit/Button/StyledButtonValid'
+import AvailableChallengeIcon from 'assets/png/badges/available-big.png'
+
+interface AvailableChallengeDetailsViewProps {
+  location: Location<ChallengeType>
+}
+
+const AvailableChallengeDetailsView: React.FC<AvailableChallengeDetailsViewProps> = ({
+  location,
+}: AvailableChallengeDetailsViewProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+
+  const screenType = useRecoilValue(screenTypeState)
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  const [userProfile, setUserProfile] = useRecoilState<UserProfile>(
+    userProfileState
+  )
+  const [currentChallenge, setCurrentChallenge] = useRecoilState(
+    currentChallengeState
+  )
+
+  const challengeState = location.state
+  const [redirect, setRedirect] = useState(false)
+  const [challenge, setChallenge] = useState<ChallengeType | null>(null)
+  const [headerHeight, setHeaderHeight] = useState<number>(0)
+  const [lackOfDataForChallenge, setLackOfDataForChallenge] = useState<boolean>(
+    false
+  )
+  const [isLoaded, setIsLoaded] = useState<boolean>(false)
+
+  const challengeService = new ChallengeService(client)
+
+  const defineHeaderHeight = (height: number) => {
+    setHeaderHeight(height)
+  }
+
+  const updateUserProfileNotification = useCallback(
+    async (ecogestureList: string[]) => {
+      const userProfileService = new UserProfileService(client)
+      await userProfileService
+        .updateUserProfile({ notificationEcogesture: ecogestureList })
+        .then(updatedUserProfile => {
+          updatedUserProfile && setUserProfile(updatedUserProfile)
+        })
+    },
+    [setUserProfile]
+  )
+
+  async function startChallenge() {
+    if (challenge) {
+      const startedChallenge = await challengeService.startChallenge(
+        challenge,
+        fluidTypes,
+        challenge.availableEcogestures
+      )
+      setCurrentChallenge(startedChallenge)
+      const updatedNotificationEcogestureList: string[] = userProfile.notificationEcogesture
+        ? [...userProfile.notificationEcogesture]
+        : []
+      if (startedChallenge && updatedNotificationEcogestureList) {
+        updatedNotificationEcogestureList.push(
+          startedChallenge.selectedEcogestures[0].id
+        )
+        updatedNotificationEcogestureList.push(
+          startedChallenge.selectedEcogestures[1].id
+        )
+        await updateUserProfileNotification(updatedNotificationEcogestureList)
+      }
+    }
+  }
+
+  async function handleStartClick() {
+    await startChallenge()
+    setRedirect(true)
+  }
+
+  const renderRedirect = () => {
+    if (redirect) {
+      return (
+        <Redirect
+          to={{
+            pathname: '/challenges/ongoing',
+            state: currentChallenge,
+          }}
+        />
+      )
+    }
+  }
+
+  useEffect(() => {
+    let subscribed = true
+    if (challengeState) {
+      const lag = challengeService.getLagDays(fluidTypes)
+      const firstDayOfPreviousPeriod = challengeState.duration.days
+      const timePeriod = {
+        startDate: DateTime.local()
+          .plus({ days: -firstDayOfPreviousPeriod })
+          .startOf('day'),
+        endDate: DateTime.local()
+          .plus({ days: -lag })
+          .endOf('day'),
+      }
+
+      async function checkPreviousData() {
+        const consumptionService = new ConsumptionService(client)
+        const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
+          timePeriod,
+          20,
+          fluidTypes
+        )
+        if (fetchedPerformanceIndicators && subscribed) {
+          fetchedPerformanceIndicators.forEach(element => {
+            if (!element.value) setLackOfDataForChallenge(true)
+          })
+        } else {
+          setLackOfDataForChallenge(true)
+        }
+        setIsLoaded(true)
+      }
+      checkPreviousData()
+      setChallenge(challengeState)
+    }
+    return () => {
+      subscribed = false
+    }
+  }, [])
+
+  return (
+    <React.Fragment>
+      <CozyBar
+        titleKey={'COMMON.APP_NEW_CHALLENGE_TITLE'}
+        displayBackArrow={true}
+      />
+      <Header
+        setHeaderHeight={defineHeaderHeight}
+        desktopTitleKey={'COMMON.APP_NEW_CHALLENGE_TITLE'}
+        displayBackArrow={true}
+      ></Header>
+      {!challengeState ? <Redirect to="/challenges" /> : null}
+      <Content height={headerHeight} background="var(--darkLight2)">
+        {!challenge ? (
+          <StyledSpinner />
+        ) : (
+          <>
+            <div className="cp-root --available">
+              <div className="cp-content">
+                <div className="cp-info --available">
+                  <div className="cp-title text-22-bold">{challenge.title}</div>
+                  <img
+                    className="cp-icon"
+                    src={AvailableChallengeIcon}
+                    width={screenType === ScreenType.MOBILE ? 180 : 300}
+                  ></img>
+                  <div className="cp-description text-16-bold">
+                    {challenge.description}
+                  </div>
+                  <div className="cp-valid">
+                    <div className="cp-left-button">
+                      <StyledButtonValid
+                        color="secondary"
+                        onClick={() => history.goBack()}
+                      >
+                        {t('CHALLENGE.NOT_NOW')}
+                      </StyledButtonValid>
+                    </div>
+                    <div className="cp-right-button">
+                      <StyledButtonValid
+                        disabled={lackOfDataForChallenge || !isLoaded}
+                        color="primary"
+                        onClick={handleStartClick}
+                      >
+                        {t('CHALLENGE.START')}
+                        {renderRedirect()}
+                      </StyledButtonValid>
+                    </div>
+                  </div>
+                  <div className="lack-of-data-challenge">
+                    {lackOfDataForChallenge && isLoaded
+                      ? t('CHALLENGE.LACK_OF_DATA')
+                      : null}
+                  </div>
+                </div>
+              </div>
+            </div>
+          </>
+        )}
+      </Content>
+    </React.Fragment>
+  )
+}
+
+export default AvailableChallengeDetailsView
diff --git a/src/components/Challenge/ChallengeCardLink.tsx b/src/components/Challenge/ChallengeCardLink.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7dada7a8073276c6bd52252fb67e76a628740b5c
--- /dev/null
+++ b/src/components/Challenge/ChallengeCardLink.tsx
@@ -0,0 +1,26 @@
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useRecoilValue } from 'recoil'
+import { currentChallengeState } from 'atoms/challenge.state'
+import ChallengeCardLinkItem from 'components/Challenge/ChallengeCardLinkItem'
+
+const ChallengeCardLink: React.FC = () => {
+  const { t } = useI18n()
+  const currentChallenge = useRecoilValue(currentChallengeState)
+  return (
+    <>
+      <div className="ccc-root">
+        {currentChallenge && currentChallenge.challengeType && (
+          <div className="ccc-content">
+            <div className="ccc-header text-14-normal-uppercase">
+              {t('COMMON.CHALLENGE_CARD_LABEL')}
+            </div>
+            <ChallengeCardLinkItem userChallenge={currentChallenge} />
+          </div>
+        )}
+      </div>
+    </>
+  )
+}
+
+export default ChallengeCardLink
diff --git a/src/components/ContentComponents/ChallengeCard/ChallengeCard.tsx b/src/components/Challenge/ChallengeCardLinkItem.tsx
similarity index 66%
rename from src/components/ContentComponents/ChallengeCard/ChallengeCard.tsx
rename to src/components/Challenge/ChallengeCardLinkItem.tsx
index cfb9dfd02397257caa8fbdd9d37f646bb524c90d..650ab10de2098122e4d2b1aecc2f94e210d17ca9 100644
--- a/src/components/ContentComponents/ChallengeCard/ChallengeCard.tsx
+++ b/src/components/Challenge/ChallengeCardLinkItem.tsx
@@ -1,27 +1,30 @@
-import React, { useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { UserChallenge, TypeChallenge } from 'services/dataChallengeContracts'
-import StyledChallengeCard from 'components/CommonKit/Card/StyledChallengeCard'
+import React from 'react'
 import { NavLink } from 'react-router-dom'
-import { AppContext } from 'components/Contexts/AppContextProvider'
+import { useRecoilValue } from 'recoil'
+
+import { TypeChallenge } from 'enum/challenge.enum'
+import { challengeNotificationState } from 'atoms/notification.state'
+import { UserChallenge } from 'models'
+
+import StyledChallengeCard from 'components/CommonKit/Card/StyledChallengeCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import OngoingChallengePile from 'components/ContentComponents/Challenge/OngoingChallengePile'
-import OngoingChallengeViewingDate from 'components/ContentComponents/Challenge/OngoingChallengeViewingDate'
-import FollowChallengeTimeline from 'components/ContentComponents/Challenge/FollowChallengeTimeline'
+import ChallengePile from 'components/Challenge/ChallengePile'
+import ChallengeViewingDate from 'components/Challenge/ChallengeViewingDate'
+import ChallengeTimeline from 'components/Challenge/ChallengeTimeline'
 import BlackArrowIcon from 'assets/icons/ico/black-arrow.svg'
 
-interface ChallengeCardProps {
+interface ChallengeCardLinkItemProps {
   userChallenge: UserChallenge
 }
 
-const ChallengeCard: React.FC<ChallengeCardProps> = ({
+const ChallengeCardLinkItem: React.FC<ChallengeCardLinkItemProps> = ({
   userChallenge,
-}: ChallengeCardProps) => {
-  const { challengeNotification } = useContext(AppContext)
+}: ChallengeCardLinkItemProps) => {
+  const challengeNotification = useRecoilValue(challengeNotificationState)
   const challengesPath = 'challenges'
   const challengeDetailPath = {
     pathname: `challenges/ongoing`,
-    state: { challenge: userChallenge },
+    state: userChallenge,
   }
   return (
     <NavLink
@@ -38,16 +41,13 @@ const ChallengeCard: React.FC<ChallengeCardProps> = ({
                   {userChallenge.challengeType.title}
                 </div>
                 <div className="cc-content-progress">
-                  <OngoingChallengePile
-                    challenge={userChallenge}
-                    small={true}
-                  />
+                  <ChallengePile challenge={userChallenge} small={true} />
                 </div>
                 <div className="cc-content-timeline">
-                  <FollowChallengeTimeline challenge={userChallenge} />
+                  <ChallengeTimeline challenge={userChallenge} />
                 </div>
                 <div className="cc-content-visu text-15-normal">
-                  <OngoingChallengeViewingDate challenge={userChallenge} />
+                  <ChallengeViewingDate challenge={userChallenge} />
                 </div>
               </div>
               <div className="cc-content-right">
@@ -79,4 +79,4 @@ const ChallengeCard: React.FC<ChallengeCardProps> = ({
   )
 }
 
-export default translate()(ChallengeCard)
+export default ChallengeCardLinkItem
diff --git a/src/components/ContentComponents/ChallengeList/ChallengesList.tsx b/src/components/Challenge/ChallengeList.tsx
similarity index 62%
rename from src/components/ContentComponents/ChallengeList/ChallengesList.tsx
rename to src/components/Challenge/ChallengeList.tsx
index 89d8e1ace26eb274b00bddfdfe212e1cbb819bf7..87fa86592402ff5c71f7c0507bc9810c64ce8d52 100644
--- a/src/components/ContentComponents/ChallengeList/ChallengesList.tsx
+++ b/src/components/Challenge/ChallengeList.tsx
@@ -1,31 +1,30 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { withClient, Client } from 'cozy-client'
-import {
-  ChallengeType,
-  UserChallenge,
-  ChallengeState,
-} from 'services/dataChallengeContracts'
-import ChallengeManager from 'services/challengeDataManagerService'
-import StyledChallengeSpinner from 'components/CommonKit/Spinner/StyledChallengeSpinner'
-import ChallengeListItem from 'components/ContentComponents/ChallengeList/ChallengeListItem'
-import ChallengeModal from 'components/ContentComponents/ChallengeModal/ChallengeModal'
-import { AppContext } from 'components/Contexts/AppContextProvider'
+import React, { useState, useEffect } from 'react'
+import { useClient } from 'cozy-client'
+import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
+
+import { ChallengeState } from 'enum/challenge.enum'
 import { ScreenType } from 'enum/screen.enum'
+import { fluidTypeState } from 'atoms/fluidState.state'
+import { challengeNotificationState } from 'atoms/notification.state'
+import { screenTypeState } from 'atoms/screenType.state'
+import { currentChallengeState } from 'atoms/challenge.state'
+import { ChallengeType, UserChallenge } from 'models'
+import ChallengeService from 'services/challenge.service'
 
-interface ChallengesListProps {
-  client: Client
-}
+import StyledChallengeSpinner from 'components/CommonKit/Spinner/StyledChallengeSpinner'
+import ChallengeListItem from 'components/Challenge/ChallengeListItem'
+import ChallengeModal from 'components/Challenge/ChallengeModal'
 
-const ChallengesList: React.FC<ChallengesListProps> = ({
-  client,
-}: ChallengesListProps) => {
-  const {
-    fluidTypes,
-    refreshCurrentChallenge,
-    screenType,
-    challengeNotification,
-  } = useContext(AppContext)
-  const challengeManager = new ChallengeManager(client)
+const ChallengeList: React.FC = () => {
+  const client = useClient()
+  const screenType = useRecoilValue(screenTypeState)
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  const [challengeNotification, setChallengeNotification] = useRecoilState(
+    challengeNotificationState
+  )
+  const setCurrentChallenge = useSetRecoilState(currentChallengeState)
+
+  const challengeService = new ChallengeService(client)
   const [
     ongoingChallenge,
     setOngoingChallenge,
@@ -52,37 +51,37 @@ const ChallengesList: React.FC<ChallengesListProps> = ({
   }
 
   const setRightChallengeInTheMiddle = (
-    challengesType: ChallengeType[],
-    userChallenges: UserChallenge[]
+    _challengesType: ChallengeType[],
+    _userChallenges: UserChallenge[]
   ) => {
     const header = screenType === ScreenType.MOBILE ? 96 : 174
     const bottomNav = screenType === ScreenType.MOBILE ? 60 : 0
     const challengeCard = screenType === ScreenType.MOBILE ? 100 : 120
-    const paddingBottom =
+    const _paddingBottom =
       (window.innerHeight - header - bottomNav) / 2 -
-      userChallenges.length * challengeCard
+      _userChallenges.length * challengeCard
     const canFitInHalfScreen =
       window.innerHeight / 2 - header >
-      (challengesType.length - 1) * challengeCard
-    if (userChallenges[0].state === 0) {
-      setPaddingBottom(paddingBottom + bottomNav)
+      (_challengesType.length - 1) * challengeCard
+    if (_userChallenges[0].state === 0) {
+      setPaddingBottom(_paddingBottom + bottomNav)
       if (canFitInHalfScreen) {
         setScroll(0)
       } else {
         setScroll(
           (challengeCard / 2) *
-            challengesType.length *
+            _challengesType.length *
             (1 + challengeCard / window.innerHeight)
         )
       }
     } else {
-      setPaddingBottom(paddingBottom - challengeCard + bottomNav)
+      setPaddingBottom(_paddingBottom - challengeCard + bottomNav)
       if (canFitInHalfScreen) {
         setScroll(0)
       } else {
         setScroll(
           (challengeCard / 2) *
-            (challengesType.length - 1) *
+            (_challengesType.length - 1) *
             (1 + challengeCard / window.innerHeight)
         )
       }
@@ -92,11 +91,11 @@ const ChallengesList: React.FC<ChallengesListProps> = ({
   useEffect(() => {
     let subscribed = true
     async function loadAvailableChallenges() {
-      const dataAllCT = await challengeManager.getAvailableChallenges(
+      const dataAllCT = await challengeService.getAvailableChallenges(
         fluidTypes
       )
-      const dataAllUC = await challengeManager.getAllUserChallenges()
-      const levelOfUser = await challengeManager.getUserLevel()
+      const dataAllUC = await challengeService.getAllUserChallenges()
+      const levelOfUser = await challengeService.getUserLevel()
       if (subscribed && dataAllCT && dataAllUC && levelOfUser) {
         const ongoingChallengeTmp = dataAllUC.filter(
           challenge => challenge.state === ChallengeState.ONGOING
@@ -109,8 +108,9 @@ const ChallengesList: React.FC<ChallengesListProps> = ({
         setUserLevel(levelOfUser)
         if (challengeNotification) {
           setOpenChallengeModal(true)
-          await challengeManager.endChallenge(ongoingChallengeTmp, fluidTypes)
-          await refreshCurrentChallenge()
+          await challengeService.endChallenge(ongoingChallengeTmp, fluidTypes)
+          setCurrentChallenge(null)
+          setChallengeNotification(false)
           setOngoingChallenge(null)
         }
       }
@@ -124,11 +124,11 @@ const ChallengesList: React.FC<ChallengesListProps> = ({
   useEffect(() => {
     let subscribed = true
     async function loadNewChallengesType() {
-      const dataAllCT = await challengeManager.getAvailableChallenges(
+      const dataAllCT = await challengeService.getAvailableChallenges(
         fluidTypes
       )
-      const dataAllUC = await challengeManager.getAllUserChallenges()
-      const levelOfUser = await challengeManager.getUserLevel()
+      const dataAllUC = await challengeService.getAllUserChallenges()
+      const levelOfUser = await challengeService.getUserLevel()
       if (subscribed && dataAllCT && dataAllUC && levelOfUser) {
         setChallengesType(dataAllCT)
         setUserChallenges(dataAllUC)
@@ -181,29 +181,25 @@ const ChallengesList: React.FC<ChallengesListProps> = ({
                 )
               )}
               {userChallenges &&
-                userChallenges.map((challenge, index) =>
-                  challenge && challenge.state === 0 ? (
-                    <ChallengeListItem
-                      key={index}
-                      challenge={challenge.challengeType}
-                      userChallenge={challenge}
-                      challengeState="ongoing"
-                    />
-                  ) : (
-                    <ChallengeListItem
-                      key={index}
-                      challenge={challenge.challengeType}
-                      userChallenge={challenge}
-                      challengeState="finished"
-                      badgeStatus={challenge.badge}
-                    />
-                  )
-                )}
+                userChallenges.map((challenge, index) => (
+                  <ChallengeListItem
+                    key={index}
+                    challenge={
+                      challenge.challengeType
+                        ? challenge.challengeType
+                        : undefined
+                    }
+                    userChallenge={challenge}
+                    challengeState={
+                      challenge.state === 0 ? 'ongoing' : 'finished'
+                    }
+                  />
+                ))}
             </div>
           </div>
         </div>
       )}
-      {openChallengeModal && (
+      {openChallengeModal && ongoingChallengeModal && (
         <ChallengeModal
           opened={openChallengeModal}
           challenge={ongoingChallengeModal}
@@ -215,4 +211,4 @@ const ChallengesList: React.FC<ChallengesListProps> = ({
   )
 }
 
-export default withClient(ChallengesList)
+export default ChallengeList
diff --git a/src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx b/src/components/Challenge/ChallengeListItem.tsx
similarity index 78%
rename from src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx
rename to src/components/Challenge/ChallengeListItem.tsx
index a97b85f604236bad84fda49aceea24b4be3076e3..4d417c51083d1ba316ba92daedc144b9caf01e7e 100644
--- a/src/components/ContentComponents/ChallengeList/ChallengeListItem.tsx
+++ b/src/components/Challenge/ChallengeListItem.tsx
@@ -1,10 +1,9 @@
 import React, { useState, useEffect } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import {
-  ChallengeType,
-  UserChallenge,
-  EcogestureType,
-} from 'services/dataChallengeContracts'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { NavLink } from 'react-router-dom'
+
+import { ChallengeType, Ecogesture, UserChallenge } from 'models'
+
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import ChevronGrey from 'assets/icons/ico/chevron-right-grey.svg'
 import ChevronBlue from 'assets/icons/ico/chevron-right-blue.svg'
@@ -13,36 +12,36 @@ import LockedChallengeIcon from 'assets/png/badges/locked.png'
 import AvailableChallengeIcon from 'assets/png/badges/available.png'
 import OngoingChallengeIcon from 'assets/png/badges/ongoing.png'
 import DefaultChallengeIcon from 'assets/png/badges/default.png'
-import { NavLink } from 'react-router-dom'
 
 interface ChallengeListItemProps {
-  challenge: ChallengeType
+  challenge?: ChallengeType
   userChallenge?: UserChallenge
   handleClick?: (challenge: ChallengeType) => void
-  t: Function
   challengeState?: string
-  ecogestures?: EcogestureType[]
+  ecogestures?: Ecogesture[]
 }
 
 const ChallengeListItem: React.FC<ChallengeListItemProps> = ({
   challenge,
   userChallenge,
-  t,
   challengeState,
 }: ChallengeListItemProps) => {
-  const [badgeIcon, setBadgeIcon] = useState<any | null>(null)
+  const { t } = useI18n()
+  const [badgeIcon, setBadgeIcon] = useState<string | undefined>()
 
   async function importRightBadge(id: string, badgeStatus: number) {
-    // Les png doivent être au format idchallenge-badgestate.png
-    const importedBadge =
-      id === 'CHA00000001'
-        ? await import(
-            /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png`
-          )
-        : await import(
-            /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png`
-          )
-    setBadgeIcon(importedBadge.default)
+    if (badgeStatus !== -1) {
+      // Les png doivent être au format idchallenge-badgestate.png
+      const importedBadge =
+        id === 'CHA00000001'
+          ? await import(
+              /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png`
+            )
+          : await import(
+              /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png`
+            )
+      setBadgeIcon(importedBadge.default)
+    }
   }
 
   const defineBadge = () => {
@@ -71,7 +70,7 @@ const ChallengeListItem: React.FC<ChallengeListItemProps> = ({
       className="cli-link"
       to={{
         pathname: `challenges/${challengeState}`,
-        state: { challenge: userChallenge ? userChallenge : challenge },
+        state: userChallenge ? userChallenge : challenge,
       }}
     >
       <div className={`cli cli-${challengeState}`}>
@@ -102,9 +101,9 @@ const ChallengeListItem: React.FC<ChallengeListItemProps> = ({
                 </div>
               )}
               <div className={`title-${challengeState} text-18-bold`}>
-                {!challenge.title
-                  ? t('CHALLENGE.NO_CHALLENGE')
-                  : challenge.title}
+                {challenge && challenge.title
+                  ? challenge.title
+                  : t('CHALLENGE.NO_CHALLENGE')}
               </div>
             </div>
           </div>
@@ -123,4 +122,4 @@ const ChallengeListItem: React.FC<ChallengeListItemProps> = ({
   )
 }
 
-export default translate()(ChallengeListItem)
+export default ChallengeListItem
diff --git a/src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx b/src/components/Challenge/ChallengeModal.tsx
similarity index 81%
rename from src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx
rename to src/components/Challenge/ChallengeModal.tsx
index 13cec17b7b28a4957a181419413da42d2ec7257c..be6fcc9289977aadfb55a1c5f04ef48ce3cb939b 100644
--- a/src/components/ContentComponents/ChallengeModal/ChallengeModal.tsx
+++ b/src/components/Challenge/ChallengeModal.tsx
@@ -1,19 +1,21 @@
-import React, { useState, useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { UserChallenge } from 'services/dataChallengeContracts'
+import React, { useState } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useRecoilValue } from 'recoil'
+
+import { ScreenType } from 'enum/screen.enum'
+import { screenTypeState } from 'atoms/screenType.state'
+import { UserChallenge } from 'models'
+import { formatNumberValues } from 'utils/utils'
+
 import Modal from 'components/CommonKit/Modal/Modal'
 import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
 import StarIcon from 'assets/icons/visu/challenge/star.svg'
 import StyledButtonValid from 'components/CommonKit/Button/StyledButtonValid'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { formatNumberValues } from 'utils/utils'
-import { ScreenType } from 'enum/screen.enum'
-import { AppContext } from 'components/Contexts/AppContextProvider'
 
 interface ChallengeModalProps {
   opened: boolean
   challenge: UserChallenge
-  t: Function
   handleCloseClick: () => void
   badgeStatus: number | null
 }
@@ -21,27 +23,29 @@ interface ChallengeModalProps {
 const ChallengeModal: React.FC<ChallengeModalProps> = ({
   opened,
   challenge,
-  t,
   handleCloseClick,
   badgeStatus,
 }: ChallengeModalProps) => {
-  const [badgeIcon, setBadgeIcon] = useState<any | null>(null)
-  const { screenType } = useContext(AppContext)
+  const { t } = useI18n()
+  const screenType = useRecoilValue(screenTypeState)
+  const [badgeIcon, setBadgeIcon] = useState<string | null>(null)
 
-  async function importRightBadge(id: string, badgeStatus: number) {
-    // Les png doivent être au format idchallenge-badgestate.png
-    const importedBadge =
-      id === 'CHA00000001'
-        ? await import(
-            /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png`
-          )
-        : await import(
-            /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png`
-          )
-    setBadgeIcon(importedBadge.default)
+  async function importRightBadge(id: string, _badgeStatus: number) {
+    if (badgeStatus !== -1) {
+      // Les png doivent être au format idchallenge-badgestate.png
+      const importedBadge =
+        id === 'CHA00000001'
+          ? await import(
+              /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png`
+            )
+          : await import(
+              /* webpackMode: "eager" */ `assets/png/badges/${id}-${_badgeStatus}.png`
+            )
+      setBadgeIcon(importedBadge.default)
+    }
   }
 
-  const showTheRightBadge = (badgeStatus: number | null) => {
+  const showTheRightBadge = (_badgeStatus: number | null) => {
     const result =
       challenge &&
       formatNumberValues(
@@ -53,7 +57,7 @@ const ChallengeModal: React.FC<ChallengeModalProps> = ({
     const badge = challenge.badge ? challenge.badge : 0
     importRightBadge(challengeId, badge)
     if (badgeIcon) {
-      if (badgeStatus === 1) {
+      if (_badgeStatus === 1) {
         return (
           <>
             <div className="cm-title win text-24-bold ">
@@ -158,4 +162,4 @@ const ChallengeModal: React.FC<ChallengeModalProps> = ({
   )
 }
 
-export default translate()(ChallengeModal)
+export default ChallengeModal
diff --git a/src/components/ContentComponents/Challenge/OngoingChallengePile.tsx b/src/components/Challenge/ChallengePile.tsx
similarity index 86%
rename from src/components/ContentComponents/Challenge/OngoingChallengePile.tsx
rename to src/components/Challenge/ChallengePile.tsx
index 63d90c1d00451ec064b2c649192b2007f9907c2e..47eaa7d6622af76fc0f28ec39765381d44a3e934 100644
--- a/src/components/ContentComponents/Challenge/OngoingChallengePile.tsx
+++ b/src/components/Challenge/ChallengePile.tsx
@@ -1,21 +1,22 @@
 import React, { useState, useEffect } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { UserChallenge } from 'services/dataChallengeContracts'
+import { useI18n } from 'cozy-ui/transpiled/react'
+
+import { UserChallenge } from 'models'
 import { formatNumberValues } from 'utils/utils'
+
 import pile from 'assets/icons/visu/challenge/pile.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 
-interface OngoingChallengePileProps {
+interface ChallengePileProps {
   challenge: UserChallenge
   small?: boolean
-  t: Function
 }
 
-const OngoingChallengePile: React.FC<OngoingChallengePileProps> = ({
+const ChallengePile: React.FC<ChallengePileProps> = ({
   challenge,
   small = false,
-  t,
-}: OngoingChallengePileProps) => {
+}: ChallengePileProps) => {
+  const { t } = useI18n()
   const [pilePercent, setPilePercent] = useState<number>(0)
   const sizePile = small ? 100 : 150
   const textFont = small ? 'text-17-bold' : 'text-20-bold'
@@ -75,4 +76,4 @@ const OngoingChallengePile: React.FC<OngoingChallengePileProps> = ({
   )
 }
 
-export default translate()(OngoingChallengePile)
+export default ChallengePile
diff --git a/src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx b/src/components/Challenge/ChallengeTimeline.tsx
similarity index 84%
rename from src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx
rename to src/components/Challenge/ChallengeTimeline.tsx
index 6cc015ff90dd0bd569bd5f4722b1b7eaf68e7ccd..55e41e7ef637deb523258fdaf47c00159c3e7caf 100644
--- a/src/components/ContentComponents/Challenge/FollowChallengeTimeline.tsx
+++ b/src/components/Challenge/ChallengeTimeline.tsx
@@ -1,29 +1,25 @@
-import React, { useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { UserChallenge } from 'services/dataChallengeContracts'
+import React from 'react'
+import { useClient } from 'cozy-client'
 import { DateTime, Interval } from 'luxon'
-import { FluidType } from 'enum/fluid.enum'
-import ChallengeManager from 'services/challengeDataManagerService'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { Client } from 'cozy-client'
 
-interface FollowChallengeTimelineViewProps {
+import { UserChallenge } from 'models'
+import ChallengeService from 'services/challenge.service'
+
+interface ChallengeTimelineViewProps {
   challenge: UserChallenge
-  client: Client
 }
 
-const FollowChallengeTimeline: React.FC<FollowChallengeTimelineViewProps> = ({
+const ChallengeTimeline: React.FC<ChallengeTimelineViewProps> = ({
   challenge,
-  client,
-}: FollowChallengeTimelineViewProps) => {
-  const { fluidTypes } = useContext(AppContext)
-  const challengeManager = new ChallengeManager(client)
+}: ChallengeTimelineViewProps) => {
+  const client = useClient()
+  const challengeService = new ChallengeService(client)
 
   const viewingDate = () => {
     if (challenge && challenge.challengeType) {
       const startingDate = challenge.startingDate
       return startingDate.plus({
-        days: challengeManager.getLagDays(challenge.fluidTypes),
+        days: challengeService.getLagDays(challenge.fluidTypes),
       })
     } else {
       return DateTime.local()
@@ -172,4 +168,4 @@ const FollowChallengeTimeline: React.FC<FollowChallengeTimelineViewProps> = ({
   )
 }
 
-export default translate()(FollowChallengeTimeline)
+export default ChallengeTimeline
diff --git a/src/components/Challenge/ChallengeView.tsx b/src/components/Challenge/ChallengeView.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..9be9e28ea651c704a1231e683a84c6d50e70d30c
--- /dev/null
+++ b/src/components/Challenge/ChallengeView.tsx
@@ -0,0 +1,28 @@
+import React, { useState } from 'react'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import ChallengesList from 'components/Challenge/ChallengeList'
+
+const ChallengeView: React.FC = () => {
+  const [headerHeight, setHeaderHeight] = useState<number>(0)
+
+  const defineHeaderHeight = (height: number) => {
+    setHeaderHeight(height)
+  }
+
+  return (
+    <React.Fragment>
+      <CozyBar titleKey={'COMMON.APP_CHALLENGE_TITLE'} />
+      <Header
+        setHeaderHeight={defineHeaderHeight}
+        desktopTitleKey={'COMMON.APP_CHALLENGE_TITLE'}
+      ></Header>
+      <Content height={headerHeight} background="var(--darkLight2)">
+        <ChallengesList />
+      </Content>
+    </React.Fragment>
+  )
+}
+
+export default ChallengeView
diff --git a/src/components/ContentComponents/Challenge/OngoingChallengeViewingDate.tsx b/src/components/Challenge/ChallengeViewingDate.tsx
similarity index 50%
rename from src/components/ContentComponents/Challenge/OngoingChallengeViewingDate.tsx
rename to src/components/Challenge/ChallengeViewingDate.tsx
index 85dd1f3734738666cd4be57f06e1e93d81b275fb..44726b16894aee0369bc9c0e359266222de20f97 100644
--- a/src/components/ContentComponents/Challenge/OngoingChallengeViewingDate.tsx
+++ b/src/components/Challenge/ChallengeViewingDate.tsx
@@ -1,34 +1,34 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { UserChallenge } from 'services/dataChallengeContracts'
+import React, { useState, useEffect } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 import { DateTime } from 'luxon'
-import ChallengeManager from 'services/challengeDataManagerService'
-import { Client, withClient } from 'cozy-client'
-import { AppContext } from 'components/Contexts/AppContextProvider'
 
-interface OngoingChallengeViewingDateProps {
+import { UserChallenge } from 'models'
+import ChallengeService from 'services/challenge.service'
+
+interface ChallengeViewingDateProps {
   challenge: UserChallenge
-  client: Client
-  t: Function
 }
 
-const OngoingChallengeViewingDate: React.FC<OngoingChallengeViewingDateProps> = ({
+const ChallengeViewingDate: React.FC<ChallengeViewingDateProps> = ({
   challenge,
-  client,
-  t,
-}: OngoingChallengeViewingDateProps) => {
-  const challengeManager = new ChallengeManager(client)
-  const { fluidTypes } = useContext(AppContext)
+}: ChallengeViewingDateProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const challengeService = new ChallengeService(client)
   const [firstDateWithData, setFirstDateWithData] = useState<DateTime | null>(
     null
   )
   const [lastDateWithData, setLastDateWithData] = useState<DateTime | null>(
     null
   )
+  const diffDays =
+    firstDateWithData && firstDateWithData.diffNow(['days']).toObject().days
+  const diffDaysCeil = Math.ceil(diffDays || 0)
 
   useEffect(() => {
     if (challenge) {
-      const lag = challengeManager.getLagDays(challenge.fluidTypes)
+      const lag = challengeService.getLagDays(challenge.fluidTypes)
       setFirstDateWithData(
         challenge.startingDate.plus({
           days: lag,
@@ -41,13 +41,15 @@ const OngoingChallengeViewingDate: React.FC<OngoingChallengeViewingDateProps> =
       )
     }
   }, [])
-
+  /* eslint-disable @typescript-eslint/camelcase */
   return (
     <React.Fragment>
       {firstDateWithData && firstDateWithData > DateTime.local() ? (
         <div className="view-start-date">
-          {t('CHALLENGE.VIEW_START')}
-          <span>{firstDateWithData.toLocaleString()}</span>
+          {t('CHALLENGE.VIEW_START', {
+            diffDaysCeil,
+            smart_count: diffDaysCeil,
+          })}
         </div>
       ) : (
         <div className="view-start-date">
@@ -59,4 +61,4 @@ const OngoingChallengeViewingDate: React.FC<OngoingChallengeViewingDateProps> =
   )
 }
 
-export default translate()(withClient(OngoingChallengeViewingDate))
+export default ChallengeViewingDate
diff --git a/src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx b/src/components/Challenge/FinishedChallengeDetailsView.tsx
similarity index 69%
rename from src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx
rename to src/components/Challenge/FinishedChallengeDetailsView.tsx
index 6b34c83cc892d2df4afa0a03b7613321061948b1..a577c4be9af569cf61f0a3f5d2a11c2e47471b36 100644
--- a/src/components/ContainerComponents/ViewContainer/FinishedChallengeDetailsViewContainer.tsx
+++ b/src/components/Challenge/FinishedChallengeDetailsView.tsx
@@ -1,52 +1,52 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import {
-  UserChallenge,
-  TypeChallenge,
-  BadgeState,
-} from 'services/dataChallengeContracts'
-import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import StarIcon from 'assets/png/challenge/star.png'
-import EcogestureModal from 'components/ContentComponents/EcogestureModal/EcogestureModal'
-import EcogestureCard from 'components/ContentComponents/EcogestureCard/EcogestureCard'
-import { Client, withClient } from 'cozy-client'
+import React, { useState, useEffect } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { Redirect } from 'react-router-dom'
-import { formatNumberValues } from 'utils/utils'
-import { AppContext } from 'components/Contexts/AppContextProvider'
+import { useRecoilValue } from 'recoil'
+import { Location } from 'history'
+
+import { TypeChallenge, BadgeState } from 'enum/challenge.enum'
 import { ScreenType } from 'enum/screen.enum'
+import { UserChallenge } from 'models'
+import { screenTypeState } from 'atoms/screenType.state'
+import { formatNumberValues } from 'utils/utils'
+
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
+import StarIcon from 'assets/png/challenge/star.png'
+import EcogestureModal from 'components/Ecogesture/EcogestureModal'
+import EcogestureCard from 'components/Ecogesture/EcogestureCard'
 
 interface FinishedChallengeDetailsViewProps {
-  location: any
-  props: any
-  client: Client
-  t: Function
+  location: Location<UserChallenge>
 }
 
-const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsViewProps> = (
-  props: FinishedChallengeDetailsViewProps
-) => {
-  const t = props.t
+const FinishedChallengeDetailsView: React.FC<FinishedChallengeDetailsViewProps> = ({
+  location,
+}: FinishedChallengeDetailsViewProps) => {
+  const { t } = useI18n()
+  const userChallengeState = location.state
+  const screenType = useRecoilValue(screenTypeState)
   const [challengeEcogesture, setChallengeEcogesture] = useState<number>(0)
   const [openEcogestureModal, setOpenEcogestureModal] = useState(false)
   const [challenge, setChallenge] = useState<UserChallenge | null>(null)
   const [headerHeight, setHeaderHeight] = useState<number>(0)
-  const [badgeIcon, setBadgeIcon] = useState<any | null>(null)
-  const { screenType } = useContext(AppContext)
+  const [badgeIcon, setBadgeIcon] = useState<string | undefined>()
 
   async function importRightBadge(id: string, badgeStatus: number) {
-    // Les png doivent être au format idchallenge-badgestate.png
-    const importedBadge =
-      id === 'CHA00000001'
-        ? await import(
-            /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png`
-          )
-        : await import(
-            /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png`
-          )
-    setBadgeIcon(importedBadge.default)
+    if (badgeStatus !== -1) {
+      // Les png doivent être au format idchallenge-badgestate.png
+      const importedBadge =
+        id === 'CHA00000001'
+          ? await import(
+              /* webpackMode: "eager" */ `assets/png/badges/${id}-1.png`
+            )
+          : await import(
+              /* webpackMode: "eager" */ `assets/png/badges/${id}-${badgeStatus}.png`
+            )
+      setBadgeIcon(importedBadge.default)
+    }
   }
 
   const defineHeaderHeight = (height: number) => {
@@ -63,12 +63,14 @@ const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsVi
   }
 
   useEffect(() => {
-    if (props.location.state) {
-      setChallenge(props && props.location.state.challenge)
-      importRightBadge(
-        props.location.state.challenge.challengeType.id,
-        props.location.state.challenge.badge
-      )
+    if (userChallengeState) {
+      setChallenge(userChallengeState)
+      if (userChallengeState.challengeType && userChallengeState.badge) {
+        importRightBadge(
+          userChallengeState.challengeType.id,
+          userChallengeState.badge
+        )
+      }
     }
   }, [])
 
@@ -87,7 +89,7 @@ const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsVi
         desktopTitleKey={'COMMON.APP_FINISHED_CHALLENGE_TITLE'}
         displayBackArrow={true}
       ></Header>
-      {!props.location.state ? <Redirect to="/challenges" /> : null}
+      {!userChallengeState ? <Redirect to="/challenges" /> : null}
       <Content height={headerHeight} background="var(--darkLight2)">
         {!challenge ? (
           <StyledSpinner />
@@ -160,12 +162,14 @@ const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsVi
                 </div>
               </div>
             </div>
-            <EcogestureModal
-              opened={openEcogestureModal}
-              ecogesture={challenge.selectedEcogestures[challengeEcogesture]}
-              handleCloseClick={handleCloseClick}
-              unlockedEcogesture={true}
-            />
+            {openEcogestureModal && (
+              <EcogestureModal
+                open={openEcogestureModal}
+                ecogesture={challenge.selectedEcogestures[challengeEcogesture]}
+                handleCloseClick={handleCloseClick}
+                unlockedEcogesture={true}
+              />
+            )}
           </>
         )}
       </Content>
@@ -173,4 +177,4 @@ const FinishedChallengeDetailsViewContainer: React.FC<FinishedChallengeDetailsVi
   )
 }
 
-export default translate()(withClient(FinishedChallengeDetailsViewContainer))
+export default FinishedChallengeDetailsView
diff --git a/src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx b/src/components/Challenge/LockedChallengeDetailsViewContainer.tsx
similarity index 68%
rename from src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx
rename to src/components/Challenge/LockedChallengeDetailsViewContainer.tsx
index 36ee470b0237383ca94810b6ee5b4227c7bf15ca..858e0161db84fccacb812c5802f1955ee755f3e0 100644
--- a/src/components/ContainerComponents/ViewContainer/LockedChallengeDetailsViewContainer.tsx
+++ b/src/components/Challenge/LockedChallengeDetailsViewContainer.tsx
@@ -1,40 +1,41 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import { history } from 'components/ContainerComponents/ViewContainer/ViewContainer'
-import { ChallengeType } from 'services/dataChallengeContracts'
+import React, { useState, useEffect } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { Redirect } from 'react-router-dom'
+import { useRecoilValue } from 'recoil'
+import { Location } from 'history'
+
+import { ScreenType } from 'enum/screen.enum'
+import { screenTypeState } from 'atoms/screenType.state'
+import { ChallengeType } from 'models'
+
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import { history } from 'components/App'
 import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import { Client, withClient } from 'cozy-client'
 import StyledButtonValid from 'components/CommonKit/Button/StyledButtonValid'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { ScreenType } from 'enum/screen.enum'
 import LockedChallengeIcon from 'assets/png/badges/locked-big.png'
 
 interface LockedChallengeDetailsViewProps {
-  location: any
-  props: any
-  client: Client
-  t: Function
+  location: Location<ChallengeType>
 }
 
-const LockedChallengeDetailsViewContainer: React.FC<LockedChallengeDetailsViewProps> = (
-  props: LockedChallengeDetailsViewProps
-) => {
-  const t = props.t
+const LockedChallengeDetailsViewContainer: React.FC<LockedChallengeDetailsViewProps> = ({
+  location,
+}: LockedChallengeDetailsViewProps) => {
+  const { t } = useI18n()
+  const screenType = useRecoilValue(screenTypeState)
   const [challenge, setChallenge] = useState<ChallengeType | null>(null)
   const [headerHeight, setHeaderHeight] = useState<number>(0)
-  const { screenType } = useContext(AppContext)
+  const challengeState = location.state
 
   const defineHeaderHeight = (height: number) => {
     setHeaderHeight(height)
   }
 
   useEffect(() => {
-    if (props.location.state) {
-      setChallenge(props && props.location.state.challenge)
+    if (challengeState) {
+      setChallenge(challengeState)
     }
   }, [])
 
@@ -49,7 +50,7 @@ const LockedChallengeDetailsViewContainer: React.FC<LockedChallengeDetailsViewPr
         desktopTitleKey={'COMMON.APP_LOCKED_CHALLENGE_TITLE'}
         displayBackArrow={true}
       ></Header>
-      {!props.location.state ? <Redirect to="/challenges" /> : null}
+      {!challengeState ? <Redirect to="/challenges" /> : null}
       <Content height={headerHeight} background="var(--darkLight2)">
         {!challenge ? (
           <StyledSpinner />
@@ -87,4 +88,4 @@ const LockedChallengeDetailsViewContainer: React.FC<LockedChallengeDetailsViewPr
   )
 }
 
-export default translate()(withClient(LockedChallengeDetailsViewContainer))
+export default LockedChallengeDetailsViewContainer
diff --git a/src/components/ContainerComponents/ViewContainer/OngoingChallengeDetailsViewContainer.tsx b/src/components/Challenge/OngoingChallengeDetailsView.tsx
similarity index 58%
rename from src/components/ContainerComponents/ViewContainer/OngoingChallengeDetailsViewContainer.tsx
rename to src/components/Challenge/OngoingChallengeDetailsView.tsx
index 5dccdf94b7fd70d0f3a5c3f31f6b2e86a4436301..00f0c4a7ed60be66a8f6451b55bd8312c15518c8 100644
--- a/src/components/ContainerComponents/ViewContainer/OngoingChallengeDetailsViewContainer.tsx
+++ b/src/components/Challenge/OngoingChallengeDetailsView.tsx
@@ -1,61 +1,83 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { translate } from 'cozy-ui/react/I18n'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import { history } from 'components/ContainerComponents/ViewContainer/ViewContainer'
-import {
-  UserChallenge,
-  ChallengeState,
-  TypeChallenge,
-} from 'services/dataChallengeContracts'
+import React, { useState, useEffect, useCallback } from 'react'
 import { Redirect } from 'react-router-dom'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil'
+import { Location } from 'history'
+
+import { ChallengeState, TypeChallenge } from 'enum/challenge.enum'
+import { ScreenType } from 'enum/screen.enum'
+import { UserChallenge, UserProfile } from 'models'
+import { userProfileState } from 'atoms/userProfile.state'
+import { screenTypeState } from 'atoms/screenType.state'
+import { currentChallengeState } from 'atoms/challenge.state'
+import ChallengeService from 'services/challenge.service'
+import UserProfileService from 'services/userProfile.service'
+import { formatCompareChallengeDate } from 'utils/date'
+
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import { history } from 'components/App'
 import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import EcogestureModal from 'components/ContentComponents/EcogestureModal/EcogestureModal'
-import EcogestureCard from 'components/ContentComponents/EcogestureCard/EcogestureCard'
-import ChallengeManager from 'services/challengeDataManagerService'
-import { Client, withClient } from 'cozy-client'
+import EcogestureModal from 'components/Ecogesture/EcogestureModal'
+import EcogestureCard from 'components/Ecogesture/EcogestureCard'
 import StyledStopButton from 'components/CommonKit/Button/StyledStopButton'
-import { formatCompareChallengeDate } from 'utils/utils'
-import OngoingChallengePile from 'components/ContentComponents/Challenge/OngoingChallengePile'
-import OngoingChallengeViewingDate from 'components/ContentComponents/Challenge/OngoingChallengeViewingDate'
-import FollowChallengeTimeline from 'components/ContentComponents/Challenge/FollowChallengeTimeline'
+import ChallengePile from 'components/Challenge/ChallengePile'
+import ChallengeViewingDate from 'components/Challenge/ChallengeViewingDate'
+import ChallengeTimeline from 'components/Challenge/ChallengeTimeline'
 import AvailableChallengeIcon from 'assets/png/badges/available.png'
-import { ScreenType } from 'enum/screen.enum'
 
 interface OngoingChallengeDetailsViewProps {
-  location: any
-  props: any
-  client: Client
-  t: Function
+  location: Location<UserChallenge>
 }
 
-const OngoingChallengeDetailsViewContainer: React.FC<OngoingChallengeDetailsViewProps> = (
-  props: OngoingChallengeDetailsViewProps
-) => {
-  const t = props.t
-  const client = props.client
-  const challengeManager = new ChallengeManager(client)
+const OngoingChallengeDetailsView: React.FC<OngoingChallengeDetailsViewProps> = ({
+  location,
+}: OngoingChallengeDetailsViewProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const screenType = useRecoilValue(screenTypeState)
+  const [userProfile, setUserProfile] = useRecoilState<UserProfile>(
+    userProfileState
+  )
+  const setCurrentChallenge = useSetRecoilState(currentChallengeState)
 
-  const { refreshCurrentChallenge, screenType } = useContext(AppContext)
+  const userChallengeState = location.state
   const [challengeEcogesture, setChallengeEcogesture] = useState<number>(0)
   const [openEcogestureModal, setOpenEcogestureModal] = useState(false)
   const [challenge, setChallenge] = useState<UserChallenge | null>(null)
   const [headerHeight, setHeaderHeight] = useState<number>(0)
   const [maxEnergy, setMaxEnergy] = useState<number | null>(0)
 
+  const challengeService = new ChallengeService(client)
+
   const defineHeaderHeight = (height: number) => {
     setHeaderHeight(height)
   }
 
-  async function stopChallenge(challenge: UserChallenge) {
-    if (challenge) {
-      await challengeManager.updateChallengeState(
-        challenge.id,
-        ChallengeState.ABANDONED
+  const updateUserProfileNotification = useCallback(
+    async (ecogestureList: string[]) => {
+      const userProfileService = new UserProfileService(client)
+      await userProfileService
+        .updateUserProfile({ notificationEcogesture: ecogestureList })
+        .then(updatedUserProfile => {
+          updatedUserProfile && setUserProfile(updatedUserProfile)
+        })
+    },
+    [setUserProfile]
+  )
+
+  async function stopChallenge(_challenge: UserChallenge) {
+    if (_challenge) {
+      await challengeService.cancelChallenge(_challenge.id)
+      const updatednotificationEcogesture = userProfile.notificationEcogesture.filter(
+        (x: string) =>
+          x !== _challenge.selectedEcogestures[0].id &&
+          x !== _challenge.selectedEcogestures[1].id
       )
-      await refreshCurrentChallenge()
+      await updateUserProfileNotification(updatednotificationEcogesture)
+      setCurrentChallenge(null)
       history.goBack()
     }
   }
@@ -70,9 +92,9 @@ const OngoingChallengeDetailsViewContainer: React.FC<OngoingChallengeDetailsView
   }
 
   useEffect(() => {
-    if (props.location.state) {
-      setChallenge(props && props.location.state.challenge)
-      setMaxEnergy(props.location.state.challenge.maxEnergy)
+    if (userChallengeState) {
+      setChallenge(userChallengeState)
+      setMaxEnergy(userChallengeState.maxEnergy)
     }
   }, [])
 
@@ -87,7 +109,7 @@ const OngoingChallengeDetailsViewContainer: React.FC<OngoingChallengeDetailsView
         desktopTitleKey={'COMMON.APP_ONGOING_CHALLENGE_TITLE'}
         displayBackArrow={true}
       ></Header>
-      {!props.location.state ? <Redirect to="/challenges" /> : null}
+      {!location.state ? <Redirect to="/challenges" /> : null}
       <Content height={headerHeight} background="var(--darkLight2)">
         {!challenge ? (
           <StyledSpinner />
@@ -109,13 +131,12 @@ const OngoingChallengeDetailsViewContainer: React.FC<OngoingChallengeDetailsView
                   ) : (
                     <div className="cp-follow">
                       {maxEnergy && maxEnergy === -1 && (
-                        <OngoingChallengeViewingDate challenge={challenge} />
+                        <ChallengeViewingDate challenge={challenge} />
                       )}
-                      <OngoingChallengePile challenge={challenge} />
-                      <FollowChallengeTimeline challenge={challenge} />
+                      <ChallengePile challenge={challenge} />
+                      <ChallengeTimeline challenge={challenge} />
                     </div>
                   )}
-
                   <div className="cp-description text-16-bold">
                     {challenge.challengeType &&
                       challenge.challengeType.description}
@@ -158,7 +179,7 @@ const OngoingChallengeDetailsViewContainer: React.FC<OngoingChallengeDetailsView
             </div>
             {openEcogestureModal && (
               <EcogestureModal
-                opened={openEcogestureModal}
+                open={openEcogestureModal}
                 ecogesture={challenge.selectedEcogestures[challengeEcogesture]}
                 handleCloseClick={handleCloseClick}
                 unlockedEcogesture={true}
@@ -171,4 +192,4 @@ const OngoingChallengeDetailsViewContainer: React.FC<OngoingChallengeDetailsView
   )
 }
 
-export default translate()(withClient(OngoingChallengeDetailsViewContainer))
+export default OngoingChallengeDetailsView
diff --git a/src/components/ContentComponents/Charts/AxisBottom.tsx b/src/components/Charts/AxisBottom.tsx
similarity index 86%
rename from src/components/ContentComponents/Charts/AxisBottom.tsx
rename to src/components/Charts/AxisBottom.tsx
index e3c7d7884e4c072510620e4ed52d60b348bc6ab3..f3d5a103b785210f8bbbab855863e6aee5711671 100644
--- a/src/components/ContentComponents/Charts/AxisBottom.tsx
+++ b/src/components/Charts/AxisBottom.tsx
@@ -1,12 +1,14 @@
 import React from 'react'
-import { ScaleBand } from 'd3-scale'
-import { IDataload, TimeStep } from 'services/dataConsumptionContracts'
-import { compareStepDate } from 'services/dateChartService'
 import { DateTime } from 'luxon'
+import { ScaleBand } from 'd3-scale'
+
+import { TimeStep } from 'enum/timeStep.enum'
+import { Dataload } from 'models'
+import DateChartService from 'services/dateChart.service'
 
 interface TextTypeProps {
   index: number
-  dataload: IDataload
+  dataload: Dataload
   timeStep: TimeStep
   width: number
   selectedDate: DateTime
@@ -14,7 +16,12 @@ interface TextTypeProps {
 
 function TextAxis(props: TextTypeProps) {
   const { index, dataload, timeStep, width, selectedDate } = props
-  const isSelectedDate = compareStepDate(timeStep, selectedDate, dataload.date)
+  const dateChartService = new DateChartService()
+  const isSelectedDate = dateChartService.compareStepDate(
+    timeStep,
+    selectedDate,
+    dataload.date
+  )
   const style = isSelectedDate
     ? 'tick-text tick-text-selected chart-ticks-x-text'
     : 'tick-text chart-ticks-x-text'
@@ -74,7 +81,7 @@ function TextAxis(props: TextTypeProps) {
 }
 
 interface AxisBottomProps {
-  data: IDataload[]
+  data: Dataload[]
   timeStep: TimeStep
   xScale: ScaleBand<string>
   height: number
@@ -94,7 +101,7 @@ const AxisBottom = (props: AxisBottomProps) => {
     selectedDate,
   } = props
   const dashArray = `${height / 30} ${height / 30}`
-
+  const dateChartService = new DateChartService()
   return (
     <g
       className="axis x"
@@ -116,7 +123,11 @@ const AxisBottom = (props: AxisBottomProps) => {
             width={xScale.bandwidth() / 2}
             selectedDate={selectedDate}
           />
-          {compareStepDate(timeStep, DateTime.local(), d.date) ? (
+          {dateChartService.compareStepDate(
+            timeStep,
+            DateTime.local(),
+            d.date
+          ) ? (
             <line
               stroke="white"
               strokeLinecap="round"
diff --git a/src/components/ContentComponents/Charts/AxisRight.tsx b/src/components/Charts/AxisRight.tsx
similarity index 73%
rename from src/components/ContentComponents/Charts/AxisRight.tsx
rename to src/components/Charts/AxisRight.tsx
index 54519c76c225cacb3eb23ff19c4825943459ee06..9d4a1781b5f528dcc9b7d727e0b09dbe4c000490 100644
--- a/src/components/ContentComponents/Charts/AxisRight.tsx
+++ b/src/components/Charts/AxisRight.tsx
@@ -1,5 +1,5 @@
 import React, { useEffect, useRef } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { select, selectAll } from 'd3-selection'
 import { axisRight } from 'd3-axis'
 import { ScaleLinear } from 'd3-scale'
@@ -11,13 +11,19 @@ interface AxisRightProps {
   width: number
   marginRight: number
   marginTop: number
-  t: Function // translation service
 }
 
-const AxisRight = (props: AxisRightProps) => {
-  const { yScale, fluidTypes, width, marginRight, marginTop, t } = props
+const AxisRight = ({
+  yScale,
+  fluidTypes,
+  width,
+  marginRight,
+  marginTop,
+}: AxisRightProps) => {
+  const { t } = useI18n()
+  const isHome: boolean = !window.location.hash.split('/')[2] ? true : false
   const fluidStyle =
-    fluidTypes.length > 1 ? 'MULTIFLUID' : FluidType[fluidTypes[0]]
+    fluidTypes.length > 1 || isHome ? 'MULTIFLUID' : FluidType[fluidTypes[0]]
   const yAxisRef = useRef<SVGGElement>(null)
 
   const drawYAxis = () => {
@@ -46,4 +52,4 @@ const AxisRight = (props: AxisRightProps) => {
   )
 }
 
-export default translate()(AxisRight)
+export default AxisRight
diff --git a/src/components/ContentComponents/Charts/Bar.tsx b/src/components/Charts/Bar.tsx
similarity index 91%
rename from src/components/ContentComponents/Charts/Bar.tsx
rename to src/components/Charts/Bar.tsx
index 9d480f56727b37736e4e7d859d2794b767032889..fbb7a306d8bc98ee28fa2af669490e16770d7c45 100644
--- a/src/components/ContentComponents/Charts/Bar.tsx
+++ b/src/components/Charts/Bar.tsx
@@ -1,27 +1,25 @@
 import React, { useState, useEffect } from 'react'
 import { ScaleBand, ScaleLinear } from 'd3-scale'
-import {
-  IDataload,
-  TimeStep,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
-import { compareStepDate } from 'services/dateChartService'
-import { FluidType } from 'enum/fluid.enum'
 import { DateTime } from 'luxon'
 import { detect } from 'detect-browser'
 
+import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Dataload } from 'models'
+import DateChartService from 'services/dateChart.service'
+
 interface BarProps {
   index: number
-  dataload: IDataload
-  compareDataload: IDataload | null
+  dataload: Dataload
+  compareDataload: Dataload | null
   fluidTypes: FluidType[]
   timeStep: TimeStep
   multiFluid: boolean
   selectedDate: DateTime
   showCompare: boolean
   handleClickData: (
-    dataload: IDataload,
-    compareDataload: IDataload | null
+    dataload: Dataload,
+    compareDataload: Dataload | null
   ) => void
   xScale: ScaleBand<string>
   yScale: ScaleLinear<number, number>
@@ -29,23 +27,21 @@ interface BarProps {
   isSwitching: boolean
 }
 
-const Bar = (props: BarProps) => {
-  const {
-    index,
-    dataload,
-    compareDataload,
-    fluidTypes,
-    timeStep,
-    multiFluid,
-    selectedDate,
-    showCompare,
-    handleClickData,
-    xScale,
-    yScale,
-    height,
-    isSwitching,
-  } = props
-
+const Bar = ({
+  index,
+  dataload,
+  compareDataload,
+  fluidTypes,
+  timeStep,
+  multiFluid,
+  selectedDate,
+  showCompare,
+  handleClickData,
+  xScale,
+  yScale,
+  height,
+  isSwitching,
+}: BarProps) => {
   const [clicked, setClicked] = useState(false)
   const [animationEnded, setAnimationEnded] = useState(false)
   const [compareAnimationEnded, setCompareAnimationEnded] = useState(false)
@@ -74,7 +70,11 @@ const Bar = (props: BarProps) => {
     setCompareAnimationEnded(true)
   }
 
-  const isSelectedDate = compareStepDate(timeStep, selectedDate, dataload.date)
+  const isSelectedDate = new DateChartService().compareStepDate(
+    timeStep,
+    selectedDate,
+    dataload.date
+  )
 
   const barClass = clicked
     ? `bar-${fluidStyle} selected bounce-${
diff --git a/src/components/ContentComponents/Charts/BarChart.tsx b/src/components/Charts/BarChart.tsx
similarity index 73%
rename from src/components/ContentComponents/Charts/BarChart.tsx
rename to src/components/Charts/BarChart.tsx
index 8fa45f2fb68be6e2cfbf6776b9ca827e1c20cfe3..45f1ec10d4874413736f09106962645b82265510 100644
--- a/src/components/ContentComponents/Charts/BarChart.tsx
+++ b/src/components/Charts/BarChart.tsx
@@ -1,29 +1,29 @@
 import React from 'react'
 import { scaleBand, ScaleBand, scaleLinear, ScaleLinear } from 'd3-scale'
-import {
-  IDataload,
-  IChartData,
-  TimeStep,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
-import { FluidType } from 'enum/fluid.enum'
-import Bar from 'components/ContentComponents/Charts/Bar'
-import Hash from 'components/ContentComponents/Charts/Hash'
-import AxisBottom from 'components/ContentComponents/Charts/AxisBottom'
-import AxisRight from 'components/ContentComponents/Charts/AxisRight'
+import { useRecoilValue } from 'recoil'
 import { DateTime } from 'luxon'
 
+import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { maxLoadsState } from 'atoms/chart.state'
+import { Datachart, Dataload, TimePeriod } from 'models'
+
+import Bar from 'components/Charts/Bar'
+import Hash from 'components/Charts/Hash'
+import AxisBottom from 'components/Charts/AxisBottom'
+import AxisRight from 'components/Charts/AxisRight'
+
 export interface BarChartProps {
-  chartData: IChartData
+  chartData: Datachart
   fluidTypes: FluidType[]
   timeStep: TimeStep
   multiFluid: boolean
   selectedDate: DateTime
   showCompare: boolean
-  challengePeriod: ITimePeriod | null
+  challengePeriod: TimePeriod | null
   handleClickData: (
-    dataload: IDataload,
-    compareDataload: IDataload | null
+    dataload: Dataload,
+    compareDataload: Dataload | null
   ) => void
   width?: number
   height?: number
@@ -32,6 +32,7 @@ export interface BarChartProps {
   marginTop?: number
   marginBottom?: number
   isSwitching: boolean
+  isHome: boolean
 }
 
 interface DefaultProps {
@@ -62,7 +63,10 @@ const BarChart: React.FC<BarChartProps> = (props: BarChartProps) => {
     marginTop,
     marginBottom,
     isSwitching,
+    isHome,
   } = props as PropsWithDefaults
+  const maxLoads = useRecoilValue(maxLoadsState)
+
   const getContentWidth = () => {
     return width - marginLeft - marginRight
   }
@@ -72,14 +76,30 @@ const BarChart: React.FC<BarChartProps> = (props: BarChartProps) => {
   }
 
   const getMaxLoad = () => {
-    let max = chartData.actualData
-      ? Math.max(...chartData.actualData.map(d => d.value))
-      : 0
     const maxCompare = chartData.comparisonData
       ? Math.max(...chartData.comparisonData.map(d => d.value))
       : 0
-    max = max <= 0 ? 15 : max
-    return showCompare ? Math.max(max, maxCompare) : max
+    if (timeStep === TimeStep.DAY || timeStep === TimeStep.HALF_AN_HOUR) {
+      const actualMonth = selectedDate.startOf('week').month
+      const actualYear = selectedDate.startOf('week').year
+      const key = `${actualMonth}/${actualYear}-${isHome}-${fluidTypes.join(
+        '-'
+      )}-${timeStep}`
+      if (DateTime.local() < selectedDate && !maxLoads[key]) {
+        maxLoads[key] = 15
+      }
+      const maxLoad = maxLoads[key] || 0
+      if (showCompare) {
+        return Math.max(maxLoad, maxCompare)
+      }
+      return maxLoad > 0 ? maxLoad : 15
+    } else {
+      let max = chartData.actualData
+        ? Math.max(...chartData.actualData.map(d => d.value))
+        : 0
+      max = max <= 0 ? 15 : max
+      return showCompare ? Math.max(max, maxCompare) : max
+    }
   }
 
   const xScale: ScaleBand<string> = scaleBand()
diff --git a/src/components/ContentComponents/Charts/Hash.tsx b/src/components/Charts/Hash.tsx
similarity index 90%
rename from src/components/ContentComponents/Charts/Hash.tsx
rename to src/components/Charts/Hash.tsx
index 457eba1bfed58cc9f64fb49f8e0100e8fd27d846..6ece3d347da1164cf1d2646112d5868691881683 100644
--- a/src/components/ContentComponents/Charts/Hash.tsx
+++ b/src/components/Charts/Hash.tsx
@@ -1,21 +1,20 @@
 import React, { useState, useEffect } from 'react'
 import { ScaleBand } from 'd3-scale'
-import {
-  ITimePeriod,
-  IChartData,
-  TimeStep,
-} from 'services/dataConsumptionContracts'
 import { DateTime } from 'luxon'
-import { compareStepDate } from 'services/dateChartService'
+
+import { TimeStep } from 'enum/timeStep.enum'
+import { Datachart } from 'models'
+import { TimePeriod } from 'models'
+import DateChartService from 'services/dateChart.service'
 
 interface HashProps {
-  challengePeriod: ITimePeriod | null
+  challengePeriod: TimePeriod | null
   multiFluid: boolean
   xScale: ScaleBand<string>
   padding: number
   width: number
   height: number
-  chartData: IChartData
+  chartData: Datachart
 }
 
 const Hash = (props: HashProps) => {
@@ -72,8 +71,9 @@ const Hash = (props: HashProps) => {
         } else if (startScale && !endScale) {
           setScale([startScale - padding, width - startScale])
         } else if (!startScale && endScale) {
+          const dateChartService = new DateChartService()
           if (
-            compareStepDate(
+            dateChartService.compareStepDate(
               TimeStep.DAY,
               challengePeriod.endDate,
               chartData.actualData[0].date
diff --git a/src/components/CommonKit/Button/StyledAuthButton.tsx b/src/components/CommonKit/Button/StyledAuthButton.tsx
index fd8a20d8bad972173014f480e29f7d1a02e5e9a5..a7a8f5f2ff527a23fb2f146cd8ece51197207baf 100644
--- a/src/components/CommonKit/Button/StyledAuthButton.tsx
+++ b/src/components/CommonKit/Button/StyledAuthButton.tsx
@@ -56,7 +56,7 @@ const PrimaryButton = withStyles({
 
 const SecondaryButton = withStyles({
   root: {
-    border: '1px solid #121212',
+    border: '1px solid var(--darkLight2)',
   },
   label: {
     color: '#E0E0E0',
@@ -81,7 +81,7 @@ const StyledAuthButton: React.ComponentType<ButtonProps> = props => {
   return (
     <>
       <MuiThemeProvider theme={theme}>
-        <MyButton {...props}>{props.children}</MyButton>
+        <MyButton {...props}></MyButton>
       </MuiThemeProvider>
     </>
   )
diff --git a/src/components/CommonKit/Button/StyledButton.tsx b/src/components/CommonKit/Button/StyledButton.tsx
index cf3c8b34e45724d2cb6c433c6851e2ad1b4c362f..bb6405d517f1926b24a082c50a0aaee95f5ffa1c 100644
--- a/src/components/CommonKit/Button/StyledButton.tsx
+++ b/src/components/CommonKit/Button/StyledButton.tsx
@@ -56,7 +56,7 @@ const PrimaryButton = withStyles({
 
 const SecondaryButton = withStyles({
   root: {
-    border: '1px solid #121212',
+    border: '1px solid var(--darkLight2)',
   },
   label: {
     fontWeight: 'normal',
@@ -80,7 +80,7 @@ const StyledButton: React.ComponentType<ButtonProps> = props => {
   return (
     <>
       <MuiThemeProvider theme={theme}>
-        <MyButton {...props}>{props.children}</MyButton>
+        <MyButton {...props}></MyButton>
       </MuiThemeProvider>
     </>
   )
diff --git a/src/components/CommonKit/Button/StyledButtonValid.tsx b/src/components/CommonKit/Button/StyledButtonValid.tsx
index 349cc268d2dbb2c4a1470a33b5b938c67957081d..95b58345f21474195e926ae678b78447618bedde 100644
--- a/src/components/CommonKit/Button/StyledButtonValid.tsx
+++ b/src/components/CommonKit/Button/StyledButtonValid.tsx
@@ -65,7 +65,7 @@ const PrimaryButton = withStyles({
 
 const SecondaryButton = withStyles({
   label: {
-    color: 'var(--textBright)',
+    color: 'var(--greyBright)',
     fontWeight: 'normal',
   },
 })(BaseButton)
@@ -87,7 +87,7 @@ const StyledButtonValid: React.ComponentType<ButtonProps> = props => {
   return (
     <>
       <MuiThemeProvider theme={theme}>
-        <MyButton {...props}>{props.children}</MyButton>
+        <MyButton {...props}></MyButton>
       </MuiThemeProvider>
     </>
   )
diff --git a/src/components/CommonKit/Button/StyledClearGreyButton.tsx b/src/components/CommonKit/Button/StyledClearGreyButton.tsx
index a825276ceeb564cccb66ad1e522c151ceb3f9eb9..d28b80aba7273d8a45d8c30cfa30f1d98b6cecd6 100644
--- a/src/components/CommonKit/Button/StyledClearGreyButton.tsx
+++ b/src/components/CommonKit/Button/StyledClearGreyButton.tsx
@@ -77,7 +77,7 @@ const StyledClearGreyButton: React.ComponentType<ButtonProps> = props => {
   return (
     <>
       <MuiThemeProvider theme={theme}>
-        <MyButton {...props}>{props.children}</MyButton>
+        <MyButton {...props}></MyButton>
       </MuiThemeProvider>
     </>
   )
diff --git a/src/components/CommonKit/Button/StyledStopButton.tsx b/src/components/CommonKit/Button/StyledStopButton.tsx
index b449615bfaed6cbc32c129dcc2c6ef4051dba784..a6f7f5b00fb006d2f55f41e8f96a2faf82f0e1b2 100644
--- a/src/components/CommonKit/Button/StyledStopButton.tsx
+++ b/src/components/CommonKit/Button/StyledStopButton.tsx
@@ -71,7 +71,7 @@ const StyledStopButton: React.ComponentType<ButtonProps> = props => {
   return (
     <>
       <MuiThemeProvider theme={theme}>
-        <MyButton {...props}>{props.children}</MyButton>
+        <MyButton {...props}></MyButton>
       </MuiThemeProvider>
     </>
   )
diff --git a/src/components/CommonKit/Button/StyledWhiteButton.tsx b/src/components/CommonKit/Button/StyledWhiteButton.tsx
index 748730a869ccc3632eb2d43fa0618fa958855b59..e0587cadfa7c3bcff4dd112492f413c91bebc4ba 100644
--- a/src/components/CommonKit/Button/StyledWhiteButton.tsx
+++ b/src/components/CommonKit/Button/StyledWhiteButton.tsx
@@ -46,7 +46,7 @@ const PrimaryButton = withStyles({
 
 const SecondaryButton = withStyles({
   root: {
-    border: '1px solid #121212',
+    border: '1px solid var(--darkLight2)',
   },
   label: {
     color: '#E0E0E0',
@@ -71,7 +71,7 @@ const StyledButton: React.ComponentType<ButtonProps> = props => {
   return (
     <>
       <MuiThemeProvider theme={theme}>
-        <MyButton {...props}>{props.children}</MyButton>
+        <MyButton {...props}></MyButton>
       </MuiThemeProvider>
     </>
   )
diff --git a/src/components/CommonKit/Card/StyledBorderCard.tsx b/src/components/CommonKit/Card/StyledBorderCard.tsx
index 9d123793449dffd2a89a7190ec26751403dd3776..a3f76a0ceed0d1f76cb95adcf6df7c01383b3426 100644
--- a/src/components/CommonKit/Card/StyledBorderCard.tsx
+++ b/src/components/CommonKit/Card/StyledBorderCard.tsx
@@ -7,7 +7,7 @@ import { withStyles } from '@material-ui/core/styles'
 
 const CardBase = withStyles({
   root: {
-    border: '1px solid var(--textDark)',
+    border: '1px solid var(--softGrey)',
     boxSizing: 'border-box',
     borderRadius: '4px',
     width: '100hv',
diff --git a/src/components/CommonKit/Card/StyledCard.tsx b/src/components/CommonKit/Card/StyledCard.tsx
index 845934e866f31189f663ba6bbdfe080c7654bff4..1d6049f4bf11b04a025fdb66dc36303bf5536d92 100644
--- a/src/components/CommonKit/Card/StyledCard.tsx
+++ b/src/components/CommonKit/Card/StyledCard.tsx
@@ -8,7 +8,7 @@ import { FluidType } from 'enum/fluid.enum'
 
 const CardBase = withStyles({
   root: {
-    background: 'linear-gradient(180deg, #323339 0%, #25262B 100%)',
+    background: 'var(--greyLinearGradientBackground)',
     boxSizing: 'border-box',
     boxShadow: '0px 4px 8px rgba(0, 0, 0, 0.75)',
     borderRadius: '4px',
diff --git a/src/components/CommonKit/Card/StyledChallengeCard.tsx b/src/components/CommonKit/Card/StyledChallengeCard.tsx
index eb0fdaac9f6044be74be13aeb8ea8ff1454daefd..ea21879915d1369243c68f73245659965bcfb8ec 100644
--- a/src/components/CommonKit/Card/StyledChallengeCard.tsx
+++ b/src/components/CommonKit/Card/StyledChallengeCard.tsx
@@ -7,7 +7,7 @@ import { withStyles } from '@material-ui/core/styles'
 
 const CardBase = withStyles({
   root: {
-    background: 'linear-gradient(180deg, #323339 0%, #25262B 100%)',
+    background: 'var(--greyLinearGradientBackground)',
     border: '1px solid',
     boxSizing: 'border-box',
     boxShadow: '0px 4px 16px black',
diff --git a/src/components/CommonKit/Card/StyledEcogestureCard.tsx b/src/components/CommonKit/Card/StyledEcogestureCard.tsx
index 1f893366dcaca70cc8c467fabf0ad3e756f6a33f..774b5d472ea22fe78adda3773a71608f825e07e5 100644
--- a/src/components/CommonKit/Card/StyledEcogestureCard.tsx
+++ b/src/components/CommonKit/Card/StyledEcogestureCard.tsx
@@ -7,7 +7,7 @@ import { withStyles } from '@material-ui/core/styles'
 
 const CardBase = withStyles({
   root: {
-    background: 'linear-gradient(180deg, #323339 0%, #25262B 100%)',
+    background: 'var(--greyLinearGradientBackground)',
     border: '1px solid',
     boxSizing: 'border-box',
     boxShadow: '0px 4px 16px black',
@@ -27,6 +27,21 @@ const CardUnlocked = withStyles({
   },
 })(CardBase)
 
+const CardNew = withStyles({
+  '@keyframes glowAnimation': {
+    '0%': { boxShadow: '0px 0px 4px var(--blue)' },
+    '50%': { boxShadow: '0px 0px 16px var(--blue)' },
+    '100%': { boxShadow: '0px 0px 4px var(--blue)' },
+  },
+  root: {
+    border: '1px solid var(--blue)',
+    animation: '2s glowAnimation linear infinite',
+    color: 'white',
+    height: '100%',
+    padding: 0,
+  },
+})(CardBase)
+
 const CardBlueBorderContentBase = withStyles({
   root: {
     border: '1px solid var(--blue)',
@@ -55,6 +70,7 @@ const CardContentBase = withStyles({
 interface StyledEcogestureCardProps extends CardActionAreaProps {
   unlocked?: boolean
   border?: boolean
+  newEcogesture?: boolean | null
 }
 
 const GenerateContentCard = (children: ReactNode): React.ReactFragment => {
@@ -64,9 +80,12 @@ const GenerateContentCard = (children: ReactNode): React.ReactFragment => {
 const StyledEcogestureCard: React.ComponentType<StyledEcogestureCardProps> = ({
   unlocked,
   border,
+  newEcogesture,
   ...props
 }: StyledEcogestureCardProps) => {
-  if (unlocked) {
+  if (newEcogesture) {
+    return <CardNew {...props}>{GenerateContentCard(props.children)}</CardNew>
+  } else if (unlocked) {
     return (
       <CardUnlocked {...props}>
         {GenerateContentCard(props.children)}
diff --git a/src/components/CommonKit/Card/StyledIconCard.tsx b/src/components/CommonKit/Card/StyledIconCard.tsx
index db62f1cf289b8dd44496ef9225d6952b432edc40..b8067e8b7f318992f21e62f40ffea50d7c63dc4e 100644
--- a/src/components/CommonKit/Card/StyledIconCard.tsx
+++ b/src/components/CommonKit/Card/StyledIconCard.tsx
@@ -5,13 +5,13 @@ import CardActionArea, {
 import CardContent from '@material-ui/core/CardContent'
 import { withStyles } from '@material-ui/core/styles'
 import { FluidType } from 'enum/fluid.enum'
-import { getPicto } from 'utils/utils'
-import Icon from 'cozy-ui/react/Icon'
+import { getPicto } from 'utils/picto'
 import Grid from '@material-ui/core/Grid'
+import StyledIcon from '../Icon/StyledIcon'
 
 const CardBase = withStyles({
   root: {
-    background: 'linear-gradient(180deg, #323339 0%, #25262B 100%)',
+    background: 'var(--greyLinearGradientBackground)',
     border: '1px solid',
     boxSizing: 'border-box',
     boxShadow: '0px 4px 16px',
@@ -65,7 +65,7 @@ const GenerateContentCard = (
         justify="center"
       >
         <Grid item>
-          <Icon icon={icon} size={64} />
+          <StyledIcon icon={icon} size={64} />
         </Grid>
         <Grid item>{children}</Grid>
       </Grid>
diff --git a/src/components/CommonKit/ExpansionPanel/StyledSampleExpansionPanel.tsx b/src/components/CommonKit/ExpansionPanel/StyledSampleExpansionPanel.tsx
index e02334ce0d902222c7f6a1ef2e7f130be69def28..d70a7704b8e82b70b709fb33a4d8a1362e05d782 100644
--- a/src/components/CommonKit/ExpansionPanel/StyledSampleExpansionPanel.tsx
+++ b/src/components/CommonKit/ExpansionPanel/StyledSampleExpansionPanel.tsx
@@ -3,7 +3,6 @@ import ExpansionPanel from '@material-ui/core/ExpansionPanel'
 import ExpansionPanelSummary from '@material-ui/core/ExpansionPanelSummary'
 import ExpansionPanelDetails from '@material-ui/core/ExpansionPanelDetails'
 import { withStyles } from '@material-ui/core/styles'
-
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import ChevronOffIcon from 'assets/icons/ico/chevron-off.svg'
 
@@ -24,7 +23,7 @@ const BaseExpansionPanel = withStyles({
 
 const StyledExpansionPanel = withStyles({
   root: {
-    background: 'linear-gradient(180deg, #323339 0%, #25262B 100%)',
+    background: 'var(--greyLinearGradientBackground)',
   },
   expanded: {
     background: 'var(--greyBright)',
@@ -57,22 +56,21 @@ const StyledExpansionPanelDetails = withStyles({
   },
 })(ExpansionPanelDetails)
 
-const GenericExpansionPanel: React.ComponentType<GenericExpansionPanelProps> = props => {
+const GenericExpansionPanel: React.FC<GenericExpansionPanelProps> = ({
+  summary,
+  details,
+  expanded,
+  onChange,
+}: GenericExpansionPanelProps) => {
   return (
     <>
-      <StyledExpansionPanel
-        expanded={props.expanded}
-        onChange={props.onChange}
-        {...props}
-      >
+      <StyledExpansionPanel expanded={expanded} onChange={onChange}>
         <StyledExpansionPanelSummary
           expandIcon={<StyledIcon icon={ChevronOffIcon} />}
         >
-          {props.summary}
+          {summary}
         </StyledExpansionPanelSummary>
-        <StyledExpansionPanelDetails>
-          {props.details}
-        </StyledExpansionPanelDetails>
+        <StyledExpansionPanelDetails>{details}</StyledExpansionPanelDetails>
       </StyledExpansionPanel>
     </>
   )
diff --git a/src/components/CommonKit/Icon/StyledIcon.tsx b/src/components/CommonKit/Icon/StyledIcon.tsx
index 33ab7cc19056fa8dd16e7bb48feaa623ba6be166..d543c44124011a1574d9e61e6c32b3b830df921e 100644
--- a/src/components/CommonKit/Icon/StyledIcon.tsx
+++ b/src/components/CommonKit/Icon/StyledIcon.tsx
@@ -1,5 +1,5 @@
 import React from 'react'
-import Icon from 'cozy-ui/react/Icon'
+import Icon from 'cozy-ui/transpiled/react/Icon'
 
 interface StyledIconProps {
   className?: string
diff --git a/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx b/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx
index b912d5cbf00c948494f5879725deb6c4a96f0343..eb9e5475c382904a1e30df7680c9c07f0545b744 100644
--- a/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx
+++ b/src/components/CommonKit/IconButton/StyledIconBorderedButton.tsx
@@ -19,7 +19,7 @@ const IconButtonBase = withStyles({
 const SelectedIconButtonBase = withStyles({
   root: {
     border: '1px solid var(--multiColor)',
-    background: 'linear-gradient(180deg, #323339 0%, #25262B 100%)',
+    background: 'var(--greyLinearGradientBackground)',
     boxShadow: '0px 4px 16px rgba(0, 0, 0, 0.55)',
   },
 })(IconButtonBase)
diff --git a/src/components/CommonKit/Modal/Modal.tsx b/src/components/CommonKit/Modal/Modal.tsx
index 89e631ef88795db63bd9bda7a5b238f02c87b9fb..9662ba252aaec46bbbc70b1289a5e1dff62c0664 100644
--- a/src/components/CommonKit/Modal/Modal.tsx
+++ b/src/components/CommonKit/Modal/Modal.tsx
@@ -1,5 +1,4 @@
-import React, { useEffect, useContext, ReactNode } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
+import React, { useEffect, ReactNode } from 'react'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import CloseIcon from 'assets/icons/ico/close.svg'
 
@@ -19,20 +18,35 @@ const Modal: React.FC<ModalProps> = ({
   yellowBorder,
 }: ModalProps) => {
   const yellow = yellowBorder ? 'yellow-border' : ''
-  const { disableBackgroundScroll } = useContext(AppContext)
 
-  useEffect(() => {
-    open ? disableBackgroundScroll(true) : disableBackgroundScroll(false)
-    return () => {
-      disableBackgroundScroll(false)
+  const disableBackgroundScroll = (disable: boolean) => {
+    const backgroundDesktop = document.querySelector(
+      '.app-content'
+    ) as HTMLElement
+    const backgroundMobile = document.querySelector('html') as HTMLElement
+    const bgStyleDesktop = backgroundDesktop && backgroundDesktop.style
+    const bgStyleMobile = backgroundMobile && backgroundMobile.style
+    if (disable) {
+      bgStyleDesktop.overflowY = 'hidden'
+      bgStyleMobile.overflowY = 'hidden'
+    } else {
+      bgStyleDesktop.overflowY = 'unset'
+      bgStyleMobile.overflowY = 'unset'
     }
-  }, [open])
+  }
 
   const closeClick = () => {
     disableBackgroundScroll(false)
     handleCloseClick()
   }
 
+  useEffect(() => {
+    open ? disableBackgroundScroll(true) : disableBackgroundScroll(false)
+    return () => {
+      disableBackgroundScroll(false)
+    }
+  }, [open])
+
   return (
     <div className={`modal-overlay ${open ? 'modal-opened' : ''}`}>
       <div
diff --git a/src/components/CommonKit/Spinner/StyledChallengeSpinner.tsx b/src/components/CommonKit/Spinner/StyledChallengeSpinner.tsx
index 655e31e4b1821a2e3bc4b2a569b840124fdad88c..730b367faf5d7480df001d9697b219d8b156961a 100644
--- a/src/components/CommonKit/Spinner/StyledChallengeSpinner.tsx
+++ b/src/components/CommonKit/Spinner/StyledChallengeSpinner.tsx
@@ -1,5 +1,4 @@
 import React from 'react'
-import { FluidType } from 'enum/fluid.enum'
 import { withStyles } from '@material-ui/core/styles'
 import MuiCircularProgress, {
   CircularProgressProps,
diff --git a/src/components/CommonKit/Spinner/StyledSpinner.tsx b/src/components/CommonKit/Spinner/StyledSpinner.tsx
index 3afde4af9c76131e6a4b7aa27f1bdaab61270ac0..390ecdcb17d097f51573064091aafa56052ef4a0 100644
--- a/src/components/CommonKit/Spinner/StyledSpinner.tsx
+++ b/src/components/CommonKit/Spinner/StyledSpinner.tsx
@@ -31,13 +31,15 @@ const SpinnerGas = withStyles({
 
 interface StyledSpinnerProps extends CircularProgressProps {
   fluidTypes?: FluidType[]
+  isHome?: boolean
 }
 
 const StyledSpinner: React.ComponentType<StyledSpinnerProps> = ({
   fluidTypes,
+  isHome,
   ...props
 }: StyledSpinnerProps) => {
-  if (!fluidTypes) {
+  if (!fluidTypes || isHome) {
     return <SpinnerBase {...props} />
   } else if (fluidTypes.length === 1) {
     switch (fluidTypes[0]) {
diff --git a/src/components/CommonKit/Switch/StyledSwitch.tsx b/src/components/CommonKit/Switch/StyledSwitch.tsx
index 8ea84b26899c9f0c5fbdc68c7d42da0c645e8bd4..1c420c65dd8fa28c9f66e730050cf520537881a3 100644
--- a/src/components/CommonKit/Switch/StyledSwitch.tsx
+++ b/src/components/CommonKit/Switch/StyledSwitch.tsx
@@ -5,9 +5,9 @@ import { withStyles } from '@material-ui/core/styles'
 
 const SwitchBase = withStyles({
   switchBase: {
-    color: 'var(--textBright)',
+    color: 'var(--greyBright)',
     '&$checked': {
-      color: 'var(--textBright)',
+      color: 'var(--greyBright)',
       '& + $bar': {
         opacity: 1,
         backgroundColor: 'var(--multiColor)',
diff --git a/src/components/CommonKit/Tabs/StyledWhiteTab.tsx b/src/components/CommonKit/Tabs/StyledWhiteTab.tsx
index e4ee58c6e5f4f112fd2bedab5eb80e3c1b02fe19..80260c7c2082d046deb2331362576335359f04c2 100644
--- a/src/components/CommonKit/Tabs/StyledWhiteTab.tsx
+++ b/src/components/CommonKit/Tabs/StyledWhiteTab.tsx
@@ -8,7 +8,7 @@ const TabBase = withStyles({
     minHeight: '36px',
   },
   selected: {
-    color: 'var(--textBright)',
+    color: 'var(--greyBright)',
   },
 })(Tab)
 
diff --git a/src/components/CommonKit/Tabs/StyledWhiteTabs.tsx b/src/components/CommonKit/Tabs/StyledWhiteTabs.tsx
index eab0b3fe84357e04ee972be7aa46340a18917686..70569eae5069c494dbd11c98c93d3fb056568079 100644
--- a/src/components/CommonKit/Tabs/StyledWhiteTabs.tsx
+++ b/src/components/CommonKit/Tabs/StyledWhiteTabs.tsx
@@ -7,7 +7,7 @@ const TabsBase = withStyles({
     minHeight: '36px',
   },
   indicator: {
-    backgroundColor: 'var(--textBright)',
+    backgroundColor: 'var(--greyBright)',
   },
 })(Tabs)
 
diff --git a/src/components/Connection/ConnectionForm.tsx b/src/components/Connection/ConnectionForm.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..36f9e62a732ed5f01ec92a48b28c093794951a97
--- /dev/null
+++ b/src/components/Connection/ConnectionForm.tsx
@@ -0,0 +1,66 @@
+import React, { useCallback } from 'react'
+import { useClient } from 'cozy-client'
+import { useSetRecoilState } from 'recoil'
+
+import { userProfileState } from 'atoms/userProfile.state'
+import { Konnector, Trigger, FluidConfig } from 'models'
+import UserProfileService from 'services/userProfile.service'
+
+import ConnectionLoginForm from 'components/Connection/ConnectionLoginForm'
+import ConnectionOAuthForm from 'components/Connection/ConnectionOAuthForm'
+
+interface ConnectionFormProps {
+  fluidConfig: FluidConfig
+  konnector: Konnector
+  account: Account | null
+  trigger: Trigger | null
+  handleSuccessForm: Function
+}
+
+const ConnectionForm: React.FC<ConnectionFormProps> = ({
+  fluidConfig,
+  konnector,
+  account,
+  trigger,
+  handleSuccessForm,
+}: ConnectionFormProps) => {
+  const client = useClient()
+  const setUserProfile = useSetRecoilState(userProfileState)
+  const oAuth: boolean = fluidConfig.konnectorConfig.oauth
+
+  const updateProfileHaveSeenOldFluidModal = useCallback(async () => {
+    const userProfileService = new UserProfileService(client)
+    await userProfileService
+      .updateUserProfile({ haveSeenOldFluidModal: false })
+      .then(updatedUserProfile => {
+        updatedUserProfile && setUserProfile(updatedUserProfile)
+      })
+  }, [setUserProfile])
+
+  const handleSuccess = async (_account: Account, _trigger: Trigger) => {
+    await updateProfileHaveSeenOldFluidModal()
+    handleSuccessForm(_account, _trigger)
+  }
+
+  return (
+    <>
+      {!oAuth ? (
+        <ConnectionLoginForm
+          fluidConfig={fluidConfig}
+          onSuccess={handleSuccess}
+          account={account}
+          trigger={trigger}
+        />
+      ) : (
+        <ConnectionOAuthForm
+          fluidConfig={fluidConfig}
+          konnector={konnector}
+          siteLink={fluidConfig.siteLink}
+          onSuccess={handleSuccess}
+        />
+      )}
+    </>
+  )
+}
+
+export default ConnectionForm
diff --git a/src/components/ContentComponents/Konnector/KonnectorLaunch.tsx b/src/components/Connection/ConnectionLaunch.tsx
similarity index 79%
rename from src/components/ContentComponents/Konnector/KonnectorLaunch.tsx
rename to src/components/Connection/ConnectionLaunch.tsx
index 12e3b766b8e91380588c146dad462a2491774a5a..7f0ff3b7f64cf848dea702f094daf9251e90ae82 100644
--- a/src/components/ContentComponents/Konnector/KonnectorLaunch.tsx
+++ b/src/components/Connection/ConnectionLaunch.tsx
@@ -1,15 +1,14 @@
 import React, { useEffect, useState } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 
+import { Konnector, Trigger } from 'models'
 import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers'
-import {
-  KonnectorJob,
+import ConnectionFlow, {
   ERROR_EVENT,
   LOGIN_SUCCESS_EVENT,
   SUCCESS_EVENT,
-} from 'cozy-harvest-lib/dist/models/KonnectorJob'
-import { Trigger } from 'doctypes'
+} from 'cozy-harvest-lib/dist/models/ConnectionFlow'
 
 import Lottie from 'react-lottie'
 import * as loadingData from 'assets/anims/bounceloading.json'
@@ -28,21 +27,21 @@ const loadingOptions = {
   },
 }
 
-interface KonnectorLaunchProps {
+interface ConnectionLaunchProps {
   trigger: Trigger
+  konnector: Konnector
   type: string
-  handleKonnectorLaunch: Function
-  client: Client
-  t: Function
+  handleConnectionLaunch: Function
 }
 
-const KonnectorLaunch: React.FC<KonnectorLaunchProps> = ({
+const ConnectionLaunch: React.FC<ConnectionLaunchProps> = ({
   trigger,
+  konnector,
   type,
-  handleKonnectorLaunch,
-  client,
-  t,
-}: KonnectorLaunchProps) => {
+  handleConnectionLaunch,
+}: ConnectionLaunchProps) => {
+  const { t } = useI18n()
+  const client = useClient()
   const [state, setState] = useState<string | null>(null)
   const [openModal, setOpenModal] = useState(false)
   const callbackResponse = (_state: string) => {
@@ -50,7 +49,7 @@ const KonnectorLaunch: React.FC<KonnectorLaunchProps> = ({
   }
 
   const handleCloseClick = () => {
-    handleKonnectorLaunch()
+    handleConnectionLaunch()
     setOpenModal(false)
   }
 
@@ -58,15 +57,15 @@ const KonnectorLaunch: React.FC<KonnectorLaunchProps> = ({
     let subscribed = true
     async function getData() {
       if (subscribed && !isKonnectorRunning(trigger)) {
-        const konnectorJob = new KonnectorJob(client, trigger)
-        await konnectorJob.launch()
-        konnectorJob.jobWatcher.on(ERROR_EVENT, () => {
+        const connectionFlow = new ConnectionFlow(client, trigger, konnector)
+        await connectionFlow.launch()
+        connectionFlow.jobWatcher.on(ERROR_EVENT, () => {
           callbackResponse(ERROR_EVENT)
         })
-        konnectorJob.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
+        connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
           callbackResponse(LOGIN_SUCCESS_EVENT)
         })
-        konnectorJob.jobWatcher.on(SUCCESS_EVENT, () => {
+        connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => {
           callbackResponse(SUCCESS_EVENT)
         })
         setOpenModal(true)
@@ -127,4 +126,4 @@ const KonnectorLaunch: React.FC<KonnectorLaunchProps> = ({
   )
 }
 
-export default translate()(withClient(KonnectorLaunch))
+export default ConnectionLaunch
diff --git a/src/components/ContentComponents/Konnector/KonnectorLoginForm.tsx b/src/components/Connection/ConnectionLoginForm.tsx
similarity index 79%
rename from src/components/ContentComponents/Konnector/KonnectorLoginForm.tsx
rename to src/components/Connection/ConnectionLoginForm.tsx
index 04a3fb88e64109e56d0228bb39aa3000f3809006..a93b11c747921eac78230a6fe6a50c1a2fe7647c 100644
--- a/src/components/ContentComponents/Konnector/KonnectorLoginForm.tsx
+++ b/src/components/Connection/ConnectionLoginForm.tsx
@@ -1,39 +1,36 @@
 import React, { useState, useEffect } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 
-import IFluidConfig from 'services/IFluidConfig'
+import { Account, AccountAuthData, Trigger, FluidConfig } from 'models'
+import AccountService from 'services/account.service'
+import ConnectionService from 'services/connection.service'
 
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 import StyledButton from 'components/CommonKit/Button/StyledButton'
 import TrailingIcon from 'assets/icons/ico/trailing-icon.svg'
-import { ConnectionService } from 'services/connectionService'
-import { AccountService } from 'services/accountService'
-import { Account, AuthLoginData, Trigger } from 'doctypes'
 
 import iconGRDFLogo from 'assets/icons/visu/grdf-logo.svg'
 import iconEGLLogo from 'assets/icons/visu/egl-logo.svg'
 import StyledAuthButton from 'components/CommonKit/Button/StyledAuthButton'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 
-interface KonnectorLoginFormProps {
-  fluidConfig: IFluidConfig
+interface ConnectionLoginFormProps {
+  fluidConfig: FluidConfig
   onSuccess: Function
   account: Account
   trigger: Trigger
-  client: Client
-  t: Function
 }
 
-const KonnectorLoginForm: React.FC<KonnectorLoginFormProps> = ({
+const ConnectionLoginForm: React.FC<ConnectionLoginFormProps> = ({
   fluidConfig,
   onSuccess,
   account,
   trigger,
-  client,
-  t,
-}: KonnectorLoginFormProps) => {
-  const konnectorName: string = fluidConfig.konnectorConfig.name
+}: ConnectionLoginFormProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const konnectorSlug: string = fluidConfig.konnectorConfig.slug
   const konnectorType: string = fluidConfig.konnectorConfig.type
   const siteLink: string = fluidConfig.siteLink
 
@@ -77,19 +74,26 @@ const KonnectorLoginForm: React.FC<KonnectorLoginFormProps> = ({
   }
 
   const connect = async () => {
-    const connectionService = new ConnectionService(
-      client,
-      fluidConfig.konnectorConfig.slug,
-      login,
-      password
-    )
-    const { account, trigger } = await connectionService.connectNewUser()
-    if (!trigger) {
-      setError(t('KONNECTORCONFIG.ERROR_ACCOUNT_CREATION'))
+    const connectionService = new ConnectionService(client)
+    try {
+      const {
+        account: _account,
+        trigger: _trigger,
+      } = await connectionService.connectNewUser(
+        fluidConfig.konnectorConfig.slug,
+        login,
+        password
+      )
+      if (!_trigger) {
+        setError(t('KONNECTORCONFIG.ERROR_ACCOUNT_CREATION'))
+        return null
+      }
       setLoading(false)
-      return null
+      onSuccess(_account, _trigger)
+    } catch (err) {
+      setLoading(false)
+      console.log(err)
     }
-    onSuccess(account, trigger)
   }
 
   const update = async () => {
@@ -98,7 +102,8 @@ const KonnectorLoginForm: React.FC<KonnectorLoginFormProps> = ({
       password: password,
     }
     account.auth = auth
-    const updatedAccount = await AccountService.updateAccount(client, account)
+    const accountService = new AccountService(client)
+    const updatedAccount = await accountService.updateAccount(account)
     onSuccess(updatedAccount, trigger)
   }
 
@@ -124,9 +129,10 @@ const KonnectorLoginForm: React.FC<KonnectorLoginFormProps> = ({
 
   useEffect(() => {
     if (account) {
-      const auth: AuthLoginData = account.auth
-      if (auth.login) {
-        setLogin(auth.login)
+      const auth = account.auth
+      const authData = auth as AccountAuthData
+      if (authData.login) {
+        setLogin(authData.login)
       }
       setError(t('KONNECTORCONFIG.ERROR_LOGIN_FAILED'))
     }
@@ -137,7 +143,10 @@ const KonnectorLoginForm: React.FC<KonnectorLoginFormProps> = ({
       className="form"
       onSubmit={(e: React.FormEvent<HTMLFormElement>) => handleSubmit(e)}
     >
-      {t('KONNECTORCONFIG.LABEL_FILLIN')} {konnectorName}
+      <p className="info-provider text-16-normal">
+        {t('auth.' + `${konnectorSlug}` + '.connect.info')}
+      </p>
+
       <div className="form-group">
         <input
           id={'idFieldLogin' + konnectorType}
@@ -240,4 +249,4 @@ const KonnectorLoginForm: React.FC<KonnectorLoginFormProps> = ({
   )
 }
 
-export default translate()(withClient(KonnectorLoginForm))
+export default ConnectionLoginForm
diff --git a/src/components/ContentComponents/Konnector/KonnectorNotFound.tsx b/src/components/Connection/ConnectionNotFound.tsx
similarity index 77%
rename from src/components/ContentComponents/Konnector/KonnectorNotFound.tsx
rename to src/components/Connection/ConnectionNotFound.tsx
index cfe6ea899b5ee56d2abe54f461583039fd254c1c..bf8fa68d3afe163c7de190333a3297fe31be19c1 100644
--- a/src/components/ContentComponents/Konnector/KonnectorNotFound.tsx
+++ b/src/components/Connection/ConnectionNotFound.tsx
@@ -1,17 +1,17 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 
 import StyledButton from 'components/CommonKit/Button/StyledButton'
 
-interface KonnectorNotFoundProps {
+interface ConnectionNotFoundProps {
   konnectorSlug: string
-  t: Function
 }
 
-const KonnectorNotFound: React.FC<KonnectorNotFoundProps> = ({
+const ConnectionNotFound: React.FC<ConnectionNotFoundProps> = ({
   konnectorSlug,
-  t,
-}: KonnectorNotFoundProps) => {
+}: ConnectionNotFoundProps) => {
+  const { t } = useI18n()
+
   const openKonnectorURL = () => {
     // TODO - Use getstoreinstallationurl from client - https://docs.cozy.io/en/cozy-client/api/cozy-client/#getstoreinstallationurl-string
     const hostname = window.location.origin.replace('ecolyo', 'store')
@@ -34,4 +34,4 @@ const KonnectorNotFound: React.FC<KonnectorNotFoundProps> = ({
   )
 }
 
-export default translate()(KonnectorNotFound)
+export default ConnectionNotFound
diff --git a/src/components/ContentComponents/Konnector/KonnectorOAuthForm.tsx b/src/components/Connection/ConnectionOAuthForm.tsx
similarity index 56%
rename from src/components/ContentComponents/Konnector/KonnectorOAuthForm.tsx
rename to src/components/Connection/ConnectionOAuthForm.tsx
index 2716f218e4dfb0540e45f8f2ac99ce310c7699ce..7e15a20d0df2a3522ef7c2bc8a1739cb53bd551c 100644
--- a/src/components/ContentComponents/Konnector/KonnectorOAuthForm.tsx
+++ b/src/components/Connection/ConnectionOAuthForm.tsx
@@ -1,44 +1,50 @@
 import React from 'react'
-import { Client, withClient } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 
-import { Konnector, Trigger } from 'doctypes'
-import OAuthForm from 'components/ContentComponents/OAuth/OAuthForm'
+import { Konnector, Trigger, FluidConfig } from 'models'
+import OAuthForm from 'components/Connection/OAuthForm'
 import StyledButton from 'components/CommonKit/Button/StyledButton'
-import { AccountService } from 'services/accountService'
-import { TriggerService } from 'services/triggersService'
+import AccountService from 'services/account.service'
+import TriggerService from 'services/triggers.service'
 
-interface KonnectorOAuthFormProps {
+interface ConnectionOAuthFormProps {
+  fluidConfig: FluidConfig
   konnector: Konnector
   siteLink: string
   onSuccess: Function
   loading: boolean
-  client: Client
-  t: Function
 }
 
-const KonnectorOAuthForm: React.FC<KonnectorOAuthFormProps> = ({
+const ConnectionOAuthForm: React.FC<ConnectionOAuthFormProps> = ({
+  fluidConfig,
   konnector,
   siteLink,
   onSuccess,
   loading,
-  client,
-  t,
-}: KonnectorOAuthFormProps) => {
+}: ConnectionOAuthFormProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const konnectorSlug: string = fluidConfig.konnectorConfig.slug
+
   const handleSuccess = async (accountId: string) => {
-    const account = await AccountService.getAccount(client, accountId)
+    const accountService = new AccountService(client)
+    const account = await accountService.getAccount(accountId)
     if (!account) {
       onSuccess(null, null)
     }
-    const triggersServices = new TriggerService(client, account, konnector)
-    const trigger: Trigger = await triggersServices.createTrigger()
+    const triggersServices = new TriggerService(client)
+    const trigger: Trigger = await triggersServices.createTrigger(
+      account,
+      konnector
+    )
     onSuccess(account, trigger)
   }
   return (
     <div className="koauthform">
-      <div className="koauthform-text text-16-normal">
-        {t('auth.' + konnector.slug + '.connect.info')}
-      </div>
+      <p className="info-provider text-16-normal">
+        {t('auth.' + `${konnectorSlug}` + '.connect.info')}
+      </p>
       <div className="koauthform-button">
         <OAuthForm konnector={konnector} onSuccess={handleSuccess} />
       </div>
@@ -65,4 +71,4 @@ const KonnectorOAuthForm: React.FC<KonnectorOAuthFormProps> = ({
   )
 }
 
-export default translate()(withClient(KonnectorOAuthForm))
+export default ConnectionOAuthForm
diff --git a/src/components/Connection/ConnectionResult.tsx b/src/components/Connection/ConnectionResult.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..33df1db8bbe36962237fbc561f50581d79a23db8
--- /dev/null
+++ b/src/components/Connection/ConnectionResult.tsx
@@ -0,0 +1,208 @@
+import React, { useState, useEffect, useCallback } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+import { useRecoilValue, useSetRecoilState } from 'recoil'
+import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers'
+
+import { Account, Konnector, Trigger } from 'models'
+import { userProfileState } from 'atoms/userProfile.state'
+import { fluidStatusState, fluidTypeState } from 'atoms/fluidState.state'
+import { challengeNotificationState } from 'atoms/notification.state'
+import ChallengeService from 'services/challenge.service'
+import TriggerService from 'services/triggers.service'
+import AccountService from 'services/account.service'
+import FluidService from 'services/fluid.service'
+import UserProfileService from 'services/userProfile.service'
+
+import ConnectionFlow, {
+  ERROR_EVENT,
+  LOGIN_SUCCESS_EVENT,
+  SUCCESS_EVENT,
+} from 'cozy-harvest-lib/dist/models/ConnectionFlow'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import warningWhite from 'assets/icons/ico/warning-white.svg'
+import StyledButton from 'components/CommonKit/Button/StyledButton'
+import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner'
+
+interface ConnectionResultProps {
+  account: Account
+  konnector: Konnector
+  handleJobState: Function
+}
+
+const ConnectionResult: React.FC<ConnectionResultProps> = ({
+  account,
+  konnector,
+  handleJobState,
+}: ConnectionResultProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const [trigger, setTrigger] = useState<Trigger | null>(null)
+  const [updating, setUpdating] = useState<boolean>(false)
+  const [lastExecutionDate, setLastExecutionDate] = useState<string>('-')
+  const [status, setStatus] = useState<string>('')
+
+  const setFluidStatusState = useSetRecoilState(fluidStatusState)
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  const setChallengeNotificationState = useSetRecoilState(
+    challengeNotificationState
+  )
+  const setUserProfile = useSetRecoilState(userProfileState)
+
+  const refreshFluidState = async () => {
+    const fluidService = new FluidService(client)
+    const fluidStatus = await fluidService.getFluidStatus()
+    if (fluidStatus) {
+      setFluidStatusState(fluidStatus)
+      const challengeService = new ChallengeService(client)
+      const achievement = await challengeService.checkAchievement('CHA00000001')
+      if (achievement) {
+        const notificationChallenge = await challengeService.isCurrentChallengeOver(
+          achievement,
+          fluidTypes
+        )
+        if (notificationChallenge) {
+          setChallengeNotificationState(notificationChallenge)
+        }
+      }
+    }
+  }
+
+  const updateProfileHaveSeenOldFluidModal = useCallback(async () => {
+    const userProfileService = new UserProfileService(client)
+    await userProfileService
+      .updateUserProfile({ haveSeenOldFluidModal: false })
+      .then(updatedUserProfile => {
+        updatedUserProfile && setUserProfile(updatedUserProfile)
+      })
+  }, [setUserProfile])
+
+  const updateState = async (_trigger: Trigger) => {
+    const triggerService = new TriggerService(client)
+    const triggerState = await triggerService.fetchTriggerState(_trigger)
+
+    if (triggerState) {
+      if (triggerState.last_success) {
+        setLastExecutionDate(
+          new Date(triggerState.last_success).toLocaleString()
+        )
+      } else {
+        setLastExecutionDate('-')
+      }
+      setStatus(triggerState.status)
+      handleJobState(triggerState.status)
+      await refreshFluidState()
+    }
+  }
+
+  const callbackResponse = async () => {
+    if (trigger) {
+      await updateState(trigger)
+    }
+    setUpdating(false)
+  }
+
+  const updateKonnector = async () => {
+    setUpdating(true)
+    setStatus('')
+    setLastExecutionDate('-')
+    handleJobState('')
+    await updateProfileHaveSeenOldFluidModal()
+    if (trigger && !isKonnectorRunning(trigger)) {
+      const connectionFlow = new ConnectionFlow(client, trigger, konnector)
+      await connectionFlow.launch()
+
+      connectionFlow.jobWatcher.on(ERROR_EVENT, () => {
+        callbackResponse()
+      })
+      connectionFlow.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
+        callbackResponse()
+      })
+      connectionFlow.jobWatcher.on(SUCCESS_EVENT, () => {
+        callbackResponse()
+      })
+    }
+  }
+
+  const deleteAccount = async () => {
+    setUpdating(true)
+    try {
+      if (account) {
+        const accountService = new AccountService(client)
+        await accountService.deleteAccount(account)
+        await updateProfileHaveSeenOldFluidModal()
+        await refreshFluidState()
+      }
+    } catch (error) {
+      setUpdating(false)
+    }
+  }
+
+  useEffect(() => {
+    let subscribed = true
+    async function getData() {
+      const triggerService = new TriggerService(client)
+      const _trigger = await triggerService.getTrigger(account, konnector)
+      if (subscribed && _trigger) {
+        setTrigger(_trigger)
+        await updateState(_trigger)
+      }
+    }
+    getData()
+    return () => {
+      subscribed = false
+    }
+  }, [])
+
+  return (
+    <div className="accordion-update-result">
+      <div
+        className={
+          status === 'errored' ? 'accordion-update-errored' : 'accordion-update'
+        }
+      >
+        {status === 'errored' && (
+          <div className="warning-white">
+            <StyledIcon
+              icon={warningWhite}
+              size={36}
+              className="warning-icon"
+            />
+          </div>
+        )}
+        <div>
+          <div className="accordion-caption text-16-normal">
+            {t('KONNECTORCONFIG.LABEL_UPDATEDAT')}
+          </div>
+          <div className="text-16-bold">{lastExecutionDate}</div>
+        </div>
+      </div>
+      <div className="inline-buttons">
+        <StyledButton
+          className="konnector-delete"
+          type="button"
+          color="secondary"
+          onClick={deleteAccount}
+          disabled={updating}
+        >
+          {t('KONNECTORCONFIG.BTN_DELETE')}
+        </StyledButton>
+        <StyledButton
+          className="konnector-update"
+          type="button"
+          color="primary"
+          onClick={updateKonnector}
+          disabled={updating}
+        >
+          {updating ? (
+            <StyledBlackSpinner size="2em" />
+          ) : (
+            <div>{t('KONNECTORCONFIG.BTN_UPDATE')}</div>
+          )}
+        </StyledButton>
+      </div>
+    </div>
+  )
+}
+
+export default ConnectionResult
diff --git a/src/components/ContentComponents/OAuth/OAuthForm.tsx b/src/components/Connection/OAuthForm.tsx
similarity index 88%
rename from src/components/ContentComponents/OAuth/OAuthForm.tsx
rename to src/components/Connection/OAuthForm.tsx
index aae44d9b810140423e3b4e6af23d42e01156b7da..cded6d9149120ab2396ac8ec8b6aafb74b25a946 100644
--- a/src/components/ContentComponents/OAuth/OAuthForm.tsx
+++ b/src/components/Connection/OAuthForm.tsx
@@ -1,8 +1,8 @@
 import React, { useState } from 'react'
-import { Client, withClient } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 
-import { Konnector } from 'doctypes'
+import { Konnector } from 'models'
 import { OAuthWindow } from 'cozy-harvest-lib/dist/components/OAuthWindow'
 
 import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg'
@@ -14,19 +14,17 @@ interface OAuthFormProps {
   konnector: Konnector
   onSuccess: Function
   loginFailed: boolean
-  client: Client
-  t: Function
 }
 
 const OAuthForm: React.FC<OAuthFormProps> = ({
   konnector,
   onSuccess,
-  client,
-  t,
 }: OAuthFormProps) => {
   const IDLE = 'idle'
   const WAITING = 'waiting'
 
+  const { t } = useI18n()
+  const client = useClient()
   const [status, setStatus] = useState<string>(IDLE)
 
   function endOAuth() {
@@ -73,6 +71,7 @@ const OAuthForm: React.FC<OAuthFormProps> = ({
         <OAuthWindow
           client={client}
           konnector={konnector}
+          redirectSlug={client.appMetadata.slug}
           onSuccess={handleAccountId}
           onCancel={handleOAuthCancel}
           t={t}
@@ -82,4 +81,4 @@ const OAuthForm: React.FC<OAuthFormProps> = ({
   )
 }
 
-export default translate()(withClient(OAuthForm))
+export default OAuthForm
diff --git a/src/components/ContentComponents/ConsumptionNavigator/ActivateHalfHourLoad.tsx b/src/components/ConsumptionNavigator/ActivateHalfHourLoad.tsx
similarity index 68%
rename from src/components/ContentComponents/ConsumptionNavigator/ActivateHalfHourLoad.tsx
rename to src/components/ConsumptionNavigator/ActivateHalfHourLoad.tsx
index 958cb0db6b07440c029edc66911ba14e62a6959a..13f0577650b976de5306bad6fdc6b8a0d5c6cc91 100644
--- a/src/components/ContentComponents/ConsumptionNavigator/ActivateHalfHourLoad.tsx
+++ b/src/components/ConsumptionNavigator/ActivateHalfHourLoad.tsx
@@ -1,16 +1,15 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+
+import ConfigService from 'services/fluidConfig.service'
+
 import StyledAuthButton from 'components/CommonKit/Button/StyledAuthButton'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import iconEnedisLogo from 'assets/icons/visu/enedis-logo.svg'
-import Config from '../../../../config.json'
-
-interface ActivateHalfHourLoadProps {
-  t: Function // translation service
-}
-const ActivateHalfHourLoad = ({ t }: ActivateHalfHourLoadProps) => {
-  const siteLink = Config.fluidConfig[0].siteLink //TODO change here
 
+const ActivateHalfHourLoad = () => {
+  const { t } = useI18n()
+  const fluidConfig = new ConfigService().getFluidConfig()
   return (
     <div className="cta-box">
       <div className="cta-box-header header-text text-16-normal">
@@ -20,7 +19,7 @@ const ActivateHalfHourLoad = ({ t }: ActivateHalfHourLoadProps) => {
         className="cta-box-button"
         type="button"
         color="primary"
-        onClick={() => window.open(siteLink, '_blank')}
+        onClick={() => window.open(fluidConfig[0].siteLink, '_blank')}
       >
         <div className="oauthform-button-content">
           <div className="oauthform-button-content-icon">
@@ -35,4 +34,4 @@ const ActivateHalfHourLoad = ({ t }: ActivateHalfHourLoadProps) => {
   )
 }
 
-export default translate()(ActivateHalfHourLoad)
+export default ActivateHalfHourLoad
diff --git a/src/components/ContentComponents/ConsumptionNavigator/ConsumptionNavigator.tsx b/src/components/ConsumptionNavigator/ConsumptionNavigator.tsx
similarity index 93%
rename from src/components/ContentComponents/ConsumptionNavigator/ConsumptionNavigator.tsx
rename to src/components/ConsumptionNavigator/ConsumptionNavigator.tsx
index b63fc3acc0e217404fa82fb1a2fddcda1bedf29b..78af1a14a87e9a34a761e223c019883e0071fc62 100644
--- a/src/components/ContentComponents/ConsumptionNavigator/ConsumptionNavigator.tsx
+++ b/src/components/ConsumptionNavigator/ConsumptionNavigator.tsx
@@ -1,16 +1,17 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+
 import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+
 import Tabs from 'components/CommonKit/Tabs/StyledTabs'
 import Tab from 'components/CommonKit/Tabs/StyledTab'
-import { TimeStep } from 'services/dataConsumptionContracts'
 
 interface ConsumptionNavigatorProps {
   fluidTypes: FluidType[]
   multiFluid: boolean
   timeStep: TimeStep
   handleClickTimeStep(timeStep: TimeStep): void
-  t: Function
 }
 
 const ConsumptionNavigator: React.FC<ConsumptionNavigatorProps> = ({
@@ -18,8 +19,8 @@ const ConsumptionNavigator: React.FC<ConsumptionNavigatorProps> = ({
   multiFluid,
   timeStep,
   handleClickTimeStep,
-  t,
 }: ConsumptionNavigatorProps) => {
+  const { t } = useI18n()
   const fluidStyle = multiFluid
     ? 'MULTIFLUID'
     : fluidTypes.length === 0
@@ -91,4 +92,4 @@ const ConsumptionNavigator: React.FC<ConsumptionNavigatorProps> = ({
   )
 }
 
-export default translate()(ConsumptionNavigator)
+export default ConsumptionNavigator
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/ConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx
similarity index 70%
rename from src/components/ContentComponents/ConsumptionVisualizer/ConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx
index e42661db7164ba5feff30e178928ef70796f0ca1..b395e25695006f9331c3def39da28729355d616b 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/ConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/ConsumptionVisualizer.tsx
@@ -1,22 +1,24 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { FluidType } from 'enum/fluid.enum'
 import { DateTime } from 'luxon'
-import { TimeStep, IDataload } from 'services/dataConsumptionContracts'
 
-import { isDataToCome } from 'services/dateChartService'
-import DateConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/DateConsumptionVisualizer'
-import DataloadConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/DataloadConsumptionVisualizer'
-import DetailedConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/DetailedConsumptionVisualizer'
-import LastDataConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/LastDataConsumptionVisualizer'
-import ErrorDataConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/ErrorDataConsumptionVisualizer'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Dataload } from 'models'
+import DateChartService from 'services/dateChart.service'
+
+import DateConsumptionVisualizer from 'components/ConsumptionVisualizer/DateConsumptionVisualizer'
+import DataloadConsumptionVisualizer from 'components/ConsumptionVisualizer/DataloadConsumptionVisualizer'
+import DetailedConsumptionVisualizer from 'components/ConsumptionVisualizer/DetailedConsumptionVisualizer'
+import LastDataConsumptionVisualizer from 'components/ConsumptionVisualizer/LastDataConsumptionVisualizer'
+import ErrorDataConsumptionVisualizer from 'components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer'
 
 interface ConsumptionVisualizerProps {
   fluidTypes: FluidType[]
   timeStep: TimeStep
   date: DateTime
-  dataload: IDataload
-  compareDataload: IDataload
+  dataload: Dataload
+  compareDataload: Dataload
   showCompare: boolean
   multiFluid: boolean
   lastDataDate: DateTime
@@ -47,7 +49,8 @@ const ConsumptionVisualizer = ({
   handleClickDetails,
   handleChangeIndex,
 }: ConsumptionVisualizerProps) => {
-  fluidTypes.sort()
+  const { t } = useI18n()
+  const dateChartService = new DateChartService()
   return (
     <div className="cv">
       <DateConsumptionVisualizer
@@ -79,11 +82,11 @@ const ConsumptionVisualizer = ({
         {dataload &&
           dataload.valueDetail &&
           ((dataload.valueDetail[0] === -1 &&
-            !isDataToCome(dataload, fluidTypes[0])) ||
+            !dateChartService.isDataToCome(dataload, fluidTypes[0])) ||
             (dataload.valueDetail[1] === -1 &&
-              !isDataToCome(dataload, fluidTypes[1])) ||
+              !dateChartService.isDataToCome(dataload, fluidTypes[1])) ||
             (dataload.valueDetail[2] === -1 &&
-              !isDataToCome(dataload, fluidTypes[2]))) && (
+              !dateChartService.isDataToCome(dataload, fluidTypes[2]))) && (
             <ErrorDataConsumptionVisualizer
               date={date}
               indexDisplayed={indexDisplayed}
@@ -108,4 +111,4 @@ const ConsumptionVisualizer = ({
   )
 }
 
-export default translate()(ConsumptionVisualizer)
+export default ConsumptionVisualizer
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
similarity index 80%
rename from src/components/ContentComponents/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
index af8a52377b7de0e8461aaf060f9f38b9e7b820f3..8be307fa6c98daf94885c3150f3aeeebebb90ae5 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/DataloadConsumptionVisualizer.tsx
@@ -1,26 +1,27 @@
 import React, { useState, useEffect } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { NavLink } from 'react-router-dom'
+import { DateTime } from 'luxon'
+
 import { FluidType } from 'enum/fluid.enum'
-import { IDataload } from 'services/dataConsumptionContracts'
+import { Dataload } from 'models'
+import ConverterService from 'services/converter.service'
+import DateChartService from 'services/dateChart.service'
+import { getPicto } from 'utils/picto'
+import { formatNumberValues } from 'utils/utils'
+
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import { getPicto, formatNumberValues } from 'utils/utils'
-import LoadToCurrencyConverter from 'services/loadToCurrencyConverterService'
-import { isDataToCome } from 'services/dateChartService'
-import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import { DateTime, Interval } from 'luxon'
 
 interface DataloadConsumptionVisualizerProps {
   fluidTypes: FluidType[]
-  dataload: IDataload
-  compareDataload: IDataload
+  dataload: Dataload
+  compareDataload: Dataload
   showCompare: boolean
   multiFluid: boolean
   lastDataDate: DateTime
   isLoaded: boolean
   handleClickMove: (increment: number) => void
   handleClickDetails: () => void
-  t: Function // translation service
 }
 const DataloadConsumptionVisualizer = ({
   fluidTypes,
@@ -30,9 +31,9 @@ const DataloadConsumptionVisualizer = ({
   multiFluid,
   lastDataDate,
   isLoaded,
-  t,
 }: DataloadConsumptionVisualizerProps) => {
-  const ltcc = new LoadToCurrencyConverter()
+  const { t } = useI18n()
+  const converterService = new ConverterService()
   const [hasData, setHasData] = useState(false)
   const [hasCompareData, setHasCompareData] = useState(false)
   const fluidStyle = multiFluid
@@ -40,6 +41,7 @@ const DataloadConsumptionVisualizer = ({
     : fluidTypes.length > 1
     ? 'MULTIFLUID'
     : FluidType[fluidTypes[0]]
+  const dateChartService = new DateChartService()
 
   useEffect(() => {
     if ((dataload && dataload.value) || (dataload && dataload.value === 0)) {
@@ -84,7 +86,10 @@ const DataloadConsumptionVisualizer = ({
                 className={`cv-euro ${fluidStyle.toLowerCase()}-compare chart-fluid`}
               >
                 {`${formatNumberValues(
-                  ltcc.Convert(compareDataload.value, fluidTypes[0])
+                  converterService.LoadToEuro(
+                    compareDataload.value,
+                    fluidTypes[0]
+                  )
                 )} €`}
               </div>
             </div>
@@ -99,21 +104,17 @@ const DataloadConsumptionVisualizer = ({
             <div
               className={`cv-load-value ${fluidStyle.toLowerCase()} chart-result`}
             >
-              {multiFluid && fluidTypes.length === 1
-                ? formatNumberValues(
-                    ltcc.Convert(dataload.value, fluidTypes[0])
-                  )
-                : formatNumberValues(dataload.value)}
-              <span className="text-18-normal">{`${t(
-                'FLUID.' + fluidStyle + '.UNIT'
-              )}`}</span>
+              {formatNumberValues(dataload.value)}
+              <span className="text-18-normal">
+                {`${t('FLUID.' + fluidStyle + '.UNIT')}`}
+              </span>
             </div>
             {!multiFluid ? (
               <div
                 className={`cv-euro ${fluidStyle.toLowerCase()} chart-fluid`}
               >
                 {`${formatNumberValues(
-                  ltcc.Convert(dataload.value, fluidTypes[0])
+                  converterService.LoadToEuro(dataload.value, fluidTypes[0])
                 )} €`}
               </div>
             ) : (
@@ -130,7 +131,8 @@ const DataloadConsumptionVisualizer = ({
                       >
                         <div
                           className={
-                            load === -1 && !isDataToCome(dataload, index)
+                            load === -1 &&
+                            !dateChartService.isDataToCome(dataload, index)
                               ? 'cv-euro-fluid error'
                               : `cv-euro-fluid ${FluidType[
                                   index
@@ -143,9 +145,10 @@ const DataloadConsumptionVisualizer = ({
                             size={22}
                           />
                           <div>
-                            {!isDataToCome(dataload, index) && load !== -1
+                            {!dateChartService.isDataToCome(dataload, index) &&
+                            load !== -1
                               ? `${formatNumberValues(load)} €`
-                              : isDataToCome(dataload, index)
+                              : dateChartService.isDataToCome(dataload, index)
                               ? t('COMMON.DATATOCOME')
                               : '---- €'}
                           </div>
@@ -171,7 +174,10 @@ const DataloadConsumptionVisualizer = ({
                         size={22}
                       />
                       <div>{`${formatNumberValues(
-                        ltcc.Convert(dataload.value, fluidTypes[0])
+                        converterService.LoadToEuro(
+                          dataload.value,
+                          fluidTypes[0]
+                        )
                       )} €`}</div>
                     </div>
                   </NavLink>
@@ -203,4 +209,4 @@ const DataloadConsumptionVisualizer = ({
   )
 }
 
-export default translate()(DataloadConsumptionVisualizer)
+export default DataloadConsumptionVisualizer
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/DateConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DateConsumptionVisualizer.tsx
similarity index 90%
rename from src/components/ContentComponents/ConsumptionVisualizer/DateConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/DateConsumptionVisualizer.tsx
index 4220c30a69e1ab1b718d3151e9c1e0588e6b04ec..e6c4352f486816fc1add4ee52562b9ed031d8f09 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/DateConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/DateConsumptionVisualizer.tsx
@@ -1,8 +1,9 @@
 import React from 'react'
 import { DateTime } from 'luxon'
-import { TimeStep } from 'services/dataConsumptionContracts'
 
-import DateFormatConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/DateFormatConsumptionVisualizer'
+import { TimeStep } from 'enum/timeStep.enum'
+
+import DateFormatConsumptionVisualizer from 'components/ConsumptionVisualizer/DateFormatConsumptionVisualizer'
 import StyledIconbutton from 'components/CommonKit/IconButton/StyledIconButton'
 import LeftArrowIcon from 'assets/icons/ico/left-arrow.svg'
 import RigthArrowIcon from 'assets/icons/ico/right-arrow.svg'
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/DateFormatConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DateFormatConsumptionVisualizer.tsx
similarity index 96%
rename from src/components/ContentComponents/ConsumptionVisualizer/DateFormatConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/DateFormatConsumptionVisualizer.tsx
index 9a98895f66a6cc4af6efbedea81243059cc1dfec..5d3155d63bf9a45babba95db3aa10467d9e8c891 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/DateFormatConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/DateFormatConsumptionVisualizer.tsx
@@ -1,6 +1,6 @@
 import React from 'react'
 import { DateTime } from 'luxon'
-import { TimeStep } from 'services/dataConsumptionContracts'
+import { TimeStep } from 'enum/timeStep.enum'
 
 interface DateFormatConsumptionVisualizerProps {
   timeStep: TimeStep
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/DetailedConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/DetailedConsumptionVisualizer.tsx
similarity index 86%
rename from src/components/ContentComponents/ConsumptionVisualizer/DetailedConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/DetailedConsumptionVisualizer.tsx
index 0bb9b2c68b31ca59d003e6619fa898b71133fbdb..aa15c3f199af6e663dd7f5f6063fbd357aa56515 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/DetailedConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/DetailedConsumptionVisualizer.tsx
@@ -1,22 +1,21 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { FluidType } from 'enum/fluid.enum'
-import { TimeStep } from 'services/dataConsumptionContracts'
+import { TimeStep } from 'enum/timeStep.enum'
 
 interface DetailedConsumptionVisualizerProps {
   fluidTypes: FluidType[]
   timeStep: TimeStep
   multiFluid: boolean
   handleClickDetails: () => void
-  t: Function // translation service
 }
 const DetailedConsumptionVisualizer = ({
   fluidTypes,
   timeStep,
   multiFluid,
   handleClickDetails,
-  t,
 }: DetailedConsumptionVisualizerProps) => {
+  const { t } = useI18n()
   const isDetailDisplayed = () => {
     if (multiFluid) {
       return false
@@ -60,4 +59,4 @@ const DetailedConsumptionVisualizer = ({
   )
 }
 
-export default translate()(DetailedConsumptionVisualizer)
+export default DetailedConsumptionVisualizer
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx
similarity index 90%
rename from src/components/ContentComponents/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx
index d3714333ff530ebf5e5543183c5e5aa4a61abfc0..c763ab1beb662b35609baa794b15784be483d883 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/ErrorDataConsumptionVisualizer.tsx
@@ -1,12 +1,11 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { DateTime, Interval } from 'luxon'
 import warning from 'assets/icons/ico/warning.svg'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 
 interface ErrorDataConsumptionVisualizerProps {
   lastDateWithAllData: DateTime
-  t: Function // translation service
   handleChangeIndex: (index: number) => void
   indexDisplayed: number
   setSelectedDate: Function
@@ -15,12 +14,12 @@ interface ErrorDataConsumptionVisualizerProps {
 }
 const ErrorDataConsumptionVisualizer = ({
   lastDateWithAllData,
-  t,
   date,
   indexDisplayed,
   setIndexDisplayed,
   setSelectedDate,
 }: ErrorDataConsumptionVisualizerProps) => {
+  const { t } = useI18n()
   const setDateAndMoveToindex = () => {
     let indexToMove = 0
     if (date < lastDateWithAllData) {
@@ -49,4 +48,4 @@ const ErrorDataConsumptionVisualizer = ({
   )
 }
 
-export default translate()(ErrorDataConsumptionVisualizer)
+export default ErrorDataConsumptionVisualizer
diff --git a/src/components/ContentComponents/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx b/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx
similarity index 71%
rename from src/components/ContentComponents/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx
rename to src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx
index 379c01e0ece96be1181ab5563f33f0b1255ea4da..c11f1f1ad942f5291637b671e461eae7d3273e49 100644
--- a/src/components/ContentComponents/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx
+++ b/src/components/ConsumptionVisualizer/LastDataConsumptionVisualizer.tsx
@@ -1,19 +1,18 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { FluidType } from 'enum/fluid.enum'
-import { TimeStep } from 'services/dataConsumptionContracts'
+import { TimeStep } from 'enum/timeStep.enum'
 
 interface LastDataConsumptionVisualizerProps {
   fluidTypes: FluidType[]
   timeStep: TimeStep
   multiFluid: boolean
   handleChangeIndex: (index: number) => void
-  t: Function // translation service
 }
 const LastDataConsumptionVisualizer = ({
   handleChangeIndex,
-  t,
 }: LastDataConsumptionVisualizerProps) => {
+  const { t } = useI18n()
   return (
     <div>
       <button className="cv-button" onClick={() => handleChangeIndex(0)}>
@@ -23,4 +22,4 @@ const LastDataConsumptionVisualizer = ({
   )
 }
 
-export default translate()(LastDataConsumptionVisualizer)
+export default LastDataConsumptionVisualizer
diff --git a/src/components/ContainerComponents/AgregatedStats/AgregatedStats.jsx b/src/components/ContainerComponents/AgregatedStats/AgregatedStats.jsx
deleted file mode 100644
index a81a3d690ad801964c1a19a6f04e6ab6403206a8..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/AgregatedStats/AgregatedStats.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react'
-import ConsumptionAgregator from '../../ContentComponents/ConsumptionAgregator/ConsumptionAgregator'
-
-const AgregatedStats = () => {
-  // add <Graph><Graph>
-  return (
-    <React.Fragment>
-      <ConsumptionAgregator></ConsumptionAgregator>
-    </React.Fragment>
-  )
-}
-
-export default AgregatedStats
diff --git a/src/components/ContainerComponents/BadgesContainer/BadgesContainer.tsx b/src/components/ContainerComponents/BadgesContainer/BadgesContainer.tsx
deleted file mode 100644
index c709b4dac4c0a209d8d79cd04256857dc4657996..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/BadgesContainer/BadgesContainer.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-import React from 'react'
-import ChallengesList from 'components/ContentComponents/ChallengeList/ChallengesList'
-
-const BadgesContainer: React.FC = () => {
-  return <ChallengesList />
-}
-
-export default BadgesContainer
diff --git a/src/components/ContainerComponents/CardsContainer/CardsContainer.tsx b/src/components/ContainerComponents/CardsContainer/CardsContainer.tsx
deleted file mode 100644
index 7bb358196c0530229ea5e202ccabccef4237a1e9..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/CardsContainer/CardsContainer.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import React, { useEffect, useState } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
-
-import Card from 'components/ContentComponents/Card/Card'
-import FluidService, { ProcessedData } from 'services/fluidService'
-import { FluidType } from 'enum/fluid.enum'
-import Spinner from 'cozy-ui/react/Spinner'
-
-interface CardsContainerProps {
-  client: Client
-  t: Function
-}
-
-const CardsContainer = ({ client, t }) => {
-  const [isLoading, setIsLoading] = useState(true)
-  const [elecCardProps, setElecCardProps] = useState<ProcessedData | null>(null)
-  const [gasCardProps, setGasCardProps] = useState<ProcessedData | null>(null)
-  const [waterCardProps, setWaterCardProps] = useState<ProcessedData | null>(
-    null
-  )
-
-  useEffect(() => {
-    const fluidService = new FluidService(client)
-    // flag use to prevent error linked to re-rendering
-    let subscribed = true
-    async function getData() {
-      const [elecData, gasData, waterData] = await Promise.all([
-        fluidService.getLastTwoWeeks(FluidType.ELECTRICITY),
-        fluidService.getLastTwoWeeks(FluidType.GAS),
-        fluidService.getLastTwoWeeks(FluidType.WATER),
-      ])
-      if (subscribed) {
-        setElecCardProps(fluidService.processElectricityData(elecData.data))
-        setGasCardProps(fluidService.processGasData(gasData.data))
-        setWaterCardProps(fluidService.processWaterData(waterData.data))
-        setIsLoading(false)
-      }
-    }
-    getData()
-
-    return () => {
-      subscribed = false
-    }
-  }, [])
-  return (
-    <React.Fragment>
-      {isLoading ? (
-        <Spinner size="xxlarge" middle />
-      ) : (
-        <div>
-          <p className="home-title">{t('COMMON.CONSO_DETAILS')}</p>
-          {elecCardProps && (
-            <Card type={FluidType.ELECTRICITY} {...elecCardProps} />
-          )}
-          {waterCardProps && (
-            <Card type={FluidType.WATER} {...waterCardProps} />
-          )}
-          {gasCardProps && <Card type={FluidType.GAS} {...gasCardProps} />}
-        </div>
-      )}
-    </React.Fragment>
-  )
-}
-
-export default translate()(withClient(CardsContainer))
diff --git a/src/components/ContainerComponents/ChallengeCardContainer/ChallengeCardContainer.tsx b/src/components/ContainerComponents/ChallengeCardContainer/ChallengeCardContainer.tsx
deleted file mode 100644
index 19ba76fd24772a56ed2ec1bce7fbd71cf780e985..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ChallengeCardContainer/ChallengeCardContainer.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-import React, { useContext } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
-import ChallengeCard from 'components/ContentComponents/ChallengeCard/ChallengeCard'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-
-interface ChallengeCardContainerProps {
-  t: Function
-  client: Client
-}
-
-const ChallengeCardContainer: React.FC<ChallengeCardContainerProps> = ({
-  t,
-}: ChallengeCardContainerProps) => {
-  const { currentChallenge } = useContext(AppContext)
-
-  return (
-    <>
-      <div className="ccc-root">
-        {currentChallenge && currentChallenge.challengeType && (
-          <div className="ccc-content">
-            <div className="ccc-header text-14-normal-uppercase">
-              {t('COMMON.CHALLENGE_CARD_LABEL')}
-            </div>
-            <ChallengeCard userChallenge={currentChallenge} />
-          </div>
-        )}
-      </div>
-    </>
-  )
-}
-
-export default translate()(ChallengeCardContainer)
diff --git a/src/components/ContainerComponents/Content/Content.tsx b/src/components/ContainerComponents/Content/Content.tsx
deleted file mode 100644
index 717da9b382fccb6c7ba2c62c19897176515a9ea0..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/Content/Content.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import React, { useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { ScreenType } from 'enum/screen.enum'
-import SplashContainer from '../SplashContainer/SplashContainer'
-import WelcomeModalContainer from '../WelcomeModalContainer/WelcomeModalContainer'
-
-interface ContentProps {
-  children?: React.ReactNode
-  height?: number
-  background?: string
-}
-
-const Content: React.FC<ContentProps> = ({
-  children,
-  height = 0,
-  background = 'inherit',
-}: ContentProps) => {
-  const {
-    isContextLoaded,
-    screenType,
-    userProfile,
-    setWelcomeModalViewed,
-  } = useContext(AppContext)
-  const cozyBarHeight = 48
-  const cozyNavHeight = 56
-  return (
-    <>
-      {!isContextLoaded ? (
-        <SplashContainer />
-      ) : userProfile && !userProfile.haveSeenWelcomeModal ? (
-        <WelcomeModalContainer handleClose={setWelcomeModalViewed} />
-      ) : (
-        <div
-          className="content-view"
-          style={{
-            marginTop: height,
-            paddingBottom: 0,
-            minHeight:
-              screenType !== ScreenType.DESKTOP
-                ? `calc(100vh - ${height}px - ${cozyBarHeight}px - ${cozyNavHeight}px)`
-                : `unset`,
-            background: background,
-          }}
-        >
-          {children}
-        </div>
-      )}
-    </>
-  )
-}
-
-export default Content
diff --git a/src/components/ContainerComponents/EcogestureContainer/EcogesturesContainer.tsx b/src/components/ContainerComponents/EcogestureContainer/EcogesturesContainer.tsx
deleted file mode 100644
index 559485a2175455e4f73f792b5217a6feabdc0cc0..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/EcogestureContainer/EcogesturesContainer.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import React, { useEffect } from 'react'
-import EcogesturesList from 'components/ContentComponents/EcogestureList/EcogestureList'
-
-const EcogesturesContainer: React.FC = () => {
-  useEffect(() => {
-    window.scrollTo(0, 0)
-  }, [])
-
-  return <EcogesturesList />
-}
-
-export default EcogesturesContainer
diff --git a/src/components/ContainerComponents/FeedbackContainer/FeedbackContainer.tsx b/src/components/ContainerComponents/FeedbackContainer/FeedbackContainer.tsx
deleted file mode 100644
index cbe81713b8cd3328cc8585c6ce63abd08dd0e620..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/FeedbackContainer/FeedbackContainer.tsx
+++ /dev/null
@@ -1,20 +0,0 @@
-import React, { useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import FeedbackModal from 'components/ContentComponents/Feedback/FeedbackModal'
-
-const FeedbackContainer: React.FC = () => {
-  const { feedbackIsOpened, setFeedbackOpened } = useContext(AppContext)
-
-  const handleCloseClick = () => {
-    setFeedbackOpened(false)
-  }
-
-  return (
-    <FeedbackModal
-      opened={feedbackIsOpened}
-      handleCloseClick={handleCloseClick}
-    />
-  )
-}
-
-export default FeedbackContainer
diff --git a/src/components/ContainerComponents/IndicatorsContainer/IndicatorContainerSwitcher.tsx b/src/components/ContainerComponents/IndicatorsContainer/IndicatorContainerSwitcher.tsx
deleted file mode 100644
index 1c742ebe59155530163b1fff4cebe848432e1262..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/IndicatorsContainer/IndicatorContainerSwitcher.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import React, { useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import {
-  TimeStep,
-  IPerformanceIndicator,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
-import { convertDateByTimeStep } from 'utils/utils'
-import FluidConfigService from 'services/fluidConfigService'
-import FluidPerformanceIndicator from 'components/ContentComponents/PerformanceIndicator/FluidPerformanceIndicator'
-import KonnectorViewer from 'components/ContentComponents/KonnectorViewer/KonnectorViewer'
-
-interface IndicatorContainerSwitcherProps {
-  performanceIndicators: IPerformanceIndicator[]
-  timeStep: TimeStep
-  comparisonTimePeriod: ITimePeriod | null
-}
-
-const IndicatorContainerSwitcher: React.FC<IndicatorContainerSwitcherProps> = ({
-  performanceIndicators,
-  timeStep,
-  comparisonTimePeriod,
-}: IndicatorContainerSwitcherProps) => {
-  const appContext = useContext(AppContext)
-  const allConfiguredFluidTypes = appContext.fluidTypes
-  const fluidConfig = new FluidConfigService().getFluidConfig()
-
-  return (
-    <div>
-      {fluidConfig.map((fluid, index) => {
-        return allConfiguredFluidTypes.includes(fluid.fluidTypeId) ? (
-          <FluidPerformanceIndicator
-            key={index}
-            fluidType={fluid.fluidTypeId}
-            performanceIndicator={performanceIndicators[fluid.fluidTypeId]}
-            timePeriodText={convertDateByTimeStep(
-              comparisonTimePeriod,
-              timeStep
-            )}
-          />
-        ) : null
-      })}
-      {fluidConfig.map((fluid, index) => {
-        return allConfiguredFluidTypes.includes(fluid.fluidTypeId) ? null : (
-          <KonnectorViewer key={index} fluidConfig={fluid} />
-        )
-      })}
-    </div>
-  )
-}
-
-export default IndicatorContainerSwitcher
diff --git a/src/components/ContainerComponents/IndicatorsContainer/MultiFluidIndicatorsContainer.tsx b/src/components/ContainerComponents/IndicatorsContainer/MultiFluidIndicatorsContainer.tsx
deleted file mode 100644
index eec3a6f671745dd9364b65dad8c8fa0f4dbdac42..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/IndicatorsContainer/MultiFluidIndicatorsContainer.tsx
+++ /dev/null
@@ -1,112 +0,0 @@
-import React, { useEffect, useContext, useState } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import {
-  TimeStep,
-  IPerformanceIndicator,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
-import { withClient, Client } from 'cozy-client'
-import PerformanceIndicator from 'components/ContentComponents/PerformanceIndicator/PerformanceIndicator'
-import IndicatorContainerSwitcher from 'components/ContainerComponents/IndicatorsContainer/IndicatorContainerSwitcher'
-import ConsumptionPeriodSelector from 'services/consumptionPeriodSelectorService'
-import ConsumptionDataManager from 'services/consumptionDataManagerService'
-import PerformanceIndicatorAggregateCalculator from 'services/performanceIndicatorAggregateCalculatorService'
-import { translate } from 'cozy-ui/react/I18n'
-import { convertDateByTimeStep } from 'utils/utils'
-
-interface MultiFluidIndicatorsContainerProps {
-  timeStep: TimeStep
-  setIndicatorsLoaded(): void
-  client: Client
-  t: Function
-}
-
-const MultiFluidIndicatorsContainer: React.FC<MultiFluidIndicatorsContainerProps> = ({
-  timeStep,
-  setIndicatorsLoaded,
-  client,
-  t,
-}: MultiFluidIndicatorsContainerProps) => {
-  const { fluidTypes } = useContext(AppContext)
-  const [performanceIndicators, setPerformanceIndicators] = useState<
-    IPerformanceIndicator[]
-  >([])
-
-  const [
-    currentTimePeriod,
-    setCurrentTimePeriod,
-  ] = useState<ITimePeriod | null>(null)
-  const [
-    comparisonTimePeriod,
-    setComparisonTimePeriod,
-  ] = useState<ITimePeriod | null>(null)
-  const [isLoaded, setIsLoaded] = useState<boolean>(false)
-
-  useEffect(() => {
-    let subscribed = true
-    async function populatePerformanceIndicators() {
-      const cdm = new ConsumptionDataManager(client)
-      const lastDate = await cdm.fetchLastDateData(fluidTypes)
-
-      if (subscribed && lastDate) {
-        const consumptionPeriodSelector = new ConsumptionPeriodSelector()
-        const periods = consumptionPeriodSelector.getTimePeriods(
-          lastDate,
-          fluidTypes,
-          timeStep
-        )
-
-        const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
-          periods.timePeriod,
-          timeStep,
-          fluidTypes,
-          periods.comparisonTimePeriod
-        )
-
-        if (fetchedPerformanceIndicators) {
-          setPerformanceIndicators(fetchedPerformanceIndicators)
-          setCurrentTimePeriod(periods.timePeriod)
-          setComparisonTimePeriod(periods.comparisonTimePeriod)
-        }
-      }
-      setIndicatorsLoaded()
-      setIsLoaded(true)
-    }
-    populatePerformanceIndicators()
-    return () => {
-      subscribed = false
-    }
-  }, [timeStep, fluidTypes])
-
-  return (
-    <>
-      {isLoaded ? (
-        <div className="fi-root">
-          <div className="fi-content">
-            <div className="fi-header text-14-normal-uppercase">
-              {t('COMMON.CONSO_CARDS_LABEL')}{' '}
-              {convertDateByTimeStep(currentTimePeriod, timeStep, true)}
-            </div>
-            <PerformanceIndicator
-              performanceIndicator={PerformanceIndicatorAggregateCalculator.aggregatePerformanceIndicators(
-                performanceIndicators
-              )}
-              timePeriodText={convertDateByTimeStep(
-                comparisonTimePeriod,
-                timeStep
-              )}
-              timeStep={timeStep}
-            />
-            <IndicatorContainerSwitcher
-              performanceIndicators={performanceIndicators}
-              timeStep={timeStep}
-              comparisonTimePeriod={comparisonTimePeriod}
-            />
-          </div>
-        </div>
-      ) : null}
-    </>
-  )
-}
-
-export default translate()(withClient(MultiFluidIndicatorsContainer))
diff --git a/src/components/ContainerComponents/KonnectorViewerContainer/KonnectorViewerContainer.tsx b/src/components/ContainerComponents/KonnectorViewerContainer/KonnectorViewerContainer.tsx
deleted file mode 100644
index a6f72bd43b96f96435f9b962e3b7c1326f9de6b8..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/KonnectorViewerContainer/KonnectorViewerContainer.tsx
+++ /dev/null
@@ -1,29 +0,0 @@
-import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import FluidConfigService from 'services/fluidConfigService'
-import IFluidConfig from 'services/IFluidConfig'
-import KonnectorViewerList from 'components/ContentComponents/KonnectorViewer/KonnectorViewerList'
-
-interface KonnectorViewerContainerProps {
-  isParam: boolean
-  t: Function
-}
-
-const KonnectorViewerContainer: React.FC<KonnectorViewerContainerProps> = ({
-  isParam = false,
-  t,
-}: KonnectorViewerContainerProps) => {
-  const fluidConfigs: IFluidConfig[] = new FluidConfigService().getFluidConfig()
-  return (
-    <div className="kv-root">
-      <div className="kv-content">
-        <div className="kv-header text-14-normal-uppercase">
-          {t('KONNECTORCONFIG.TITLE_CONNECTION')}
-        </div>
-        <KonnectorViewerList isParam={isParam} fluidConfigs={fluidConfigs} />
-      </div>
-    </div>
-  )
-}
-
-export default translate()(KonnectorViewerContainer)
diff --git a/src/components/ContainerComponents/ScrollToTop/ScrollToTop.tsx b/src/components/ContainerComponents/ScrollToTop/ScrollToTop.tsx
deleted file mode 100644
index 210526ff663dcc4d9a56c8c8e926f9f00cecc835..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ScrollToTop/ScrollToTop.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React, { useEffect, Fragment } from 'react'
-import { withRouter } from 'react-router-dom'
-import { history } from 'components/ContainerComponents/ViewContainer/ViewContainer'
-
-interface ScrollToTopProps {
-  children?: React.ReactNode
-}
-
-function ScrollToTop({ children }: ScrollToTopProps) {
-  useEffect(() => {
-    const unlisten = history.listen(() => {
-      window.scrollTo(0, 0)
-    })
-    return () => {
-      unlisten()
-    }
-  }, [])
-
-  return <Fragment>{children}</Fragment>
-}
-
-export default withRouter(ScrollToTop)
diff --git a/src/components/ContainerComponents/SplashContainer/SplashContainer.tsx b/src/components/ContainerComponents/SplashContainer/SplashContainer.tsx
deleted file mode 100644
index 99afbaecc324ff03d0a1ee0aada6a858c0f93caf..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/SplashContainer/SplashContainer.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React, { useContext } from 'react'
-import Lottie from 'react-lottie'
-import { translate } from 'cozy-ui/react/I18n'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import StyledButton from 'components/CommonKit/Button/StyledButton'
-
-import * as loadingData from 'assets/anims/splash.json'
-
-const loadingOptions = {
-  loop: true,
-  autoplay: true,
-  animationData: loadingData,
-  rendererSettings: {
-    preserveAspectRatio: 'xMidYMid slice',
-  },
-}
-
-interface SplashContainerProps {
-  t: Function
-}
-
-const SplashContainer: React.FC<SplashContainerProps> = ({
-  t,
-}: SplashContainerProps) => {
-  const appContext = useContext(AppContext)
-
-  return (
-    <div className="splash-root">
-      <div className="splash-content">
-        <Lottie
-          options={loadingOptions}
-          height={300}
-          width={300}
-          isStopped={appContext.isError}
-        />
-      </div>
-      <div className="splash-footer">
-        {appContext.isError && (
-          <>
-            <div className="splash-footer-error-text text-16-normal">
-              {t('LOADING.ERROR_LOADING')}
-            </div>
-            <StyledButton
-              className="splash-footer-button"
-              onClick={() => window.location.reload()}
-            >
-              {t('LOADING.RELOAD')}
-            </StyledButton>
-          </>
-        )}
-      </div>
-    </div>
-  )
-}
-
-export default translate()(SplashContainer)
diff --git a/src/components/ContainerComponents/ViewContainer/AvailableChallengeDetailsViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/AvailableChallengeDetailsViewContainer.tsx
deleted file mode 100644
index 7152d937d96a2337d0b608dc2ac24db390f83ad8..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ViewContainer/AvailableChallengeDetailsViewContainer.tsx
+++ /dev/null
@@ -1,179 +0,0 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { translate } from 'cozy-ui/react/I18n'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import { history } from 'components/ContainerComponents/ViewContainer/ViewContainer'
-import { ChallengeType, UserChallenge } from 'services/dataChallengeContracts'
-import { Redirect } from 'react-router-dom'
-import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import ChallengeManager from 'services/challengeDataManagerService'
-import { Client, withClient } from 'cozy-client'
-import StyledButtonValid from 'components/CommonKit/Button/StyledButtonValid'
-import { ScreenType } from 'enum/screen.enum'
-import AvailableChallengeIcon from 'assets/png/badges/available-big.png'
-import ConsumptionDataManager from 'services/consumptionDataManagerService'
-import { DateTime } from 'luxon'
-
-interface AvailableChallengeDetailsViewProps {
-  location: any
-  props: any
-  client: Client
-  t: Function
-}
-
-const AvailableChallengeDetailsViewContainer: React.FC<AvailableChallengeDetailsViewProps> = (
-  props: AvailableChallengeDetailsViewProps
-) => {
-  const t = props.t
-  const client = props.client
-  const challengeManager = new ChallengeManager(client)
-  const { refreshCurrentChallenge, screenType, fluidTypes } = useContext(
-    AppContext
-  )
-  const [redirect, setRedirect] = useState(false)
-  const [challenge, setChallenge] = useState<ChallengeType | null>(null)
-  const [userChallenge, setUserChallenge] = useState<UserChallenge | null>(null)
-  const [headerHeight, setHeaderHeight] = useState<number>(0)
-  const [lackOfDataForChallenge, setLackOfDataForChallenge] = useState<boolean>(
-    false
-  )
-
-  const defineHeaderHeight = (height: number) => {
-    setHeaderHeight(height)
-  }
-
-  async function startChallenge() {
-    if (challenge) {
-      const data = await challengeManager.startChallenge(
-        challenge,
-        fluidTypes,
-        challenge.availableEcogestures
-      )
-      const chal = await challengeManager.getCurrentChallenge()
-      await setUserChallenge(chal)
-      await refreshCurrentChallenge()
-    }
-  }
-
-  async function handleStartClick() {
-    await startChallenge()
-    setRedirect(true)
-  }
-
-  const renderRedirect = () => {
-    if (redirect) {
-      return (
-        <Redirect
-          to={{
-            pathname: '/challenges/ongoing',
-            state: { challenge: userChallenge },
-          }}
-        />
-      )
-    }
-  }
-
-  useEffect(() => {
-    let subscribed = true
-    const lag = challengeManager.getLagDays(fluidTypes)
-
-    const timePeriod = {
-      startDate: DateTime.local()
-        .plus({ days: -6 })
-        .startOf('day'),
-      endDate: DateTime.local()
-        .plus({ days: -lag })
-        .endOf('day'),
-    }
-
-    async function checkPreviousData() {
-      const cdm = new ConsumptionDataManager(client)
-      const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
-        timePeriod,
-        20,
-        fluidTypes
-      )
-      if (fetchedPerformanceIndicators && subscribed) {
-        fetchedPerformanceIndicators.forEach(element => {
-          !element.value ? setLackOfDataForChallenge(true) : null
-        })
-      } else {
-        setLackOfDataForChallenge(true)
-      }
-    }
-    checkPreviousData()
-    if (props.location.state) {
-      setChallenge(props && props.location.state.challenge)
-    }
-    return () => {
-      subscribed = false
-    }
-  }, [])
-
-  return (
-    <React.Fragment>
-      <CozyBar
-        titleKey={'COMMON.APP_NEW_CHALLENGE_TITLE'}
-        displayBackArrow={true}
-      />
-      <Header
-        setHeaderHeight={defineHeaderHeight}
-        desktopTitleKey={'COMMON.APP_NEW_CHALLENGE_TITLE'}
-        displayBackArrow={true}
-      ></Header>
-      {!props.location.state ? <Redirect to="/challenges" /> : null}
-      <Content height={headerHeight} background="var(--darkLight2)">
-        {!challenge ? (
-          <StyledSpinner />
-        ) : (
-          <>
-            <div className="cp-root --available">
-              <div className="cp-content">
-                <div className="cp-info --available">
-                  <div className="cp-title text-22-bold">{challenge.title}</div>
-                  <img
-                    className="cp-icon"
-                    src={AvailableChallengeIcon}
-                    width={screenType === ScreenType.MOBILE ? 180 : 300}
-                  ></img>
-                  <div className="cp-description text-16-bold">
-                    {challenge.description}
-                  </div>
-                  <div className="cp-valid">
-                    <div className="cp-left-button">
-                      <StyledButtonValid
-                        color="secondary"
-                        onClick={() => history.goBack()}
-                      >
-                        {t('CHALLENGE.NOT_NOW')}
-                      </StyledButtonValid>
-                    </div>
-                    <div className="cp-right-button">
-                      <StyledButtonValid
-                        disabled={lackOfDataForChallenge}
-                        color="primary"
-                        onClick={handleStartClick}
-                      >
-                        {t('CHALLENGE.START')}
-                        {renderRedirect()}
-                      </StyledButtonValid>
-                    </div>
-                  </div>
-                  <div className="lack-of-data-challenge">
-                    {lackOfDataForChallenge
-                      ? t('CHALLENGE.LACK_OF_DATA')
-                      : null}
-                  </div>
-                </div>
-              </div>
-            </div>
-          </>
-        )}
-      </Content>
-    </React.Fragment>
-  )
-}
-
-export default translate()(withClient(AvailableChallengeDetailsViewContainer))
diff --git a/src/components/ContainerComponents/ViewContainer/ChallengesViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/ChallengesViewContainer.tsx
deleted file mode 100644
index 083944ccecf8758a9cd263bbbdccff81c2e16a71..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ViewContainer/ChallengesViewContainer.tsx
+++ /dev/null
@@ -1,39 +0,0 @@
-import React, { useState } from 'react'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import { SelectView } from 'services/dataChallengeContracts'
-import ChallengeNavigator from 'components/ContentComponents/ChallengeNavigator/ChallengeNavigator'
-import BadgesContainer from 'components/ContainerComponents/BadgesContainer/BadgesContainer'
-import EcogesturesContainer from 'components/ContainerComponents/EcogestureContainer/EcogesturesContainer'
-
-const ChallengesViewContainer: React.FC = () => {
-  const [headerHeight, setHeaderHeight] = useState<number>(0)
-  const [selectedView, setSelectedView] = useState<SelectView>(0)
-  const defineHeaderHeight = (height: number) => {
-    setHeaderHeight(height)
-  }
-
-  const handleClickSelectedViewForNavigation = (_selectedView: SelectView) => {
-    setSelectedView(_selectedView)
-  }
-  return (
-    <React.Fragment>
-      <CozyBar titleKey={'COMMON.APP_CHALLENGE_TITLE'} />
-      <Header
-        setHeaderHeight={defineHeaderHeight}
-        desktopTitleKey={'COMMON.APP_CHALLENGE_TITLE'}
-      >
-        <ChallengeNavigator
-          selectedView={selectedView}
-          handleClickSelectView={handleClickSelectedViewForNavigation}
-        />
-      </Header>
-      <Content height={headerHeight} background="var(--darkLight2)">
-        {selectedView === 0 ? <BadgesContainer /> : <EcogesturesContainer />}
-      </Content>
-    </React.Fragment>
-  )
-}
-
-export default ChallengesViewContainer
diff --git a/src/components/ContainerComponents/ViewContainer/HomeViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/HomeViewContainer.tsx
deleted file mode 100644
index b17278c282a74a8a5893064dcca49042eb6791df..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ViewContainer/HomeViewContainer.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-import React, { useState, useContext, useEffect } from 'react'
-import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import FluidContainer from 'components/ContainerComponents/FluidChartContainer/FluidChartContainer'
-import { TimeStep } from 'services/dataConsumptionContracts'
-import ConsumptionNavigator from 'components/ContentComponents/ConsumptionNavigator/ConsumptionNavigator'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import MultliFluidIndicatorsContainer from 'components/ContainerComponents/IndicatorsContainer/MultiFluidIndicatorsContainer'
-import ChallengeCardContainer from 'components/ContainerComponents/ChallengeCardContainer/ChallengeCardContainer'
-import KonnectorViewerContainer from 'components/ContainerComponents/KonnectorViewerContainer/KonnectorViewerContainer'
-
-const HomeViewContainer: React.FC = () => {
-  const {
-    fluidTypes,
-    previousTimeStep,
-    setPreviousTimeStep,
-    chartIsLoaded,
-  } = useContext(AppContext)
-  const [timeStep, setTimeStep] = useState<TimeStep>(
-    previousTimeStep && previousTimeStep !== TimeStep.HALF_AN_HOUR
-      ? previousTimeStep
-      : TimeStep.DAY
-  )
-  const [resetRefenceDate, setResetReferenceDate] = useState<boolean>(false)
-  const [headerHeight, setHeaderHeight] = useState<number>(0)
-  const [isChartLoading, setChartLoading] = useState<boolean>(true)
-  const [isIndicatorsLoading, setIndicatorsLoading] = useState<boolean>(true)
-
-  const setChartLoaded = () => {
-    setChartLoading(false)
-  }
-
-  const setIndicatorsLoaded = () => {
-    setIndicatorsLoading(false)
-  }
-
-  const handleClickTimeStepForNavigation = (_timeStep: TimeStep) => {
-    setResetReferenceDate(true)
-    setTimeStep(_timeStep)
-    setPreviousTimeStep(_timeStep)
-  }
-
-  const handleClickTimeStepForFluidContainer = (_timeStep: TimeStep) => {
-    setResetReferenceDate(false)
-    setTimeStep(_timeStep)
-  }
-
-  const defineHeaderHeight = (height: number) => {
-    setHeaderHeight(height)
-  }
-
-  return (
-    <React.Fragment>
-      <CozyBar />
-      {fluidTypes && fluidTypes.length > 0 ? (
-        <>
-          <Header
-            setHeaderHeight={defineHeaderHeight}
-            textKey={'COMMON.APP_PRESENTATION'}
-          >
-            <ConsumptionNavigator
-              fluidTypes={fluidTypes}
-              multiFluid={true}
-              timeStep={timeStep}
-              handleClickTimeStep={handleClickTimeStepForNavigation}
-            />
-          </Header>
-          <Content height={headerHeight}>
-            {(isChartLoading || isIndicatorsLoading || !chartIsLoaded) && (
-              <div className="content-view-loading">
-                <StyledSpinner size="5em" />
-              </div>
-            )}
-            <div
-              className={`${
-                isChartLoading || isIndicatorsLoading || !chartIsLoaded
-                  ? 'chart-indicator-none'
-                  : 'chart-indicator-block'
-              }`}
-            >
-              <FluidContainer
-                timeStep={timeStep}
-                fluidTypes={fluidTypes}
-                resetReferenceDate={resetRefenceDate}
-                multiFluid={true}
-                handleClickTimeStep={handleClickTimeStepForFluidContainer}
-                setChartLoaded={setChartLoaded}
-              />
-              <MultliFluidIndicatorsContainer
-                timeStep={timeStep}
-                setIndicatorsLoaded={setIndicatorsLoaded}
-              />
-              <ChallengeCardContainer />
-            </div>
-          </Content>
-        </>
-      ) : (
-        <>
-          <Header setHeaderHeight={defineHeaderHeight}></Header>
-          <Content height={headerHeight}>
-            <KonnectorViewerContainer></KonnectorViewerContainer>
-          </Content>
-        </>
-      )}
-    </React.Fragment>
-  )
-}
-
-export default HomeViewContainer
diff --git a/src/components/ContainerComponents/ViewContainer/ParametersViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/ParametersViewContainer.tsx
deleted file mode 100644
index a4b973251c128e001891585a7cfe2d2c2f63a978..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ViewContainer/ParametersViewContainer.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import React, { useState } from 'react'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import KonnectorViewerContainer from 'components/ContainerComponents/KonnectorViewerContainer/KonnectorViewerContainer'
-import FAQContainer from 'components/ContainerComponents/FAQContainer/FAQContainer'
-import LegalNoticeContainer from 'components/ContainerComponents/LegalNoticeContainer/LegalNoticeContainer'
-import Version from 'components/ContentComponents/Version/Version'
-
-const ParametersViewContainer: React.FC = () => {
-  const [headerHeight, setHeaderHeight] = useState<number>(0)
-  const defineHeaderHeight = (height: number) => {
-    setHeaderHeight(height)
-  }
-  return (
-    <React.Fragment>
-      <CozyBar titleKey={'COMMON.APP_PARAMETERS_TITLE'} />
-      <Header
-        setHeaderHeight={defineHeaderHeight}
-        desktopTitleKey={'COMMON.APP_PARAMETERS_TITLE'}
-      ></Header>
-      <Content height={headerHeight}>
-        <FAQContainer />
-        <KonnectorViewerContainer isParam={true} />
-        <LegalNoticeContainer />
-        <Version />
-      </Content>
-    </React.Fragment>
-  )
-}
-
-export default ParametersViewContainer
diff --git a/src/components/ContainerComponents/ViewContainer/ViewContainer.tsx b/src/components/ContainerComponents/ViewContainer/ViewContainer.tsx
deleted file mode 100644
index d2f2184cbb710559f2fed8b43d6a8ec18f9d8234..0000000000000000000000000000000000000000
--- a/src/components/ContainerComponents/ViewContainer/ViewContainer.tsx
+++ /dev/null
@@ -1,135 +0,0 @@
-import React from 'react'
-import { Route, Switch, Redirect, HashRouter } from 'react-router-dom'
-import { createBrowserHistory } from 'history'
-import { Layout, Main, Content } from 'cozy-ui/react/Layout'
-import { Sprite as IconSprite } from 'cozy-ui/react/Icon'
-import { FluidType } from 'enum/fluid.enum'
-
-import AppContextProvider from 'components/Contexts/AppContextProvider'
-import Navbar from 'components/ContentComponents/Navbar/Navbar'
-import ScrollToTop from 'components/ContainerComponents/ScrollToTop/ScrollToTop'
-import HomeViewContainer from 'components/ContainerComponents/ViewContainer/HomeViewContainer'
-import ChallengesViewContainer from 'components/ContainerComponents/ViewContainer/ChallengesViewContainer'
-import SingleFluidViewContainer from './SingleFluidViewContainer'
-import ParametersViewContainer from 'components/ContainerComponents/ViewContainer/ParametersViewContainer'
-import FAQViewContainer from 'components/ContainerComponents/ViewContainer/FAQViewContainer'
-import FinishedChallengeDetailsViewContainer from './FinishedChallengeDetailsViewContainer'
-import OngoingChallengeDetailsViewContainer from './OngoingChallengeDetailsViewContainer'
-import LockedChallengeDetailsViewContainer from './LockedChallengeDetailsViewContainer'
-import AvailableChallengeDetailsViewContainer from './AvailableChallengeDetailsViewContainer'
-import SplashContainer from 'components/ContainerComponents/SplashContainer/SplashContainer'
-import LegalNoticeViewContainer from './LegalNoticeViewContainer'
-import FeedbackContainer from 'components/ContainerComponents/FeedbackContainer/FeedbackContainer'
-
-export const history = createBrowserHistory()
-
-export const ViewContainer = () => {
-  return (
-    <HashRouter {...history}>
-      <Layout>
-        <AppContextProvider>
-          <Navbar />
-          <Main>
-            <FeedbackContainer />
-            <Content className="app-content">
-              <ScrollToTop>
-                <Switch>
-                  <Route
-                    path="/consumption"
-                    render={({ match: { url } }) => (
-                      <>
-                        <Route
-                          path={`${url}/electricité`}
-                          component={() => (
-                            <SingleFluidViewContainer
-                              fluidTypes={[FluidType.ELECTRICITY]}
-                            />
-                          )}
-                        />
-                        <Route
-                          path={`${url}/eau`}
-                          component={() => (
-                            <SingleFluidViewContainer
-                              fluidTypes={[FluidType.WATER]}
-                            />
-                          )}
-                        />
-                        <Route
-                          path={`${url}/gaz`}
-                          component={() => (
-                            <SingleFluidViewContainer
-                              fluidTypes={[FluidType.GAS]}
-                            />
-                          )}
-                        />
-                        <Route
-                          path={`${url}/`}
-                          component={HomeViewContainer}
-                          exact
-                        />
-                      </>
-                    )}
-                  />
-                  <Route
-                    path="/challenges"
-                    render={({ match: { url } }) => (
-                      <>
-                        <Route
-                          path={`${url}/locked`}
-                          component={LockedChallengeDetailsViewContainer}
-                        />
-                        <Route
-                          path={`${url}/available`}
-                          component={AvailableChallengeDetailsViewContainer}
-                        />
-                        <Route
-                          path={`${url}/ongoing`}
-                          component={OngoingChallengeDetailsViewContainer}
-                        />
-                        <Route
-                          path={`${url}/finished`}
-                          component={FinishedChallengeDetailsViewContainer}
-                        />
-                        <Route
-                          path={`${url}/`}
-                          component={ChallengesViewContainer}
-                          exact
-                        />
-                      </>
-                    )}
-                  />
-                  <Route
-                    path="/parameters"
-                    render={({ match: { url } }) => (
-                      <>
-                        <Route
-                          path={`${url}/FAQ`}
-                          component={FAQViewContainer}
-                        />
-                        <Route
-                          path={`${url}/legalnotice`}
-                          component={LegalNoticeViewContainer}
-                        />
-                        <Route
-                          path={`${url}/`}
-                          component={ParametersViewContainer}
-                          exact
-                        />
-                      </>
-                    )}
-                  />
-                  <Route path="/splash" component={SplashContainer} />
-                  <Redirect from="/" to="/consumption" />
-                  <Redirect from="*" to="/consumption" />
-                </Switch>
-              </ScrollToTop>
-            </Content>
-          </Main>
-          <IconSprite />
-        </AppContextProvider>
-      </Layout>
-    </HashRouter>
-  )
-}
-
-export default ViewContainer
diff --git a/src/components/Content/Content.tsx b/src/components/Content/Content.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..093d783dd7db279b60f86060c5f71a9d839f872f
--- /dev/null
+++ b/src/components/Content/Content.tsx
@@ -0,0 +1,106 @@
+import React, { useCallback, useEffect } from 'react'
+import { useClient } from 'cozy-client'
+import { useRecoilState } from 'recoil'
+import { history } from 'components/App'
+
+import { ScreenType } from 'enum/screen.enum'
+import { ModalState, UserProfile } from 'models'
+import { userProfileState } from 'atoms/userProfile.state'
+import { screenTypeState } from 'atoms/screenType.state'
+import { modalState } from 'atoms/modal.state'
+import UserProfileService from 'services/userProfile.service'
+
+import WelcomeModal from 'components/Welcome/WelcomeModal'
+import FeedbackModal from 'components/Feedback/FeedbackModal'
+
+interface ContentProps {
+  children?: React.ReactNode
+  height?: number
+  background?: string
+}
+
+const Content: React.FC<ContentProps> = ({
+  children,
+  height = 0,
+  background = 'inherit',
+}: ContentProps) => {
+  const client = useClient()
+  const cozyBarHeight = 48
+  const cozyNavHeight = 56
+
+  const [screenType, setScreenType] = useRecoilState<ScreenType>(
+    screenTypeState
+  )
+  const [userProfile, setUserProfile] = useRecoilState<UserProfile>(
+    userProfileState
+  )
+  const [modal, setModalState] = useRecoilState<ModalState>(modalState)
+
+  const setWelcomeModalViewed = useCallback(async () => {
+    const userProfileService = new UserProfileService(client)
+    await userProfileService
+      .updateUserProfile({ haveSeenWelcomeModal: true })
+      .then(updatedUserProfile => {
+        updatedUserProfile && setUserProfile(updatedUserProfile)
+      })
+  }, [setUserProfile])
+
+  const handleFeedbackModalClose = () => {
+    setModalState((prev: ModalState) => ({ ...prev, feedbackModal: false }))
+  }
+
+  useEffect(() => {
+    const unlisten = history.listen(() => {
+      window.scrollTo(0, 0)
+    })
+    return () => {
+      unlisten()
+    }
+  }, [children])
+
+  useEffect(() => {
+    function handleResize() {
+      if (innerWidth <= 768) {
+        setScreenType(ScreenType.MOBILE)
+      } else if (innerWidth <= 1024) {
+        setScreenType(ScreenType.TABLET)
+      } else {
+        setScreenType(ScreenType.DESKTOP)
+      }
+    }
+    handleResize()
+    window.addEventListener('resize', handleResize)
+    return () => {
+      window.removeEventListener('resize', handleResize)
+    }
+  }, [])
+
+  return (
+    <>
+      <WelcomeModal
+        open={!userProfile.haveSeenWelcomeModal}
+        handleCloseClick={setWelcomeModalViewed}
+      />
+      <FeedbackModal
+        open={modal.feedbackModal}
+        handleCloseClick={handleFeedbackModalClose}
+      />
+      <div
+        className="content-view"
+        style={{
+          marginTop: height,
+          paddingBottom: 0,
+          minHeight:
+            screenType !== ScreenType.DESKTOP
+              ? `calc(100vh - ${height}px - ${cozyBarHeight}px - ${cozyNavHeight}px)`
+              : `unset`,
+          background: background,
+        }}
+      >
+        {children}
+      </div>
+    </>
+  )
+}
+
+export default Content
diff --git a/src/components/ContentComponents/Card/Card.tsx b/src/components/ContentComponents/Card/Card.tsx
deleted file mode 100644
index a85e1864e39f42c70558f52259547ada878f9ae5..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Card/Card.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import React from 'react'
-import Icon from 'cozy-ui/react/Icon'
-import { translate } from 'cozy-ui/react/I18n'
-import { FluidType } from 'enum/fluid.enum'
-import { getPicto, getCardColor } from 'utils/utils'
-import { ProcessedData } from 'services/fluidService'
-export interface CardProps extends ProcessedData {
-  type: FluidType
-  t: any // translation service
-}
-
-const Card: React.FC<CardProps> = ({
-  type,
-  consumptionValue,
-  weeklyCompareValue,
-  euclideanComparator,
-  t,
-}: CardProps) => {
-  const iconType = getPicto(type)
-  let sign: string
-  if (weeklyCompareValue > 0) {
-    sign = '+'
-  } else {
-    sign = '-'
-    weeklyCompareValue = Math.abs(weeklyCompareValue)
-  }
-
-  return (
-    <React.Fragment>
-      {weeklyCompareValue ? (
-        <div className={getCardColor(type)}>
-          <h1>{t('FLUID.' + FluidType[type] + '.LABEL')}</h1>
-          <div className="card-header">
-            <Icon icon={iconType} size={64} />
-            <div>
-              <h2>
-                <span>{consumptionValue}</span>{' '}
-                {t('FLUID.' + FluidType[type] + '.UNIT')}
-              </h2>
-              <h3>
-                <span className={sign === '+' ? 'green' : 'red'}>
-                  {sign + ' ' + weeklyCompareValue + ' %'}
-                </span>{' '}
-                / 7 derniers jours
-              </h3>
-            </div>
-          </div>
-          <p>{euclideanComparator}</p>
-        </div>
-      ) : (
-        <div className={getCardColor(type)}>
-          <h1>{t('FLUID.' + FluidType[type] + '.LABEL')}</h1>
-          <div className="card-header">
-            <Icon icon={iconType} size={64} />
-            <div>
-              <h2>
-                <span>-</span> {t('FLUID.' + FluidType[type] + '.UNIT')}
-              </h2>
-              <h3>
-                <span className={'blue'}> - %</span> / 7 derniers jours
-              </h3>
-            </div>
-          </div>
-          <p>Données insuffisantes pour le calcul des indicateurs</p>
-        </div>
-      )}
-    </React.Fragment>
-  )
-}
-
-export default translate()(Card)
diff --git a/src/components/ContentComponents/ChallengeModal/StartChallengeModal.tsx b/src/components/ContentComponents/ChallengeModal/StartChallengeModal.tsx
deleted file mode 100644
index 31a34544d77b1c783bd9a2c515455944ab4537e6..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/ChallengeModal/StartChallengeModal.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { Duration } from 'luxon'
-import { ChallengeType } from 'services/dataChallengeContracts'
-import Modal from 'components/CommonKit/Modal/Modal'
-import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
-import StyledWhiteButton from 'components/CommonKit/Button/StyledWhiteButton'
-import DefaultChallengeIcon from 'assets/icons/visu/challenge/default_challenge.svg'
-
-interface ChallengeModalProps {
-  opened: boolean
-  challenge: ChallengeType
-  t: Function
-  handleCloseClick: () => void
-  handleStartClick: () => void
-}
-
-const ChallengeModal: React.FC<ChallengeModalProps> = ({
-  opened,
-  challenge,
-  t,
-  handleCloseClick,
-  handleStartClick,
-}: ChallengeModalProps) => {
-  return (
-    <Modal open={opened} handleCloseClick={handleCloseClick}>
-      <div className="cm-header text-14-normal-uppercase">
-        {t('CHALLENGE.TITLE_CHALLENGE')}
-      </div>
-      {!challenge ? (
-        <StyledSpinner />
-      ) : (
-        <>
-          <div className="cm-title text-24-bold ">{challenge.title}</div>
-          <div className="cm-duration text-24-normal">
-            {Duration.fromObject(challenge.duration).as('days')} Jours
-          </div>
-          <StyledIconButton
-            className="cm-icon"
-            icon={!challenge.icon ? DefaultChallengeIcon : challenge.icon}
-            size={100}
-          />
-          <div className="cm-description text-16-bold">
-            {challenge.description}
-          </div>
-        </>
-      )}
-      <StyledWhiteButton onClick={handleStartClick}>
-        {t('CHALLENGE.CHALLENGE_GO')}
-      </StyledWhiteButton>
-    </Modal>
-  )
-}
-
-export default translate()(ChallengeModal)
diff --git a/src/components/ContentComponents/ChallengeNavigator/ChallengeNavigator.tsx b/src/components/ContentComponents/ChallengeNavigator/ChallengeNavigator.tsx
deleted file mode 100644
index ad7d1aeb598de56ef0e523d1dc4a03a50b0a9a44..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/ChallengeNavigator/ChallengeNavigator.tsx
+++ /dev/null
@@ -1,56 +0,0 @@
-import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import Tabs from 'components/CommonKit/Tabs/StyledBlueTabs'
-import Tab from 'components/CommonKit/Tabs/StyledBlueTab'
-import { SelectView } from 'services/dataChallengeContracts'
-
-interface ChallengeNavigatorProps {
-  selectedView: SelectView
-  handleClickSelectView(selectView: SelectView): void
-  t: Function
-}
-
-const ChallengeNavigator: React.FC<ChallengeNavigatorProps> = ({
-  selectedView,
-  handleClickSelectView,
-  t,
-}: ChallengeNavigatorProps) => {
-  // const view = SelectView[selectedView[0]]
-  const handleClick = (selectedView: SelectView) => {
-    handleClickSelectView(selectedView)
-  }
-
-  const defineNavTab = () => {
-    return [SelectView.BADGES, SelectView.ECOGESTURES]
-  }
-
-  const defineLabel = (inputSelectedView: SelectView) => {
-    const classes =
-      inputSelectedView === selectedView ? `tab-text-on` : `tab-text-off`
-    return (
-      <span className={classes}>
-        {t(`Nav.${SelectView[inputSelectedView]}`)}
-      </span>
-    )
-  }
-
-  return (
-    <div className="cn">
-      <Tabs className="cn-tabs" value={selectedView} variant="fullWidth">
-        {defineNavTab().map((inputSelectedView, index) => {
-          return (
-            <Tab
-              className="cn-tab"
-              key={index}
-              value={inputSelectedView}
-              label={defineLabel(inputSelectedView)}
-              onClick={() => handleClick(inputSelectedView)}
-            />
-          )
-        })}
-      </Tabs>
-    </div>
-  )
-}
-
-export default translate()(ChallengeNavigator)
diff --git a/src/components/ContentComponents/ConnectionPrompt/ConnectionPrompt.jsx b/src/components/ContentComponents/ConnectionPrompt/ConnectionPrompt.jsx
deleted file mode 100644
index 50f2fbaadea595277d77060a698cc627a731174e..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/ConnectionPrompt/ConnectionPrompt.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react'
-
-const ConnectionPrompt = () => {
-  return (
-    <div>
-      <span>The ConnectionPrompt Component goes in here</span>
-    </div>
-  )
-}
-
-export default ConnectionPrompt
diff --git a/src/components/ContentComponents/FluidChart/FluidChartSlide.tsx b/src/components/ContentComponents/FluidChart/FluidChartSlide.tsx
deleted file mode 100644
index 1eb1465ea6dd297c5f44e2abb4041ff8d3f4797f..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/FluidChart/FluidChartSlide.tsx
+++ /dev/null
@@ -1,104 +0,0 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { DateTime } from 'luxon'
-import {
-  IConsumptionDataManager,
-  IDataload,
-  IChartData,
-  ChartData,
-  TimeStep,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
-import { defineTimePeriod } from 'services/dateChartService'
-import { FluidType } from 'enum/fluid.enum'
-
-import BarChart from 'components/ContentComponents/Charts/BarChart'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-
-interface FluidChartSlideProps {
-  index: number
-  fluidTypes: FluidType[]
-  timeStep: TimeStep
-  multiFluid: boolean
-  referenceDate: DateTime
-  selectedDate: DateTime
-  showCompare: boolean
-  width: number
-  height: number
-  challengePeriod: ITimePeriod | null
-  handleClickData: (
-    dataload: IDataload,
-    compareDataload: IDataload | null
-  ) => void
-  consumptionDataManager: IConsumptionDataManager
-  isSwitching: boolean
-}
-
-const FluidChartSlide: React.FC<FluidChartSlideProps> = ({
-  index,
-  fluidTypes,
-  timeStep,
-  multiFluid,
-  referenceDate,
-  selectedDate,
-  showCompare,
-  width,
-  height,
-  challengePeriod,
-  handleClickData,
-  consumptionDataManager,
-  isSwitching,
-}: FluidChartSlideProps) => {
-  const [chartData, setChartData] = useState<IChartData>(new ChartData([]))
-  const [isLoaded, setIsLoaded] = useState<boolean>(false)
-
-  const { setChartIsLoaded, chartIsLoaded } = useContext(AppContext)
-
-  useEffect(() => {
-    let subscribed = true
-    async function loadData() {
-      const [timePeriod, compareTimePeriod] = await Promise.all([
-        defineTimePeriod(referenceDate, timeStep, index),
-        defineTimePeriod(referenceDate, timeStep, index + 1),
-      ])
-      const graphData = await consumptionDataManager.getGraphData(
-        timePeriod,
-        timeStep,
-        fluidTypes,
-        compareTimePeriod
-      )
-      if (subscribed && graphData && graphData.actualData.length > 0) {
-        setChartData(graphData)
-        setIsLoaded(true)
-        setChartIsLoaded(true)
-      }
-    }
-    setIsLoaded(false)
-
-    loadData()
-    return () => {
-      subscribed = false
-    }
-  }, [timeStep, fluidTypes])
-
-  return (
-    <div className="fs-slide">
-      {!isLoaded ? null : (
-        <BarChart
-          chartData={chartData}
-          fluidTypes={fluidTypes}
-          timeStep={timeStep}
-          multiFluid={multiFluid}
-          selectedDate={selectedDate}
-          showCompare={showCompare}
-          handleClickData={handleClickData}
-          height={height}
-          width={width}
-          challengePeriod={challengePeriod}
-          isSwitching={isSwitching}
-        />
-      )}
-    </div>
-  )
-}
-
-export default FluidChartSlide
diff --git a/src/components/ContentComponents/Footer/Footer.jsx b/src/components/ContentComponents/Footer/Footer.jsx
deleted file mode 100644
index 7d86f009a9d4129e9faabf26d3ea029aa662c660..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Footer/Footer.jsx
+++ /dev/null
@@ -1,11 +0,0 @@
-import React from 'react'
-
-const Footer = () => {
-  return (
-    <div>
-      <span>The Footer Component goes in here</span>
-    </div>
-  )
-}
-
-export default Footer
diff --git a/src/components/ContentComponents/Konnector/KonnectorForm.tsx b/src/components/ContentComponents/Konnector/KonnectorForm.tsx
deleted file mode 100644
index e02336b889dd2542fbf802cfea2a5e30e5a0dbe9..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Konnector/KonnectorForm.tsx
+++ /dev/null
@@ -1,51 +0,0 @@
-import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-
-import IFluidConfig from 'services/IFluidConfig'
-import { Konnector, Trigger } from 'doctypes'
-
-import KonnectorLoginForm from 'components/ContentComponents/Konnector/KonnectorLoginForm'
-import KonnectorOAuthForm from 'components/ContentComponents/Konnector/KonnectorOAuthForm'
-
-interface KonnectorFormProps {
-  fluidConfig: IFluidConfig
-  konnector: Konnector
-  account: Account | null
-  trigger: Trigger | null
-  handleSuccessForm: Function
-}
-
-const KonnectorForm: React.FC<KonnectorFormProps> = ({
-  fluidConfig,
-  konnector,
-  account,
-  trigger,
-  handleSuccessForm,
-}: KonnectorFormProps) => {
-  const oAuth: boolean = fluidConfig.konnectorConfig.oauth
-
-  const handleSuccess = (_account: Account, _trigger: Trigger) => {
-    handleSuccessForm(_account, _trigger)
-  }
-
-  return (
-    <>
-      {!oAuth ? (
-        <KonnectorLoginForm
-          fluidConfig={fluidConfig}
-          onSuccess={handleSuccess}
-          account={account}
-          trigger={trigger}
-        />
-      ) : (
-        <KonnectorOAuthForm
-          konnector={konnector}
-          siteLink={fluidConfig.siteLink}
-          onSuccess={handleSuccess}
-        />
-      )}
-    </>
-  )
-}
-
-export default translate()(KonnectorForm)
diff --git a/src/components/ContentComponents/Konnector/KonnectorResult.tsx b/src/components/ContentComponents/Konnector/KonnectorResult.tsx
deleted file mode 100644
index fdb201e67fbf157bfc16751c951777dc3f4059d1..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Konnector/KonnectorResult.tsx
+++ /dev/null
@@ -1,159 +0,0 @@
-import React, { useState, useContext, useEffect } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
-
-import { AppContext } from 'components/Contexts/AppContextProvider'
-
-import StyledButton from 'components/CommonKit/Button/StyledButton'
-import StyledBlackSpinner from 'components/CommonKit/Spinner/StyledBlackSpinner'
-
-import { Account, Trigger } from 'doctypes'
-import { TriggerService } from 'services/triggersService'
-import { AccountService } from 'services/accountService'
-
-import { isKonnectorRunning } from 'cozy-harvest-lib/dist/helpers/triggers'
-import {
-  KonnectorJob,
-  ERROR_EVENT,
-  LOGIN_SUCCESS_EVENT,
-  SUCCESS_EVENT,
-} from 'cozy-harvest-lib/dist/models/KonnectorJob'
-
-interface KonnectorResultProps {
-  account: Account
-  handleJobState: Function
-  client: Client
-  t: Function
-}
-
-const KonnectorResult: React.FC<KonnectorResultProps> = ({
-  account,
-  handleJobState,
-  client,
-  t,
-}: KonnectorResultProps) => {
-  const [trigger, setTrigger] = useState<Trigger | null>(null)
-  const [updating, setUpdating] = useState<boolean>(false)
-  const [lastExecutionDate, setLastExecutionDate] = useState<string>('-')
-  const [status, setStatus] = useState<string>('')
-
-  const context = useContext(AppContext)
-
-  const updateState = async (trigger: Trigger) => {
-    const triggerState = await TriggerService.fetchTriggerState(client, trigger)
-
-    if (triggerState) {
-      if (triggerState.last_success) {
-        setLastExecutionDate(
-          new Date(triggerState.last_success).toLocaleString()
-        )
-      } else {
-        setLastExecutionDate('-')
-      }
-      setStatus(triggerState.status)
-      handleJobState(triggerState.status)
-      await context.refreshFluidTypes()
-    }
-  }
-
-  const callbackResponse = async () => {
-    if (trigger) {
-      await updateState(trigger)
-    }
-    setUpdating(false)
-  }
-
-  const updateKonnector = async () => {
-    setUpdating(true)
-    setStatus('')
-    setLastExecutionDate('-')
-    handleJobState('')
-
-    if (trigger && !isKonnectorRunning(trigger)) {
-      const konnectorJob = new KonnectorJob(client, trigger)
-      await konnectorJob.launch()
-      konnectorJob.jobWatcher.on(ERROR_EVENT, () => {
-        callbackResponse()
-      })
-      konnectorJob.jobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
-        callbackResponse()
-      })
-      konnectorJob.jobWatcher.on(SUCCESS_EVENT, () => {
-        callbackResponse()
-      })
-    }
-  }
-
-  const deleteAccount = async () => {
-    setUpdating(true)
-    try {
-      if (account) {
-        await AccountService.deleteAccount(client, account)
-        await context.refreshFluidTypes()
-      }
-    } catch (error) {
-      setUpdating(false)
-    }
-  }
-
-  useEffect(() => {
-    let subscribed = true
-    async function getData() {
-      const _trigger = await TriggerService.fetchTriggerFromAccount(
-        client,
-        account
-      )
-      if (subscribed && _trigger) {
-        setTrigger(_trigger)
-        await updateState(_trigger)
-      }
-    }
-    getData()
-    return () => {
-      subscribed = false
-    }
-  }, [])
-
-  return (
-    <div className="accordion-update-result">
-      <div className="accordion-update">
-        <div
-          className={
-            status === 'errored'
-              ? 'accordion-caption-red text-16-normal'
-              : 'accordion-caption text-16-normal'
-          }
-        >
-          {t('KONNECTORCONFIG.LABEL_UPDATEDAT')}
-        </div>
-        <div>{lastExecutionDate}</div>
-      </div>
-      <div className="inline-buttons">
-        <StyledButton
-          className="konnector-delete"
-          type="button"
-          color="secondary"
-          onClick={deleteAccount}
-          disabled={updating}
-        >
-          {t('KONNECTORCONFIG.BTN_DELETE')}
-        </StyledButton>
-        <StyledButton
-          className="konnector-update"
-          type="button"
-          color="primary"
-          onClick={updateKonnector}
-          disabled={updating}
-        >
-          {updating ? (
-            <StyledBlackSpinner size="2em" />
-          ) : (
-            <div>{t('KONNECTORCONFIG.BTN_UPDATE')}</div>
-          )}
-        </StyledButton>
-      </div>
-    </div>
-  )
-}
-
-export default translate()(withClient(KonnectorResult))
diff --git a/src/components/ContentComponents/KonnectorViewer/KonnectorViewerList.tsx b/src/components/ContentComponents/KonnectorViewer/KonnectorViewerList.tsx
deleted file mode 100644
index d6b486250c6bb554542fefabb2ae47f4cc339a03..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/KonnectorViewer/KonnectorViewerList.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-import React, { useContext } from 'react'
-import KonnectorViewer from 'components/ContentComponents/KonnectorViewer/KonnectorViewer'
-import IFluidConfig from 'services/IFluidConfig'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-
-export interface KonnectorViewerListProps {
-  isParam: boolean
-  fluidConfigs: IFluidConfig[]
-}
-
-const KonnectorViewerList: React.FC<KonnectorViewerListProps> = ({
-  isParam = false,
-  fluidConfigs,
-}: KonnectorViewerListProps) => {
-  const { fluidTypes } = useContext(AppContext)
-  return (
-    <div>
-      {fluidConfigs.map((item: IFluidConfig, index: number) => {
-        return fluidTypes.includes(item.fluidTypeId) ? (
-          <KonnectorViewer isParam={isParam} key={index} fluidConfig={item} />
-        ) : null
-      })}
-      {fluidConfigs.map((item: IFluidConfig, index: number) => {
-        return fluidTypes.includes(item.fluidTypeId) ? null : (
-          <KonnectorViewer isParam={isParam} key={index} fluidConfig={item} />
-        )
-      })}
-    </div>
-  )
-}
-
-export default KonnectorViewerList
diff --git a/src/components/ContentComponents/Navbar/Navbar.tsx b/src/components/ContentComponents/Navbar/Navbar.tsx
deleted file mode 100644
index d4fc5e1f71849db51a41528f28859624ba317868..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Navbar/Navbar.tsx
+++ /dev/null
@@ -1,71 +0,0 @@
-import React, { useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { translate } from 'cozy-ui/react/I18n'
-import { NavLink } from 'react-router-dom'
-import Icon from 'cozy-ui/react/Icon'
-
-import ConsoIconOff from 'assets/icons/tabbar/conso/off.svg'
-import ChallengeIconOn from 'assets/icons/tabbar/defi/on.svg'
-import ChallengeIconOff from 'assets/icons/tabbar/defi/off.svg'
-import ChallengeIconOffNotif from 'assets/icons/tabbar/defi/off-notif.svg'
-import ParameterIconOff from 'assets/icons/tabbar/parametre/off.svg'
-import ConsoIconOn from 'assets/icons/tabbar/conso/on.svg'
-import ParameterIconOn from 'assets/icons/tabbar/parametre/on.svg'
-import logoGrandLyon from 'assets/icons/tabbar/grand-lyon.svg'
-
-interface NavbarProps {
-  t: Function
-}
-
-export const Navbar = ({ t }: NavbarProps) => {
-  const { challengeNotification } = useContext(AppContext)
-  return (
-    <aside className="o-sidebar">
-      <nav>
-        <ul className="c-nav">
-          <li className="c-nav-item">
-            <NavLink
-              to="/consumption"
-              className="c-nav-link"
-              activeClassName="is-active"
-            >
-              <Icon className="c-nav-icon off" icon={ConsoIconOff} />
-              <Icon className="c-nav-icon on" icon={ConsoIconOn} />
-              {t('Nav.consumption')}
-            </NavLink>
-          </li>
-          <li className="c-nav-item">
-            <NavLink
-              to="/challenges"
-              className="c-nav-link"
-              activeClassName="is-active"
-            >
-              {challengeNotification && (
-                <div className="nb-challenge-notif">1</div>
-              )}
-              <Icon className="c-nav-icon off" icon={ChallengeIconOff} />
-              <Icon className="c-nav-icon on" icon={ChallengeIconOn} />
-              {t('Nav.challenges')}
-            </NavLink>
-          </li>
-
-          <li className="c-nav-item">
-            <NavLink
-              to="/parameters"
-              className="c-nav-link"
-              activeClassName="is-active"
-            >
-              <Icon className="c-nav-icon off" icon={ParameterIconOff} />
-              <Icon className="c-nav-icon on" icon={ParameterIconOn} />
-              {t('Nav.parameters')}
-            </NavLink>
-          </li>
-        </ul>
-      </nav>
-      <Icon className="logo-grand-lyon" icon={logoGrandLyon} size={100} />
-    </aside>
-  )
-}
-
-// translate() provide t() to use translations (ex: locales/en.json)
-export default translate()(Navbar)
diff --git a/src/components/ContentComponents/PerformanceIndicator/PerformanceIndicator.tsx b/src/components/ContentComponents/PerformanceIndicator/PerformanceIndicator.tsx
deleted file mode 100644
index ad9d2320bab985a46251cbf047ca0d70551a3c58..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/PerformanceIndicator/PerformanceIndicator.tsx
+++ /dev/null
@@ -1,137 +0,0 @@
-import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-
-import StyledBorderCard from 'components/CommonKit/Card/StyledBorderCard'
-import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-
-import GreenIndicatorIcon from 'assets/icons/visu/indicator/green.svg'
-import RedIndicatorIcon from 'assets/icons/visu/indicator/red.svg'
-import GreyIndicatorIcon from 'assets/icons/visu/indicator/grey.svg'
-import ErrorIndicatorIcon from 'assets/icons/visu/indicator/error.svg'
-import NodataIndicatorIcon from 'assets/icons/visu/indicator/nodata.svg'
-import {
-  IPerformanceIndicator,
-  TimeStep,
-} from 'services/dataConsumptionContracts'
-import { formatNumberValues } from 'utils/utils'
-
-interface PerformanceIndicatorProps {
-  t: Function
-  performanceIndicator: IPerformanceIndicator
-  timePeriodText: string
-  timeStep: TimeStep
-}
-
-const PerformanceIndicator: React.FC<PerformanceIndicatorProps> = ({
-  t,
-  performanceIndicator,
-  timePeriodText,
-  timeStep,
-}: PerformanceIndicatorProps) => {
-  let displayedValue: string
-  if (performanceIndicator && performanceIndicator.value)
-    displayedValue = formatNumberValues(performanceIndicator.value).toString()
-  else displayedValue = '-----'
-
-  let errorInPerf = false
-  if (performanceIndicator && !performanceIndicator.value) {
-    errorInPerf = true
-  }
-
-  let perf: number | null = null
-  if (
-    performanceIndicator &&
-    performanceIndicator.value &&
-    performanceIndicator.compareValue
-  ) {
-    perf =
-      100 * (performanceIndicator.value / performanceIndicator.compareValue - 1)
-  }
-  const perfString = perf ? formatNumberValues(perf) : ''
-
-  let perfStatus = ['error', ErrorIndicatorIcon]
-  if (perf === null && !errorInPerf)
-    perfStatus = ['nodata', NodataIndicatorIcon]
-  else if (perf === null && errorInPerf)
-    perfStatus = ['error', ErrorIndicatorIcon]
-  else if (perf && perf === 0) perfStatus = ['zero', GreyIndicatorIcon]
-  else if (perf && perf > 0) perfStatus = ['positive', RedIndicatorIcon]
-  else if (perf && perf < 0) perfStatus = ['negative', GreenIndicatorIcon]
-
-  const getRelevantFrequencyLabel = (timeStep: TimeStep) => {
-    let frequency = 'COMMON.'
-    switch (timeStep) {
-      case TimeStep.HALF_AN_HOUR:
-        frequency += 'DAILY_FRENQUENCY'
-        break
-
-      case TimeStep.HOUR:
-        frequency += 'DAILY_FRENQUENCY'
-        break
-
-      case TimeStep.DAY:
-        frequency += 'WEEKLY_FRENQUENCY'
-        break
-
-      case TimeStep.MONTH:
-        frequency += 'MONTHLY_FRENQUENCY'
-        break
-
-      case TimeStep.YEAR:
-        frequency += 'YEARLY_FRENQUENCY'
-        break
-
-      default:
-        return ''
-    }
-
-    return frequency
-  }
-
-  return (
-    <StyledBorderCard>
-      <div className="fpi">
-        <div className="fpi-left">
-          <div className="fpi-title card-title-on">
-            {t('COMMON.PERF_INDICATOR_LABEL')}{' '}
-            {t(getRelevantFrequencyLabel(timeStep))}
-          </div>
-          <div className="fpi-content">
-            <StyledIcon
-              className="fpi-content-icon"
-              icon={perfStatus[1]}
-              size={50}
-            />
-            <div className="fpi-content-perf">
-              <div className="fpi-content-perf-result card-result">
-                <span>{displayedValue}</span>
-                <span className="card-indicator">€</span>
-              </div>
-              {perfStatus[0] === 'positive' ||
-              perfStatus[0] === 'negative' ||
-              perfStatus[0] === 'zero' ? (
-                <div className="fpi-content-perf-indicator card-text">
-                  <span
-                    className={`fpi-content-perf-indicator-kpi ${perfStatus[0]} card-text-bold`}
-                  >
-                    {perfStatus[0] === 'positive' ? '+' : ''}
-                    {perfString}%
-                  </span>
-                  <span> / {timePeriodText}</span>
-                </div>
-              ) : (
-                <div className="fpi-content-perf-indicator card-text">
-                  <div> {t('INDICATOR.ERROR_NO_COMPARE')} </div>
-                  <div> {t('INDICATOR.ERROR_NO_COMPARE_REASON')} </div>
-                </div>
-              )}
-            </div>
-          </div>
-        </div>
-        <div className="fpi-right"></div>
-      </div>
-    </StyledBorderCard>
-  )
-}
-
-export default translate()(PerformanceIndicator)
diff --git a/src/components/ContentComponents/PeriodFilter/PeriodFilter.jsx b/src/components/ContentComponents/PeriodFilter/PeriodFilter.jsx
deleted file mode 100644
index 22fd7a55f979e5bcbf49760bbb3eff24ba3e5cd0..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/PeriodFilter/PeriodFilter.jsx
+++ /dev/null
@@ -1,13 +0,0 @@
-import React from 'react'
-import Graph from '../Graph/Graph'
-
-const PeriodFilter = () => {
-  return (
-    <React.Fragment>
-      <span>Title</span>
-      <Graph></Graph>
-    </React.Fragment>
-  )
-}
-
-export default PeriodFilter
diff --git a/src/components/ContentComponents/Test/Test.tsx b/src/components/ContentComponents/Test/Test.tsx
deleted file mode 100644
index 4a71a00751f9bed57194d087db512f5ee5a52ae9..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Test/Test.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import React, { useState, useEffect } from 'react'
-import { withClient, Client } from 'cozy-client'
-
-interface TestProps {
-  client: Client
-}
-
-const Test: React.FC<TestProps> = ({ client }: TestProps) => {
-  const [challenges, setChallenges] = useState(null)
-  const [userChallenge, setUserChallenge] = useState(null)
-
-  useEffect(() => {
-    let subscribed = true
-    async function loadData() {
-      const data = await client.query(
-        client
-          .find('com.grandlyon.ecolyo.challengetype')
-          .where({ level: { $lte: 0 } })
-          .include(['availableEcogestures'])
-          .limitBy(20)
-      )
-      console.log(data)
-      if (subscribed && data) {
-        setChallenges(data)
-      }
-    }
-    async function loadUserChallenge() {
-      const data = await client.query(
-        client
-          .find('com.grandlyon.ecolyo.userchallenge')
-          .where({ state: { $eq: 0 } })
-          .include(['selectedEcogestures', 'challengeType'])
-          .limitBy(1)
-      )
-      console.log(data)
-      if (subscribed && data) {
-        setUserChallenge(data)
-      }
-    }
-    loadData()
-    loadUserChallenge()
-    return () => {
-      subscribed = false
-    }
-  }, [])
-
-  return (
-    <div>
-      <div className="card-text">
-        Defi disponible:
-        {challenges &&
-          challenges.data.map((challenge, index) => {
-            return <ul key={index}>{challenge.title}</ul>
-          })}
-      </div>
-      <div className="card-text">
-        Ecogeste dispo pour le challenge:
-        {challenges &&
-          challenges.included.map((ecogesture, index) => {
-            return <ul key={index}>{ecogesture.shortName}</ul>
-          })}
-      </div>
-      <div className="card-text">
-        challenge en cours:
-        {userChallenge &&
-          userChallenge.data.map((item, index) => {
-            return <ul key={index}>{item.state}</ul>
-          })}
-      </div>
-      <div className="card-text">
-        challenge en cours - challenge type:
-        {userChallenge &&
-          userChallenge.included.map((item, index) => {
-            if (item._type === 'com.grandlyon.ecolyo.challengetype') {
-              return <ul key={index}>Challenge Type : {item.title}</ul>
-            } else if (item._type === 'com.grandlyon.ecolyo.ecogesture') {
-              return <ul key={index}>Ecogeste : {item.shortName}</ul>
-            }
-          })}
-      </div>
-    </div>
-  )
-}
-
-export default withClient(Test)
diff --git a/src/components/ContentComponents/Version/Version.tsx b/src/components/ContentComponents/Version/Version.tsx
deleted file mode 100644
index 90db1233f885eb09c7622b756569ff0b0432ddd6..0000000000000000000000000000000000000000
--- a/src/components/ContentComponents/Version/Version.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react'
-import { withClient, Client } from 'cozy-client'
-
-interface VersionProps {
-  client: Client
-}
-
-const Version: React.FC<VersionProps> = ({ client }: VersionProps) => (
-  <div className="version-root text-14-normal">{`v ${client.appMetadata.version}`}</div>
-)
-
-export default withClient(Version)
diff --git a/src/components/Contexts/AppContextProvider.tsx b/src/components/Contexts/AppContextProvider.tsx
deleted file mode 100644
index 1cf2982fb3bee221305107e38e6fde79cfa62e40..0000000000000000000000000000000000000000
--- a/src/components/Contexts/AppContextProvider.tsx
+++ /dev/null
@@ -1,359 +0,0 @@
-import React, { useState, useEffect } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { FluidType } from 'enum/fluid.enum'
-import { ScreenType } from 'enum/screen.enum'
-
-import InitDataManager from 'services/initDataManagerService'
-import UserProfileDataManager from 'services/userProfileDataManagerService'
-import { UserChallenge, UserProfile } from 'services/dataChallengeContracts'
-import { TimeStep } from 'services/dataConsumptionContracts'
-
-interface AppContextProps {
-  isIndexesLoading: boolean
-  isIndexesLoadingSuccess: boolean | null
-  isDataLoading: boolean
-  isDataLoadingSuccess: boolean | null
-  isFluidTypesLoading: boolean
-  isFluidTypesLoadingSuccess: boolean | null
-  fluidTypes: FluidType[]
-  refreshFluidTypes: Function
-  isCurrentChallengeUpdateLoading: boolean
-  isCurrentChallengeUpdateLoadingSuccess: boolean | null
-  currentChallenge: UserChallenge | null
-  challengeNotification: boolean
-  refreshCurrentChallenge: Function
-  isContextLoaded: boolean
-  isError: boolean
-  screenType: ScreenType
-  previousTimeStep: TimeStep
-  setPreviousTimeStep: Function
-  userProfile: UserProfile | null
-  setWelcomeModalViewed: Function
-  chartIsLoaded: boolean
-  setChartIsLoaded: Function
-  feedbackIsOpened: boolean
-  setFeedbackOpened: Function
-  disableBackgroundScroll: Function
-}
-
-export const AppContext = React.createContext<AppContextProps>({
-  isIndexesLoading: false,
-  isIndexesLoadingSuccess: null,
-  isDataLoading: false,
-  isDataLoadingSuccess: null,
-  isFluidTypesLoading: false,
-  isFluidTypesLoadingSuccess: null,
-  fluidTypes: [],
-  refreshFluidTypes: () => null,
-  isCurrentChallengeUpdateLoading: false,
-  isCurrentChallengeUpdateLoadingSuccess: null,
-  currentChallenge: null,
-  challengeNotification: false,
-  refreshCurrentChallenge: () => Promise,
-  isContextLoaded: false,
-  isError: false,
-  screenType: ScreenType.MOBILE,
-  previousTimeStep: TimeStep.DAY,
-  userProfile: null,
-  setPreviousTimeStep: () => null,
-  setWelcomeModalViewed: () => null,
-  chartIsLoaded: false,
-  setChartIsLoaded: () => null,
-  feedbackIsOpened: false,
-  setFeedbackOpened: () => null,
-  disableBackgroundScroll: () => null,
-})
-
-interface AppContextProviderProps {
-  children: React.ReactNode
-  client: Client
-}
-
-const AppContextProvider: React.FC<AppContextProviderProps> = ({
-  children,
-  client,
-}: AppContextProviderProps) => {
-  const [chartIsLoaded, setChartIsLoaded] = useState<boolean>(false)
-  const [feedbackIsOpened, setFeedbackOpened] = useState<boolean>(false)
-  const [isIndexesLoading, setIndexesLoading] = useState<boolean>(false)
-  const [isIndexesLoadingSuccess, setIndexesLoadingSuccess] = useState<
-    boolean | null
-  >(null)
-  const [isDataLoading, setDataLoading] = useState<boolean>(false)
-  const [isDataLoadingSuccess, setDataLoadingSuccess] = useState<
-    boolean | null
-  >(null)
-
-  const [isFluidTypesLoading, setFluidTypesLoading] = useState<boolean>(false)
-  const [isFluidTypesLoadingSuccess, setFluidTypesLoadingSuccess] = useState<
-    boolean | null
-  >(null)
-
-  const [fluidTypes, setFluidTypes] = useState<FluidType[]>([])
-
-  const [
-    isCurrentChallengeUpdateLoading,
-    setCurrentChallengeUpdateLoading,
-  ] = useState<boolean>(false)
-  const [
-    isCurrentChallengeUpdateLoadingSuccess,
-    setCurrentChallengeUpdateLoadingSuccess,
-  ] = useState<boolean | null>(null)
-  const [
-    currentChallenge,
-    setCurrentChallenge,
-  ] = useState<UserChallenge | null>(null)
-  const [challengeNotification, setChallengeNotification] = useState<boolean>(
-    false
-  )
-  const [isContextLoaded, setContextLoaded] = useState<boolean>(false)
-  const [isError, setError] = useState<boolean>(false)
-  const [screenType, setScreenType] = useState<ScreenType>(ScreenType.MOBILE)
-  const [previousTimeStep, setPreviousTimeStep] = useState<TimeStep>(
-    TimeStep.DAY
-  )
-
-  const [isUserProfileLoadingSuccess, setUserProfileLoadingSuccess] = useState<
-    boolean | null
-  >(null)
-  const [userProfile, setUserProfile] = useState<UserProfile | null>(null)
-
-  const defineScreenType = () => {
-    if (innerWidth <= 768) {
-      setScreenType(ScreenType.MOBILE)
-    } else if (innerWidth <= 1024) {
-      setScreenType(ScreenType.TABLET)
-    } else {
-      setScreenType(ScreenType.DESKTOP)
-    }
-  }
-
-  const refreshFluidTypes = async () => {
-    const im = new InitDataManager(client)
-    const resultFluidTypes = await im.checkFluidTypes()
-    if (resultFluidTypes) {
-      setFluidTypes(resultFluidTypes)
-      const resultAchievement = await im.checkAchievement('CHA00000001')
-      if (resultAchievement) {
-        const resultNotificationChallenge = await im.isCurrentChallengeOver(
-          resultAchievement,
-          resultFluidTypes
-        )
-        if (resultNotificationChallenge) {
-          setChallengeNotification(resultNotificationChallenge)
-        }
-      }
-    }
-  }
-
-  const setWelcomeModalViewed = async () => {
-    const upm = new UserProfileDataManager(client)
-    const updatedUserProfile = await upm.updateUserProfile({
-      haveSeenWelcomeModal: true,
-    })
-    if (updatedUserProfile) {
-      setUserProfile(updatedUserProfile)
-    }
-  }
-
-  const refreshCurrentChallenge = async (): Promise<boolean> => {
-    const im = new InitDataManager(client)
-    try {
-      const resultUpdateChallenge = await im.checkCurrentChallenge()
-      setCurrentChallenge(resultUpdateChallenge)
-
-      if (resultUpdateChallenge) {
-        const resultNotificationChallenge = await im.isCurrentChallengeOver(
-          resultUpdateChallenge,
-          resultUpdateChallenge.fluidTypes
-        )
-        if (resultNotificationChallenge) {
-          setChallengeNotification(resultNotificationChallenge)
-        }
-      } else {
-        setChallengeNotification(false)
-      }
-      return true
-    } catch {
-      setCurrentChallenge(null)
-      setChallengeNotification(false)
-      return false
-    }
-  }
-
-  const disableBackgroundScroll = (disable: boolean) => {
-    const backgroundDesktop = document.querySelector(
-      '.app-content'
-    ) as HTMLElement
-    const backgroundMobile = document.querySelector('html') as HTMLElement
-    const bgStyleDesktop = backgroundDesktop && backgroundDesktop.style
-    const bgStyleMobile = backgroundMobile && backgroundMobile.style
-    if (disable) {
-      bgStyleDesktop.overflowY = 'hidden'
-      bgStyleMobile.overflowY = 'hidden'
-    } else {
-      bgStyleDesktop.overflowY = 'unset'
-      bgStyleMobile.overflowY = 'unset'
-    }
-  }
-
-  useEffect(() => {
-    let subscribed = true
-    function handleResize() {
-      defineScreenType()
-    }
-    handleResize()
-    window.addEventListener('resize', handleResize)
-    const im = new InitDataManager(client)
-    const updm = new UserProfileDataManager(client)
-    async function loadData() {
-      // Create missing indexes
-      setIndexesLoading(true)
-      const resultIndexConsoData = await im.initIndex()
-      if (subscribed && !resultIndexConsoData) {
-        setIndexesLoadingSuccess(false)
-        setError(true)
-      }
-      if (subscribed && resultIndexConsoData) {
-        console.log(
-          '%c Context: Indexes created',
-          'background: #222; color: white'
-        )
-        setIndexesLoadingSuccess(true)
-      }
-      setIndexesLoading(false)
-
-      // Load challenges, ecogestures and user profile data
-      setDataLoading(true)
-      const resultInitData = await im.initData()
-      if (subscribed && !resultInitData) {
-        setDataLoadingSuccess(false)
-        setError(true)
-      }
-      if (subscribed && resultInitData) {
-        setDataLoadingSuccess(true)
-      }
-      setDataLoading(false)
-
-      // Load configured fluidTypes
-      setFluidTypesLoading(true)
-      const resultFluidTypes = await im.checkFluidTypes()
-      if (subscribed && resultFluidTypes) {
-        console.log(
-          '%c Context: Konnectors loaded ',
-          'background: #222; color: white'
-        )
-        setFluidTypes(resultFluidTypes)
-        setFluidTypesLoadingSuccess(true)
-      }
-      setFluidTypesLoading(false)
-
-      // Update current challenge if exists
-      setCurrentChallengeUpdateLoading(true)
-      try {
-        const resultUpdateChallenge = await im.checkCurrentChallenge()
-        if (subscribed && resultUpdateChallenge) {
-          const resultNotificationChallenge = await im.isCurrentChallengeOver(
-            resultUpdateChallenge,
-            resultUpdateChallenge.fluidTypes
-              ? resultUpdateChallenge.fluidTypes
-              : []
-          )
-          if (subscribed && resultNotificationChallenge) {
-            setChallengeNotification(resultNotificationChallenge)
-          }
-        }
-        if (subscribed) {
-          console.log(
-            '%c Context: Current Challenge checked',
-            'background: #222; color: white'
-          )
-          setCurrentChallenge(resultUpdateChallenge)
-          setCurrentChallengeUpdateLoadingSuccess(true)
-        }
-      } catch {
-        setCurrentChallengeUpdateLoadingSuccess(false)
-        setError(true)
-      } finally {
-        setCurrentChallengeUpdateLoading(false)
-      }
-
-      //Retrieve the UserProfile
-      const loadedUserProfile = await updm.getUserProfile()
-      if (!loadedUserProfile) {
-        setError(true)
-      }
-      if (subscribed && loadedUserProfile) {
-        console.log(
-          '%c Context: UserProfile Loaded',
-          'background: #222; color: white'
-        )
-        setUserProfile(loadedUserProfile)
-        setUserProfileLoadingSuccess(true)
-      }
-    }
-    loadData()
-    return () => {
-      subscribed = false
-      window.removeEventListener('resize', handleResize)
-    }
-  }, [])
-
-  useEffect(() => {
-    if (
-      isIndexesLoadingSuccess &&
-      isDataLoadingSuccess &&
-      isFluidTypesLoadingSuccess &&
-      isCurrentChallengeUpdateLoadingSuccess &&
-      isUserProfileLoadingSuccess &&
-      !isError
-    ) {
-      setTimeout(function() {
-        setContextLoaded(true)
-      }, 1000)
-    }
-  }, [
-    isIndexesLoadingSuccess,
-    isDataLoadingSuccess,
-    isFluidTypesLoadingSuccess,
-    isCurrentChallengeUpdateLoadingSuccess,
-    isUserProfileLoadingSuccess,
-    isError,
-  ])
-
-  return (
-    <AppContext.Provider
-      value={{
-        isIndexesLoading,
-        isIndexesLoadingSuccess,
-        isDataLoading,
-        isDataLoadingSuccess,
-        isFluidTypesLoading,
-        isFluidTypesLoadingSuccess,
-        fluidTypes,
-        refreshFluidTypes,
-        isCurrentChallengeUpdateLoading,
-        isCurrentChallengeUpdateLoadingSuccess,
-        currentChallenge,
-        challengeNotification,
-        refreshCurrentChallenge,
-        isContextLoaded,
-        isError,
-        screenType,
-        userProfile,
-        previousTimeStep,
-        setPreviousTimeStep,
-        setWelcomeModalViewed,
-        setChartIsLoaded,
-        chartIsLoaded,
-        feedbackIsOpened,
-        setFeedbackOpened,
-        disableBackgroundScroll,
-      }}
-    >
-      {children}
-    </AppContext.Provider>
-  )
-}
-
-export default withClient(AppContextProvider)
diff --git a/src/components/ContentComponents/EcogestureCard/EcogestureCard.tsx b/src/components/Ecogesture/EcogestureCard.tsx
similarity index 66%
rename from src/components/ContentComponents/EcogestureCard/EcogestureCard.tsx
rename to src/components/Ecogesture/EcogestureCard.tsx
index f6ff64f40476cd6925470b88c75cb7c2893b39b4..9751661b006823bad4077d467b66b3210df70f41 100644
--- a/src/components/ContentComponents/EcogestureCard/EcogestureCard.tsx
+++ b/src/components/Ecogesture/EcogestureCard.tsx
@@ -1,28 +1,31 @@
 import React, { useState, useEffect } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { EcogestureType } from 'services/dataChallengeContracts'
+import { useRecoilValue } from 'recoil'
+
+import { Ecogesture } from 'models'
+import { userProfileState } from 'atoms/userProfile.state'
+
 import StyledEcogestureCard from 'components/CommonKit/Card/StyledEcogestureCard'
-import Icon from 'cozy-ui/react/Icon'
 import def from 'assets/icons/visu/ecogesture/default.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 
 interface EcogestureCardProps {
-  ecogesture: EcogestureType
-  handleClick?: (ecogesture: EcogestureType) => void
-  t: Function
+  ecogesture: Ecogesture
+  handleClick?: (ecogesture: Ecogesture) => void
   challengeEcogesture?: number
 }
 
 const EcogestureCard: React.FC<EcogestureCardProps> = ({
   ecogesture,
   handleClick,
-  t,
   challengeEcogesture,
 }: EcogestureCardProps) => {
   const handleCardclick = () => {
-    handleClick && ecogesture ? handleClick(ecogesture) : null
+    handleClick && ecogesture && handleClick(ecogesture)
   }
   const [ecogestureIcon, setEcogestureIcon] = useState(def)
-
+  const userProfile = useRecoilValue(userProfileState)
+  const newEcogestures: string[] | null =
+    userProfile && userProfile.notificationEcogesture
   async function importEcogestureIcon(id: string) {
     // Les svg doivent être au format id.svg
     let importedEcogesture
@@ -46,11 +49,21 @@ const EcogestureCard: React.FC<EcogestureCardProps> = ({
     <>
       {challengeEcogesture ? (
         <div className={`cp-eg-${challengeEcogesture}`}>
-          <StyledEcogestureCard border={true} onClick={handleCardclick}>
+          <StyledEcogestureCard
+            border={true}
+            onClick={handleCardclick}
+            newEcogesture={
+              newEcogestures && newEcogestures.includes(ecogesture.id)
+            }
+          >
             <div className="ec">
               <div className="ec-content ec-content-challenge">
                 <div>
-                  <Icon className="Icon" icon={ecogestureIcon} size={64} />
+                  <StyledIcon
+                    className="Icon"
+                    icon={ecogestureIcon}
+                    size={64}
+                  />
                 </div>
                 <div className="ec-content-challenge-text">
                   {ecogesture.shortName}
@@ -63,6 +76,9 @@ const EcogestureCard: React.FC<EcogestureCardProps> = ({
         <StyledEcogestureCard
           unlocked={ecogesture.unlocked ? ecogesture.unlocked : false}
           onClick={handleCardclick}
+          newEcogesture={
+            newEcogestures && newEcogestures.includes(ecogesture.id)
+          }
         >
           <div className="ec">
             <div
@@ -72,7 +88,11 @@ const EcogestureCard: React.FC<EcogestureCardProps> = ({
             >
               <div className="ec-content-icon">
                 {ecogesture.unlocked && (
-                  <Icon className="Icon" icon={ecogestureIcon} size={50} />
+                  <StyledIcon
+                    className="Icon"
+                    icon={ecogestureIcon}
+                    size={50}
+                  />
                 )}
               </div>
               <div className="ec-content-short-name text-16-bold">
@@ -90,4 +110,4 @@ const EcogestureCard: React.FC<EcogestureCardProps> = ({
   )
 }
 
-export default translate()(EcogestureCard)
+export default EcogestureCard
diff --git a/src/components/ContentComponents/EcogestureList/EcogestureList.tsx b/src/components/Ecogesture/EcogestureList.tsx
similarity index 61%
rename from src/components/ContentComponents/EcogestureList/EcogestureList.tsx
rename to src/components/Ecogesture/EcogestureList.tsx
index 83a6da948c41873f4cd55275c625dd32936e7ee4..e1defba0441a13ee2d6658320b425d4d1f55fc59 100644
--- a/src/components/ContentComponents/EcogestureList/EcogestureList.tsx
+++ b/src/components/Ecogesture/EcogestureList.tsx
@@ -1,33 +1,29 @@
 import React, { useState, useEffect } from 'react'
-import { withClient, Client } from 'cozy-client'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+
+import { Ecogesture } from 'models'
+import ChallengeService from 'services/challenge.service'
+
 import StyledChallengeSpinner from 'components/CommonKit/Spinner/StyledChallengeSpinner'
-import EcogestureCard from '../EcogestureCard/EcogestureCard'
-import EcogestureModal from '../EcogestureModal/EcogestureModal'
-import NegaWattModal from '../NegaWattModal/NegaWattModal'
-import { EcogestureType } from 'services/dataChallengeContracts'
-import ChallengeManager from 'services/challengeDataManagerService'
 import StyledClearGreyButton from 'components/CommonKit/Button/StyledClearGreyButton'
-import { translate } from 'cozy-ui/react/I18n'
-
-interface EcogesturesListProps {
-  t: Function
-  client: Client
-}
+import EcogestureCard from 'components/Ecogesture/EcogestureCard'
+import EcogestureModal from 'components/Ecogesture/EcogestureModal'
+import NegaWattModal from 'components/Ecogesture/NegaWattModal'
 
-const EcogesturesList: React.FC<EcogesturesListProps> = ({
-  t,
-  client,
-}: EcogesturesListProps) => {
+const EcogesturesList: React.FC = () => {
+  const { t } = useI18n()
+  const client = useClient()
   const [
     selectedEcogesture,
     setSelectedEcogesture,
-  ] = useState<EcogestureType | null>(null)
-  const [ecogestures, setEcogestures] = useState<EcogestureType[] | null>(null)
+  ] = useState<Ecogesture | null>(null)
+  const [ecogestures, setEcogestures] = useState<Ecogesture[] | null>(null)
   const [openEcogestureModal, setOpenEcogestureModal] = useState(false)
   const [openNegaWattModal, setOpenNegaWattModal] = useState(false)
-  const _challengeManager = new ChallengeManager(client)
+  const _challengeService = new ChallengeService(client)
 
-  const handleClick = (ecogesture: EcogestureType) => {
+  const handleClick = (ecogesture: Ecogesture) => {
     setSelectedEcogesture(ecogesture)
     setOpenEcogestureModal(true)
   }
@@ -47,16 +43,14 @@ const EcogesturesList: React.FC<EcogesturesListProps> = ({
   useEffect(() => {
     let subscribed = true
     async function loadEcogestures() {
-      const dataAll = await _challengeManager.getAllEcogestures()
-      const dataUnlocked = await _challengeManager.getUnlockedEcogestures()
+      const dataAll = await _challengeService.getAllEcogestures()
+      const dataUnlocked = await _challengeService.getUnlockedEcogestures()
       if (subscribed && dataAll) {
         if (dataUnlocked) {
           dataAll.forEach(element => {
-            dataUnlocked.forEach(el => {
-              if (el === element.id) {
-                element.unlocked = true
-              }
-            })
+            if (dataUnlocked.includes(element.id)) {
+              element.unlocked = true
+            }
           })
         }
         setEcogestures(dataAll)
@@ -76,6 +70,10 @@ const EcogesturesList: React.FC<EcogesturesListProps> = ({
         </div>
       ) : (
         <>
+          <NegaWattModal
+            open={openNegaWattModal}
+            handleCloseClick={handleNegaWattCloseClick}
+          />
           <div className="negawatt-button-content">
             <StyledClearGreyButton
               color="secondary"
@@ -84,10 +82,6 @@ const EcogesturesList: React.FC<EcogesturesListProps> = ({
             >
               {t('NEGAWATT.QUESTION')}
             </StyledClearGreyButton>
-            <NegaWattModal
-              opened={openNegaWattModal}
-              handleCloseClick={handleNegaWattCloseClick}
-            />
           </div>
           <div className="ecogesture-content">
             {ecogestures.map((ecogesture, index) => (
@@ -103,7 +97,7 @@ const EcogesturesList: React.FC<EcogesturesListProps> = ({
       )}
       {openEcogestureModal && (
         <EcogestureModal
-          opened={openEcogestureModal}
+          open={openEcogestureModal}
           ecogesture={selectedEcogesture}
           handleCloseClick={handleCloseClick}
         />
@@ -112,4 +106,4 @@ const EcogesturesList: React.FC<EcogesturesListProps> = ({
   )
 }
 
-export default translate()(withClient(EcogesturesList))
+export default EcogesturesList
diff --git a/src/components/ContentComponents/EcogestureModal/EcogestureModal.tsx b/src/components/Ecogesture/EcogestureModal.tsx
similarity index 61%
rename from src/components/ContentComponents/EcogestureModal/EcogestureModal.tsx
rename to src/components/Ecogesture/EcogestureModal.tsx
index 4d9d01fc788c4db55a6fa042102d686926dd0d4e..7831971c8d975633f44d80df3b8fdf870732695e 100644
--- a/src/components/ContentComponents/EcogestureModal/EcogestureModal.tsx
+++ b/src/components/Ecogesture/EcogestureModal.tsx
@@ -1,29 +1,34 @@
-import React, { useState, useEffect } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import React, { useState, useEffect, useCallback } from 'react'
+import { useClient } from 'cozy-client'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useRecoilState } from 'recoil'
+import { getPicto } from 'utils/picto'
+
+import { Ecogesture } from 'models'
+import { userProfileState } from 'atoms/userProfile.state'
+
 import Modal from 'components/CommonKit/Modal/Modal'
-import { getPicto } from 'utils/utils'
-import { EcogestureType } from 'services/dataChallengeContracts'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
-import Icon from 'cozy-ui/react/Icon'
 import def from 'assets/icons/visu/ecogesture/default.svg'
+import UserProfileService from 'services/userProfile.service'
 
 interface EcogestureModalProps {
-  opened: boolean
-  ecogesture: EcogestureType
+  open: boolean
+  ecogesture: Ecogesture
   unlockedEcogesture: boolean
-  t: Function
   handleCloseClick: () => void
-  handleStartClick: () => void
 }
 
 const EcogestureModal: React.FC<EcogestureModalProps> = ({
-  opened,
+  open,
   ecogesture,
   unlockedEcogesture,
-  t,
   handleCloseClick,
 }: EcogestureModalProps) => {
+  const { t } = useI18n()
   const [ecogestureIcon, setEcogestureIcon] = useState(def)
+  const [userProfile, setUserProfile] = useRecoilState(userProfileState)
+  const client = useClient()
 
   async function importEcogestureIcon(id: string) {
     // Les svg doivent être au format id.svg
@@ -38,6 +43,32 @@ const EcogestureModal: React.FC<EcogestureModalProps> = ({
     }
   }
 
+  const updateUserProfileNotification = useCallback(
+    async (ecogestureList: string[]) => {
+      const userProfileService = new UserProfileService(client)
+      await userProfileService
+        .updateUserProfile({ notificationEcogesture: ecogestureList })
+        .then(updatedUserProfile => {
+          updatedUserProfile && setUserProfile(updatedUserProfile)
+        })
+    },
+    [setUserProfile]
+  )
+
+  useEffect(() => {
+    let index = -1
+    if (userProfile && userProfile.notificationEcogesture != undefined) {
+      index = userProfile.notificationEcogesture.indexOf(ecogesture.id)
+    }
+    if (index > -1) {
+      const updatedNotificationEcogestureList = [
+        ...userProfile.notificationEcogesture,
+      ]
+      updatedNotificationEcogestureList.splice(index, 1)
+      updateUserProfileNotification(updatedNotificationEcogestureList)
+    }
+  }, [])
+
   useEffect(() => {
     if (ecogesture) {
       importEcogestureIcon(ecogesture.id)
@@ -48,7 +79,7 @@ const EcogestureModal: React.FC<EcogestureModalProps> = ({
     <>
       {ecogesture && (
         <Modal
-          open={opened}
+          open={open}
           border={ecogesture.unlocked || unlockedEcogesture}
           handleCloseClick={handleCloseClick}
         >
@@ -60,7 +91,11 @@ const EcogestureModal: React.FC<EcogestureModalProps> = ({
               <div className="em-content-box-img">
                 {(ecogesture.unlocked || unlockedEcogesture) &&
                   ecogestureIcon && (
-                    <Icon className="icon" icon={ecogestureIcon} size={140} />
+                    <StyledIcon
+                      className="icon"
+                      icon={ecogestureIcon}
+                      size={140}
+                    />
                   )}
               </div>
               <div className="em-title text-24-bold ">
@@ -95,4 +130,4 @@ const EcogestureModal: React.FC<EcogestureModalProps> = ({
   )
 }
 
-export default translate()(EcogestureModal)
+export default EcogestureModal
diff --git a/src/components/Ecogesture/EcogestureView.tsx b/src/components/Ecogesture/EcogestureView.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..facbf1de0d82df4eb0600eea54f875198879587a
--- /dev/null
+++ b/src/components/Ecogesture/EcogestureView.tsx
@@ -0,0 +1,26 @@
+import React, { useState } from 'react'
+import EcogesturesList from 'components/Ecogesture/EcogestureList'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+
+const EcogestureView: React.FC = () => {
+  const [headerHeight, setHeaderHeight] = useState<number>(0)
+  const defineHeaderHeight = (height: number) => {
+    setHeaderHeight(height)
+  }
+  return (
+    <>
+      <CozyBar titleKey={'COMMON.APP_ECO_GESTURE_TITLE'} />
+      <Header
+        setHeaderHeight={defineHeaderHeight}
+        desktopTitleKey={'COMMON.APP_ECO_GESTURE_TITLE'}
+      ></Header>
+      <Content height={headerHeight}>
+        <EcogesturesList />
+      </Content>
+    </>
+  )
+}
+
+export default EcogestureView
diff --git a/src/components/ContentComponents/NegaWattModal/NegaWattModal.tsx b/src/components/Ecogesture/NegaWattModal.tsx
similarity index 83%
rename from src/components/ContentComponents/NegaWattModal/NegaWattModal.tsx
rename to src/components/Ecogesture/NegaWattModal.tsx
index 4feb4141d00ec47e1a334546703db1e78b9edc59..2507e141012cc47a5cc2a271d221b5f99363d8d5 100644
--- a/src/components/ContentComponents/NegaWattModal/NegaWattModal.tsx
+++ b/src/components/Ecogesture/NegaWattModal.tsx
@@ -1,22 +1,20 @@
 import React from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import Modal from 'components/CommonKit/Modal/Modal'
 
 interface NegaWattModalProps {
-  opened: boolean
-  t: Function
+  open: boolean
   handleCloseClick: () => void
-  handleStartClick: () => void
 }
 
 const NegaWattModal: React.FC<NegaWattModalProps> = ({
-  opened,
-  t,
+  open,
   handleCloseClick,
 }: NegaWattModalProps) => {
+  const { t } = useI18n()
   return (
     <>
-      <Modal open={opened} handleCloseClick={handleCloseClick}>
+      <Modal open={open} handleCloseClick={handleCloseClick}>
         <div className="em-header text-14-normal-uppercase">
           {t('NEGAWATT.TITLE_NEGAWATT')}
         </div>
@@ -46,4 +44,4 @@ const NegaWattModal: React.FC<NegaWattModalProps> = ({
   )
 }
 
-export default translate()(NegaWattModal)
+export default NegaWattModal
diff --git a/src/components/ContentComponents/FAQ/FAQ.tsx b/src/components/FAQ/FAQContent.tsx
similarity index 97%
rename from src/components/ContentComponents/FAQ/FAQ.tsx
rename to src/components/FAQ/FAQContent.tsx
index 7bd7d5a3fce8d691191fe96951e41441a39054a3..b677f3fbb2ca66abbf5aa17dd8e63a8bf46fa4b4 100644
--- a/src/components/ContentComponents/FAQ/FAQ.tsx
+++ b/src/components/FAQ/FAQContent.tsx
@@ -80,7 +80,7 @@ const formatDetails = (details: Array<string>) => {
   return formatedDetails
 }
 
-const FAQ = () => {
+const FAQContent: React.FC = () => {
   const [expandedPanel, setExpandedPanel] = useState<string | false>(false)
 
   const handleChange = (panel: string) => (
@@ -109,4 +109,4 @@ const FAQ = () => {
   )
 }
 
-export default FAQ
+export default FAQContent
diff --git a/src/components/ContainerComponents/FAQContainer/FAQContainer.tsx b/src/components/FAQ/FAQLink.tsx
similarity index 77%
rename from src/components/ContainerComponents/FAQContainer/FAQContainer.tsx
rename to src/components/FAQ/FAQLink.tsx
index 7b12e44b16e48f43ed89d40800645cdb06ea5aea..0d2853502e38057c3c26f61fa08d3dcc838f00a1 100644
--- a/src/components/ContainerComponents/FAQContainer/FAQContainer.tsx
+++ b/src/components/FAQ/FAQLink.tsx
@@ -1,25 +1,20 @@
 import React from 'react'
 import { NavLink } from 'react-router-dom'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 
 import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import QuestionMarkIcon from 'assets/icons/ico/question-mark.svg'
 
-interface FAQContainerProps {
-  t: Function
-}
-
-const FAQContainer: React.FC<FAQContainerProps> = ({
-  t,
-}: FAQContainerProps) => {
+const FAQLink: React.FC = () => {
+  const { t } = useI18n()
   return (
     <div className="faq-root">
       <div className="faq-content">
         <div className="faq-header text-14-normal-uppercase">
           {t('FAQ.TITLE_FAQ')}
         </div>
-        <NavLink className="faq-card-link" to="parameters/FAQ">
+        <NavLink className="faq-card-link" to="options/FAQ">
           <StyledCard>
             <div className="faq-card">
               <div className="faq-card-content">
@@ -40,4 +35,4 @@ const FAQContainer: React.FC<FAQContainerProps> = ({
   )
 }
 
-export default translate()(FAQContainer)
+export default FAQLink
diff --git a/src/components/ContainerComponents/ViewContainer/FAQViewContainer.tsx b/src/components/FAQ/FAQView.tsx
similarity index 59%
rename from src/components/ContainerComponents/ViewContainer/FAQViewContainer.tsx
rename to src/components/FAQ/FAQView.tsx
index 2ea4bfe135ac14f28fd78809e0094754e85df90d..abc27498cdf3b91a0aa23c7eea12687088a9d0e3 100644
--- a/src/components/ContainerComponents/ViewContainer/FAQViewContainer.tsx
+++ b/src/components/FAQ/FAQView.tsx
@@ -1,10 +1,10 @@
 import React, { useState } from 'react'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import FAQ from 'components/ContentComponents/FAQ/FAQ'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import FAQContent from 'components/FAQ/FAQContent'
 
-const EcoGesturesViewContainer: React.FC = () => {
+const FAQView: React.FC = () => {
   const [headerHeight, setHeaderHeight] = useState<number>(0)
   const defineHeaderHeight = (height: number) => {
     setHeaderHeight(height)
@@ -18,10 +18,10 @@ const EcoGesturesViewContainer: React.FC = () => {
         displayBackArrow={true}
       ></Header>
       <Content height={headerHeight}>
-        <FAQ />
+        <FAQContent />
       </Content>
     </React.Fragment>
   )
 }
 
-export default EcoGesturesViewContainer
+export default FAQView
diff --git a/src/components/ContentComponents/Feedback/FeedbackModal.tsx b/src/components/Feedback/FeedbackModal.tsx
similarity index 95%
rename from src/components/ContentComponents/Feedback/FeedbackModal.tsx
rename to src/components/Feedback/FeedbackModal.tsx
index 191bb7e9cb05896a0b747f716e1f7fc4649c2243..12d5a33fc85740d259152cdb175212db20434ff6 100644
--- a/src/components/ContentComponents/Feedback/FeedbackModal.tsx
+++ b/src/components/Feedback/FeedbackModal.tsx
@@ -1,6 +1,6 @@
 import React, { useState } from 'react'
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 import { detect } from 'detect-browser'
 
 import Modal from 'components/CommonKit/Modal/Modal'
@@ -21,18 +21,16 @@ const FEEDBACK_EMAIL = 'ecolyo@grandlyon.com'
 const browser = detect()
 
 interface FeedbackModalProps {
-  opened: boolean
+  open: boolean
   handleCloseClick: () => void
-  t: Function
-  client: Client
 }
 
 const FeedbackModal: React.FC<FeedbackModalProps> = ({
-  opened,
+  open,
   handleCloseClick,
-  t,
-  client,
 }: FeedbackModalProps) => {
+  const { t } = useI18n()
+  const client = useClient()
   const [type, setType] = useState<string>('bug')
   const [description, setDescription] = useState<string>('')
   const [email, setEmail] = useState<string>('')
@@ -89,6 +87,7 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({
       }
       try {
         const jobCollection = client.collection('io.cozy.jobs')
+        console.log(jobCollection)
         await jobCollection.create('sendmail', mailData)
       } catch (e) {
         // eslint-disable-next-line no-console
@@ -159,7 +158,7 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({
   }
 
   return (
-    <Modal open={opened} yellowBorder={true} handleCloseClick={closeModal}>
+    <Modal open={open} yellowBorder={true} handleCloseClick={closeModal}>
       {sent ? (
         <div className="fb-root">
           <div className="fb-content">
@@ -240,4 +239,4 @@ const FeedbackModal: React.FC<FeedbackModalProps> = ({
   )
 }
 
-export default translate()(withClient(FeedbackModal))
+export default FeedbackModal
diff --git a/src/components/ContainerComponents/FluidChartContainer/FluidChartContainer.tsx b/src/components/FluidChart/FluidChart.tsx
similarity index 69%
rename from src/components/ContainerComponents/FluidChartContainer/FluidChartContainer.tsx
rename to src/components/FluidChart/FluidChart.tsx
index 82b1bd43520c12e0f0aa147ec40eb60c81a63acb..da12a0672b7e8dacda0ee5d8b0c1e557f0a5d639 100644
--- a/src/components/ContainerComponents/FluidChartContainer/FluidChartContainer.tsx
+++ b/src/components/FluidChart/FluidChart.tsx
@@ -1,34 +1,37 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import { withClient, Client } from 'cozy-client'
+import React, { useState, useEffect } from 'react'
+import { useClient } from 'cozy-client'
+import { useRecoilValue } from 'recoil'
 import { DateTime } from 'luxon'
+
 import { FluidType } from 'enum/fluid.enum'
-import { TimeStep } from 'services/dataConsumptionContracts'
-import { TypeChallenge, UserChallenge } from 'services/dataChallengeContracts'
-import ConsumptionDataManager from 'services/consumptionDataManagerService'
-import FluidChartContent from 'components/ContentComponents/FluidChart/FluidChartContent'
-import ActivateHalfHourLoad from 'components/ContentComponents/ConsumptionNavigator/ActivateHalfHourLoad'
+import { TimeStep } from 'enum/timeStep.enum'
+import { TypeChallenge } from 'enum/challenge.enum'
+import { currentChallengeState } from 'atoms/challenge.state'
+import { UserChallenge } from 'models'
+import ConsumptionService from 'services/consumption.service'
+
+import FluidChartContent from 'components/FluidChart/FluidChartContent'
+import ActivateHalfHourLoad from 'components/ConsumptionNavigator/ActivateHalfHourLoad'
 
-interface FluidChartContainerProps {
+interface FluidChartProps {
   timeStep: TimeStep
   fluidTypes: FluidType[]
   resetReferenceDate: boolean
   multiFluid: boolean
   handleClickTimeStep(_timeStep: TimeStep): void
   setChartLoaded(): void
-  client: Client
 }
 
-const FluidChartContainer: React.FC<FluidChartContainerProps> = ({
+const FluidChart: React.FC<FluidChartProps> = ({
   timeStep,
   fluidTypes,
   resetReferenceDate,
   multiFluid,
   handleClickTimeStep,
   setChartLoaded,
-  client,
-}: FluidChartContainerProps) => {
-  const { currentChallenge } = useContext(AppContext)
+}: FluidChartProps) => {
+  const client = useClient()
+  const currentChallenge = useRecoilValue(currentChallengeState)
   const [lastDataDate, setLastDataDate] = useState<DateTime>(DateTime.local())
   const [lastDateWithAllData, setLastDateWithAllData] = useState<DateTime>(
     DateTime.local()
@@ -38,23 +41,23 @@ const FluidChartContainer: React.FC<FluidChartContainerProps> = ({
   const [isLoaded, setIsLoaded] = useState<boolean>(false)
   const [challenge, setChallenge] = useState<UserChallenge | null>(null)
 
-  const consumptionDataManager = new ConsumptionDataManager(client)
+  const consumptionService = new ConsumptionService(client)
 
-  const handleDetailedDate = (date: DateTime, timeStep: TimeStep) => {
+  const handleDetailedDate = (date: DateTime, _timeStep: TimeStep) => {
     setReferenceDate(date)
-    handleClickTimeStep(timeStep)
+    handleClickTimeStep(_timeStep)
   }
 
   useEffect(() => {
     let subscribed = true
     async function loadData() {
-      const activateHalfHourLoad = !(await consumptionDataManager.checkDoctypeEntries(
+      const activateHalfHourLoad = !(await consumptionService.checkDoctypeEntries(
         FluidType.ELECTRICITY,
         TimeStep.HALF_AN_HOUR
       ))
 
-      const data = await consumptionDataManager.fetchLastDateData(fluidTypes)
-      const dataWithAllFluids = await consumptionDataManager.fetchLastDateData(
+      const data = await consumptionService.fetchLastDateData(fluidTypes)
+      const dataWithAllFluids = await consumptionService.fetchLastDateData(
         fluidTypes,
         true
       )
@@ -127,7 +130,6 @@ const FluidChartContainer: React.FC<FluidChartContainerProps> = ({
                 timeStep={timeStep}
                 multiFluid={multiFluid}
                 currentChallenge={challenge}
-                consumptionDataManager={consumptionDataManager}
                 isDataLoaded={isLoaded}
                 handleDetailedDate={handleDetailedDate}
               ></FluidChartContent>
@@ -139,4 +141,4 @@ const FluidChartContainer: React.FC<FluidChartContainerProps> = ({
   )
 }
 
-export default withClient(FluidChartContainer)
+export default FluidChart
diff --git a/src/components/ContentComponents/FluidChart/FluidChartContent.tsx b/src/components/FluidChart/FluidChartContent.tsx
similarity index 75%
rename from src/components/ContentComponents/FluidChart/FluidChartContent.tsx
rename to src/components/FluidChart/FluidChartContent.tsx
index 5d9bbf1651bbf03cbb9f3ed2f21cde41783d0f8d..a12ca65df3e0b0c3824d783c513879b60ef28fb9 100644
--- a/src/components/ContentComponents/FluidChart/FluidChartContent.tsx
+++ b/src/components/FluidChart/FluidChartContent.tsx
@@ -1,30 +1,20 @@
-import React, { useState, useEffect, useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
+import React, { useState, useEffect } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { DateTime } from 'luxon'
-import {
-  IConsumptionDataManager,
-  IDataload,
-  TimeStep,
-  ITimePeriod,
-  TimePeriod,
-} from 'services/dataConsumptionContracts'
-import {
-  defineLastStepDate,
-  defineDetailedTimeStep,
-  formatDetailedDate,
-  incrementDate,
-} from 'services/dateChartService'
-import { UserChallenge } from 'services/dataChallengeContracts'
+import { NavLink } from 'react-router-dom'
+import { useRecoilValue } from 'recoil'
+
 import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { challengeNotificationState } from 'atoms/notification.state'
+import { Dataload, TimePeriod, UserChallenge } from 'models'
+import DateChartService from 'services/dateChart.service'
 
 import Switch from 'components/CommonKit/Switch/StyledSwitch'
-import FluidChartSwipe from 'components/ContentComponents/FluidChart/FluidChartSwipe'
-import ConsumptionVisualizer from 'components/ContentComponents/ConsumptionVisualizer/ConsumptionVisualizer'
-
+import FluidChartSwipe from 'components/FluidChart/FluidChartSwipe'
+import ConsumptionVisualizer from 'components/ConsumptionVisualizer/ConsumptionVisualizer'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import captionIcon from 'assets/icons/visu/challenge-caption-chart.svg'
-import { NavLink } from 'react-router-dom'
-import { AppContext } from 'components/Contexts/AppContextProvider'
 
 interface FluidChartContentProps {
   fluidTypes: FluidType[]
@@ -34,10 +24,8 @@ interface FluidChartContentProps {
   lastDateWithAllData: DateTime
   multiFluid: boolean
   currentChallenge: UserChallenge | null
-  consumptionDataManager: IConsumptionDataManager
   isDataLoaded: boolean
   handleDetailedDate(date: DateTime, timeStep: TimeStep): void
-  t: Function
 }
 
 const FluidChartContent: React.FC<FluidChartContentProps> = ({
@@ -48,43 +36,44 @@ const FluidChartContent: React.FC<FluidChartContentProps> = ({
   lastDateWithAllData,
   multiFluid,
   currentChallenge,
-  consumptionDataManager,
   isDataLoaded,
   handleDetailedDate,
-  t,
 }: FluidChartContentProps) => {
+  const { t } = useI18n()
+  const challengeNotification = useRecoilValue(challengeNotificationState)
   const [indexDisplayed, setIndexDisplayed] = useState<number>(0)
   const [selectedDate, setSelectedDate] = useState<DateTime>(referenceDate)
-  const [selectedDataload, setSelectedDataload] = useState<IDataload>()
+  const [selectedDataload, setSelectedDataload] = useState<Dataload>()
   const [selectedCompareDataload, setSelectedComparedataload] = useState<
-    IDataload
+    Dataload
   >()
   const [showCompare, setShowCompare] = useState<boolean>(false)
   const [isLoaded, setIsLoaded] = useState<boolean>(true)
-  const { challengeNotification } = useContext(AppContext)
   const challengesPath = 'challenges'
   const challengeDetailPath = {
     pathname: `challenges/ongoing`,
-    state: { challenge: currentChallenge },
+    state: currentChallenge,
   }
-  const challengePeriod: ITimePeriod | null =
-    currentChallenge &&
+  const challengePeriod: TimePeriod | null = currentChallenge &&
     currentChallenge.startingDate &&
-    currentChallenge.endingDate &&
-    new TimePeriod(currentChallenge.startingDate, currentChallenge.endingDate)
+    currentChallenge.endingDate && {
+      startDate: currentChallenge.startingDate,
+      endDate: currentChallenge.endingDate,
+    }
   const handleChangeIndex = (index: number) => {
+    const dateChartService = new DateChartService()
     const date =
       index === 0
         ? referenceDate
-        : defineLastStepDate(referenceDate, timeStep, index)
+        : dateChartService.defineLastStepDate(referenceDate, timeStep, index)
     setSelectedDate(date)
     setIndexDisplayed(index)
     setIsLoaded(false)
   }
 
   const handleClickData = (
-    dataload: IDataload,
-    compareDataload: IDataload | null
+    dataload: Dataload,
+    compareDataload: Dataload | null
   ) => {
     setSelectedDate(dataload.date)
     setSelectedDataload(dataload)
@@ -95,14 +84,22 @@ const FluidChartContent: React.FC<FluidChartContentProps> = ({
   }
 
   const handleClickDetails = () => {
-    const detailedTimeStep = defineDetailedTimeStep(timeStep, fluidTypes)
-    const detailedDate = formatDetailedDate(selectedDate, detailedTimeStep)
+    const dateChartService = new DateChartService()
+    const detailedTimeStep = dateChartService.defineDetailedTimeStep(
+      timeStep,
+      fluidTypes
+    )
+    const detailedDate = dateChartService.formatDetailedDate(
+      selectedDate,
+      detailedTimeStep
+    )
     handleDetailedDate(detailedDate, detailedTimeStep)
     setIsLoaded(false)
   }
 
   const handleClickMove = (increment: number) => {
-    const { incrementIndex, incrementedDate } = incrementDate(
+    const dateChartService = new DateChartService()
+    const { incrementIndex, incrementedDate } = dateChartService.incrementDate(
       increment,
       selectedDate,
       timeStep,
@@ -123,7 +120,7 @@ const FluidChartContent: React.FC<FluidChartContentProps> = ({
     setSelectedDate(referenceDate)
     setIndexDisplayed(0)
     setIsLoaded(false)
-  }, [referenceDate, timeStep])
+  }, [referenceDate, timeStep, fluidTypes])
 
   return (
     <div className="fv-root">
@@ -160,7 +157,6 @@ const FluidChartContent: React.FC<FluidChartContentProps> = ({
           challengePeriod={challengePeriod}
           handleChangeIndex={handleChangeIndex}
           handleClickData={handleClickData}
-          consumptionDataManager={consumptionDataManager}
         />
       )}
       {!multiFluid && timeStep !== TimeStep.YEAR ? (
@@ -204,4 +200,4 @@ const FluidChartContent: React.FC<FluidChartContentProps> = ({
   )
 }
 
-export default translate()(FluidChartContent)
+export default FluidChartContent
diff --git a/src/components/FluidChart/FluidChartSlide.tsx b/src/components/FluidChart/FluidChartSlide.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0fcef191a450843652ad11cadd9a791125a071a5
--- /dev/null
+++ b/src/components/FluidChart/FluidChartSlide.tsx
@@ -0,0 +1,167 @@
+import React, { useState, useEffect } from 'react'
+import { useClient } from 'cozy-client'
+import { useRecoilValue } from 'recoil'
+import { DateTime } from 'luxon'
+
+import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { maxLoadsState } from 'atoms/chart.state'
+import { Datachart, Dataload, TimePeriod } from 'models'
+import ConsumptionService from 'services/consumption.service'
+import DateChartService from 'services/dateChart.service'
+
+import BarChart from 'components/Charts/BarChart'
+import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
+
+interface FluidChartSlideProps {
+  index: number
+  fluidTypes: FluidType[]
+  timeStep: TimeStep
+  multiFluid: boolean
+  referenceDate: DateTime
+  selectedDate: DateTime
+  showCompare: boolean
+  width: number
+  height: number
+  challengePeriod: TimePeriod | null
+  handleClickData: (
+    dataload: Dataload,
+    compareDataload: Dataload | null
+  ) => void
+  isSwitching: boolean
+}
+
+const FluidChartSlide: React.FC<FluidChartSlideProps> = ({
+  index,
+  fluidTypes,
+  timeStep,
+  multiFluid,
+  referenceDate,
+  selectedDate,
+  showCompare,
+  width,
+  height,
+  challengePeriod,
+  handleClickData,
+  isSwitching,
+}: FluidChartSlideProps) => {
+  const client = useClient()
+  const [chartData, setChartData] = useState<Datachart>({
+    actualData: [],
+    comparisonData: null,
+  })
+  const [isLoaded, setIsLoaded] = useState<boolean>(false)
+
+  const maxLoads = useRecoilValue(maxLoadsState)
+
+  const isHome: boolean = !window.location.hash.split('/')[2] ? true : false
+
+  useEffect(() => {
+    let subscribed = true
+    async function loadData() {
+      const dateChartService = new DateChartService()
+      const [timePeriod, compareTimePeriod] = await Promise.all([
+        dateChartService.defineTimePeriod(referenceDate, timeStep, index),
+        dateChartService.defineTimePeriod(referenceDate, timeStep, index + 1),
+      ])
+      const consumptionService = new ConsumptionService(client)
+      const graphData = await consumptionService.getGraphData(
+        timePeriod,
+        timeStep,
+        fluidTypes,
+        compareTimePeriod,
+        isHome
+      )
+
+      if (
+        graphData &&
+        graphData.actualData.length > 0 &&
+        (timeStep === TimeStep.DAY || timeStep === TimeStep.HALF_AN_HOUR)
+      ) {
+        const lastSlideDate =
+          graphData.actualData[graphData.actualData.length - 1].date
+        const actualMonth = lastSlideDate.startOf('week').month
+        const actualYear = lastSlideDate.startOf('week').year
+
+        // From the first monday of the month to the first monday of the next month for for TimeStep.DAY
+        // Full month + last day of the previous month for TimeStep.HALF_AN_HOUR
+
+        const maxTimePeriod = {
+          startDate:
+            timeStep === TimeStep.HALF_AN_HOUR
+              ? lastSlideDate.startOf('month')
+              : lastSlideDate.startOf('week').startOf('month').weekday === 1
+              ? lastSlideDate.startOf('week').startOf('month')
+              : lastSlideDate
+                  .startOf('week')
+                  .startOf('month')
+                  .plus({ days: +7 })
+                  .startOf('week'),
+          endDate:
+            timeStep === TimeStep.HALF_AN_HOUR
+              ? lastSlideDate.endOf('month')
+              : lastSlideDate.startOf('week').month !==
+                lastSlideDate.endOf('week').month
+              ? lastSlideDate.endOf('week')
+              : lastSlideDate.endOf('month').endOf('week'),
+        }
+
+        const compareMaxTimePeriod = maxTimePeriod
+
+        const key = `${actualMonth}/${actualYear}-${isHome}-${fluidTypes.join(
+          '-'
+        )}-${timeStep}`
+
+        const graphMaxLoad = await consumptionService.getMaxLoad(
+          maxTimePeriod,
+          timeStep,
+          fluidTypes,
+          compareMaxTimePeriod,
+          isHome
+        )
+
+        maxLoads[key] = graphMaxLoad
+      }
+
+      if (subscribed && graphData && graphData.actualData.length > 0) {
+        setChartData(graphData)
+        setIsLoaded(true)
+      }
+    }
+    setIsLoaded(false)
+
+    loadData()
+    return () => {
+      subscribed = false
+    }
+  }, [timeStep, fluidTypes])
+
+  return (
+    <>
+      <div className="fs-slide">
+        {!isLoaded ? (
+          <div className="chart-loading">
+            <StyledSpinner size="5em" fluidTypes={fluidTypes} isHome={isHome} />
+          </div>
+        ) : (
+          <BarChart
+            chartData={chartData}
+            fluidTypes={fluidTypes}
+            timeStep={timeStep}
+            multiFluid={multiFluid}
+            selectedDate={selectedDate}
+            showCompare={showCompare}
+            handleClickData={handleClickData}
+            height={height}
+            width={width}
+            challengePeriod={challengePeriod}
+            isSwitching={isSwitching}
+            isHome={isHome}
+          />
+        )}
+      </div>
+    </>
+  )
+}
+
+export default FluidChartSlide
diff --git a/src/components/ContentComponents/FluidChart/FluidChartSwipe.tsx b/src/components/FluidChart/FluidChartSwipe.tsx
similarity index 85%
rename from src/components/ContentComponents/FluidChart/FluidChartSwipe.tsx
rename to src/components/FluidChart/FluidChartSwipe.tsx
index 907446e0080ba4190b4108ec8017f6030b295c16..8b2b51ced8d191aa5bc1ed8ef04f626b22f88fad 100644
--- a/src/components/ContentComponents/FluidChart/FluidChartSwipe.tsx
+++ b/src/components/FluidChart/FluidChartSwipe.tsx
@@ -2,14 +2,12 @@ import React, { useState, useEffect, useRef } from 'react'
 import SwipeableViews from 'react-swipeable-views'
 import { virtualize } from 'react-swipeable-views-utils'
 import { DateTime } from 'luxon'
-import {
-  IConsumptionDataManager,
-  IDataload,
-  TimeStep,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
+
+import { TimeStep } from 'enum/timeStep.enum'
 import { FluidType } from 'enum/fluid.enum'
-import FluidChartSlide from 'components/ContentComponents/FluidChart/FluidChartSlide'
+import { Dataload, TimePeriod } from 'models'
+
+import FluidChartSlide from 'components/FluidChart/FluidChartSlide'
 
 const VirtualizeSwipeableViews = virtualize(SwipeableViews)
 
@@ -21,13 +19,12 @@ interface FluidChartSwipeProps {
   selectedDate: DateTime
   indexDisplayed: number
   showCompare: boolean
-  challengePeriod: ITimePeriod | null
+  challengePeriod: TimePeriod | null
   handleChangeIndex: (index: number) => void
   handleClickData: (
-    dataload: IDataload,
-    compareDataload: IDataload | null
+    dataload: Dataload,
+    compareDataload: Dataload | null
   ) => void
-  consumptionDataManager: IConsumptionDataManager
 }
 
 const FluidChartSwipe: React.FC<FluidChartSwipeProps> = ({
@@ -41,7 +38,6 @@ const FluidChartSwipe: React.FC<FluidChartSwipeProps> = ({
   challengePeriod,
   handleChangeIndex,
   handleClickData,
-  consumptionDataManager,
 }: FluidChartSwipeProps) => {
   const swipe = useRef<HTMLDivElement>(null)
   const [width, setWidth] = useState(0)
@@ -91,7 +87,6 @@ const FluidChartSwipe: React.FC<FluidChartSwipeProps> = ({
             height={height}
             challengePeriod={challengePeriod}
             handleClickData={handleClickData}
-            consumptionDataManager={consumptionDataManager}
             isSwitching={isSwitching}
           />
         )}
diff --git a/src/components/ContainerComponents/CozyBar/CozyBar.tsx b/src/components/Header/CozyBar.tsx
similarity index 72%
rename from src/components/ContainerComponents/CozyBar/CozyBar.tsx
rename to src/components/Header/CozyBar.tsx
index 4a4769f71698f05d007ef75371c52b618c502513..06dacf74c22549331c66a67895009198e3a2f6d5 100644
--- a/src/components/ContainerComponents/CozyBar/CozyBar.tsx
+++ b/src/components/Header/CozyBar.tsx
@@ -1,32 +1,37 @@
-import React, { useContext } from 'react'
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useRecoilValue, useSetRecoilState } from 'recoil'
+import { history } from 'components/App'
+
 import { ScreenType } from 'enum/screen.enum'
-import { history } from 'components/ContainerComponents/ViewContainer/ViewContainer'
-import { translate } from 'cozy-ui/react/I18n'
+import { ModalState } from 'models'
+import { modalState } from 'atoms/modal.state'
+import { screenTypeState } from 'atoms/screenType.state'
+
 import BackArrowIcon from 'assets/icons/ico/back-arrow.svg'
 import FeedbacksIcon from 'assets/icons/ico/feedbacks.svg'
-import { AppContext } from 'components/Contexts/AppContextProvider'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
 
 interface CozyBarProps {
   titleKey?: string
   displayBackArrow?: boolean
-  t: Function
 }
 
 const CozyBar = ({
   titleKey = 'COMMON.APP_TITLE',
   displayBackArrow = false,
-  t,
 }: CozyBarProps) => {
+  const { t } = useI18n()
   const { BarLeft, BarCenter, BarRight } = cozy.bar
-  const { screenType, setFeedbackOpened } = useContext(AppContext)
+  const screenType = useRecoilValue(screenTypeState)
+  const setModalState = useSetRecoilState(modalState)
 
   const handleClickBack = () => {
     history.goBack()
   }
 
   const handleClickFeedbacks = () => {
-    setFeedbackOpened(true)
+    setModalState((prev: ModalState) => ({ ...prev, feedbackModal: true }))
   }
 
   const cozyBarCustom = (screen?: ScreenType) => {
@@ -64,4 +69,4 @@ const CozyBar = ({
   return cozyBarCustom(screenType)
 }
 
-export default translate()(CozyBar)
+export default CozyBar
diff --git a/src/components/ContainerComponents/Header/Header.tsx b/src/components/Header/Header.tsx
similarity index 83%
rename from src/components/ContainerComponents/Header/Header.tsx
rename to src/components/Header/Header.tsx
index 02928413be821220db66039a77508dd5de92d4c8..7a409634967a4ecff21c89250836082a6472c366 100644
--- a/src/components/ContainerComponents/Header/Header.tsx
+++ b/src/components/Header/Header.tsx
@@ -1,9 +1,13 @@
-import React, { useEffect, useRef, useContext } from 'react'
-import { translate } from 'cozy-ui/react/I18n'
-import { history } from 'components/ContainerComponents/ViewContainer/ViewContainer'
-import { withClient, Client } from 'cozy-client'
+import React, { useEffect, useRef } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useRecoilValue, useSetRecoilState } from 'recoil'
+import { history } from 'components/App'
+
 import { ScreenType } from 'enum/screen.enum'
-import { AppContext } from 'components/Contexts/AppContextProvider'
+import { ModalState } from 'models'
+import { modalState } from 'atoms/modal.state'
+import { screenTypeState } from 'atoms/screenType.state'
+
 import BackArrowIcon from 'assets/icons/ico/back-arrow.svg'
 import FeedbacksIcon from 'assets/icons/ico/feedbacks.svg'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
@@ -14,8 +18,6 @@ interface HeaderProps {
   displayBackArrow?: boolean
   children?: React.ReactNode
   setHeaderHeight(height: number): void
-  client: Client
-  t: Function
 }
 
 const Header: React.FC<HeaderProps> = ({
@@ -24,11 +26,12 @@ const Header: React.FC<HeaderProps> = ({
   displayBackArrow,
   children,
   setHeaderHeight,
-  client,
-  t,
 }: HeaderProps) => {
+  const { t } = useI18n()
   const header = useRef(null)
-  const { screenType, setFeedbackOpened } = useContext(AppContext)
+  const screenType = useRecoilValue(screenTypeState)
+  const setModalState = useSetRecoilState(modalState)
+
   const cozyBarHeight = 48
   const headerBottomHeight = 8
 
@@ -37,7 +40,7 @@ const Header: React.FC<HeaderProps> = ({
   }
 
   const handleClickFeedbacks = () => {
-    setFeedbackOpened(true)
+    setModalState((prev: ModalState) => ({ ...prev, feedbackModal: true }))
   }
 
   useEffect(() => {
@@ -113,4 +116,4 @@ const Header: React.FC<HeaderProps> = ({
   )
 }
 
-export default translate()(withClient(Header))
+export default Header
diff --git a/src/components/Home/HomeIndicators.tsx b/src/components/Home/HomeIndicators.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4fc26e07444ae34f63a9ccf923e52268da5f7e86
--- /dev/null
+++ b/src/components/Home/HomeIndicators.tsx
@@ -0,0 +1,126 @@
+import React, { useEffect, useState } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+import { useRecoilValue } from 'recoil'
+
+import { TimeStep } from 'enum/timeStep.enum'
+import { fluidTypeState } from 'atoms/fluidState.state'
+import { TimePeriod, PerformanceIndicator } from 'models'
+import TimePeriodService from 'services/timePeriod.service'
+import ConsumptionService from 'services/consumption.service'
+import PerformanceIndicatorService from 'services/performanceIndicator.service'
+import ConfigService from 'services/fluidConfig.service'
+import { convertDateByTimeStep } from 'utils/date'
+
+import PerformanceIndicatorContent from 'components/PerformanceIndicator/PerformanceIndicatorContent'
+import FluidPerformanceIndicator from 'components/PerformanceIndicator/FluidPerformanceIndicator'
+import KonnectorViewerListItem from 'components/Konnector/KonnectorViewerListItem'
+
+interface HomeIndicatorsProps {
+  timeStep: TimeStep
+  setIndicatorsLoaded(): void
+}
+
+const HomeIndicators: React.FC<HomeIndicatorsProps> = ({
+  timeStep,
+  setIndicatorsLoaded,
+}: HomeIndicatorsProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  const [performanceIndicators, setPerformanceIndicators] = useState<
+    PerformanceIndicator[]
+  >([])
+  const [currentTimePeriod, setCurrentTimePeriod] = useState<TimePeriod | null>(
+    null
+  )
+  const [isLoaded, setIsLoaded] = useState<boolean>(false)
+
+  const performanceIndicatorService = new PerformanceIndicatorService()
+  const configService = new ConfigService()
+  const fluidConfig = configService.getFluidConfig()
+
+  useEffect(() => {
+    let subscribed = true
+    async function populatePerformanceIndicators() {
+      const consumptionService = new ConsumptionService(client)
+      const lastDate = await consumptionService.fetchLastDateData(fluidTypes)
+
+      if (subscribed && lastDate) {
+        const timePeriodService = new TimePeriodService()
+        const periods = timePeriodService.getTimePeriods(
+          lastDate,
+          fluidTypes,
+          timeStep
+        )
+
+        const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
+          periods.timePeriod,
+          timeStep,
+          fluidTypes,
+          periods.comparisonTimePeriod
+        )
+
+        if (fetchedPerformanceIndicators) {
+          setPerformanceIndicators(fetchedPerformanceIndicators)
+          setCurrentTimePeriod(periods.timePeriod)
+        }
+      }
+      setIndicatorsLoaded()
+      setIsLoaded(true)
+    }
+    populatePerformanceIndicators()
+    return () => {
+      subscribed = false
+    }
+  }, [timeStep, fluidTypes])
+
+  return (
+    <>
+      {isLoaded ? (
+        <div className="fi-root">
+          <div className="fi-content">
+            <div className="fi-header text-14-normal-uppercase">
+              {t('COMMON.CONSO_CARDS_LABEL')}{' '}
+              {convertDateByTimeStep(currentTimePeriod, timeStep, true)}
+            </div>
+            <PerformanceIndicatorContent
+              performanceIndicator={performanceIndicatorService.aggregatePerformanceIndicators(
+                performanceIndicators
+              )}
+              timeStep={timeStep}
+            />
+            <div>
+              <span className="text-16-normal-uppercase details-title">
+                {t('INDICATOR.DETAIL')}
+                {convertDateByTimeStep(currentTimePeriod, timeStep, true)}
+              </span>
+              {fluidConfig.map((fluid, index) => {
+                return fluidTypes.includes(fluid.fluidTypeId) ? (
+                  <FluidPerformanceIndicator
+                    key={index}
+                    fluidType={fluid.fluidTypeId}
+                    performanceIndicator={
+                      performanceIndicators[fluid.fluidTypeId]
+                    }
+                  />
+                ) : null
+              })}
+              {fluidConfig.map((fluid, index) => {
+                return fluidTypes.includes(fluid.fluidTypeId) ? null : (
+                  <KonnectorViewerListItem
+                    key={index}
+                    fluidConfig={fluid}
+                    isParam={false}
+                  />
+                )
+              })}
+            </div>
+          </div>
+        </div>
+      ) : null}
+    </>
+  )
+}
+
+export default HomeIndicators
diff --git a/src/components/Home/HomeView.tsx b/src/components/Home/HomeView.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..f097fca20ac48292360fb56adac64ada4e8661cb
--- /dev/null
+++ b/src/components/Home/HomeView.tsx
@@ -0,0 +1,179 @@
+import React, { useState, useEffect, useCallback } from 'react'
+import { useClient } from 'cozy-client'
+import { useRecoilState, useRecoilValue } from 'recoil'
+
+import { TimeStep } from 'enum/timeStep.enum'
+import { fluidStatusState, fluidTypeState } from 'atoms/fluidState.state'
+import { previousTimeStepState } from 'atoms/chart.state'
+
+import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import FluidChart from 'components/FluidChart/FluidChart'
+import ConsumptionNavigator from 'components/ConsumptionNavigator/ConsumptionNavigator'
+import HomeIndicators from 'components/Home/HomeIndicators'
+import ChallengeCardLink from 'components/Challenge/ChallengeCardLink'
+import KonnectorViewerList from 'components/Konnector/KonnectorViewerList'
+import OldFluidDataModal from 'components/Home/OldFluidDataModal'
+import { DateTime } from 'luxon'
+import { userProfileState } from 'atoms/userProfile.state'
+import UserProfileService from 'services/userProfile.service'
+import { FluidType } from 'enum/fluid.enum'
+
+const HomeView: React.FC = () => {
+  const client = useClient()
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  const fluidStatus = useRecoilValue(fluidStatusState)
+  const [previousTimeStep, setPreviousTimeStep] = useRecoilState(
+    previousTimeStepState
+  )
+  const [userProfile, setUserProfile] = useRecoilState(userProfileState)
+
+  const [timeStep, setTimeStep] = useState<TimeStep>(
+    previousTimeStep !== TimeStep.HALF_AN_HOUR ? previousTimeStep : TimeStep.DAY
+  )
+  const [resetRefenceDate, setResetReferenceDate] = useState<boolean>(false)
+  const [headerHeight, setHeaderHeight] = useState<number>(0)
+  const [isChartLoading, setChartLoading] = useState<boolean>(true)
+  const [isIndicatorsLoading, setIndicatorsLoading] = useState<boolean>(true)
+  const [openOldFluidDataModal, setopenOldFluidDataModal] = useState(false)
+  const fluidOldData: FluidType[] = []
+
+  const updateProfileHaveSeenOldFluidModal = useCallback(async () => {
+    const userProfileService = new UserProfileService(client)
+    await userProfileService
+      .updateUserProfile({ haveSeenOldFluidModal: DateTime.local() })
+      .then(updatedUserProfile => {
+        updatedUserProfile && setUserProfile(updatedUserProfile)
+      })
+  }, [setUserProfile])
+
+  const setChartLoaded = () => {
+    setChartLoading(false)
+  }
+
+  const setIndicatorsLoaded = () => {
+    setIndicatorsLoading(false)
+  }
+
+  const handleClickTimeStepForNavigation = (_timeStep: TimeStep) => {
+    setResetReferenceDate(true)
+    setTimeStep(_timeStep)
+    setPreviousTimeStep(_timeStep)
+  }
+
+  const handleClickTimeStepForFluidContainer = (_timeStep: TimeStep) => {
+    setResetReferenceDate(false)
+    setTimeStep(_timeStep)
+  }
+
+  const defineHeaderHeight = (height: number) => {
+    setHeaderHeight(height)
+  }
+  const checkFluidDataPeriod = async () => {
+    for (const fluid of fluidStatus) {
+      let diffInDays = 0
+      if (fluid && fluid.lastDataDate) {
+        const dateToCompare = fluid.lastDataDate
+        diffInDays = dateToCompare.diffNow('days').toObject().days || 0
+        if (diffInDays < -5 && fluid.status !== null) {
+          !fluidOldData.includes(fluid.fluidType) &&
+            fluidOldData.push(fluid.fluidType)
+        }
+      }
+    }
+    if (fluidOldData.length > 0) {
+      if (userProfile.haveSeenOldFluidModal === false) {
+        //if user never has never seen the modal
+        await updateProfileHaveSeenOldFluidModal()
+        return setopenOldFluidDataModal(true)
+      } else if (userProfile.haveSeenOldFluidModal) {
+        const dateToCompare = userProfile.haveSeenOldFluidModal
+        //if user has seen the modal since more than a day
+        const diff = dateToCompare.diffNow('hours').toObject().hours
+        if (diff && diff < -23) {
+          updateProfileHaveSeenOldFluidModal()
+          return setopenOldFluidDataModal(true)
+        } else return setopenOldFluidDataModal(false)
+      }
+    }
+  }
+
+  const handleCloseClick = () => {
+    setopenOldFluidDataModal(false)
+  }
+
+  useEffect(() => {
+    async function checkData() {
+      await checkFluidDataPeriod()
+    }
+    checkData()
+  }, [fluidStatus])
+
+  return (
+    <React.Fragment>
+      <CozyBar />
+      {fluidTypes && fluidTypes.length > 0 ? (
+        <>
+          <Header
+            setHeaderHeight={defineHeaderHeight}
+            textKey={'COMMON.APP_PRESENTATION'}
+          >
+            <ConsumptionNavigator
+              fluidTypes={fluidTypes}
+              multiFluid={true}
+              timeStep={timeStep}
+              handleClickTimeStep={handleClickTimeStepForNavigation}
+            />
+          </Header>
+          <Content height={headerHeight}>
+            {(isChartLoading || isIndicatorsLoading) && (
+              <div className="content-view-loading">
+                <StyledSpinner size="5em" />
+              </div>
+            )}
+            <div
+              className={`${
+                isChartLoading || isIndicatorsLoading
+                  ? 'chart-indicator-none'
+                  : 'chart-indicator-block'
+              }`}
+            >
+              <FluidChart
+                timeStep={timeStep}
+                fluidTypes={fluidTypes}
+                resetReferenceDate={resetRefenceDate}
+                multiFluid={true}
+                handleClickTimeStep={handleClickTimeStepForFluidContainer}
+                setChartLoaded={setChartLoaded}
+              />
+              <HomeIndicators
+                timeStep={timeStep}
+                setIndicatorsLoaded={setIndicatorsLoaded}
+              />
+              <ChallengeCardLink />
+            </div>
+          </Content>
+          {fluidStatus && (
+            <OldFluidDataModal
+              fluidStatus={fluidStatus}
+              fluidOldData={fluidOldData}
+              open={openOldFluidDataModal}
+              handleCloseClick={handleCloseClick}
+            ></OldFluidDataModal>
+          )}
+        </>
+      ) : (
+        <>
+          <Header setHeaderHeight={defineHeaderHeight}></Header>
+          <Content height={headerHeight}>
+            <KonnectorViewerList isParam={false} />
+          </Content>
+        </>
+      )}
+    </React.Fragment>
+  )
+}
+
+export default HomeView
diff --git a/src/components/Home/OldFluidDataModal.tsx b/src/components/Home/OldFluidDataModal.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..78d3798830ce041d30c94770ac33a6846daf7592
--- /dev/null
+++ b/src/components/Home/OldFluidDataModal.tsx
@@ -0,0 +1,116 @@
+import React, { useState, useEffect } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import Modal from 'components/CommonKit/Modal/Modal'
+import WarnCross from 'assets/icons/ico/warn-cross.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import StyledButton from 'components/CommonKit/Button/StyledButton'
+import StyledStopButton from 'components/CommonKit/Button/StyledStopButton'
+import { Redirect } from 'react-router-dom'
+
+import { FluidType } from 'enum/fluid.enum'
+import { FluidStatus } from 'models'
+
+interface OldFluidDataModalProps {
+  open: boolean
+  fluidStatus: FluidStatus[]
+  fluidOldData: FluidType[]
+  handleCloseClick: () => void
+}
+
+const OldFluidDataModal: React.FC<OldFluidDataModalProps> = ({
+  open,
+  fluidStatus,
+  fluidOldData,
+  handleCloseClick,
+}: OldFluidDataModalProps) => {
+  const { t } = useI18n()
+  const [konnectorError, setkonnectorError] = useState<boolean>(false)
+  const [erroredKonnectors] = useState<FluidType[]>([])
+  const [redirect, setRedirect] = useState(false)
+
+  const checkFluidDataDate = () => {
+    fluidStatus &&
+      fluidStatus.length > 0 &&
+      fluidStatus.forEach(fluid => {
+        if (fluid.status === 'errored') {
+          !erroredKonnectors.includes(fluid.fluidType) &&
+            erroredKonnectors.push(fluid.fluidType)
+        }
+      })
+    if (erroredKonnectors.length > 0) setkonnectorError(true)
+  }
+
+  const redirectTrue = () => {
+    handleCloseClick()
+    setRedirect(true)
+  }
+  const redirectToKonnectors = () => {
+    if (redirect) {
+      return <Redirect to="/options" />
+    }
+  }
+
+  useEffect(() => {
+    checkFluidDataDate()
+  }, [fluidStatus])
+
+  return (
+    <>
+      <Modal open={open} handleCloseClick={handleCloseClick}>
+        <div className="od-content">
+          <div className="od-warning">
+            <StyledIcon icon={WarnCross} size={40} />
+            <p className="text-20-bold">{t('modalOldData.errorTxt')}</p>
+          </div>
+          <p className="od-main text-16-bold"> {t('modalOldData.oldData')}</p>
+          {konnectorError ? (
+            <div className="verifyState">
+              <p className="text-16-normal">{t('modalOldData.verify')}</p>
+              <ul className="od-konnectorsList">
+                {erroredKonnectors.map((err, index) => {
+                  return (
+                    <li key={index}>
+                      {err === FluidType.ELECTRICITY &&
+                        t('FLUID.ELECTRICITY.LABEL')}
+                      {err === FluidType.WATER && t('FLUID.WATER.LABEL')}
+                      {err === FluidType.GAS && t('FLUID.GAS.LABEL')}
+                    </li>
+                  )
+                })}
+              </ul>
+              <div className="buttons">
+                <StyledStopButton color="secondary" onClick={handleCloseClick}>
+                  {t('modalOldData.later')}
+                </StyledStopButton>
+                <StyledButton onClick={redirectTrue}>
+                  {t('modalOldData.accessButton')}
+                  {redirectToKonnectors()}
+                </StyledButton>
+              </div>
+            </div>
+          ) : (
+            <div className="providerProblem">
+              <p className="text-16-normal">{t('modalOldData.problem')}</p>
+              <p className="text-16-normal">{t('modalOldData.contact')}</p>
+              <ul className="od-konnectorsList">
+                {fluidOldData.map((err, index) => {
+                  return (
+                    <li key={index}>
+                      {err === FluidType.ELECTRICITY &&
+                        t('FLUID.ELECTRICITY.provider')}
+                      {err === FluidType.WATER && t('FLUID.WATER.provider')}
+                      {err === FluidType.GAS && t('FLUID.GAS.provider')}
+                    </li>
+                  )
+                })}
+              </ul>
+              <StyledButton onClick={handleCloseClick}>Ok</StyledButton>
+            </div>
+          )}
+        </div>
+      </Modal>
+    </>
+  )
+}
+
+export default OldFluidDataModal
diff --git a/src/components/Hooks/userInstanceSettings.tsx b/src/components/Hooks/userInstanceSettings.tsx
index eb05ff8b973ea275f12537a16fe28ea3c88122d1..91d22c9801cd5079e38b0e7d46dc7e6877ffaaf4 100644
--- a/src/components/Hooks/userInstanceSettings.tsx
+++ b/src/components/Hooks/userInstanceSettings.tsx
@@ -1,8 +1,9 @@
 import { useState, useEffect } from 'react'
 import get from 'lodash/get'
-import { Client } from 'cozy-client'
+import { useClient } from 'cozy-client'
 
-const userInstanceSettings = (client: Client) => {
+const userInstanceSettings = () => {
+  const client = useClient()
   const [settings, setSettings] = useState({})
   const [fetchStatus, setFetchStatus] = useState('idle')
 
@@ -12,7 +13,7 @@ const userInstanceSettings = (client: Client) => {
         const response = await client
           .getStackClient()
           .fetchJSON('GET', '/settings/instance')
-        setSettings(get(response, 'data.attributes'), {})
+        setSettings(get(response, 'data.attributes'))
         setFetchStatus('loaded')
       } catch (error) {
         setFetchStatus('failed')
diff --git a/src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx b/src/components/Konnector/KonnectorViewerCard.tsx
similarity index 74%
rename from src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx
rename to src/components/Konnector/KonnectorViewerCard.tsx
index 03f2aac567c14987407914fceef4f21a5195d0a3..91d320838e53887d0bd0db2ce50e2c764ba989b1 100644
--- a/src/components/ContentComponents/KonnectorViewer/KonnectorViewerCard.tsx
+++ b/src/components/Konnector/KonnectorViewerCard.tsx
@@ -1,45 +1,39 @@
 import React, { useState, useEffect, useRef } from 'react'
-import { AccountService } from 'services/accountService'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
 
 import { FluidType } from 'enum/fluid.enum'
+import { JobState } from 'enum/jobState.enum'
+import { Konnector, Trigger, TriggerState, FluidConfig } from 'models'
+import AccountService from 'services/account.service'
+import TriggerService from 'services/triggers.service'
+import { getPicto, getAddPicto, getParamPicto } from 'utils/picto'
+import { getFluidType } from 'utils/utils'
 
-import { withClient, Client } from 'cozy-client'
-import { translate } from 'cozy-ui/react/I18n'
-
-import { getPicto, getAddPicto, getFuildType, getParamPicto } from 'utils/utils'
 import chevronDown from 'assets/icons/ico/chevron-down.svg'
 import chevronUp from 'assets/icons/ico/chevron-up.svg'
-
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import StyledIconButton from 'components/CommonKit/IconButton/StyledIconButton'
-
 import failurePicto from 'assets/png/picto/picto-failure.png'
-import IFluidConfig from 'services/IFluidConfig'
-
-import KonnectorNotFound from 'components/ContentComponents/Konnector/KonnectorNotFound'
-import KonnectorForm from 'components/ContentComponents/Konnector/KonnectorForm'
-import KonnectorResult from 'components/ContentComponents/Konnector/KonnectorResult'
-import KonnectorLaunch from 'components/ContentComponents/Konnector/KonnectorLaunch'
-
-import { Konnector, Trigger, TriggerState } from 'doctypes'
-import { JobState } from 'services/jobsService'
-import { TriggerService } from 'services/triggersService'
+import ConnectionNotFound from 'components/Connection/ConnectionNotFound'
+import ConnectionForm from 'components/Connection/ConnectionForm'
+import ConnectionResult from 'components/Connection/ConnectionResult'
+import ConnectionLaunch from 'components/Connection/ConnectionLaunch'
 
 interface KonnectorViewerCardProps {
-  fluidConfig: IFluidConfig
+  fluidConfig: FluidConfig
   konnector: Konnector
-  client: Client
+
   isParam: boolean
-  t: Function
 }
 
 const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
   fluidConfig,
   konnector,
-  client,
   isParam,
-  t,
 }: KonnectorViewerCardProps) => {
+  const { t } = useI18n()
+  const client = useClient()
   const [account, setAccount] = useState<Account | null>(null)
   const [trigger, setTrigger] = useState<Trigger | null>(null)
   const [triggerState, setTriggerState] = useState<TriggerState | null>(null)
@@ -54,7 +48,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
 
   const content: React.MutableRefObject<null> = useRef<null>(null)
   const type: string = fluidConfig.konnectorConfig.type
-  const fluid: FluidType = getFuildType(type)
+  const fluid: FluidType = getFluidType(type)
   const iconType = getPicto(fluid)
 
   const iconAddType = isParam ? getParamPicto(fluid) : getAddPicto(fluid)
@@ -85,10 +79,11 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
     )
   }
 
-  const updateState = async (trigger: Trigger) => {
-    const triggerState = await TriggerService.fetchTriggerState(client, trigger)
-    if (triggerState) {
-      setTriggerState(triggerState)
+  const updateState = async (_trigger: Trigger) => {
+    const triggerService = new TriggerService(client)
+    const _triggerState = await triggerService.fetchTriggerState(_trigger)
+    if (_triggerState) {
+      setTriggerState(_triggerState)
     }
   }
 
@@ -98,7 +93,7 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
     setLaunch(true)
   }
 
-  const handleKonnectorLaunch = async () => {
+  const handleConnectionLaunch = async () => {
     if (trigger) {
       await updateState(trigger)
     }
@@ -114,16 +109,12 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
     async function getData() {
       setLoading(true)
       if (konnector) {
-        const _account = await AccountService.getAccountByType(
-          client,
-          konnector.slug
-        )
+        const accountService = new AccountService(client)
+        const _account = await accountService.getAccountByType(konnector.slug)
         if (subscribed && _account) {
           setAccount(_account)
-          const _trigger = await TriggerService.fetchTriggerFromAccount(
-            client,
-            _account
-          )
+          const triggerService = new TriggerService(client)
+          const _trigger = await triggerService.getTrigger(_account, konnector)
           if (subscribed && _trigger) {
             setTrigger(_trigger)
             await updateState(_trigger)
@@ -175,22 +166,24 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
               className={`accordion-content ${setActive}`}
             >
               {!konnector ? (
-                <KonnectorNotFound
+                <ConnectionNotFound
                   konnectorSlug={fluidConfig.konnectorConfig.slug}
                 />
               ) : shouldLaunch && trigger ? (
-                <KonnectorLaunch
+                <ConnectionLaunch
                   trigger={trigger}
+                  konnector={konnector}
                   type={type}
-                  handleKonnectorLaunch={handleKonnectorLaunch}
+                  handleConnectionLaunch={handleConnectionLaunch}
                 />
               ) : account && !loginFailed ? (
-                <KonnectorResult
+                <ConnectionResult
                   account={account}
+                  konnector={konnector}
                   handleJobState={handleJobState}
                 />
               ) : (
-                <KonnectorForm
+                <ConnectionForm
                   fluidConfig={fluidConfig}
                   konnector={konnector}
                   account={account}
@@ -205,4 +198,4 @@ const KonnectorViewerCard: React.FC<KonnectorViewerCardProps> = ({
     </>
   )
 }
-export default translate()(withClient(KonnectorViewerCard))
+export default KonnectorViewerCard
diff --git a/src/components/Konnector/KonnectorViewerList.tsx b/src/components/Konnector/KonnectorViewerList.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..715b89b47e373543e08423ac58b1349b2624f662
--- /dev/null
+++ b/src/components/Konnector/KonnectorViewerList.tsx
@@ -0,0 +1,52 @@
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useRecoilValue } from 'recoil'
+
+import { FluidConfig } from 'models'
+import { fluidTypeState } from 'atoms/fluidState.state'
+import ConfigService from 'services/fluidConfig.service'
+
+import KonnectorViewerListItem from 'components/Konnector/KonnectorViewerListItem'
+
+interface KonnectorViewerListProps {
+  isParam: boolean
+}
+
+const KonnectorViewerList: React.FC<KonnectorViewerListProps> = ({
+  isParam = false,
+}: KonnectorViewerListProps) => {
+  const { t } = useI18n()
+  const fluidConfigs: FluidConfig[] = new ConfigService().getFluidConfig()
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  return (
+    <div className="kv-root">
+      <div className="kv-content">
+        <div className="kv-header text-14-normal-uppercase">
+          {t('KONNECTORCONFIG.TITLE_CONNECTION')}
+        </div>
+        <div>
+          {fluidConfigs.map((item: FluidConfig, index: number) => {
+            return fluidTypes.includes(item.fluidTypeId) ? (
+              <KonnectorViewerListItem
+                isParam={isParam}
+                key={index}
+                fluidConfig={item}
+              />
+            ) : null
+          })}
+          {fluidConfigs.map((item: FluidConfig, index: number) => {
+            return fluidTypes.includes(item.fluidTypeId) ? null : (
+              <KonnectorViewerListItem
+                isParam={isParam}
+                key={index}
+                fluidConfig={item}
+              />
+            )
+          })}
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default KonnectorViewerList
diff --git a/src/components/ContentComponents/KonnectorViewer/KonnectorViewer.tsx b/src/components/Konnector/KonnectorViewerListItem.tsx
similarity index 50%
rename from src/components/ContentComponents/KonnectorViewer/KonnectorViewer.tsx
rename to src/components/Konnector/KonnectorViewerListItem.tsx
index 5f9c8ec19cfd61f79d1926303fa6fb8e3ca0e9a4..3cb48f4d33583262448e91622f93cd876a288690 100644
--- a/src/components/ContentComponents/KonnectorViewer/KonnectorViewer.tsx
+++ b/src/components/Konnector/KonnectorViewerListItem.tsx
@@ -1,34 +1,31 @@
 import React, { useState, useEffect } from 'react'
-import { withClient, Client } from 'cozy-client'
+import { useClient } from 'cozy-client'
 
-import { Konnector } from 'doctypes'
-import KonnectorService from 'services/konnectorService'
+import { Konnector, FluidConfig } from 'models'
+import KonnectorService from 'services/konnector.service'
 
-import KonnectorViewerCard from 'components/ContentComponents/KonnectorViewer/KonnectorViewerCard'
-import IFluidConfig from 'services/IFluidConfig'
+import KonnectorViewerCard from 'components/Konnector/KonnectorViewerCard'
 
-export interface KonnectorViewerProps {
-  fluidConfig: IFluidConfig
-  client: Client
+export interface KonnectorViewerListItemProps {
+  fluidConfig: FluidConfig
   isParam: boolean
 }
 
-const KonnectorViewer: React.FC<KonnectorViewerProps> = ({
+const KonnectorViewerListItem: React.FC<KonnectorViewerListItemProps> = ({
   fluidConfig,
-  client,
   isParam = false,
-}: KonnectorViewerProps) => {
+}: KonnectorViewerListItemProps) => {
+  const client = useClient()
   const [konnector, setKonnector] = useState<Konnector | null>(null)
   const [loaded, setLoaded] = useState<boolean>(false)
 
   useEffect(() => {
     let subscribed = true
-    const konnectorService = new KonnectorService(
-      client,
-      fluidConfig.konnectorConfig.slug
-    )
+    const konnectorService = new KonnectorService(client)
     async function getData() {
-      const _konnector: Konnector = await konnectorService.fetchKonnector()
+      const _konnector: Konnector = await konnectorService.getKonnector(
+        fluidConfig.konnectorConfig.slug
+      )
       if (subscribed && _konnector) {
         setKonnector(_konnector)
       }
@@ -55,4 +52,4 @@ const KonnectorViewer: React.FC<KonnectorViewerProps> = ({
   )
 }
 
-export default withClient(KonnectorViewer)
+export default KonnectorViewerListItem
diff --git a/src/components/ContainerComponents/LegalNoticeContainer/LegalNoticeContainer.tsx b/src/components/LegalNotice/LegalNoticeLink.tsx
similarity index 75%
rename from src/components/ContainerComponents/LegalNoticeContainer/LegalNoticeContainer.tsx
rename to src/components/LegalNotice/LegalNoticeLink.tsx
index e5d82a9e0d5dc47587a176c492b86287056d115a..9118ef5f425c3c7289e8b8750ab67a9970400dd7 100644
--- a/src/components/ContainerComponents/LegalNoticeContainer/LegalNoticeContainer.tsx
+++ b/src/components/LegalNotice/LegalNoticeLink.tsx
@@ -1,25 +1,20 @@
 import React from 'react'
 import { NavLink } from 'react-router-dom'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 
 import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import LegalNoticeIcon from 'assets/icons/ico/legal-notice.svg'
 
-interface LegalNoticeContainerProps {
-  t: Function
-}
-
-const LegalNoticeContainer: React.FC<LegalNoticeContainerProps> = ({
-  t,
-}: LegalNoticeContainerProps) => {
+const LegalNoticeLink: React.FC = () => {
+  const { t } = useI18n()
   return (
     <div className="legal-notice-root">
       <div className="legal-notice-content">
         <div className="legal-notice-header text-14-normal-uppercase">
           {t('LEGAL.TITLE_LEGAL')}
         </div>
-        <NavLink className="legal-notice-card-link" to="parameters/legalnotice">
+        <NavLink className="legal-notice-card-link" to="options/legalnotice">
           <StyledCard>
             <div className="legal-notice-card">
               <div className="legal-notice-card-content">
@@ -40,4 +35,4 @@ const LegalNoticeContainer: React.FC<LegalNoticeContainerProps> = ({
   )
 }
 
-export default translate()(LegalNoticeContainer)
+export default LegalNoticeLink
diff --git a/src/components/ContainerComponents/ViewContainer/LegalNoticeViewContainer.tsx b/src/components/LegalNotice/LegalNoticeView.tsx
similarity index 98%
rename from src/components/ContainerComponents/ViewContainer/LegalNoticeViewContainer.tsx
rename to src/components/LegalNotice/LegalNoticeView.tsx
index ac17fa31bf2cda767983b26c2f47f1e085828871..61526a68473122b737ab718f0f02c2656c480d27 100644
--- a/src/components/ContainerComponents/ViewContainer/LegalNoticeViewContainer.tsx
+++ b/src/components/LegalNotice/LegalNoticeView.tsx
@@ -1,9 +1,9 @@
 import React, { useState } from 'react'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
 
-const LegalNoticeViewContainer: React.FC = () => {
+const LegalNoticeView: React.FC = () => {
   const [headerHeight, setHeaderHeight] = useState<number>(0)
   const defineHeaderHeight = (height: number) => {
     setHeaderHeight(height)
@@ -328,4 +328,4 @@ const LegalNoticeViewContainer: React.FC = () => {
   )
 }
 
-export default LegalNoticeViewContainer
+export default LegalNoticeView
diff --git a/src/components/Navbar/Navbar.tsx b/src/components/Navbar/Navbar.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0b617b9b22b7610edcf78765ce37710e498bc8dc
--- /dev/null
+++ b/src/components/Navbar/Navbar.tsx
@@ -0,0 +1,80 @@
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { NavLink } from 'react-router-dom'
+
+import ConsoIconOn from 'assets/icons/tabbar/conso/conso-on.svg'
+import ConsoIconOff from 'assets/icons/tabbar/conso/conso-off.svg'
+import ChallengeIconOn from 'assets/icons/tabbar/defi/defi-on.svg'
+import ChallengeIconOff from 'assets/icons/tabbar/defi/defi-off.svg'
+import ParameterIconOn from 'assets/icons/tabbar/parametre/parametre-on.svg'
+import ParameterIconOff from 'assets/icons/tabbar/parametre/parametre-off.svg'
+import EcogestesIconOn from 'assets/icons/tabbar/ecogeste/ecogeste-on.svg'
+import EcogestesIconOff from 'assets/icons/tabbar/ecogeste/ecogeste-off.svg'
+import logoGrandLyon from 'assets/icons/tabbar/grand-lyon.svg'
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import { useRecoilValue } from 'recoil'
+import { challengeNotificationState } from 'atoms/notification.state'
+
+export const Navbar = () => {
+  const { t } = useI18n()
+  const challengeNotification = useRecoilValue(challengeNotificationState)
+
+  return (
+    <aside className="o-sidebar">
+      <nav>
+        <ul className="c-nav">
+          <li className="c-nav-item">
+            <NavLink
+              to="/consumption"
+              className="c-nav-link"
+              activeClassName="is-active"
+            >
+              <StyledIcon className="c-nav-icon off" icon={ConsoIconOff} />
+              <StyledIcon className="c-nav-icon on" icon={ConsoIconOn} />
+              {t('Nav.consumption')}
+            </NavLink>
+          </li>
+          <li className="c-nav-item">
+            <NavLink
+              to="/challenges"
+              className="c-nav-link"
+              activeClassName="is-active"
+            >
+              {challengeNotification && (
+                <div className="nb-challenge-notif">1</div>
+              )}
+              <StyledIcon className="c-nav-icon off" icon={ChallengeIconOff} />
+              <StyledIcon className="c-nav-icon on" icon={ChallengeIconOn} />
+              {t('Nav.challenges')}
+            </NavLink>
+          </li>
+          <li className="c-nav-item">
+            <NavLink
+              to="/ecogestures"
+              className="c-nav-link"
+              activeClassName="is-active"
+            >
+              <StyledIcon className="c-nav-icon off" icon={EcogestesIconOff} />
+              <StyledIcon className="c-nav-icon on" icon={EcogestesIconOn} />
+              {t('Nav.ECOGESTURES')}
+            </NavLink>
+          </li>
+          <li className="c-nav-item">
+            <NavLink
+              to="/options"
+              className="c-nav-link"
+              activeClassName="is-active"
+            >
+              <StyledIcon className="c-nav-icon off" icon={ParameterIconOff} />
+              <StyledIcon className="c-nav-icon on" icon={ParameterIconOn} />
+              {t('Nav.options')}
+            </NavLink>
+          </li>
+        </ul>
+      </nav>
+      <StyledIcon className="logo-grand-lyon" icon={logoGrandLyon} size={100} />
+    </aside>
+  )
+}
+
+export default Navbar
diff --git a/src/components/Options/OptionsView.tsx b/src/components/Options/OptionsView.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e4ec05a44bc8765002de3cdcce0f2b4320fe43b7
--- /dev/null
+++ b/src/components/Options/OptionsView.tsx
@@ -0,0 +1,34 @@
+import React, { useState } from 'react'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import KonnectorViewerList from 'components/Konnector/KonnectorViewerList'
+// import ReportOptions from 'components/Options/ReportOptions'
+import FAQLink from 'components/FAQ/FAQLink'
+import LegalNoticeLink from 'components/LegalNotice/LegalNoticeLink'
+import Version from 'components/Version/Version'
+
+const OptionsView: React.FC = () => {
+  const [headerHeight, setHeaderHeight] = useState<number>(0)
+  const defineHeaderHeight = (height: number) => {
+    setHeaderHeight(height)
+  }
+  return (
+    <>
+      <CozyBar titleKey={'COMMON.APP_OPTIONS_TITLE'} />
+      <Header
+        setHeaderHeight={defineHeaderHeight}
+        desktopTitleKey={'COMMON.APP_OPTIONS_TITLE'}
+      ></Header>
+      <Content height={headerHeight}>
+        <KonnectorViewerList isParam={true} />
+        {/* <ReportOptions /> */}
+        <FAQLink />
+        <LegalNoticeLink />
+        <Version />
+      </Content>
+    </>
+  )
+}
+
+export default OptionsView
diff --git a/src/components/Options/ReportOptions.tsx b/src/components/Options/ReportOptions.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..4ba49f8528cfa5886b6ae2c15c96ed373c81d841
--- /dev/null
+++ b/src/components/Options/ReportOptions.tsx
@@ -0,0 +1,73 @@
+import React, { useCallback } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+import { useRecoilState } from 'recoil'
+import UserProfileService from 'services/userProfile.service'
+import { userProfileState } from 'atoms/userProfile.state'
+import { UserProfile } from 'models'
+
+const ReportOptions: React.FC = () => {
+  const { t } = useI18n()
+  const client = useClient()
+  const [userProfile, setUserProfile] = useRecoilState<UserProfile>(
+    userProfileState
+  )
+
+  const updateUserProfileReport = useCallback(
+    async (value: boolean) => {
+      const userProfileService = new UserProfileService(client)
+      await userProfileService
+        .updateUserProfile({ report: value })
+        .then(updatedUserProfile => {
+          updatedUserProfile && setUserProfile(updatedUserProfile)
+        })
+    },
+    [setUserProfile]
+  )
+
+  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
+    e.target.value === 'true'
+      ? updateUserProfileReport(true)
+      : updateUserProfileReport(false)
+  }
+
+  return (
+    <div className="report-root">
+      <div className="report-content">
+        <div className="head text-14-normal-uppercase">
+          {t('PROFILE.REPORT.TITLE')}
+        </div>
+        <form action="" className="radios">
+          <div className="input">
+            <input
+              id="monthly"
+              name="report"
+              type="radio"
+              value="true"
+              onChange={handleChange}
+              checked={
+                userProfile && userProfile.report === true ? true : false
+              }
+            ></input>
+            <label htmlFor="monthly"> {t('PROFILE.REPORT.MONTHLY')}</label>
+          </div>
+          <div className="input">
+            <input
+              id="never"
+              name="report"
+              type="radio"
+              value="false"
+              onChange={handleChange}
+              checked={
+                userProfile && userProfile.report === false ? true : false
+              }
+            ></input>
+            <label htmlFor="never"> {t('PROFILE.REPORT.NEVER')}</label>
+          </div>
+        </form>
+      </div>
+    </div>
+  )
+}
+
+export default ReportOptions
diff --git a/src/components/ContentComponents/PerformanceIndicator/FluidPerformanceIndicator.tsx b/src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx
similarity index 54%
rename from src/components/ContentComponents/PerformanceIndicator/FluidPerformanceIndicator.tsx
rename to src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx
index ff20ad148d09aa04172fc25204fa102e320b657d..64c26c94e14a87ac21faaec05f60bf8d1b0224d8 100644
--- a/src/components/ContentComponents/PerformanceIndicator/FluidPerformanceIndicator.tsx
+++ b/src/components/PerformanceIndicator/FluidPerformanceIndicator.tsx
@@ -1,51 +1,35 @@
 import React from 'react'
 import { NavLink } from 'react-router-dom'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
+
 import { FluidType } from 'enum/fluid.enum'
-import { getPicto } from 'utils/utils'
-import { IPerformanceIndicator } from 'services/dataConsumptionContracts'
+import { PerformanceIndicator } from 'models'
+import { getPicto } from 'utils/picto'
+import { formatNumberValues } from 'utils/utils'
+
 import StyledCard from 'components/CommonKit/Card/StyledCard'
 import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
 import BlackArrowIcon from 'assets/icons/ico/black-arrow.svg'
-import { formatNumberValues } from 'utils/utils'
+import ConverterService from 'services/converter.service'
 
 interface FluidPerformanceIndicatorProps {
-  performanceIndicator: IPerformanceIndicator
-  timePeriodText: string
+  performanceIndicator: PerformanceIndicator
   fluidType: FluidType
-  t: any
 }
 
 const FluidPerformanceIndicator: React.FC<FluidPerformanceIndicatorProps> = ({
   performanceIndicator,
-  timePeriodText,
   fluidType,
-  t,
 }: FluidPerformanceIndicatorProps) => {
+  const { t } = useI18n()
   const iconType = getPicto(fluidType)
+  const converterService = new ConverterService()
 
   let displayedValue: string
   if (performanceIndicator && performanceIndicator.value)
     displayedValue = formatNumberValues(performanceIndicator.value).toString()
   else displayedValue = '-----'
 
-  let perf: number | null = null
-  if (
-    performanceIndicator &&
-    performanceIndicator.value &&
-    performanceIndicator.compareValue
-  ) {
-    perf =
-      100 * (performanceIndicator.value / performanceIndicator.compareValue - 1)
-  }
-  const perfString = perf ? formatNumberValues(perf) : ''
-
-  let perfStatus = 'error'
-  if (perf === null) perfStatus = 'nodata'
-  else if (perf === 0) perfStatus = 'zero'
-  else if (perf > 0) perfStatus = 'positive'
-  else if (perf < 0) perfStatus = 'negative'
-
   return (
     <NavLink
       className="fpi-link"
@@ -71,25 +55,19 @@ const FluidPerformanceIndicator: React.FC<FluidPerformanceIndicatorProps> = ({
                   <span className="card-indicator">
                     {t('FLUID.' + FluidType[fluidType] + '.UNIT')}
                   </span>
+                  <span
+                    className={`${FluidType[fluidType] + '-color euro-value'}`}
+                  >
+                    {performanceIndicator &&
+                      performanceIndicator.value &&
+                      `${formatNumberValues(
+                        converterService.LoadToEuro(
+                          performanceIndicator.value,
+                          fluidType
+                        )
+                      )} €`}
+                  </span>
                 </div>
-                {perfStatus === 'positive' ||
-                perfStatus === 'negative' ||
-                perfStatus === 'zero' ? (
-                  <div className="fpi-content-perf-indicator card-text">
-                    <span
-                      className={`fpi-content-perf-indicator-kpi ${perfStatus} card-text-bold`}
-                    >
-                      {perfStatus === 'positive' ? '+' : ''}
-                      {perfString}%
-                    </span>
-                    <span> / {timePeriodText}</span>
-                  </div>
-                ) : (
-                  <div className="fpi-content-perf-indicator card-text">
-                    <div> {t('INDICATOR.ERROR_NO_COMPARE')} </div>
-                    <div> {t('INDICATOR.ERROR_NO_COMPARE_REASON')} </div>
-                  </div>
-                )}
               </div>
             </div>
           </div>
@@ -102,4 +80,4 @@ const FluidPerformanceIndicator: React.FC<FluidPerformanceIndicatorProps> = ({
   )
 }
 
-export default translate()(FluidPerformanceIndicator)
+export default FluidPerformanceIndicator
diff --git a/src/components/PerformanceIndicator/PerformanceIndicatorContent.tsx b/src/components/PerformanceIndicator/PerformanceIndicatorContent.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..5ed4dc05a39b27435ea487e0c9e2a5087cfec7de
--- /dev/null
+++ b/src/components/PerformanceIndicator/PerformanceIndicatorContent.tsx
@@ -0,0 +1,161 @@
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+
+import { TimeStep } from 'enum/timeStep.enum'
+import { PerformanceIndicator } from 'models'
+import { formatNumberValues } from 'utils/utils'
+
+import StyledIcon from 'components/CommonKit/Icon/StyledIcon'
+import PileIcon from 'assets/icons/ico/coins.svg'
+
+import GreenIndicatorIcon from 'assets/icons/visu/indicator/green.svg'
+import RedIndicatorIcon from 'assets/icons/visu/indicator/red.svg'
+import GreyIndicatorIcon from 'assets/icons/visu/indicator/grey.svg'
+import ErrorIndicatorIcon from 'assets/icons/visu/indicator/error.svg'
+import NodataIndicatorIcon from 'assets/icons/visu/indicator/nodata.svg'
+
+interface PerformanceIndicatorContentProps {
+  performanceIndicator: PerformanceIndicator
+  timeStep: TimeStep
+}
+
+const PerformanceIndicatorContent: React.FC<PerformanceIndicatorContentProps> = ({
+  performanceIndicator,
+  timeStep,
+}: PerformanceIndicatorContentProps) => {
+  const { t } = useI18n()
+  let displayedValue: string
+  if (performanceIndicator && performanceIndicator.value)
+    displayedValue = formatNumberValues(performanceIndicator.value).toString()
+  else displayedValue = '-----'
+
+  let errorInPerf = false
+  if (performanceIndicator && !performanceIndicator.value) {
+    errorInPerf = true
+  }
+
+  let perf: number | null = null
+  let diffInEuro: number | null = null
+  if (
+    performanceIndicator &&
+    performanceIndicator.value &&
+    performanceIndicator.compareValue
+  ) {
+    perf =
+      100 * (performanceIndicator.value / performanceIndicator.compareValue - 1)
+    diffInEuro = performanceIndicator.value - performanceIndicator.compareValue
+  }
+  const perfString = perf ? formatNumberValues(perf) : ''
+  const diffString = diffInEuro ? formatNumberValues(diffInEuro) : ''
+
+  let perfStatus = ['error', ErrorIndicatorIcon]
+  if (perf === null && !errorInPerf)
+    perfStatus = ['nodata', NodataIndicatorIcon]
+  else if (perf === null && errorInPerf)
+    perfStatus = ['error', ErrorIndicatorIcon]
+  else if (perf && perf === 0) perfStatus = ['zero', GreyIndicatorIcon]
+  else if (perf && perf > 0) perfStatus = ['positive', RedIndicatorIcon]
+  else if (perf && perf < 0) perfStatus = ['negative', GreenIndicatorIcon]
+
+  const getRelevantFrequencyLabel = (_timeStep: TimeStep) => {
+    let frequency = 'COMMON.'
+    switch (_timeStep) {
+      case TimeStep.HALF_AN_HOUR:
+        frequency += 'DAILY_FRENQUENCY'
+        break
+
+      case TimeStep.HOUR:
+        frequency += 'DAILY_FRENQUENCY'
+        break
+
+      case TimeStep.DAY:
+        frequency += 'WEEKLY_FRENQUENCY'
+        break
+
+      case TimeStep.MONTH:
+        frequency += 'MONTHLY_FRENQUENCY'
+        break
+
+      case TimeStep.YEAR:
+        frequency += 'YEARLY_FRENQUENCY'
+        break
+
+      default:
+        return ''
+    }
+
+    return frequency
+  }
+
+  return (
+    <div className="fpi">
+      <div className="fpi-left">
+        <div className="fpi-content">
+          <div className="fpi-content-perf">
+            <div className="fpi-content-perf-result card-result">
+              <div className="icon-line">
+                <StyledIcon
+                  className="fpi-content-icon perf-icon"
+                  icon={PileIcon}
+                  size={35}
+                />
+                <div>
+                  <span className="euro-value">{displayedValue}</span>
+                  <span className="card-indicator"> €</span>
+                </div>
+              </div>
+            </div>
+            {perfStatus[0] === 'positive' ||
+            perfStatus[0] === 'negative' ||
+            perfStatus[0] === 'zero' ? (
+              <div className="fpi-content-perf-indicator bilan-card card-text">
+                <div className="icon-line">
+                  <StyledIcon
+                    className="fpi-content-icon perf-icon"
+                    icon={perfStatus[1]}
+                    size={35}
+                  />
+                  <div className="evolution-text">
+                    {t('INDICATOR.BILAN.TEXT1')}
+                    <span
+                      className={`fpi-content-perf-indicator-kpi ${perfStatus[0]} card-text-bold`}
+                    >
+                      {perfStatus[0] === 'positive' ? ' + ' : ' '}
+                      {perfString}%
+                    </span>
+                    <br />
+                    <span>
+                      {t('INDICATOR.BILAN.TEXT2')}
+                      <span className="diff-value">{diffString} €</span>
+                      <br />
+                      {t(
+                        'INDICATOR.BILAN.' +
+                          `${getRelevantFrequencyLabel(timeStep)}`
+                      )}
+                    </span>
+                  </div>
+                </div>
+              </div>
+            ) : (
+              <div className="fpi-content-perf-indicator card-text error">
+                <StyledIcon
+                  className="fpi-content-icon perf-icon"
+                  icon={perfStatus[1]}
+                  size={35}
+                />
+                <div>
+                  {' '}
+                  <div> {t('INDICATOR.ERROR_NO_COMPARE')} </div>
+                  <div> {t('INDICATOR.ERROR_NO_COMPARE_REASON')} </div>
+                </div>
+              </div>
+            )}
+          </div>
+        </div>
+      </div>
+      <div className="fpi-right"></div>
+    </div>
+  )
+}
+
+export default PerformanceIndicatorContent
diff --git a/src/components/Routes/Routes.tsx b/src/components/Routes/Routes.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..7b9cf70c6720ac0b89b59b74ac8ba032672e7104
--- /dev/null
+++ b/src/components/Routes/Routes.tsx
@@ -0,0 +1,85 @@
+import React from 'react'
+import { Route, Switch, Redirect } from 'react-router-dom'
+import { FluidType } from 'enum/fluid.enum'
+
+import HomeView from 'components/Home/HomeView'
+import SingleFluidView from 'components/SingleFluid/SingleFluidView'
+import ChallengeView from 'components/Challenge/ChallengeView'
+import LockedChallengeDetailsViewContainer from 'components/Challenge/LockedChallengeDetailsViewContainer'
+import AvailableChallengeDetailsView from 'components/Challenge/AvailableChallengeDetailsView'
+import OngoingChallengeDetailsView from 'components/Challenge/OngoingChallengeDetailsView'
+import FinishedChallengeDetailsView from 'components/Challenge/FinishedChallengeDetailsView'
+import EcogestureView from 'components/Ecogesture/EcogestureView'
+import OptionsView from 'components/Options/OptionsView'
+import FAQView from 'components/FAQ/FAQView'
+import LegalNoticeView from 'components/LegalNotice/LegalNoticeView'
+
+const Routes = () => {
+  return (
+    <Switch>
+      <Route
+        path="/consumption"
+        render={({ match: { url } }) => (
+          <>
+            <Route
+              path={`${url}/electricité`}
+              component={() => (
+                <SingleFluidView fluidTypes={[FluidType.ELECTRICITY]} />
+              )}
+            />
+            <Route
+              path={`${url}/eau`}
+              component={() => (
+                <SingleFluidView fluidTypes={[FluidType.WATER]} />
+              )}
+            />
+            <Route
+              path={`${url}/gaz`}
+              component={() => <SingleFluidView fluidTypes={[FluidType.GAS]} />}
+            />
+            <Route path={`${url}/`} component={HomeView} exact />
+          </>
+        )}
+      />
+      <Route
+        path="/challenges"
+        render={({ match: { url } }) => (
+          <>
+            <Route
+              path={`${url}/locked`}
+              component={LockedChallengeDetailsViewContainer}
+            />
+            <Route
+              path={`${url}/available`}
+              component={AvailableChallengeDetailsView}
+            />
+            <Route
+              path={`${url}/ongoing`}
+              component={OngoingChallengeDetailsView}
+            />
+            <Route
+              path={`${url}/finished`}
+              component={FinishedChallengeDetailsView}
+            />
+            <Route path={`${url}/`} component={ChallengeView} exact />
+          </>
+        )}
+      />
+      <Route path="/ecogestures" component={EcogestureView} />
+      <Route
+        path="/options"
+        render={({ match: { url } }) => (
+          <>
+            <Route path={`${url}/FAQ`} component={FAQView} />
+            <Route path={`${url}/legalnotice`} component={LegalNoticeView} />
+            <Route path={`${url}/`} component={OptionsView} exact />
+          </>
+        )}
+      />
+      <Redirect from="/" to="/consumption" />
+      <Redirect from="*" to="/consumption" />
+    </Switch>
+  )
+}
+
+export default Routes
diff --git a/src/components/ContainerComponents/IndicatorsContainer/SingleFluidIndicatorsContainer.tsx b/src/components/SingleFluid/SingleFluidIndicators.tsx
similarity index 50%
rename from src/components/ContainerComponents/IndicatorsContainer/SingleFluidIndicatorsContainer.tsx
rename to src/components/SingleFluid/SingleFluidIndicators.tsx
index 3147c6643490d5ccf39e33617130d908a4d10193..cbb60c5f445e2d30ae21641a22d1eda28c424a40 100644
--- a/src/components/ContainerComponents/IndicatorsContainer/SingleFluidIndicatorsContainer.tsx
+++ b/src/components/SingleFluid/SingleFluidIndicators.tsx
@@ -1,67 +1,65 @@
-import React, { useEffect, useContext, useState } from 'react'
-import { AppContext } from 'components/Contexts/AppContextProvider'
-import {
-  TimeStep,
-  IPerformanceIndicator,
-  ITimePeriod,
-} from 'services/dataConsumptionContracts'
+import React, { useEffect, useState } from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import { useClient } from 'cozy-client'
+import { useRecoilValue } from 'recoil'
+
+import { TimeStep } from 'enum/timeStep.enum'
 import { FluidType } from 'enum/fluid.enum'
-import { withClient, Client } from 'cozy-client'
-import PerformanceIndicator from 'components/ContentComponents/PerformanceIndicator/PerformanceIndicator'
-import ConsumptionPeriodSelector from 'services/consumptionPeriodSelectorService'
-import ConsumptionDataManager from 'services/consumptionDataManagerService'
-import PerformanceIndicatorAggregateCalculator from 'services/performanceIndicatorAggregateCalculatorService'
-import { translate } from 'cozy-ui/react/I18n'
-import { convertDateByTimeStep } from 'utils/utils'
-import RedirectionMiniCard from 'components/ContentComponents/Card/RedirectionMiniCard'
+import { fluidTypeState } from 'atoms/fluidState.state'
+import { TimePeriod, PerformanceIndicator } from 'models'
+import { convertDateByTimeStep } from 'utils/date'
+import TimePeriodService from 'services/timePeriod.service'
+import ConsumptionService from 'services/consumption.service'
+import PerformanceIndicatorService from 'services/performanceIndicator.service'
+
+import PerformanceIndicatorContent from 'components/PerformanceIndicator/PerformanceIndicatorContent'
+import SingleFluidRedirect from 'components/SingleFluid/SingleFluidRedirect'
 
-interface SingleFluidIndicatorsContainerProps {
+interface SingleFluidIndicatorsProps {
   timeStep: TimeStep
   setIndicatorsLoaded(): void
-  client: Client
   fluidTypes: FluidType[]
-  t: Function
 }
 
-const SingleFluidIndicatorsContainer: React.FC<SingleFluidIndicatorsContainerProps> = ({
+const SingleFluidIndicators: React.FC<SingleFluidIndicatorsProps> = ({
   timeStep,
   setIndicatorsLoaded,
-  client,
   fluidTypes,
-  t,
-}: SingleFluidIndicatorsContainerProps) => {
-  const appContext = useContext(AppContext)
-  const allConfiguredFluidTypes = appContext.fluidTypes
+}: SingleFluidIndicatorsProps) => {
+  const { t } = useI18n()
+  const client = useClient()
+  const allConfiguredFluidTypes = useRecoilValue(fluidTypeState)
 
   const [performanceIndicators, setPerformanceIndicators] = useState<
-    IPerformanceIndicator[]
+    PerformanceIndicator[]
   >([])
-  const [
-    currentTimePeriod,
-    setCurrentTimePeriod,
-  ] = useState<ITimePeriod | null>(null)
+  const [currentTimePeriod, setCurrentTimePeriod] = useState<TimePeriod | null>(
+    null
+  )
   const [
     comparisonTimePeriod,
     setComparisonTimePeriod,
-  ] = useState<ITimePeriod | null>(null)
+  ] = useState<TimePeriod | null>(null)
   const filteredFluidTypes = allConfiguredFluidTypes.filter(
     fluidType => fluidType !== fluidTypes[0]
   )
   const [isLoaded, setIsLoaded] = useState<boolean>(false)
 
+  const performanceIndicatorService = new PerformanceIndicatorService()
+
   useEffect(() => {
     async function populatePerformanceIndicators() {
-      const cdm = new ConsumptionDataManager(client)
-      const lastDate = await cdm.fetchLastDateData(fluidTypes)
+      const consumptionService = new ConsumptionService(client)
+      const lastDate = await consumptionService.fetchLastDateData(fluidTypes)
 
       if (lastDate) {
-        const consumptionPeriodSelector = new ConsumptionPeriodSelector()
-        const periods = consumptionPeriodSelector.getTimePeriods(
+        const timePeriodService = new TimePeriodService()
+        const periods = timePeriodService.getTimePeriods(
           lastDate,
           fluidTypes,
           timeStep
         )
-        const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
+        const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
           periods.timePeriod,
           timeStep,
           fluidTypes,
@@ -91,8 +89,8 @@ const SingleFluidIndicatorsContainer: React.FC<SingleFluidIndicatorsContainerPro
               {convertDateByTimeStep(currentTimePeriod, timeStep, true)}
             </div>
 
-            <PerformanceIndicator
-              performanceIndicator={PerformanceIndicatorAggregateCalculator.aggregatePerformanceIndicators(
+            <PerformanceIndicatorContent
+              performanceIndicator={performanceIndicatorService.aggregatePerformanceIndicators(
                 performanceIndicators
               )}
               timePeriodText={convertDateByTimeStep(
@@ -108,10 +106,7 @@ const SingleFluidIndicatorsContainer: React.FC<SingleFluidIndicatorsContainerPro
                   {t('COMMON.MINI_CARDS_LABEL')}
                 </div>
                 <div className="sfi-redirect">
-                  <RedirectionMiniCard
-                    fluidTypes={filteredFluidTypes}
-                    timeStep={timeStep}
-                  />
+                  <SingleFluidRedirect fluidTypes={filteredFluidTypes} />
                 </div>
               </>
             )}
@@ -122,4 +117,4 @@ const SingleFluidIndicatorsContainer: React.FC<SingleFluidIndicatorsContainerPro
   )
 }
 
-export default translate()(withClient(SingleFluidIndicatorsContainer))
+export default SingleFluidIndicators
diff --git a/src/components/ContentComponents/Card/RedirectionMiniCard.tsx b/src/components/SingleFluid/SingleFluidRedirect.tsx
similarity index 63%
rename from src/components/ContentComponents/Card/RedirectionMiniCard.tsx
rename to src/components/SingleFluid/SingleFluidRedirect.tsx
index 488f3bdc71c840b2c2e8394a1705d394cae0544e..e0cfdd09efb033c596464ce4f53f553a4faf7585 100644
--- a/src/components/ContentComponents/Card/RedirectionMiniCard.tsx
+++ b/src/components/SingleFluid/SingleFluidRedirect.tsx
@@ -1,24 +1,17 @@
 import React from 'react'
-import Icon from 'cozy-ui/react/Icon'
-import { translate } from 'cozy-ui/react/I18n'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import { FluidType } from 'enum/fluid.enum'
-import { getPicto, getCardColor } from 'utils/utils'
-import { ProcessedData } from 'services/fluidService'
 import StyledIconCard from 'components/CommonKit/Card/StyledIconCard'
 import { NavLink } from 'react-router-dom'
-import { TimeStep } from 'services/dataConsumptionContracts'
 
-export interface RedirectionMiniCard {
+export interface SingleFluidRedirectProps {
   fluidTypes: FluidType[]
-  t: Function
-  timeStep: TimeStep
 }
 
-const RedirectionMiniCard: React.FC<RedirectionMiniCard> = ({
+const SingleFluidRedirect: React.FC<SingleFluidRedirectProps> = ({
   fluidTypes,
-  t,
-  timeStep,
-}: RedirectionMiniCard) => {
+}: SingleFluidRedirectProps) => {
+  const { t } = useI18n()
   return (
     <>
       {fluidTypes.map(fluidType => (
@@ -42,4 +35,4 @@ const RedirectionMiniCard: React.FC<RedirectionMiniCard> = ({
   )
 }
 
-export default translate()(RedirectionMiniCard)
+export default SingleFluidRedirect
diff --git a/src/components/ContainerComponents/ViewContainer/SingleFluidViewContainer.tsx b/src/components/SingleFluid/SingleFluidView.tsx
similarity index 61%
rename from src/components/ContainerComponents/ViewContainer/SingleFluidViewContainer.tsx
rename to src/components/SingleFluid/SingleFluidView.tsx
index 9394f64f5f368eb045273a8ba4d913ff97c63d99..53d5d42e7832e5a28518d53ab6afa659b360b961 100644
--- a/src/components/ContainerComponents/ViewContainer/SingleFluidViewContainer.tsx
+++ b/src/components/SingleFluid/SingleFluidView.tsx
@@ -1,29 +1,30 @@
-import React, { useState, useEffect, useContext } from 'react'
-import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
-import CozyBar from 'components/ContainerComponents/CozyBar/CozyBar'
-import Header from 'components/ContainerComponents/Header/Header'
-import Content from 'components/ContainerComponents/Content/Content'
-import FluidChartContainer from 'components/ContainerComponents/FluidChartContainer/FluidChartContainer'
+import React, { useState } from 'react'
+import { useRecoilState } from 'recoil'
+
 import { FluidType } from 'enum/fluid.enum'
-import { TimeStep } from 'services/dataConsumptionContracts'
-import ConsumptionNavigator from 'components/ContentComponents/ConsumptionNavigator/ConsumptionNavigator'
-import SingleFluidIndicatorsContainer from 'components/ContainerComponents/IndicatorsContainer/SingleFluidIndicatorsContainer'
-import { AppContext } from 'components/Contexts/AppContextProvider'
+import { TimeStep } from 'enum/timeStep.enum'
+import { previousTimeStepState } from 'atoms/chart.state'
+
+import StyledSpinner from 'components/CommonKit/Spinner/StyledSpinner'
+import CozyBar from 'components/Header/CozyBar'
+import Header from 'components/Header/Header'
+import Content from 'components/Content/Content'
+import FluidChart from 'components/FluidChart/FluidChart'
+import ConsumptionNavigator from 'components/ConsumptionNavigator/ConsumptionNavigator'
+import SingleFluidIndicators from 'components/SingleFluid/SingleFluidIndicators'
 
-interface SingleFluidViewContainerProps {
+interface SingleFluidViewProps {
   fluidTypes: FluidType[]
 }
-const SingleFluidViewContainer: React.FC<SingleFluidViewContainerProps> = ({
+const SingleFluidView: React.FC<SingleFluidViewProps> = ({
   fluidTypes,
-}: SingleFluidViewContainerProps) => {
-  const { setPreviousTimeStep, previousTimeStep, chartIsLoaded } = useContext(
-    AppContext
+}: SingleFluidViewProps) => {
+  const [previousTimeStep, setPreviousTimeStep] = useRecoilState(
+    previousTimeStepState
   )
 
-  const [timeStep, setTimeStep] = useState<TimeStep | null>(
-    previousTimeStep && previousTimeStep !== TimeStep.HALF_AN_HOUR
-      ? previousTimeStep
-      : TimeStep.DAY
+  const [timeStep, setTimeStep] = useState<TimeStep>(
+    previousTimeStep !== TimeStep.HALF_AN_HOUR ? previousTimeStep : TimeStep.DAY
   )
   const [resetRefenceDate, setResetReferenceDate] = useState<boolean>(false)
   const [headerHeight, setHeaderHeight] = useState<number>(0)
@@ -73,19 +74,19 @@ const SingleFluidViewContainer: React.FC<SingleFluidViewContainerProps> = ({
         />
       </Header>
       <Content height={headerHeight}>
-        {(isChartLoading || isIndicatorsLoading || !chartIsLoaded) && (
+        {(isChartLoading || isIndicatorsLoading) && (
           <div className="content-view-loading">
             <StyledSpinner size="5em" fluidTypes={fluidTypes} />
           </div>
         )}
         <div
           className={`${
-            isChartLoading || isIndicatorsLoading || !chartIsLoaded
+            isChartLoading || isIndicatorsLoading
               ? 'chart-indicator-none'
               : 'chart-indicator-block'
           }`}
         >
-          <FluidChartContainer
+          <FluidChart
             timeStep={timeStep}
             fluidTypes={fluidTypes}
             resetReferenceDate={resetRefenceDate}
@@ -93,7 +94,7 @@ const SingleFluidViewContainer: React.FC<SingleFluidViewContainerProps> = ({
             handleClickTimeStep={handleClickTimeStepForFluidContainer}
             setChartLoaded={setChartLoaded}
           />
-          <SingleFluidIndicatorsContainer
+          <SingleFluidIndicators
             timeStep={timeStep}
             setIndicatorsLoaded={setIndicatorsLoaded}
             fluidTypes={fluidTypes}
@@ -104,4 +105,4 @@ const SingleFluidViewContainer: React.FC<SingleFluidViewContainerProps> = ({
   )
 }
 
-export default SingleFluidViewContainer
+export default SingleFluidView
diff --git a/src/components/Splash/SplashRoot.tsx b/src/components/Splash/SplashRoot.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..a0f4711934e7cf5a221a9ebe1ecff28c3aaf1832
--- /dev/null
+++ b/src/components/Splash/SplashRoot.tsx
@@ -0,0 +1,126 @@
+import React, { useState, useEffect, ComponentType, ReactNode } from 'react'
+import { useClient } from 'cozy-client'
+import { useRecoilValue, useSetRecoilState } from 'recoil'
+import classNames from 'classnames'
+import { fluidStatusState, fluidTypeState } from 'atoms/fluidState.state'
+import { userProfileState } from 'atoms/userProfile.state'
+import { currentChallengeState } from 'atoms/challenge.state'
+import { challengeNotificationState } from 'atoms/notification.state'
+import InitializationService from 'services/initialization.service'
+
+interface SplashRootProps {
+  fadeTimer?: number
+  splashComponent: ComponentType
+  splashErrorComponent: ComponentType
+  children: ReactNode
+}
+
+/**
+ * Added splash screen if data is not ready
+ * @param params {{ fadeTimer, splashComponent, children }}
+ */
+const SplashRoot = ({
+  fadeTimer = 1000,
+  splashComponent: SplashComponent,
+  splashErrorComponent: SplashErrorComponent,
+  children,
+}: SplashRootProps) => {
+  const client = useClient()
+  const [{ splashEnd, splashStart }, setState] = useState({
+    splashEnd: false,
+    splashStart: false,
+  })
+  const [error, setError] = useState<Error | null>(null)
+  const setUserProfile = useSetRecoilState(userProfileState)
+  const fluidTypes = useRecoilValue(fluidTypeState)
+  const setFluidStatusState = useSetRecoilState(fluidStatusState)
+  const setCurrentChallengeState = useSetRecoilState(currentChallengeState)
+  const setChallengeNotificationState = useSetRecoilState(
+    challengeNotificationState
+  )
+
+  useEffect(() => {
+    let timeoutSplash: NodeJS.Timeout
+    if (splashStart) {
+      timeoutSplash = setTimeout(() => {
+        setState(prev => ({ ...prev, splashEnd: true }))
+      }, fadeTimer)
+    }
+    return () => timeoutSplash && clearTimeout(timeoutSplash)
+  }, [splashStart, fadeTimer])
+
+  useEffect(() => {
+    let subscribed = true
+    const initializationService = new InitializationService(client)
+    async function loadData() {
+      try {
+        await initializationService.initIndex()
+        let profile = await initializationService.initUserProfile()
+        if (subscribed && profile) {
+          const resultChallengeType = await initializationService.initChallengeType(
+            profile.challengeTypeHash
+          )
+          if (
+            subscribed &&
+            resultChallengeType.result &&
+            resultChallengeType.userProfile
+          ) {
+            profile = resultChallengeType.userProfile
+          }
+          const resultEcogesture = await initializationService.initEcogesture(
+            profile.ecogestureHash
+          )
+          if (
+            subscribed &&
+            resultEcogesture.result &&
+            resultEcogesture.userProfile
+          ) {
+            profile = resultEcogesture.userProfile
+          }
+          setUserProfile(profile)
+          await initializationService.initUserChallenge()
+          // const fluidTypes = await initializationService.initFluidTypes()
+          // setFluidTypeState(fluidTypes)
+          const fluidStatus = await initializationService.initFluidStatus()
+          setFluidStatusState(fluidStatus)
+          const currentChallenge = await initializationService.initCurrentChallenge()
+          if (currentChallenge) {
+            setCurrentChallengeState(currentChallenge)
+            const isChallengeOver = await initializationService.isCurrentChallengeOver(
+              currentChallenge,
+              fluidTypes
+            )
+            setChallengeNotificationState(isChallengeOver)
+          }
+          setState(prev => ({
+            ...prev,
+            splashStart: true,
+          }))
+        }
+      } catch (err) {
+        setError(err)
+      }
+    }
+    loadData()
+    return () => {
+      subscribed = false
+    }
+  }, [])
+
+  return (
+    <>
+      {!splashEnd && (
+        <div
+          style={{ transitionDuration: `${fadeTimer / 1000}s` }}
+          className={classNames('splash-root', {
+            ['splash-fade']: splashStart,
+          })}
+        >
+          {!error ? <SplashComponent /> : <SplashErrorComponent />}
+        </div>
+      )}
+      {splashStart && children}
+    </>
+  )
+}
+export default SplashRoot
diff --git a/src/components/Splash/SplashScreen.tsx b/src/components/Splash/SplashScreen.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..e7d587555f91bf82bf286bc4388e433b9179bc0c
--- /dev/null
+++ b/src/components/Splash/SplashScreen.tsx
@@ -0,0 +1,26 @@
+import React from 'react'
+import Lottie from 'react-lottie'
+
+import * as loadingData from 'assets/anims/splash.json'
+
+const loadingOptions = {
+  loop: true,
+  autoplay: true,
+  animationData: loadingData,
+  rendererSettings: {
+    preserveAspectRatio: 'xMidYMid slice',
+  },
+}
+
+const SplashScreen: React.FC = () => {
+  return (
+    <>
+      <div className="splash-content">
+        <Lottie options={loadingOptions} height={300} width={300} />
+      </div>
+      <div className="splash-footer"></div>
+    </>
+  )
+}
+
+export default SplashScreen
diff --git a/src/components/Splash/SplashScreenError.tsx b/src/components/Splash/SplashScreenError.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..0ba708c157a512dfabf1a64b1dd40ff1f2e9b171
--- /dev/null
+++ b/src/components/Splash/SplashScreenError.tsx
@@ -0,0 +1,39 @@
+import React from 'react'
+import { useI18n } from 'cozy-ui/transpiled/react'
+import Lottie from 'react-lottie'
+import StyledButton from 'components/CommonKit/Button/StyledButton'
+
+import * as loadingData from 'assets/anims/splash.json'
+
+const loadingOptions = {
+  loop: false,
+  autoplay: false,
+  animationData: loadingData,
+  rendererSettings: {
+    preserveAspectRatio: 'xMidYMid slice',
+  },
+}
+
+const SplashScreenError: React.FC = () => {
+  const { t } = useI18n()
+  return (
+    <>
+      <div className="splash-content">
+        <Lottie options={loadingOptions} height={300} width={300} />
+      </div>
+      <div className="splash-footer">
+        <div className="splash-footer-error-text text-16-normal">
+          {t('LOADING.ERROR_LOADING')}
+        </div>
+        <StyledButton
+          className="splash-footer-button"
+          onClick={() => window.location.reload()}
+        >
+          {t('LOADING.RELOAD')}
+        </StyledButton>
+      </div>
+    </>
+  )
+}
+
+export default SplashScreenError
diff --git a/src/components/Version/Version.tsx b/src/components/Version/Version.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3f4e58db3c3b462c9956f146231bc5d99abb8ada
--- /dev/null
+++ b/src/components/Version/Version.tsx
@@ -0,0 +1,13 @@
+import React from 'react'
+import { useClient } from 'cozy-client'
+
+const Version: React.FC = () => {
+  const client = useClient()
+  return (
+    <div className="version-root text-14-normal">
+      {`v ${client.appMetadata.version}`}
+    </div>
+  )
+}
+
+export default Version
diff --git a/src/components/ContainerComponents/WelcomeModalContainer/WelcomeModalContainer.tsx b/src/components/Welcome/WelcomeModal.tsx
similarity index 73%
rename from src/components/ContainerComponents/WelcomeModalContainer/WelcomeModalContainer.tsx
rename to src/components/Welcome/WelcomeModal.tsx
index 247efaefa0b1e89e5af9279f960ba1cea67104b7..a68cb78cb1dc2f460283e8e54ce49f25762bfafd 100644
--- a/src/components/ContainerComponents/WelcomeModalContainer/WelcomeModalContainer.tsx
+++ b/src/components/Welcome/WelcomeModal.tsx
@@ -1,26 +1,28 @@
 import React from 'react'
-import { withClient, Client } from 'cozy-client'
+import { useI18n } from 'cozy-ui/transpiled/react'
 import Modal from 'components/CommonKit/Modal/Modal'
 import StyledButton from 'components/CommonKit/Button/StyledButton'
-import { translate } from 'cozy-ui/react/I18n'
 import userInstanceSettings from 'components/Hooks/userInstanceSettings'
 
 interface WelcomeModalContainerProps {
-  handleClose: () => void
-  t: Function
-  client: Client
+  open: boolean
+  handleCloseClick: () => void
 }
 
 const WelcomeModalContainer: React.FC<WelcomeModalContainerProps> = ({
-  handleClose,
-  t,
-  client,
+  open,
+  handleCloseClick,
 }: WelcomeModalContainerProps) => {
-  const { data: instanceSettings } = userInstanceSettings(client)
+  const { t } = useI18n()
+  const { data: instanceSettings } = userInstanceSettings()
 
   return (
     <React.Fragment>
-      <Modal open={true} handleCloseClick={handleClose} yellowBorder={true}>
+      <Modal
+        open={open}
+        handleCloseClick={handleCloseClick}
+        yellowBorder={true}
+      >
         <div className="wm-header text-24-bold">
           {t('COMMON.WELCOME_MODAL_TITLE')}
         </div>
@@ -36,7 +38,7 @@ const WelcomeModalContainer: React.FC<WelcomeModalContainerProps> = ({
         <div className="wm-connect text-18-bold">
           {t('COMMON.WELCOME_MODAL_CONNECT')}
         </div>
-        <StyledButton className="button-ok" onClick={handleClose}>
+        <StyledButton className="button-ok" onClick={handleCloseClick}>
           {t('COMMON.WELCOME_MODAL_OK')}
         </StyledButton>
       </Modal>
@@ -44,4 +46,4 @@ const WelcomeModalContainer: React.FC<WelcomeModalContainerProps> = ({
   )
 }
 
-export default translate()(withClient(WelcomeModalContainer))
+export default WelcomeModalContainer
diff --git a/src/cozy-bar.d.ts b/src/cozy-bar.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8b4af830ad6af6a7e9853d2138abb32b13732612
--- /dev/null
+++ b/src/cozy-bar.d.ts
@@ -0,0 +1,34 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
+declare module 'cozy-bar' {
+  type TcozyBarInitOpts = {
+    appName: string
+    appNamePrefix: string
+    appSlug?: string
+    lang: string
+    iconPath: string
+    cozyClient: Client
+    cozyURL?: string
+    ssl?: boolean
+    token?: string
+    replaceTitleOnMobile: boolean
+    isPublic?: boolean
+    onLogOut?: () => any
+  }
+
+  declare global {
+    const cozy: {
+      bar: {
+        BarCenter: () => any
+        BarLeft: () => any
+        BarRight: () => any
+        init: (opt: TcozyBarInitOpts) => any
+        setBarCenter: (e: string) => any
+        setBarLeft: (e: string) => any
+        setBarRight: (e: string) => any
+        setLocale: (e: any) => any
+        setTheme: (theme: string, opts?: any) => any
+        updateAccessToken: (e: any) => any
+      }
+    }
+  }
+}
diff --git a/src/cozy-client.d.ts b/src/cozy-client.d.ts
index c3be97b9c91d3ca9a2a686579ef8517c7b40e513..d14548709e101fdbefd8b510a5f111553f9bd903 100644
--- a/src/cozy-client.d.ts
+++ b/src/cozy-client.d.ts
@@ -1,78 +1,762 @@
-import { Component } from 'react'
-
-declare module 'cozy-client'
-
-type QueryDefinition = {
-  doctype: string
-  id: string
-  ids: Array
-  selector: object
-  fields: Array
-  indexedFields: Array
-  sort: Array
-  includes: string
-  referenced: string
-  limit: null | number
-  skip: null | number
-  cursor: unknown
-}
+/* eslint-disable @typescript-eslint/interface-name-prefix */
+/* eslint-disable @typescript-eslint/no-explicit-any */
+import { TRealtimePlugin, RealtimePlugin } from 'cozy-realtime'
+import { TDoctype } from 'doctypes'
 
-type AppMetaData = {
-  slug: string
-  version: string
-}
+declare module 'cozy-client' {
+  type QueryDefinition = {
+    where(selector: any)
+    include(relations: string[])
+  }
 
-type Offline = {
-  getDatabase: unknown
-}
-export type Client = {
-  find(doctype: string): typeof QueryDefinition
-  query(doctype: string): typeof QueryDefinition
-  destroy(document: any): typeof QueryDefinition
-  save(document: any): typeof QueryDefinition
-  create(
-    doctype: string,
-    entry: any,
-    relationships?: any
-  ): typeof QueryDefinition
-  collection(doctype: string): function
-  offline: typeof Offline
-  getStackClient: function
-  appMetadata: AppMetaData
-}
+  type QueryResult = {
+    data: any
+    included?: any
+  }
 
-export type QueryId = string
+  type AllCollections =
+    | FileCollection
+    | PermissionsCollection
+    | TriggerCollection
+    | JobCollection
+    | KonnectorCollection
+    | TaskCollection
+    | ObjectiveCollection
+    | AppointmentCollection
 
-export type QueryDefinitionBuilder = (client: Client) => QueryDefinition
+  interface IClientInstanceOpts {
+    cozyAppEditor: string
+    cozyAppName: string
+    cozyAppNamePrefix: string
+    cozyAppSlug: string
+    cozyDomain: string
+    cozyIconPath: string
+    cozyLocale: string
+    cozyToken: string
+  }
+  interface IClientStackClient {
+    jobs: JobCollection
+    konnectors: KonnectorCollection
+    fetchJSON: Function
+    options: any
+    token: { token: string }
+    uri: string
+    _events: any
+  }
+  interface IClientToJSON {
+    uri: string
+  }
+  interface IClientLogin {
+    token: string
+    uri: string
+  }
+  interface IClientSchema {
+    byDoctype: any
+    client: Client
+  }
 
-export type QueryOptions = {
-  doc?: unknown
-  query?: QueryDefinition | QueryDefinitionBuilder
-  as?: QueryId
-}
+  export type Client = {
+    appMetadata: any
+    options: IClientLogin
+    idCounter: number
+    isLogged: boolean
+    instanceOptions: IClientInstanceOpts
+    links: any
+    chain: any
+    schema: any
+    plugins: { realtime: TRealtimePlugin; [key: string]: any }
 
-export type QueryOptionsBuilder<P> = (props: P) => QueryOptions
+    /**
+     * A plugin is a class whose constructor receives the client as first argument.
+     * The main mean of interaction with the client should be with events
+     * like "login"/"logout".
+     *
+     * The plugin system is meant to encourage separation of concerns, modularity
+     * and testability : instead of registering events at module level, please
+     * create a plugin that subscribes to events.
+     *
+     * Plugin instances are stored internally in the `plugins` attribute of the client
+     * and can be accessed via this mean. A plugin class must have the attribute
+     * `pluginName` that will be use as the key in the `plugins` object.
+     *
+     * Two plugins with the same `pluginName` cannot co-exist.
+     *
+     * @example
+     * ```
+     * class AlertPlugin {
+     *   constructor(client, options) {
+     *     this.client = client
+     *     this.options = options
+     *     this.handleLogin = this.handleLogin.bind(this)
+     *     this.handleLogout = this.handleLogout.bind(this)
+     *     this.client.on("login", this.handleLogin)
+     *     this.client.on("logout", this.handleLogout)
+     *   }
+     *
+     *   handleLogin() {
+     *     alert(this.options.onLoginAlert)
+     *   }
+     *
+     *   handleLogout() {
+     *     alert(this.options.onLogoutAlert)
+     *   }
+     * }
+     *
+     * AlertPlugin.pluginName = 'alerts'
+     *
+     * client.registerPlugin(AlertPlugin, {
+     *   onLoginAlert: 'client has logged in !',
+     *   onLogoutAlert: 'client has logged out !'
+     * })
+     *
+     * // the instance of the plugin is accessible via
+     * client.plugins.alerts
+     * ```
+     */
+    registerPlugin(Plugin: RealtimePlugin | any, options?: any)
 
-export type QuerySpecs<P> = {
-  [k in string]: QueryOptions | QueryOptionsBuilder<P>
-}
+    /**
+     * Notify the links that they can start and set isLogged to true.
+     *
+     * On mobile, where url/token are set after instantiation, use this method
+     * to set the token and uri via options.
+     *
+     * Emits
+     *
+     * - "beforeLogin" at the beginning, before links have been set up
+     * - "login" when the client is fully logged in and links have been set up
+     *
+     * @param  {object}   options - Options
+     * @param  {string}   options.token  - If passed, the token is set on the client
+     * @param  {string}   options.uri  - If passed, the uri is set on the client
+     * @returns {Promise} - Resolves when all links have been setup and client is fully logged in
+     *
+     */
+    login(options: IClientLogin): Promise<any>
+
+    /**
+     * Logs out the client and reset all the links
+     *
+     * Emits
+     *
+     * - "beforeLogout" at the beginning, before links have been reset
+     * - "login" when the client is fully logged out and links have been reset
+     *
+     * @returns {Promise} - Resolves when all links have been reset and client is fully logged out
+     */
+    logout(): Promise<any>
+
+    /**
+     * Forwards to a stack client instance and returns
+     * a [DocumentCollection]{@link https://docs.cozy.io/en/cozy-client/api/cozy-stack-client/#DocumentCollection} instance.
+     *
+     * @param  {string} doctype The collection doctype.
+     * @returns {DocumentCollection} Collection corresponding to the doctype
+     */
+    collection(doctype: TDoctype): AllCollections
+    fetch(method: string, path: string, body: any, options?: any): Promise<any>
+    find(doctype: string, selector?: any): QueryDefinition
+    get(doctype: TDoctype, id: string): any
+    validate(document: any): any
+    save(
+      documentType: { _type: TDoctype; [key: string]: any },
+      mutationOptions?: any
+    ): Promise<QueryResult>
+
+    /**
+     * Creates a list of mutations to execute to create a document and its relationships.
+     *
+     * ```js
+     * const baseDoc = { _type: 'io.cozy.todo', label: 'Go hiking' }
+     * // relations can be arrays or single objects
+     * const relationships = {
+     *   attachments: [{ _id: 12345, _type: 'io.cozy.files' }, { _id: 6789, _type: 'io.cozy.files' }],
+     *   bills: { _id: 9999, _type: 'io.cozy.bills' }
+     * }
+     * client.getDocumentSavePlan(baseDoc, relationships)
+     * ```
+     *
+     * @param  {object} document      The base document to create
+     * @param  {object} relationships The list of relationships to add, as a dictionnary. Keys should be relationship names and values the documents to link.
+     * @returns {Mutation[]}  One or more mutation to execute
+     */
+    getDocumentSavePlan(document: any, relationships: any)
+    triggerHook(name: string, document: any): any
+
+    /**
+     * Destroys a document. {before,after}:destroy hooks will be fired.
+     *
+     * @param  {Document} document - Document to be deleted
+     * @returns {Document} The document that has been deleted
+     */
+    destroy(document: any): typeof QueryDefinition
+    upload(file: any, dirPath: string, mutationOptions?: any)
+    ensureQueryExists(queryId: string, queryDefinition: any): any
+
+    /**
+     * Executes a query and returns its results.
+     *
+     * Results from the query will be saved internally and can be retrieved via
+     * `getQueryFromState` or directly using `<Query />`. `<Query />` automatically
+     * executes its query when mounted if no fetch policy has been indicated.
+     *
+     * @param  {QueryDefinition} queryDefinition - Definition that will be executed
+     * @param  {string} options - Options
+     * @param  {string} options.as - Names the query so it can be reused (by multiple components for example)
+     * @param  {string} options.fetchPolicy - Fetch policy to bypass fetching based on what's already inside the state. See "Fetch policies"
+     * @returns {QueryResult}
+     */
+    query(
+      queryDefinition: QueryDefinition,
+      { update, ...options }?: any
+    ): Promise<QueryResult>
+
+    /**
+     * Will fetch all documents for a `queryDefinition`, automatically fetching more
+     * documents if the total of documents is superior to the pagination limit. Can
+     * result in a lot of network requests.
+     *
+     * @param  {QueryDefinition} queryDefinition - Definition to be executed
+     * @param  {object} options - Options to the query
+     * @returns {Array} All documents matching the query
+     */
+    queryAll(queryDefinition: QueryDefinition, options): Promise<QueryResult>
+    makeObservableQuery(queryDefinition: QueryDefinition, options?: any): any
+    create(
+      doctype: TDoctype,
+      entry: any,
+      relationships?: any,
+      options?: any
+    ): Promise<QueryResult>
+    getStackClient(): IClientStackClient
+    getInstanceOptions(): IClientInstanceOpts
+    toJSON(): IClientToJSON
+  }
+
+  export const CozyProvider: any
+
+  export class DocumentCollection {
+    doctype: TDoctype
+    stackClient: IClientStackClient
+    indexes: any
+    endpoint: string
+
+    /**
+     * Lists all documents of the collection, without filters.
+     *
+     * The returned documents are paginated by the stack.
+     *
+     * @param  {{limit, skip, bookmark, keys}} options The fetch options: pagination & fetch of specific docs.
+     * @returns {{data, meta, skip, bookmark, next}} The JSON API conformant response.
+     * @throws {FetchError}
+     */
+    all(options?: any): Promise<any>
+
+    /**
+     * Returns a filtered list of documents using a Mango selector.
+     *
+     * The returned documents are paginated by the stack.
+     *
+     * @param  {object} selector The Mango selector.
+     * @param  {{sort, fields, limit, skip, bookmark, indexId}} options The query options.
+     * @returns {{data, skip, bookmark, next}} The JSON API conformant response.
+     * @throws {FetchError}
+     */
+    find(selector: any, options?: any): Promise<any>
+
+    /**
+     * Get a document by id
+     *
+     * @param  {string} id The document id.
+     * @returns {object}  JsonAPI response containing normalized document as data attribute
+     */
+    get(id: string): Promise<any>
+
+    /**
+     * Get many documents by id
+     */
+    getAll(ids: string[]): Promise<any>
+
+    /**
+     * Creates a document
+     *
+     * @param {object} doc - Document to create. Optional: you can force the id with the _id attribute
+     */
+    create(doc: any): Promise<any>
+
+    /**
+     * Updates a document
+     *
+     * @param {object} document - Document to update. Do not forget the _id attribute
+     */
+    update(document: any): Promise<any>
+
+    /**
+     * Destroys a document
+     *
+     * @param {object} doc - Document to destroy. Do not forget _id and _rev attributes
+     */
+    destroy(doc: any): Promise<any>
+
+    /**
+     * Updates several documents in one batch
+     *
+     * @param  {Document[]} docs Documents to be updated
+     */
+    updateAll(docs: any[]): Promise<any>
+
+    /**
+     * Deletes several documents in one batch
+     *
+     * @param  {Document[]} docs - Documents to delete
+     */
+    destroyAll(docs: any[]): Promise<any>
+
+    toMangoOptions(selector: any, options?: any): Promise<any>
+    checkUniquenessOf(property: any, value: any): Promise<any>
+    getUniqueIndexId(property: any): Promise<any>
+    getIndexId(fields: any, indexName: string[]): Promise<any>
+    createIndex(fields: any): Promise<any>
+    getIndexNameFromFields(fields: string[]): Promise<any>
+
+    /**
+     * Compute fields that should be indexed for a mango
+     * query to work
+     *
+     * @private
+     * @param  {object} options - Mango query options
+     * @returns {Array} - Fields to index
+     */
+    getIndexFields(options: any): Promise<any>
+
+    /**
+     * Use Couch _changes API
+     *
+     * @param  {object} couchOptions Couch options for changes https://kutt.it/5r7MNQ
+     * @param  {object} options      { includeDesign: false, includeDeleted: false }
+     */
+    fetchChanges(couchOptions: any, options?: any): Promise<any>
+  }
+
+  export interface FileCollection extends DocumentCollection {
+    specialDirectories: any
+
+    /**
+     * Fetches the file's data
+     */
+    get(id: string): Promise<any>
+
+    /**
+     * Returns a filtered list of documents using a Mango selector.
+     *
+     * The returned documents are paginated by the stack.
+     */
+    find(selector: any, options?: any): Promise<any>
+
+    /**
+     * Returns the list of files referenced by a document -- see https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/
+     */
+    findReferencedBy(document: any, options?: any): Promise<any>
+
+    /**
+     *  Add referenced_by documents to a file — see https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/#post-filesfile-idrelationshipsreferenced_by
+
+     *  For example, to have an album referenced by a file:
+     * ```
+     * addReferencedBy({_id: 123, _type: "io.cozy.files", name: "cozy.jpg"}, [{_id: 456, _type: "io.cozy.photos.albums", name: "Happy Cloud"}])
+     * ```
+     */
+    addReferencedBy(document: any, documents: any[]): Promise<any>
+
+    /**
+     *  Remove referenced_by documents from a file — see https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/#delete-filesfile-idrelationshipsreferenced_by
+     *
+     *  For example, to remove an album reference from a file:
+     * ```
+     *  removeReferencedBy({_id: 123, _type: "io.cozy.files", name: "cozy.jpg"}, [{_id: 456, _type: "io.cozy.photos.albums", name: "Happy Cloud"}])
+     * ```
+     */
+    removeReferencedBy(document: any, documents: any[]): Promise<any>
+
+    /**
+     *  Add files references to a document — see https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/#post-datatypedoc-idrelationshipsreferences
+     *
+     *  For example, to add a photo to an album:
+     * ```
+     *  addReferencesTo({_id: 456, _type: "io.cozy.photos.albums", name: "Happy Cloud"}, [{_id: 123, _type: "io.cozy.files", name: "cozy.jpg"}])
+     * ```
+     */
+    addReferencesTo(document: any, documents: any[]): Promise<any>
+
+    /**
+     *  Remove files references to a document — see https://docs.cozy.io/en/cozy-stack/references-docs-in-vfs/#delete-datatypedoc-idrelationshipsreferences
+     *
+     *  For example, to remove a photo from an album:
+     * ```
+     *  removeReferencesTo({_id: 456, _type: "io.cozy.photos.albums", name: "Happy Cloud"}, [{_id: 123, _type: "io.cozy.files", name: "cozy.jpg"}])
+     * ```
+     */
+    removeReferencesTo(document: any, documents: any[]): Promise<any>
+    destroy(any: any, options?: any): Promise<any>
+
+    /**
+     * Empty the Trash
+     */
+    emptyTrash(): Promise<any>
+
+    /**
+     * Restores a trashed file.
+     */
+    restore(id: string): Promise<any>
+
+    /**
+     * Definitely delete a file
+     */
+    deleteFilePermanently(id: string): Promise<any>
+
+    /**
+     * Upload a file
+     */
+    upload(data: File, dirPath: string): Promise<any>
+
+    /**
+     * Creates directory or file.
+     *
+     * - Used by StackLink to support CozyClient.create('io.cozy.files', options)
+     */
+    create(attributes: any): Promise<any>
+
+    /**
+     * Creates a file
+     */
+    createFile(data: File, {}: any)
+
+    /***
+     * updateFile - Updates a file's data
+     */
+    updateFile(data: File, params?: any): Promise<any>
+    getDownloadLinkById(id: string): Promise<string>
+    getDownloadLinkByRevision(versionId: string, filename: string): Promise<any>
+    getDownloadLinkByPath(path: string): Promise<any>
+
+    /**
+     * Download a file or a specific version of the file
+     */
+    download(file: any, versionId?: string, filename?: string): Promise<any>
+
+    /**
+     * Fetch the binary of a file or a specific version of a file
+     * Useful for instance when you can't download the file directly
+     * (via a content-disposition attachement header) and need to store
+     * it before doing an operation.
+     */
+    fetchFileContent(id: string): Promise<any>
+
+    /**
+     * Get a beautified size for a given file
+     *
+     * 1024B => 1KB
+     *
+     * 102404500404B => 95.37 GB
+     */
+    getBeautifulSize(file: any, decimal: number): Promise<any>
+
+    downloadArchive(fileIds: string[], notSecureFilename?: string): Promise<any>
+    getArchiveLinkByIds(ids: string[], name?: string): Promise<any>
+
+    /**
+     * Checks if the file belongs to the parent's hierarchy.
+     */
+    isChildOf(child: any | string, parent: any | string): Promise<any>
+
+    /**
+     * statById - Fetches the metadata about a document. For folders, the results include the list of child files and folders.
+     */
+    statById(id: string, options?: any): Promise<any>
+    statByPath(path: string): Promise<any>
+    createDirectory(attributes: any): Promise<any>
+    ensureDirectoryExists(path: string): Promise<any>
+    getDirectoryOrCreate(name: string, parentDirectory: any): Promise<any>
+
+    /**
+     * Creates one or more folders until the given path exists
+     */
+    createDirectoryByPath(path: string): Promise<any>
+
+    /**
+     *
+     * async updateAttributes - Updates a file / folder's attributes except
+     * the metadata attribute. If you want to update its metadata attribute,
+     * then use `updateFileMetadataAttribute` since `metadata` is a specific
+     * doctype.
+     *
+     * For instance, if you want to update the name of a file, you can pass
+     * attributes = { name: 'newName'}
+     *
+     * You can see the attributes for both Folder and File (as they share the
+     * same doctype they have a few in common) here :
+     * https://docs.cozy.io/en/cozy-doctypes/docs/io.cozy.files/#iocozyfiles
+     */
+    updateAttributes(id: string, attributes: any): Promise<any>
+    updateFileMetadata(id: string, attributes: any): Promise<any>
+
+    /**
+     * Send a metadata object that can be associated to a file uploaded after that,
+     * via the MetadataID query parameter.
+     * See https://github.com/cozy/cozy-stack/blob/master/docs/files.md#post-filesuploadmetadata
+     */
+    createFileMetadata(attributes: any): Promise<any>
+
+    /**
+     *
+     * Updates the metadata attribute of a io.cozy.files
+     * Creates a new version of the file without having
+     * to upload again the file's content
+     *
+     * To see available content of the metadata attribute
+     * see : https://docs.cozy.io/en/cozy-doctypes/docs/io.cozy.files_metadata/
+     */
+    updateMetadataAttribute(id: string, metadata: any): Promise<any>
+
+    /**
+     *
+     * This method should not be called directly to upload a file.
+     *
+     * You should use `createFile`
+     */
+    doUpload(
+      data: File,
+      path: string,
+      options?: any,
+      method: 'POST' | 'PUT' | 'PATCH'
+    ): Promise<any>
+  }
+
+  export interface ContactCollection extends DocumentCollection {
+    find(selector: any, options?: any): Promise<any>
+    findMyself(): Promise<any>
+  }
+
+  export interface PermissionsCollection extends DocumentCollection {
+    get(id: string): Promise<any>
+
+    /**
+     * Create a new set of permissions
+     * It can also associates one or more codes to it, via the codes parameter
+     *
+     * @param {object} permission
+     * @param {string} permission.codes A comma separed list of values (defaulted to code)
+     * @param {string} permission.ttl Make the codes expire after a delay (bigduration format)
+     *
+     * bigduration format: https://github.com/justincampbell/bigduration/blob/master/README.md
+     * @see https://docs.cozy.io/en/cozy-stack/permissions/#post-permissions
+     *
+     */
+    create(attributes: any): Promise<any>
+
+    /**
+     * Adds a permission to the given document. Document type must be
+     * `io.cozy.apps`, `io.cozy.konnectors` or `io.cozy.permissions`
+     *
+     * @param  {object}  document - Document which receives the permission
+     * @param  {object}  permission - Describes the permission
+     * @returns {Promise}
+     *
+     * @example
+     * ```
+     * const permissions = await client
+     *   .collection('io.cozy.permissions')
+     *   .add(konnector, {
+     *     folder: {
+     *       type: 'io.cozy.files',
+     *       verbs: ['GET', 'PUT'],
+     *       values: [`io.cozy.files.bc57b60eb2954537b0dcdc6ebd8e9d23`]
+     *     }
+     *  })
+     * ```
+     */
+    add(document, permission): Promise<any>
+    destroy(permission): Promise<any>
+    findLinksByDoctype(doctype): Promise<any>
+    findApps(): Promise<any>
+
+    /**
+     * Create a share link
+     *
+     * @param {{_id, _type}} document - cozy document
+     * @param {object} options - options
+     * @param {string[]} options.verbs - explicit permissions to use
+     */
+    createSharingLink(document, options?)
+
+    /**
+     * Follow the next link to fetch the next permissions
+     *
+     * @param {object} permissions JSON-API based permissions document
+     */
+    fetchPermissionsByLink(permissions: any)
+
+    /**
+     *
+     * @param {object} document Cozy doc
+     * @returns {object} with all the permissions
+     */
+    fetchAllLinks(document: any)
+
+    /**
+     * Destroy a sharing link and the related permissions
+     *
+     * @param {object} document
+     */
+    revokeSharingLink(document)
+
+    /**
+     * async getOwnPermissions - Gets the permission for the current token
+     *
+     * @returns {object}
+     */
+    getOwnPermissions()
+  }
+
+  export interface TriggerCollection extends DocumentCollection {
+    /**
+     * Get the list of triggers.
+     *
+     * @see https://docs.cozy.io/en/cozy-stack/jobs/#get-jobstriggers
+     * @param  {{Worker}} options The fetch options: Worker allow to filter only triggers associated with a specific worker.
+     * @returns {{data}} The JSON API conformant response.
+     * @throws {FetchError}
+     */
+    all(options: any): Promise<any>
+
+    /**
+     * Creates a Trigger document
+     *
+     * @see https://docs.cozy.io/en/cozy-stack/jobs/#post-jobstriggers
+     * @param  {object}  attributes Trigger's attributes
+     * @returns {object}  Stack response, containing trigger document under `data` attribute.
+     */
+    create(attributes: any): Promise<any>
+
+    /**
+     * Deletes a trigger
+     *
+     * @see https://docs.cozy.io/en/cozy-stack/jobs/#delete-jobstriggerstrigger-id
+     * @param  {object} document The trigger to delete — must have an _id field
+     * @returns {object} The deleted document
+     */
+    destroy(document: any): Promise<any>
+
+    /**
+     *
+     * Be warned, ATM /jobs/triggers does not return the same informations
+     * than /data/io.cozy.triggers (used by the super.find method).
+     *
+     * See https://github.com/cozy/cozy-stack/pull/2010
+     *
+     * @param {object} selector - Which kind of worker {konnector,service}
+     * @param {object} options - Options
+     * @returns {{data, meta, skip, next}} The JSON API conformant response.
+     * @throws {FetchError}
+     */
+    find(selector = {}, options = {}): Promise<any>
+    get(id: string): Promise<any>
+
+    /**
+     * Force given trigger execution.
+     *
+     * @see https://docs.cozy.io/en/cozy-stack/jobs/#post-jobstriggerstrigger-idlaunch
+     * @param {object} trigger Trigger to launch
+     * @returns {object} Stack response, containing job launched by trigger, under `data` attribute.
+     */
+    launch(trigger: any): Promise<any>
+
+    update(): Promise<any>
+  }
+
+  export interface JobCollection extends DocumentCollection {
+    /**
+     * Enqueue programmatically a new job.
+     *
+     * @see https://docs.cozy.io/en/cozy-stack/jobs/#post-jobsqueueworker-type
+     * @param  {object}  workerType Job's attributes
+     * @param  {object}  args Job's attributes
+     * @param  {object}  options Job's attributes
+     * @returns {object}  Stack response, containing job document under `data` attribute.
+     */
+    create(workerType: any, args: any, options?: any): Promise<any>
+
+    get()
+    queued(workerType: any)
+    waitFor(argument: any)
+  }
+
+  export interface AppCollection extends DocumentCollection {
+    endpoint: string
+
+    /**
+     * Lists all apps, without filters.
+     *
+     * The returned documents are not paginated by the stack.
+     *
+     * @returns {{data, meta, skip, next}} The JSON API conformant response.
+     * @throws {FetchError}
+     */
+    all(): Promise<any>
+    create(): Promise<any>
+    update(): Promise<any>
+    destroy(): Promise<any>
+  }
+
+  export interface KonnectorCollection extends AppCollection {
+    doctype: TDoctype
+    endpoint: string
+
+    create(): Promise<any>
+    destroy(): Promise<any>
+
+    /**
+     * Find triggers for a particular konnector
+     *
+     * @param  {string} slug of the konnector
+     */
+    findTriggersBySlug(slug: string): Promise<any>
+
+    /**
+     * Launch a trigger for a given konnector.
+     *
+     * @param  {string} slug
+     * @param  {object} options
+     * @param  {object} options.accountId - Pinpoint the account that should be used, useful if the user
+     * has more than 1 account for 1 konnector
+     */
+    launch(slug: string, options: { accountId: string })
+
+    /**
+     * Updates a konnector
+     *
+     * @param  {string} slug
+     * @param  {object} options
+     * @param  {object} options.source - Specify the source (ex: registry://slug/stable)
+     * @param  {boolean} options.sync - Wait for konnector to be updated, otherwise the job
+     * is just scheduled
+     */
+    update(slug: string, options: { source: any; sync: boolean }): Promise<any>
+  }
+
+  export type GroupCollection = DocumentCollection
+  export type TaskCollection = DocumentCollection
+  export type ObjectiveCollection = DocumentCollection
+  export type AppointmentCollection = DocumentCollection
+  export type JobCollection = DocumentCollection
+
+  export function useClient(): Client
 
-export function queryConnect<C extends React.ElementType>(
-  querySpecs: QuerySpecs<React.ComponentPropsWithoutRef<C>>
-): (wrappedElement: C) => void
-
-export function withClient<C extends React.ElementType>(
-  component: React.ComponentPropsWithoutRef<C>
-): (wrappedElement: C) => void
-
-export type QueryState<D> = {
-  id: unknown
-  definition: unknown
-  fetchStatus: 'pending' | 'loading' | 'loaded' | 'failed'
-  lastFetch: null | number
-  lastUpdate: null | number
-  lastError: null | number
-  hasMore: boolean
-  count: number
-  data: D[]
+  class CCozyClient {
+    constructor(n: any): Client
+  }
+  const CozyClient: {
+    new (n: any): Client
+  } = CCozyClient
+  export default CozyClient
 }
diff --git a/src/cozy-doctypes.d.ts b/src/cozy-doctypes.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..a81ef94042ff90970b2d3e767a4eae4258a427aa
--- /dev/null
+++ b/src/cozy-doctypes.d.ts
@@ -0,0 +1 @@
+declare module 'cozy-doctypes'
diff --git a/src/cozy-harvest-lib.d.ts b/src/cozy-harvest-lib.d.ts
index 80c8d748f78beb944836a38aff6d21ac5cabafd8..0f45be52b7f5085fb28accb0e6666703ea436cc5 100644
--- a/src/cozy-harvest-lib.d.ts
+++ b/src/cozy-harvest-lib.d.ts
@@ -1,4 +1,6 @@
 declare module 'cozy-harvest-lib/dist/connections/accounts'
+declare module 'cozy-harvest-lib/dist/helpers/accounts'
 declare module 'cozy-harvest-lib/dist/connections/triggers'
-declare module 'cozy-harvest-lib/dist/models/KonnectorJob'
-declare module 'cozy-harvest-lib/dist/models/konnector/KonnectorJobWatcher'
+declare module 'cozy-harvest-lib/dist/helpers/triggers'
+declare module 'cozy-harvest-lib/dist/models/ConnectionFlow'
+declare module 'cozy-harvest-lib/dist/components/OAuthWindow'
diff --git a/src/cozy-logger.d.ts b/src/cozy-logger.d.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c0c144e848d98c4ba4acf12e6ec1372ea01eeb8c
--- /dev/null
+++ b/src/cozy-logger.d.ts
@@ -0,0 +1,10 @@
+declare module 'cozy-loggers'
+
+export function namespace(namespace: string): log
+
+export function log(
+  type: string,
+  message: string,
+  label: string,
+  namespace: string
+): void
diff --git a/src/cozy-ui.d.ts b/src/cozy-ui.d.ts
index 628342b1be09a17632523354098fac469019e6fa..65c1da052d48e22be47d77b27e9a1be6582dbbae 100644
--- a/src/cozy-ui.d.ts
+++ b/src/cozy-ui.d.ts
@@ -1,4 +1,38 @@
-declare module 'cozy-ui/react/I18n'
-declare module 'cozy-ui/react/Icon'
-declare module 'cozy-ui/react/Spinner'
-declare module 'cozy-ui/react/Layout'
+/* eslint-disable @typescript-eslint/interface-name-prefix */
+/* eslint-disable @typescript-eslint/no-explicit-any */
+declare module 'cozy-ui/transpiled/react/Icon'
+declare module 'cozy-ui/transpiled/react/Spinner'
+declare module 'cozy-ui/transpiled/react/Layout'
+
+declare module 'cozy-ui/transpiled/react' {
+  interface IPropsIcon {
+    icon?: string
+    width?: string | number
+    height?: string | number
+    color?: string
+    className?: string
+    preserveColor?: string
+    rotate?: string
+    size?: string | number
+    spin?: any
+    [key: string]: any
+  }
+  interface IuseI18n {
+    t: (key: string, opt?: any) => string
+    f: (date: Date, format: string) => string
+    lang: string
+  }
+
+  export function useI18n(): IuseI18n
+  export function Icon(
+    props: IPropsIcon
+  ): React.CElement<any, React.Component<any, any, any>>
+  export const I18n: any
+}
+
+declare module 'cozy-ui/transpiled/react/I18n' {
+  export function initTranslation(
+    userLocal: string,
+    cb: (lang: string) => string
+  )
+}
diff --git a/src/db/FAQ.json b/src/db/FAQ.json
index f9f9b427e6f42baadb73a5c795a98f300bae2342..761333612782dcb07d01fb9a4789d41eed12f9a5 100644
--- a/src/db/FAQ.json
+++ b/src/db/FAQ.json
@@ -129,5 +129,11 @@
       " ",
       "La correction climatique sera donc intégrée dans la V1 qui devrait sortir au cours de l'automne 2020."
     ]
+  },
+  {
+    "summary": "Quelle est la source des écogestes cités dans l’application ?",
+    "details": [
+      "Tous nos écogestes sont tirés du Guide des 100 écogestes du défi Familles à énergie positive rédigé par CLER le réseau pour la transition énergétique."
+    ]
   }
 ]
diff --git a/src/db/ecogestureData.json b/src/db/ecogestureData.json
index 1f136460777061a3595bf19c5ecd700d7a52a8e7..1fd5f7e766cecda694ac01149d32ef49d1b49c9f 100644
--- a/src/db/ecogestureData.json
+++ b/src/db/ecogestureData.json
@@ -416,5 +416,93 @@
     "fluidTypes": [0],
     "pack": 0,
     "nwh": 2
+  },
+  {
+    "_id": "0098",
+    "shortName": "Professeur Celsius",
+    "longName": "Je décide de baisser d'1 °C la température de chauffage de mes pièces.",
+    "shortDescription": "",
+    "longDescription": "Le saviez-vous ? Au-delà de 20 °C, chaque degré de plus coûte en moyenne 7 % sur la facture de chauffage. Alors évidemment, choisir de baisser la température chez soi de 1 °C, c’est toujours gagnant ! Dans un logement bien isolé, on est confortable à 19 °C dans les pièces de vie en journée et 16 °C la nuit et dans les chambres.",
+    "usage": "Cuisson",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 8
+  },
+  {
+    "_id": "0099",
+    "shortName": "Lord Kelvin",
+    "longName": "Je décide de baisser de 2 °C la température de chauffage de mes pièces.",
+    "shortDescription": "",
+    "longDescription": "Le saviez-vous ? Au-delà de 20 °C, chaque degré de plus coûte en moyenne 7 % sur la facture de chauffage. Alors évidemment, choisir de baisser la température chez soi de 2 °C, c’est toujours gagnant ! Dans un logement bien isolé, on est confortable à 19 °C dans les pièces de vie en journée et 16 °C la nuit et dans les chambres.",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 10
+  },
+  {
+    "_id": "0100",
+    "shortName": "Professeur Fahrenheid",
+    "longName": "Le thermostat de mon chauffage est réglé à moins de 20 °C.",
+    "shortDescription": "",
+    "longDescription": "Le saviez-vous ? Au-delà de 20 °C, chaque degré de plus coûte en moyenne 7 % sur la facture de chauffage. Alors évidemment, choisir de baisser la température chez soi de 1 °C, c’est toujours gagnant ! Dans un logement bien isolé, on est confortable à 19 °C dans les pièces de vie en journée et 16 °C la nuit et dans les chambres.",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 10
+  },
+  {
+    "_id": "0101",
+    "shortName": "Flamme lucide",
+    "longName": "Mon chauffage est en mode réduit pendant la nuit ou pendant mon absence.",
+    "shortDescription": "",
+    "longDescription": "Vous pouvez économisez jusqu’à 25 % en éteignant ou en baissant le chauffage 1h avant d’aller vous coucher et en le baissant de 3 à 4 °C quand vous vous absentez plus de 2 heures. De même, programmez votre chauffage en fonction de votre présence. Par exemple, augmentez la température dans le salon, la cuisine et la salle de bains le matin et diminuez-la dans les chambres. Inversement le soir.",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 8
+  },
+  {
+    "_id": "0102",
+    "shortName": "Bonhomme de neige",
+    "longName": "Je baisse le chauffage en mode hors gel lorsque je m'absente plus de 2 jours.",
+    "shortDescription": "",
+    "longDescription": "On se demande parfois si cela vaut le coup de \"couper le chauffage\" quand on s’absente… dès qu’il s’agit d’un week-end la réponse est « oui sûrement » ! Attention cependant au retour à ne pas faire de la surchauffe ! L’idéal est bien évidemment de régler sa programmation pour que le chauffage se relance quelques heures avant votre retour…",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 8
+  },
+  {
+    "_id": "0103",
+    "shortName": "Thermo-dynamique",
+    "longName": "Je ne chauffe que les pièces de vie (salon, cuisine, …)",
+    "shortDescription": "",
+    "longDescription": "Vous n’avez pas vraiment besoin de chauffer le cellier, le hall ni les chambres à coucher donc fermez bien les portes qui y donnent accès et même prévoyez de les calfeutrer si nécessaire.",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 8
+  },
+  {
+    "_id": "0104",
+    "shortName": "Plumeau d'or",
+    "longName": "J'ai dépoussièré mes radiateurs il y a moins d'un an.",
+    "shortDescription": "",
+    "longDescription": "Pensez à dépoussiérez vos radiateurs, hydrauliques ou électriques, la poussière bride leurs performances. Vous pouvez gagner jusqu'à 10 % sur leur consommation très facilement !",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 3
+  },
+  {
+    "_id": "0105",
+    "shortName": "Miroir mon beau Miroir",
+    "longName": "J’ai placé des panneaux réfléchissants derrière les radiateurs sur les murs non isolés.",
+    "shortDescription": "",
+    "longDescription": "En installant des panneaux réfléchissant derrière les radiateurs placés sur des murs non isolés, vous pouvez améliorer la performance de vos radiateurs de 5 à 10 %. Ces panneaux permettent de renvoyer la chaleur émise dans la pièce au lieu qu’elle ne se dissipe dans le mur froid. Attention, ces panneaux ne sont pas utiles sur des murs isolés, ils peuvent même créer des problèmes de condensation entre le mur et le panneau.",
+    "usage": "Chauffage",
+    "fluidTypes": [0, 2],
+    "pack": 0,
+    "nwh": 6
   }
 ]
\ No newline at end of file
diff --git a/src/db/userProfileData.json b/src/db/userProfileData.json
index c6c09dabefa0f1c01399fb3da6cfffae6d935b62..6c7cc86923bf222058321f83c0c8e46d979dfc85 100644
--- a/src/db/userProfileData.json
+++ b/src/db/userProfileData.json
@@ -3,6 +3,9 @@
     "level": 1,
     "challengeTypeHash": "",
     "ecogestureHash": "",
-    "haveSeenWelcomeModal": false
+    "haveSeenWelcomeModal": false,
+    "haveSeenOldFluidModal": false,
+    "notificationEcogesture": ["0085", "0092"],
+    "report": false
   }
 ]
diff --git a/src/doctypes/io-cozy-accounts.ts b/src/doctypes/io-cozy-accounts.ts
index 5969812143d8b01562adda58a08295cf2ee46d22..c5df0948773f317671043491481993966516aad5 100644
--- a/src/doctypes/io-cozy-accounts.ts
+++ b/src/doctypes/io-cozy-accounts.ts
@@ -1,32 +1 @@
 export const ACCOUNTS_DOCTYPE = 'io.cozy.accounts'
-
-export type AuthLoginData = {
-  login: string
-  credentials_encrypted?: string
-  password?: string
-}
-
-export type OAuthData = {
-  access_token: string
-  refresh_token: string
-  scope: string | null
-}
-
-export type Account = {
-  _id: string
-  account_type: string
-  auth: AuthLoginData | OAuthData
-  identifier: string
-  state?: string | null
-}
-
-export function isAccount(account: any): account is Account {
-  return (
-    account &&
-    '_id' in account &&
-    'account_type' in account &&
-    'auth' in account &&
-    'identifier' in account &&
-    'state' in account
-  )
-}
diff --git a/src/doctypes/io-cozy-konnectors.ts b/src/doctypes/io-cozy-konnectors.ts
index b8e9378bd68b1dcc9c0d7b3d5fbcfe339379e47a..1401e16525bf7644b02d994854a633a826d6cdd1 100644
--- a/src/doctypes/io-cozy-konnectors.ts
+++ b/src/doctypes/io-cozy-konnectors.ts
@@ -1,18 +1 @@
 export const KONNECTORS_DOCTYPE = 'io.cozy.konnectors'
-
-export type Konnector = {
-  _id: string
-  name: string
-  slug: string
-  state: string
-}
-
-export function isKonnector(konnector: any): konnector is Konnector {
-  return (
-    konnector &&
-    '_id' in konnector &&
-    'name' in konnector &&
-    'slug' in konnector &&
-    'state' in konnector
-  )
-}
diff --git a/src/doctypes/io-cozy-triggers.ts b/src/doctypes/io-cozy-triggers.ts
index 60e696f4ac1906bd6518670c2e709f1dffac04d1..6ebfc50d198c8c9bdca40a4427d3d98bef1caadd 100644
--- a/src/doctypes/io-cozy-triggers.ts
+++ b/src/doctypes/io-cozy-triggers.ts
@@ -1,35 +1 @@
 export const TRIGGERS_DOCTYPE = 'io.cozy.triggers'
-
-export type Trigger = {
-  _id: string
-  type: string
-  worker: string
-  arguments: string
-  message: {
-    account: string
-    konnector: string
-  }
-}
-
-export type TriggerState = {
-  trigger_id: string
-  status: string
-  last_error?: string
-  last_executed_job_id: string
-  last_execution: string
-  last_failed_job_id: string
-  last_failure: string
-  last_manual_execution: string
-  last_manual_job_id: string
-}
-
-export function isTrigger(trigger: any): trigger is Trigger {
-  return (
-    trigger &&
-    '_id' in trigger &&
-    'type' in trigger &&
-    'worker' in trigger &&
-    'arguments' in trigger &&
-    'message' in trigger
-  )
-}
diff --git a/src/enum/challenge.enum.ts b/src/enum/challenge.enum.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5384fa41ef8937bba8ed10d84e831478aeb95e05
--- /dev/null
+++ b/src/enum/challenge.enum.ts
@@ -0,0 +1,15 @@
+export enum TypeChallenge {
+  CHALLENGE = 0,
+  ACHIEVEMENT = 1,
+}
+
+export enum ChallengeState {
+  ONGOING = 0,
+  FINISHED = 1,
+  ABANDONED = 2,
+}
+
+export enum BadgeState {
+  FAILED = 0,
+  SUCCESS = 1,
+}
diff --git a/src/enum/jobState.enum.ts b/src/enum/jobState.enum.ts
new file mode 100644
index 0000000000000000000000000000000000000000..0c8088947c9e825456e623bf91810b20064eeec4
--- /dev/null
+++ b/src/enum/jobState.enum.ts
@@ -0,0 +1,5 @@
+export enum JobState {
+  Errored = 'errored',
+  Running = 'running',
+  Done = 'done',
+}
diff --git a/src/enum/timeStep.enum.ts b/src/enum/timeStep.enum.ts
index caf809c880b1adae8893a117f6fda79a25b2f643..a3ca441935db55853becf764830bb032a7865494 100644
--- a/src/enum/timeStep.enum.ts
+++ b/src/enum/timeStep.enum.ts
@@ -1,7 +1,8 @@
 export enum TimeStep {
-  YEAR = 10,
-  MONTH = 20,
-  DAY = 30,
-  HOUR = 40,
-  HALFHOUR = 50,
+  HALF_AN_HOUR = 10,
+  HOUR = 15,
+  DAY = 20,
+  WEEK = 30,
+  MONTH = 40,
+  YEAR = 50,
 }
diff --git a/src/locales/fr.json b/src/locales/fr.json
index 719ae440cdcb09bbda3d670def32500d4fd0c615..592f3db3a76b2aef0aedd64335f4935781041474 100644
--- a/src/locales/fr.json
+++ b/src/locales/fr.json
@@ -12,24 +12,25 @@
     "eco_gestures": "Eco-gestes",
     "ECOGESTURES": "Ecogestes",
     "BADGES": "Badges",
-    "parameters": "Options",
+    "options": "Options",
+    "profile": "Profil",
     "connectors": "connecteurs",
     "graphs": "graphes"
   },
   "COMMON": {
     "APP_TITLE": "Ecolyo",
     "APP_CHALLENGE_TITLE": "Défis",
-    "APP_ECO_GESTURE_TITLE": "Eco-gestes",
-    "APP_PARAMETERS_TITLE": "Options",
+    "APP_ECO_GESTURE_TITLE": "Ecogestes",
+    "APP_OPTIONS_TITLE": "Options",
     "APP_HELLO": "Bonjour",
-    "APP_PRESENTATION": "Votre consommation d'énergie",
+    "APP_PRESENTATION": "Consommation d'énergie",
     "CONSO_DETAILS": "détail des consommations",
     "NODATA": "Pas de données",
     "LASTDATA": "Dernières données",
     "LASTVALIDDATA": "Dernières données valides",
     "DATATOCOME": "à venir",
     "CHALLENGE_CARD_LABEL": "Defi",
-    "CONSO_CARDS_LABEL": "Consommation",
+    "CONSO_CARDS_LABEL": "Bilan",
     "PERF_INDICATOR_LABEL": "Bilan",
     "DAILY_FRENQUENCY": "quotidien",
     "WEEKLY_FRENQUENCY": "hebdo",
@@ -65,17 +66,20 @@
         {
           "CONSOLE": "Une console de jeu fonctionnant 2 h par jour consomme 1,75 kWh en 1 semaine"
         }
-      ]
+      ],
+      "provider": "Enedis"
     },
     "WATER": {
       "NAME": "Eau",
       "LABEL": "Eau",
-      "UNIT": "L"
+      "UNIT": "L",
+      "provider": "Eau du Grand Lyon"
     },
     "GAS": {
       "NAME": "Gaz",
       "LABEL": "Gaz",
-      "UNIT": "kWh"
+      "UNIT": "kWh",
+      "provider": "GRDF"
     },
     "MULTIFLUID": {
       "NAME": "Multi fluide",
@@ -109,6 +113,14 @@
     "DISPLAY_DETAIL": "Voir le détail",
     "DISPLAY_LAST_DATA": "Voir mes dernières consos"
   },
+  "PROFILE": {
+    "REPORT": {
+      "TITLE": "Réception du bilan énergétique",
+      "WEEKLY": "Hebdomadaire",
+      "MONTHLY": "Mensuel",
+      "NEVER": "Jamais"
+    }
+  },
   "KONNECTORCONFIG": {
     "TITLE_CONNECTION": "Connexion aux distributeurs",
     "TITLE_KONNECTEURS": "connecteurs",
@@ -117,7 +129,6 @@
     "LABEL_PASSWORD": "password",
     "LABEL_UPDATEDAT": "dernière mise-à-jour le",
     "LABEL_FREQUENCY": "fréquence",
-    "LABEL_FILLIN": "Renseignez vos identifiants",
     "LABEL_CONNECTTO_ELECTRICITY": "Se connecter à l'électricité",
     "LABEL_CONNECTTO_WATER": "Se connecter à l'eau",
     "LABEL_CONNECTTO_GAS": "Se connecter au gaz",
@@ -145,6 +156,17 @@
     "OK": "Ok"
   },
   "INDICATOR": {
+    "DETAIL": "Détail",
+    "BILAN": {
+      "TEXT1": "Evolution de : ",
+      "TEXT2": "soit une différence de : ",
+      "COMMON": {
+        "DAILY_FRENQUENCY": "par rapport au jour précédent",
+        "WEEKLY_FRENQUENCY": "par rapport à la semaine précédente",
+        "MONTHLY_FRENQUENCY": "par rapport au mois précédent",
+        "YEARLY_FRENQUENCY": "par rapport à l'année précédente"
+      }
+    },
     "DISPLAY_OTHER_FLUID": "Voir",
     "ERROR_NO_COMPARE": "comparaison impossible",
     "ERROR_NO_COMPARE_REASON": "(manque de données)"
@@ -173,7 +195,7 @@
     "BACK": "I'll be back",
     "ECOGESTURE": "Voir l'écogeste",
     "LINKED_ECOGESTURES": "Écogestes associés",
-    "VIEW_START": "Visualisation à partir du ",
+    "VIEW_START": "Revenez dans %{smart_count} jour pour voir l'évolution de vos données et découvrir votre objectif |||| Revenez dans %{smart_count} jours pour voir l'évolution de vos données et découvrir votre objectif",
     "VIEW_RESULT": "Résultats le ",
     "PERIOD": "Période de defi",
     "OK": "Ok",
@@ -208,9 +230,9 @@
     "enedisgrandlyon": {
       "connect": {
         "placeholder": "Adresse mail",
-        "info": "En cliquant sur ce bouton, vous accéderez à votre compte Enedis. Vous pourrez donner votre accord pour récupérer vos données de consommation électriques dans votre cloud personnel",
         "label1": "J'accède à mon",
-        "label2": "espace client Enedis"
+        "label2": "espace client Enedis",
+        "info": "Pour accéder à vos données de consommation électrique, connectez-vous à votre compte Enedis via le bouton ci-dessous. Enedis est responsable de votre compteur Linky et en charge de relever vos consommations."
       },
       "no_account": {
         "title": "Pas de compte Enedis ?",
@@ -222,7 +244,8 @@
       "connect": {
         "placeholder": "Adresse email",
         "label1": "Je me connecte à",
-        "label2": "mon compte GRDF"
+        "label2": "mon compte GRDF",
+        "info": "Pour accéder à vos données de consommation gaz, connectez-vous à votre compte GRDF. GRDF est responsable de votre compteur Gazpar et en charge de relever vos consommations."
       },
       "no_account": {
         "title": "Pas de compte GRDF ?",
@@ -234,7 +257,8 @@
       "connect": {
         "placeholder": "Identifiant",
         "label1": "Je me connecte à",
-        "label2": "mon compte Eau du Grand Lyon"
+        "label2": "mon compte Eau du Grand Lyon",
+        "info": "Pour accéder à vos données de consommation d’eau, renseignez vos identifiants Eau du Grand Lyon."
       },
       "no_account": {
         "title": "Pas de compte Eau du Grand Lyon ?",
@@ -252,8 +276,7 @@
     "activate": {
       "enedis": {
         "info": "Pour visualiser vos consommations à la 1/2 heure, il vous faut valider l'activation de l'enregistrement de votre consommation horaire sur votre compte Enedis",
-        "label1": "Activer sur mon compte Enedis",
-        "activateLink": "https://mon-compte-client.enedis.fr/"
+        "label1": "Activer sur mon compte Enedis"
       }
     }
   },
@@ -273,5 +296,14 @@
     "warning": "Attention !",
     "error_empty_description": "Le champ de description est vide.",
     "error_sending": "Erreur lors de l'envoi, veuillez essayer ultérieurement."
+  },
+  "modalOldData": {
+    "errorTxt": "Aïe !",
+    "oldData": "Vos données semblent anciennes",
+    "verify": "Veuillez vérifier l’état de vos connecteurs : ",
+    "problem": "Vos connecteurs semblent bien connectés, il se peut qu’il y ait un problème au niveau du ou des fournisseurs de données :",
+    "contact": "Veuillez prendre contact directement avec eux.",
+    "accessButton": "Accéder aux connecteurs",
+    "later": "Plus tard"
   }
 }
diff --git a/src/models/account.model.ts b/src/models/account.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c48c8f2e187820a861b4c780c8ffd68cb07bc1c9
--- /dev/null
+++ b/src/models/account.model.ts
@@ -0,0 +1,22 @@
+export interface Account extends AccountAttributes {
+  _id: string
+}
+
+export interface AccountAttributes {
+  account_type: string
+  auth: AccountAuthData | AccountOAuthData
+  identifier: string
+  state?: string | null
+}
+
+export interface AccountAuthData {
+  login: string
+  credentials_encrypted?: string
+  password?: string
+}
+
+export interface AccountOAuthData {
+  access_token: string
+  refresh_token: string
+  scope: string | null
+}
diff --git a/src/models/challenge.model.ts b/src/models/challenge.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..7306de6fb21d528d2e29e188e4e16ba40a52e460
--- /dev/null
+++ b/src/models/challenge.model.ts
@@ -0,0 +1,28 @@
+import { DateTime, Duration } from 'luxon'
+import { FluidType } from 'enum/fluid.enum'
+import { BadgeState, ChallengeState, TypeChallenge } from 'enum/challenge.enum'
+import { Ecogesture } from './ecogesture.model'
+
+export interface ChallengeType {
+  id: string
+  type: TypeChallenge
+  title: string
+  description: string
+  level: number
+  duration: Duration
+  fluidTypes: FluidType[]
+  availableEcogestures: Ecogesture[]
+}
+
+export interface UserChallenge {
+  id?: string
+  startingDate: DateTime
+  endingDate: DateTime
+  state: ChallengeState
+  selectedEcogestures: Ecogesture[]
+  challengeType: ChallengeType | null
+  maxEnergy: number
+  currentEnergy: number
+  badge: BadgeState | null
+  fluidTypes: FluidType[]
+}
diff --git a/src/services/IFluidConfig.ts b/src/models/config.model.ts
similarity index 69%
rename from src/services/IFluidConfig.ts
rename to src/models/config.model.ts
index 9147fe93e0769d6e6c99ac5170e40d1e828a1c24..95fa4101b9fdc1e5f7fcd86760126c4d870ca130 100644
--- a/src/services/IFluidConfig.ts
+++ b/src/models/config.model.ts
@@ -6,8 +6,7 @@ interface KonnectorConfig {
   cron?: string
 }
 
-// eslint-disable-next-line @typescript-eslint/interface-name-prefix
-export default interface IFluidConfig {
+export interface FluidConfig {
   fluidTypeId: number
   name: string
   coefficient: number
diff --git a/src/models/datachart.model.ts b/src/models/datachart.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9ef4d9fb4799215c8e9b51ad0c7b452dc8a43e2d
--- /dev/null
+++ b/src/models/datachart.model.ts
@@ -0,0 +1,6 @@
+import { Dataload } from './dataload.model'
+
+export interface Datachart {
+  actualData: Dataload[]
+  comparisonData: Dataload[] | null
+}
diff --git a/src/models/dataload.model.ts b/src/models/dataload.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bb4be319df844aab89d891e7b312494648d4db40
--- /dev/null
+++ b/src/models/dataload.model.ts
@@ -0,0 +1,7 @@
+import { DateTime } from 'luxon'
+
+export interface Dataload {
+  date: DateTime
+  value: number
+  valueDetail?: number[] | null
+}
diff --git a/src/models/ecogesture.model.ts b/src/models/ecogesture.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..aedd1dded43510e081a223eb9d82458e11de730e
--- /dev/null
+++ b/src/models/ecogesture.model.ts
@@ -0,0 +1,15 @@
+import { FluidType } from 'enum/fluid.enum'
+
+export interface Ecogesture {
+  id: string
+  shortName: string
+  longName: string
+  shortDescription: string
+  longDescription: string
+  usage: string
+  fluidTypes: FluidType[]
+  nwh: number
+  pack: number
+  iconName: string
+  unlocked?: boolean
+}
diff --git a/src/models/fluid.model.ts b/src/models/fluid.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..99fe18beb76462cc890167076b3138216baa799c
--- /dev/null
+++ b/src/models/fluid.model.ts
@@ -0,0 +1,8 @@
+import { DateTime } from 'luxon'
+import { FluidType } from 'enum/fluid.enum'
+
+export interface FluidStatus {
+  fluidType: FluidType
+  status: string | null
+  lastDataDate: DateTime | null
+}
diff --git a/src/models/index.ts b/src/models/index.ts
new file mode 100644
index 0000000000000000000000000000000000000000..88c73990f4f8351e79fc372dbd9774464e174413
--- /dev/null
+++ b/src/models/index.ts
@@ -0,0 +1,13 @@
+export * from './account.model'
+export * from './challenge.model'
+export * from './config.model'
+export * from './datachart.model'
+export * from './dataload.model'
+export * from './ecogesture.model'
+export * from './fluid.model'
+export * from './indicator.model'
+export * from './konnector.model'
+export * from './modal.model'
+export * from './timePeriod.model'
+export * from './trigger.model'
+export * from './userProfile.model'
diff --git a/src/models/indicator.model.ts b/src/models/indicator.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..dbff5acc5560a035a2042f98a44e9ee7142cd7a1
--- /dev/null
+++ b/src/models/indicator.model.ts
@@ -0,0 +1,5 @@
+export interface PerformanceIndicator {
+  value: number | null
+  compareValue: number | null
+  percentageVariation: number | null
+}
diff --git a/src/models/konnector.model.ts b/src/models/konnector.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..11bf9229b32fcb5a4d1734580813efdebf7d6ca0
--- /dev/null
+++ b/src/models/konnector.model.ts
@@ -0,0 +1,6 @@
+export interface Konnector {
+  _id: string
+  name: string
+  slug: string
+  state: string
+}
diff --git a/src/models/modal.model.ts b/src/models/modal.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9eb06e785b45b03a26d9dcbc51a7703a7cbbed60
--- /dev/null
+++ b/src/models/modal.model.ts
@@ -0,0 +1,3 @@
+export interface ModalState {
+  feedbackModal: boolean
+}
diff --git a/src/models/timePeriod.model.ts b/src/models/timePeriod.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..860be8c3d70a93b8a7e0fa02e4d84427c23b6f43
--- /dev/null
+++ b/src/models/timePeriod.model.ts
@@ -0,0 +1,6 @@
+import { DateTime } from 'luxon'
+
+export interface TimePeriod {
+  startDate: DateTime
+  endDate: DateTime
+}
diff --git a/src/models/trigger.model.ts b/src/models/trigger.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..75dbf3c9a92f5916aeed2b2a4e7b050db198f6d9
--- /dev/null
+++ b/src/models/trigger.model.ts
@@ -0,0 +1,27 @@
+export interface Trigger extends TriggerAttributes {
+  _id: string
+}
+
+export interface TriggerAttributes {
+  type: string
+  arguments: string
+  worker: string
+  message: {
+    account: string
+    konnector: string
+  }
+}
+
+export interface TriggerState {
+  trigger_id: string
+  status: string
+  last_error?: string
+  last_executed_job_id: string
+  last_execution: string
+  last_failed_job_id?: string
+  last_failure?: string
+  last_manual_execution: string
+  last_manual_job_id: string
+  last_success?: string
+  last_successful_job_id?: string
+}
diff --git a/src/models/userProfile.model.ts b/src/models/userProfile.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..be4994ed1f2b04d2f426ec7f56e6807ca48b5cb0
--- /dev/null
+++ b/src/models/userProfile.model.ts
@@ -0,0 +1,12 @@
+import { DateTime } from 'luxon'
+
+export interface UserProfile {
+  id: string
+  level: number
+  challengeTypeHash: string
+  ecogestureHash: string
+  haveSeenWelcomeModal: boolean
+  haveSeenOldFluidModal: DateTime | false
+  notificationEcogesture: string[]
+  report: boolean
+}
diff --git a/src/router/.gitignore b/src/router/.gitignore
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/src/services/_logService.ts b/src/services/_logService.ts
deleted file mode 100644
index e3781f05626d174b088826dd0549ade19a8887b0..0000000000000000000000000000000000000000
--- a/src/services/_logService.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-//import * as loglevelLogger from 'loglevel'
-/*
-interface Ilogger {
-  config: any
-  debug(message: string, ...data: any[]): void
-  warn(message: string, ...data: any[]): void
-  error(message: string, ...data: any[]): void
-  info(message: string, ...data: any[]): void
-}
-
-export class Logger implements Ilogger {
-  public debug(message: string, ...data: any[]): void {
-    console.log('debug')
-  }
-  public warn(message: string, ...data: any[]): void {
-    console.log('warn')
-  }
-  public error(message: string, ...data: any[]): void {
-    console.log('error')
-  }
-  public info(message: string, ...data: any[]): void {
-    console.log('info')
-  }
-}
-*/
diff --git a/src/services/account.service.ts b/src/services/account.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..e5a65852ec9747473cc2c7b758934c254de8ebc9
--- /dev/null
+++ b/src/services/account.service.ts
@@ -0,0 +1,74 @@
+import { Client } from 'cozy-client'
+import { Account, AccountAttributes, AccountAuthData, Konnector } from 'models'
+import { build } from 'cozy-harvest-lib/dist/helpers/accounts'
+import {
+  createAccount,
+  fetchAccount,
+  deleteAccount,
+  updateAccount,
+} from 'cozy-harvest-lib/dist/connections/accounts'
+
+export default class AccountService {
+  private _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  private buildAccountAttributes(
+    konnector: Konnector,
+    authData: AccountAuthData
+  ): AccountAttributes {
+    return build(konnector, authData)
+  }
+
+  public async createAccount(
+    konnector: Konnector,
+    accountAuthData: AccountAuthData
+  ): Promise<Account> {
+    const accountAttributes = this.buildAccountAttributes(
+      konnector,
+      accountAuthData
+    )
+    const account = await createAccount(
+      this._client,
+      konnector,
+      accountAttributes
+    )
+    return account
+  }
+
+  public async getAccount(id: string): Promise<Account> {
+    const account: Account = await fetchAccount(this._client, id)
+    return account
+  }
+
+  public async getAccountByType(type: string): Promise<Account> {
+    const query = this._client
+      .find('io.cozy.accounts')
+      // eslint-disable-next-line @typescript-eslint/camelcase
+      .where({ account_type: type })
+      .limitBy(1)
+    const result = await this._client.query(query)
+    return result.data[0] ? result.data[0] : null
+  }
+
+  public async updateAccount(account: Account): Promise<Account> {
+    const updatedAccount: Account = await updateAccount(this._client, account)
+    return updatedAccount
+  }
+
+  public async deleteAccount(account: Account): Promise<any> {
+    await deleteAccount(this._client, account)
+    return true
+  }
+
+  public async createIndexAccount(): Promise<any> {
+    const query = this._client
+      .find('io.cozy.accounts')
+      // eslint-disable-next-line @typescript-eslint/camelcase
+      .where({ account_type: 'index' })
+      .limitBy(1)
+    return await this._client.query(query)
+  }
+}
diff --git a/src/services/accountService.ts b/src/services/accountService.ts
deleted file mode 100644
index 74ac09a72071c57115686d02c6627c998e3e36d1..0000000000000000000000000000000000000000
--- a/src/services/accountService.ts
+++ /dev/null
@@ -1,139 +0,0 @@
-import { Client } from 'cozy-client'
-import { Account, Konnector } from 'doctypes'
-import accountsMutations from 'cozy-harvest-lib/dist/connections/accounts'
-
-export interface AccountAttributes {
-  account_type: string
-  auth: {
-    login: string
-    password: string
-  }
-  identifier: string
-  state: string | null
-}
-
-export class AccountService {
-  private _account: Account
-  private _accountAttributes?: AccountAttributes
-
-  constructor(
-    private _client: Client,
-    private _login: string,
-    private _password: string,
-    private _konnector: Konnector
-  ) {
-    this._account = {
-      _id: '',
-      // eslint-disable-next-line @typescript-eslint/camelcase
-      account_type: '',
-      auth: {
-        // eslint-disable-next-line @typescript-eslint/camelcase
-        credentials_encrypted: '',
-        login: '',
-      },
-      identifier: '',
-    }
-    this._client = _client
-    this._login = _login
-    this._password = _password
-    this._konnector = _konnector
-  }
-
-  get account(): Account {
-    return this._account
-  }
-
-  createAccountAttributes = () => {
-    if (!(this._login && this._password)) {
-      throw new Error(
-        'AccountService : createAccountAttributes - login or password not found'
-      )
-    }
-    const accountAttributes: AccountAttributes = {
-      // eslint-disable-next-line @typescript-eslint/camelcase
-      account_type: this._konnector.slug,
-      auth: {
-        login: this._login,
-        password: this._password,
-      },
-      identifier: 'login',
-      state: null,
-    }
-    return accountAttributes
-  }
-
-  createAccount = async () => {
-    this._accountAttributes = this.createAccountAttributes()
-    if (!(this._accountAttributes && this._konnector)) {
-      throw new Error(
-        'AccountService : createAccount - accountAttributes or konnector not found'
-      )
-    }
-    try {
-      this._account = await accountsMutations(this._client).createAccount(
-        this._konnector,
-        this._accountAttributes
-      )
-      return this._account
-    } catch (error) {
-      throw error
-    }
-  }
-
-  static getAccount = async (client: Client, id: string) => {
-    try {
-      const account: Account = await accountsMutations(client).findAccount(id)
-      return account
-    } catch (error) {
-      throw error
-    }
-  }
-
-  static deleteAccount = async (client: Client, account: Account) => {
-    try {
-      const del = await accountsMutations(client).deleteAccount(account)
-      return del
-    } catch (error) {
-      throw error
-    }
-  }
-
-  static updateAccount = async (client: Client, account: Account) => {
-    try {
-      const updatedAccount: Account = await accountsMutations(
-        client
-      ).updateAccount(account)
-      return updatedAccount
-    } catch (error) {
-      throw error
-    }
-  }
-
-  static getAccountByType = async (client: Client, type: string) => {
-    try {
-      const query = client
-        .find('io.cozy.accounts')
-        // eslint-disable-next-line @typescript-eslint/camelcase
-        .where({ account_type: type })
-        .limitBy(1)
-      const result = await client.query(query)
-      return result.data[0] ? result.data[0] : null
-    } catch (error) {
-      throw error
-    }
-  }
-
-  static createIndexAccount = async (client: Client) => {
-    try {
-      const query = client
-        .find('io.cozy.accounts')
-        // eslint-disable-next-line @typescript-eslint/camelcase
-        .where({ account_type: 'index' })
-        // .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
-        .limitBy(1)
-      return await client.query(query)
-    } catch (error) {
-      throw error
-    }
-  }
-}
diff --git a/src/services/challengeDataManagerService.ts b/src/services/challenge.service.ts
similarity index 68%
rename from src/services/challengeDataManagerService.ts
rename to src/services/challenge.service.ts
index 00a32f05a680fb0ac96fcfe03fef4ef3b0cfd381..d4c18b512f763324f1f4177178452eabaa61c45a 100644
--- a/src/services/challengeDataManagerService.ts
+++ b/src/services/challenge.service.ts
@@ -1,38 +1,32 @@
 import { DateTime } from 'luxon'
 import { Client } from 'cozy-client'
-import {
-  IChallengeManager,
-  UserChallenge,
-  ChallengeType,
-  EcogestureType,
-  UserProfile,
-  ChallengeState,
-  TypeChallenge,
-  BadgeState,
-} from './dataChallengeContracts'
-import UserProfileDataManager from 'services/userProfileDataManagerService'
-import ChallengeDataMapper, {
-  UserChallengeEntity,
-  ChallengeTypeEntity,
-} from 'services/challengeDataMapperService'
-import { FluidType } from 'enum/fluid.enum'
+
 import {
   CHALLENGETYPE_DOCTYPE,
   ECOGESTURE_DOCTYPE,
   USERCHALLENGE_DOCTYPE,
   USERPROFILE_DOCTYPE,
 } from 'doctypes'
-import { TimeStep } from 'services/dataConsumptionContracts'
-import ConsumptionDataManager from 'services/consumptionDataManagerService'
-import PerformanceIndicatorAggregateCalculator from 'services/performanceIndicatorAggregateCalculatorService'
 
-export default class ChallengeManager implements IChallengeManager {
+import UserProfileService from 'services/userProfile.service'
+import ChallengeMapperService, {
+  UserChallengeEntity,
+  ChallengeTypeEntity,
+} from 'services/challengeMapper.service'
+import { FluidType } from 'enum/fluid.enum'
+import { ChallengeState, TypeChallenge, BadgeState } from 'enum/challenge.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Ecogesture, UserProfile, UserChallenge, ChallengeType } from 'models'
+import ConsumptionService from 'services/consumption.service'
+import PerformanceIndicatorService from 'services/performanceIndicator.service'
+
+export default class ChallengeService {
   private readonly _client: Client
-  private readonly _challengeMapper: ChallengeDataMapper
+  private readonly _challengeMapper: ChallengeMapperService
 
   constructor(_client: Client) {
     this._client = _client
-    this._challengeMapper = new ChallengeDataMapper()
+    this._challengeMapper = new ChallengeMapperService()
   }
 
   public async getMaxEnergy(
@@ -40,7 +34,7 @@ export default class ChallengeManager implements IChallengeManager {
     client: Client,
     challengeFluidTypes: FluidType[]
   ) {
-    const cdm = new ConsumptionDataManager(client)
+    const consumptionService = new ConsumptionService(client)
     let durationTimeStep = ''
     let duration = 0
     if (challenge && challenge.challengeType) {
@@ -52,12 +46,13 @@ export default class ChallengeManager implements IChallengeManager {
     const endDate = challenge.startingDate.plus({ days: -1 }).endOf('day')
     const period = { startDate, endDate }
     if (challenge && challenge.challengeType) {
-      const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
+      const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
         period,
         TimeStep.DAY,
         challengeFluidTypes
       )
-      const maxEnergy = PerformanceIndicatorAggregateCalculator.aggregatePerformanceIndicators(
+      const performanceIndicatorService = new PerformanceIndicatorService()
+      const maxEnergy = performanceIndicatorService.aggregatePerformanceIndicators(
         fetchedPerformanceIndicators
       )
       return maxEnergy.value
@@ -71,7 +66,7 @@ export default class ChallengeManager implements IChallengeManager {
     client: Client,
     challengeFluidTypes: FluidType[]
   ): Promise<number> {
-    const cdm = new ConsumptionDataManager(client)
+    const consumptionService = new ConsumptionService(client)
     let durationTimeStep = ''
     let duration = 0
     if (challenge && challenge.challengeType) {
@@ -83,12 +78,13 @@ export default class ChallengeManager implements IChallengeManager {
     const endDate = challenge.startingDate.plus({ days: -1 }).endOf('day')
     const period = { startDate, endDate }
     if (challenge && challenge.challengeType) {
-      const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
+      const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
         period,
         TimeStep.DAY,
         challengeFluidTypes
       )
-      const maxEnergy = PerformanceIndicatorAggregateCalculator.aggregatePerformanceIndicators(
+      const performanceIndicatorService = new PerformanceIndicatorService()
+      const maxEnergy = performanceIndicatorService.aggregatePerformanceIndicators(
         fetchedPerformanceIndicators
       )
       if (maxEnergy && maxEnergy.value && maxEnergy.value > 0) {
@@ -123,7 +119,7 @@ export default class ChallengeManager implements IChallengeManager {
   ) {
     const lagDays = this.getLagDays(challengeFluidTypes)
     if (DateTime.local() > challenge.startingDate.plus({ days: lagDays })) {
-      const cdm = new ConsumptionDataManager(client)
+      const consumptionService = new ConsumptionService(client)
       const startDate = challenge.startingDate
       let endDate = DateTime.local()
         .plus({ days: -lagDays })
@@ -133,13 +129,13 @@ export default class ChallengeManager implements IChallengeManager {
       }
       const period = { startDate, endDate }
       if (challenge && challenge.challengeType) {
-        const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
+        const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
           period,
           TimeStep.DAY,
           challengeFluidTypes
         )
-
-        const spentEnergy = PerformanceIndicatorAggregateCalculator.aggregatePerformanceIndicators(
+        const performanceIndicatorService = new PerformanceIndicatorService()
+        const spentEnergy = performanceIndicatorService.aggregatePerformanceIndicators(
           fetchedPerformanceIndicators
         )
         return spentEnergy.value
@@ -158,7 +154,7 @@ export default class ChallengeManager implements IChallengeManager {
   ): Promise<number> {
     const lagDays = this.getLagDays(challengeFluidTypes)
     if (DateTime.local() > challenge.startingDate.plus({ days: lagDays })) {
-      const cdm = new ConsumptionDataManager(client)
+      const consumptionService = new ConsumptionService(client)
       const startDate = challenge.startingDate
       let endDate = DateTime.local()
         .plus({ days: -lagDays })
@@ -168,12 +164,13 @@ export default class ChallengeManager implements IChallengeManager {
       }
       const period = { startDate, endDate }
       if (challenge && challenge.challengeType) {
-        const fetchedPerformanceIndicators = await cdm.getPerformanceIndicators(
+        const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
           period,
           TimeStep.DAY,
           challengeFluidTypes
         )
-        const spentEnergy = PerformanceIndicatorAggregateCalculator.aggregatePerformanceIndicators(
+        const performanceIndicatorService = new PerformanceIndicatorService()
+        const spentEnergy = performanceIndicatorService.aggregatePerformanceIndicators(
           fetchedPerformanceIndicators
         )
         if (spentEnergy && spentEnergy.value && spentEnergy.value >= 0) {
@@ -221,19 +218,24 @@ export default class ChallengeManager implements IChallengeManager {
   public async updateChallengeState(
     id: string | undefined,
     newState: number
-  ): Promise<UserChallenge | null> {
-    const updateUserChallenge = await this._client
-      .query(
-        this._client
-          .find(USERCHALLENGE_DOCTYPE)
-          .where({ _id: id })
-          .limitBy(1)
-      )
-      .then(async ({ data }) => {
-        const doc = data[0]
-        await this._client.save({ ...doc, state: newState })
-      })
-    return updateUserChallenge
+  ): Promise<boolean> {
+    try {
+      await this._client
+        .query(
+          this._client
+            .find(USERCHALLENGE_DOCTYPE)
+            .where({ _id: id })
+            .limitBy(1)
+        )
+        .then(async ({ data }) => {
+          const doc = data[0]
+          await this._client.save({ ...doc, state: newState })
+        })
+      return true
+    } catch (err) {
+      console.log(err)
+      throw err
+    }
   }
 
   public async isChallengeOver(
@@ -318,21 +320,39 @@ export default class ChallengeManager implements IChallengeManager {
     return false
   }
 
-  public async endChallenge(challenge: UserChallenge, fluidTypes: FluidType[]) {
-    if (challenge && challenge.challengeType) {
-      if (await this.isChallengeOver(challenge, fluidTypes)) {
-        if (challenge.challengeType.type === TypeChallenge.ACHIEVEMENT) {
-          await this.updateChallengeState(challenge.id, ChallengeState.FINISHED)
-          await this.updateUserLevel(challenge.challengeType.level)
-        } else {
-          if (
-            this.getTheRightBadge(challenge.currentEnergy, challenge.maxEnergy)
-          ) {
+  public async endChallenge(
+    challenge: UserChallenge,
+    fluidTypes: FluidType[]
+  ): Promise<boolean> {
+    try {
+      if (challenge && challenge.challengeType) {
+        if (await this.isChallengeOver(challenge, fluidTypes)) {
+          if (challenge.challengeType.type === TypeChallenge.ACHIEVEMENT) {
+            await this.updateChallengeState(
+              challenge.id,
+              ChallengeState.FINISHED
+            )
             await this.updateUserLevel(challenge.challengeType.level)
+          } else {
+            if (
+              this.getTheRightBadge(
+                challenge.currentEnergy,
+                challenge.maxEnergy
+              )
+            ) {
+              await this.updateUserLevel(challenge.challengeType.level)
+            }
+            await this.updateChallengeState(
+              challenge.id,
+              ChallengeState.FINISHED
+            )
           }
-          await this.updateChallengeState(challenge.id, ChallengeState.FINISHED)
         }
       }
+      return true
+    } catch (err) {
+      console.log(err)
+      throw err
     }
   }
 
@@ -390,23 +410,24 @@ export default class ChallengeManager implements IChallengeManager {
   }
 
   public async deleteAllChallengeTypeEntities(): Promise<boolean> {
-    const challengeType = await this.getAllChallengeTypeEntities()
-    if (!challengeType) return true
     try {
+      const challengeType = await this.getAllChallengeTypeEntities()
+      if (!challengeType) return true
       for (let index = 0; index < challengeType.length; index++) {
         await this._client.destroy(challengeType[index])
       }
       return true
-    } catch (error) {
-      return false
+    } catch (err) {
+      console.log(err)
+      throw err
     }
   }
 
   public async getAvailableChallenges(
     fluidTypes?: FluidType[]
   ): Promise<ChallengeType[] | null> {
-    const userProfileDataManager = new UserProfileDataManager(this._client)
-    const userProfile: UserProfile | null = await userProfileDataManager.getUserProfile()
+    const userProfileService = new UserProfileService(this._client)
+    const userProfile: UserProfile | null = await userProfileService.getUserProfile()
 
     if (fluidTypes && fluidTypes.length === 0) {
       fluidTypes = [0, 1, 2]
@@ -431,7 +452,7 @@ export default class ChallengeManager implements IChallengeManager {
       | null = challengeTypesresult.data ? challengeTypesresult.data : null
 
     const challengeTypeEntityRelationships:
-      | any
+      | object
       | null = challengeTypesresult.included
       ? challengeTypesresult.included
       : null
@@ -442,8 +463,8 @@ export default class ChallengeManager implements IChallengeManager {
     const challengeTypes = this._challengeMapper.mapToChallengeTypes(
       challengeTypeEntities,
       challengeTypeEntityRelationships,
-      unlockedEcogestures,
-      fluidTypes
+      unlockedEcogestures || undefined
+      // fluidTypes
     )
     return challengeTypes
   }
@@ -458,67 +479,93 @@ export default class ChallengeManager implements IChallengeManager {
     return userLevel
   }
 
+  public async updateCurrentChallengeProgress(
+    challenge: UserChallenge
+  ): Promise<UserChallenge | null> {
+    try {
+      if (
+        challenge &&
+        challenge.challengeType &&
+        challenge.challengeType.type === TypeChallenge.CHALLENGE
+      ) {
+        // Check if we are in the viewing timezone for current challenge
+        const viewingDate = this.getViewingDate(challenge)
+        if (DateTime.local() >= viewingDate && challenge.fluidTypes) {
+          if (challenge.maxEnergy === -1 && challenge.fluidTypes) {
+            const maxEnergyResult = await this.setMaxEnergy(
+              challenge,
+              this._client,
+              challenge.fluidTypes
+            )
+            if (maxEnergyResult > 0) {
+              challenge.maxEnergy = maxEnergyResult
+            }
+          }
+          const currentEnergyResult = await this.setSpentEnergy(
+            challenge,
+            this._client,
+            challenge.fluidTypes
+          )
+          if (currentEnergyResult) {
+            challenge.currentEnergy = currentEnergyResult
+          }
+        }
+      }
+      return challenge
+    } catch (error) {
+      console.log('Context error: ', error)
+      throw error
+    }
+  }
+
   public async startChallenge(
     challenge: ChallengeType,
     fluidTypes: FluidType[],
-    selectedEcogestes: EcogestureType[]
+    selectedEcogestes: Ecogesture[]
   ): Promise<UserChallenge | null> {
-    const ongoingChallenge = await this.getCurrentChallenge()
-
-    if (!ongoingChallenge) {
-      const startDate = DateTime.utc()
-        .plus({ days: 1 })
-        .startOf('day')
-
-      const userChallenge = new UserChallenge(
-        startDate,
-        startDate.plus(challenge.duration),
-        ChallengeState.ONGOING,
-        selectedEcogestes,
-        challenge,
-        -1,
-        -1,
-        -1,
-        fluidTypes
-      )
-
-      const resultUserChallenge = await this._client.create(
-        USERCHALLENGE_DOCTYPE,
-        this._challengeMapper.mapFromUserChallenge(userChallenge)
-      )
-
-      const createdUserChallengeEntity: UserChallengeEntity | null = resultUserChallenge.data
-        ? resultUserChallenge.data
-        : null
-      if (!createdUserChallengeEntity) return null
+    try {
+      // Ensure that none challenge is already on going
+      const ongoingChallenge = await this.getCurrentChallenge()
+      if (!ongoingChallenge) {
+        const startDate = DateTime.utc()
+          .plus({ days: 1 })
+          .startOf('day')
+
+        const userChallenge: UserChallenge = {
+          startingDate: startDate,
+          endingDate: startDate.plus(challenge.duration),
+          state: ChallengeState.ONGOING,
+          selectedEcogestures: selectedEcogestes,
+          challengeType: challenge,
+          maxEnergy: -1,
+          currentEnergy: -1,
+          badge: -1,
+          fluidTypes: fluidTypes,
+        }
 
-      const createdUserChallenge = this._challengeMapper.mapToUserChallenge(
-        createdUserChallengeEntity
-      )
+        await this._client.create(
+          USERCHALLENGE_DOCTYPE,
+          this._challengeMapper.mapFromUserChallenge(userChallenge)
+        )
 
-      return createdUserChallenge
-    } else {
-      return null
+        // Retrive the challenge from base to have the userChallengeEntityRelationships
+        let createdUserChallenge = await this.getCurrentChallenge()
+        if (createdUserChallenge) {
+          // Update challenge progess
+          createdUserChallenge = await this.updateCurrentChallengeProgress(
+            createdUserChallenge
+          )
+        }
+        return createdUserChallenge
+      } else {
+        return null
+      }
+    } catch (err) {
+      console.log(err)
+      throw err
     }
   }
 
-  public async getAllUserChallengeEntities(): Promise<
-    UserChallengeEntity[] | null
-  > {
-    let userChallengeEntities: UserChallengeEntity[] | null = null
-
-    const userChallengesresult = await this._client.query(
-      this._client.find(USERCHALLENGE_DOCTYPE)
-    )
-    userChallengeEntities = userChallengesresult.data
-      ? userChallengesresult.data
-      : null
-
-    if (!userChallengeEntities) return null
-
-    return userChallengeEntities
-  }
-
   public async getAllUserChallenges(
     withEcogestures = true
   ): Promise<UserChallenge[] | null> {
@@ -547,7 +594,7 @@ export default class ChallengeManager implements IChallengeManager {
       | null = resultUserChallenge.data ? resultUserChallenge.data : null
 
     const userChallengeEntityRelationships:
-      | any
+      | object
       | null = resultUserChallenge.included
       ? resultUserChallenge.included
       : null
@@ -591,7 +638,7 @@ export default class ChallengeManager implements IChallengeManager {
       | null = resultUserChallenge.data ? resultUserChallenge.data : null
 
     const userChallengeEntityRelationships:
-      | any
+      | object
       | null = resultUserChallenge.included
       ? resultUserChallenge.included
       : null
@@ -606,24 +653,16 @@ export default class ChallengeManager implements IChallengeManager {
     return userChallenge
   }
 
-  public async cancelChallenge(
-    id: string | undefined
-  ): Promise<UserChallenge | null> {
-    const updateUserChallenge = await this._client
-      .query(
-        this._client
-          .find(USERCHALLENGE_DOCTYPE)
-          .where({ _id: id })
-          .limitBy(1)
-      )
-      .then(async ({ data }) => {
-        const doc = data[0]
-        await this._client.save({ ...doc, state: ChallengeState.ABANDONED })
-      })
-    return updateUserChallenge
+  public async cancelChallenge(id: string): Promise<boolean> {
+    try {
+      await this.updateChallengeState(id, ChallengeState.ABANDONED)
+      return true
+    } catch (err) {
+      console.log(err)
+      throw err
+    }
   }
-
-  public async getUnlockedEcogestures(): Promise<EcogestureType[] | null> {
+  public async getUnlockedEcogestures(): Promise<string[] | null> {
     const relationShipsToInclude = ['selectedEcogestures']
     const ecogestures = await this._client.query(
       this._client
@@ -643,7 +682,7 @@ export default class ChallengeManager implements IChallengeManager {
     return unlocked.flat().map(eg => eg._id)
   }
 
-  public async getAllEcogestures(): Promise<EcogestureType[] | null> {
+  public async getAllEcogestures(): Promise<Ecogesture[] | null> {
     const ecogestures = await this._client.query(
       this._client.find(ECOGESTURE_DOCTYPE)
     )
@@ -692,7 +731,10 @@ export default class ChallengeManager implements IChallengeManager {
     }
 
     if (fluidTypePredicate)
-      predicate = { ...predicate, fluidTypes: fluidTypePredicate }
+      predicate = {
+        ...predicate,
+        fluidTypes: fluidTypePredicate,
+      }
 
     if (levelPredicate) predicate = { ...predicate, level: levelPredicate }
 
@@ -733,4 +775,34 @@ export default class ChallengeManager implements IChallengeManager {
     }
     return null
   }
+
+  /*
+   * If the challenge is over
+   * Set the rigth badge and return true
+   * else return false
+   */
+  public async isCurrentChallengeOver(
+    challenge: UserChallenge,
+    fluidTypes: FluidType[]
+  ): Promise<boolean> {
+    try {
+      const typeChallenge = challenge.challengeType
+        ? challenge.challengeType.type
+        : 0
+      const isOver = await this.isChallengeOverByDate(
+        challenge.endingDate,
+        fluidTypes,
+        typeChallenge
+      )
+      if (isOver) {
+        await this.setTheRightBadge(challenge)
+        return true
+      } else {
+        return false
+      }
+    } catch (error) {
+      console.log(error)
+      throw error
+    }
+  }
 }
diff --git a/src/services/challengeDataMapperService.ts b/src/services/challengeMapper.service.ts
similarity index 76%
rename from src/services/challengeDataMapperService.ts
rename to src/services/challengeMapper.service.ts
index c865ca78e1c5646085e235aa3f5203af44745433..56f93678412d9e74cbc25189bfb065363dac8b37 100644
--- a/src/services/challengeDataMapperService.ts
+++ b/src/services/challengeMapper.service.ts
@@ -1,12 +1,6 @@
 import { DateTime, Duration } from 'luxon'
-import {
-  UserChallenge,
-  ChallengeType,
-  EcogestureType,
-  ChallengeState,
-  BadgeState,
-  TypeChallenge,
-} from 'services/dataChallengeContracts'
+import { ChallengeState, BadgeState, TypeChallenge } from 'enum/challenge.enum'
+import { UserChallenge, ChallengeType, Ecogesture } from 'models'
 import { FluidType } from 'enum/fluid.enum'
 import { CHALLENGETYPE_DOCTYPE, ECOGESTURE_DOCTYPE } from 'doctypes'
 
@@ -17,8 +11,8 @@ export class UserChallengeEntity {
   state: ChallengeState
   maxEnergy: number
   currentEnergy: number
-  badge: BadgeState
-  relationships: any
+  badge: BadgeState | null
+  relationships: object
   fluidTypes: FluidType[]
 
   constructor(
@@ -27,8 +21,8 @@ export class UserChallengeEntity {
     state: ChallengeState,
     maxEnergy: number,
     currentEnergy: number,
-    badge: BadgeState,
-    relationships: any,
+    badge: BadgeState | null,
+    relationships: object,
     fluidTypes: FluidType[],
     _id?: string
   ) {
@@ -52,7 +46,7 @@ export class ChallengeTypeEntity {
   level: number
   duration: Duration
   fluidTypes: FluidType[]
-  relationships: any
+  relationships: object
 
   constructor(
     _id: string,
@@ -62,7 +56,7 @@ export class ChallengeTypeEntity {
     level: number,
     duration: Duration,
     fluidTypes: FluidType[],
-    relationships: any
+    relationships: object
   ) {
     this._id = _id
     this.type = type
@@ -75,7 +69,7 @@ export class ChallengeTypeEntity {
   }
 }
 
-export default class ChallengeDataMapper {
+export default class ChallengeMapperService {
   public mapFromUserChallenge(
     userChallenge: UserChallenge
   ): UserChallengeEntity {
@@ -92,6 +86,7 @@ export default class ChallengeDataMapper {
       state: userChallenge.state,
       maxEnergy: userChallenge.maxEnergy,
       currentEnergy: userChallenge.currentEnergy,
+      badge: userChallenge.badge,
       fluidTypes: userChallenge.fluidTypes,
       relationships: {
         selectedEcogestures: {
@@ -112,9 +107,9 @@ export default class ChallengeDataMapper {
 
   public mapToUserChallenge(
     userChallengeEntity: UserChallengeEntity,
-    userChallengeEntityRelationships?: any | null
+    userChallengeEntityRelationships?: object | null
   ): UserChallenge {
-    let selectedEcogestures: EcogestureType[] = []
+    let selectedEcogestures: Ecogesture[] = []
     let challengeType: ChallengeType | null = null
 
     if (userChallengeEntityRelationships) {
@@ -136,28 +131,33 @@ export default class ChallengeDataMapper {
       challengeType = challengeTypes ? challengeTypes[0] : null
     }
 
-    const mappedUserChallenge: UserChallenge = new UserChallenge(
-      DateTime.fromISO(userChallengeEntity.startingDate).startOf('day'),
-      DateTime.fromISO(userChallengeEntity.endingDate).startOf('day'),
-      userChallengeEntity.state,
-      selectedEcogestures,
-      challengeType,
-      userChallengeEntity.maxEnergy,
-      userChallengeEntity.currentEnergy,
-      userChallengeEntity.badge,
-      userChallengeEntity.fluidTypes,
-      userChallengeEntity._id
-    )
+    const mappedUserChallenge: UserChallenge = {
+      id: userChallengeEntity._id,
+      startingDate: DateTime.fromISO(userChallengeEntity.startingDate).startOf(
+        'day'
+      ),
+      endingDate: DateTime.fromISO(userChallengeEntity.endingDate).startOf(
+        'day'
+      ),
+      state: userChallengeEntity.state,
+      selectedEcogestures: selectedEcogestures,
+      challengeType: challengeType,
+      maxEnergy: userChallengeEntity.maxEnergy,
+      currentEnergy: userChallengeEntity.currentEnergy,
+      badge: userChallengeEntity.badge,
+      fluidTypes: userChallengeEntity.fluidTypes,
+    }
+
     return mappedUserChallenge
   }
 
   public mapToChallengeType(
     challengeEntity: ChallengeTypeEntity,
-    challengeTypeEntityRelationships?: any | null,
+    challengeTypeEntityRelationships?: object | null,
     unlockedEcogestures?: string[]
     // fluidTypes?: FluidType[]
   ): ChallengeType {
-    const completeAvailableEcogestures: any[] = []
+    const completeAvailableEcogestures: object[] = []
 
     if (challengeTypeEntityRelationships) {
       for (const ecogestureType of challengeEntity.relationships
@@ -201,30 +201,30 @@ export default class ChallengeDataMapper {
       filteredAvailableEcogestures[
         Math.floor(Math.random() * filteredAvailableEcogestures.length)
       ]
-    const randomEcogestures = filteredAvailableEcogestures.filter(
+    const randomEcogestures: Ecogesture[] = filteredAvailableEcogestures.filter(
       eg => eg.pack === randomEcogesture.pack && eg.id !== randomEcogesture.id
     )
 
     randomEcogestures.push(randomEcogesture)
 
-    const mappedChallengeType = new ChallengeType(
-      challengeEntity._id,
-      challengeEntity.type,
-      challengeEntity.title,
-      challengeEntity.description,
-      challengeEntity.level,
-      challengeEntity.duration,
-      challengeEntity.fluidTypes,
-      randomEcogestures
-    )
+    const mappedChallengeType: ChallengeType = {
+      id: challengeEntity._id,
+      type: challengeEntity.type,
+      title: challengeEntity.title,
+      description: challengeEntity.description,
+      level: challengeEntity.level,
+      duration: challengeEntity.duration,
+      fluidTypes: challengeEntity.fluidTypes,
+      availableEcogestures: randomEcogestures,
+    }
 
     return mappedChallengeType
   }
 
   public mapToChallengeTypes(
     challengeEntities: ChallengeTypeEntity[],
-    challengeTypeEntityRelationships?: any | null,
-    unlockedEcogestures?: any
+    challengeTypeEntityRelationships?: object | null,
+    unlockedEcogestures?: string[]
     // fluidTypes?: FluidType[]
   ): ChallengeType[] {
     return challengeEntities.map(challengeEntity =>
diff --git a/src/services/connection.service.ts b/src/services/connection.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..3c22206fca5c0fdc9a5c17f70021a726ae681071
--- /dev/null
+++ b/src/services/connection.service.ts
@@ -0,0 +1,54 @@
+import { Client } from 'cozy-client'
+import { Account, AccountAuthData, Konnector, Trigger } from 'models'
+import AccountService from 'services/account.service'
+import TriggerService from 'services/triggers.service'
+import KonnectorService from 'services/konnector.service'
+
+export default class ConnectionService {
+  private _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  public async connectNewUser(
+    konnectorId: string,
+    login: string,
+    password: string
+  ) {
+    // Retrieve konnector
+    const konnectorService = new KonnectorService(this._client)
+    const konnector: Konnector = await konnectorService.getKonnector(
+      konnectorId
+    )
+    if (!konnector || !konnector.slug) {
+      throw new Error(`Could not find konnector for ${konnectorId}`)
+    }
+    // Creation of the account linked to the konnector retrieved
+    const accountAuthData: AccountAuthData = {
+      login: login,
+      password: password,
+    }
+    const accountService = new AccountService(this._client)
+    const account: Account = await accountService.createAccount(
+      konnector,
+      accountAuthData
+    )
+    if (!account || !account._id) {
+      throw new Error(`Error during account creation`)
+    }
+    // creation of the trigger for the konnector retrieve and the created account
+    const triggersServices = new TriggerService(this._client)
+    const trigger: Trigger = await triggersServices.createTrigger(
+      account,
+      konnector
+    )
+    if (!trigger) {
+      throw new Error(`Error during trigger creation`)
+    }
+    return {
+      account: account,
+      trigger: trigger,
+    }
+  }
+}
diff --git a/src/services/connectionService.ts b/src/services/connectionService.ts
deleted file mode 100644
index 6fb4a3044b20f441b356c810728f4ea5757f4bbc..0000000000000000000000000000000000000000
--- a/src/services/connectionService.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import { Client } from 'cozy-client'
-import { Account, Konnector, Trigger } from 'doctypes'
-import { AccountService } from './accountService'
-import { TriggerService } from './triggersService'
-import KonnectorService from './konnectorService'
-
-export class ConnectionService {
-  constructor(
-    private _client: Client,
-    private _konnectorId: string,
-    private _login: string,
-    private _password: string
-  ) {
-    this._client = _client
-    this._konnectorId = _konnectorId
-    this._login = _login
-    this._password = _password
-  }
-
-  connectNewUser = async () => {
-    // Retrieve konnector
-    const konnectorService = new KonnectorService(
-      this._client,
-      this._konnectorId
-    )
-    const konnector: Konnector = await konnectorService.fetchKonnector()
-    if (!konnector || !konnector.slug) {
-      throw new Error(`Could not find konnector for ${this._konnectorId}`)
-    }
-    // Creation of the account linked to the konnector retrieved
-    const accountService = new AccountService(
-      this._client,
-      this._login,
-      this._password,
-      konnector
-    )
-    const account: Account = await accountService.createAccount()
-    if (!account || !account._id) {
-      throw new Error(`Error during account creation`)
-    }
-    // creation of the trigger for the konnector retrieve and the created account
-    const triggersServices = new TriggerService(
-      this._client,
-      account,
-      konnector
-    )
-    const trigger: Trigger = await triggersServices.createTrigger()
-    if (!trigger) {
-      throw new Error(`Error during trigger creation`)
-    }
-    return {
-      account: account,
-      trigger: trigger,
-    }
-    //Launch the creation trigger
-    // const job = await triggersServices.launchTrigger()
-    // if (!job) {
-    //   throw new Error(`Error during trigger launching`)
-    // }
-    // return job
-  }
-}
diff --git a/src/services/consumptionDataManagerService.ts b/src/services/consumption.service.ts
similarity index 65%
rename from src/services/consumptionDataManagerService.ts
rename to src/services/consumption.service.ts
index b203ecb491b6e8db3d992536e511e790cf11a23d..ea15fc730b7523c5247562448cc81da0d0dd7276 100644
--- a/src/services/consumptionDataManagerService.ts
+++ b/src/services/consumption.service.ts
@@ -1,45 +1,41 @@
 import { DateTime } from 'luxon'
 import { Client } from 'cozy-client'
-import {
-  IConsumptionDataManager,
-  ITimePeriod,
-  TimeStep,
-  IDataload,
-  IChartData,
-  IPerformanceIndicator,
-} from './dataConsumptionContracts'
+
 import { FluidType } from 'enum/fluid.enum'
-import ConsumptionDataFormatter from './consumptionDataFormatterService'
-import { QueryRunner } from './queryRunnerService'
-import ConsumptionDataValidator from './consumptionDataValidatorService'
-import LoadToCurrencyConverter from './loadToCurrencyConverterService'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Datachart, Dataload, PerformanceIndicator, TimePeriod } from 'models'
+import ConsumptionFormatterService from 'services/consumptionFormatter.service'
+import QueryRunnerService from 'services/queryRunner.service'
+import ConsumptionValidatorService from 'services/consumptionValidator.service'
+import ConverterService from 'services/converter.service'
 
 // eslint-disable-next-line @typescript-eslint/interface-name-prefix
 export interface ISingleFluidChartData {
-  chartData: IChartData | null
+  chartData: Datachart | null
   chartFluid: FluidType
 }
 
-export default class ConsumptionDataManager implements IConsumptionDataManager {
+export default class ConsumptionDataManager {
   private readonly _client: Client
-  private readonly _consumptionDataFormatter: ConsumptionDataFormatter
-  private readonly _queryRunner: QueryRunner
-  private readonly _consumptionDataValidator: ConsumptionDataValidator
+  private readonly _consumptionFormatterService: ConsumptionFormatterService
+  private readonly _queryRunnerService: QueryRunnerService
+  private readonly _consumptionValidatorService: ConsumptionValidatorService
 
   constructor(_client: Client) {
     this._client = _client
-    this._consumptionDataFormatter = new ConsumptionDataFormatter()
-    this._queryRunner = new QueryRunner(this._client)
-    this._consumptionDataValidator = new ConsumptionDataValidator()
+    this._consumptionFormatterService = new ConsumptionFormatterService()
+    this._queryRunnerService = new QueryRunnerService(this._client)
+    this._consumptionValidatorService = new ConsumptionValidatorService()
   }
 
   public async getGraphData(
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     timeStep: TimeStep,
     fluidTypes: FluidType[],
-    compareTimePeriod?: ITimePeriod
-  ): Promise<IChartData | null> {
-    const InputisValid: boolean = this._consumptionDataValidator.ValidateGetGraphData(
+    compareTimePeriod?: TimePeriod,
+    isHome?: boolean
+  ): Promise<Datachart | null> {
+    const InputisValid: boolean = this._consumptionValidatorService.ValidateGetGraphData(
       timePeriod,
       timeStep,
       fluidTypes,
@@ -50,13 +46,13 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
 
     let mappedData = null
 
-    if (fluidTypes.length === 1) {
+    if (fluidTypes.length === 1 && !isHome) {
       //TODO validating input data
 
       //TODO applying buisness logic to the query arguments
 
       // running the query
-      const fetchedData = await this.fetchSingleFLuidGraphData(
+      const fetchedData = await this.fetchSingleFluidGraphData(
         timePeriod,
         timeStep,
         fluidTypes[0],
@@ -75,10 +71,10 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
 
       // mapping result to contract
       mappedData = formattedData
-    } else if (fluidTypes.length > 1) {
+    } else if (fluidTypes.length > 1 || isHome) {
       const toBeAgreggatedData: ISingleFluidChartData[] = []
       for (const fluidType of fluidTypes) {
-        const fetchedData = await this.fetchSingleFLuidGraphData(
+        const fetchedData = await this.fetchSingleFluidGraphData(
           timePeriod,
           timeStep,
           fluidType,
@@ -111,17 +107,50 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
     return mappedData
   }
 
+  public async getMaxLoad(
+    maxTimePeriod: TimePeriod,
+    timeStep: TimeStep,
+    fluidTypes: FluidType[],
+    compareMaxTimePeriod?: TimePeriod,
+    isHome?: boolean
+  ): Promise<number | null> {
+    let allData
+    if (isHome) {
+      allData = await this.getGraphData(
+        maxTimePeriod,
+        timeStep,
+        fluidTypes,
+        compareMaxTimePeriod,
+        isHome
+      )
+
+      const max =
+        allData && allData.actualData
+          ? Math.max(...allData.actualData.map(d => d.value))
+          : 0
+
+      return max
+    } else {
+      const max = await this._queryRunnerService.fetchFluidMaxData(
+        maxTimePeriod,
+        timeStep,
+        fluidTypes[0]
+      )
+      return max
+    }
+  }
+
   public async getPerformanceIndicators(
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     timeStep: TimeStep,
     fluidTypes: FluidType[],
-    compareTimePeriod?: ITimePeriod
-  ): Promise<IPerformanceIndicator[]> {
+    compareTimePeriod?: TimePeriod
+  ): Promise<PerformanceIndicator[]> {
     //const result = {};
-    const performanceIndicators: IPerformanceIndicator[] = []
+    const performanceIndicators: PerformanceIndicator[] = []
 
     for (const fluideType of fluidTypes) {
-      const graphData: IChartData | null = await this.getGraphData(
+      const graphData: Datachart | null = await this.getGraphData(
         timePeriod,
         timeStep,
         [fluideType],
@@ -129,7 +158,7 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
       )
 
       if (graphData) {
-        const performanceIndicator: IPerformanceIndicator = {
+        const performanceIndicator: PerformanceIndicator = {
           value: null,
           compareValue: null,
           percentageVariation: null,
@@ -166,7 +195,7 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
     return performanceIndicators
   }
 
-  private PerformanceIndicatorsDataIsValid(data: IDataload[]): boolean {
+  private PerformanceIndicatorsDataIsValid(data: Dataload[]): boolean {
     if (!data) return false
 
     const missingValue = data.find(element => element.value === -1)
@@ -175,7 +204,7 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
     return true
   }
 
-  private calculatePerformanceIndicatorValue(data: IDataload[]): number {
+  private calculatePerformanceIndicatorValue(data: Dataload[]): number {
     return data.reduce((a, b) => a + b.value, 0)
   }
 
@@ -186,20 +215,24 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
     return 1 - dataSum / comparisonDataSum
   }
 
-  private async fetchSingleFLuidGraphData(
-    timePeriod: ITimePeriod,
+  private async fetchSingleFluidGraphData(
+    timePeriod: TimePeriod,
     timeStep: TimeStep,
     fluidType: FluidType,
-    compareTimePeriod?: ITimePeriod
-  ): Promise<IChartData | null> {
-    let actualData: IDataload[] | null = []
-    let comparisonData: IDataload[] | null = []
-    let singleFluidGraphData: IChartData | null = null
+    compareTimePeriod?: TimePeriod
+  ): Promise<ChartData | null> {
+    let actualData: Dataload[] | null = []
+    let comparisonData: Dataload[] | null = []
+    let singleFluidGraphData: Datachart | null = null
 
     if (compareTimePeriod) {
       const result = await Promise.all([
-        this._queryRunner.fetchFluidData(timePeriod, timeStep, fluidType),
-        this._queryRunner.fetchFluidData(
+        this._queryRunnerService.fetchFluidData(
+          timePeriod,
+          timeStep,
+          fluidType
+        ),
+        this._queryRunnerService.fetchFluidData(
           compareTimePeriod,
           timeStep,
           fluidType
@@ -207,12 +240,13 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
       ])
       actualData = result[0]
       comparisonData = result[1]
-    } else
-      actualData = await this._queryRunner.fetchFluidData(
+    } else {
+      actualData = await this._queryRunnerService.fetchFluidData(
         timePeriod,
         timeStep,
         fluidType
       )
+    }
 
     if (actualData) {
       singleFluidGraphData = {
@@ -224,28 +258,28 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
   }
 
   private formatGraphDataManage(
-    data: IChartData | null,
+    data: Datachart | null,
     timeStep: TimeStep,
-    timePeriod: ITimePeriod,
-    compareTimePeriod: ITimePeriod | null
-  ): IChartData | null {
+    timePeriod: TimePeriod,
+    compareTimePeriod: TimePeriod | null
+  ): Datachart | null {
     if (!data) return null
 
-    const formattedActualData: IDataload[] = this._consumptionDataFormatter.formatGraphData(
+    const formattedActualData: Dataload[] = this._consumptionFormatterService.formatGraphData(
       data.actualData,
       timePeriod,
       timeStep
     )
 
-    let formattedComparisonData: IDataload[] | null = null
+    let formattedComparisonData: Dataload[] | null = null
     if (compareTimePeriod)
-      formattedComparisonData = this._consumptionDataFormatter.formatGraphData(
+      formattedComparisonData = this._consumptionFormatterService.formatGraphData(
         data.comparisonData ? data.comparisonData : [],
         compareTimePeriod,
         timeStep
       )
 
-    const result: IChartData = {
+    const result: Datachart = {
       actualData: formattedActualData,
       comparisonData: formattedComparisonData,
     }
@@ -259,11 +293,13 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
   ): Promise<DateTime | null> {
     let lastDay = null
     if (fluidTypes.length === 1) {
-      lastDay = (await this._queryRunner.getLastDateData(fluidTypes[0])) || null
+      lastDay =
+        (await this._queryRunnerService.getLastDateData(fluidTypes[0])) || null
     } else if (fluidTypes.length > 1) {
       const lastDays = []
       for (const fluidType of fluidTypes) {
-        lastDay = (await this._queryRunner.getLastDateData(fluidType)) || null
+        lastDay =
+          (await this._queryRunnerService.getLastDateData(fluidType)) || null
 
         if (lastDay) {
           lastDays.push(lastDay)
@@ -287,11 +323,33 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
     return lastDay
   }
 
+  public async fetchAllLastDateData(
+    fluidTypes: FluidType[]
+  ): Promise<(DateTime | null)[]> {
+    let lastDay = null
+    const lastDays = []
+    if (fluidTypes.length === 1) {
+      lastDay =
+        (await this._queryRunnerService.getLastDateData(fluidTypes[0])) || null
+      lastDays.push(lastDay)
+    } else if (fluidTypes.length > 1) {
+      for (const fluidType of fluidTypes) {
+        lastDay =
+          (await this._queryRunnerService.getLastDateData(fluidType)) || null
+        lastDays.push(lastDay)
+      }
+    }
+    return lastDays
+  }
+
   public async checkDoctypeEntries(
     fluideType: FluidType,
     timeStep: TimeStep
   ): Promise<boolean> {
-    const queryResult = await this._queryRunner.getEntries(fluideType, timeStep)
+    const queryResult = await this._queryRunnerService.getEntries(
+      fluideType,
+      timeStep
+    )
     if (queryResult.data.length > 0) {
       return true
     }
@@ -301,10 +359,10 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
   private aggregateGraphData(
     singleFluidCharts: ISingleFluidChartData[]
     //,withComparison: boolean = true
-  ): IChartData | null {
+  ): Datachart | null {
     if (singleFluidCharts && singleFluidCharts[0].chartData) {
-      const ltcc = new LoadToCurrencyConverter()
-      const resultChartData: IChartData = {
+      const converterService = new ConverterService()
+      const resultChartData: Datachart = {
         actualData: [],
         comparisonData: [],
       }
@@ -344,14 +402,17 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
           let convertedValue = -1
           if (value === -1) noDataCount++
           else {
-            convertedValue = ltcc.Convert(value, singleFluidChart.chartFluid)
+            convertedValue = converterService.LoadToEuro(
+              value,
+              singleFluidChart.chartFluid
+            )
             agreggatedConvertedValue += convertedValue
           }
 
           let convertedComparisonValue = -1
           if (comparisonValue === -1) comparisonNoDataCount++
           else {
-            convertedComparisonValue = ltcc.Convert(
+            convertedComparisonValue = converterService.LoadToEuro(
               comparisonValue,
               singleFluidChart.chartFluid
             )
@@ -370,7 +431,7 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
           comparisonAgreggatedConvertedValue = -1
 
         if (singleFluidCharts[0].chartData.actualData[i]) {
-          const acutaldataLoad: IDataload = {
+          const acutaldataLoad: Dataload = {
             date: singleFluidCharts[0].chartData.actualData[i].date,
             value: agreggatedConvertedValue,
             valueDetail:
@@ -384,7 +445,7 @@ export default class ConsumptionDataManager implements IConsumptionDataManager {
           resultChartData.comparisonData &&
           singleFluidCharts[0].chartData.comparisonData[i]
         ) {
-          const comparisondataLoad: IDataload = {
+          const comparisondataLoad: Dataload = {
             date: singleFluidCharts[0].chartData.comparisonData[i].date,
             value: comparisonAgreggatedConvertedValue,
             valueDetail:
diff --git a/src/services/consumptionDataFormatterService.ts b/src/services/consumptionFormatter.service.ts
similarity index 72%
rename from src/services/consumptionDataFormatterService.ts
rename to src/services/consumptionFormatter.service.ts
index de3c0f75e6c9088c206eb5a156ce5242caf0b905..f810dee905ea8598107db154f0abcf62d0b7d0a9 100644
--- a/src/services/consumptionDataFormatterService.ts
+++ b/src/services/consumptionFormatter.service.ts
@@ -1,15 +1,15 @@
 /* eslint-disable @typescript-eslint/interface-name-prefix */
-import { TimeStep, ITimePeriod, IDataload } from './dataConsumptionContracts'
-import { compareDates } from 'utils/utils'
-import { compareStepDate } from './dateChartService'
-//import _ from 'lodash'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Dataload, TimePeriod } from 'models'
+import DateChartService from 'services/dateChart.service'
+import { compareDates } from 'utils/date'
 
-export default class ConsumptionDataFormatter {
+export default class ConsumptionFormatterService {
   public formatGraphData(
-    data: IDataload[],
-    timePeriod: ITimePeriod,
+    data: Dataload[],
+    timePeriod: TimePeriod,
     timeStep: TimeStep
-  ): IDataload[] {
+  ): Dataload[] {
     data.sort((dataA, dataB) => compareDates(dataA.date, dataB.date))
 
     const formattedData = this.fillMissingData(data, timePeriod, timeStep)
@@ -20,17 +20,18 @@ export default class ConsumptionDataFormatter {
   }
 
   private fillMissingData(
-    data: IDataload[],
-    timePeriod: ITimePeriod,
+    data: Dataload[],
+    timePeriod: TimePeriod,
     timeStep: TimeStep
-  ): IDataload[] {
+  ): Dataload[] {
     const filledData = []
     let parsingDate = timePeriod.startDate
 
+    const dateChartService = new DateChartService()
     while (parsingDate <= timePeriod.endDate) {
       //const filtereddata = data.filter(dt => dt.date.equals(parsingDate))
       const filtereddata = data.filter(dt =>
-        compareStepDate(timeStep, dt.date, parsingDate)
+        dateChartService.compareStepDate(timeStep, dt.date, parsingDate)
       )
 
       const newElement = filtereddata[0]
diff --git a/src/services/consumptionDataValidatorService.ts b/src/services/consumptionValidator.service.ts
similarity index 79%
rename from src/services/consumptionDataValidatorService.ts
rename to src/services/consumptionValidator.service.ts
index 4ae36fed62149da06319f8ffd5be0d2e75a9c581..549a4af5068f174f046e559541b38bb6423597e4 100644
--- a/src/services/consumptionDataValidatorService.ts
+++ b/src/services/consumptionValidator.service.ts
@@ -1,13 +1,14 @@
-import { ITimePeriod, TimeStep } from './dataConsumptionContracts'
 import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { TimePeriod } from 'models'
 import { Interval } from 'luxon'
 
-export default class ConsumptionDataValidator {
+export default class ConsumptionValidatorService {
   public ValidateGetGraphData(
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     timeStep: TimeStep,
     fluidTypes: FluidType[],
-    compareTimePeriod?: ITimePeriod
+    compareTimePeriod?: TimePeriod
   ): boolean {
     if (fluidTypes.length === 0) return false
     if (!this.ValidateTimePeriod(timePeriod)) return false
@@ -34,7 +35,7 @@ export default class ConsumptionDataValidator {
   }
 
   private ValidateTimePeriodLength(
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     timeStep: TimeStep
   ): boolean {
     const interval = Interval.fromDateTimes(
@@ -43,14 +44,14 @@ export default class ConsumptionDataValidator {
     )
     if (timeStep == TimeStep.HALF_AN_HOUR && interval.length('hour') > 24)
       return false
-    if (timeStep == TimeStep.DAY && interval.length('day') > 31) return false
+    if (timeStep == TimeStep.DAY && interval.length('day') > 36) return false
     if (timeStep == TimeStep.MONTH && interval.length('month') > 12)
       return false
     if (timeStep == TimeStep.YEAR && interval.length('year') > 10) return false
     return true
   }
 
-  private ValidateTimePeriod(timePeriod: ITimePeriod): boolean {
+  private ValidateTimePeriod(timePeriod: TimePeriod): boolean {
     return timePeriod.endDate >= timePeriod.startDate
   }
 }
diff --git a/src/services/loadToCurrencyConverterService.ts b/src/services/converter.service.ts
similarity index 57%
rename from src/services/loadToCurrencyConverterService.ts
rename to src/services/converter.service.ts
index b6069940329bec113ba324073382e4471b3a8eec..5a6f94061ee3eaa2cf1e1a41bf80e34d9eb5a799 100644
--- a/src/services/loadToCurrencyConverterService.ts
+++ b/src/services/converter.service.ts
@@ -1,18 +1,17 @@
 import { FluidType } from 'enum/fluid.enum'
 import Config from '../../config.json'
-import IFluidConfig from './IFluidConfig'
+import { FluidConfig } from 'models'
 
-export default class LoadToCurrencyConverter {
-  private readonly _fluidConfig: IFluidConfig[]
+export default class ConverterService {
+  private readonly _fluidConfig: FluidConfig[]
 
   constructor() {
     this._fluidConfig = Config.fluidConfig
   }
 
-  public Convert(load: number, fluidType: FluidType): number {
+  public LoadToEuro(load: number, fluidType: FluidType): number {
     const convertedLoad: number =
       load * this._fluidConfig[fluidType].coefficient
-
     return convertedLoad
   }
 }
diff --git a/src/services/dataChallengeContracts.ts b/src/services/dataChallengeContracts.ts
deleted file mode 100644
index 766705ac0ab45e6866a32107b6866e7f24c871f9..0000000000000000000000000000000000000000
--- a/src/services/dataChallengeContracts.ts
+++ /dev/null
@@ -1,193 +0,0 @@
-import { DateTime, Duration } from 'luxon'
-import { FluidType } from 'enum/fluid.enum'
-
-export enum TypeChallenge {
-  CHALLENGE = 0,
-  ACHIEVEMENT = 1,
-}
-
-export class ChallengeType {
-  id: string
-  type: TypeChallenge
-  title: string
-  description: string
-  level: number
-  duration: Duration
-  fluidTypes: FluidType[]
-  availableEcogestures: EcogestureType[]
-
-  constructor(
-    id: string,
-    type: TypeChallenge,
-    title: string,
-    description: string,
-    level: number,
-    duration: Duration,
-    fluidTypes: FluidType[],
-    availaibleEcogestures: EcogestureType[]
-  ) {
-    this.id = id
-    this.type = type
-    this.title = title
-    this.description = description
-    this.level = level
-    this.duration = duration
-    this.fluidTypes = fluidTypes
-    this.availableEcogestures = availaibleEcogestures
-  }
-}
-
-export class EcogestureType {
-  id: string
-  shortName: string
-  longName: string
-  shortDescription: string
-  longDescription: string
-  usage: string
-  fluidTypes: FluidType[]
-  nwh: number
-  pack: number
-  iconName: string
-  unlocked?: boolean
-
-  constructor(
-    id: string,
-    shortName: string,
-    longName: string,
-    shortDescription: string,
-    longDescription: string,
-    usage: string,
-    fluidTypes: FluidType[],
-    nwh: number,
-    pack: number,
-    iconName: string,
-    unlocked?: boolean
-  ) {
-    this.id = id
-    this.shortName = shortName
-    this.shortDescription = shortDescription
-    this.longName = longName
-    this.longDescription = longDescription
-    this.usage = usage
-    this.fluidTypes = fluidTypes
-    this.nwh = nwh
-    this.pack = pack
-    this.iconName = iconName
-    this.unlocked = unlocked
-  }
-}
-
-export enum ChallengeState {
-  ONGOING = 0,
-  FINISHED = 1,
-  ABANDONED = 2,
-}
-
-export enum SelectView {
-  BADGES = 0,
-  ECOGESTURES = 1,
-}
-
-export enum BadgeState {
-  FAILED = 0,
-  SUCCESS = 1,
-}
-
-export class UserChallenge {
-  id?: string
-  startingDate: DateTime
-  endingDate: DateTime
-  state: ChallengeState
-  selectedEcogestures: EcogestureType[]
-  challengeType: ChallengeType | null
-  maxEnergy: number
-  currentEnergy: number
-  badge: BadgeState | null
-  fluidTypes: FluidType[]
-
-  constructor(
-    startingDate: DateTime,
-    endingDate: DateTime,
-    state: ChallengeState,
-    selectedEcogestures: EcogestureType[],
-    challengeType: ChallengeType | null,
-    maxEnergy: number,
-    currentEnergy: number,
-    badge: BadgeState | null,
-    fluidTypes: FluidType[],
-    id?: string
-  ) {
-    this.startingDate = startingDate
-    this.endingDate = endingDate
-    this.state = state
-    this.selectedEcogestures = selectedEcogestures
-    this.challengeType = challengeType
-    this.maxEnergy = maxEnergy
-    this.currentEnergy = currentEnergy
-    this.badge = badge
-    this.fluidTypes = fluidTypes
-    this.id = id
-  }
-
-  public hasChallengeEnded(): boolean {
-    // TO DO: logic to check if the challenges has ended
-    return false
-  }
-}
-
-export class UserProfile {
-  id: string
-  level: number
-  challengeTypeHash: string
-  ecogestureHash: string
-  haveSeenWelcomeModal: boolean
-
-  constructor(
-    id: string,
-    level: number,
-    challengeTypeHash: string,
-    ecogestureHash: string,
-    haveSeenWelcomeModal: boolean
-  ) {
-    this.id = id
-    this.level = level
-    this.challengeTypeHash = challengeTypeHash
-    this.ecogestureHash = ecogestureHash
-    this.haveSeenWelcomeModal = haveSeenWelcomeModal
-  }
-}
-
-// eslint-disable-next-line @typescript-eslint/interface-name-prefix
-export interface IChallengeManager {
-  getCurrentChallenge(withEcogestures?: boolean): Promise<UserChallenge | null>
-
-  updateChallengeState(
-    id: string,
-    newState: number
-  ): Promise<UserChallenge | null>
-  cancelChallenge(id: string): Promise<UserChallenge | null>
-
-  // fulfillChallenge(challenge: UserChallenge): Promise<UserChallenge | null>
-
-  startChallenge(
-    challenge: ChallengeType,
-    fluidTypes: FluidType[],
-    selectedEcogestes: EcogestureType[]
-  ): Promise<UserChallenge | null>
-
-  getAvailableChallenges(
-    fluidTypes?: FluidType[]
-  ): Promise<ChallengeType[] | null>
-
-  // getUnlockedBadges(): Promise<ChallengeType[] | null>
-
-  getUnlockedEcogestures(): Promise<EcogestureType[] | null>
-}
-
-// eslint-disable-next-line @typescript-eslint/interface-name-prefix
-export interface IUserProfileManager {
-  getUserProfile(): Promise<UserProfile | null>
-  updateUserProfile(attributes: {
-    [key: string]: string
-  }): Promise<UserProfile | null>
-}
diff --git a/src/services/dataConsumptionContracts.ts b/src/services/dataConsumptionContracts.ts
deleted file mode 100644
index ef8373498613e85d5600e8f4640d4aae5c9b39d3..0000000000000000000000000000000000000000
--- a/src/services/dataConsumptionContracts.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-/* eslint-disable @typescript-eslint/interface-name-prefix */
-import { DateTime } from 'luxon'
-
-import { FluidType } from 'enum/fluid.enum'
-//import _ from 'lodash'
-
-export interface IDataload {
-  date: DateTime
-  value: number
-  valueDetail?: number[] | null
-}
-
-export interface IPerformanceIndicator {
-  value: number | null
-  compareValue: number | null
-  percentageVariation: number | null
-}
-
-class Dataload implements IDataload {
-  date: DateTime
-  value: number
-  valueDetail?: number[]
-
-  constructor(date: DateTime, value: number, valueDetail?: number[]) {
-    this.date = date
-    this.value = value
-    this.valueDetail = valueDetail
-  }
-}
-
-export interface IChartData {
-  actualData: IDataload[]
-  comparisonData: IDataload[] | null
-}
-
-export class ChartData implements IChartData {
-  actualData: IDataload[]
-  comparisonData: IDataload[] | null
-
-  constructor(actualData: IDataload[], comparisonData?: IDataload[]) {
-    this.actualData = actualData
-    if (comparisonData) this.comparisonData = comparisonData
-    else this.comparisonData = null
-  }
-}
-
-export interface ITimePeriod {
-  startDate: DateTime
-  endDate: DateTime
-}
-
-export class TimePeriod implements ITimePeriod {
-  startDate: DateTime
-  endDate: DateTime
-
-  constructor(startDate: DateTime, endDate: DateTime) {
-    this.startDate = startDate
-    this.endDate = endDate
-  }
-}
-
-export enum TimeStep {
-  HALF_AN_HOUR = 10,
-  HOUR = 15,
-  DAY = 20,
-  WEEK = 30,
-  MONTH = 40,
-  YEAR = 50,
-}
-
-export interface IConsumptionDataManager {
-  getGraphData(
-    timePeriod: ITimePeriod,
-    timeStep: TimeStep,
-    fluidTypes: FluidType[],
-    compareTimePeriod?: ITimePeriod
-  ): Promise<IChartData | null>
-
-  fetchLastDateData(fluidType: FluidType[]): Promise<DateTime | null>
-
-  getPerformanceIndicators(
-    timePeriod: ITimePeriod,
-    timeStep: TimeStep,
-    fluidTypes: FluidType[],
-    compareTimePeriod?: ITimePeriod
-  ): Promise<IPerformanceIndicator[]>
-}
diff --git a/src/services/dateChart.service.ts b/src/services/dateChart.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..49a1921f3cc685a4d4b84eb00bdffc24728b9b68
--- /dev/null
+++ b/src/services/dateChart.service.ts
@@ -0,0 +1,280 @@
+import { DateTime, Interval } from 'luxon'
+
+import { FluidType } from 'enum/fluid.enum'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Dataload, TimePeriod } from 'models'
+
+export default class DateChartService {
+  public defineTimePeriod(
+    referenceDate: DateTime,
+    timeStep: TimeStep,
+    index: number
+  ): TimePeriod {
+    let date: DateTime
+    switch (timeStep) {
+      case TimeStep.YEAR:
+        date = referenceDate.set({
+          month: 1,
+          day: 1,
+          hour: 0,
+          minute: 0,
+          second: 0,
+          millisecond: 0,
+        })
+        return {
+          startDate: date.plus({ years: -5 * index - (5 - 1) }),
+          endDate: date.plus({ years: -5 * index }),
+        }
+      case TimeStep.MONTH:
+        date = referenceDate.set({
+          month: 12,
+          day: 1,
+          hour: 0,
+          minute: 0,
+          second: 0,
+          millisecond: 0,
+        })
+        return {
+          startDate: date.plus({ months: -12 * index - (12 - 1) }),
+          endDate: date.plus({ months: -12 * index }),
+        }
+      case TimeStep.DAY:
+        date = referenceDate
+          .endOf('week')
+          .set({ hour: 0, minute: 0, second: 0, millisecond: 0 })
+        return {
+          startDate: date.plus({ days: -7 * index - (7 - 1) }),
+          endDate: date.plus({ days: -7 * index }),
+        }
+      case TimeStep.HOUR:
+        date = referenceDate.set({
+          hour: 23,
+          minute: 0,
+          second: 0,
+          millisecond: 0,
+        })
+        return {
+          startDate: date
+            .set({ hour: 0, minute: 0 })
+            .plus({ days: -1 * index }),
+          endDate: date.plus({ days: -1 * index }),
+        }
+      case TimeStep.HALF_AN_HOUR:
+        date = referenceDate.set({ hour: 23, minute: 30 })
+        return {
+          startDate: date
+            .set({ hour: 0, minute: 0 })
+            .plus({ days: -1 * index }),
+          endDate: date.plus({ days: -1 * index }),
+        }
+      default:
+        date = referenceDate
+        return {
+          startDate: date.plus({ days: -7 * index - (7 - 1) }),
+          endDate: date.plus({ days: -7 * index }),
+        }
+    }
+  }
+
+  public defineFirstStepDate(
+    referenceDate: DateTime,
+    timeStep: TimeStep,
+    index: number
+  ): DateTime {
+    const period = this.defineTimePeriod(referenceDate, timeStep, index)
+    return period.startDate
+  }
+
+  public defineLastStepDate(
+    referenceDate: DateTime,
+    timeStep: TimeStep,
+    index: number
+  ): DateTime {
+    const period = this.defineTimePeriod(referenceDate, timeStep, index)
+    return period.endDate
+  }
+
+  public compareStepDate(
+    timeStep: TimeStep,
+    date1: DateTime,
+    date2: DateTime
+  ): boolean {
+    switch (timeStep) {
+      case TimeStep.YEAR:
+        return date1.year === date2.year
+      case TimeStep.MONTH:
+        return date1.year === date2.year && date1.month === date2.month
+      case TimeStep.DAY:
+        return (
+          date1.year === date2.year &&
+          date1.month === date2.month &&
+          date1.day === date2.day
+        )
+      case TimeStep.HOUR:
+        return (
+          date1.year === date2.year &&
+          date1.month === date2.month &&
+          date1.day === date2.day &&
+          date1.hour === date2.hour
+        )
+      case TimeStep.HALF_AN_HOUR:
+        return (
+          date1.year === date2.year &&
+          date1.month === date2.month &&
+          date1.day === date2.day &&
+          date1.hour === date2.hour &&
+          Math.abs(date1.minute - date2.minute) < 30
+        )
+      default:
+        return false
+    }
+  }
+
+  public defineDetailedTimeStep(
+    timeStep: TimeStep,
+    fluidTypes: FluidType[]
+  ): TimeStep {
+    if (fluidTypes.length === 1) {
+      switch (timeStep) {
+        case TimeStep.YEAR:
+          return TimeStep.MONTH
+        case TimeStep.MONTH:
+          return TimeStep.DAY
+        case TimeStep.DAY:
+          return fluidTypes[0] === FluidType.ELECTRICITY
+            ? TimeStep.HALF_AN_HOUR
+            : TimeStep.HOUR
+        case TimeStep.HOUR:
+          return TimeStep.HOUR
+        case TimeStep.HALF_AN_HOUR:
+          return TimeStep.HALF_AN_HOUR
+        default:
+          return timeStep
+      }
+    } else {
+      switch (timeStep) {
+        case TimeStep.YEAR:
+          return TimeStep.MONTH
+        case TimeStep.MONTH:
+          return TimeStep.DAY
+        default:
+          return timeStep
+      }
+    }
+  }
+
+  public formatDetailedDate(date: DateTime, timeStep: TimeStep): DateTime {
+    switch (timeStep) {
+      case TimeStep.YEAR:
+        return date
+      case TimeStep.MONTH:
+        return date.set({
+          month: 1,
+          day: 1,
+          hour: 0,
+          minute: 0,
+          second: 0,
+          millisecond: 0,
+        })
+      case TimeStep.DAY:
+        return date.set({
+          day: 1,
+          hour: 0,
+          minute: 0,
+          second: 0,
+          millisecond: 0,
+        })
+      case TimeStep.HOUR:
+        return date.set({ hour: 0, minute: 0, second: 0, millisecond: 0 })
+      case TimeStep.HALF_AN_HOUR:
+        return date.set({ minute: 0, second: 0, millisecond: 0 })
+      default:
+        return date
+    }
+  }
+
+  public incrementDate(
+    increment: number,
+    initialdate: DateTime,
+    timeStep: TimeStep,
+    lastDataDate: DateTime
+  ): { incrementIndex: number; incrementedDate: DateTime } {
+    let incrementIndex = 0
+    let incrementedDate: DateTime = initialdate
+    switch (timeStep) {
+      case TimeStep.YEAR:
+        incrementedDate = initialdate.plus({ year: increment })
+        incrementIndex =
+          increment < 0 &&
+          lastDataDate.year >= incrementedDate.year &&
+          (lastDataDate.year - incrementedDate.year) % 5 === 0
+            ? 1
+            : increment > 0 &&
+              lastDataDate.year >= incrementedDate.year &&
+              (lastDataDate.year - incrementedDate.year) % 5 === 4
+            ? -1
+            : increment < 0 &&
+              lastDataDate.year <= incrementedDate.year &&
+              (incrementedDate.year - lastDataDate.year) % 5 === 0
+            ? 1
+            : increment > 0 &&
+              lastDataDate.year <= incrementedDate.year &&
+              (incrementedDate.year - lastDataDate.year) % 5 === 1
+            ? -1
+            : 0
+        break
+      case TimeStep.MONTH:
+        incrementedDate = initialdate.plus({ month: increment })
+        incrementIndex = initialdate.year - incrementedDate.year
+        break
+      case TimeStep.DAY:
+        incrementedDate = initialdate.plus({ day: increment })
+        if (initialdate.weekday === 1 && incrementedDate.weekday === 7) {
+          incrementIndex = 1
+        } else if (initialdate.weekday === 7 && incrementedDate.weekday === 1) {
+          incrementIndex = -1
+        } else {
+          incrementIndex = 0
+        }
+        break
+      case TimeStep.HOUR:
+        incrementedDate = initialdate.plus({ hour: increment })
+        if (initialdate.hour === 0 && incrementedDate.hour === 23) {
+          incrementIndex = 1
+        } else if (initialdate.hour === 23 && incrementedDate.hour === 0) {
+          incrementIndex = -1
+        } else {
+          incrementIndex = 0
+        }
+        break
+      case TimeStep.HALF_AN_HOUR:
+        incrementedDate = initialdate.plus({ minute: increment * 30 })
+        if (initialdate.hour === 0 && incrementedDate.hour === 23) {
+          incrementIndex = 1
+        } else if (initialdate.hour === 23 && incrementedDate.hour === 0) {
+          incrementIndex = -1
+        } else {
+          incrementIndex = 0
+        }
+        break
+    }
+    return { incrementIndex, incrementedDate }
+  }
+
+  public isDataToCome(dataload: Dataload, fluidType: FluidType) {
+    const inter =
+      dataload &&
+      Interval.fromDateTimes(dataload.date, DateTime.local()).count('days')
+    if (fluidType === FluidType.ELECTRICITY && inter < 2) {
+      return true
+    }
+    if (fluidType === FluidType.WATER && inter < 4) {
+      return true
+    }
+    if (fluidType === FluidType.GAS && inter < 3) {
+      return true
+    } else {
+      return false
+    }
+  }
+}
diff --git a/src/services/dateChartService.ts b/src/services/dateChartService.ts
deleted file mode 100644
index 6943921f181748529f1d19a67f2414d166ed669e..0000000000000000000000000000000000000000
--- a/src/services/dateChartService.ts
+++ /dev/null
@@ -1,278 +0,0 @@
-import { DateTime, Interval } from 'luxon'
-import { FluidType } from 'enum/fluid.enum'
-import {
-  TimeStep,
-  TimePeriod,
-  IDataload,
-} from 'services/dataConsumptionContracts'
-
-export function defineTimePeriod(
-  referenceDate: DateTime,
-  timeStep: TimeStep,
-  index: number
-): TimePeriod {
-  let date: DateTime
-  switch (timeStep) {
-    case TimeStep.YEAR:
-      date = referenceDate.set({
-        month: 1,
-        day: 1,
-        hour: 0,
-        minute: 0,
-        second: 0,
-        millisecond: 0,
-      })
-      return new TimePeriod(
-        date.plus({ years: -5 * index - (5 - 1) }),
-        date.plus({ years: -5 * index })
-      )
-    case TimeStep.MONTH:
-      date = referenceDate.set({
-        month: 12,
-        day: 1,
-        hour: 0,
-        minute: 0,
-        second: 0,
-        millisecond: 0,
-      })
-      return new TimePeriod(
-        date.plus({ months: -12 * index - (12 - 1) }),
-        date.plus({ months: -12 * index })
-      )
-    case TimeStep.DAY:
-      date = referenceDate
-        .endOf('week')
-        .set({ hour: 0, minute: 0, second: 0, millisecond: 0 })
-      return new TimePeriod(
-        date.plus({ days: -7 * index - (7 - 1) }),
-        date.plus({ days: -7 * index })
-      )
-    case TimeStep.HOUR:
-      date = referenceDate.set({
-        hour: 23,
-        minute: 0,
-        second: 0,
-        millisecond: 0,
-      })
-      return new TimePeriod(
-        date.set({ hour: 0, minute: 0 }).plus({ days: -1 * index }),
-        date.plus({ days: -1 * index })
-      )
-    case TimeStep.HALF_AN_HOUR:
-      date = referenceDate.set({ hour: 23, minute: 30 })
-      return new TimePeriod(
-        date.set({ hour: 0, minute: 0 }).plus({ days: -1 * index }),
-        date.plus({ days: -1 * index })
-      )
-    default:
-      date = referenceDate
-      return new TimePeriod(
-        date.plus({ days: -7 * index - (7 - 1) }),
-        date.plus({ days: -7 * index })
-      )
-  }
-}
-
-export function defineFirstStepDate(
-  referenceDate: DateTime,
-  timeStep: TimeStep,
-  index: number
-): DateTime {
-  const period = defineTimePeriod(referenceDate, timeStep, index)
-  return period.startDate
-}
-
-export function defineLastStepDate(
-  referenceDate: DateTime,
-  timeStep: TimeStep,
-  index: number
-): DateTime {
-  const period = defineTimePeriod(referenceDate, timeStep, index)
-  return period.endDate
-}
-
-export function compareStepDate(
-  timeStep: TimeStep,
-  date1: DateTime,
-  date2: DateTime
-): boolean {
-  switch (timeStep) {
-    case TimeStep.YEAR:
-      return date1.year === date2.year
-    case TimeStep.MONTH:
-      return date1.year === date2.year && date1.month === date2.month
-    case TimeStep.DAY:
-      return (
-        date1.year === date2.year &&
-        date1.month === date2.month &&
-        date1.day === date2.day
-      )
-    case TimeStep.HOUR:
-      return (
-        date1.year === date2.year &&
-        date1.month === date2.month &&
-        date1.day === date2.day &&
-        date1.hour === date2.hour
-      )
-    case TimeStep.HALF_AN_HOUR:
-      return (
-        date1.year === date2.year &&
-        date1.month === date2.month &&
-        date1.day === date2.day &&
-        date1.hour === date2.hour &&
-        Math.abs(date1.minute - date2.minute) < 30
-      )
-    default:
-      return false
-  }
-}
-
-export function defineDetailedTimeStep(
-  timeStep: TimeStep,
-  fluidTypes: FluidType[]
-): TimeStep {
-  if (fluidTypes.length === 1) {
-    switch (timeStep) {
-      case TimeStep.YEAR:
-        return TimeStep.MONTH
-      case TimeStep.MONTH:
-        return TimeStep.DAY
-      case TimeStep.DAY:
-        switch (fluidTypes[0]) {
-          case FluidType.ELECTRICITY:
-            return TimeStep.HALF_AN_HOUR
-          case FluidType.WATER:
-            return TimeStep.HOUR
-          case FluidType.GAS:
-            return TimeStep.HOUR
-        }
-      case TimeStep.HOUR:
-        return TimeStep.HOUR
-      case TimeStep.HALF_AN_HOUR:
-        return TimeStep.HALF_AN_HOUR
-      default:
-        return timeStep
-    }
-  } else {
-    switch (timeStep) {
-      case TimeStep.YEAR:
-        return TimeStep.MONTH
-      case TimeStep.MONTH:
-        return TimeStep.DAY
-      default:
-        return timeStep
-    }
-  }
-}
-
-export function formatDetailedDate(
-  date: DateTime,
-  timeStep: TimeStep
-): DateTime {
-  switch (timeStep) {
-    case TimeStep.YEAR:
-      return date
-    case TimeStep.MONTH:
-      return date.set({
-        month: 1,
-        day: 1,
-        hour: 0,
-        minute: 0,
-        second: 0,
-        millisecond: 0,
-      })
-    case TimeStep.DAY:
-      return date.set({ day: 1, hour: 0, minute: 0, second: 0, millisecond: 0 })
-    case TimeStep.HOUR:
-      return date.set({ hour: 0, minute: 0, second: 0, millisecond: 0 })
-    case TimeStep.HALF_AN_HOUR:
-      return date.set({ minute: 0, second: 0, millisecond: 0 })
-    default:
-      return date
-  }
-}
-
-export function incrementDate(
-  increment: number,
-  initialdate: DateTime,
-  timeStep: TimeStep,
-  lastDataDate: DateTime
-): { incrementIndex: number; incrementedDate: DateTime } {
-  let incrementIndex = 0
-  let incrementedDate: DateTime = initialdate
-  switch (timeStep) {
-    case TimeStep.YEAR:
-      incrementedDate = initialdate.plus({ year: increment })
-      incrementIndex =
-        increment < 0 &&
-        lastDataDate.year >= incrementedDate.year &&
-        (lastDataDate.year - incrementedDate.year) % 5 === 0
-          ? 1
-          : increment > 0 &&
-            lastDataDate.year >= incrementedDate.year &&
-            (lastDataDate.year - incrementedDate.year) % 5 === 4
-          ? -1
-          : increment < 0 &&
-            lastDataDate.year <= incrementedDate.year &&
-            (incrementedDate.year - lastDataDate.year) % 5 === 0
-          ? 1
-          : increment > 0 &&
-            lastDataDate.year <= incrementedDate.year &&
-            (incrementedDate.year - lastDataDate.year) % 5 === 1
-          ? -1
-          : 0
-      break
-    case TimeStep.MONTH:
-      incrementedDate = initialdate.plus({ month: increment })
-      incrementIndex = initialdate.year - incrementedDate.year
-      break
-    case TimeStep.DAY:
-      incrementedDate = initialdate.plus({ day: increment })
-      if (initialdate.weekday === 1 && incrementedDate.weekday === 7) {
-        incrementIndex = 1
-      } else if (initialdate.weekday === 7 && incrementedDate.weekday === 1) {
-        incrementIndex = -1
-      } else {
-        incrementIndex = 0
-      }
-      break
-    case TimeStep.HOUR:
-      incrementedDate = initialdate.plus({ hour: increment })
-      if (initialdate.hour === 0 && incrementedDate.hour === 23) {
-        incrementIndex = 1
-      } else if (initialdate.hour === 23 && incrementedDate.hour === 0) {
-        incrementIndex = -1
-      } else {
-        incrementIndex = 0
-      }
-      break
-    case TimeStep.HALF_AN_HOUR:
-      incrementedDate = initialdate.plus({ minute: increment * 30 })
-      if (initialdate.hour === 0 && incrementedDate.hour === 23) {
-        incrementIndex = 1
-      } else if (initialdate.hour === 23 && incrementedDate.hour === 0) {
-        incrementIndex = -1
-      } else {
-        incrementIndex = 0
-      }
-      break
-  }
-  return { incrementIndex, incrementedDate }
-}
-
-export const isDataToCome = (dataload: IDataload, fluidType: FluidType) => {
-  const inter =
-    dataload &&
-    Interval.fromDateTimes(dataload.date, DateTime.local()).count('days')
-  if (fluidType === FluidType.ELECTRICITY && inter < 2) {
-    return true
-  }
-  if (fluidType === FluidType.WATER && inter < 4) {
-    return true
-  }
-  if (fluidType === FluidType.GAS && inter < 3) {
-    return true
-  } else {
-    return false
-  }
-}
diff --git a/src/services/ecogestureDataManagerService.ts b/src/services/ecogesture.service.ts
similarity index 79%
rename from src/services/ecogestureDataManagerService.ts
rename to src/services/ecogesture.service.ts
index 21a74a9a58f59c4a79427cf5b7644b81260e29f3..fb806511ac3aa9a1281c28676f8b1665a30ed370 100644
--- a/src/services/ecogestureDataManagerService.ts
+++ b/src/services/ecogesture.service.ts
@@ -1,15 +1,15 @@
 import { Client } from 'cozy-client'
 import { ECOGESTURE_DOCTYPE } from 'doctypes'
-import { EcogestureType } from './dataChallengeContracts'
+import { Ecogesture } from 'models'
 
-export default class EcogestureDataManagerService {
+export default class EcogestureService {
   private readonly _client: Client
 
   constructor(_client: Client) {
     this._client = _client
   }
 
-  public async getAllEcogestures(): Promise<EcogestureType[] | null> {
+  public async getAllEcogestures(): Promise<Ecogesture[] | null> {
     const ecogestures = await this._client.query(
       this._client.find(ECOGESTURE_DOCTYPE)
     )
diff --git a/src/services/errorService.js b/src/services/errorService.js
deleted file mode 100644
index 8cadd55d9399b7b141f315aac1661e820d35772b..0000000000000000000000000000000000000000
--- a/src/services/errorService.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function createError(message, reason, innerStack = null, status = null) {
-  const error = new Error(message)
-  error.reason = reason
-  error.innerStack = innerStack
-  error.status = status
-  return error
-}
-
-export default createError
diff --git a/src/services/fluid.service.ts b/src/services/fluid.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..2cd355c935354a09a426fa96f0554023114f4af6
--- /dev/null
+++ b/src/services/fluid.service.ts
@@ -0,0 +1,92 @@
+import { FluidType } from 'enum/fluid.enum'
+import { Client } from 'cozy-client'
+
+import { FluidStatus } from 'models'
+import ConfigService from 'services/fluidConfig.service'
+import KonnectorService from 'services/konnector.service'
+import ConsumptionService from 'services/consumption.service'
+import AccountService from 'services/account.service'
+import TriggerService from 'services/triggers.service'
+import { DateTime } from 'luxon'
+
+export default class FluidService {
+  private _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  public getFluidStatus = async () => {
+    const fluidConfig = new ConfigService().getFluidConfig()
+    const accountService = new AccountService(this._client)
+    const [elecAccount, gasAccount, waterAccount] = await Promise.all([
+      accountService.getAccountByType(
+        fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug
+      ),
+      accountService.getAccountByType(
+        fluidConfig[FluidType.GAS].konnectorConfig.slug
+      ),
+      accountService.getAccountByType(
+        fluidConfig[FluidType.WATER].konnectorConfig.slug
+      ),
+    ])
+    const konnectorService = new KonnectorService(this._client)
+    const [elecKonnector, gasKonnector, waterKonnector] = await Promise.all([
+      konnectorService.getKonnector(
+        fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug
+      ),
+      konnectorService.getKonnector(
+        fluidConfig[FluidType.GAS].konnectorConfig.slug
+      ),
+      konnectorService.getKonnector(
+        fluidConfig[FluidType.WATER].konnectorConfig.slug
+      ),
+    ])
+    const triggerService = new TriggerService(this._client)
+    const [elecTrigger, waterTrigger, gasTrigger] = await Promise.all([
+      elecAccount && elecKonnector
+        ? triggerService.getTrigger(elecAccount, elecKonnector)
+        : null,
+      waterAccount && waterKonnector
+        ? triggerService.getTrigger(waterAccount, waterKonnector)
+        : null,
+      gasAccount && gasKonnector
+        ? triggerService.getTrigger(gasAccount, gasKonnector)
+        : null,
+    ])
+    const consumptionService = new ConsumptionService(this._client)
+    const [
+      elecStatus,
+      waterStatus,
+      gasStatus,
+      lastDataDates,
+    ] = await Promise.all([
+      elecTrigger ? triggerService.fetchTriggerState(elecTrigger) : null,
+      waterTrigger ? triggerService.fetchTriggerState(waterTrigger) : null,
+      gasTrigger ? triggerService.fetchTriggerState(gasTrigger) : null,
+      consumptionService.fetchAllLastDateData([
+        FluidType.ELECTRICITY,
+        FluidType.WATER,
+        FluidType.GAS,
+      ]),
+    ])
+    const result: FluidStatus[] = [
+      {
+        fluidType: FluidType.ELECTRICITY,
+        status: elecStatus ? elecStatus.status : null,
+        lastDataDate: lastDataDates[FluidType.ELECTRICITY],
+      },
+      {
+        fluidType: FluidType.WATER,
+        status: waterStatus ? waterStatus.status : null,
+        lastDataDate: lastDataDates[FluidType.WATER],
+      },
+      {
+        fluidType: FluidType.GAS,
+        status: gasStatus ? gasStatus.status : null,
+        lastDataDate: lastDataDates[FluidType.GAS],
+      },
+    ]
+    return result
+  }
+}
diff --git a/src/services/fluidConfig.service.ts b/src/services/fluidConfig.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..599e98c39a93f7df2cb36abd7bd06ace923217bd
--- /dev/null
+++ b/src/services/fluidConfig.service.ts
@@ -0,0 +1,19 @@
+import Config from '../../config.json'
+import { FluidConfig } from 'models'
+
+export default class ConfigService {
+  public getFluidConfig(): FluidConfig[] {
+    return Config.fluidConfig
+  }
+
+  /**
+   *
+   * @param min Minimum hour for cron
+   * @param max Maximum hour for cron
+   */
+  public getCronArgs(min = 8, max = 9): string {
+    const randomHour = Math.floor(Math.random() * (max - min + 1) + min)
+    const randomMinutes = Math.floor(Math.random() * 59)
+    return `0 ${randomMinutes} ${randomHour} * * *`
+  }
+}
diff --git a/src/services/fluidConfigService.ts b/src/services/fluidConfigService.ts
deleted file mode 100644
index 8f132a17eda43e43d8f4eeb1390841464c3ef29e..0000000000000000000000000000000000000000
--- a/src/services/fluidConfigService.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-import Config from '../../config.json'
-import IFluidConfig from './IFluidConfig'
-
-export default class FluidConfig {
-  private readonly _fluidConfig: IFluidConfig[]
-
-  constructor() {
-    this._fluidConfig = Config.fluidConfig
-  }
-
-  public getFluidConfig(): IFluidConfig[] {
-    return this._fluidConfig
-  }
-
-  public getCronArgs(slug: string): string {
-    const filtered = this._fluidConfig.filter(
-      fluidConfig => fluidConfig.konnectorConfig.slug === slug
-    )
-    return filtered.length > 0 && filtered[0].konnectorConfig.cron
-      ? filtered[0].konnectorConfig.cron
-      : '0 30 8 * * *'
-  }
-}
diff --git a/src/services/fluidService.ts b/src/services/fluidService.ts
deleted file mode 100644
index 1b7565c6ec5b83227ace4267bab34641f3adba9b..0000000000000000000000000000000000000000
--- a/src/services/fluidService.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-import { Client } from 'cozy-client'
-import _ from 'lodash'
-import { DateTime } from 'luxon'
-import { FluidType } from 'enum/fluid.enum'
-import { getPercentage, sum } from 'utils/math'
-import { getDoctype } from 'utils/utils'
-
-export type ProcessedData = {
-  consumptionValue: number
-  weeklyCompareValue: number
-  euclideanComparator: string
-}
-
-export default class FluidService {
-  public client: Client
-  constructor(client: Client) {
-    this.client = client
-  }
-
-  private getTimeQueryPredicate(
-    startingdateTime: DateTime,
-    endingdateTime: DateTime
-  ) {
-    return {
-      year: {
-        $lte: Math.max(startingdateTime.year, endingdateTime.year),
-        $gte: Math.min(startingdateTime.year, endingdateTime.year),
-      },
-      month: {
-        $lte: Math.max(startingdateTime.month, endingdateTime.month),
-        $gte: Math.min(startingdateTime.month, endingdateTime.month),
-      },
-      day: {
-        $lte: Math.max(startingdateTime.day, endingdateTime.day),
-        $gte: Math.min(startingdateTime.day, endingdateTime.day),
-      },
-    }
-  }
-
-  /**
-   * Query last 2 week data for grdf energy data
-   */
-  public getLastTwoWeeks(fluid: FluidType) {
-    //const now = DateTime.local(2018, 4, 1)
-    const now = DateTime.local()
-    const twoWeekBefore = now.minus({
-      week: 2,
-    })
-    return this.client.query(
-      this.getClientQuery(
-        getDoctype(fluid),
-        now,
-        twoWeekBefore,
-        ['year', 'month', 'day'],
-        14
-      )
-    )
-  }
-
-  /**
-   * Build client query
-   * @param doctype doctype name
-   * @param startingTime start date for query
-   * @param endingTime end date for query
-   * @param indexFields fields needed to be indexed
-   * @param recordsNumber number or return values
-   */
-  private getClientQuery(
-    doctype: string,
-    startingTime: DateTime,
-    endingTime: DateTime,
-    indexFields: string[],
-    recordsNumber: number
-  ) {
-    return this.client
-      .find(doctype)
-      .where(this.getTimeQueryPredicate(startingTime, endingTime))
-      .indexFields(indexFields)
-      .limitBy(recordsNumber)
-  }
-
-  /**
-   * Wrap up data needed for electrical indicators
-   * @param {array} toBeProcessedData
-   * @return {object} {consumptionValue: number, weeklyCompareValue: number, euclideanComparator: string}
-   */
-  public processElectricityData(toBeProcessedData: []) {
-    const consumptionValue = sum(
-      _.slice(_.map(toBeProcessedData, 'load'), 7, 14)
-    )
-    const weeklyCompareValue = getPercentage(
-      _.slice(_.map(toBeProcessedData, 'load'), 7, 14),
-      _.slice(_.map(toBeProcessedData, 'load'), 0, 7)
-    )
-
-    const euclideanComparator = this.getRelevantMetric(
-      FluidType.ELECTRICITY,
-      consumptionValue
-    )
-    return {
-      consumptionValue: consumptionValue,
-      weeklyCompareValue: weeklyCompareValue,
-      euclideanComparator: euclideanComparator,
-    }
-  }
-
-  /**
-   * Wrap up data needed for gas indicators
-   * @param {array} toBeProcessedData
-   * @return {object} {consumptionValue: number, weeklyCompareValue: number, euclideanComparator: string}
-   */
-  public processGasData(toBeProcessedData: []) {
-    // Remove last element in order to have pair number of value.
-    toBeProcessedData.pop()
-    const consumptionValue = sum(
-      _.slice(_.map(toBeProcessedData, 'load'), 0, 7)
-    )
-    const weeklyCompareValue = getPercentage(
-      _.slice(_.map(toBeProcessedData, 'load'), 0, 7),
-      _.slice(_.map(toBeProcessedData, 'load'), 7, 14)
-    )
-    const euclideanComparator = this.getRelevantMetric(
-      FluidType.GAS,
-      consumptionValue
-    )
-    return {
-      consumptionValue: consumptionValue,
-      weeklyCompareValue: weeklyCompareValue,
-      euclideanComparator: euclideanComparator,
-    }
-  }
-  /**
-   * Wrap up data needed for water indicators
-   * @param {array} toBeProcessedData
-   * @return {object} {consumptionValue: number, weeklyCompareValue: number, euclideanComparator: string}
-   */
-  public processWaterData(toBeProcessedData: []) {
-    const consumptionValue = sum(
-      _.slice(_.map(toBeProcessedData, 'load'), 0, 7)
-    )
-    const weeklyCompareValue = getPercentage(
-      _.slice(_.map(toBeProcessedData, 'load'), 0, 7),
-      _.slice(_.map(toBeProcessedData, 'load'), 7, 14)
-    )
-    const euclideanComparator = this.getRelevantMetric(
-      FluidType.WATER,
-      consumptionValue
-    )
-    return {
-      consumptionValue: consumptionValue,
-      weeklyCompareValue: weeklyCompareValue,
-      euclideanComparator: euclideanComparator,
-    }
-  }
-
-  /**
-   * Return a relevant metric string according to a fluid type and a value
-   * @param {FluidType} fluid
-   * @param {number} value
-   * @return {string} relevantValue
-   */
-  public getRelevantMetric(fluid: FluidType, value: number) {
-    //TODO: When data is ready get it from db or locales
-    switch (fluid) {
-      case FluidType.ELECTRICITY:
-        if (value > 100) {
-          return "Vous avez consommé un max d'ampoules !"
-        } else {
-          return 'Une console de jeu fonctionnant 2 h par jour consomme 1,75 kWh en 1 semaine'
-        }
-      case FluidType.GAS:
-        return 'Ca fait pas un peu trop de gas'
-      case FluidType.WATER:
-        return '3 piscines du rhône'
-      default:
-        return 'Pas de comparaison trouvée'
-    }
-  }
-}
diff --git a/src/services/httpService.js b/src/services/httpService.js
deleted file mode 100644
index ca511433ce28db4eba166e0014ecadfd556be137..0000000000000000000000000000000000000000
--- a/src/services/httpService.js
+++ /dev/null
@@ -1,27 +0,0 @@
-import axios from 'axios'
-import logger from './logService'
-
-axios.interceptors.response.use(null, error => {
-  const expectedError =
-    error.response &&
-    error.response.status >= 400 &&
-    error.response.status < 500
-
-  if (!expectedError) {
-    logger.log(error)
-  }
-
-  return Promise.reject(error)
-})
-
-function setJwt(jwt) {
-  axios.defaults.headers.common['x-auth-token'] = jwt
-}
-
-export default {
-  get: axios.get,
-  post: axios.post,
-  put: axios.put,
-  delete: axios.delete,
-  setJwt,
-}
diff --git a/src/services/initDataManagerService.ts b/src/services/initDataManagerService.ts
deleted file mode 100644
index 68dcf4b1bd2f240f8a2b981f7ab397902910da39..0000000000000000000000000000000000000000
--- a/src/services/initDataManagerService.ts
+++ /dev/null
@@ -1,497 +0,0 @@
-import { Client } from 'cozy-client'
-import {
-  CHALLENGETYPE_DOCTYPE,
-  ECOGESTURE_DOCTYPE,
-  USERCHALLENGE_DOCTYPE,
-  USERPROFILE_DOCTYPE,
-  EGL_DAY_DOCTYPE,
-  EGL_MONTH_DOCTYPE,
-  EGL_YEAR_DOCTYPE,
-  ENEDIS_DAY_DOCTYPE,
-  ENEDIS_MINUTE_DOCTYPE,
-  ENEDIS_MONTH_DOCTYPE,
-  ENEDIS_YEAR_DOCTYPE,
-  GRDF_DAY_DOCTYPE,
-  GRDF_HOUR_DOCTYPE,
-  GRDF_MONTH_DOCTYPE,
-  GRDF_YEAR_DOCTYPE,
-} from 'doctypes'
-
-import ChallengeDataManager from 'services/challengeDataManagerService'
-import challengeTypeData from 'db/challengeTypeData.json'
-import userChallengeData from 'db/userChallengeData.json'
-import EcogestureDataManager from 'services/ecogestureDataManagerService'
-import ecogestureData from 'db/ecogestureData.json'
-import UserProfileDataManager from 'services/userProfileDataManagerService'
-import userProfileData from 'db/userProfileData.json'
-import KonnectorStatusService from 'services/konnectorStatusService'
-import KonnectorService from 'services/konnectorService'
-import { AccountService } from 'services/accountService'
-
-import { hashFile } from 'utils/hash'
-import {
-  UserProfile,
-  TypeChallenge,
-  UserChallenge,
-} from 'services/dataChallengeContracts'
-import { FluidType } from 'enum/fluid.enum'
-import { DateTime } from 'luxon'
-
-export default class InitDataManager {
-  private readonly _client: Client
-
-  constructor(_client: Client) {
-    this._client = _client
-  }
-
-  public async checkChallengeType(hash: string): Promise<boolean> {
-    const hashChanllengeType = hashFile(challengeTypeData)
-    const cdm = new ChallengeDataManager(this._client)
-    const updm = new UserProfileDataManager(this._client)
-
-    // Populate data if none challengeType exists
-    const loadedChallengeTypes = await cdm.getAllChallengeTypeEntities()
-    if (
-      !loadedChallengeTypes ||
-      (loadedChallengeTypes && loadedChallengeTypes.length === 0)
-    ) {
-      // Populate the doctype with data
-      try {
-        for (let i = 0; i <= challengeTypeData.length - 1; i++) {
-          const result = await this._client.create(
-            CHALLENGETYPE_DOCTYPE,
-            challengeTypeData[i]
-          )
-          if (!result) {
-            return false
-          }
-        }
-        // Check of created document
-        const checkCount = await cdm.getAllChallengeTypeEntities()
-        if (
-          !checkCount ||
-          (checkCount && checkCount.length !== challengeTypeData.length)
-        ) {
-          return false
-        }
-        // Update userProfil with the hash
-        const updatedUserProfil = await updm.updateUserProfile({
-          challengeTypeHash: hashChanllengeType,
-        })
-        if (!updatedUserProfil) {
-          return false
-        }
-      } catch (error) {
-        console.log('Context error: ', error)
-        return false
-      }
-      return true
-    }
-
-    // Update if the hash is not the same as the one from userprofile
-    if (hash !== hashChanllengeType) {
-      // Update the doctype
-      try {
-        // Deletion of all documents
-        const resultDeletion = await cdm.deleteAllChallengeTypeEntities()
-        if (!resultDeletion) {
-          return false
-        }
-        // Population with the data
-        const resultPopulation = await Promise.all(
-          challengeTypeData.map(async challengeType => {
-            await this._client.create(CHALLENGETYPE_DOCTYPE, challengeType)
-          })
-        )
-        if (!resultPopulation) {
-          return false
-        }
-        // Check of created document
-        const checkCount = await cdm.getAllChallengeTypeEntities()
-        if (
-          !checkCount ||
-          (checkCount && checkCount.length !== challengeTypeData.length)
-        ) {
-          return false
-        }
-        // Update userProfil with the hash
-        const updatedUserProfil = await updm.updateUserProfile({
-          challengeTypeHash: hashChanllengeType,
-        })
-        if (!updatedUserProfil) {
-          return false
-        }
-      } catch (error) {
-        console.log('Context error: ', error)
-        return false
-      }
-      return true
-    } else {
-      // Doctype already up to date
-      return true
-    }
-  }
-
-  public async checkEcogesture(hash: string): Promise<boolean> {
-    const hashEcogestureType = hashFile(ecogestureData)
-    const edm = new EcogestureDataManager(this._client)
-    const updm = new UserProfileDataManager(this._client)
-
-    // Populate data if none ecogesture exists
-    const loadedEcogestures = await edm.getAllEcogestures()
-    if (
-      !loadedEcogestures ||
-      (loadedEcogestures && loadedEcogestures.length === 0)
-    ) {
-      // Populate the doctype with data
-      try {
-        for (let i = 0; i <= ecogestureData.length - 1; i++) {
-          const result = await this._client.create(
-            ECOGESTURE_DOCTYPE,
-            ecogestureData[i]
-          )
-          if (!result) {
-            return false
-          }
-        }
-
-        // Check of created document based on count
-        const checkCount = await edm.getAllEcogestures()
-        if (
-          !checkCount ||
-          (checkCount && checkCount.length !== ecogestureData.length)
-        ) {
-          return false
-        }
-        // Update userProfil with the hash
-        const updatedUserProfil = await updm.updateUserProfile({
-          ecogestureHash: hashEcogestureType,
-        })
-        if (!updatedUserProfil) {
-          return false
-        }
-      } catch (error) {
-        console.log('Context error: ', error)
-        return false
-      }
-      return true
-    }
-
-    // Update if the hash is not the same as the one from userprofile
-    if (hash !== hashEcogestureType) {
-      // Update the doctype
-      try {
-        // Deletion of all documents
-        const resultDeletion = await edm.deleteAllEcogestures()
-        if (!resultDeletion) {
-          return false
-        }
-        // Population with the data
-        const resultPopulation = await Promise.all(
-          ecogestureData.map(async ecogesture => {
-            await this._client.create(ECOGESTURE_DOCTYPE, ecogesture)
-          })
-        )
-        if (!resultPopulation) {
-          return false
-        }
-        // Check of created document based on count
-        const checkCount = await edm.getAllEcogestures()
-        if (
-          !checkCount ||
-          (checkCount && checkCount.length !== ecogestureData.length)
-        ) {
-          return false
-        }
-        // Update userProfil with the hash
-        const updatedUserProfil = await updm.updateUserProfile({
-          ecogestureHash: hashEcogestureType,
-        })
-        if (!updatedUserProfil) {
-          return false
-        }
-      } catch (error) {
-        console.log('Context error: ', error)
-        return false
-      }
-      return true
-    } else {
-      // Doctype already up to date
-      return true
-    }
-  }
-
-  /*
-   * Check if userChallenge exist
-   * If not, the userChallenge is created
-   * sucess return: true
-   * failure return: false
-   */
-  public async checkUserChallenge(): Promise<boolean> {
-    const cdm = new ChallengeDataManager(this._client)
-    const loadedUserChallenge = await cdm.getAllUserChallengeEntities()
-    if (
-      !loadedUserChallenge ||
-      (loadedUserChallenge && loadedUserChallenge.length === 0)
-    ) {
-      try {
-        // Population with the data
-        await this._client.create(USERCHALLENGE_DOCTYPE, userChallengeData[0])
-        // Check of created document
-        const checkUserChallenge = await cdm.getAllUserChallengeEntities()
-        if (!checkUserChallenge) {
-          return false
-        }
-        return true
-      } catch (error) {
-        console.log('Context error: ', error)
-        return false
-      }
-    } else {
-      return true
-    }
-  }
-
-  /*
-   * Check if UserProfil exist
-   * If not, the UserProfil is created
-   * sucess return: userProfil
-   * failure return: null
-   */
-  public async checkUserProfile(): Promise<UserProfile | null> {
-    const updm = new UserProfileDataManager(this._client)
-    const loadedUserProfile = await updm.getUserProfile()
-    if (!loadedUserProfile) {
-      try {
-        // Population with the data
-        await this._client.create(USERPROFILE_DOCTYPE, userProfileData[0])
-        // Check of created document
-        const checkUserProfile = await updm.getUserProfile()
-        return checkUserProfile
-      } catch (error) {
-        console.log('Context error: ', error)
-        return null
-      }
-    } else {
-      return loadedUserProfile
-    }
-  }
-
-  /*
-   * Call each check function to init data
-   * sucess return: true
-   * failure return: false or null
-   */
-  public async initData(): Promise<boolean | null> {
-    try {
-      const resultUserProfile = await this.checkUserProfile()
-      if (!resultUserProfile) {
-        return false
-      } else {
-        console.log(
-          '%c Context: UserProfile loaded ',
-          'background: #222; color: white'
-        )
-      }
-      const resultChallengeType = await this.checkChallengeType(
-        resultUserProfile.challengeTypeHash
-      )
-      if (!resultChallengeType) {
-        return false
-      } else {
-        console.log(
-          '%c Context: ChallengeType loaded ',
-          'background: #222; color: white'
-        )
-      }
-      const resultEcogesture = await this.checkEcogesture(
-        resultUserProfile.ecogestureHash
-      )
-      if (!resultEcogesture) {
-        return false
-      } else {
-        console.log(
-          '%c Context: Ecogesture loaded ',
-          'background: #222; color: white'
-        )
-      }
-      const resultUserChallenge = await this.checkUserChallenge()
-      if (!resultUserChallenge) {
-        return false
-      } else {
-        console.log(
-          '%c Context: UserChallenge loaded',
-          'background: #222; color: white'
-        )
-      }
-      return true
-    } catch (error) {
-      console.log('Context error: ', error)
-      return null
-    }
-  }
-
-  /*
-   * Check if FluidTypes exist
-   * sucess return: FluidType[]
-   * failure return: null
-   */
-  public async checkFluidTypes(): Promise<FluidType[] | null> {
-    const kss = new KonnectorStatusService(this._client)
-    try {
-      const fluidtypes = await kss.getKonnectorAccountStatus()
-      if (!fluidtypes) {
-        return null
-      }
-      return fluidtypes
-    } catch (error) {
-      console.log('Context error: ', error)
-      return null
-    }
-  }
-
-  /*
-   * Call a query with where clause to create the index if not exist
-   */
-  public async createIndex(doctype: string): Promise<any> {
-    return await this._client.query(
-      this._client
-        .find(doctype)
-        .where({
-          year: {
-            $lte: 9999,
-          },
-          month: {
-            $lte: 12,
-          },
-          day: {
-            $lte: 31,
-          },
-        })
-        .limitBy(1)
-    )
-  }
-
-  /*
-   * create index for each Doctype
-   * sucess return: true
-   * failure return: null
-   */
-  public async initIndex(): Promise<boolean | null> {
-    try {
-      await Promise.all([
-        this.createIndex(EGL_DAY_DOCTYPE),
-        this.createIndex(EGL_MONTH_DOCTYPE),
-        this.createIndex(EGL_YEAR_DOCTYPE),
-        this.createIndex(ENEDIS_DAY_DOCTYPE),
-        this.createIndex(ENEDIS_MINUTE_DOCTYPE),
-        this.createIndex(ENEDIS_MONTH_DOCTYPE),
-        this.createIndex(ENEDIS_YEAR_DOCTYPE),
-        this.createIndex(GRDF_DAY_DOCTYPE),
-        this.createIndex(GRDF_HOUR_DOCTYPE),
-        this.createIndex(GRDF_MONTH_DOCTYPE),
-        this.createIndex(GRDF_YEAR_DOCTYPE),
-        KonnectorService.createIndexKonnector(this._client),
-        AccountService.createIndexAccount(this._client),
-      ])
-      return true
-    } catch (error) {
-      console.log('Context error: ', error)
-      return null
-    }
-  }
-
-  /*
-   * Search for a current challenge
-   * and update it if found
-   */
-  public async checkCurrentChallenge(): Promise<UserChallenge | null> {
-    try {
-      // get the current challenge
-      const cdm = new ChallengeDataManager(this._client)
-      const currentChallenge = await cdm.getCurrentChallenge()
-      if (!currentChallenge) {
-        // No current challenge
-        return null
-      } else {
-        if (
-          currentChallenge &&
-          currentChallenge.challengeType &&
-          currentChallenge.challengeType.type === TypeChallenge.CHALLENGE
-        ) {
-          // Check if we are in the viewing timezone for current challenge
-          const viewingDate = cdm.getViewingDate(currentChallenge)
-          if (DateTime.local() >= viewingDate && currentChallenge.fluidTypes) {
-            if (
-              currentChallenge.maxEnergy === -1 &&
-              currentChallenge.fluidTypes
-            ) {
-              const maxEnergyResult = await cdm.setMaxEnergy(
-                currentChallenge,
-                this._client,
-                currentChallenge.fluidTypes
-              )
-              if (maxEnergyResult > 0) {
-                currentChallenge.maxEnergy = maxEnergyResult
-              }
-            }
-            const currentEnergyResult = await cdm.setSpentEnergy(
-              currentChallenge,
-              this._client,
-              currentChallenge.fluidTypes
-            )
-            if (currentEnergyResult) {
-              currentChallenge.currentEnergy = currentEnergyResult
-            }
-          }
-        }
-        return currentChallenge
-      }
-    } catch (error) {
-      console.log('Context error: ', error)
-      throw error
-    }
-  }
-
-  /*
-   * If the challenge is over
-   * Set the rigth badge and return true
-   * else return false
-   */
-  public async isCurrentChallengeOver(
-    challenge: UserChallenge,
-    fluidTypes: FluidType[]
-  ): Promise<boolean> {
-    try {
-      // get the current challenge
-      if (!challenge) {
-        // No current challenge
-        return false
-      } else {
-        const cdm = new ChallengeDataManager(this._client)
-        const typeChallenge = challenge.challengeType
-          ? challenge.challengeType.type
-          : 0
-        const isOver = await cdm.isChallengeOverByDate(
-          challenge.endingDate,
-          fluidTypes,
-          typeChallenge
-        )
-        if (isOver) {
-          await cdm.setTheRightBadge(challenge)
-          return true
-        } else {
-          return false
-        }
-      }
-    } catch (error) {
-      console.log('Context error: ', error)
-      return false
-    }
-  }
-
-  public async checkAchievement(id: string): Promise<UserChallenge | null> {
-    const cdm = new ChallengeDataManager(this._client)
-    return await cdm.checkAchievement(id)
-  }
-}
diff --git a/src/services/initialization.service.ts b/src/services/initialization.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..92281a377947f24ad86e2a60375d371cb37c2e57
--- /dev/null
+++ b/src/services/initialization.service.ts
@@ -0,0 +1,493 @@
+import { Client } from 'cozy-client'
+import { DateTime } from 'luxon'
+import {
+  CHALLENGETYPE_DOCTYPE,
+  ECOGESTURE_DOCTYPE,
+  USERCHALLENGE_DOCTYPE,
+  USERPROFILE_DOCTYPE,
+  EGL_DAY_DOCTYPE,
+  EGL_MONTH_DOCTYPE,
+  EGL_YEAR_DOCTYPE,
+  ENEDIS_DAY_DOCTYPE,
+  ENEDIS_MINUTE_DOCTYPE,
+  ENEDIS_MONTH_DOCTYPE,
+  ENEDIS_YEAR_DOCTYPE,
+  GRDF_DAY_DOCTYPE,
+  GRDF_HOUR_DOCTYPE,
+  GRDF_MONTH_DOCTYPE,
+  GRDF_YEAR_DOCTYPE,
+} from 'doctypes'
+
+import { FluidType } from 'enum/fluid.enum'
+import { TypeChallenge } from 'enum/challenge.enum'
+import { FluidStatus, UserChallenge, UserProfile } from 'models'
+
+import ChallengeService from 'services/challenge.service'
+import challengeTypeData from 'db/challengeTypeData.json'
+import userChallengeData from 'db/userChallengeData.json'
+import EcogestureService from 'services/ecogesture.service'
+import ecogestureData from 'db/ecogestureData.json'
+import UserProfileService from 'services/userProfile.service'
+import userProfileData from 'db/userProfileData.json'
+import KonnectorStatusService from 'services/konnectorStatus.service'
+import KonnectorService from 'services/konnector.service'
+import AccountService from 'services/account.service'
+import FluidService from 'services/fluid.service'
+
+import { hashFile } from 'utils/hash'
+
+export default class InitializationService {
+  private readonly _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  /*
+   * Call a query with where clause to create the index if not exist
+   */
+  public async createIndex(doctype: string): Promise<object> {
+    return await this._client.query(
+      this._client
+        .find(doctype)
+        .where({
+          year: {
+            $lte: 9999,
+          },
+          month: {
+            $lte: 12,
+          },
+          day: {
+            $lte: 31,
+          },
+        })
+        .limitBy(1)
+    )
+  }
+
+  /*
+   * create index for each Doctype
+   * sucess return: true
+   * failure throw error
+   */
+  public async initIndex(): Promise<boolean> {
+    try {
+      const accountService = new AccountService(this._client)
+      const konnectorService = new KonnectorService(this._client)
+      await Promise.all([
+        this.createIndex(EGL_DAY_DOCTYPE),
+        this.createIndex(EGL_MONTH_DOCTYPE),
+        this.createIndex(EGL_YEAR_DOCTYPE),
+        this.createIndex(ENEDIS_DAY_DOCTYPE),
+        this.createIndex(ENEDIS_MINUTE_DOCTYPE),
+        this.createIndex(ENEDIS_MONTH_DOCTYPE),
+        this.createIndex(ENEDIS_YEAR_DOCTYPE),
+        this.createIndex(GRDF_DAY_DOCTYPE),
+        this.createIndex(GRDF_HOUR_DOCTYPE),
+        this.createIndex(GRDF_MONTH_DOCTYPE),
+        this.createIndex(GRDF_YEAR_DOCTYPE),
+        konnectorService.createIndexKonnector(),
+        accountService.createIndexAccount(),
+      ])
+      console.log(
+        '%c Initialization: Indexes created',
+        'background: #222; color: white'
+      )
+      return true
+    } catch (error) {
+      console.log('Initialization error: ', error)
+      throw error
+    }
+  }
+
+  /*
+   * Check if UserProfil exist
+   * If not, the UserProfil is created
+   * sucess return: userProfil
+   * failure return: null
+   */
+  public async initUserProfile(): Promise<UserProfile | null> {
+    const userProfileService = new UserProfileService(this._client)
+    try {
+      const loadedUserProfile = await userProfileService.getUserProfile()
+      if (!loadedUserProfile) {
+        // Population with the data
+        await this._client.create(USERPROFILE_DOCTYPE, userProfileData[0])
+        // Check of created document
+        const checkUserProfile = await userProfileService.getUserProfile()
+        if (checkUserProfile) {
+          console.log(
+            '%c Initialization: User Profile created',
+            'background: #222; color: white'
+          )
+          return checkUserProfile
+        } else {
+          throw new Error('initUserProfile: UserProfile not created')
+        }
+      } else {
+        console.log(
+          '%c Initialization: User Profile loaded',
+          'background: #222; color: white'
+        )
+        return loadedUserProfile
+      }
+    } catch (error) {
+      console.log('Initialization error: ', error)
+      throw error
+    }
+  }
+
+  public async initChallengeType(
+    hash: string
+  ): Promise<{ result: boolean; userProfile: UserProfile | null }> {
+    const hashChanllengeType = hashFile(challengeTypeData)
+    const challengeService = new ChallengeService(this._client)
+    const userProfileService = new UserProfileService(this._client)
+
+    // Populate data if none challengeType exists
+    const loadedChallengeTypes = await challengeService.getAllChallengeTypeEntities()
+    if (
+      !loadedChallengeTypes ||
+      (loadedChallengeTypes && loadedChallengeTypes.length === 0)
+    ) {
+      // Populate the doctype with data
+      try {
+        for (let i = 0; i <= challengeTypeData.length - 1; i++) {
+          await this._client.create(CHALLENGETYPE_DOCTYPE, challengeTypeData[i])
+        }
+        // Check of created document
+        const checkCount = await challengeService.getAllChallengeTypeEntities()
+        if (
+          !checkCount ||
+          (checkCount && checkCount.length !== challengeTypeData.length)
+        ) {
+          throw new Error(
+            'initChallengeType: Created challenge type entities does not macht'
+          )
+        }
+        // Update userProfil with the hash
+        const updatedUserProfile = await userProfileService.updateUserProfile({
+          challengeTypeHash: hashChanllengeType,
+        })
+        if (updatedUserProfile) {
+          console.log(
+            '%c Initialization: Challenge Type created',
+            'background: #222; color: white'
+          )
+          return { result: true, userProfile: updatedUserProfile }
+        } else {
+          throw new Error('initChallengeType: UserProfile not updated')
+        }
+      } catch (error) {
+        console.log('Initialization error: ', error)
+        throw error
+      }
+    }
+
+    // Update if the hash is not the same as the one from userprofile
+    if (hash !== hashChanllengeType) {
+      // Update the doctype
+      try {
+        // Deletion of all documents
+        await challengeService.deleteAllChallengeTypeEntities()
+        // Population with the data
+        await Promise.all(
+          challengeTypeData.map(async challengeType => {
+            await this._client.create(CHALLENGETYPE_DOCTYPE, challengeType)
+          })
+        )
+        // Check of created document
+        const checkCount = await challengeService.getAllChallengeTypeEntities()
+        if (
+          !checkCount ||
+          (checkCount && checkCount.length !== challengeTypeData.length)
+        ) {
+          throw new Error(
+            'initChallengeType: Created challenge type entities does not macht'
+          )
+        }
+        // Update userProfil with the hash
+        const updatedUserProfile = await userProfileService.updateUserProfile({
+          challengeTypeHash: hashChanllengeType,
+        })
+        if (updatedUserProfile) {
+          console.log(
+            '%c Initialization: Challenge Type updated',
+            'background: #222; color: white'
+          )
+          return { result: true, userProfile: updatedUserProfile }
+        } else {
+          throw new Error('initChallengeType: UserProfile not updated')
+        }
+      } catch (error) {
+        console.log('Initialization error: ', error)
+        throw error
+      }
+    } else {
+      // Doctype already up to date
+      console.log(
+        '%c Initialization: Challenge Type loaded',
+        'background: #222; color: white'
+      )
+      return { result: true, userProfile: null }
+    }
+  }
+
+  public async initEcogesture(
+    hash: string
+  ): Promise<{ result: boolean; userProfile: UserProfile | null }> {
+    const hashEcogestureType = hashFile(ecogestureData)
+    const ecogestureService = new EcogestureService(this._client)
+    const userProfileService = new UserProfileService(this._client)
+
+    // Populate data if none ecogesture exists
+    const loadedEcogestures = await ecogestureService.getAllEcogestures()
+    if (
+      !loadedEcogestures ||
+      (loadedEcogestures && loadedEcogestures.length === 0)
+    ) {
+      // Populate the doctype with data
+      try {
+        for (let i = 0; i <= ecogestureData.length - 1; i++) {
+          await this._client.create(ECOGESTURE_DOCTYPE, ecogestureData[i])
+        }
+        // Check of created document based on count
+        const checkCount = await ecogestureService.getAllEcogestures()
+        if (
+          !checkCount ||
+          (checkCount && checkCount.length !== ecogestureData.length)
+        ) {
+          throw new Error(
+            'initEcogesture: Created challenge type entities does not macht'
+          )
+        }
+        // Update userProfil with the hash
+        const updatedUserProfile = await userProfileService.updateUserProfile({
+          ecogestureHash: hashEcogestureType,
+        })
+        if (updatedUserProfile) {
+          console.log(
+            '%c Initialization: Ecogesture created',
+            'background: #222; color: white'
+          )
+          return { result: true, userProfile: updatedUserProfile }
+        } else {
+          throw new Error('initChallengeType: UserProfile not updated')
+        }
+      } catch (error) {
+        console.log('Initialization error: ', error)
+        throw error
+      }
+    }
+
+    // Update if the hash is not the same as the one from userprofile
+    if (hash !== hashEcogestureType) {
+      // Update the doctype
+      try {
+        // Deletion of all documents
+        await ecogestureService.deleteAllEcogestures()
+        // Population with the data
+        await Promise.all(
+          ecogestureData.map(async ecogesture => {
+            await this._client.create(ECOGESTURE_DOCTYPE, ecogesture)
+          })
+        )
+        // Check of created document based on count
+        const checkCount = await ecogestureService.getAllEcogestures()
+        if (
+          !checkCount ||
+          (checkCount && checkCount.length !== ecogestureData.length)
+        ) {
+          throw new Error(
+            'initEcogesture: Created challenge type entities does not macht'
+          )
+        }
+        // Update userProfil with the hash
+        const updatedUserProfile = await userProfileService.updateUserProfile({
+          ecogestureHash: hashEcogestureType,
+        })
+        if (updatedUserProfile) {
+          console.log(
+            '%c Initialization: Ecogesture updated',
+            'background: #222; color: white'
+          )
+          return { result: true, userProfile: updatedUserProfile }
+        } else {
+          throw new Error('initChallengeType: UserProfile not updated')
+        }
+      } catch (error) {
+        console.log('Initialization error: ', error)
+        throw error
+      }
+    } else {
+      // Doctype already up to date
+      console.log(
+        '%c Initialization: Ecogesture loaded',
+        'background: #222; color: white'
+      )
+      return { result: true, userProfile: null }
+    }
+  }
+
+  /*
+   * Check if userChallenge exist
+   * If not, the userChallenge is created
+   * sucess return: UserChallenge[]
+   * failure throw Error
+   */
+  public async initUserChallenge(): Promise<UserChallenge[]> {
+    const challengeService = new ChallengeService(this._client)
+    const loadedUserChallenge = await challengeService.getAllUserChallenges()
+    if (
+      !loadedUserChallenge ||
+      (loadedUserChallenge && loadedUserChallenge.length === 0)
+    ) {
+      try {
+        // Population with the data
+        await this._client.create(USERCHALLENGE_DOCTYPE, userChallengeData[0])
+        // Check of created document
+        const checkUserChallenge = await challengeService.getAllUserChallenges()
+        if (checkUserChallenge) {
+          console.log(
+            '%c Initialization: User Challenge created',
+            'background: #222; color: white'
+          )
+          return checkUserChallenge
+        } else {
+          throw new Error('initUserChallenge: UserProfile not updated')
+        }
+      } catch (error) {
+        console.log('Initialization error: ', error)
+        throw error
+      }
+    } else {
+      console.log(
+        '%c Initialization: User Challenge loaded',
+        'background: #222; color: white'
+      )
+      return loadedUserChallenge
+    }
+  }
+
+  /*
+   * Check if FluidTypes exist
+   * sucess return: FluidType[]
+   * failure throw error
+   */
+  public async initFluidTypes(): Promise<FluidType[]> {
+    const kss = new KonnectorStatusService(this._client)
+    try {
+      const fluidtypes = await kss.getKonnectorAccountStatus()
+      if (fluidtypes) {
+        console.log(
+          '%c Initialization: Fluid Types loaded',
+          'background: #222; color: white'
+        )
+        return fluidtypes
+      } else {
+        throw new Error('initFluidTypes: FluidTypes not found')
+      }
+    } catch (error) {
+      console.log('Initialization error: ', error)
+      throw error
+    }
+  }
+
+  /*
+   * For each fluid get the trigger status and the last data date
+   * sucess return: FluidStatus[]
+   * failure throw error
+   */
+  public async initFluidStatus(): Promise<FluidStatus[]> {
+    const fs = new FluidService(this._client)
+    try {
+      const fluidStatus = await fs.getFluidStatus()
+      if (fluidStatus) {
+        console.log(
+          '%c Initialization: Fluid Status loaded',
+          'background: #222; color: white'
+        )
+        return fluidStatus
+      } else {
+        throw new Error('initFluidStatus: fluidStatus not found')
+      }
+    } catch (error) {
+      console.log('Initialization error: ', error)
+      throw error
+    }
+  }
+
+  /*
+   * Search for a current challenge
+   * and update it if found
+   */
+  public async initCurrentChallenge(): Promise<UserChallenge | null> {
+    try {
+      // get the current challenge
+      const challengeService = new ChallengeService(this._client)
+      const currentChallenge = await challengeService.getCurrentChallenge()
+      if (!currentChallenge) {
+        // No current challenge
+        return null
+      } else {
+        if (
+          currentChallenge &&
+          currentChallenge.challengeType &&
+          currentChallenge.challengeType.type === TypeChallenge.CHALLENGE
+        ) {
+          // Check if we are in the viewing timezone for current challenge
+          const viewingDate = challengeService.getViewingDate(currentChallenge)
+          if (DateTime.local() >= viewingDate && currentChallenge.fluidTypes) {
+            if (
+              currentChallenge.maxEnergy === -1 &&
+              currentChallenge.fluidTypes
+            ) {
+              const maxEnergyResult = await challengeService.setMaxEnergy(
+                currentChallenge,
+                this._client,
+                currentChallenge.fluidTypes
+              )
+              if (maxEnergyResult > 0) {
+                currentChallenge.maxEnergy = maxEnergyResult
+              }
+            }
+            const currentEnergyResult = await challengeService.setSpentEnergy(
+              currentChallenge,
+              this._client,
+              currentChallenge.fluidTypes
+            )
+            if (currentEnergyResult) {
+              currentChallenge.currentEnergy = currentEnergyResult
+            }
+          }
+        }
+        return currentChallenge
+      }
+    } catch (error) {
+      console.log('Initialization error: ', error)
+      throw error
+    }
+  }
+
+  /*
+   * If the challenge is over
+   * Set the rigth badge and return true
+   * else return false
+   */
+  public async isCurrentChallengeOver(
+    challenge: UserChallenge,
+    fluidTypes: FluidType[]
+  ): Promise<boolean> {
+    const challengeService = new ChallengeService(this._client)
+    const isOver = await challengeService.isCurrentChallengeOver(
+      challenge,
+      fluidTypes
+    )
+    return isOver
+  }
+
+  public async checkAchievement(id: string): Promise<UserChallenge | null> {
+    const challengeService = new ChallengeService(this._client)
+    return await challengeService.checkAchievement(id)
+  }
+}
diff --git a/src/services/jobsService.ts b/src/services/jobsService.ts
deleted file mode 100644
index 5790c0b05f8b2e916060b690c53e3c05745a2f34..0000000000000000000000000000000000000000
--- a/src/services/jobsService.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { Client } from 'cozy-client'
-import { JOBS_DOCTYPE } from 'doctypes'
-import KonnectorJobWatcher from 'cozy-harvest-lib/dist/models/konnector/KonnectorJobWatcher'
-import {
-  ERROR_EVENT,
-  LOGIN_SUCCESS_EVENT,
-  SUCCESS_EVENT,
-} from 'cozy-harvest-lib/dist/models/KonnectorJob'
-
-// TODO import enums from harvestLib
-
-export enum JobState {
-  Errored = 'errored',
-  Running = 'running',
-  Done = 'done',
-}
-
-export class JobService {
-  constructor(private _client: Client) {
-    this._client = _client
-  }
-
-  fetchJob = async jobId => {
-    return await this._client.query(this._client.get(JOBS_DOCTYPE, jobId))
-  }
-
-  watch = async (job: any, callbackResponse: any) => {
-    const konnectorJobWatcher = new KonnectorJobWatcher(this._client, job, {
-      expectedSuccessDelay: 8000,
-    })
-    konnectorJobWatcher.watch()
-
-    konnectorJobWatcher.on(ERROR_EVENT, () => {
-      callbackResponse(JobState.Errored)
-    })
-
-    konnectorJobWatcher.on(LOGIN_SUCCESS_EVENT, () => {
-      callbackResponse(JobState.Done)
-    })
-
-    konnectorJobWatcher.on(SUCCESS_EVENT, () => {
-      callbackResponse(JobState.Done)
-    })
-  }
-}
diff --git a/src/services/konnector.service.ts b/src/services/konnector.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f0fdea3034b7c16ba115bddb3217bb48ba8f87a6
--- /dev/null
+++ b/src/services/konnector.service.ts
@@ -0,0 +1,44 @@
+import { Client } from 'cozy-client'
+import { KONNECTORS_DOCTYPE } from 'doctypes'
+import { Account, Konnector, TriggerState } from 'models'
+import TriggerService from 'services/triggers.service'
+
+export default class KonnectorService {
+  private _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  public async getKonnector(id: string) {
+    const { data } = await this._client.query(
+      this._client.find(KONNECTORS_DOCTYPE).where({
+        _id: KONNECTORS_DOCTYPE + '/' + id,
+      })
+    )
+    const konnector: Konnector = data && data[0]
+    return konnector
+  }
+
+  public async getKonnectorLastState(
+    konnector: Konnector,
+    account: Account
+  ): Promise<TriggerState | null> {
+    const triggerService = new TriggerService(this._client)
+    const trigger = await triggerService.getTrigger(account, konnector)
+    if (trigger) {
+      const triggerState = await triggerService.fetchTriggerState(trigger)
+      return triggerState
+    }
+    return null
+  }
+
+  public async createIndexKonnector() {
+    const query = this._client
+      .find('io.cozy.konnectors')
+      // eslint-disable-next-line @typescript-eslint/camelcase
+      .where({ _id: 'index' })
+      .limitBy(1)
+    return await this._client.query(query)
+  }
+}
diff --git a/src/services/konnectorService.ts b/src/services/konnectorService.ts
deleted file mode 100644
index 8684ae0e408c47e0136fc818a4bc2b4d8030d792..0000000000000000000000000000000000000000
--- a/src/services/konnectorService.ts
+++ /dev/null
@@ -1,110 +0,0 @@
-import { Client } from 'cozy-client'
-import { KONNECTORS_DOCTYPE, Konnector } from 'doctypes'
-
-export default class KonnectorService {
-  private _konnector: Konnector | null
-
-  constructor(private _client: Client, private _konnectorId: string) {
-    this._konnector = null
-    this._client = _client
-    this._konnectorId = _konnectorId
-  }
-
-  get konnector(): Konnector | null {
-    return this._konnector
-  }
-
-  fetchKonnector = async () => {
-    if (!(this._client && this._konnectorId)) {
-      throw new Error(
-        'KonnectorService : fetchKonnector - client or konnector id not found'
-      )
-    }
-    try {
-      const { data } = await this._client.query(
-        this._client.find(KONNECTORS_DOCTYPE).where({
-          _id: KONNECTORS_DOCTYPE + '/' + this._konnectorId,
-        })
-      )
-      const konnector: Konnector = data && data[0]
-      this._konnector = konnector
-      return konnector
-    } catch (error) {
-      throw error
-    }
-  }
-
-  async getKonnectorLastTrigger(slug: string) {
-    const query = this._client
-      .find('io.cozy.triggers')
-      .where({ 'message.konnector': slug })
-      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
-      .limitBy(1)
-    return await this._client.query(query)
-  }
-
-  async getKonnectorLastJob(slug: string) {
-    const query = this._client
-      .find('io.cozy.jobs')
-      .where({ 'message.konnector': slug })
-      // eslint-disable-next-line @typescript-eslint/camelcase
-      .sortBy([{ finished_at: 'desc' }])
-      .limitBy(1)
-    return await this._client.query(query)
-  }
-
-  async getKonnectorLastStatus(): Promise<string | null> {
-    if (!(this._client && this._konnectorId)) {
-      throw new Error(
-        'KonnectorService : findKonnector - client or konnector id not found'
-      )
-    }
-    try {
-      if (!this._konnector) {
-        await this.fetchKonnector()
-      }
-      if (this._konnector) {
-        const trigger = await this.getKonnectorLastTrigger(this._konnector.slug)
-        if (trigger && trigger.current_state && trigger.current_state) {
-          return trigger.current_state.status
-        }
-      }
-      return null
-    } catch (error) {
-      throw error
-    }
-  }
-
-  async isTriggerSetForKonnector(): Promise<boolean> {
-    if (!(this._client && this._konnectorId)) {
-      throw new Error(
-        'KonnectorService : findKonnector - client or konnector id not found'
-      )
-    }
-    try {
-      if (!this._konnector) {
-        await this.fetchKonnector()
-      }
-      if (this._konnector) {
-        const trigger = await this.getKonnectorLastTrigger(this._konnector.slug)
-        if (trigger) {
-          return true
-        }
-      } else {
-        return false
-      }
-      return false
-    } catch (error) {
-      throw error
-    }
-  }
-
-  static createIndexKonnector = async (client: Client) => {
-    const query = client
-      .find('io.cozy.konnectors')
-      // eslint-disable-next-line @typescript-eslint/camelcase
-      .where({ _id: 'index' })
-      .limitBy(1)
-    return await client.query(query)
-  }
-}
diff --git a/src/services/konnectorStatus.service.ts b/src/services/konnectorStatus.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..01f47dc690e9dbc3098ef4b403845d7add66ec0b
--- /dev/null
+++ b/src/services/konnectorStatus.service.ts
@@ -0,0 +1,54 @@
+import { Client } from 'cozy-client'
+import ConfigService from 'services/fluidConfig.service'
+import AccountService from 'services/account.service'
+import { FluidType } from 'enum/fluid.enum'
+
+export default class KonnectorStatusService {
+  private _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  public async getTriggerbyKonnectorSlug(konnectorSlug: string) {
+    const query = this._client
+      .find('io.cozy.triggers')
+      .where({ 'message.konnector': konnectorSlug })
+      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
+      .limitBy(1)
+
+    return await this._client.query(query)
+  }
+
+  /**
+   * Return a FluidType array containing each konnector fluid with a account
+   * @param void
+   * @return {Promise<FluidType[]>} configured FluidTypes array
+   */
+  async getKonnectorAccountStatus(): Promise<FluidType[]> {
+    const fluidConfig = new ConfigService().getFluidConfig()
+    const accountService = new AccountService(this._client)
+    const [elecData, gasData, waterData] = await Promise.all([
+      accountService.getAccountByType(
+        fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug
+      ),
+      accountService.getAccountByType(
+        fluidConfig[FluidType.GAS].konnectorConfig.slug
+      ),
+      accountService.getAccountByType(
+        fluidConfig[FluidType.WATER].konnectorConfig.slug
+      ),
+    ])
+    const data: FluidType[] = []
+    if (elecData) {
+      data.push(fluidConfig[FluidType.ELECTRICITY].fluidTypeId)
+    }
+    if (gasData) {
+      data.push(fluidConfig[FluidType.GAS].fluidTypeId)
+    }
+    if (waterData) {
+      data.push(fluidConfig[FluidType.WATER].fluidTypeId)
+    }
+    return data
+  }
+}
diff --git a/src/services/konnectorStatusService.ts b/src/services/konnectorStatusService.ts
deleted file mode 100644
index 8ab8c3bde63422f10d14660e413ac12406e8f0be..0000000000000000000000000000000000000000
--- a/src/services/konnectorStatusService.ts
+++ /dev/null
@@ -1,138 +0,0 @@
-import { Client } from 'cozy-client'
-import { Konnector } from 'doctypes'
-import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers'
-import FluidConfigService from 'services/fluidConfigService'
-import { AccountService } from 'services/accountService'
-import { FluidType } from 'enum/fluid.enum'
-
-export default class KonnectorStatusService {
-  private _client: Client
-
-  constructor(_client: Client) {
-    this._client = _client
-  }
-
-  getKonnectorsStatus() {
-    return 'konnector status'
-  }
-
-  // TODO - move to triggerservices
-  async getTriggerbyKonnector(konnector: Konnector) {
-    const query = this._client
-      .find('io.cozy.triggers')
-      .where({ 'message.konnector': konnector.slug })
-      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
-      .limitBy(1)
-
-    return await this._client.query(query)
-  }
-
-  async getTriggerbyKonnectorSlug(konnectorSlug: string) {
-    const query = this._client
-      .find('io.cozy.triggers')
-      .where({ 'message.konnector': konnectorSlug })
-      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
-      .limitBy(1)
-
-    return await this._client.query(query)
-  }
-
-  async getAllTriggers() {
-    const query = this._client.find('io.cozy.triggers')
-    const result = await this._client.query(query)
-    return result.data
-  }
-
-  async getAllJobs() {
-    const query = this._client.find('io.cozy.jobs')
-    return await this._client.query(query)
-  }
-
-  async getAllKonnectors() {
-    const query = this._client.find('io.cozy.konnectors')
-    const result = await this._client.query(query)
-    return result.data
-  }
-
-  static async getSingleTrigger(client: Client, id: string) {
-    try {
-      const trigger = await triggersMutations(client).fetchTrigger(id)
-      return trigger
-    } catch (error) {
-      throw error
-    }
-  }
-
-  /**
-   * Return a FluidType array containing each konnector fluid with a trigger
-   * @param void
-   * @return {Promise<FluidType[]>} configured FluidTypes array
-   */
-  async getKonnectorTiggerStatus(): Promise<FluidType[]> {
-    try {
-      const fluidConfig = new FluidConfigService().getFluidConfig()
-      const [elecData, gasData, waterData] = await Promise.all([
-        this.getTriggerbyKonnectorSlug(
-          fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug
-        ),
-        this.getTriggerbyKonnectorSlug(
-          fluidConfig[FluidType.GAS].konnectorConfig.slug
-        ),
-        this.getTriggerbyKonnectorSlug(
-          fluidConfig[FluidType.WATER].konnectorConfig.slug
-        ),
-      ])
-      const data: FluidType[] = []
-      if (elecData && elecData.data && elecData.data[0]) {
-        data.push(fluidConfig[FluidType.ELECTRICITY].fluidTypeId)
-      }
-      if (gasData && gasData.data && gasData.data[0]) {
-        data.push(fluidConfig[FluidType.GAS].fluidTypeId)
-      }
-      if (waterData && waterData.data && waterData.data[0]) {
-        data.push(fluidConfig[FluidType.WATER].fluidTypeId)
-      }
-      return data
-    } catch (error) {
-      throw error
-    }
-  }
-
-  /**
-   * Return a FluidType array containing each konnector fluid with a account
-   * @param void
-   * @return {Promise<FluidType[]>} configured FluidTypes array
-   */
-  async getKonnectorAccountStatus(): Promise<FluidType[]> {
-    try {
-      const fluidConfig = new FluidConfigService().getFluidConfig()
-      const [elecData, gasData, waterData] = await Promise.all([
-        AccountService.getAccountByType(
-          this._client,
-          fluidConfig[FluidType.ELECTRICITY].konnectorConfig.slug
-        ),
-        AccountService.getAccountByType(
-          this._client,
-          fluidConfig[FluidType.GAS].konnectorConfig.slug
-        ),
-        AccountService.getAccountByType(
-          this._client,
-          fluidConfig[FluidType.WATER].konnectorConfig.slug
-        ),
-      ])
-      const data: FluidType[] = []
-      if (elecData) {
-        data.push(fluidConfig[FluidType.ELECTRICITY].fluidTypeId)
-      }
-      if (gasData) {
-        data.push(fluidConfig[FluidType.GAS].fluidTypeId)
-      }
-      if (waterData) {
-        data.push(fluidConfig[FluidType.WATER].fluidTypeId)
-      }
-      return data
-    } catch (error) {
-      throw error
-    }
-  }
-}
diff --git a/src/services/logService.js b/src/services/logService.js
deleted file mode 100644
index eb2d690c0676f338f7ccb0e27619aa053125e316..0000000000000000000000000000000000000000
--- a/src/services/logService.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import * as loglevelLogger from 'loglevel'
-
-function init() {
-  console.log('The logger is initialized')
-}
-
-function debug(errorMessage) {
-  console.log(errorMessage)
-}
-
-function log(errorMessage) {
-  debug(errorMessage)
-}
-
-function warn(errorMessage) {
-  loglevelLogger.warn(errorMessage)
-}
-
-function error(errorMessage) {
-  loglevelLogger.error(errorMessage)
-}
-
-/*
-
-function trace(errorMessage) {
-  log.trace(errorMessage)
-}
-
-function info(errorMessage) {
-  log.info(errorMessage)
-}
-
-function debug(errorMessage) {
-  log.debug(errorMessage)
-}
-*/
-
-export default {
-  init,
-  debug,
-  log,
-  warn,
-  error,
-}
diff --git a/src/services/performanceIndicatorAggregateCalculatorService.ts b/src/services/performanceIndicator.service.ts
similarity index 72%
rename from src/services/performanceIndicatorAggregateCalculatorService.ts
rename to src/services/performanceIndicator.service.ts
index 5102c4929ff56bf9405e21ab2479a24470f8c85e..8a2369cbce1a695cc35973862eb2228280bba2f2 100644
--- a/src/services/performanceIndicatorAggregateCalculatorService.ts
+++ b/src/services/performanceIndicator.service.ts
@@ -1,11 +1,11 @@
-import LoadToCurrencyConverter from './loadToCurrencyConverterService'
-import { IPerformanceIndicator } from './dataConsumptionContracts'
+import ConverterService from 'services/converter.service'
+import { PerformanceIndicator } from 'models'
 
-export default class PerformanceIndicatorAggregateCalculator {
-  public static aggregatePerformanceIndicators(
-    performanceIndicators: IPerformanceIndicator[]
-  ): IPerformanceIndicator {
-    const loadToCurrencyConverter = new LoadToCurrencyConverter()
+export default class PerformanceIndicatorService {
+  public aggregatePerformanceIndicators(
+    performanceIndicators: PerformanceIndicator[]
+  ): PerformanceIndicator {
+    const converterService = new ConverterService()
     let currentValue = 0
     let compareValue = 0
     if (
@@ -24,10 +24,7 @@ export default class PerformanceIndicatorAggregateCalculator {
           const performanceIndicator = performanceIndicators[key]
           const fluidType = parseInt(key)
           currentValue += performanceIndicator.value
-            ? loadToCurrencyConverter.Convert(
-                performanceIndicator.value,
-                fluidType
-              )
+            ? converterService.LoadToEuro(performanceIndicator.value, fluidType)
             : 0
         }
       }
@@ -42,7 +39,7 @@ export default class PerformanceIndicatorAggregateCalculator {
           const performanceIndicator = performanceIndicators[key]
           const fluidType = parseInt(key)
           compareValue += performanceIndicator.compareValue
-            ? loadToCurrencyConverter.Convert(
+            ? converterService.LoadToEuro(
                 performanceIndicator.compareValue,
                 fluidType
               )
@@ -58,10 +55,7 @@ export default class PerformanceIndicatorAggregateCalculator {
           const performanceIndicator = performanceIndicators[key]
           const fluidType = parseInt(key)
           currentValue += performanceIndicator.value
-            ? loadToCurrencyConverter.Convert(
-                performanceIndicator.value,
-                fluidType
-              )
+            ? converterService.LoadToEuro(performanceIndicator.value, fluidType)
             : 0
         }
       }
@@ -72,7 +66,7 @@ export default class PerformanceIndicatorAggregateCalculator {
           const performanceIndicator = performanceIndicators[key]
           const fluidType = parseInt(key)
           compareValue += performanceIndicator.compareValue
-            ? loadToCurrencyConverter.Convert(
+            ? converterService.LoadToEuro(
                 performanceIndicator.compareValue,
                 fluidType
               )
@@ -81,7 +75,7 @@ export default class PerformanceIndicatorAggregateCalculator {
       }
     }
 
-    const agreggatedPerformanceIndicator: IPerformanceIndicator = {
+    const agreggatedPerformanceIndicator: PerformanceIndicator = {
       value: currentValue,
       compareValue: compareValue,
       percentageVariation: 1 - currentValue / compareValue,
diff --git a/src/services/queryRunnerService.ts b/src/services/queryRunner.service.ts
similarity index 76%
rename from src/services/queryRunnerService.ts
rename to src/services/queryRunner.service.ts
index a5c0e288929f68824fd7a3de26b09e0b49cc1182..016c9a2ac19e1b5f7d5f2759ebde7feef1eea4fb 100644
--- a/src/services/queryRunnerService.ts
+++ b/src/services/queryRunner.service.ts
@@ -13,10 +13,12 @@ import {
   ENEDIS_MINUTE_DOCTYPE,
   GRDF_HOUR_DOCTYPE,
 } from 'doctypes'
+
 import { FluidType } from 'enum/fluid.enum'
-import { TimeStep, ITimePeriod, IDataload } from './dataConsumptionContracts'
+import { TimeStep } from 'enum/timeStep.enum'
+import { Dataload, TimePeriod } from 'models'
 
-export class QueryRunner {
+export default class QueryRunner {
   // TODO to be clean up
   private readonly _max_limit = 1000
   private readonly _default_months = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
@@ -61,10 +63,10 @@ export class QueryRunner {
   }
 
   public async fetchFluidData(
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     timeStep: TimeStep,
     fluidType: FluidType
-  ): Promise<IDataload[] | null> {
+  ): Promise<Dataload[] | null> {
     const result = await this.fetchData(
       this.buildListQuery(timeStep, timePeriod, fluidType, this._max_limit)
     )
@@ -72,12 +74,50 @@ export class QueryRunner {
     if (result && result.data) {
       const filteredResult = this.filterDataList(result, timePeriod)
       const mappedResult = this.mapDataList(filteredResult)
+
       return mappedResult
     }
 
     return null
   }
 
+  public async fetchFluidMaxData(
+    maxTimePeriod: TimePeriod,
+    timeStep: TimeStep,
+    fluidType: FluidType
+  ): Promise<number | null> {
+    const result = await this.fetchData(
+      this.buildMaxQuery(timeStep, maxTimePeriod, fluidType, this._max_limit)
+    )
+    if (timeStep === TimeStep.HALF_AN_HOUR) {
+      const lastDayOfPreviousMonth = {
+        startDate: maxTimePeriod.startDate.plus({ day: -1 }),
+        endDate: maxTimePeriod.startDate.plus({ day: -1 }).endOf('days'),
+      }
+      const lastDayOfPreviousMonthResult = await this.fetchData(
+        this.buildMaxQuery(
+          timeStep,
+          lastDayOfPreviousMonth,
+          fluidType,
+          this._max_limit
+        )
+      )
+      return Math.max(
+        lastDayOfPreviousMonthResult.data[0]
+          ? lastDayOfPreviousMonthResult.data[0].load
+          : 0,
+        result.data[0] ? result.data[0].load : 0
+      )
+    }
+
+    if (result && result.data) {
+      const filteredResult = this.filterDataList(result, maxTimePeriod)
+      const mappedResult = this.mapDataList(filteredResult)
+      return mappedResult && mappedResult[0] && mappedResult[0].value
+    }
+    return null
+  }
+
   public async getLastDateData(fluidType: FluidType): Promise<DateTime | null> {
     const result = await this.fetchData(this.buildLastDateQuery(fluidType, 1))
 
@@ -123,7 +163,7 @@ export class QueryRunner {
     return result
   }
 
-  private filterDataList(data, timePeriod: ITimePeriod) {
+  private filterDataList(data, timePeriod: TimePeriod) {
     const filteredResult = data.data.filter(entry =>
       this.withinDateBoundaries(
         DateTime.local(
@@ -155,7 +195,7 @@ export class QueryRunner {
 
   private buildListQuery(
     timeStep: TimeStep,
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     fluidType: FluidType,
     limit: number
   ) {
@@ -167,11 +207,32 @@ export class QueryRunner {
       .limitBy(limit)
   }
 
-  private withinDateBoundaries(dateTime: DateTime, timePeriod: ITimePeriod) {
+  private buildMaxQuery(
+    timeStep: TimeStep,
+    maxTimePeriod: TimePeriod,
+    fluidType: FluidType,
+    limit: number
+  ) {
+    const doctype = this.getRelevantDoctype(fluidType, timeStep)
+    if (timeStep === TimeStep.HALF_AN_HOUR) {
+      return this._client
+        .find(doctype)
+        .where(this.getPredicate(maxTimePeriod, 20))
+        .limitBy(1)
+        .sortBy([{ load: 'desc' }])
+    }
+    return this._client
+      .find(doctype)
+      .where(this.getPredicate(maxTimePeriod, timeStep))
+      .limitBy(limit)
+      .sortBy([{ load: 'desc' }])
+  }
+
+  private withinDateBoundaries(dateTime: DateTime, timePeriod: TimePeriod) {
     return dateTime <= timePeriod.endDate && dateTime >= timePeriod.startDate
   }
 
-  private getInBetweenMonths(timePeriod: ITimePeriod) {
+  private getInBetweenMonths(timePeriod: TimePeriod) {
     const intervalCount = Interval.fromDateTimes(
       timePeriod.startDate,
       timePeriod.endDate
@@ -192,7 +253,7 @@ export class QueryRunner {
     return monthList
   }
 
-  private getInBetweenDays(timePeriod: ITimePeriod) {
+  private getInBetweenDays(timePeriod: TimePeriod) {
     const intervalCount = Interval.fromDateTimes(
       timePeriod.startDate,
       timePeriod.endDate
@@ -221,10 +282,10 @@ export class QueryRunner {
       .where({})
       .indexFields(['year', 'month', 'day'])
       .sortBy([{ year: 'desc' }, { month: 'desc' }, { day: 'desc' }])
-      .limitBy(1)
+      .limitBy(limit)
   }
 
-  private getPredicate(timePeriod: ITimePeriod, timeStep: TimeStep) {
+  private getPredicate(timePeriod: TimePeriod, timeStep: TimeStep) {
     let predicate = {}
 
     switch (timeStep) {
diff --git a/src/services/consumptionPeriodSelectorService.ts b/src/services/timePeriod.service.ts
similarity index 83%
rename from src/services/consumptionPeriodSelectorService.ts
rename to src/services/timePeriod.service.ts
index 09335ad7ffaf63a36e7e9efa7b57aea5f43a3a11..a822b66dc7b62f2b7dc75eb688abc7031090af0f 100644
--- a/src/services/consumptionPeriodSelectorService.ts
+++ b/src/services/timePeriod.service.ts
@@ -1,21 +1,18 @@
 import { DateTime } from 'luxon'
 import { FluidType } from 'enum/fluid.enum'
-import { ITimePeriod, TimeStep, TimePeriod } from './dataConsumptionContracts'
-import Config from '../../config.json'
-import IFluidConfig from './IFluidConfig'
-
-export default class ConsumptionPeriodSelector {
-  private readonly _dataDelayOffsetConfig: IFluidConfig[]
-
-  constructor() {
-    this._dataDelayOffsetConfig = Config.fluidConfig
-  }
+import { TimeStep } from 'enum/timeStep.enum'
+import { TimePeriod } from 'models'
+import ConfigService from 'services/fluidConfig.service'
 
+export default class TimePeriodService {
   public getTimePeriods(
     date: DateTime,
     fluidTypes: FluidType[],
     timeStep: TimeStep
-  ): any {
+  ): {
+    timePeriod: TimePeriod
+    comparisonTimePeriod: TimePeriod
+  } {
     const endOfOffsetDate = this.applyOffsetToDate(
       date,
       this.calculateFluidTypesOffset(fluidTypes)
@@ -31,11 +28,11 @@ export default class ConsumptionPeriodSelector {
         timeStep
       ).endOf('day')
 
-    const timePeriod: ITimePeriod = this.getLastCompletePeriod(
+    const timePeriod: TimePeriod = this.getLastCompletePeriod(
       lastDayOfCompletePeriod,
       timeStep
     )
-    const comparisonTimePeriod: ITimePeriod = this.getComparisonTimePeriod(
+    const comparisonTimePeriod: TimePeriod = this.getComparisonTimePeriod(
       timePeriod,
       timeStep
     )
@@ -48,8 +45,10 @@ export default class ConsumptionPeriodSelector {
 
   public calculateFluidTypesOffset(fluidTypes: FluidType[]): number {
     const allOffsets: number[] = []
+    const configService = new ConfigService()
+    const fluidConfig = configService.getFluidConfig()
     fluidTypes.forEach(fluidType =>
-      allOffsets.push(this._dataDelayOffsetConfig[fluidType].dataDelayOffset)
+      allOffsets.push(fluidConfig[fluidType].dataDelayOffset)
     )
 
     // eslint-disable-next-line prefer-spread
@@ -73,24 +72,21 @@ export default class ConsumptionPeriodSelector {
 
   public getLastDayOfTimePeriod(date: DateTime, timeStep: TimeStep): DateTime {
     switch (timeStep) {
-      case TimeStep.HALF_AN_HOUR || TimeStep.HOUR:
+      case TimeStep.HALF_AN_HOUR:
+      case TimeStep.HOUR:
         return DateTime.local(date.year, date.month, date.day)
-
       case TimeStep.DAY:
         return DateTime.local(date.year, date.month, date.day)
           .setLocale('fr-CA')
           .endOf('week')
-
       case TimeStep.MONTH:
         return DateTime.local(date.year, date.month, 1)
           .plus({ months: 1 })
           .minus({ days: 1 })
-
       case TimeStep.YEAR:
         return DateTime.local(date.year, 1, 1)
           .plus({ years: 1 })
           .minus({ days: 1 })
-
       default:
         return date
     }
@@ -98,21 +94,20 @@ export default class ConsumptionPeriodSelector {
 
   public getLastDayOfCompletePeriod(date: DateTime, timeStep: TimeStep) {
     switch (timeStep) {
-      case TimeStep.HALF_AN_HOUR || TimeStep.HOUR:
+      case TimeStep.HALF_AN_HOUR:
+      case TimeStep.HOUR:
         return DateTime.local(date.year, date.month, date.day)
-
       case TimeStep.DAY:
         return DateTime.local(date.year, date.month, date.day)
           .setLocale('fr-CA')
           .startOf('week')
           .minus({ days: 1 })
-
       case TimeStep.MONTH:
-        return DateTime.local(date.year, date.month, 1).minus({ days: 1 })
-
+        return DateTime.local(date.year, date.month, 1).minus({
+          days: 1,
+        })
       case TimeStep.YEAR:
         return DateTime.local(date.year, 1, 1).minus({ days: 1 })
-
       default:
         return date
     }
@@ -123,20 +118,17 @@ export default class ConsumptionPeriodSelector {
     timeStep: TimeStep
   ) {
     switch (timeStep) {
-      case TimeStep.HALF_AN_HOUR || TimeStep.HOUR:
+      case TimeStep.HALF_AN_HOUR:
+      case TimeStep.HOUR:
         return DateTime.local(startDate.year, startDate.month, startDate.day)
-
       case TimeStep.DAY:
         return DateTime.local(startDate.year, startDate.month, startDate.day)
           .setLocale('fr-CA')
           .startOf('week')
-
       case TimeStep.MONTH:
         return DateTime.local(startDate.year, startDate.month, 1)
-
       case TimeStep.YEAR:
         return DateTime.local(startDate.year, 1, 1)
-
       default:
         return startDate
     }
@@ -145,30 +137,30 @@ export default class ConsumptionPeriodSelector {
   public getLastCompletePeriod(
     lastDay: DateTime,
     timeStep: TimeStep
-  ): ITimePeriod {
+  ): TimePeriod {
     // calculate last day of the tobe coimpleted period
-
     const lastCompleteTimePeriod = {
       startDate: this.getStartDateFromEndDateByTimeStep(lastDay, timeStep),
       endDate: lastDay,
     }
-
     return lastCompleteTimePeriod
   }
 
   public getComparisonTimePeriod(
-    timePeriod: ITimePeriod,
+    timePeriod: TimePeriod,
     timeStep: TimeStep
-  ): ITimePeriod {
+  ): TimePeriod {
     let comparisonTimePeriodStartDate: DateTime
     let comparisonTimePeriodEndDate: DateTime
 
     switch (timeStep) {
-      case TimeStep.HALF_AN_HOUR || TimeStep.HOUR:
+      case TimeStep.HALF_AN_HOUR:
+      case TimeStep.HOUR:
         comparisonTimePeriodStartDate = timePeriod.startDate.minus({ days: 1 })
-        comparisonTimePeriodEndDate = timePeriod.endDate.minus({ days: 1 })
+        comparisonTimePeriodEndDate = timePeriod.endDate.minus({
+          days: 1,
+        })
         break
-
       case TimeStep.DAY:
         comparisonTimePeriodStartDate = timePeriod.startDate
           .minus({ days: 1 })
@@ -176,7 +168,6 @@ export default class ConsumptionPeriodSelector {
           .startOf('week')
         comparisonTimePeriodEndDate = timePeriod.startDate.minus({ days: 1 })
         break
-
       case TimeStep.MONTH:
         comparisonTimePeriodStartDate = DateTime.local(
           timePeriod.startDate.year - 1,
@@ -189,7 +180,6 @@ export default class ConsumptionPeriodSelector {
           1
         ).endOf('month')
         break
-
       case TimeStep.YEAR:
         comparisonTimePeriodStartDate = DateTime.local(
           timePeriod.startDate.year - 1,
@@ -202,13 +192,12 @@ export default class ConsumptionPeriodSelector {
           timePeriod.endDate.day
         ).endOf('year')
         break
-
       default:
         comparisonTimePeriodStartDate = timePeriod.startDate
         comparisonTimePeriodEndDate = timePeriod.endDate
     }
 
-    const comparisonTimePeriod: ITimePeriod = {
+    const comparisonTimePeriod: TimePeriod = {
       startDate: comparisonTimePeriodStartDate,
       endDate: comparisonTimePeriodEndDate,
     }
diff --git a/src/services/triggers.service.ts b/src/services/triggers.service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5b4dee3cff160497ec43c3149d2a2cfe8521e408
--- /dev/null
+++ b/src/services/triggers.service.ts
@@ -0,0 +1,101 @@
+import { Client } from 'cozy-client'
+import {
+  Account,
+  Konnector,
+  Trigger,
+  TriggerAttributes,
+  TriggerState,
+} from 'models'
+import { buildAttributes } from 'cozy-harvest-lib/dist/helpers/triggers'
+import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers'
+import ConfigService from 'services/fluidConfig.service'
+
+export default class TriggerService {
+  private _client: Client
+
+  constructor(_client: Client) {
+    this._client = _client
+  }
+
+  private createTriggerAttributes(account: Account, konnector: Konnector) {
+    const configService = new ConfigService()
+    const cronArgs = configService.getCronArgs()
+    const triggerAttributes: TriggerAttributes = buildAttributes({
+      account: account,
+      cron: cronArgs,
+      folder: null,
+      konnector: konnector,
+    })
+    return triggerAttributes
+  }
+
+  public async createTrigger(
+    account: Account,
+    konnector: Konnector
+  ): Promise<Trigger> {
+    const triggerAttributes = this.createTriggerAttributes(account, konnector)
+    if (!triggerAttributes) {
+      throw new Error(
+        'TriggersServices : createTrigger - _triggerAttributes not found'
+      )
+    }
+    const trigger = await triggersMutations(this._client).createTrigger(
+      triggerAttributes
+    )
+    return trigger
+  }
+
+  public async getTrigger(
+    account: Account,
+    konnector: Konnector
+  ): Promise<Trigger> {
+    const query = this._client
+      .find('io.cozy.triggers')
+      .where({
+        'message.account': account._id,
+        'message.konnector': konnector.slug,
+      })
+      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
+      .limitBy(1)
+    const result = await this._client.query(query)
+    return result.data[0] ? result.data[0] : null
+  }
+
+  public static async fetchTriggerFromAccount(
+    client: Client,
+    account: Account
+  ) {
+    if (account == null) return null
+    const query = client
+      .find('io.cozy.triggers')
+      .where({ 'message.account': account._id })
+      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
+      .limitBy(1)
+    const result = await client.query(query)
+    return result.data[0] ? result.data[0] : null
+  }
+
+  public async launchTrigger(trigger: Trigger): Promise<any> {
+    if (!trigger) {
+      throw new Error('TriggersServices : createTrigger - trigger not found')
+    }
+    console.log(
+      '%c Launched Trigger is : ' + trigger._id,
+      'background: #222; color: white'
+    )
+    const job = await triggersMutations(this._client).launchTrigger(trigger)
+    return job
+  }
+
+  public async fetchTriggerState(
+    trigger: Trigger
+  ): Promise<TriggerState | null> {
+    if (trigger == null) return null
+    const triggerState = await this._client
+      .getStackClient()
+      .fetchJSON('GET', `/jobs/triggers/${trigger._id}`)
+    return triggerState.data.attributes.current_state
+      ? triggerState.data.attributes.current_state
+      : null
+  }
+}
diff --git a/src/services/triggersService.ts b/src/services/triggersService.ts
deleted file mode 100644
index 6115785efeeea8fdaddfd4ff9d0d4778dbf75656..0000000000000000000000000000000000000000
--- a/src/services/triggersService.ts
+++ /dev/null
@@ -1,133 +0,0 @@
-import { Client } from 'cozy-client'
-import { Account, Konnector, Trigger } from 'doctypes'
-import triggersMutations from 'cozy-harvest-lib/dist/connections/triggers'
-import FluidConfig from 'services/fluidConfigService'
-import { DateTime } from 'luxon'
-
-export interface TriggerAttributes {
-  type: string
-  arguments: string
-  worker: string
-  message: {
-    account: string
-    konnector: string
-  }
-}
-export class TriggerService {
-  private _trigger: Trigger
-  private _triggerAttributes?: TriggerAttributes
-
-  constructor(
-    private _client: Client,
-    private _account: Account,
-    private _konnector: Konnector
-  ) {
-    this._trigger = {
-      _id: '',
-      type: '',
-      worker: '',
-      arguments: '',
-      message: {
-        account: '',
-        konnector: '',
-      },
-    }
-    this._client = _client
-    this._account = _account
-    this._konnector = _konnector
-  }
-
-  get trigger(): Trigger {
-    return this._trigger
-  }
-
-  createTriggerAttributes = () => {
-    if (!(this._account._id && this._konnector.slug)) {
-      throw new Error(
-        'TriggersServices : createTriggerAttribute - account _id or konnector slug not found'
-      )
-    }
-    const fluidConfigService = new FluidConfig()
-    const cronArgs = fluidConfigService.getCronArgs(this._konnector.slug)
-    const triggerAttributes: TriggerAttributes = {
-      type: '@cron',
-      arguments: cronArgs,
-      worker: 'konnector',
-      message: {
-        account: this._account._id,
-        konnector: this._konnector.slug,
-      },
-    }
-    return triggerAttributes
-  }
-
-  createTrigger = async () => {
-    this._triggerAttributes = this.createTriggerAttributes()
-    if (!(this._triggerAttributes && this._client)) {
-      throw new Error(
-        'TriggersServices : createTrigger - _triggerAttributes or _client not found'
-      )
-    }
-    this._trigger = await triggersMutations(this._client).createTrigger(
-      this._triggerAttributes
-    )
-    return this._trigger
-  }
-
-  setTrigger = (trigger: Trigger) => {
-    this._trigger = trigger
-  }
-
-  launchTrigger = async () => {
-    if (!this._trigger) {
-      throw new Error('TriggersServices : createTrigger - trigger not found')
-    }
-    console.log(
-      '%c Launched Trigger is : ' + this._trigger._id,
-      'background: #222; color: white'
-    )
-    const job = await triggersMutations(this._client).launchTrigger(
-      this._trigger
-    )
-    return job
-  }
-
-  static fetchKonnectorAccountFromTrigger(trigger: any) {
-    if (trigger == null || trigger.message.account == null) return ''
-    return trigger.message
-  }
-
-  static fetchStateFromTrigger(trigger: any) {
-    if (trigger == null || trigger.current_state == null) return ''
-    const { current_state: state } = trigger
-    return state
-  }
-
-  static fetchDateFromTrigger(trigger: any) {
-    if (trigger == null || trigger.current_state == null) return ''
-    return DateTime.fromISO(
-      trigger.current_state.last_execution
-    ).toLocaleString(DateTime.DATETIME_MED)
-  }
-
-  static async fetchTriggerFromAccount(client: Client, account: Account) {
-    if (account == null) return null
-    const query = client
-      .find('io.cozy.triggers')
-      .where({ 'message.account': account._id })
-      .sortBy([{ 'cozyMetadata.updatedAt': 'desc' }])
-      .limitBy(1)
-    const result = await client.query(query)
-    return result.data[0] ? result.data[0] : null
-  }
-
-  static async fetchTriggerState(client: Client, trigger: Trigger) {
-    if (trigger == null) return null
-    const triggerState = await client
-      .getStackClient()
-      .fetchJSON('GET', `/jobs/triggers/${trigger._id}`)
-    return triggerState.data.attributes.current_state
-      ? triggerState.data.attributes.current_state
-      : null
-  }
-}
diff --git a/src/services/userProfileDataManagerService.ts b/src/services/userProfile.service.ts
similarity index 51%
rename from src/services/userProfileDataManagerService.ts
rename to src/services/userProfile.service.ts
index 8364ec1becd93319a0a2e02c0f899c8903c366f5..e6a6faa31e95cd6b2672781a09fa85606410532e 100644
--- a/src/services/userProfileDataManagerService.ts
+++ b/src/services/userProfile.service.ts
@@ -1,27 +1,30 @@
 import { Client } from 'cozy-client'
-import { IUserProfileManager, UserProfile } from './dataChallengeContracts'
+import { UserProfile } from 'models'
 import { USERPROFILE_DOCTYPE } from 'doctypes'
+import { DateTime } from 'luxon'
 
-export default class UserProfileManager implements IUserProfileManager {
+export default class UserProfileService {
   private readonly _client: Client
 
-  //private readonly _queryRunner: QueryRunner
-
   constructor(_client: Client) {
     this._client = _client
-    //this._queryRunner = new QueryRunner(this._client)
   }
 
   public async getUserProfile(): Promise<UserProfile | null> {
-    const { data: userProfiles } = await this._client.query(
+    const { data } = await this._client.query(
       this._client.find(USERPROFILE_DOCTYPE).limitBy(1)
     )
-
-    return userProfiles[0] ? userProfiles[0] : null
+    const userProfile: UserProfile | null = data[0] ? data[0] : null
+    if (userProfile && typeof userProfile.haveSeenOldFluidModal === 'string') {
+      userProfile.haveSeenOldFluidModal = DateTime.fromISO(
+        userProfile.haveSeenOldFluidModal
+      )
+    }
+    return userProfile
   }
 
   public async updateUserProfile(attributes: {
-    [key: string]: string | boolean
+    [key: string]: string | string[] | boolean | DateTime
   }): Promise<UserProfile | null> {
     const { data: userProfile } = await this._client
       .query(this._client.find(USERPROFILE_DOCTYPE).limitBy(1))
@@ -32,6 +35,11 @@ export default class UserProfileManager implements IUserProfileManager {
           ...attributes,
         })
       })
+    if (userProfile && typeof userProfile.haveSeenOldFluidModal === 'string') {
+      userProfile.haveSeenOldFluidModal = DateTime.fromISO(
+        userProfile.haveSeenOldFluidModal
+      )
+    }
     return userProfile ? userProfile : null
   }
 }
diff --git a/src/styles/base/_color.scss b/src/styles/base/_color.scss
index fc0a0c3ebe9edad67afe2a272ff2b174276c1937..7883ff39fcd1b59f47a23e5550561fcaabf2a109 100644
--- a/src/styles/base/_color.scss
+++ b/src/styles/base/_color.scss
@@ -1,9 +1,3 @@
-// Primary colors
-$blue-heavy: #303558;
-$blue-light: #81abd0;
-$cozy-blue: #297ef2;
-$cozy-grey: #95999d;
-
 /** BLACK **/
 $dark: #242633;
 $dark-2: #1b1c22;
@@ -14,22 +8,9 @@ $dark-background: radial-gradient(
   #2a2b30 0%,
   #1b1c22 100%
 );
-$dark-linear-card: linear-gradient(180deg, #323339 0%, #25262b 100%);
-
-/** TEXT COLOR **/
-$text-black: black;
-$text-bright: #e0e0e0;
-$text-dark: #a0a0a0;
-$text-white: #ffffff;
-$text-blue: #58FFFF;
-$google-text-1: $text-bright;
-$google-text-2: $text-dark;
 
 /** RED **/
-$red-primary: #D25959;
-$red-error: #ce3535;
-$red-no-data: #d24444;
- 
+$red-primary: #d25959;
 
 /** YELLOW **/
 $gold: #b2901b;
@@ -37,38 +18,41 @@ $gold-40: rgba(227, 184, 42, 0.4);
 $gold-light: #deaf0e;
 $gold-shadow: #e3b82a;
 
-/** ORANGE **/
-$orange: #d87b39;
-$orange-shadowed: rgba(216, 123, 57, 0.4);
-
 /** BLUE **/
-$blue: #58FFFF;
-$blue-40: #58FFFF40;
+$blue: #58ffff;
+$blue-40: #58ffff40;
 $blue-shadowed: rgba(58, 152, 236, 0.4);
-$blue-gradient: linear-gradient(180deg, #61F0F2 0%, #48C2C4 100%);
-$blue-radial-gradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), $blue;
-$blue-radial-gradient-transparent: radial-gradient(circle, $blue 0%, rgba(255,255,255,0) 100%);
+$blue-gradient: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);
+$blue-radial-gradient: radial-gradient(
+    105.25% 64.58% at 49.68% 70.83%,
+    rgba(1, 153, 163, 0.5) 0%,
+    rgba(255, 255, 255, 0) 100%
+  ),
+  $blue;
+$blue-radial-gradient-transparent: radial-gradient(
+  circle,
+  $blue 0%,
+  rgba(255, 255, 255, 0) 100%
+);
 
 /** GREEN **/
-$green: #45d1b8;
-$green-2: #7fd771;
-$green-shadowed: rgba(69, 209, 184, 0.4);
+$green: #7fd771;
 
 /** WHITE **/
-$white: rgb(255, 255, 255);
+$white: #ffffff;
 
 /** GREY **/
 $grey-bright: #e0e0e0;
+$soft-grey: #a0a0a0;
 $grey-dark: #7b7b7b;
-$grey-background: linear-gradient(180deg, #323339 0%, #25262B 100%);
+$grey-linear-gradient-background: linear-gradient(
+  180deg,
+  #323339 0%,
+  #25262b 100%
+);
 
 /** App colors **/
-$primary-color: $dark-light;
-$card-background: $dark-light;
-$accordion-background: $dark-light;
-$app-background: $dark-2;
 $accordion-active-background: #34353a;
-$text-color: white;
 
 $elec-color: #d87b39;
 $elec-color-40: rgba(216, 123, 57, 0.4);
@@ -93,13 +77,27 @@ $multi-off-color: #705d1d;
 $multi-compare-color: #ffd597;
 $multi-compare-off-color: #7d6a4e;
 
-$axis-graph: $grey-dark;
-
 /** TABS GRADIENT **/
-$multi-color-radial-gradient-transparent: radial-gradient(circle, #e3b82a 0%, rgba(255,255,255,0) 100%);
-$elec-color-radial-gradient-transparent: radial-gradient(circle, #d87b39 0%, rgba(255,255,255,0) 100%);
-$water-color-radial-gradient-transparent: radial-gradient(circle, #3a98ec 0%, rgba(255,255,255,0) 100%);
-$gas-color-radial-gradient-transparent: radial-gradient(circle, #45d1b8 0%, rgba(255,255,255,0) 100%);
+$multi-color-radial-gradient-transparent: radial-gradient(
+  circle,
+  #e3b82a 0%,
+  rgba(255, 255, 255, 0) 100%
+);
+$elec-color-radial-gradient-transparent: radial-gradient(
+  circle,
+  #d87b39 0%,
+  rgba(255, 255, 255, 0) 100%
+);
+$water-color-radial-gradient-transparent: radial-gradient(
+  circle,
+  #3a98ec 0%,
+  rgba(255, 255, 255, 0) 100%
+);
+$gas-color-radial-gradient-transparent: radial-gradient(
+  circle,
+  #45d1b8 0%,
+  rgba(255, 255, 255, 0) 100%
+);
 
 $multi-color-radial-gradient: radial-gradient(
     105.25% 64.58% at 49.68% 70.83%,
@@ -125,3 +123,8 @@ $water-color-radial-gradient: radial-gradient(
     rgba(255, 255, 255, 0) 100%
   ),
   #3a98ec;
+
+/** SCROLLBAR **/
+
+$scrollbar-track: #3e4045;
+$scrollbar-thumb: #6f7074;
diff --git a/src/styles/base/_layout.scss b/src/styles/base/_layout.scss
index 0f07d9e7feecf90af76fa1f77642fd0467a7d0b1..7384ef5e99e4fd89fae246b31146fb741765cda6 100644
--- a/src/styles/base/_layout.scss
+++ b/src/styles/base/_layout.scss
@@ -2,11 +2,11 @@
 @import '../base/breakpoint';
 
 html {
-  background: $app-background;
+  background: $dark-2;
 }
 
 body {
-  background: $app-background;
+  background: $dark-2;
   overflow: unset !important;
 }
 
@@ -28,7 +28,7 @@ body {
 }
 
 [role='banner'] .coz-bar-container {
-  background-color: white;
+  background-color: $white;
   @media #{$large-phone} {
     padding: 0 0 0 0;
     background-color: unset;
@@ -67,7 +67,7 @@ body {
     width: 100%;
     .header-text {
       padding: 0 1rem 1rem 1rem;
-      color: $text-bright;
+      color: $grey-bright;
     }
   }
   .header-content {
@@ -75,15 +75,15 @@ body {
     display: flex;
     flex-direction: column;
     @media #{$tablet} {
-        margin: 0;
+      margin: 0;
     }
     @media #{$large-phone} {
-        margin: 60px 0 0 0;
+      margin: 60px 0 0 0;
     }
     .header-content-top {
       display: flex;
       flex-direction: row;
-      &.header-content-top-right{
+      &.header-content-top-right {
         justify-content: flex-end;
       }
       .header-text {
@@ -94,7 +94,7 @@ body {
         display: flex;
         flex: 1;
         padding: 2rem 1.25rem;
-        color: $text-bright;
+        color: $grey-bright;
       }
       .header-back-button {
         padding: 0 0.75rem;
@@ -102,7 +102,7 @@ body {
       @media #{$large-phone} {
         .header-text {
           padding: 0 1rem 1rem 1rem;
-          color: $text-bright;
+          color: $grey-bright;
         }
         .header-text-desktop {
           display: none;
@@ -129,7 +129,7 @@ body {
   flex-direction: column;
   justify-content: center;
   align-items: center;
-  color: $text-bright;
+  color: $grey-bright;
   .content-view-loading-text {
     padding-top: 1rem;
     margin: 0 2rem;
@@ -148,10 +148,10 @@ body {
   }
   /* Track */
   &::-webkit-scrollbar-track {
-    background: #3e4045;
+    background: $scrollbar-track;
   }
   /* Handle */
   &::-webkit-scrollbar-thumb {
-    background: #6f7074;
+    background: $scrollbar-thumb;
   }
 }
diff --git a/src/styles/base/_typography.scss b/src/styles/base/_typography.scss
index 928255227e47947eb563fb147a5a8e4d857a64ee..9a379223a73f0f966f44ebe6c7c73a113a8b244c 100644
--- a/src/styles/base/_typography.scss
+++ b/src/styles/base/_typography.scss
@@ -14,7 +14,7 @@ h4,
 h5,
 h6,
 p {
-  color: $google-text-2;
+  color: $soft-grey;
   font-family: $text-font;
 }
 
@@ -36,20 +36,10 @@ p {
 
   text-align: center;
   letter-spacing: 0.15px;
-  color: $google-text-1;
+  color: $grey-bright;
   text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07);
 }
 
-.red {
-  color: $red-primary;
-}
-.blue {
-  color: $blue-light;
-}
-.green {
-  color: $green-2;
-}
-
 .text-10-normal {
   font-family: $text-font;
   font-style: normal;
@@ -93,6 +83,14 @@ p {
   font-size: 1rem;
   line-height: 120%;
 }
+.text-16-normal-uppercase {
+  font-family: $text-font;
+  font-style: normal;
+  font-weight: normal;
+  font-size: 1rem;
+  line-height: 120%;
+  text-transform: uppercase;
+}
 .text-16-normal-150 {
   font-family: $text-font;
   font-style: normal;
@@ -179,7 +177,7 @@ p {
     font-weight: bold;
     font-size: 1rem;
     line-height: 120%;
-    color: $text-bright;
+    color: $grey-bright;
   }
 }
 .button-secondary-text {
@@ -188,7 +186,7 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 
 /* Card */
@@ -198,7 +196,7 @@ p {
   font-weight: normal;
   font-size: 1.125rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .card-title-off {
   font-family: $text-font;
@@ -206,7 +204,7 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .card-text-bold {
   font-family: $text-font;
@@ -214,7 +212,7 @@ p {
   font-weight: bold;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .card-result {
   font-family: $text-font;
@@ -222,7 +220,7 @@ p {
   font-weight: 900;
   font-size: 1.75rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .card-indicator {
   font-family: $text-font;
@@ -230,7 +228,7 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .card-text {
   font-family: $text-font;
@@ -238,7 +236,7 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 
 /* Chart */
@@ -248,7 +246,7 @@ p {
   font-weight: bold;
   font-size: 1rem;
   line-height: 123%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .chart-result {
   font-family: $text-font;
@@ -256,7 +254,7 @@ p {
   font-weight: bold;
   font-size: 2.25rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .chart-fluid {
   font-family: $text-font;
@@ -264,7 +262,7 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .chart-switch-text {
   font-family: $text-font;
@@ -272,7 +270,7 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 .chart-ticks-x-text {
   font-family: $text-font;
@@ -302,7 +300,7 @@ p {
   font-weight: bold;
   font-size: 1.3125rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
 
 /* List */
@@ -313,7 +311,7 @@ p {
   font-size: 0.875rem;
   line-height: 120%;
   text-transform: uppercase;
-  color: $text-bright;
+  color: $grey-bright;
 }
 
 /* Tab */
@@ -330,5 +328,5 @@ p {
   font-weight: normal;
   font-size: 1rem;
   line-height: 120%;
-  color: $text-bright;
+  color: $grey-bright;
 }
diff --git a/src/styles/components/_barchart.scss b/src/styles/components/_barchart.scss
index 117eb75d79a972f04dcb6764f831ae8a9a062d8c..d4329e36c73af5810ae7cdf7a83add0210ae4709 100644
--- a/src/styles/components/_barchart.scss
+++ b/src/styles/components/_barchart.scss
@@ -2,11 +2,11 @@
 @import '../base/breakpoint';
 
 .axis {
-  color: $axis-graph;
+  color: $grey-dark;
   .tick-text {
-    fill: $axis-graph;
+    fill: $grey-dark;
     &.tick-text-selected {
-      fill: $text-bright;
+      fill: $grey-bright;
     }
   }
 }
@@ -16,6 +16,18 @@
 .background-false {
   opacity: 0;
 }
+.bar-compare-ELECTRICITY,
+.bar-compare-GAS,
+.bar-compare-WATER,
+.bar-compare-MULTIFLUID,
+.bar-MULTIFLUID,
+.bar-WATER,
+.bar-GAS,
+.bar-ELECTRICITY {
+  &:hover {
+    cursor: pointer;
+  }
+}
 .bar-ELECTRICITY {
   fill: $elec-off-color;
   &.selected {
diff --git a/src/styles/components/_button.scss b/src/styles/components/_button.scss
deleted file mode 100644
index fdfb481fdcdc4e48b4c6cd41e60f0980f6b335a0..0000000000000000000000000000000000000000
--- a/src/styles/components/_button.scss
+++ /dev/null
@@ -1,143 +0,0 @@
-@import "../base/color";
-@import "../base/breakpoint";
-
-
-
-.btn-primary
-{
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  background-color: $gold;
-  border: 1px solid rgba(227, 184, 42, 0.2);
-  box-shadow: 0px 2px 6px #1E1C1C;
-  border-radius: 2px;
-  margin: 1rem 0 1rem 0;
-  color: $text-black;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  text-transform: capitalize;
-  
-
-  &:hover {
-    cursor: pointer;
-    background-color: $gold-light;
-    color: $dark;
-  }
-  &:active {
-    position:relative;
-    top:1px;
-    background-color: #c59f1c;
-  }
-
-  &:focus {
-    cursor: pointer;
-    outline:none;
-    
-  }
-}
-
-.btn-secondary
-{
-  background-color: $gold-light;
-  color: $text-black;
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  margin: 1rem 0 1rem 0;
-  text-transform: capitalize;
-
-  border: 1px solid rgba(227, 184, 42, 0.2);
-  box-shadow: -2px -2px 6px rgba(227, 184, 42, 0.2), 2px 2px 6px #1E1C1C;
-  border-radius: 6px;
-
-  font-style: normal;
-  font-weight: 600;
-  font-size: 16px;
-  line-height: 120%;
-}
-
-.btn-secondary-negative
-{
-  border: 1px solid $gold-light;
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  margin: 1rem 0 1rem 0;
-  text-transform: capitalize;
-
-  box-shadow: -2px -2px 6px rgba(227, 184, 42, 0.2), 2px 2px 6px #1E1C1C;
-  border-radius: 6px;
-  font-style: normal;
-  font-weight: normal;
-  font-size: 16px;
-  line-height: 120%;
-
-  color: #E0E0E0;
-}
-
-.btn-chevron
-{
-  margin: 1rem 1rem 1rem 0;
-  color: rgb(255,255,255);
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  
-
-  &:hover {
-    cursor: pointer;
-    color: white;
-  }
-}
-
-.btn-long-string {
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  border: 1px solid #121212;
-  box-sizing: border-box;
-  border-radius: 2px;
-  color: $text-color;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  margin: 1rem 0 1rem 0;
-}
-
-
-/*
-.btn {
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  background-color: $gold;
-  border: none;
-  margin: 1rem 0 1rem 0;
-  color: $text-black;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  text-transform: capitalize;
-  &.active{
-    opacity: 0.3;
-  }
-  &:hover {
-    cursor: pointer;
-    background-color: $gold-light;
-    color: $dark;
-  }
-  &:active {
-    position:relative;
-    top:1px;
-    background-color: #c59f1c;
-  }
-  .btn-content{
-    display: inline-flex;
-    align-items: center;
-    .btn-icon{
-      margin-right: 1.5vw;
-    }
-  }
-}
-*/
diff --git a/src/styles/components/_card.scss b/src/styles/components/_card.scss
index 7512ec0f6d1c3706938cfa91764c26a0686f02a5..1db79c8548d1c6e1deb36b6bb3cbbd817cea6651 100644
--- a/src/styles/components/_card.scss
+++ b/src/styles/components/_card.scss
@@ -1,87 +1,10 @@
-@import "../base/color";
-@import "../base/breakpoint";
+@import '../base/color';
+@import '../base/breakpoint';
 
 // RedirectionMiniCard
-.redirect-card-link{
+.redirect-card-link {
   color: transparent;
 }
-.redirect-card-content{
+.redirect-card-content {
   margin: 0.25rem 0;
 }
-
-
-
-.card {
-  /* linear card */
-  background: $dark-linear-card;
-  background-color: $card-background;
-  display: flex;
-  flex-direction: column;
-  color: $text-color;
-  padding: 1rem 1.5rem;
-  margin: 2vh 2vw 2vh 0vw;
-  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);
-  @media #{$large-phone} {
-    margin: 2vh 0;
-  }
-  &.orange {
-    border: 1px solid $orange-shadowed;
-  }
-  &.blue {
-    border: 1px solid $blue-shadowed;
-  }
-  &.green {
-    border: 1px solid $green-shadowed;
-  }
-  .title {
-    font-size: 1.5rem;
-    font-style: normal;
-    font-weight: normal;
-    color: $google-text-1;
-    line-height: 120%;
-  }
-  h1 {
-    font-size: 1rem;
-    font-style: normal;
-    font-weight: normal;
-    line-height: 120%;
-    color: white;
-  }
-  p {
-    font-style: normal;
-    font-weight: normal;
-    font-size: 1rem;
-    line-height: 120%;
-  }
-  .card-header{
-    flex-direction: row;
-    display: flex;
-    justify-content: left;
-    padding: 0.75rem 0rem;
-    div:first-of-type {
-      margin-left: 3.5vw;
-    }
-    h2 {
-      margin: 0;
-      color: $google-text-1;
-      font-style: normal;
-      font-weight: normal;
-      font-size: 2rem;
-      line-height: 120%;
-      span {
-        color: $google-text-1;
-        font-weight: 600;
-        font-size: 2.3rem;
-      }
-    }
-    h3 {
-      margin: 0;
-      font-style: normal;
-      font-weight: bold;
-      font-size: 1rem;
-      line-height: 120%;
-    }
-  }
-}
-
-
diff --git a/src/styles/components/_challenges.scss b/src/styles/components/_challenges.scss
index 0d270b0263529ce98cfcaa0d321978ee15ead4d1..20042ddec71004318456afeb59e5598ed202b2da 100644
--- a/src/styles/components/_challenges.scss
+++ b/src/styles/components/_challenges.scss
@@ -17,7 +17,7 @@
     .ccc-header {
       margin-top: 0.375rem;
       margin-bottom: 1.25rem;
-      color: $text-bright;
+      color: $grey-bright;
     }
   }
 }
@@ -32,7 +32,7 @@
       display: block;
     }
     .timeline-line {
-      background-color: $text-bright;
+      background-color: $grey-bright;
       width: 1px;
       height: calc(100vh);
       grid-column: 1;
@@ -101,21 +101,21 @@
         height: 62px;
       }
       .cli-content-title {
-        color: $text-white;
+        color: $white;
         margin: 0 1rem;
         align-self: center;
       }
       .subtitle-finished {
-        color: $text-dark;
+        color: $soft-grey;
       }
       .title-finished {
-        color: $text-bright;
+        color: $grey-bright;
       }
       .subtitle-ongoing {
-        color: $text-blue;
+        color: $blue;
       }
       .title-ongoing {
-        color: $text-white;
+        color: $white;
       }
       .subtitle-available {
         color: $dark-light-2;
@@ -124,7 +124,7 @@
         color: $dark-light-2;
       }
       .title-locked {
-        color: $text-dark;
+        color: $soft-grey;
         opacity: 0.35;
       }
     }
@@ -159,7 +159,7 @@
     justify-content: center;
     width: inherit;
     .cc-content-title {
-      color: $text-white;
+      color: $white;
       &.cc-content-title-padding {
         padding-top: 1rem;
       }
@@ -188,7 +188,7 @@
       width: 1.8125rem;
       border-radius: 50%;
       background: $blue-radial-gradient;
-      color: $text-black;
+      color: $dark-light;
       margin-right: 1rem;
     }
   }
@@ -215,6 +215,7 @@
       #d1880d 75%,
       #a05b11 100%
     );
+    background-clip: text;
     -webkit-background-clip: text;
     -webkit-text-fill-color: transparent;
   }
@@ -227,6 +228,7 @@
       #9e4e24 51.56%,
       #a4573a 66.67%
     );
+    background-clip: text;
     -webkit-background-clip: text;
     -webkit-text-fill-color: transparent;
   }
@@ -266,16 +268,16 @@
     }
   }
   .cm-result {
-    color: $text-bright;
+    color: $grey-bright;
     text-align: center;
     margin-top: 1.5rem;
     margin-bottom: 0.5rem;
     margin-bottom: 165px;
     .cm-result-positif {
-      color: $green-2;
+      color: $green;
     }
     .cm-result-negatif {
-      color: $red-no-data;
+      color: $red-primary;
     }
   }
   .cm-badge {
@@ -343,12 +345,12 @@
     .day-letter {
       margin-top: 0.8rem;
       text-align: center;
-      color: $text-dark;
+      color: $soft-grey;
     }
     .day-date {
       margin-top: 0.2rem;
       text-align: center;
-      color: $text-dark;
+      color: $soft-grey;
     }
   }
 }
@@ -397,7 +399,7 @@
     margin-left: 1rem;
   }
   .no-values-section {
-    color: $text-white;
+    color: $white;
     margin-left: 1rem;
   }
 }
@@ -412,7 +414,7 @@
     display: flex;
     align-items: center;
     flex-direction: column;
-    color: $text-bright;
+    color: $grey-bright;
     min-height: 84vh;
     justify-content: space-between;
 
@@ -457,25 +459,25 @@
         }
       }
       .cp-date {
-        color: $text-dark;
+        color: $soft-grey;
         text-align: center;
         margin-top: 1rem;
       }
       .cp-title {
-        color: $text-bright;
+        color: $grey-bright;
         text-align: center;
         margin-top: 0.5rem;
       }
       .cp-result {
-        color: $text-bright;
+        color: $grey-bright;
         text-align: center;
         margin-top: 1.5rem;
         margin-bottom: 0.5rem;
         .cp-result-positif {
-          color: $green-2;
+          color: $green;
         }
         .cp-result-negatif {
-          color: $red-no-data;
+          color: $red-primary;
         }
       }
       .cp-description {
diff --git a/src/styles/components/_consumptionvisualizer.scss b/src/styles/components/_consumptionvisualizer.scss
index d8f436b7298e0257c380f119331d844ea03a4ef7..d23b4f8f1808f9fd9d86f3aebb1d1fb3ae863caa 100644
--- a/src/styles/components/_consumptionvisualizer.scss
+++ b/src/styles/components/_consumptionvisualizer.scss
@@ -7,14 +7,13 @@
   align-items: center;
   width: 27.5rem;
   @media #{$large-phone} {
-      width: 100%;
+    width: 100%;
   }
   .cv-content-date {
     display: flex;
     flex-direction: row;
     justify-content: space-around;
     width: 100%;
-    // margin-top: 1em;
     .cv-date-group {
       display: flex;
       flex-direction: column;
@@ -22,7 +21,7 @@
       align-items: center;
       align-self: center;
       .cv-date {
-        color: $google-text-1;
+        color: $grey-bright;
         &::first-letter {
           text-transform: uppercase;
         }
@@ -101,33 +100,30 @@
     color: $gas-compare-color;
   }
   .multifluid {
-    color: $text-white;
+    color: $white;
   }
   .multifluid-compare {
     color: $multi-compare-color;
   }
   .error {
-    color: $red-no-data;
+    color: $red-primary;
   }
   .error-line {
-    color: $red-no-data;
+    color: $red-primary;
     cursor: pointer;
     display: flex;
     align-items: center;
   }
   .underlined-error {
-    border-bottom: solid 1px $red-no-data;
+    border-bottom: solid 1px $red-primary;
   }
   .warning-icon {
     margin-right: 4px;
   }
-  .multifluid-compare {
-    color: $multi-compare-color;
-  }
   .cv-button {
     border: none;
     background: none;
-    color: $google-text-2;
+    color: $soft-grey;
     text-decoration: underline;
   }
 }
diff --git a/src/styles/components/_ecogesture.scss b/src/styles/components/_ecogesture.scss
index 2ad62004c9347d69bdf66da2662eb8b1a82d6700..99dbc784d18b53f5bdc552c70c51406723e73587 100644
--- a/src/styles/components/_ecogesture.scss
+++ b/src/styles/components/_ecogesture.scss
@@ -42,14 +42,28 @@
 }
 
 // EcogestureCard
-.ec-link {
-  color: black;
-}
 .ec {
   display: flex;
   justify-content: center;
   width: 100%;
   height: 100%;
+  .ecogesture-card-notif {
+    position: absolute;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    right: 8px;
+    top: 8px;
+    width: 1.25rem;
+    height: 1.25rem;
+    color: $dark-light;
+    border-radius: 50%;
+    border: 1px solid $dark-light;
+    z-index: 1;
+    background: $blue-radial-gradient;
+    font-size: 12px;
+  }
+
   .ec-content {
     display: flex;
     flex-direction: column;
@@ -72,7 +86,7 @@
     }
     .ec-content-nwh {
       margin-top: 0.25rem;
-      color: $text-dark;
+      color: $soft-grey;
     }
   }
 }
@@ -91,7 +105,7 @@
 
 // EcogestureModal
 .em-header {
-  color: $text-bright;
+  color: $grey-bright;
   border-bottom: 1px solid rgba(163, 163, 163, 0.4);
   padding-bottom: 1em;
   width: 100%;
@@ -110,11 +124,11 @@
   }
   /* Track */
   &::-webkit-scrollbar-track {
-    background: #3e4045;
+    background: $scrollbar-track;
   }
   /* Handle */
   &::-webkit-scrollbar-thumb {
-    background: #6f7074;
+    background: $scrollbar-thumb;
   }
   .em-content {
     padding: 1.5rem 2.5rem 0;
@@ -141,7 +155,7 @@
         flex: 1;
         align-self: flex-start;
         margin-top: 0.65rem;
-        color: var(--textDark);
+        color: $soft-grey;
         .em-detail-nwh-unit {
           margin-left: 0.2rem;
         }
diff --git a/src/styles/components/_faq.scss b/src/styles/components/_faq.scss
index 6a2872239e6c0a128c2f23f7df3a6f0daa554c52..f825f0989a426a16e91302b3423cab3eaed732a4 100644
--- a/src/styles/components/_faq.scss
+++ b/src/styles/components/_faq.scss
@@ -20,13 +20,13 @@
     .faq-header {
       margin-top: 2.5rem;
       margin-bottom: 1.25rem;
-      color: $text-bright;
+      color: $grey-bright;
     }
   }
 }
 
 .faq-card-link {
-  color: black;
+  color: $white;
 }
 .faq-card {
   display: flex;
diff --git a/src/styles/components/_feedback.scss b/src/styles/components/_feedback.scss
index a4e85c5a93cd72cff2c6510da25b7c14c3a0fa5b..baab42b3b7d250a662fecc89de4adc2eecfabff1 100644
--- a/src/styles/components/_feedback.scss
+++ b/src/styles/components/_feedback.scss
@@ -1,8 +1,7 @@
 @import '../base/color';
 @import '../base/breakpoint';
 
-
-.fb-root{
+.fb-root {
   overflow-y: auto;
   .fb-header {
     color: $gold-shadow;
@@ -15,16 +14,15 @@
     padding: 1rem 1.5rem 1.5rem 1.5rem;
     display: flex;
     flex-direction: column;
-    .fb-content-success{
-      color: $text-bright;
-      color: $text-bright;
+    .fb-content-success {
+      color: $grey-bright;
       display: flex;
       flex-direction: column;
       align-items: center;
       text-align: center;
     }
-    .fb-content-error{
-      color: $text-bright;
+    .fb-content-error {
+      color: $grey-bright;
       display: flex;
       flex-direction: column;
       align-items: center;
@@ -35,50 +33,50 @@
       justify-content: center;
       margin: 0 0 1.5rem 0;
     }
-    .fb-label{
+    .fb-label {
       margin: 0.5rem 0 0 0;
     }
-    .fb-selector{
+    .fb-selector {
       margin: 0.5rem 0;
       display: flex;
       flex-direction: row;
       align-content: space-around;
       justify-content: space-around;
-      .fb-selector-item{
+      .fb-selector-item {
         height: 3.125rem;
         width: 3.125rem;
         .fb-selector-item-label {
-          color: $text-bright;
+          color: $grey-bright;
         }
         .fb-selector-item-selectedlabel {
           color: $white;
         }
       }
     }
-    .fb-form{
+    .fb-form {
       margin: 0.5rem 0;
       border: 1px solid $grey-dark;
       border-radius: 4px;
-      color: $text-bright;
+      color: $grey-bright;
       background: rgba(0, 0, 0, 0.3);
       padding: 0 1rem;
       outline: none;
     }
-    .fb-form:focus{
+    .fb-form:focus {
       border: 1px solid $gold-shadow;
     }
-    .fb-textarea{
+    .fb-textarea {
       height: 8.725rem;
       padding: 0.5rem 1rem;
       resize: none;
     }
-    .fb-input{
+    .fb-input {
       height: 2rem;
     }
-    .fb-button{
+    .fb-button {
       max-width: 9.375rem;
       align-self: center;
       margin-top: 1rem;
     }
   }
-}
\ No newline at end of file
+}
diff --git a/src/styles/components/_fluid.scss b/src/styles/components/_fluid.scss
index 270a37b2c3f0af3a11a3ec8c1b3a2cb52ef47b1a..04e1689f496d397a7449501d75ee73f10c3de487 100644
--- a/src/styles/components/_fluid.scss
+++ b/src/styles/components/_fluid.scss
@@ -7,10 +7,10 @@
   flex-direction: column;
   .sf-header {
     .sf-header-title {
-      color: $text-bright;
+      color: $grey-bright;
     }
     .sf-header-text {
-      color: $text-dark;
+      color: $soft-grey;
     }
   }
   .sf-content {
@@ -84,9 +84,9 @@
         flex: 1;
         display: flex;
         justify-content: flex-start;
-        color: $text-dark;
+        color: $soft-grey;
         &.selected {
-          color: $text-white;
+          color: $white;
         }
       }
     }
@@ -99,14 +99,14 @@
       align-items: center;
       .fv-link {
         text-decoration: none;
-        color: $text-dark;
+        color: $soft-grey;
       }
       & .fv-footer-label-padding {
         flex: 1;
         display: flex;
         justify-content: flex-start;
         padding-left: 0.75rem;
-        color: $text-dark;
+        color: $soft-grey;
       }
     }
   }
@@ -120,7 +120,6 @@
   height: auto;
 }
 
-
 //FluidSwipe
 .fs-root {
   flex: 1;
@@ -128,6 +127,11 @@
   @media #{$large-phone} {
     height: 14rem;
   }
+  .chart-loading {
+    width: 100%;
+    justify-content: center;
+    display: flex;
+  }
   .fs-slide {
     min-height: 22rem;
     overflow-x: hidden;
@@ -137,6 +141,13 @@
     @media #{$large-phone} {
       min-height: 14rem;
     }
+    .chart-none {
+      visibility: hidden;
+      width: 0;
+    }
+    .chart-block {
+      visibility: visible;
+    }
   }
 }
 
@@ -166,7 +177,7 @@
     font-weight: bold;
     letter-spacing: 0.2px;
     margin-bottom: 1.5em;
-    color: $text-bright;
+    color: $grey-bright;
     width: 50%;
     @media #{$large-phone} {
       width: 80%;
diff --git a/src/styles/components/_form.scss b/src/styles/components/_form.scss
index 7a32dca36a751e7a0e245d14ff30290a5ecfb4ac..cdacb2d40ca969f22e6e6585f525e13e0c99285e 100644
--- a/src/styles/components/_form.scss
+++ b/src/styles/components/_form.scss
@@ -10,21 +10,21 @@
     font-style: normal;
     font-weight: normal;
     font-size: 1rem;
-    color: $google-text-1;
+    color: $grey-bright;
     margin-top: 0rem;
   }
   .form-input {
     background: rgba(0, 0, 0, 0.3);
     border: 1px solid #7b7b7b;
     border-radius: 4px;
-    color: $google-text-1;
+    color: $grey-bright;
     padding: 0 5%;
     outline-offset: -1px;
     &.--error {
       border: 1px solid $red-primary;
     }
   }
-  .form-input:focus{
+  .form-input:focus {
     outline: none;
     border: 1px solid $gold-shadow;
   }
@@ -46,7 +46,7 @@
     }
   }
   .form-message {
-    color: $red-error;
+    color: $red-primary;
     min-height: 1.25rem;
     margin-top: 0.75rem;
   }
@@ -54,6 +54,6 @@
     margin-top: 0.75rem;
   }
   ::placeholder {
-    color: $google-text-1;
+    color: $grey-bright;
   }
 }
diff --git a/src/styles/components/_indicators.scss b/src/styles/components/_indicators.scss
index 8fd6af231ec01098f4663bc7da5b9289ff027183..5e91831830d3892fd9b16e7099802eef241097d1 100644
--- a/src/styles/components/_indicators.scss
+++ b/src/styles/components/_indicators.scss
@@ -19,9 +19,10 @@
       width: 100%;
     }
     .fi-header {
-      margin-top: 2.5rem;
+      margin-top: 1rem;
       margin-bottom: 1.25rem;
-      color: $text-bright;
+      color: $grey-bright;
+      font-size: 1rem;
     }
   }
   //SingleFluidIndicator
@@ -34,16 +35,16 @@
     .sfi-header {
       margin-top: 2.5rem;
       margin-bottom: 1.25rem;
-      color: $text-bright;
+      color: $grey-bright;
     }
-    .sfi-redirect{
+    .sfi-redirect {
       margin-bottom: 1.25rem;
       display: flex;
       flex-wrap: wrap;
-      .redirect-card-link:nth-child(2){
+      .redirect-card-link:nth-child(2) {
         margin-left: 0.625rem;
       }
-      .redirect-card-link{
+      .redirect-card-link {
         flex: 1;
       }
     }
@@ -54,6 +55,11 @@
 .fpi-link {
   color: transparent;
 }
+.details-title {
+  color: white;
+  display: inline-block;
+  margin-bottom: 1rem;
+}
 .fpi {
   display: flex;
   flex-direction: row;
@@ -70,38 +76,78 @@
     .fpi-content {
       display: flex;
       flex-direction: row;
+      &:first-child() {
+        margin-bottom: 2rem;
+      }
+      .icon-line {
+        display: flex;
+        align-items: center;
+        gap: 0.8rem;
+        margin-bottom: 0.25rem;
+        .euro-value {
+          font-size: 2.2rem;
+          font-weight: 900;
+          margin-right: 0.2rem;
+        }
+        .evolution-text {
+          color: $soft-grey;
+          .fpi-content-perf-indicator-kpi {
+            &.positive {
+              color: $red-primary !important;
+            }
+            &.negative {
+              color: $green !important;
+            }
+          }
+          .diff-value {
+            color: white;
+            font-weight: 700;
+          }
+        }
+      }
+      .bilan-card {
+        margin-bottom: 2rem;
+      }
+      .error {
+        display: flex;
+        gap: 1rem;
+      }
       .fpi-content-icon {
         margin: 0.5rem 0;
       }
-      .fpi-content-perf {
-        margin: 0 1rem;
+      .perf-icon {
+        align-self: start;
+      }
+      .fpi-content-perf:not(:first-child) {
+        margin: 0 0 0 1rem;
         align-self: center;
+
         .fpi-content-perf-result {
-          color: $text-bright;
+          color: $grey-bright;
           & span {
             display: inline-block;
             padding-right: 0.25rem;
           }
-        }
-        .fpi-content-perf-indicator {
-          color: $text-dark;
-          .fpi-content-perf-indicator-kpi {
-            &.positive {
-              color: #ffffff;
-            }
-            &.positive {
-              color: #cf6666;
-            }
-            &.negative {
-              color: #7fd771;
-            }
+          .euro-value {
+            font-size: 1.125rem;
+            display: block;
+            font-weight: 400;
+          }
+          .ELECTRICITY-color {
+            color: $elec-color;
+          }
+          .GAS-color {
+            color: $gas-color;
+          }
+          .WATER-color {
+            color: $water-color;
           }
         }
       }
     }
     .fpi-footer {
       margin-top: 0.5rem;
-      color: $text-dark;
+      color: $soft-grey;
     }
   }
   .fpi-right {
diff --git a/src/styles/components/_konnector.scss b/src/styles/components/_konnector.scss
index a8f955b3497ad48986d56d7bdcc1af0b4a4bdc93..127bb35d9eb36f2a79af4475ca36afbaa034589a 100644
--- a/src/styles/components/_konnector.scss
+++ b/src/styles/components/_konnector.scss
@@ -3,11 +3,11 @@
 .accordion {
   display: flex;
   flex-direction: column;
-  color: $text-color;
+  color: $white;
   padding: 1rem 0;
   margin-bottom: 2vh;
   border-radius: 4px;
-  background: linear-gradient(180deg, #323339 0%, #25262b 100%);
+  background: $grey-linear-gradient-background;
   box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);
   transition: background-color 0.6s ease;
   &.active {
@@ -31,7 +31,7 @@
     }
     .accordion-info {
       flex: 3;
-      color: $google-text-1;
+      color: $grey-bright;
       @media #{$large-phone} {
         display: block;
       }
@@ -48,7 +48,7 @@
     }
   }
   .accordion-update-result {
-    margin: 0.5rem 1.5rem;
+    margin: 1rem 0;
     @media #{$large-phone} {
       margin: 0.5rem 0;
     }
@@ -57,6 +57,12 @@
     flex: 2;
     padding: 0.5rem 1rem;
   }
+  .accordion-update-errored {
+    flex: 2;
+    padding: 0.5rem 1rem;
+    background-color: $red-primary;
+    display: flex;
+  }
   .accordion-state {
     flex: 2;
     margin-right: 1rem;
@@ -66,27 +72,31 @@
     padding: 0 1rem;
   }
   .accordion-caption {
-    color: $google-text-2;
+    color: $grey-bright;
     text-transform: lowercase;
     &::first-letter {
       text-transform: uppercase;
     }
   }
-  .accordion-caption-red {
-    color: $red-error;
-    text-transform: lowercase;
-    &::first-letter {
-      text-transform: uppercase;
-    }
+  .warning-white {
+    margin-right: 1rem;
   }
   .accordion-content {
     overflow: hidden;
     transition: max-height 0.6s ease;
+    .info-provider {
+      padding: 0;
+      color: $grey-bright;
+      margin-bottom: 0;
+    }
   }
   .inline-buttons {
     display: flex;
     flex-flow: row nowrap;
-    padding: 0 1rem;
+    padding: 0 2rem;
+    @media #{$large-phone} {
+      padding: 0 1rem;
+    }
   }
   .konnector-delete {
     margin-right: 0.25rem;
@@ -118,7 +128,7 @@
     .kv-header {
       margin-top: 2.5rem;
       margin-bottom: 1.25rem;
-      color: $google-text-1;
+      color: $grey-bright;
     }
   }
 }
@@ -130,7 +140,7 @@
     margin: 0;
   }
   .knotfound-text {
-    color: $text-bright;
+    color: $grey-bright;
     padding-top: 1rem;
   }
   .knotfound-button {
@@ -143,14 +153,14 @@
   margin: 0 1.5rem;
   padding: 0 1rem;
   .create-account {
-    color: $text-bright;
+    color: $grey-bright;
   }
   @media #{$large-phone} {
     margin: 0;
     padding: 0 1rem;
   }
   .koauthform-text {
-    color: $text-bright;
+    color: $grey-bright;
     padding-top: 1rem;
   }
   .koauthform-button {
@@ -161,10 +171,10 @@
 // KonnectorLoginForm
 .kloginauthform {
   .create-account {
-    color: $text-bright;
+    color: $grey-bright;
   }
   .kloginauthform-text {
-    color: $text-bright;
+    color: $grey-bright;
     padding-top: 1rem;
   }
   .kloginauthform-button {
@@ -179,11 +189,11 @@
     margin: 0.5rem 0;
   }
   .klaunch-content-text {
-    color: $text-bright;
+    color: $grey-bright;
     margin: 1rem;
     text-align: center;
     .kc-wait {
-      color: $text-dark;
+      color: $soft-grey;
       margin-bottom: 2rem;
     }
   }
diff --git a/src/styles/components/_legalnotice.scss b/src/styles/components/_legalnotice.scss
index 3e96c2b80ef6045c203dc2ccfaea7a8c552289da..7a121180ac5af6280e2a3b610e765b5ab6aa3842 100644
--- a/src/styles/components/_legalnotice.scss
+++ b/src/styles/components/_legalnotice.scss
@@ -7,24 +7,24 @@
   flex-direction: column;
   align-items: center;
   justify-content: center;
-  color: $text-white;
+  color: $white;
   padding: 1.5rem 1.5rem 0;
   .legal-notice-content {
     p {
-      color: $text-white;
+      color: $white;
     }
     a {
-      color: $text-white;
+      color: $white;
       text-decoration: none;
     }
     li {
       margin: 1rem 0;
     }
     h2 {
-      color: $text-white;
+      color: $white;
     }
     h3 {
-      color: $text-white;
+      color: $white;
       margin: 2.5rem 0 1rem;
     }
     .ln-contact {
diff --git a/src/styles/components/_modal.scss b/src/styles/components/_modal.scss
index 51ae463a9a03fb7aaf3b3ffd62e9def5b301a5fc..f8035c490632c64fcc1ec7b4701583cf1f704317 100644
--- a/src/styles/components/_modal.scss
+++ b/src/styles/components/_modal.scss
@@ -17,7 +17,7 @@
     display: flex;
   }
   .modal-box {
-    background: $grey-background;
+    background: $grey-linear-gradient-background;
     position: fixed;
     width: 36rem;
     max-width: 100%;
@@ -51,7 +51,7 @@
       display: flex;
       flex-direction: column;
       align-items: center;
-      color: $text-white;
+      color: $white;
     }
     .wm-header {
       background: $multi-color-radial-gradient;
diff --git a/src/styles/components/_nav.scss b/src/styles/components/_nav.scss
index 1c3d2dc6fe710934dffffb019f8912fab3a3042c..3804811754c71a16b78eebe7b56e1e4d8183f981 100644
--- a/src/styles/components/_nav.scss
+++ b/src/styles/components/_nav.scss
@@ -2,21 +2,12 @@
 @import '../base/breakpoint';
 
 .o-sidebar {
-  background-color: $primary-color;
+  background-color: $dark-light;
   box-shadow: 0px 5px 5px rgba(0, 0, 0, 0.2), 0px 3px 14px rgba(0, 0, 0, 0.12),
     0px 8px 10px rgba(0, 0, 0, 0.14);
   border-top: unset;
   border-right: unset;
-  // justify-content: flex-end;
   z-index: 19;
-  // position: fixed;
-  // bottom: 0;
-  // left: 0;
-  // display: block;
-  // width: 100%;
-  @media #{$tablet} {
-    background-color: $primary-color;
-  }
   .logo-grand-lyon {
     position: absolute;
     bottom: 20px;
@@ -28,6 +19,7 @@
 }
 .c-nav-link {
   padding: 0 1rem;
+  font-size: 0.9rem;
   .on {
     display: none;
   }
@@ -36,22 +28,20 @@
   }
 }
 
-// .c-nav {
-//   display: flex;
-//   list-style: none;
-//   justify-content: space-around;
-// }
+@media #{$tablet} {
+  .c-nav-item {
+    height: 54px;
+    margin: -0.3rem 0 0 0;
+  }
+}
+
 .c-nav-link .c-nav-icon {
   padding-right: 0.5rem;
-  width: 50px;
+  width: 60px;
   height: 36px;
   fill: none;
 }
 
-.c-nav-link.is-active {
-  box-shadow: inset 0.25rem 0 0 0 $gold;
-}
-
 .c-nav-link.is-active .c-nav-icon {
   fill: $gold !important;
 }
diff --git a/src/styles/components/_oldDataModal.scss b/src/styles/components/_oldDataModal.scss
new file mode 100644
index 0000000000000000000000000000000000000000..9902b3804c3ffccf38e724e1d3a1354746a4f1e8
--- /dev/null
+++ b/src/styles/components/_oldDataModal.scss
@@ -0,0 +1,35 @@
+.od-content {
+  padding: 1.5rem;
+  p {
+    color: $grey-bright;
+  }
+  .od-warning {
+    text-align: center;
+    color: $grey-bright;
+
+    p {
+      margin: 1.125rem 0 2rem 0;
+      color: $red-primary;
+    }
+  }
+  .od-main {
+    color: $grey-bright;
+  }
+  .od-konnectorsList {
+    color: $gold-shadow;
+  }
+  .verifyState {
+    .buttons {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      margin-top: 3rem;
+      & > button:nth-child(1) {
+        margin: 0 0.2rem 0 0;
+      }
+      & > button:nth-child(2) {
+        margin: 0 0 0 0.2rem;
+      }
+    }
+  }
+}
diff --git a/src/styles/components/_report.scss b/src/styles/components/_report.scss
new file mode 100644
index 0000000000000000000000000000000000000000..92c73a523c0921edcacabc5dd6146ced58f5aad1
--- /dev/null
+++ b/src/styles/components/_report.scss
@@ -0,0 +1,61 @@
+.report-root {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 0 1.5rem;
+  .report-content {
+    width: 45.75rem;
+    @media #{$large-phone} {
+      width: 100%;
+    }
+  }
+  .head {
+    margin-top: 2rem;
+    color: $grey-bright;
+  }
+  .radios {
+    margin-top: 0.5rem;
+    .input {
+      padding: 0.5rem;
+      input[type='radio'] {
+        box-sizing: border-box;
+        -webkit-appearance: none;
+        outline: none;
+        border-radius: 50%;
+        position: relative;
+        top: 0.3rem;
+        width: 1.3rem;
+        height: 1.3rem;
+        border: 2px solid $soft-grey;
+        background: transparent;
+        &:after {
+          transition: all 300ms ease;
+          content: '';
+          border-radius: 50%;
+        }
+        &:checked {
+          & ~ label {
+            color: $grey-bright;
+          }
+          &:after {
+            content: '';
+            position: absolute;
+            top: -2px;
+            left: -2px;
+            box-sizing: border-box;
+            width: inherit;
+            height: inherit;
+            background-color: transparent;
+            border-radius: 50%;
+            border: 6px solid $gold-shadow;
+          }
+        }
+      }
+    }
+    label {
+      color: $soft-grey;
+      margin-left: 1rem;
+    }
+  }
+}
diff --git a/src/styles/components/_splash.scss b/src/styles/components/_splash.scss
index 3d39ec91a5ad1a8c8e66946c5a2755670dd40be7..a8a5edb2709751254bc1c7773b9b033919e6ee45 100644
--- a/src/styles/components/_splash.scss
+++ b/src/styles/components/_splash.scss
@@ -1,23 +1,31 @@
 @import '../base/color';
 @import '../base/breakpoint';
 
-.splash-root{
+.splash-root {
   position: fixed;
-  z-index: 1000;
+  z-index: 1500;
   left: 0;
   top: 0;
   height: 100vh;
   width: 100vw;
+  opacity: 1;
   overflow: hidden;
   background-color: rgba(27, 28, 34, 1);
   display: flex;
   flex-direction: column;
-  .splash-header{
+  transition-property: opacity;
+  transition-timing-function: ease-in-out;
+  &.splash-fade {
+    opacity: 0;
+  }
+}
+
+.splash-header {
     height: 6rem;
     display: flex;
     align-items: center;
     justify-content: center;
-    color: var(--textBright);
+    color: var(--greyBright);
   }
   .splash-content {
     display: flex;
@@ -27,20 +35,19 @@
     flex: 1;
     margin-top: 6rem;
   }
-  .splash-footer{
+  .splash-footer {
     display: flex;
     flex-direction: column;
     align-items: center;
     justify-content: flex-start;
     height: 10rem;
     margin: 0 2rem;
-    .splash-footer-error-text{
+    .splash-footer-error-text {
       text-align: center;
       color: red;
       margin: 0.5rem 0;
     }
-    .splash-footer-button{
+    .splash-footer-button {
       max-width: 50vw;
     }
-  }
-}
\ No newline at end of file
+  }
\ No newline at end of file
diff --git a/src/styles/components/_version.scss b/src/styles/components/_version.scss
index 96fdef327a142a6889cf828d11cba9e04474a857..fd16553d2034796ba22b7b3425b9d39c21da7b09 100644
--- a/src/styles/components/_version.scss
+++ b/src/styles/components/_version.scss
@@ -2,7 +2,7 @@
 @import '../base/breakpoint';
 
 .version-root {
-  color: $text-bright;
+  color: $grey-bright;
   text-align: end;
   margin: 1rem 1.5rem 2rem;
 }
diff --git a/src/styles/index.css b/src/styles/index.css
index 64441c8f78e7b9f80fa6f256d88eaee850561053..6d3542cbd6ad7a977b6296694468277ef4f6c85d 100644
--- a/src/styles/index.css
+++ b/src/styles/index.css
@@ -1,19 +1,19 @@
 /* Cozy UI utilities classes */
 @import url(~cozy-ui/dist/cozy-ui.min.css);
 /* Cozy UI React components styles */
-@import url(~cozy-ui/react/stylesheet.css);
+@import url(~cozy-ui/transpiled/react/stylesheet.css);
 /* App styles */
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
+@import url("https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap");
 /* line 4, src/styles/base/_layout.scss */
 html {
   background: #1b1c22; }
@@ -42,11 +42,11 @@ body {
 
 /* line 30, src/styles/base/_layout.scss */
 [role='banner'] .coz-bar-container {
-  background-color: white; }
+  background-color: #ffffff; }
   @media only screen and (max-width: 768px) {
     /* line 30, src/styles/base/_layout.scss */
     [role='banner'] .coz-bar-container {
-      padding: 0 3.25em 0 0;
+      padding: 0 0 0 0;
       background-color: unset; } }
 
 /* line 38, src/styles/base/_layout.scss */
@@ -84,15 +84,9 @@ body {
       color: #e0e0e0; }
   /* line 73, src/styles/base/_layout.scss */
   .header .header-content {
-    margin: 0 0 0 220px; }
-    /* line 75, src/styles/base/_layout.scss */
-    .header .header-content .header-text {
-      padding: 2rem 1rem; }
-    /* line 78, src/styles/base/_layout.scss */
-    .header .header-content .header-text-desktop {
-      display: block;
-      padding: 2rem 1.25rem;
-      color: #e0e0e0; }
+    margin: 0 0 0 220px;
+    display: flex;
+    flex-direction: column; }
     @media only screen and (max-width: 1023px) {
       /* line 73, src/styles/base/_layout.scss */
       .header .header-content {
@@ -100,24 +94,48 @@ body {
     @media only screen and (max-width: 768px) {
       /* line 73, src/styles/base/_layout.scss */
       .header .header-content {
-        margin: 60px 0 0 0; }
-        /* line 88, src/styles/base/_layout.scss */
-        .header .header-content .header-text {
+        margin: 60px 0 0 0; } }
+    /* line 83, src/styles/base/_layout.scss */
+    .header .header-content .header-content-top {
+      display: flex;
+      flex-direction: row; }
+      /* line 86, src/styles/base/_layout.scss */
+      .header .header-content .header-content-top.header-content-top-right {
+        justify-content: flex-end; }
+      /* line 89, src/styles/base/_layout.scss */
+      .header .header-content .header-content-top .header-text {
+        padding: 2rem 1rem;
+        flex: 1; }
+      /* line 93, src/styles/base/_layout.scss */
+      .header .header-content .header-content-top .header-text-desktop {
+        display: flex;
+        flex: 1;
+        padding: 2rem 1.25rem;
+        color: #e0e0e0; }
+      /* line 99, src/styles/base/_layout.scss */
+      .header .header-content .header-content-top .header-back-button {
+        padding: 0 0.75rem; }
+      @media only screen and (max-width: 768px) {
+        /* line 103, src/styles/base/_layout.scss */
+        .header .header-content .header-content-top .header-text {
           padding: 0 1rem 1rem 1rem;
           color: #e0e0e0; }
-        /* line 92, src/styles/base/_layout.scss */
-        .header .header-content .header-text-desktop {
+        /* line 107, src/styles/base/_layout.scss */
+        .header .header-content .header-content-top .header-text-desktop {
+          display: none; }
+        /* line 110, src/styles/base/_layout.scss */
+        .header .header-content .header-content-top .header-feedbacks-button {
           display: none; } }
 
-/* line 99, src/styles/base/_layout.scss */
+/* line 118, src/styles/base/_layout.scss */
 .content-view {
   margin-top: 116px; }
   @media only screen and (max-width: 768px) {
-    /* line 99, src/styles/base/_layout.scss */
+    /* line 118, src/styles/base/_layout.scss */
     .content-view {
       margin-top: 0; } }
 
-/* line 106, src/styles/base/_layout.scss */
+/* line 125, src/styles/base/_layout.scss */
 .content-view-loading {
   height: 80vh;
   width: 100%;
@@ -126,53 +144,51 @@ body {
   justify-content: center;
   align-items: center;
   color: #e0e0e0; }
-  /* line 114, src/styles/base/_layout.scss */
+  /* line 133, src/styles/base/_layout.scss */
   .content-view-loading .content-view-loading-text {
     padding-top: 1rem;
     margin: 0 2rem;
     text-align: center; }
-  /* line 119, src/styles/base/_layout.scss */
+  /* line 138, src/styles/base/_layout.scss */
   .content-view-loading .content-view-loading-button {
     max-width: 50vw;
     margin-top: 1rem; }
 
-/* line 125, src/styles/base/_layout.scss */
+/* line 144, src/styles/base/_layout.scss */
 [role='main'] {
   /* width */
   /* Track */
   /* Handle */ }
-  /* line 127, src/styles/base/_layout.scss */
+  /* line 146, src/styles/base/_layout.scss */
   [role='main']::-webkit-scrollbar {
     width: 10px; }
-  /* line 131, src/styles/base/_layout.scss */
+  /* line 150, src/styles/base/_layout.scss */
   [role='main']::-webkit-scrollbar-track {
     background: #3e4045; }
-  /* line 135, src/styles/base/_layout.scss */
+  /* line 154, src/styles/base/_layout.scss */
   [role='main']::-webkit-scrollbar-thumb {
     background: #6f7074; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 6, src/styles/base/_typography.scss */
 * {
   font-family: Lato, sans-serif; }
@@ -210,18 +226,22 @@ p {
   text-shadow: 0px -1px 0px #060609, 0px 1px 0px rgba(255, 255, 255, 0.07); }
 
 /* line 43, src/styles/base/_typography.scss */
-.red {
-  color: #D25959; }
-
-/* line 46, src/styles/base/_typography.scss */
-.blue {
-  color: #81abd0; }
+.text-10-normal {
+  font-family: Lato, sans-serif;
+  font-style: normal;
+  font-weight: normal;
+  font-size: 0.625rem;
+  line-height: 120%; }
 
-/* line 49, src/styles/base/_typography.scss */
-.green {
-  color: #7fd771; }
+/* line 50, src/styles/base/_typography.scss */
+.text-10-bold {
+  font-family: Lato, sans-serif;
+  font-style: normal;
+  font-weight: bold;
+  font-size: 0.625rem;
+  line-height: 120%; }
 
-/* line 53, src/styles/base/_typography.scss */
+/* line 57, src/styles/base/_typography.scss */
 .text-14-normal {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -229,7 +249,7 @@ p {
   font-size: 0.875rem;
   line-height: 120%; }
 
-/* line 60, src/styles/base/_typography.scss */
+/* line 64, src/styles/base/_typography.scss */
 .text-14-normal-uppercase {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -238,7 +258,7 @@ p {
   line-height: 120%;
   text-transform: uppercase; }
 
-/* line 68, src/styles/base/_typography.scss */
+/* line 72, src/styles/base/_typography.scss */
 .text-15-normal {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -246,7 +266,7 @@ p {
   font-size: 0.938rem;
   line-height: 120%; }
 
-/* line 75, src/styles/base/_typography.scss */
+/* line 79, src/styles/base/_typography.scss */
 .text-16-normal {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -254,7 +274,7 @@ p {
   font-size: 1rem;
   line-height: 120%; }
 
-/* line 82, src/styles/base/_typography.scss */
+/* line 86, src/styles/base/_typography.scss */
 .text-16-normal-150 {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -262,7 +282,7 @@ p {
   font-size: 1rem;
   line-height: 150%; }
 
-/* line 89, src/styles/base/_typography.scss */
+/* line 93, src/styles/base/_typography.scss */
 .text-16-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -270,15 +290,15 @@ p {
   font-size: 1rem;
   line-height: 120%; }
 
-/* line 96, src/styles/base/_typography.scss */
-.text-18-medium {
+/* line 100, src/styles/base/_typography.scss */
+.text-18-normal {
   font-family: Lato, sans-serif;
   font-style: normal;
   font-weight: 500;
   font-size: 1.125rem;
   line-height: 120%; }
 
-/* line 103, src/styles/base/_typography.scss */
+/* line 107, src/styles/base/_typography.scss */
 .text-18-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -286,7 +306,7 @@ p {
   font-size: 1.125rem;
   line-height: 120%; }
 
-/* line 110, src/styles/base/_typography.scss */
+/* line 114, src/styles/base/_typography.scss */
 .text-19-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -294,7 +314,7 @@ p {
   font-size: 1.188rem;
   line-height: 120%; }
 
-/* line 117, src/styles/base/_typography.scss */
+/* line 121, src/styles/base/_typography.scss */
 .text-20-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -302,7 +322,7 @@ p {
   font-size: 1.25rem;
   line-height: 120%; }
 
-/* line 124, src/styles/base/_typography.scss */
+/* line 128, src/styles/base/_typography.scss */
 .text-21-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -310,7 +330,7 @@ p {
   font-size: 1.313rem;
   line-height: 120%; }
 
-/* line 131, src/styles/base/_typography.scss */
+/* line 135, src/styles/base/_typography.scss */
 .text-22-normal {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -318,7 +338,7 @@ p {
   font-size: 1.375rem;
   line-height: 120%; }
 
-/* line 138, src/styles/base/_typography.scss */
+/* line 142, src/styles/base/_typography.scss */
 .text-22-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -326,7 +346,7 @@ p {
   font-size: 1.375rem;
   line-height: 120%; }
 
-/* line 145, src/styles/base/_typography.scss */
+/* line 149, src/styles/base/_typography.scss */
 .text-24-normal {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -334,7 +354,7 @@ p {
   font-size: 1.5rem;
   line-height: 120%; }
 
-/* line 152, src/styles/base/_typography.scss */
+/* line 156, src/styles/base/_typography.scss */
 .text-24-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -343,7 +363,7 @@ p {
   line-height: 120%; }
 
 /* Button */
-/* line 162, src/styles/base/_typography.scss */
+/* line 166, src/styles/base/_typography.scss */
 .button-primary-text span {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -352,7 +372,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 171, src/styles/base/_typography.scss */
+/* line 175, src/styles/base/_typography.scss */
 .button-secondary-text {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -362,7 +382,7 @@ p {
   color: #e0e0e0; }
 
 /* Card */
-/* line 181, src/styles/base/_typography.scss */
+/* line 185, src/styles/base/_typography.scss */
 .card-title-on {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -371,7 +391,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 189, src/styles/base/_typography.scss */
+/* line 193, src/styles/base/_typography.scss */
 .card-title-off {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -380,7 +400,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 197, src/styles/base/_typography.scss */
+/* line 201, src/styles/base/_typography.scss */
 .card-text-bold {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -389,7 +409,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 205, src/styles/base/_typography.scss */
+/* line 209, src/styles/base/_typography.scss */
 .card-result {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -398,7 +418,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 213, src/styles/base/_typography.scss */
+/* line 217, src/styles/base/_typography.scss */
 .card-indicator {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -407,7 +427,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 221, src/styles/base/_typography.scss */
+/* line 225, src/styles/base/_typography.scss */
 .card-text {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -417,7 +437,7 @@ p {
   color: #e0e0e0; }
 
 /* Chart */
-/* line 231, src/styles/base/_typography.scss */
+/* line 235, src/styles/base/_typography.scss */
 .chart-date {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -426,7 +446,7 @@ p {
   line-height: 123%;
   color: #e0e0e0; }
 
-/* line 239, src/styles/base/_typography.scss */
+/* line 243, src/styles/base/_typography.scss */
 .chart-result {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -435,7 +455,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 247, src/styles/base/_typography.scss */
+/* line 251, src/styles/base/_typography.scss */
 .chart-fluid {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -444,7 +464,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 255, src/styles/base/_typography.scss */
+/* line 259, src/styles/base/_typography.scss */
 .chart-switch-text {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -453,7 +473,7 @@ p {
   line-height: 120%;
   color: #e0e0e0; }
 
-/* line 263, src/styles/base/_typography.scss */
+/* line 267, src/styles/base/_typography.scss */
 .chart-ticks-x-text {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -461,11 +481,11 @@ p {
   font-size: 1rem;
   line-height: 120%; }
   @media only screen and (max-width: 768px) {
-    /* line 263, src/styles/base/_typography.scss */
+    /* line 267, src/styles/base/_typography.scss */
     .chart-ticks-x-text {
       font-size: 0.875rem; } }
 
-/* line 273, src/styles/base/_typography.scss */
+/* line 277, src/styles/base/_typography.scss */
 .chart-ticks-y-text {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -473,12 +493,12 @@ p {
   font-size: 0.9rem;
   line-height: 120%; }
   @media only screen and (max-width: 768px) {
-    /* line 273, src/styles/base/_typography.scss */
+    /* line 277, src/styles/base/_typography.scss */
     .chart-ticks-y-text {
       font-size: 0.75rem; } }
 
 /* Cozy bar */
-/* line 285, src/styles/base/_typography.scss */
+/* line 289, src/styles/base/_typography.scss */
 .cozybar {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -488,7 +508,7 @@ p {
   color: #e0e0e0; }
 
 /* List */
-/* line 295, src/styles/base/_typography.scss */
+/* line 299, src/styles/base/_typography.scss */
 .list-title {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -499,7 +519,7 @@ p {
   color: #e0e0e0; }
 
 /* Tab */
-/* line 306, src/styles/base/_typography.scss */
+/* line 310, src/styles/base/_typography.scss */
 .tab-text-on {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -507,7 +527,7 @@ p {
   font-size: 1rem;
   line-height: 120%; }
 
-/* line 313, src/styles/base/_typography.scss */
+/* line 317, src/styles/base/_typography.scss */
 .tab-text-off {
   font-family: Lato, sans-serif;
   font-style: normal;
@@ -517,16 +537,15 @@ p {
   color: #e0e0e0; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 5, src/styles/components/_card.scss */
 .redirect-card-link {
   color: transparent; }
@@ -535,98 +554,23 @@ p {
 .redirect-card-content {
   margin: 0.25rem 0; }
 
-/* line 14, src/styles/components/_card.scss */
-.card {
-  /* linear card */
-  background: linear-gradient(180deg, #323339 0%, #25262b 100%);
-  background-color: #25262b;
-  display: flex;
-  flex-direction: column;
-  color: white;
-  padding: 1rem 1.5rem;
-  margin: 2vh 2vw 2vh 0vw;
-  box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75); }
-  @media only screen and (max-width: 768px) {
-    /* line 14, src/styles/components/_card.scss */
-    .card {
-      margin: 2vh 0; } }
-  /* line 27, src/styles/components/_card.scss */
-  .card.orange {
-    border: 1px solid rgba(216, 123, 57, 0.4); }
-  /* line 30, src/styles/components/_card.scss */
-  .card.blue {
-    border: 1px solid rgba(58, 152, 236, 0.4); }
-  /* line 33, src/styles/components/_card.scss */
-  .card.green {
-    border: 1px solid rgba(69, 209, 184, 0.4); }
-  /* line 36, src/styles/components/_card.scss */
-  .card .title {
-    font-size: 1.5rem;
-    font-style: normal;
-    font-weight: normal;
-    color: #e0e0e0;
-    line-height: 120%; }
-  /* line 43, src/styles/components/_card.scss */
-  .card h1 {
-    font-size: 1rem;
-    font-style: normal;
-    font-weight: normal;
-    line-height: 120%;
-    color: white; }
-  /* line 50, src/styles/components/_card.scss */
-  .card p {
-    font-style: normal;
-    font-weight: normal;
-    font-size: 1rem;
-    line-height: 120%; }
-  /* line 56, src/styles/components/_card.scss */
-  .card .card-header {
-    flex-direction: row;
-    display: flex;
-    justify-content: left;
-    padding: 0.75rem 0rem; }
-    /* line 61, src/styles/components/_card.scss */
-    .card .card-header div:first-of-type {
-      margin-left: 3.5vw; }
-    /* line 64, src/styles/components/_card.scss */
-    .card .card-header h2 {
-      margin: 0;
-      color: #e0e0e0;
-      font-style: normal;
-      font-weight: normal;
-      font-size: 2rem;
-      line-height: 120%; }
-      /* line 71, src/styles/components/_card.scss */
-      .card .card-header h2 span {
-        color: #e0e0e0;
-        font-weight: 600;
-        font-size: 2.3rem; }
-    /* line 77, src/styles/components/_card.scss */
-    .card .card-header h3 {
-      margin: 0;
-      font-style: normal;
-      font-weight: bold;
-      font-size: 1rem;
-      line-height: 120%; }
-
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_form.scss */
 .form {
-  padding: 1vh 1.5vw; }
+  padding: 1rem; }
   @media only screen and (max-width: 768px) {
     /* line 4, src/styles/components/_form.scss */
     .form {
-      padding: 1vh 0; } }
+      padding: 1rem; } }
   /* line 9, src/styles/components/_form.scss */
   .form label {
     font-style: normal;
@@ -644,7 +588,7 @@ p {
     outline-offset: -1px; }
     /* line 23, src/styles/components/_form.scss */
     .form .form-input.--error {
-      border: 1px solid #D25959; }
+      border: 1px solid #d25959; }
   /* line 27, src/styles/components/_form.scss */
   .form .form-input:focus {
     outline: none;
@@ -669,7 +613,7 @@ p {
         max-width: 100vw; } }
   /* line 48, src/styles/components/_form.scss */
   .form .form-message {
-    color: #ce3535;
+    color: #d25959;
     min-height: 1.25rem;
     margin-top: 0.75rem; }
   /* line 53, src/styles/components/_form.scss */
@@ -680,170 +624,36 @@ p {
     color: #e0e0e0; }
 
 /** BLACK **/
-/** TEXT COLOR **/
-/** RED **/
-/** YELLOW **/
-/** ORANGE **/
-/** BLUE **/
-/** GREEN **/
-/** WHITE **/
-/** GREY **/
-/** App colors **/
-/** TABS GRADIENT **/
-/* line 6, src/styles/components/_button.scss */
-.btn-primary {
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  background-color: #b2901b;
-  border: 1px solid rgba(227, 184, 42, 0.2);
-  box-shadow: 0px 2px 6px #1E1C1C;
-  border-radius: 2px;
-  margin: 1rem 0 1rem 0;
-  color: black;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  text-transform: capitalize; }
-  /* line 23, src/styles/components/_button.scss */
-  .btn-primary:hover {
-    cursor: pointer;
-    background-color: #deaf0e;
-    color: #242633; }
-  /* line 28, src/styles/components/_button.scss */
-  .btn-primary:active {
-    position: relative;
-    top: 1px;
-    background-color: #c59f1c; }
-  /* line 34, src/styles/components/_button.scss */
-  .btn-primary:focus {
-    cursor: pointer;
-    outline: none; }
-
-/* line 41, src/styles/components/_button.scss */
-.btn-secondary {
-  background-color: #deaf0e;
-  color: black;
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  margin: 1rem 0 1rem 0;
-  text-transform: capitalize;
-  border: 1px solid rgba(227, 184, 42, 0.2);
-  box-shadow: -2px -2px 6px rgba(227, 184, 42, 0.2), 2px 2px 6px #1E1C1C;
-  border-radius: 6px;
-  font-style: normal;
-  font-weight: 600;
-  font-size: 16px;
-  line-height: 120%; }
-
-/* line 60, src/styles/components/_button.scss */
-.btn-secondary-negative {
-  border: 1px solid #deaf0e;
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  margin: 1rem 0 1rem 0;
-  text-transform: capitalize;
-  box-shadow: -2px -2px 6px rgba(227, 184, 42, 0.2), 2px 2px 6px #1E1C1C;
-  border-radius: 6px;
-  font-style: normal;
-  font-weight: normal;
-  font-size: 16px;
-  line-height: 120%;
-  color: #E0E0E0; }
-
-/* line 78, src/styles/components/_button.scss */
-.btn-chevron {
-  margin: 1rem 1rem 1rem 0;
-  color: white;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%; }
-  /* line 88, src/styles/components/_button.scss */
-  .btn-chevron:hover {
-    cursor: pointer;
-    color: white; }
-
-/* line 94, src/styles/components/_button.scss */
-.btn-long-string {
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  border: 1px solid #121212;
-  box-sizing: border-box;
-  border-radius: 2px;
-  color: white;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  margin: 1rem 0 1rem 0; }
-
-/*
-.btn {
-  height: 3rem;
-  padding: 0.5vh 2vw 0.5vh 2vw;
-  background-color: $gold;
-  border: none;
-  margin: 1rem 0 1rem 0;
-  color: $text-black;
-  font-size: 1rem;
-  font-style: normal;
-  font-weight: 600;
-  line-height: 120%;
-  text-transform: capitalize;
-  &.active{
-    opacity: 0.3;
-  }
-  &:hover {
-    cursor: pointer;
-    background-color: $gold-light;
-    color: $dark;
-  }
-  &:active {
-    position:relative;
-    top:1px;
-    background-color: #c59f1c;
-  }
-  .btn-content{
-    display: inline-flex;
-    align-items: center;
-    .btn-icon{
-      margin-right: 1.5vw;
-    }
-  }
-}
-*/
-/** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
-/* line 4, src/styles/components/_konnector.scss */
+/** SCROLLBAR **/
+/* line 3, src/styles/components/_konnector.scss */
 .accordion {
   display: flex;
   flex-direction: column;
-  color: white;
-  padding: 1rem 1rem;
+  color: #ffffff;
+  padding: 1rem 0;
   margin-bottom: 2vh;
   border-radius: 4px;
   background: linear-gradient(180deg, #323339 0%, #25262b 100%);
   box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.75);
   transition: background-color 0.6s ease; }
-  /* line 14, src/styles/components/_konnector.scss */
+  /* line 13, src/styles/components/_konnector.scss */
   .accordion.active {
     background-color: #34353a; }
-  /* line 18, src/styles/components/_konnector.scss */
+  /* line 17, src/styles/components/_konnector.scss */
   .accordion .accordion-header {
     display: flex;
     align-items: center;
     border: none;
-    outline: none; }
+    outline: none;
+    padding: 0 1rem; }
     /* line 23, src/styles/components/_konnector.scss */
     .accordion .accordion-header:hover {
       cursor: pointer; }
@@ -871,7 +681,7 @@ p {
       display: flex; }
   /* line 50, src/styles/components/_konnector.scss */
   .accordion .accordion-update-result {
-    margin: 0.5rem 1.5rem; }
+    margin: 1rem 0; }
     @media only screen and (max-width: 768px) {
       /* line 50, src/styles/components/_konnector.scss */
       .accordion .accordion-update-result {
@@ -881,138 +691,165 @@ p {
     flex: 2;
     padding: 0.5rem 1rem; }
   /* line 60, src/styles/components/_konnector.scss */
+  .accordion .accordion-update-errored {
+    flex: 2;
+    padding: 0.5rem 1rem;
+    background-color: #d25959;
+    display: flex; }
+  /* line 66, src/styles/components/_konnector.scss */
   .accordion .accordion-state {
     flex: 2;
     margin-right: 1rem; }
-  /* line 64, src/styles/components/_konnector.scss */
+  /* line 70, src/styles/components/_konnector.scss */
   .accordion .accordion-frequency {
     flex: 1;
     padding: 0 1rem; }
-  /* line 68, src/styles/components/_konnector.scss */
+  /* line 74, src/styles/components/_konnector.scss */
   .accordion .accordion-caption {
-    color: #a0a0a0;
+    color: #e0e0e0;
     text-transform: lowercase; }
-    /* line 71, src/styles/components/_konnector.scss */
+    /* line 77, src/styles/components/_konnector.scss */
     .accordion .accordion-caption::first-letter {
       text-transform: uppercase; }
-  /* line 75, src/styles/components/_konnector.scss */
-  .accordion .accordion-caption-red {
-    color: #ce3535;
-    text-transform: lowercase; }
-    /* line 78, src/styles/components/_konnector.scss */
-    .accordion .accordion-caption-red::first-letter {
-      text-transform: uppercase; }
-  /* line 82, src/styles/components/_konnector.scss */
+  /* line 81, src/styles/components/_konnector.scss */
+  .accordion .warning-white {
+    margin-right: 1rem; }
+  /* line 84, src/styles/components/_konnector.scss */
   .accordion .accordion-content {
     overflow: hidden;
     transition: max-height 0.6s ease; }
-  /* line 86, src/styles/components/_konnector.scss */
+  /* line 88, src/styles/components/_konnector.scss */
   .accordion .inline-buttons {
     display: flex;
-    flex-flow: row nowrap; }
-  /* line 90, src/styles/components/_konnector.scss */
+    flex-flow: row nowrap;
+    padding: 0 2rem; }
+    @media only screen and (max-width: 768px) {
+      /* line 88, src/styles/components/_konnector.scss */
+      .accordion .inline-buttons {
+        padding: 0 1rem; } }
+  /* line 96, src/styles/components/_konnector.scss */
+  .accordion .konnector-delete {
+    margin-right: 0.25rem;
+    color: #d25959 !important; }
+  /* line 100, src/styles/components/_konnector.scss */
+  .accordion .konnector-update {
+    margin-left: 0.25rem; }
+  /* line 103, src/styles/components/_konnector.scss */
   .accordion .btn-position {
     width: 100%;
     margin: 0.5rem 1rem; }
 
-/* line 96, src/styles/components/_konnector.scss */
+/* line 108, src/styles/components/_konnector.scss */
+.--errored {
+  border: solid 1px #d25959; }
+
+/* line 112, src/styles/components/_konnector.scss */
 .kv-root {
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
   padding: 0 1.5rem; }
-  /* line 102, src/styles/components/_konnector.scss */
+  /* line 118, src/styles/components/_konnector.scss */
   .kv-root .kv-content {
     width: 45.75rem; }
     @media only screen and (max-width: 768px) {
-      /* line 102, src/styles/components/_konnector.scss */
+      /* line 118, src/styles/components/_konnector.scss */
       .kv-root .kv-content {
         width: 100%; } }
-    /* line 107, src/styles/components/_konnector.scss */
+    /* line 123, src/styles/components/_konnector.scss */
     .kv-root .kv-content .kv-header {
       margin-top: 2.5rem;
       margin-bottom: 1.25rem;
       color: #e0e0e0; }
 
-/* line 116, src/styles/components/_konnector.scss */
+/* line 132, src/styles/components/_konnector.scss */
 .knotfound {
   margin: 0 1.5rem; }
   @media only screen and (max-width: 768px) {
-    /* line 116, src/styles/components/_konnector.scss */
+    /* line 132, src/styles/components/_konnector.scss */
     .knotfound {
       margin: 0; } }
-  /* line 121, src/styles/components/_konnector.scss */
+  /* line 137, src/styles/components/_konnector.scss */
   .knotfound .knotfound-text {
     color: #e0e0e0;
     padding-top: 1rem; }
-  /* line 125, src/styles/components/_konnector.scss */
+  /* line 141, src/styles/components/_konnector.scss */
   .knotfound .knotfound-button {
     margin-bottom: 1rem; }
 
-/* line 131, src/styles/components/_konnector.scss */
+/* line 147, src/styles/components/_konnector.scss */
 .koauthform {
-  margin: 0 1.5rem; }
+  margin: 0 1.5rem;
+  padding: 0 1rem; }
+  /* line 150, src/styles/components/_konnector.scss */
+  .koauthform .create-account {
+    color: #e0e0e0; }
   @media only screen and (max-width: 768px) {
-    /* line 131, src/styles/components/_konnector.scss */
+    /* line 147, src/styles/components/_konnector.scss */
     .koauthform {
-      margin: 0; } }
-  /* line 136, src/styles/components/_konnector.scss */
+      margin: 0;
+      padding: 0 1rem; } }
+  /* line 157, src/styles/components/_konnector.scss */
   .koauthform .koauthform-text {
     color: #e0e0e0;
     padding-top: 1rem; }
-  /* line 140, src/styles/components/_konnector.scss */
+  /* line 161, src/styles/components/_konnector.scss */
   .koauthform .koauthform-button {
     margin-bottom: 1rem; }
 
-/* line 147, src/styles/components/_konnector.scss */
+/* line 168, src/styles/components/_konnector.scss */
+.kloginauthform .create-account {
+  color: #e0e0e0; }
+
+/* line 171, src/styles/components/_konnector.scss */
 .kloginauthform .kloginauthform-text {
   color: #e0e0e0;
   padding-top: 1rem; }
 
-/* line 151, src/styles/components/_konnector.scss */
+/* line 175, src/styles/components/_konnector.scss */
 .kloginauthform .kloginauthform-button {
   margin-bottom: 1rem; }
 
-/* line 158, src/styles/components/_konnector.scss */
+/* line 181, src/styles/components/_konnector.scss */
 .klaunch-content {
   margin: 0.5rem 1.5rem; }
   @media only screen and (max-width: 768px) {
-    /* line 158, src/styles/components/_konnector.scss */
+    /* line 181, src/styles/components/_konnector.scss */
     .klaunch-content {
       margin: 0.5rem 0; } }
-  /* line 163, src/styles/components/_konnector.scss */
+  /* line 186, src/styles/components/_konnector.scss */
   .klaunch-content .klaunch-content-text {
     color: #e0e0e0;
     margin: 1rem;
     text-align: center; }
-    /* line 167, src/styles/components/_konnector.scss */
+    /* line 190, src/styles/components/_konnector.scss */
     .klaunch-content .klaunch-content-text .kc-wait {
       color: #a0a0a0;
       margin-bottom: 2rem; }
-  /* line 172, src/styles/components/_konnector.scss */
+  /* line 195, src/styles/components/_konnector.scss */
   .klaunch-content .klaunch-content-text-center {
     text-align: center; }
-  /* line 175, src/styles/components/_konnector.scss */
+  /* line 198, src/styles/components/_konnector.scss */
   .klaunch-content .klaunch-info {
     margin: 1.5rem; }
-    /* line 177, src/styles/components/_konnector.scss */
+    /* line 200, src/styles/components/_konnector.scss */
     .klaunch-content .klaunch-info .konnector-config {
       display: flex;
       flex-direction: column;
       justify-content: center;
       align-items: center;
       text-align: center; }
-      /* line 183, src/styles/components/_konnector.scss */
+      /* line 206, src/styles/components/_konnector.scss */
       .klaunch-content .klaunch-info .konnector-config .kce-picto-txt {
-        color: #D25959;
+        color: #d25959;
         margin: 1.25rem; }
-      /* line 187, src/styles/components/_konnector.scss */
+      /* line 210, src/styles/components/_konnector.scss */
       .klaunch-content .klaunch-info .konnector-config .kcs-picto-txt {
         color: #e3b82a;
         margin: 1.25rem; }
 
-/* line 195, src/styles/components/_konnector.scss */
+/* line 218, src/styles/components/_konnector.scss */
 .state-icon {
   height: 22px;
   width: 22px;
@@ -1021,16 +858,15 @@ p {
   left: 30px; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 5, src/styles/components/_fluid.scss */
 .sf {
   display: flex;
@@ -1141,21 +977,28 @@ p {
 
 /* line 114, src/styles/components/_fluid.scss */
 .chart-indicator-none {
-  display: none; }
+  visibility: hidden;
+  height: 0; }
 
-/* line 117, src/styles/components/_fluid.scss */
+/* line 118, src/styles/components/_fluid.scss */
 .chart-indicator-block {
-  display: block; }
+  visibility: visible;
+  height: auto; }
 
-/* line 123, src/styles/components/_fluid.scss */
+/* line 124, src/styles/components/_fluid.scss */
 .fs-root {
   flex: 1;
   height: 22rem; }
   @media only screen and (max-width: 768px) {
-    /* line 123, src/styles/components/_fluid.scss */
+    /* line 124, src/styles/components/_fluid.scss */
     .fs-root {
       height: 14rem; } }
-  /* line 129, src/styles/components/_fluid.scss */
+  /* line 130, src/styles/components/_fluid.scss */
+  .fs-root .chart-loading {
+    width: 100%;
+    justify-content: center;
+    display: flex; }
+  /* line 135, src/styles/components/_fluid.scss */
   .fs-root .fs-slide {
     min-height: 22rem;
     overflow-x: hidden;
@@ -1163,11 +1006,18 @@ p {
     justify-content: center;
     align-items: center; }
     @media only screen and (max-width: 768px) {
-      /* line 129, src/styles/components/_fluid.scss */
+      /* line 135, src/styles/components/_fluid.scss */
       .fs-root .fs-slide {
         min-height: 14rem; } }
-
-/* line 142, src/styles/components/_fluid.scss */
+    /* line 144, src/styles/components/_fluid.scss */
+    .fs-root .fs-slide .chart-none {
+      visibility: hidden;
+      width: 0; }
+    /* line 148, src/styles/components/_fluid.scss */
+    .fs-root .fs-slide .chart-block {
+      visibility: visible; }
+
+/* line 155, src/styles/components/_fluid.scss */
 .cta-box {
   background-color: rgba(18, 18, 18, 0.8);
   position: absolute;
@@ -1181,15 +1031,15 @@ p {
   flex-direction: column;
   height: 37.5rem; }
   @media only screen and (max-width: 768px) {
-    /* line 142, src/styles/components/_fluid.scss */
+    /* line 155, src/styles/components/_fluid.scss */
     .cta-box {
       height: 29rem;
       width: 100vw; } }
   @media only screen and (max-width: 1023px) {
-    /* line 142, src/styles/components/_fluid.scss */
+    /* line 155, src/styles/components/_fluid.scss */
     .cta-box {
       width: 100vw; } }
-  /* line 162, src/styles/components/_fluid.scss */
+  /* line 175, src/styles/components/_fluid.scss */
   .cta-box .cta-box-header {
     text-align: center;
     font-weight: bold;
@@ -1198,30 +1048,29 @@ p {
     color: #e0e0e0;
     width: 50%; }
     @media only screen and (max-width: 768px) {
-      /* line 162, src/styles/components/_fluid.scss */
+      /* line 175, src/styles/components/_fluid.scss */
       .cta-box .cta-box-header {
         width: 80%; } }
-  /* line 173, src/styles/components/_fluid.scss */
+  /* line 186, src/styles/components/_fluid.scss */
   .cta-box .cta-box-button {
     margin-left: auto;
     margin-right: auto;
     width: 50%; }
     @media only screen and (max-width: 768px) {
-      /* line 173, src/styles/components/_fluid.scss */
+      /* line 186, src/styles/components/_fluid.scss */
       .cta-box .cta-box-button {
         width: 80%; } }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_navigator.scss */
 .cn {
   display: flex;
@@ -1239,16 +1088,15 @@ p {
       outline: none !important; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_consumptionvisualizer.scss */
 .cv {
   display: flex;
@@ -1265,115 +1113,112 @@ p {
     flex-direction: row;
     justify-content: space-around;
     width: 100%; }
-    /* line 18, src/styles/components/_consumptionvisualizer.scss */
+    /* line 17, src/styles/components/_consumptionvisualizer.scss */
     .cv .cv-content-date .cv-date-group {
       display: flex;
       flex-direction: column;
       width: 38vw;
       align-items: center;
       align-self: center; }
-      /* line 24, src/styles/components/_consumptionvisualizer.scss */
+      /* line 23, src/styles/components/_consumptionvisualizer.scss */
       .cv .cv-content-date .cv-date-group .cv-date {
         color: #e0e0e0; }
-        /* line 26, src/styles/components/_consumptionvisualizer.scss */
+        /* line 25, src/styles/components/_consumptionvisualizer.scss */
         .cv .cv-content-date .cv-date-group .cv-date::first-letter {
           text-transform: uppercase; }
-  /* line 32, src/styles/components/_consumptionvisualizer.scss */
+  /* line 31, src/styles/components/_consumptionvisualizer.scss */
   .cv .cv-load {
     min-height: 5.25rem;
     display: flex;
     align-items: center; }
-    /* line 36, src/styles/components/_consumptionvisualizer.scss */
+    /* line 35, src/styles/components/_consumptionvisualizer.scss */
     .cv .cv-load .cv-load-content {
       display: flex;
       flex-direction: row;
       align-items: center; }
-      /* line 40, src/styles/components/_consumptionvisualizer.scss */
+      /* line 39, src/styles/components/_consumptionvisualizer.scss */
       .cv .cv-load .cv-load-content .cv-load-section {
         display: flex;
         flex-direction: column;
         align-items: center;
         padding: 0.5rem 0.5rem; }
-        /* line 45, src/styles/components/_consumptionvisualizer.scss */
+        /* line 44, src/styles/components/_consumptionvisualizer.scss */
         .cv .cv-load .cv-load-content .cv-load-section.cv-load-section-left {
           align-items: flex-end; }
-        /* line 48, src/styles/components/_consumptionvisualizer.scss */
+        /* line 47, src/styles/components/_consumptionvisualizer.scss */
         .cv .cv-load .cv-load-content .cv-load-section.cv-load-section-right {
           align-items: flex-start; }
-        /* line 51, src/styles/components/_consumptionvisualizer.scss */
+        /* line 50, src/styles/components/_consumptionvisualizer.scss */
         .cv .cv-load .cv-load-content .cv-load-section .cv-load-value {
           flex-direction: row; }
-          /* line 53, src/styles/components/_consumptionvisualizer.scss */
+          /* line 52, src/styles/components/_consumptionvisualizer.scss */
           .cv .cv-load .cv-load-content .cv-load-section .cv-load-value span {
             align-self: flex-end;
             margin-left: 0.5em; }
-  /* line 61, src/styles/components/_consumptionvisualizer.scss */
+  /* line 60, src/styles/components/_consumptionvisualizer.scss */
   .cv .cv-euro {
     display: flex;
     flex-direction: row; }
-    /* line 64, src/styles/components/_consumptionvisualizer.scss */
+    /* line 63, src/styles/components/_consumptionvisualizer.scss */
     .cv .cv-euro .cv-euro-link {
       text-decoration: none;
       color: transparent; }
-    /* line 68, src/styles/components/_consumptionvisualizer.scss */
+    /* line 67, src/styles/components/_consumptionvisualizer.scss */
     .cv .cv-euro .cv-euro-fluid {
       padding: 0 0.5rem;
       display: flex;
       align-items: center; }
-      /* line 72, src/styles/components/_consumptionvisualizer.scss */
+      /* line 71, src/styles/components/_consumptionvisualizer.scss */
       .cv .cv-euro .cv-euro-fluid .cv-euro-fluid-icon {
         margin-right: 0.5rem; }
-      /* line 75, src/styles/components/_consumptionvisualizer.scss */
+      /* line 74, src/styles/components/_consumptionvisualizer.scss */
       .cv .cv-euro .cv-euro-fluid div {
         padding-top: 0.2rem; }
-  /* line 80, src/styles/components/_consumptionvisualizer.scss */
+  /* line 79, src/styles/components/_consumptionvisualizer.scss */
   .cv .cv-info {
     min-height: 1.5rem;
     display: flex;
     align-items: center; }
-  /* line 85, src/styles/components/_consumptionvisualizer.scss */
+  /* line 84, src/styles/components/_consumptionvisualizer.scss */
   .cv .electricity {
     color: #d87b39; }
-  /* line 88, src/styles/components/_consumptionvisualizer.scss */
+  /* line 87, src/styles/components/_consumptionvisualizer.scss */
   .cv .electricity-compare {
     color: #e2bca1; }
-  /* line 91, src/styles/components/_consumptionvisualizer.scss */
+  /* line 90, src/styles/components/_consumptionvisualizer.scss */
   .cv .water {
     color: #3a98ec; }
-  /* line 94, src/styles/components/_consumptionvisualizer.scss */
+  /* line 93, src/styles/components/_consumptionvisualizer.scss */
   .cv .water-compare {
     color: #abd4fa; }
-  /* line 97, src/styles/components/_consumptionvisualizer.scss */
+  /* line 96, src/styles/components/_consumptionvisualizer.scss */
   .cv .gas {
     color: #45d1b8; }
-  /* line 100, src/styles/components/_consumptionvisualizer.scss */
+  /* line 99, src/styles/components/_consumptionvisualizer.scss */
   .cv .gas-compare {
     color: #a8f7e9; }
-  /* line 103, src/styles/components/_consumptionvisualizer.scss */
+  /* line 102, src/styles/components/_consumptionvisualizer.scss */
   .cv .multifluid {
     color: #ffffff; }
-  /* line 106, src/styles/components/_consumptionvisualizer.scss */
+  /* line 105, src/styles/components/_consumptionvisualizer.scss */
   .cv .multifluid-compare {
     color: #ffd597; }
-  /* line 109, src/styles/components/_consumptionvisualizer.scss */
+  /* line 108, src/styles/components/_consumptionvisualizer.scss */
   .cv .error {
-    color: #d24444; }
-  /* line 112, src/styles/components/_consumptionvisualizer.scss */
+    color: #d25959; }
+  /* line 111, src/styles/components/_consumptionvisualizer.scss */
   .cv .error-line {
-    color: #d24444;
+    color: #d25959;
     cursor: pointer;
     display: flex;
     align-items: center; }
-  /* line 118, src/styles/components/_consumptionvisualizer.scss */
+  /* line 117, src/styles/components/_consumptionvisualizer.scss */
   .cv .underlined-error {
-    border-bottom: solid 1px #d24444; }
-  /* line 121, src/styles/components/_consumptionvisualizer.scss */
+    border-bottom: solid 1px #d25959; }
+  /* line 120, src/styles/components/_consumptionvisualizer.scss */
   .cv .warning-icon {
     margin-right: 4px; }
-  /* line 124, src/styles/components/_consumptionvisualizer.scss */
-  .cv .multifluid-compare {
-    color: #ffd597; }
-  /* line 127, src/styles/components/_consumptionvisualizer.scss */
+  /* line 123, src/styles/components/_consumptionvisualizer.scss */
   .cv .cv-button {
     border: none;
     background: none;
@@ -1381,16 +1226,15 @@ p {
     text-decoration: underline; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_barchart.scss */
 .axis {
   color: #7b7b7b; }
@@ -1403,78 +1247,78 @@ p {
 
 /* line 13, src/styles/components/_barchart.scss */
 .background-true {
-  opacity: 1; }
+  opacity: 0.1; }
 
-/* line 17, src/styles/components/_barchart.scss */
+/* line 16, src/styles/components/_barchart.scss */
 .background-false {
   opacity: 0; }
 
-/* line 21, src/styles/components/_barchart.scss */
+/* line 19, src/styles/components/_barchart.scss */
 .bar-ELECTRICITY {
   fill: #5d3d2a; }
-  /* line 23, src/styles/components/_barchart.scss */
+  /* line 21, src/styles/components/_barchart.scss */
   .bar-ELECTRICITY.selected {
     fill: #d87b39;
     filter: drop-shadow(0 -0.1rem 0.2rem #d87b39); }
 
-/* line 29, src/styles/components/_barchart.scss */
+/* line 27, src/styles/components/_barchart.scss */
 .bar-compare-ELECTRICITY {
   fill: #795c47; }
-  /* line 31, src/styles/components/_barchart.scss */
+  /* line 29, src/styles/components/_barchart.scss */
   .bar-compare-ELECTRICITY.selected {
     fill: #e2bca1;
     filter: drop-shadow(0 -0.1rem 0.2rem #e2bca1); }
 
-/* line 37, src/styles/components/_barchart.scss */
+/* line 35, src/styles/components/_barchart.scss */
 .bar-WATER {
   fill: #20415e; }
-  /* line 39, src/styles/components/_barchart.scss */
+  /* line 37, src/styles/components/_barchart.scss */
   .bar-WATER.selected {
     fill: #3a98ec;
     filter: drop-shadow(0 -0.1rem 0.2rem #3a98ec); }
 
-/* line 45, src/styles/components/_barchart.scss */
+/* line 43, src/styles/components/_barchart.scss */
 .bar-compare-WATER {
   fill: #4d5c6e; }
-  /* line 47, src/styles/components/_barchart.scss */
+  /* line 45, src/styles/components/_barchart.scss */
   .bar-compare-WATER.selected {
     fill: #abd4fa;
     filter: drop-shadow(0 -0.1rem 0.2rem #abd4fa); }
 
-/* line 53, src/styles/components/_barchart.scss */
+/* line 51, src/styles/components/_barchart.scss */
 .bar-GAS {
   fill: #184940; }
-  /* line 55, src/styles/components/_barchart.scss */
+  /* line 53, src/styles/components/_barchart.scss */
   .bar-GAS.selected {
     fill: #45d1b8;
     filter: drop-shadow(0 -0.1rem 0.2rem #45d1b8); }
 
-/* line 61, src/styles/components/_barchart.scss */
+/* line 59, src/styles/components/_barchart.scss */
 .bar-compare-GAS {
   fill: #597773; }
-  /* line 63, src/styles/components/_barchart.scss */
+  /* line 61, src/styles/components/_barchart.scss */
   .bar-compare-GAS.selected {
     fill: #a8f7e9;
     filter: drop-shadow(0 -0.1rem 0.2rem #a8f7e9); }
 
-/* line 69, src/styles/components/_barchart.scss */
+/* line 67, src/styles/components/_barchart.scss */
 .bar-MULTIFLUID {
   fill: #705d1d; }
-  /* line 71, src/styles/components/_barchart.scss */
+  /* line 69, src/styles/components/_barchart.scss */
   .bar-MULTIFLUID.selected {
     fill: #e3b82a;
     filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a); }
 
-/* line 77, src/styles/components/_barchart.scss */
+/* line 75, src/styles/components/_barchart.scss */
 .bar-compare-MULTIFLUID {
   fill: #7d6a4e; }
-  /* line 79, src/styles/components/_barchart.scss */
+  /* line 77, src/styles/components/_barchart.scss */
   .bar-compare-MULTIFLUID.selected {
     fill: #ffd597;
     filter: drop-shadow(0 -0.1rem 0.2rem #e3b82a); }
 
 /** Animation **/
-/* line 86, src/styles/components/_barchart.scss */
+/* line 84, src/styles/components/_barchart.scss */
 .bounce-1 {
   animation-name: bounce-1;
   animation-timing-function: cubic-bezier(1, 1, 0.42, 1);
@@ -1496,7 +1340,7 @@ p {
   75% {
     transform: scale(1, 1); } }
 
-/* line 114, src/styles/components/_barchart.scss */
+/* line 112, src/styles/components/_barchart.scss */
 .bounce-2 {
   animation-name: bounce-2;
   animation-timing-function: cubic-bezier(1, 1, 0.42, 1);
@@ -1518,74 +1362,91 @@ p {
   75% {
     transform: scale(1, 1); } }
 
+/* line 140, src/styles/components/_barchart.scss */
+.bounce-3 {
+  animation-name: bounce-3;
+  animation-timing-function: cubic-bezier(1, 1, 0.42, 1);
+  animation-iteration-count: 1;
+  transform-origin: bottom center; }
+
+@keyframes bounce-3 {
+  0% {
+    opacity: 0.6;
+    transform: scaleY(1); }
+  50% {
+    transform: scaleY(1.1);
+    opacity: 0.8; }
+  100% {
+    transform: scaleY(1);
+    opacity: 1; } }
+
 /** Animatio ndelay **/
-/* line 143, src/styles/components/_barchart.scss */
+/* line 162, src/styles/components/_barchart.scss */
 .delay {
   animation-duration: 0.4s; }
 
-/* line 146, src/styles/components/_barchart.scss */
+/* line 165, src/styles/components/_barchart.scss */
 .delay--0 {
   animation-duration: 0.6s; }
 
-/* line 149, src/styles/components/_barchart.scss */
+/* line 168, src/styles/components/_barchart.scss */
 .delay--1 {
   animation-duration: 0.7s; }
 
-/* line 152, src/styles/components/_barchart.scss */
+/* line 171, src/styles/components/_barchart.scss */
 .delay--2 {
   animation-duration: 0.8s; }
 
-/* line 155, src/styles/components/_barchart.scss */
+/* line 174, src/styles/components/_barchart.scss */
 .delay--3 {
   animation-duration: 0.9s; }
 
-/* line 158, src/styles/components/_barchart.scss */
+/* line 177, src/styles/components/_barchart.scss */
 .delay--4 {
   animation-duration: 1s; }
 
-/* line 161, src/styles/components/_barchart.scss */
+/* line 180, src/styles/components/_barchart.scss */
 .delay--5 {
   animation-duration: 1.1s; }
 
-/* line 164, src/styles/components/_barchart.scss */
+/* line 183, src/styles/components/_barchart.scss */
 .delay--6 {
   animation-duration: 1.2s; }
 
-/* line 167, src/styles/components/_barchart.scss */
+/* line 186, src/styles/components/_barchart.scss */
 .delay--7 {
   animation-duration: 1.3s; }
 
-/* line 170, src/styles/components/_barchart.scss */
+/* line 189, src/styles/components/_barchart.scss */
 .delay--8 {
   animation-duration: 1.4s; }
 
-/* line 173, src/styles/components/_barchart.scss */
+/* line 192, src/styles/components/_barchart.scss */
 .delay--9 {
   animation-duration: 1.5s; }
 
-/* line 176, src/styles/components/_barchart.scss */
+/* line 195, src/styles/components/_barchart.scss */
 .delay--10 {
   animation-duration: 1.6s; }
 
-/* line 179, src/styles/components/_barchart.scss */
+/* line 198, src/styles/components/_barchart.scss */
 .delay--11 {
   animation-duration: 1.8s; }
 
-/* line 182, src/styles/components/_barchart.scss */
+/* line 201, src/styles/components/_barchart.scss */
 .delay--12 {
   animation-duration: 1.9s; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_nav.scss */
 .o-sidebar {
   background-color: #25262b;
@@ -1593,72 +1454,71 @@ p {
   border-top: unset;
   border-right: unset;
   z-index: 19; }
-  @media only screen and (max-width: 1023px) {
-    /* line 4, src/styles/components/_nav.scss */
-    .o-sidebar {
-      background-color: #25262b; } }
-  /* line 20, src/styles/components/_nav.scss */
+  /* line 11, src/styles/components/_nav.scss */
   .o-sidebar .logo-grand-lyon {
     position: absolute;
     bottom: 20px;
     left: 100px; }
     @media only screen and (max-width: 1023px) {
-      /* line 20, src/styles/components/_nav.scss */
+      /* line 11, src/styles/components/_nav.scss */
       .o-sidebar .logo-grand-lyon {
         display: none; } }
 
-/* line 29, src/styles/components/_nav.scss */
+/* line 20, src/styles/components/_nav.scss */
 .c-nav-link {
-  padding: 0 1rem; }
-  /* line 31, src/styles/components/_nav.scss */
+  padding: 0 1rem;
+  font-size: 0.9rem; }
+  /* line 23, src/styles/components/_nav.scss */
   .c-nav-link .on {
     display: none; }
-  /* line 34, src/styles/components/_nav.scss */
+  /* line 26, src/styles/components/_nav.scss */
   .c-nav-link .off {
     display: block; }
 
-/* line 44, src/styles/components/_nav.scss */
+@media only screen and (max-width: 1023px) {
+  /* line 32, src/styles/components/_nav.scss */
+  .c-nav-item {
+    height: 54px;
+    margin: -0.3rem 0 0 0; } }
+
+/* line 38, src/styles/components/_nav.scss */
 .c-nav-link .c-nav-icon {
   padding-right: 0.5rem;
-  width: 50px;
+  width: 60px;
   height: 36px;
   fill: none; }
 
-/* line 51, src/styles/components/_nav.scss */
-.c-nav-link.is-active {
-  box-shadow: inset 0.25rem 0 0 0 #b2901b; }
-
-/* line 55, src/styles/components/_nav.scss */
+/* line 45, src/styles/components/_nav.scss */
 .c-nav-link.is-active .c-nav-icon {
   fill: #b2901b !important; }
 
-/* line 59, src/styles/components/_nav.scss */
+/* line 49, src/styles/components/_nav.scss */
 .c-nav-link.is-active {
-  color: white;
+  color: #ffffff;
   text-decoration: none; }
-  /* line 62, src/styles/components/_nav.scss */
+  /* line 52, src/styles/components/_nav.scss */
   .c-nav-link.is-active .on {
     display: block; }
-  /* line 65, src/styles/components/_nav.scss */
+  /* line 55, src/styles/components/_nav.scss */
   .c-nav-link.is-active .off {
     display: none; }
 
 @media only screen and (max-width: 1023px) {
-  /* line 71, src/styles/components/_nav.scss */
+  /* line 61, src/styles/components/_nav.scss */
   .o-sidebar {
     height: 56px; }
-  /* line 74, src/styles/components/_nav.scss */
+  /* line 64, src/styles/components/_nav.scss */
   .c-nav-link {
     padding: 0; }
-  /* line 78, src/styles/components/_nav.scss */
+  /* line 68, src/styles/components/_nav.scss */
   .c-nav-link .c-nav-icon {
     padding: 0;
     margin: auto; }
-  /* line 83, src/styles/components/_nav.scss */
+  /* line 73, src/styles/components/_nav.scss */
   .c-nav-link.is-active {
     box-shadow: unset; } }
 
-/* line 88, src/styles/components/_nav.scss */
+/* line 78, src/styles/components/_nav.scss */
 .nb-challenge-notif {
   position: absolute;
   display: flex;
@@ -1672,25 +1532,24 @@ p {
   border-radius: 50%;
   border: 1px solid #25262b;
   z-index: 1;
-  background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58FFFF;
+  background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;
   font-size: 12px; }
   @media only screen and (max-width: 1023px) {
-    /* line 88, src/styles/components/_nav.scss */
+    /* line 78, src/styles/components/_nav.scss */
     .nb-challenge-notif {
       left: 25px;
       bottom: unset; } }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 5, src/styles/components/_indicators.scss */
 .fi-root {
   display: flex;
@@ -1782,32 +1641,28 @@ p {
           color: #a0a0a0; }
           /* line 89, src/styles/components/_indicators.scss */
           .fpi .fpi-left .fpi-content .fpi-content-perf .fpi-content-perf-indicator .fpi-content-perf-indicator-kpi.positive {
-            color: #ffffff; }
+            color: #d25959; }
           /* line 92, src/styles/components/_indicators.scss */
-          .fpi .fpi-left .fpi-content .fpi-content-perf .fpi-content-perf-indicator .fpi-content-perf-indicator-kpi.positive {
-            color: #cf6666; }
-          /* line 95, src/styles/components/_indicators.scss */
           .fpi .fpi-left .fpi-content .fpi-content-perf .fpi-content-perf-indicator .fpi-content-perf-indicator-kpi.negative {
             color: #7fd771; }
-    /* line 102, src/styles/components/_indicators.scss */
+    /* line 99, src/styles/components/_indicators.scss */
     .fpi .fpi-left .fpi-footer {
       margin-top: 0.5rem;
       color: #a0a0a0; }
-  /* line 107, src/styles/components/_indicators.scss */
+  /* line 104, src/styles/components/_indicators.scss */
   .fpi .fpi-right {
     align-self: center; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 5, src/styles/components/_challenges.scss */
 .ccc-root {
   display: flex;
@@ -1890,12 +1745,12 @@ p {
       margin: 1rem 0.5rem; } }
   /* line 78, src/styles/components/_challenges.scss */
   .cli.cli-available {
-    background: linear-gradient(180deg, #61F0F2 0%, #48C2C4 100%);
+    background: linear-gradient(180deg, #61f0f2 0%, #48c2c4 100%);
     -webkit-transform: translateZ(0);
     transform: translateZ(0); }
   /* line 83, src/styles/components/_challenges.scss */
   .cli.cli-ongoing {
-    border: 1px solid #58FFFF;
+    border: 1px solid #58ffff;
     background: #121212;
     -webkit-transform: translateZ(0);
     transform: translateZ(0); }
@@ -1914,7 +1769,7 @@ p {
         margin: 0.5rem 0;
         z-index: 5;
         width: 62px;
-        height: 100%; }
+        height: 62px; }
       /* line 103, src/styles/components/_challenges.scss */
       .cli .cli-left .cli-content .cli-content-title {
         color: #ffffff;
@@ -1928,7 +1783,7 @@ p {
         color: #e0e0e0; }
       /* line 114, src/styles/components/_challenges.scss */
       .cli .cli-left .cli-content .subtitle-ongoing {
-        color: #58FFFF; }
+        color: #58ffff; }
       /* line 117, src/styles/components/_challenges.scss */
       .cli .cli-left .cli-content .title-ongoing {
         color: #ffffff; }
@@ -2002,8 +1857,8 @@ p {
       height: 1.8125rem;
       width: 1.8125rem;
       border-radius: 50%;
-      background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58FFFF;
-      color: black;
+      background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;
+      color: #25262b;
       margin-right: 1rem; }
 
 /* line 198, src/styles/components/_challenges.scss */
@@ -2022,83 +1877,85 @@ p {
   .cm-content .win {
     background: #eed582;
     background: Linear-gradient(90deg, #bf723b 0%, #dd9a2b 26.04%, #f6d74c 45.31%, #d1880d 75%, #a05b11 100%);
+    background-clip: text;
     -webkit-background-clip: text;
     -webkit-text-fill-color: transparent; }
-  /* line 221, src/styles/components/_challenges.scss */
+  /* line 222, src/styles/components/_challenges.scss */
   .cm-content .defeat {
     background: #eed582;
     background: Linear-gradient(90deg, #a66340 0%, #ae5f38 33.33%, #9e4e24 51.56%, #a4573a 66.67%);
+    background-clip: text;
     -webkit-background-clip: text;
     -webkit-text-fill-color: transparent; }
-  /* line 233, src/styles/components/_challenges.scss */
+  /* line 235, src/styles/components/_challenges.scss */
   .cm-content .cm-title {
     text-align: center; }
-  /* line 236, src/styles/components/_challenges.scss */
+  /* line 238, src/styles/components/_challenges.scss */
   .cm-content .cm-win-badge-star {
     display: grid;
     align-items: center;
     justify-items: center;
     position: absolute;
-    top: 15px; }
+    top: 52px; }
     @media only screen and (max-width: 768px) {
-      /* line 236, src/styles/components/_challenges.scss */
+      /* line 238, src/styles/components/_challenges.scss */
       .cm-content .cm-win-badge-star {
         top: 65px; } }
-    /* line 245, src/styles/components/_challenges.scss */
+    /* line 247, src/styles/components/_challenges.scss */
     .cm-content .cm-win-badge-star.--ecolyo-royal {
       top: 0px; }
       @media only screen and (max-width: 768px) {
-        /* line 245, src/styles/components/_challenges.scss */
+        /* line 247, src/styles/components/_challenges.scss */
         .cm-content .cm-win-badge-star.--ecolyo-royal {
           top: 5px; } }
-    /* line 252, src/styles/components/_challenges.scss */
+    /* line 254, src/styles/components/_challenges.scss */
     .cm-content .cm-win-badge-star .cm-win-badge {
       -webkit-animation: scale-in-center 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.1s both;
       animation: scale-in-center 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.1s both;
       grid-column: 1;
       grid-row: 1;
       z-index: 1; }
-    /* line 261, src/styles/components/_challenges.scss */
+    /* line 263, src/styles/components/_challenges.scss */
     .cm-content .cm-win-badge-star .cm-win-star {
       grid-column: 1;
       grid-row: 1;
       -webkit-animation: rotating 60s linear infinite;
       animation: rotating 60s linear infinite; }
-  /* line 268, src/styles/components/_challenges.scss */
+  /* line 270, src/styles/components/_challenges.scss */
   .cm-content .cm-result {
     color: #e0e0e0;
     text-align: center;
     margin-top: 1.5rem;
     margin-bottom: 0.5rem;
     margin-bottom: 165px; }
-    /* line 274, src/styles/components/_challenges.scss */
+    /* line 276, src/styles/components/_challenges.scss */
     .cm-content .cm-result .cm-result-positif {
       color: #7fd771; }
-    /* line 277, src/styles/components/_challenges.scss */
+    /* line 279, src/styles/components/_challenges.scss */
     .cm-content .cm-result .cm-result-negatif {
-      color: #d24444; }
-  /* line 281, src/styles/components/_challenges.scss */
+      color: #d25959; }
+  /* line 283, src/styles/components/_challenges.scss */
   .cm-content .cm-badge {
     position: absolute;
     top: 135px; }
     @media only screen and (max-width: 768px) {
-      /* line 281, src/styles/components/_challenges.scss */
+      /* line 283, src/styles/components/_challenges.scss */
       .cm-content .cm-badge {
         top: 142px; } }
-  /* line 288, src/styles/components/_challenges.scss */
+  /* line 290, src/styles/components/_challenges.scss */
   .cm-content .cm-button-valid {
     margin-top: 1rem;
     width: 100%; }
-  /* line 292, src/styles/components/_challenges.scss */
+  /* line 294, src/styles/components/_challenges.scss */
   .cm-content .cm-txt {
     text-align: center;
     margin-bottom: 1rem;
     width: 100%; }
-  /* line 297, src/styles/components/_challenges.scss */
+  /* line 299, src/styles/components/_challenges.scss */
   .cm-content .cm-text-new-available {
     margin-top: 1.25rem; }
 
-/* line 303, src/styles/components/_challenges.scss */
+/* line 305, src/styles/components/_challenges.scss */
 .list-of-days-duration {
   display: flex;
   flex-direction: row;
@@ -2106,71 +1963,71 @@ p {
   margin-top: 3rem;
   width: 100%; }
   @media only screen and (max-width: 768px) {
-    /* line 303, src/styles/components/_challenges.scss */
+    /* line 305, src/styles/components/_challenges.scss */
     .list-of-days-duration {
       margin-top: 1rem; } }
-  /* line 312, src/styles/components/_challenges.scss */
+  /* line 314, src/styles/components/_challenges.scss */
   .list-of-days-duration .day-solo {
     display: flex;
     flex-direction: column;
     width: 100%; }
-    /* line 316, src/styles/components/_challenges.scss */
+    /* line 318, src/styles/components/_challenges.scss */
     .list-of-days-duration .day-solo .day-line-label {
       display: flex;
       flex-direction: row;
       justify-content: center;
       align-items: center;
       width: 100%; }
-      /* line 322, src/styles/components/_challenges.scss */
+      /* line 324, src/styles/components/_challenges.scss */
       .list-of-days-duration .day-solo .day-line-label .date-dash {
         width: 50%;
         height: 2px;
         background-color: #7b7b7b; }
-      /* line 327, src/styles/components/_challenges.scss */
+      /* line 329, src/styles/components/_challenges.scss */
       .list-of-days-duration .day-solo .day-line-label .past {
-        background-color: #58FFFF; }
-      /* line 330, src/styles/components/_challenges.scss */
+        background-color: #58ffff; }
+      /* line 332, src/styles/components/_challenges.scss */
       .list-of-days-duration .day-solo .day-line-label .futur {
         background-color: #7b7b7b; }
-      /* line 333, src/styles/components/_challenges.scss */
+      /* line 335, src/styles/components/_challenges.scss */
       .list-of-days-duration .day-solo .day-line-label .none {
         opacity: 0; }
-      /* line 336, src/styles/components/_challenges.scss */
+      /* line 338, src/styles/components/_challenges.scss */
       .list-of-days-duration .day-solo .day-line-label .date-label {
         width: 0.625rem;
         height: 0.625rem;
         border-radius: 50%;
         position: absolute; }
-    /* line 343, src/styles/components/_challenges.scss */
+    /* line 345, src/styles/components/_challenges.scss */
     .list-of-days-duration .day-solo .day-letter {
       margin-top: 0.8rem;
       text-align: center;
       color: #a0a0a0; }
-    /* line 348, src/styles/components/_challenges.scss */
+    /* line 350, src/styles/components/_challenges.scss */
     .list-of-days-duration .day-solo .day-date {
       margin-top: 0.2rem;
       text-align: center;
       color: #a0a0a0; }
 
-/* line 357, src/styles/components/_challenges.scss */
+/* line 359, src/styles/components/_challenges.scss */
 .view-start-date {
   padding: 0.25rem 0;
-  color: #58FFFF; }
+  color: #58ffff; }
 
-/* line 363, src/styles/components/_challenges.scss */
+/* line 365, src/styles/components/_challenges.scss */
 .pile-energy-follow, .pile-energy-follow.--home {
   display: flex;
   flex-direction: row;
   align-items: center;
   justify-content: center;
   width: 100%; }
-  /* line 369, src/styles/components/_challenges.scss */
+  /* line 371, src/styles/components/_challenges.scss */
   .--home.pile-energy-follow {
     justify-content: start; }
-  /* line 373, src/styles/components/_challenges.scss */
+  /* line 375, src/styles/components/_challenges.scss */
   .pile-energy-follow .pile-section {
     display: grid; }
-    /* line 375, src/styles/components/_challenges.scss */
+    /* line 377, src/styles/components/_challenges.scss */
     .pile-energy-follow .pile-section .filter-pile {
       grid-column: 1;
       grid-row: 1;
@@ -2182,30 +2039,30 @@ p {
       opacity: 0.8;
       background-color: #121212;
       z-index: 1; }
-    /* line 387, src/styles/components/_challenges.scss */
+    /* line 389, src/styles/components/_challenges.scss */
     .pile-energy-follow .pile-section .pile-icon {
       grid-column: 1;
       grid-row: 1;
       margin: -25px 0; }
-  /* line 393, src/styles/components/_challenges.scss */
+  /* line 395, src/styles/components/_challenges.scss */
   .pile-energy-follow .max-energy {
     color: #7b7b7b; }
-  /* line 396, src/styles/components/_challenges.scss */
+  /* line 398, src/styles/components/_challenges.scss */
   .pile-energy-follow .values-section {
     margin-left: 1rem; }
-  /* line 399, src/styles/components/_challenges.scss */
+  /* line 401, src/styles/components/_challenges.scss */
   .pile-energy-follow .no-values-section {
     color: #ffffff;
     margin-left: 1rem; }
 
-/* line 406, src/styles/components/_challenges.scss */
+/* line 408, src/styles/components/_challenges.scss */
 .ongoing-challenge {
   min-height: 620px; }
 
-/* line 409, src/styles/components/_challenges.scss */
+/* line 411, src/styles/components/_challenges.scss */
 .cp-root {
   width: 100%; }
-  /* line 411, src/styles/components/_challenges.scss */
+  /* line 413, src/styles/components/_challenges.scss */
   .cp-root .cp-content, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal, .cp-root .cp-content.--locked {
     display: flex;
     align-items: center;
@@ -2213,10 +2070,10 @@ p {
     color: #e0e0e0;
     min-height: 84vh;
     justify-content: space-between; }
-    /* line 419, src/styles/components/_challenges.scss */
+    /* line 421, src/styles/components/_challenges.scss */
     .cp-root .cm-content .--locked.cm-win-badge-star.--ecolyo-royal, .cm-content .cp-root .--locked.cm-win-badge-star.--ecolyo-royal, .cp-root .--locked.cp-content {
       justify-content: center; }
-    /* line 424, src/styles/components/_challenges.scss */
+    /* line 426, src/styles/components/_challenges.scss */
     .cp-root .cp-content .cp-info, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info, .cp-root .cp-content .cp-info.--available {
       display: flex;
       flex-direction: column;
@@ -2227,53 +2084,53 @@ p {
       min-height: 55vh;
       padding-top: 1rem;
       padding-bottom: 0.5rem; }
-      /* line 434, src/styles/components/_challenges.scss */
+      /* line 436, src/styles/components/_challenges.scss */
       .cp-root .cp-content .--available.cp-info, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .--available.cp-info, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .--available.cp-info {
         height: 74vh; }
-      /* line 438, src/styles/components/_challenges.scss */
+      /* line 440, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-icon, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-icon, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-icon {
         margin: 1rem; }
-      /* line 441, src/styles/components/_challenges.scss */
+      /* line 443, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-icon-available, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-icon-available, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-icon-available {
         margin: 2rem; }
-      /* line 444, src/styles/components/_challenges.scss */
+      /* line 446, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-win-badge-star, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-win-badge-star, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-win-badge-star {
         display: grid;
         align-items: center;
         justify-items: center;
         margin: -100px; }
-        /* line 449, src/styles/components/_challenges.scss */
+        /* line 451, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .cp-win-badge-star .cp-win-badge, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-win-badge-star .cp-win-badge, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-win-badge-star .cp-win-badge {
           grid-column: 1;
           grid-row: 1;
           z-index: 1; }
-        /* line 454, src/styles/components/_challenges.scss */
+        /* line 456, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .cp-win-badge-star .cp-win-star, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-win-badge-star .cp-win-star, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-win-badge-star .cp-win-star {
           grid-column: 1;
           grid-row: 1; }
-      /* line 459, src/styles/components/_challenges.scss */
+      /* line 461, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-date, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-date, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-date {
         color: #a0a0a0;
         text-align: center;
         margin-top: 1rem; }
-      /* line 464, src/styles/components/_challenges.scss */
+      /* line 466, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-title, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-title, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-title {
         color: #e0e0e0;
         text-align: center;
         margin-top: 0.5rem; }
-      /* line 469, src/styles/components/_challenges.scss */
+      /* line 471, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-result, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-result, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-result {
         color: #e0e0e0;
         text-align: center;
         margin-top: 1.5rem;
         margin-bottom: 0.5rem; }
-        /* line 474, src/styles/components/_challenges.scss */
+        /* line 476, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .cp-result .cp-result-positif, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-result .cp-result-positif, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-result .cp-result-positif {
           color: #7fd771; }
-        /* line 477, src/styles/components/_challenges.scss */
+        /* line 479, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .cp-result .cp-result-negatif, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-result .cp-result-negatif, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-result .cp-result-negatif {
-          color: #d24444; }
-      /* line 481, src/styles/components/_challenges.scss */
+          color: #d25959; }
+      /* line 483, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-description, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-description, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-description {
         text-align: center;
         margin-top: 1rem;
@@ -2281,7 +2138,7 @@ p {
         margin-left: 1.25rem;
         margin-right: 1.25rem;
         max-width: 53rem; }
-      /* line 489, src/styles/components/_challenges.scss */
+      /* line 491, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-info .cp-valid, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-valid, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-valid, .cp-root .cp-content .cp-info .cp-valid.--ongoing {
         justify-content: center;
         display: flex;
@@ -2289,24 +2146,28 @@ p {
         width: 90%;
         margin-top: 0.75rem;
         max-width: 53rem; }
-        /* line 496, src/styles/components/_challenges.scss */
+        /* line 498, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .--ongoing.cp-valid, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .--ongoing.cp-valid, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .--ongoing.cp-valid {
           width: 25%; }
           @media only screen and (max-width: 768px) {
-            /* line 496, src/styles/components/_challenges.scss */
+            /* line 498, src/styles/components/_challenges.scss */
             .cp-root .cp-content .cp-info .--ongoing.cp-valid, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .--ongoing.cp-valid, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .--ongoing.cp-valid {
               width: 60%; } }
-        /* line 503, src/styles/components/_challenges.scss */
+        /* line 505, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .cp-valid .cp-left-button, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-valid .cp-left-button, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-valid .cp-left-button {
           margin-right: 0.25rem;
           margin-left: 0;
           width: 100%; }
-        /* line 508, src/styles/components/_challenges.scss */
+        /* line 510, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-info .cp-valid .cp-right-button, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .cp-valid .cp-right-button, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .cp-valid .cp-right-button {
           margin-left: 0.25rem;
           margin-right: 0;
           width: 100%; }
-    /* line 515, src/styles/components/_challenges.scss */
+      /* line 516, src/styles/components/_challenges.scss */
+      .cp-root .cp-content .cp-info .lack-of-data-challenge, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-info .lack-of-data-challenge, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-info .lack-of-data-challenge {
+        text-align: center;
+        width: 90%; }
+    /* line 521, src/styles/components/_challenges.scss */
     .cp-root .cp-content .cp-follow, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-follow, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-follow {
       width: 90%;
       display: flex;
@@ -2314,12 +2175,12 @@ p {
       align-items: center;
       margin-bottom: 1rem;
       max-width: 53rem; }
-    /* line 523, src/styles/components/_challenges.scss */
+    /* line 529, src/styles/components/_challenges.scss */
     .cp-root .cp-content .cp-valid-locked, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-valid-locked, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-valid-locked {
       margin-top: 2rem;
       width: 80%;
       max-width: 53rem; }
-    /* line 528, src/styles/components/_challenges.scss */
+    /* line 534, src/styles/components/_challenges.scss */
     .cp-root .cp-content .cp-bottom, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-bottom, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-bottom {
       padding: 1.25rem 1.25rem;
       width: 90%;
@@ -2329,16 +2190,16 @@ p {
       max-width: 53rem;
       margin-bottom: 2rem; }
       @media only screen and (max-width: 768px) {
-        /* line 528, src/styles/components/_challenges.scss */
+        /* line 534, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-bottom, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-bottom, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-bottom {
           margin-bottom: 0; } }
-      /* line 539, src/styles/components/_challenges.scss */
+      /* line 545, src/styles/components/_challenges.scss */
       .cp-root .cp-content .cp-bottom .cp-eg-content, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-bottom .cp-eg-content, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-bottom .cp-eg-content {
         width: 100%; }
-        /* line 541, src/styles/components/_challenges.scss */
+        /* line 547, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-bottom .cp-eg-content .linked-ecogestures, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-bottom .cp-eg-content .linked-ecogestures, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-bottom .cp-eg-content .linked-ecogestures {
           text-transform: uppercase; }
-        /* line 544, src/styles/components/_challenges.scss */
+        /* line 550, src/styles/components/_challenges.scss */
         .cp-root .cp-content .cp-bottom .cp-eg-content .cp-ecogestures, .cp-root .cm-content .cm-win-badge-star.--ecolyo-royal .cp-bottom .cp-eg-content .cp-ecogestures, .cm-content .cp-root .cm-win-badge-star.--ecolyo-royal .cp-bottom .cp-eg-content .cp-ecogestures {
           width: 100%;
           display: flex;
@@ -2378,16 +2239,15 @@ p {
     -webkit-transform: rotate(360deg); } }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 5, src/styles/components/_ecogesture.scss */
 .ecogesture-root {
   display: flex;
@@ -2397,13 +2257,13 @@ p {
   padding: 1rem 1.5rem 2.5rem 1.5rem; }
   /* line 11, src/styles/components/_ecogesture.scss */
   .ecogesture-root .negawatt-button-content {
-    width: calc(53rem - 2%);
-    margin: 0 1%; }
-    @media only screen and (max-width: 768px) {
+    max-width: 52rem;
+    width: 97%; }
+    @media only screen and (max-width: 1023px) {
       /* line 11, src/styles/components/_ecogesture.scss */
       .ecogesture-root .negawatt-button-content {
         width: 97%; } }
-    @media only screen and (max-width: 1023px) {
+    @media only screen and (max-width: 768px) {
       /* line 11, src/styles/components/_ecogesture.scss */
       .ecogesture-root .negawatt-button-content {
         width: 97%; } }
@@ -2412,12 +2272,12 @@ p {
     display: flex;
     flex-wrap: wrap;
     justify-content: space-around;
-    width: 53rem; }
-    @media only screen and (max-width: 768px) {
+    max-width: 53rem; }
+    @media only screen and (max-width: 1023px) {
       /* line 21, src/styles/components/_ecogesture.scss */
       .ecogesture-root .ecogesture-content {
         width: 100%; } }
-    @media only screen and (max-width: 1023px) {
+    @media only screen and (max-width: 768px) {
       /* line 21, src/styles/components/_ecogesture.scss */
       .ecogesture-root .ecogesture-content {
         width: 100%; } }
@@ -2432,56 +2292,68 @@ p {
       overflow: hidden; }
 
 /* line 45, src/styles/components/_ecogesture.scss */
-.ec-link {
-  color: black; }
-
-/* line 48, src/styles/components/_ecogesture.scss */
 .ec {
   display: flex;
   justify-content: center;
   width: 100%;
   height: 100%; }
-  /* line 53, src/styles/components/_ecogesture.scss */
+  /* line 50, src/styles/components/_ecogesture.scss */
+  .ec .ecogesture-card-notif {
+    position: absolute;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    right: 8px;
+    top: 8px;
+    width: 1.25rem;
+    height: 1.25rem;
+    color: #25262b;
+    border-radius: 50%;
+    border: 1px solid #25262b;
+    z-index: 1;
+    background: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;
+    font-size: 12px; }
+  /* line 67, src/styles/components/_ecogesture.scss */
   .ec .ec-content {
     display: flex;
     flex-direction: column;
     align-items: center;
     justify-content: space-around; }
-    /* line 58, src/styles/components/_ecogesture.scss */
+    /* line 72, src/styles/components/_ecogesture.scss */
     .ec .ec-content.ec-content-unlocked {
       padding: 0.4rem 0; }
-    /* line 61, src/styles/components/_ecogesture.scss */
+    /* line 75, src/styles/components/_ecogesture.scss */
     .ec .ec-content.ec-content-challenge {
       padding: 0.5rem 0; }
-    /* line 64, src/styles/components/_ecogesture.scss */
+    /* line 78, src/styles/components/_ecogesture.scss */
     .ec .ec-content .ec-content-icon {
       min-height: 50px; }
-    /* line 67, src/styles/components/_ecogesture.scss */
+    /* line 81, src/styles/components/_ecogesture.scss */
     .ec .ec-content .ec-content-short-name {
       display: flex;
       flex: 1;
       align-items: center;
       text-align: center; }
-    /* line 73, src/styles/components/_ecogesture.scss */
+    /* line 87, src/styles/components/_ecogesture.scss */
     .ec .ec-content .ec-content-nwh {
       margin-top: 0.25rem;
       color: #a0a0a0; }
 
-/* line 79, src/styles/components/_ecogesture.scss */
+/* line 93, src/styles/components/_ecogesture.scss */
 .cp-eg-1 {
   height: 8rem;
   width: 100%;
   margin-right: 0.25rem;
   text-align: center; }
 
-/* line 85, src/styles/components/_ecogesture.scss */
+/* line 99, src/styles/components/_ecogesture.scss */
 .cp-eg-2 {
   height: 8rem;
   width: 100%;
   margin-left: 0.25rem;
   text-align: center; }
 
-/* line 93, src/styles/components/_ecogesture.scss */
+/* line 107, src/styles/components/_ecogesture.scss */
 .em-header {
   color: #e0e0e0;
   border-bottom: 1px solid rgba(163, 163, 163, 0.4);
@@ -2490,40 +2362,8 @@ p {
   display: flex;
   justify-content: center; }
 
-/* line 101, src/styles/components/_ecogesture.scss */
-.em-icon {
-  margin-bottom: 1rem; }
-
-/* line 104, src/styles/components/_ecogesture.scss */
-.em-title {
-  margin-bottom: 0; }
-
-/* line 107, src/styles/components/_ecogesture.scss */
-.em-detail {
-  display: flex;
-  flex-direction: row;
-  margin: 0.5em 0; }
-  /* line 111, src/styles/components/_ecogesture.scss */
-  .em-detail .em-detail-nwh {
-    display: flex;
-    flex: 1;
-    align-self: flex-start;
-    margin-top: 0.65rem;
-    color: var(--textDark); }
-    /* line 117, src/styles/components/_ecogesture.scss */
-    .em-detail .em-detail-nwh .em-detail-nwh-unit {
-      margin-left: 0.2rem; }
-  /* line 121, src/styles/components/_ecogesture.scss */
-  .em-detail .em-picto-flow {
-    display: flex;
-    align-self: flex-end; }
-    /* line 124, src/styles/components/_ecogesture.scss */
-    .em-detail .em-picto-flow .em-pic-content {
-      margin: 0.3em; }
-
-/* line 130, src/styles/components/_ecogesture.scss */
-.em-content-box {
-  max-height: 25rem;
+/* line 116, src/styles/components/_ecogesture.scss */
+.em-root {
   overflow: auto;
   width: 100%;
   display: flex;
@@ -2531,60 +2371,99 @@ p {
   /* width */
   /* Track */
   /* Handle */ }
-  /* line 137, src/styles/components/_ecogesture.scss */
-  .em-content-box::-webkit-scrollbar {
+  /* line 122, src/styles/components/_ecogesture.scss */
+  .em-root::-webkit-scrollbar {
     width: 10px; }
-  /* line 141, src/styles/components/_ecogesture.scss */
-  .em-content-box::-webkit-scrollbar-track {
+  /* line 126, src/styles/components/_ecogesture.scss */
+  .em-root::-webkit-scrollbar-track {
     background: #3e4045; }
-  /* line 145, src/styles/components/_ecogesture.scss */
-  .em-content-box::-webkit-scrollbar-thumb {
+  /* line 130, src/styles/components/_ecogesture.scss */
+  .em-root::-webkit-scrollbar-thumb {
     background: #6f7074; }
-  /* line 148, src/styles/components/_ecogesture.scss */
-  .em-content-box .em-content-box-text {
-    display: flex;
-    flex-direction: column;
-    padding: 1.5rem 1.5rem;
-    width: 22.125rem; }
+  /* line 133, src/styles/components/_ecogesture.scss */
+  .em-root .em-content {
+    padding: 1.5rem 2.5rem 0; }
     @media only screen and (max-width: 768px) {
-      /* line 148, src/styles/components/_ecogesture.scss */
-      .em-content-box .em-content-box-text {
-        width: 100%; } }
-    /* line 156, src/styles/components/_ecogesture.scss */
-    .em-content-box .em-content-box-text .em-content-box-text-header {
+      /* line 133, src/styles/components/_ecogesture.scss */
+      .em-root .em-content {
+        width: 100%;
+        padding: 1.5rem 1.5rem 0; } }
+    /* line 140, src/styles/components/_ecogesture.scss */
+    .em-root .em-content .em-content-box-img {
       display: flex;
       flex-direction: column;
       justify-content: center;
       align-items: center; }
-      /* line 161, src/styles/components/_ecogesture.scss */
-      .em-content-box .em-content-box-text .em-content-box-text-header .icon {
+      /* line 145, src/styles/components/_ecogesture.scss */
+      .em-root .em-content .em-content-box-img .icon {
         margin-bottom: 1rem; }
-    /* line 165, src/styles/components/_ecogesture.scss */
-    .em-content-box .em-content-box-text .long-name {
+    /* line 149, src/styles/components/_ecogesture.scss */
+    .em-root .em-content .em-detail {
+      display: flex;
+      flex-direction: row;
+      margin: 0.5em 0; }
+      /* line 153, src/styles/components/_ecogesture.scss */
+      .em-root .em-content .em-detail .em-detail-nwh {
+        display: flex;
+        flex: 1;
+        align-self: flex-start;
+        margin-top: 0.65rem;
+        color: #a0a0a0; }
+        /* line 159, src/styles/components/_ecogesture.scss */
+        .em-root .em-content .em-detail .em-detail-nwh .em-detail-nwh-unit {
+          margin-left: 0.2rem; }
+      /* line 163, src/styles/components/_ecogesture.scss */
+      .em-root .em-content .em-detail .em-picto-flow {
+        display: flex;
+        align-self: flex-end; }
+        /* line 166, src/styles/components/_ecogesture.scss */
+        .em-root .em-content .em-detail .em-picto-flow .em-pic-content {
+          margin: 0.3em; }
+    /* line 171, src/styles/components/_ecogesture.scss */
+    .em-root .em-content .em-title {
+      margin-bottom: 0;
+      text-align: center; }
+    /* line 176, src/styles/components/_ecogesture.scss */
+    .em-root .em-content .long-name {
       font-weight: bold;
       line-height: 150%;
       margin: 0.5rem 0 1rem; }
-    /* line 170, src/styles/components/_ecogesture.scss */
-    .em-content-box .em-content-box-text .em-description {
-      padding-bottom: 2.5rem; }
-    /* line 173, src/styles/components/_ecogesture.scss */
-    .em-content-box .em-content-box-text .em-description-2 {
-      padding-top: 2rem; }
-    /* line 176, src/styles/components/_ecogesture.scss */
-    .em-content-box .em-content-box-text .em-description-3 {
-      padding-bottom: 0.5rem; }
+    /* line 181, src/styles/components/_ecogesture.scss */
+    .em-root .em-content .em-description {
+      padding-bottom: 2rem; }
+
+/* line 186, src/styles/components/_ecogesture.scss */
+.em-content-box-text {
+  display: flex;
+  flex-direction: column;
+  padding: 1.5rem 2.5rem; }
+  @media only screen and (max-width: 768px) {
+    /* line 186, src/styles/components/_ecogesture.scss */
+    .em-content-box-text {
+      padding: 1.5rem 1.5rem; } }
+  /* line 193, src/styles/components/_ecogesture.scss */
+  .em-content-box-text .em-description {
+    padding-bottom: 2rem; }
+  /* line 196, src/styles/components/_ecogesture.scss */
+  .em-content-box-text .em-description-2 {
+    padding-top: 2rem; }
+  /* line 199, src/styles/components/_ecogesture.scss */
+  .em-content-box-text .em-description-3 {
+    padding-bottom: 0.5rem; }
+  /* line 202, src/styles/components/_ecogesture.scss */
+  .em-content-box-text .em-title {
+    margin-bottom: 0; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_modal.scss */
 .modal-overlay {
   display: none;
@@ -2603,40 +2482,40 @@ p {
     display: flex; }
   /* line 19, src/styles/components/_modal.scss */
   .modal-overlay .modal-box {
-    background: linear-gradient(180deg, #323339 0%, #25262B 100%);
+    background: linear-gradient(180deg, #323339 0%, #25262b 100%);
     position: fixed;
-    top: 50%;
-    left: 50%;
     width: 36rem;
     max-width: 100%;
-    max-height: 30rem;
-    transform: translate(-50%, -50%);
+    max-height: 90vh;
     padding: 1rem 0 0 0;
     box-sizing: border-box;
     box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.55);
     border-radius: 4px; }
-    @media only screen and (max-width: 768px) {
+    @media only screen and (max-width: 1023px) {
       /* line 19, src/styles/components/_modal.scss */
       .modal-overlay .modal-box {
-        width: 20rem; } }
+        width: 35rem; } }
     @media only screen and (max-width: 768px) {
       /* line 19, src/styles/components/_modal.scss */
       .modal-overlay .modal-box {
-        max-height: unset; } }
-    /* line 38, src/styles/components/_modal.scss */
+        width: 85%;
+        max-width: 35rem; } }
+    /* line 36, src/styles/components/_modal.scss */
     .modal-overlay .modal-box.modal-box-bordered {
-      border: 1px solid #58FFFF40; }
-    /* line 41, src/styles/components/_modal.scss */
+      border: 1px solid #58ffff40; }
+    /* line 39, src/styles/components/_modal.scss */
     .modal-overlay .modal-box.yellow-border {
       border: 1px solid rgba(227, 184, 42, 0.4); }
-    /* line 44, src/styles/components/_modal.scss */
+    /* line 42, src/styles/components/_modal.scss */
     .modal-overlay .modal-box .modal-close-button {
       position: absolute;
       top: 0.5rem;
       right: 0.5rem;
-      padding: 5px 5px; }
-    /* line 50, src/styles/components/_modal.scss */
+      padding: 5px 5px;
+      z-index: 10; }
+    /* line 49, src/styles/components/_modal.scss */
     .modal-overlay .modal-box .modal-content {
+      max-height: 85vh;
       display: flex;
       flex-direction: column;
       align-items: center;
@@ -2671,16 +2550,15 @@ p {
       margin: 1rem; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 5, src/styles/components/_faq.scss */
 .faq-root {
   display: flex;
@@ -2692,43 +2570,47 @@ p {
   .faq-root .faq-content {
     margin-bottom: -1rem;
     width: 45.75rem; }
+    /* line 14, src/styles/components/_faq.scss */
+    .faq-root .faq-content a {
+      text-decoration: none; }
     @media only screen and (max-width: 768px) {
       /* line 11, src/styles/components/_faq.scss */
       .faq-root .faq-content {
         width: 100%; } }
-    /* line 17, src/styles/components/_faq.scss */
+    /* line 20, src/styles/components/_faq.scss */
     .faq-root .faq-content .faq-header {
       margin-top: 2.5rem;
       margin-bottom: 1.25rem;
       color: #e0e0e0; }
 
-/* line 25, src/styles/components/_faq.scss */
+/* line 28, src/styles/components/_faq.scss */
 .faq-card-link {
-  color: black; }
+  color: #ffffff; }
 
-/* line 28, src/styles/components/_faq.scss */
+/* line 31, src/styles/components/_faq.scss */
 .faq-card {
   display: flex;
   flex-direction: row;
   margin: -0.75rem 0;
   width: 100%; }
   @media only screen and (max-width: 768px) {
-    /* line 28, src/styles/components/_faq.scss */
+    /* line 31, src/styles/components/_faq.scss */
     .faq-card {
       width: 100%; } }
-  /* line 36, src/styles/components/_faq.scss */
+  /* line 39, src/styles/components/_faq.scss */
   .faq-card .faq-card-content {
     display: flex;
     flex-direction: row; }
-    /* line 39, src/styles/components/_faq.scss */
+    /* line 42, src/styles/components/_faq.scss */
     .faq-card .faq-card-content .faq-card-content-icon {
       margin: 0.5rem 0; }
-    /* line 42, src/styles/components/_faq.scss */
+    /* line 45, src/styles/components/_faq.scss */
     .faq-card .faq-card-content .faq-card-content-title {
       margin: 0 1rem;
-      align-self: center; }
+      align-self: center;
+      text-decoration: none; }
 
-/* line 50, src/styles/components/_faq.scss */
+/* line 54, src/styles/components/_faq.scss */
 .faq-view-root {
   display: flex;
   flex-direction: column;
@@ -2736,125 +2618,109 @@ p {
   justify-content: center;
   padding: 1rem 0;
   margin-top: 1.5rem; }
-  /* line 57, src/styles/components/_faq.scss */
+  /* line 61, src/styles/components/_faq.scss */
   .faq-view-root .faq-view-content {
     width: 45.75rem; }
     @media only screen and (max-width: 768px) {
-      /* line 57, src/styles/components/_faq.scss */
+      /* line 61, src/styles/components/_faq.scss */
       .faq-view-root .faq-view-content {
         width: 100%; } }
-    /* line 62, src/styles/components/_faq.scss */
+    /* line 66, src/styles/components/_faq.scss */
     .faq-view-root .faq-view-content .faq-content-detail {
       padding-bottom: 0.6rem; }
-      /* line 64, src/styles/components/_faq.scss */
+      /* line 68, src/styles/components/_faq.scss */
       .faq-view-root .faq-view-content .faq-content-detail .text-bold {
         font-weight: bold; }
-      /* line 67, src/styles/components/_faq.scss */
+      /* line 71, src/styles/components/_faq.scss */
       .faq-view-root .faq-view-content .faq-content-detail .text-underline {
         text-decoration: underline; }
-      /* line 70, src/styles/components/_faq.scss */
+      /* line 74, src/styles/components/_faq.scss */
       .faq-view-root .faq-view-content .faq-content-detail .spaceline {
         height: 0.6rem;
         display: block; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
-/* line 5, src/styles/components/_legal.scss */
-.legal-root {
+/** SCROLLBAR **/
+/* line 5, src/styles/components/_legalnotice.scss */
+.legal-notice-root {
   display: flex;
   flex-direction: column;
   align-items: center;
   justify-content: center;
-  padding: 0 1.5rem 1.5rem; }
-  /* line 11, src/styles/components/_legal.scss */
-  .legal-root .legal-content {
-    margin-bottom: -1rem;
+  color: #ffffff;
+  padding: 1.5rem 1.5rem 0; }
+  /* line 12, src/styles/components/_legalnotice.scss */
+  .legal-notice-root .legal-notice-content {
     width: 45.75rem; }
+    /* line 13, src/styles/components/_legalnotice.scss */
+    .legal-notice-root .legal-notice-content p {
+      color: #ffffff; }
+    /* line 16, src/styles/components/_legalnotice.scss */
+    .legal-notice-root .legal-notice-content a {
+      color: #ffffff;
+      text-decoration: none; }
+    /* line 20, src/styles/components/_legalnotice.scss */
+    .legal-notice-root .legal-notice-content li {
+      margin: 1rem 0; }
+    /* line 23, src/styles/components/_legalnotice.scss */
+    .legal-notice-root .legal-notice-content h2 {
+      color: #ffffff; }
+    /* line 26, src/styles/components/_legalnotice.scss */
+    .legal-notice-root .legal-notice-content h3 {
+      color: #ffffff;
+      margin: 2.5rem 0 1rem; }
+    /* line 30, src/styles/components/_legalnotice.scss */
+    .legal-notice-root .legal-notice-content .ln-contact {
+      color: #e3b82a; }
     @media only screen and (max-width: 768px) {
-      /* line 11, src/styles/components/_legal.scss */
-      .legal-root .legal-content {
+      /* line 12, src/styles/components/_legalnotice.scss */
+      .legal-notice-root .legal-notice-content {
         width: 100%; } }
-    /* line 17, src/styles/components/_legal.scss */
-    .legal-root .legal-content .legal-header {
-      margin-top: 2rem;
-      margin-bottom: 1.25rem;
-      color: #e0e0e0; }
 
-/* line 25, src/styles/components/_legal.scss */
-.legal-card-link {
+/* line 40, src/styles/components/_legalnotice.scss */
+.legal-notice-card-link {
   color: black; }
 
-/* line 28, src/styles/components/_legal.scss */
-.legal-card {
+/* line 43, src/styles/components/_legalnotice.scss */
+.legal-notice-card {
   display: flex;
   flex-direction: row;
   margin: -0.75rem 0;
   width: 100%; }
   @media only screen and (max-width: 768px) {
-    /* line 28, src/styles/components/_legal.scss */
-    .legal-card {
+    /* line 43, src/styles/components/_legalnotice.scss */
+    .legal-notice-card {
       width: 100%; } }
-  /* line 36, src/styles/components/_legal.scss */
-  .legal-card .legal-card-content {
+  /* line 51, src/styles/components/_legalnotice.scss */
+  .legal-notice-card .legal-notice-card-content {
     display: flex;
     flex-direction: row; }
-    /* line 39, src/styles/components/_legal.scss */
-    .legal-card .legal-card-content .legal-card-content-icon {
+    /* line 54, src/styles/components/_legalnotice.scss */
+    .legal-notice-card .legal-notice-card-content .legal-notice-card-content-icon {
       margin: 0.5rem 0; }
-    /* line 42, src/styles/components/_legal.scss */
-    .legal-card .legal-card-content .legal-card-content-title {
+    /* line 57, src/styles/components/_legalnotice.scss */
+    .legal-notice-card .legal-notice-card-content .legal-notice-card-content-title {
       margin: 0 1rem;
       align-self: center; }
 
-/* line 50, src/styles/components/_legal.scss */
-.legal-view-root {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  justify-content: center;
-  padding: 1rem 0;
-  margin-top: 1.5rem; }
-  /* line 57, src/styles/components/_legal.scss */
-  .legal-view-root .legal-view-content {
-    width: 45.75rem; }
-    @media only screen and (max-width: 768px) {
-      /* line 57, src/styles/components/_legal.scss */
-      .legal-view-root .legal-view-content {
-        width: 100%; } }
-    /* line 62, src/styles/components/_legal.scss */
-    .legal-view-root .legal-view-content .legal-content-detail {
-      padding-bottom: 0.6rem; }
-      /* line 64, src/styles/components/_legal.scss */
-      .legal-view-root .legal-view-content .legal-content-detail .text-bold {
-        font-weight: bold; }
-      /* line 67, src/styles/components/_legal.scss */
-      .legal-view-root .legal-view-content .legal-content-detail .text-underline {
-        text-decoration: underline; }
-      /* line 70, src/styles/components/_legal.scss */
-      .legal-view-root .legal-view-content .legal-content-detail .spaceline {
-        height: 0.6rem;
-        display: block; }
-
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_splash.scss */
 .splash-root {
   position: fixed;
@@ -2873,7 +2739,7 @@ p {
     display: flex;
     align-items: center;
     justify-content: center;
-    color: var(--textBright); }
+    color: var(--greyBright); }
   /* line 22, src/styles/components/_splash.scss */
   .splash-root .splash-content {
     display: flex;
@@ -2900,16 +2766,15 @@ p {
       max-width: 50vw; }
 
 /** BLACK **/
-/** TEXT COLOR **/
 /** RED **/
 /** YELLOW **/
-/** ORANGE **/
 /** BLUE **/
 /** GREEN **/
 /** WHITE **/
 /** GREY **/
 /** App colors **/
 /** TABS GRADIENT **/
+/** SCROLLBAR **/
 /* line 4, src/styles/components/_auth.scss */
 .authform-button-content {
   display: flex;
@@ -2931,31 +2796,199 @@ p {
     text-align: left;
     max-width: 10.625rem; }
 
-/* line 28, src/styles/index.scss */
+/** BLACK **/
+/** RED **/
+/** YELLOW **/
+/** BLUE **/
+/** GREEN **/
+/** WHITE **/
+/** GREY **/
+/** App colors **/
+/** TABS GRADIENT **/
+/** SCROLLBAR **/
+/* line 4, src/styles/components/_feedback.scss */
+.fb-root {
+  overflow-y: auto; }
+  /* line 6, src/styles/components/_feedback.scss */
+  .fb-root .fb-header {
+    color: #e3b82a;
+    padding: 1.5rem 1.5rem 0rem 1.5rem;
+    display: flex;
+    justify-content: center; }
+  /* line 13, src/styles/components/_feedback.scss */
+  .fb-root .fb-content {
+    padding: 1rem 1.5rem 1.5rem 1.5rem;
+    display: flex;
+    flex-direction: column; }
+    /* line 17, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-content-success {
+      color: #e0e0e0;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      text-align: center; }
+    /* line 24, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-content-error {
+      color: #e0e0e0;
+      display: flex;
+      flex-direction: column;
+      align-items: center;
+      text-align: center; }
+    /* line 31, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-icon {
+      display: flex;
+      justify-content: center;
+      margin: 0 0 1.5rem 0; }
+    /* line 36, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-label {
+      margin: 0.5rem 0 0 0; }
+    /* line 39, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-selector {
+      margin: 0.5rem 0;
+      display: flex;
+      flex-direction: row;
+      align-content: space-around;
+      justify-content: space-around; }
+      /* line 45, src/styles/components/_feedback.scss */
+      .fb-root .fb-content .fb-selector .fb-selector-item {
+        height: 3.125rem;
+        width: 3.125rem; }
+        /* line 48, src/styles/components/_feedback.scss */
+        .fb-root .fb-content .fb-selector .fb-selector-item .fb-selector-item-label {
+          color: #e0e0e0; }
+        /* line 51, src/styles/components/_feedback.scss */
+        .fb-root .fb-content .fb-selector .fb-selector-item .fb-selector-item-selectedlabel {
+          color: #ffffff; }
+    /* line 56, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-form {
+      margin: 0.5rem 0;
+      border: 1px solid #7b7b7b;
+      border-radius: 4px;
+      color: #e0e0e0;
+      background: rgba(0, 0, 0, 0.3);
+      padding: 0 1rem;
+      outline: none; }
+    /* line 65, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-form:focus {
+      border: 1px solid #e3b82a; }
+    /* line 68, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-textarea {
+      height: 8.725rem;
+      padding: 0.5rem 1rem;
+      resize: none; }
+    /* line 73, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-input {
+      height: 2rem; }
+    /* line 76, src/styles/components/_feedback.scss */
+    .fb-root .fb-content .fb-button {
+      max-width: 9.375rem;
+      align-self: center;
+      margin-top: 1rem; }
+
+/** BLACK **/
+/** RED **/
+/** YELLOW **/
+/** BLUE **/
+/** GREEN **/
+/** WHITE **/
+/** GREY **/
+/** App colors **/
+/** TABS GRADIENT **/
+/** SCROLLBAR **/
+/* line 4, src/styles/components/_version.scss */
+.version-root {
+  color: #e0e0e0;
+  text-align: end;
+  margin: 1rem 1.5rem 2rem; }
+
+/* line 1, src/styles/components/_report.scss */
+.report-root {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  padding: 0 1.5rem; }
+  /* line 7, src/styles/components/_report.scss */
+  .report-root .report-content {
+    width: 45.75rem; }
+    @media only screen and (max-width: 768px) {
+      /* line 7, src/styles/components/_report.scss */
+      .report-root .report-content {
+        width: 100%; } }
+  /* line 13, src/styles/components/_report.scss */
+  .report-root .head {
+    margin-top: 2rem;
+    color: #e0e0e0; }
+  /* line 17, src/styles/components/_report.scss */
+  .report-root .radios {
+    margin-top: 0.5rem; }
+    /* line 19, src/styles/components/_report.scss */
+    .report-root .radios .input {
+      padding: 0.5rem; }
+      /* line 21, src/styles/components/_report.scss */
+      .report-root .radios .input input[type='radio'] {
+        box-sizing: border-box;
+        -webkit-appearance: none;
+        outline: none;
+        border-radius: 50%;
+        position: relative;
+        top: 0.3rem;
+        width: 1.3rem;
+        height: 1.3rem;
+        border: 2px solid #a0a0a0;
+        background: transparent; }
+        /* line 32, src/styles/components/_report.scss */
+        .report-root .radios .input input[type='radio']:after {
+          transition: all 300ms ease;
+          content: '';
+          border-radius: 50%; }
+        /* line 38, src/styles/components/_report.scss */
+        .report-root .radios .input input[type='radio']:checked ~ label {
+          color: #e0e0e0; }
+        /* line 41, src/styles/components/_report.scss */
+        .report-root .radios .input input[type='radio']:checked:after {
+          content: '';
+          position: absolute;
+          top: -2px;
+          left: -2px;
+          box-sizing: border-box;
+          width: inherit;
+          height: inherit;
+          background-color: transparent;
+          border-radius: 50%;
+          border: 6px solid #e3b82a; }
+    /* line 56, src/styles/components/_report.scss */
+    .report-root .radios label {
+      color: #a0a0a0;
+      margin-left: 1rem; }
+
+/* line 33, src/styles/index.scss */
 :root {
-  --blue: #58FFFF;
-  --blue40: #58FFFF40;
-  --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58FFFF;
-  --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58FFFF;
-  --blueRadialGradientTrans: radial-gradient(circle, #58FFFF 0%, rgba(255, 255, 255, 0) 100%);
+  --blue: #58ffff;
+  --blue40: #58ffff40;
+  --blueBackground: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;
+  --blueRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(1, 153, 163, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #58ffff;
+  --blueRadialGradientTrans: radial-gradient(circle, #58ffff 0%, rgba(255, 255, 255, 0) 100%);
   --elecColor: #d87b39;
+  --elecColor40: rgba(216, 123, 57, 0.4);
   --elecCompareColor: #e2bca1;
   --gasColor: #45d1b8;
+  --gasColor40: rgba(69, 209, 184, 0.4);
   --gasCompareColor: #a8f7e9;
   --waterColor: #3a98ec;
+  --waterColor40: rgba(58, 152, 236, 0.4);
   --waterCompareColor: #abd4fa;
   --multiColor: #e3b82a;
   --multiCompareColor: #ffd597;
+  --redPrimary: #d25959;
   --greyBright: #e0e0e0;
   --greyDark: #7b7b7b;
-  --textBlack: black;
   --textWhite: #ffffff;
-  --textBright: #e0e0e0;
-  --textDark: #a0a0a0;
+  --softGrey: #a0a0a0;
   --darkLight: #25262b;
   --darkLight2: #121212;
   --textFont: Lato, sans-serif;
-  --greyBackground: linear-gradient(180deg, #323339 0%, #25262B 100%);
+  --greyLinearGradientBackground: linear-gradient(180deg, #323339 0%, #25262b 100%);
   --multiColorRadialGradientTrans: radial-gradient(circle, #e3b82a 0%, rgba(255, 255, 255, 0) 100%);
   --elecColorRadialGradientTrans: radial-gradient(circle, #d87b39 0%, rgba(255, 255, 255, 0) 100%);
   --waterColorRadialGradientTrans: radial-gradient(circle, #3a98ec 0%, rgba(255, 255, 255, 0) 100%);
@@ -2965,10 +2998,10 @@ p {
   --gasColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(4, 106, 88, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #45d1b8;
   --waterColorRadialGradient: radial-gradient(105.25% 64.58% at 49.68% 70.83%, rgba(2, 93, 174, 0.5) 0%, rgba(255, 255, 255, 0) 100%), #3a98ec; }
 
-/* line 62, src/styles/index.scss */
+/* line 69, src/styles/index.scss */
 .application {
   overflow-x: hidden; }
   @media only screen and (max-width: 768px) {
-    /* line 62, src/styles/index.scss */
+    /* line 69, src/styles/index.scss */
     .application {
       min-height: 100vh; } }
diff --git a/src/styles/index.scss b/src/styles/index.scss
index de482173597c003adbeffa5ee9a58d2858891970..669fed4245dd9ba9cc9afc53831d82ff1523481f 100644
--- a/src/styles/index.scss
+++ b/src/styles/index.scss
@@ -1,7 +1,7 @@
 /* Cozy UI utilities classes */
 @import '~cozy-ui/dist/cozy-ui.min.css';
 /* Cozy UI React components styles */
-@import '~cozy-ui/react/stylesheet.css';
+@import '~cozy-ui/transpiled/react/stylesheet.css';
 /* App styles */
 @import 'base/layout';
 @import 'base/color';
@@ -9,7 +9,7 @@
 @import 'base/typography';
 @import 'components/card';
 @import 'components/form';
-@import 'components/button';
+// @import 'components/button';
 @import 'components/konnector';
 @import 'components/fluid';
 @import 'components/navigator';
@@ -26,6 +26,10 @@
 @import 'components/auth';
 @import 'components/feedback';
 @import 'components/version';
+@import 'components/report';
+@import 'components/oldDataModal';
+
+@import url('https://fonts.googleapis.com/css2?family=Lato:wght@400;700&display=swap');
 
 :root {
   --blue: #{$blue};
@@ -47,14 +51,12 @@
   --redPrimary: #{$red-primary};
   --greyBright: #{$grey-bright};
   --greyDark: #{$grey-dark};
-  --textBlack: #{$text-black};
-  --textWhite: #{$text-white};
-  --textBright: #{$text-bright};
-  --textDark: #{$text-dark};
+  --textWhite: #{$white};
+  --softGrey: #{$soft-grey};
   --darkLight: #{$dark-light};
   --darkLight2: #{$dark-light-2};
   --textFont: #{$text-font};
-  --greyBackground: #{$grey-background};
+  --greyLinearGradientBackground: #{$grey-linear-gradient-background};
   --multiColorRadialGradientTrans: #{$multi-color-radial-gradient-transparent};
   --elecColorRadialGradientTrans: #{$elec-color-radial-gradient-transparent};
   --waterColorRadialGradientTrans: #{$water-color-radial-gradient-transparent};
diff --git a/src/targets/browser/index.ejs b/src/targets/browser/index.ejs
index bdf2f0019af810c65ab3a61673e6efa7bb006943..bfc23cc73c5da1e239d26607eb8e64159742b302 100644
--- a/src/targets/browser/index.ejs
+++ b/src/targets/browser/index.ejs
@@ -1,64 +1,38 @@
 <!DOCTYPE html>
 <html lang="{{.Locale}}">
-  <head>
-    <meta charset="utf-8" />
-    <title><%= htmlWebpackPlugin.options.title %></title>
-    <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
-    <link
-      rel="icon"
-      type="image/png"
-      href="./favicon-32x32.png"
-      sizes="32x32"
-    />
-    <link
-      rel="icon"
-      type="image/png"
-      href="./favicon-16x16.png"
-      sizes="16x16"
-    />
-    <link
-      rel="manifest"
-      href="/manifest.json" 
-      crossorigin="use-credentials"
-    />
-    <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2" />
-    <% if (__TARGET__ !== 'mobile') { %>
-    <link
-      rel="stylesheet"
-      type="text/css"
-      href="//{{.Domain}}/assets/fonts/fonts.css"
-    />
-    <% } %>
-    <meta name="theme-color" content="#ffffff" />
-    <meta
-      name="viewport"
-      content="width=device-width, height=device-height, initial-scale=1, viewport-fit=cover"
-    />
-    <% _.forEach(htmlWebpackPlugin.files.css, function(file) { %>
-    <link rel="stylesheet" href="<%- file %>" />
-    <% }); %>
-    {{.ThemeCSS}}
-    <% if (__TARGET__ === 'mobile') { %>
-    <meta name="format-detection" content="telephone=no" />
-    <script src="cordova.js" defer></script>
-    <% } else if (__STACK_ASSETS__) { %>
-    {{.CozyBar}}
-    <% } %>
-  </head>
-  <div
-    role="application"
-    class="application"
-    data-cozy-token="{{.Token}}"
-    data-cozy-domain="{{.Domain}}"
-    data-cozy-locale="{{.Locale}}"
-    data-cozy-app-name="{{.AppName}}"
-    data-cozy-app-slug="{{.AppSlug}}"
-    data-cozy-app-name-prefix="{{.AppNamePrefix}}"
-    data-cozy-app-editor="{{.AppEditor}}"
-    data-cozy-icon-path="{{.IconPath}}"
-  >
-    <% _.forEach(htmlWebpackPlugin.files.js, function(file) { %>
+<head>
+  <meta charset="utf-8">
+  <title><%= htmlWebpackPlugin.options.title %></title>
+  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
+  <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32">
+  <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16">
+  <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">
+  <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#297EF2">
+  <meta name="theme-color" content="#ffffff">
+  <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, viewport-fit=cover">
+  <% _.forEach(htmlWebpackPlugin.files.css, function(file) { %>
+      <link rel="stylesheet" href="<%- file %>">
+  <% }); %>
+  {{.ThemeCSS}}
+  <% if (__TARGET__ === 'mobile') { %>
+  <meta name="format-detection" content="telephone=no">
+  <script src="cordova.js" defer></script>
+  <% } else if (__STACK_ASSETS__) { %>
+  {{.CozyBar}}
+  <% } %>
+</head>
+<div
+  role="application"
+  class="application"
+  data-cozy-token="{{.Token}}"
+  data-cozy-domain="{{.Domain}}"
+  data-cozy-locale="{{.Locale}}"
+  data-cozy-app-name="{{.AppName}}"
+  data-cozy-app-slug="{{.AppSlug}}"
+  data-cozy-app-name-prefix="{{.AppNamePrefix}}"
+  data-cozy-app-editor="{{.AppEditor}}"
+  data-cozy-icon-path="{{.IconPath}}"
+>
+<% _.forEach(htmlWebpackPlugin.files.js, function(file) { %>
     <script src="<%- file %>"></script>
-    <% }); %>
-  </div>
-</html>
+<% }); %>
\ No newline at end of file
diff --git a/src/targets/browser/index.tsx b/src/targets/browser/index.tsx
index 4f4bec2047d1c8ec1a0f1eff46c883f5bfb63907..f9fdb9294bab2dec0beceb7e8805483103558202 100644
--- a/src/targets/browser/index.tsx
+++ b/src/targets/browser/index.tsx
@@ -1,77 +1,89 @@
+/* eslint-disable @typescript-eslint/no-var-requires */
 /* global cozy */
 import '../../styles/index.scss'
 
 import React from 'react'
-import CozyClient, { CozyProvider } from 'cozy-client'
-import { render } from 'react-dom'
-import { I18n } from 'cozy-ui/react/I18n'
+import CozyClient, { CozyProvider, Client } from 'cozy-client'
+import ReactDOM, { render } from 'react-dom'
+import { Document } from 'cozy-doctypes'
+import { I18n } from 'cozy-ui/transpiled/react'
+import { initTranslation } from 'cozy-ui/transpiled/react/I18n'
 import schema from 'doctypes'
 
 const manifest = require('../../../manifest.webapp')
 
-let appLocale
-const renderApp = function(client) {
+const renderApp = (polyglot: any, lang: string, client: Client) => {
   const App = require('components/App').default
+
   render(
-    <I18n
-      lang={appLocale}
-      dictRequire={appLocale => require(`locales/${appLocale}`)}
-    >
-      <CozyProvider client={client}>
+    <CozyProvider client={client}>
+      <I18n lang={lang} polyglot={polyglot}>
         <App />
-      </CozyProvider>
-    </I18n>,
+      </I18n>
+    </CozyProvider>,
     document.querySelector('[role=application]')
   )
 }
 
+export const getDataset = () => {
+  const root: any = document.querySelector('[role=application]')
+  return root.dataset
+}
+
 // return a defaultData if the template hasn't been replaced by cozy-stack
-const getDataOrDefault = function(toTest, defaultData) {
+export const getDataOrDefault = (toTest: string, defaultData: string) => {
   const templateRegex = /^\{\{\.[a-zA-Z]*\}\}$/ // {{.Example}}
   return templateRegex.test(toTest) ? defaultData : toTest
 }
 
-// initial rendering of the application
-document.addEventListener('DOMContentLoaded', () => {
-  const root = document.querySelector('[role=application]')
-  const data = root.dataset
-  const appIcon = getDataOrDefault(
+const initApp = () => {
+  const supportedLocales = ['fr', 'en']
+  const data = getDataset()
+
+  const iconPath = getDataOrDefault(
     data.cozyIconPath,
     require('../vendor/assets/icon.svg')
   )
-
   const appNamePrefix = getDataOrDefault(
     data.cozyAppNamePrefix || manifest.name_prefix,
     ''
   )
   const appName = getDataOrDefault(data.cozyAppName, manifest.name)
   const appSlug = getDataOrDefault(data.cozyAppSlug, manifest.slug)
-  // const appVersion = getDataOrDefault(data.cozyAppVersion, manifest.version)
   const appVersion = manifest.version
+  // FIX cozyLocal
+  const userLocale = 'fr' // getDataOrDefault(data.cozyLocale, 'fr')
+  const polyglot = initTranslation(userLocale, lang =>
+    require(`locales/${lang}`)
+  )
 
-  // appLocale = getDataOrDefault(data.cozyLocale, 'fr')
-  appLocale = 'fr'
-
+  const lang = supportedLocales.includes(userLocale) ? userLocale : 'fr'
   const protocol = window.location ? window.location.protocol : 'https:'
 
-  // initialize the client to interact with the cozy stack
+  const token = data.cozyToken
+
+  // initialize the client
   const client = new CozyClient({
     uri: `${protocol}//${data.cozyDomain}`,
-    token: data.cozyToken,
-    schema,
+    token,
     appMetadata: {
       slug: appSlug,
       version: appVersion,
     },
+    schema,
   })
+  if (!Document.cozyClient) {
+    Document.registerClient(client)
+  }
 
-  // initialize the bar, common of all applications, it allows
-  // platform features like apps navigation without doing anything
+  // necessary to initialize the bar with the correct React instance
+  window.React = React
+  window.ReactDOM = ReactDOM
   cozy.bar.init({
-    appName: appName,
-    appNamePrefix: appNamePrefix,
-    iconPath: appIcon,
-    lang: appLocale,
+    appName,
+    appNamePrefix,
+    iconPath,
+    lang,
     replaceTitleOnMobile: true,
     cozyClient: client,
   })
@@ -79,5 +91,8 @@ document.addEventListener('DOMContentLoaded', () => {
   const { setTheme } = cozy.bar
   setTheme('primary', { primaryColor: 'transparent' })
 
-  renderApp(client)
-})
+  renderApp(polyglot, lang, client)
+}
+
+// initial rendering of the application
+document.addEventListener('DOMContentLoaded', initApp)
diff --git a/src/targets/services/createEmail.ts b/src/targets/services/createEmail.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fa1ce450da6a4ac2b691c932d5c851d4b4eeb5d6
--- /dev/null
+++ b/src/targets/services/createEmail.ts
@@ -0,0 +1,363 @@
+export const createEmail = (
+  username: string,
+  url: string,
+  period: string,
+  monthlyPerformance: string
+) => {
+  return `<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional //EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+  <html xmlns="http://www.w3.org/1999/xhtml">
+    <head>
+      <title>Votre bilan hebdomadaire</title>
+      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+      <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+      <style type="text/css">
+        @font-face {
+        font-family: 'Lato';
+        font-style: normal;
+        font-weight: 400;
+        src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v11/qIIYRU-oROkIk8vfvxw6QvesZW2xOQ-xsNqO47m55DA.woff) format('woff');
+        }
+        /* Fonts and Content */
+        body,
+        td {
+        font-family: "Lato", sans-serif;
+        font-size: 14px;
+        }
+        body {
+        background-color: #FFFFFF;
+        margin: 0;
+        padding: 0;
+        -webkit-text-size-adjust: none;
+        -ms-text-size-adjust: none;
+        }
+        h2 {
+        padding-top: 12px; /* ne fonctionnera pas sous Outlook 2007+ */
+        color: #ffffff;
+        font-size: 22px;
+        }
+      </style>
+    </head>
+    <body style="margin:0px; padding:0px; -webkit-text-size-adjust:none;">
+      <table
+        width="100%"
+        cellpadding="0"
+        cellspacing="0"
+        border="0"
+        style="background-color:#000000"
+        >
+        <tbody>
+          <tr>
+            <td align="center" bgcolor="#FFFFFF">
+              <table cellpadding="0" cellspacing="0" border="0">
+                <tbody>
+                  <tr>
+                    <td class="w640" width="640" height="40"></td>
+                  </tr>
+                  <!-- entete -->
+                  <tr class="pagetoplogo">
+                    <td class="w640" width="640">
+                      <table
+                        class="w640"
+                        width="640"
+                        cellpadding="0"
+                        cellspacing="0"
+                        border="0"
+                        bgcolor="#000000"
+                        >
+                        <tbody>
+                          <tr>
+                            <td class="w30" width="30"></td>
+                            <td
+                              class="w580"
+                              width="580"
+                              valign="middle"
+                              align="center"
+                              >
+                              <div class="pagetoplogo-content" style="color:#FFFFFF; font-size: 30px; font-weight: bold; margin-top: 15px; margin-bottom: 15px;">
+                                <img
+                                  class="w580"
+                                  style="text-decoration: none; display: block; margin-bottom: 10px;"
+                                  src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAADDKSURBVHgB7d1fjF3VlefxdW+VXcb/HWMaCAzXPbaZuJKeYtJEbdrTsV9iK610QMI89AtG4SmJBCYiQuoYyhkeRokC5iGZFyJs9UsLIwUekgkZRS6SBo+SbuGoZTQzzQzl4CbGDnL997+698xZp+rY1+Uqu27VvXuvvff3I1W7MBDowq7922uvvXZFACQnOyo1WSav/N9fyuDlSTnwmX4ZFABJqQqApGTvyBOyVN6VTHZkmezt7pJ3/9d35UkBkJSKAEhC9mvZId3ynC785c+9/8urfz7/ZjB4uS47qQYAaSAAAJHLy/1rpSdf+OX6XX5zALj6N8jBsYYcuK9fhgRAtDgCACJW7Pp78nK/tFDir8iTq/Jjgf/zXdkrAKJFBQCIUNnk11zun82sFYAmlYocokkQiBMVACAyzU1+skhlk+C//pfiCAFARKgAAJEoyv1d8mL+ad98/56bVQCa0SQIxIUAAATuRk1+N9NKALj6D5SDkw15iSAAhI0jACBgebn/wZab/BarIk8u6ZKjNAkCYaMCAARovk1+N7OgCkATmgSBcFEBAAKi5f7sWF7ub1OT32JNNwl+QJMgEB4qAEAgppv8Xsk/rUmbLLYC0EybBOt12Xdvv7wuAMwjAADGFeX+nqK7/0Fps3YGgBLHAkAYOAIAjLqm3N+Bxb9TmB0AhIEKAGBQJ8r9s+lEBaCZHgs0Mjmw5Vk5JABMIQAAhrSru3++Oh0AShwLAPYQAAADimE+y+SJfOHvF4dcBYArGCIEmEEPAODZ9Oz+D1wv/l4wRAgwgwoA4Imrc/4bcV4BaEJ/AOAXAQBwrFj4u+U5C4N8fAaAJq9P1mUfxwKAWwQAwJHpBj9d+PeKEUYCQIFGQcAtAgDQYVca/BryZP47bq0YYikAXEGjIOAEAQDoEMsLf8lkAJCp/oBM5NDm/XJAAHQEAQDogKKzX7v6jS78JasBoESjINA5BACgjbK38/P9SjECtyYBsB4ASgQBoP0IAEAbWOrsb0UoAaBEEADahwAALEKoC38ptABQIggAi0cAABYg9IW/FGoAKBEEgIUjAAAtiGXhL4UeAEoEAaB1BABgHmJb+EuxBIASQQCYPwIAcAOhdfW3KrYAUCIIADdHAABmCGGAT7vEGgBKBAFgbgQAYFpKC//IeFWeO7ReRk+L7P38Obl91aTErJwsOFmXw4wYBqYQAJC86Ud6Hk1h4Vcv/3SNvHBknYxMVIs/1sVfQ8Due0clBTw6BEwhACBZsTb2zeVf/t/Soe/+/fq1x07cMuuf1yBw8CsfRV8NKGkQyCbl8OZ+GRAgQQQAJCf7lTwoS4pZ/TskAVru1x3/yz9bM6+//uE/G5aHPzucTBDIDWSZHKZPAKkhACAJKZ3vN3t1YKX0H7r1Srl/vlI7FlBlw2C9IQMcDyAFBABErSjzL5GvSr24zpfMwn/sxDJ54bV1Mle5f7423XpRnv/SxylVAwp6PNCYlJe29MtxASJFAEB0it3+0rzMX5VHUynzl1ot98+XVgJSuC0wC44HEC0CAKKRvS19+aL/1dTK/KWZ3f3tluKxQEmPB/L/M8DtAcSEAICgFbv9rqLMn0xT30xa7u8/vF5ODPaICxoEvvnAH2V7bUISRVUAUSAAIEjTV/i+mOpuX5060y37/tuGRZ/zL1TCxwIFqgIIHQEAwSh2+0tkb77j/2qqu32l5/x6xq/lfgsSvDY4m6IqwA0ChIQAAPOK3X7XdIk/0d1+qWjwy8/6O3XOv1Ap9wfMxIAhhIIAAJMo8V9Lz/n3/eg2OXW2WywjCFxVHhFwnRBWEQBgRnaseHL30fxjR8ol/mbtus/vms4PePqvzg7du+FS8uFNFY8RZfLSZENe54gAVhAA4BXn+rPz3eDXLqk3Cs6BfgGYQACAcyz6c9OF/wf5Of+Rt1ZJTAgCcyIMwBsCAJwoyvt1eZBFf3ZlZ7/FBr92IgjcEGEAThEA0DFXGvk4059TKgt/M138NQjs3jJKEJjb8UZD3qhk8joNhOgUAgDapijtd0tfio/vtCrFhX+mMgg89vlzQ5nwa2Uu5W0Crhai3QgAWJRrzvMb+eLPon9DLPzX4+rg/OXfsDUs6VHBGxwVYLEIAGjJNbv8RlHW7xPcFAv/zREEFuR4frw2kP9efIPqAFpFAMBNFa/sZcU0Pnb5LWLhbx1BYFEG8t+rb2R5dYDeAdwMAQDXubLgawNfnfG7C8HCv3gaBL66dWRo578fW0uzYOvK44L89/JbBALMhgAAFvw2YuFvP24NtAeBADMRABJz5Qy/vJ5HSb8tWPjdYI5A+0wHAr1u+FY1k4Gx/PP7+mVIkAwCQOSazu//4/Rd/JqgbX7/cffQi6+tW/vmb1ew8DtEEOiY45WKHM8rBL+jShA/AkAkip390mJx7ysW+0YxfKfG7r4zQn2kJzbF0UD+0XfHBUHH6LHB8bxa8Lv8+8pxQkE8CAABKhb7nqJ8X5ve2etVPK7jOcDCb1Pfnedl95Yxbg64oyFgUPsJNBRwfBAmAoBhxfx8Xdx1oe+We6Y/58zesfJ8/9WBVXLqbLfArvIK4fbauKzsaQjcKXsKtFqQ/+FJgoF9BADPrind6/l8dXqhp3zvHY194dIgoFUB+gT8uxIM8h8bjfwYIQ8I+e+mIcKBfwSADit28Y1iIddFfW2xk5fi52os8jZR5o8LfQJ2TYeDQZk6TtAfT+YhYZCA4AYBYAGKXfuy/EMX9kqxkOsirufxa4rPp87kp34OQdDdvpb43/yn5Sz8kWLCYJg0IFSmQsKQhoRGJsOVSv5zjal3EPJDucGNvImwIMkFgCuLt2pML+KqOr1YZ8WivvbKYj6lXORZ1CNzYnCp6BU+yvzp4HggXtNhQasGxUceFIbqdTmpf65aKaoNQ1lDhqpytbLQPRUu9CeGUqs4mA4AVxbryelFt6vYXU8tyuVCrapFWb1Uu/Lnr31itCbANMr8UNwewGw0RDSmQ8J09WHq5ytXP58ZLPTz5nChPzee/72WQ4XtAPCOHMp/eFSANqCpD3OhKoBOyAPDoU3fkcfEKNt3mqp5GZ6bPFgEXfR1t//yf1/Dbh9zOj3aLT//36uKD6oCSIXtAJDRIY+F0UVfz/a1sY/dPlpx/KNbio9D/7yuCAMPf25YNq2/JECrssz20TNTTRAN3e3//f9YPTTwu1vWstvHYjVXBe5YfXno0f80tFYDAUcEmK9MbG9irVcAagLcwCwlfqpGaLs/jCxZ+18HNhSf65TB7bUJjghwU1Xj349sNwG+LecYlIPZUOKHbzpqWMMAQ4YwF71BsGm/bBSjrN8CyASYxqIPq8pbBIQBzLR5v911lgAA03TRP/beLVzdQzA0DJSVAZoHMVaXdVZnAZgNANMv4X0gSE656L/61io5dYY+VYSLMICuitT+9DtTQ4OssfvddWrOPhJBeR8x0psEr/3LmuKDYwJYYzsAdAkipd375Rx+Fn2koPlaYRkGyhsFiFc9K5oAqQAgbc0v7p34oIdFH8lqDgOqDALMGYhPo273JpvdAFBlBkAMyvP8Y+8tYxQvMId/HFxRfKhN6y/mQeCCbN84zlFBBCpVAkDrMnoAQqS7/J//dnmx6L/5mxXs8oEWvf9JT/GhfQM6a6DvjvNUB9ARdgMAA4CC0HyW//N/WkHXPtBGYxers1YHNAxodUADAmyz/B4A363RknLBp6wPuNdcHVAaBPR6IccFdlUMjwO2XAGoCbxr3uGfOLmU5j3AkPLlwuZAoEGg79N5MPjUJSoEBlS7ZI0YZbkJcI3wa9e58gz/vcGeYod/Iv8RQBjKQCD/vK7447JCUP5IDwGa2W4CREeVu3td5HV3r2V9zvCBeMysEGgAKPsINt16kWMDB+gBgAlTi/1SdvdAonT+gH6UTYWqrA4UH3koYGRxe2X0ACyA4dRkne7sPzzbLcff7xn611NL1+pi/+GZJZzdA7jOlWODJs1HBtOVAn3MhqrsAlQJAAvAHIB50ZK9lu/f/7elQ+9/tGTtjDI+v2EBtGyWULBWjw6mjhCmKgXl5wiX3dcAeQr4inJHr+X7U2eXFJ+/l3/Orh6AbwSDm9u83+ZaSwAwolzkT+UfurDrrr5o0jvZQ2MegOBoELh91eUrRwn6efHjysnkrieO1WXdff0yJMaYXFmyY1KLbfnXRXw4362XC7z+qH/MTh5AjMqGw5n9BUoDgFYOVi5tTIeDqYBQ/HyE8wvWdBezAAgA89II4/xfd+j6US7sw+PVKyV6pYv78EQXO3gAaKIjjmcLBs2uhILpkFD8uHrqjzUgFJWE6c+xMHYDQJc4U96H1124LuJTP9dV/HG5wBeL/YSW6ZcUf55FHQA6p6wgzMdUQKhfCQPlMYMGhJ7ubGjd8sm15V+nXFcZ6plszH84KcawisnU/fg9B+4UAEB4poLCnMvZdbehDv7NR06HIDXqNm9k2Tx4rjIDAADQGXoE4VKlSgCYP8djgMszewBA/MYuOjxjFj3VJgDMX8XtF0vP+wEAaRi75LgCYPRtG6t3z9wGAK7gAUAynB8BUAFogfMKAAEAAFLhugJQ7ZI1YpDVJkCnXywqAACQDtcVAKtoAswNj9EDAACpcF0ByIy+bksAyI2c59lBAEiF8wBAD0BL3AYAKgAAkAznPQAEgBa4PgKgBwAAkuF6DgAVgFZwCwAA0CEemgAJAPORHXX/heIWAACkw/URgHq3314IsLfyLWP3DwDoLNdVgDXd9mYB2Fv9Jt1el2D3DwDpcV0FmJiUdWJM8qvfh2d4CAgAUuM6APR0cQRwc0YfTQAAxINhQBYDQBcvAQIAOuv0yBJJncUjgJo4NDzBFEAAQGdRATDo1FlSIACkxsdVQGvsfQUqNh9NAADEw/U1wK4uuUeMoQJwllsAAJCa06N877dYATCXkgAAWAx6AAz6kAoAACTnj+PdQ+KQxQeBLM4BqAkAAB006XjmjMUngakAnOEWAACk5vQo3/uTnwMAAECnZQbXNm4B0AMAAMnxcQvA2pPApgJAdozdPwAgTtaeBLZVAWi4TUfs/gEgXanPAkg6AAyPMQoSAOBGPZONYkjSK+DIBAEAAFJ1esxtBaBRpwdgblV6AAAAbrh+D6BSJQDMzfFgBqYAAkC6xi52iUsNY8OAbAWAitsvzsi42//4AIB0VTICwI24DQD0AABAslzfAqhQAbiBir1ZyQCAOI1dcrsEVruYAzC3qtsvDnMAACBdrpsA6w1ZJ4Yk3QQ4PEYPAADAjWqFCsDcHAeAkfMVAQCkyfUcgIwegBuiBwAA4ITzHgACwA24ngNwhvegASBVrucAUAG4EedzALgGCABwhgAwm+yo+y8McwAAIF0+XgN8t99OCLCzAi7j/B8A4Jbrq4Bruu3cBLATABw/BcwMAACA60bAiUk7swCSDQDDY5T/AQBu9XRxBHC9jHcAAABuuZ4F0KgTAK5nKBUBANLgugegUiUAXM/1DAB6AAAgea5nATQMXQW0EwB4CRAAELlKRgCYjeNbAEwBBIDUuZ4FUKECMAsqAACAyFW7mANwvarbLwpzAAAAPqYBWpFsEyAAAK5lmdTEiGQvw3MLAADgehKgpRcBLVUAagIAgEOuA0CVAODfyJjbu58AAHtOj6Z7I8xSAKiJQ8OMAgYAOJYJPQDejYwTAAAgda5HAVti4v/z7Kj7MxEeAwIAuO4BUO/22+gDsLEKLuMKIADAD9dVgDXdNoYB2QgADddjgLkCCACY4qMKYEGSAQAAAF/qmWwUA5KMPR+eoQIAAJhyesztmtCo0wNwVZUhQACANFSqBABvRsYZAgQAmHJ6JM1hQFYCQE0cGp6oCAAAPjSMjAOmAgAAgEMVI6/fphkAGAIEAJh2etRtE2CFCkCTCk2AAIA0VLsYBOQNg4AAACXXFQArrFQA7hEAABJQb8g6MSDJCsDwGE2AAAA/qhWOALwZOc81QADAFNeTADOaAJtkNAECANJQJQD4M8IRAABg2ulRJgH643gowjBzAAAAnnAE0KzCc8AAgGQQAHxhDgAAoMQcAE+yo+z+AQBpebff/9rnvwKwjAAAAEjLmm7/swCSq3tQ/k/HXbdNyrat5+XuDZOyECcGl+YfPfyaARKgxwC3r1rY94pQ+f/ONik14VYe2mT18oY8/tfD8sgXR4sA0A4aBF7+2Ro5duIWwgCAtpiYLMYBnxSPkvtuNjzGFcAY6cL/1CPn5PEvD0u79dYuyYtfP1ss/q8OrJIXjpgY4w0gYD1d9AA4N8IMgOj01i7KL75/qiOLf7O78qOEp/ack//5w98XnwOIh+txwBawGiJoe3aMypvf+zenC7L+s17r/0h677koALAQjToVAP03qAmwALvuHy9K8z5oCDjS/wdCAIAFqVQJAM59SBNXFHQB9rX4l1avaMiPv/1x0X8AIGynR9J7D4AjAARJS/C6APtW9gUAQGgsBICaAC3Qc39LTXh67VDnDQDAfGWZ/7UvvVsA4wwdCN23DO64qQIAYRu7lF5BnGuACIpe+bN4BW9b7wV6AYCAjV0kAACm7bp/Qqza/YVxAYD5qBh4Eth/AKjQA4D5s3zWvvWeSwIA81Ht8v8YUHIVAGa5h+3u2+xO4Lub6YBAsPQxoNRwBICgWB7B27uRoUAAwkEAAAAgQRZ6AO4RAAASUm+I92dFGQUMAEie6zkA1QpNgAAAeMcgIAAAkAQCAAAACfIfADL/05AAAHCpYuAhPAsVAKcBYGSMx4AAANeiByABwzwGBACYYexieptDVkMAABJEAAAAIEEEAAAAEkQAAAAgQVwDBADAsUz8r30WHgMiAAAAUkMAcO0UjwEBAGY4PZre2kAPAAAACSIAAACQIAIAAAAJIgAAAJAgAgAAAAkiAAAAkCACAAAACSIAAACQIAIAAAAJIgAAAJAgAgAAAAkiAAAAkCACAAAACSIAAACQIN7GBYAm23rPS+89l+SuDZOyekW9pb93ZLyreHL8xMmlcuzELQJYRgAAkDxd7B//8rA8smM0X/Qb0g4j41X5+W+XywtHPlWEAsAaC78qB/OPmjiyenlDRiY4+QAw9f3gqUfOFYt/2/+38yDxyI6x4uPVgZUEAeNWLm1P8GvBkHiW3ErYrnQPIGy9tYvyi++f6sjiP5OGgNf6P5Jd948LbFrZ43ZtqBAAAMC9PXmp/8hzfyhK/67oP+vHT38sT+05J4AFBAAASdGd/4tfP+utGqgBwEXVAbgZAgCAZJS7cN80BPTec1EAnwgAAJLxrXzhdVn2n4tWH174xlkBfCIAAEiC3u/Xs38remuXTP37wK0GTYCirZCD4tDdt10WAOl56mF7zXf0Athx+yq3awO3AADAAS37b+u9INZoFWDb1vMC+EAAABA9Lf9btev+CQF8IAAAiN4DW+3t/kt6LRHwwX8AyOSkOHS3gQ5gAG7dtcFu78/dt/E9yQLXo4AbmXhvAKECACB6lhdZC9cS4T4AdFXFe1cqAQAAgAQRAAAAyXP9GFCjzhGA9gAMikOU2wAAM7k+AsiYAwAAAHywUAFwmoJWL/fzAhgAwK6lXZn3HblrFkYBuw0AK+oCAECzTy2vrxWHKo7H4M+GIwAAABLkPwDU3VYA1izPBACAZrevdvwYEBUA4QgAAAAP/AeAKk2AAAC4llwAWLOSAAAAuNbtK93OiOmqyAfiGU2AAIDkuR4EZIH3AFDZxiRAAIBfrkcB/+l33L6EO5tuSZD2AYxMUPxAmu66bVLu3nC5pTA8Ml4tfs+c+KCH3zuIToq7f2UlAAzmHzVxZPUKAgDSsq33vOz54qjsvn+i+PW/GKfOdss7J5bJkbdWybETtwgQOte7/4r4vwKokqwArMkrAKcEiN+eHaPyrT3n2nr0pf9bj+wYKz40DPzgyDo5MrBKgFCt7EnzeriNAKADETKHFYCVzAJA3HSRfvHrZ/Kd/wXppKl/zlnZtvW89B+6lcoaguThJcBBMcDG71bHw4DuphEQEdNF+bX+jzq++DfTasAvvn+KJlsEKdUeABsBoCHDAmDRysXfx0Ls858NLIbrAGBhDLCyEQAcPwnMNyjEyMICrP/sHz99WoCQ3L7K7e+ZRt3GptfKgR3jgIFFanez30L11i7JU/m/CxAK17cAMsdr3lysBIBBcYgHgRAbXfi149+Kx788TKUNwbh9VXovAaokW3ZpAkRsDuz9o1iiswY0BAAhcF4BaFABuKrhNg3dfRsBAPHQnfau+yfEmkfyigTHbQiB6ybAahcB4Kpux0cAfFNCRHTKn0VaBeitXRTAOtcvAV6sEwCuuuC4CXAFAQDx2H3/uFhlsTIBzOT6COAyg4Cuqux0n4ZoUEIs7jJ8pEW/DaxzfQVQ3ddPBWCmQXFoDccAiETvPZfEqt6NHAHANuc3AIzs/pWlAMAwIACAU6m+A6DsBICq65sAblMfAMAe51MAMzuj7+0EAMfvAVABAAA4fwcgowJwvYxpgAAAtzbd6rZPxcoYYJVsEyDdyQAA11cArYwBVnYCgOPBCEwDBAC4HgJEAJjNEjkuDtEDAABw3QRoZQqgshMALjAMCADgjo8hQFamACozAaCYBpi5DQEMAwKAdLkeApQbsjIFUNl6Dtjx2QhTygAgXa7P/y0NAVK2AoDjYUAcAQBAulwfAWSZnBRDbAWAutsvzl0bmAYIAKlyPQPA0hAgZSsAOP7iWH5EBQDQWa5nADQMXQFUtgJAw/V7ABwBAECqNn3K7Saw0iAAzM3xLIDVKxqympsAAJAcfQPAdQXA0hVAZSsAeJgFwEhgAEiP6/N/9dl+t5vcmzEVAIpZAMJVQABAZ7l+BVAMPQJUslUBmOL0i7SVRkAASM6m9c6/95va/SuLAeB34hDPAgNAepxfATR2A0DZCwANtynpgd4LAgBIi+shQJMNt5vb+bAYAAbFIaYBAkB6XB8BWLsCqOwFgCXuz0kIAQCQDh83AKxdAVTmAkBlm/sv0gO95wUAkAbXjwApa1cAlcUmQDUoDnETAADS4br8nxm8AaBsBoCq2y8Ww4AAIB19n3Zb9bX2CmDJZgBw/Cogw4AAIB3OjwAyKgCtcPrF0iZA3gQAgPjpBEDXVwAJAK2oyoA41lujCgAAseMGwFUmA4CPmwC9NRoBASB2HkYAm7wBoKweASinX7CtVAAAIHp9dzpuADR6A0BZDgBOxyYyEhgA4uf6/N/qDQBlNwA0aAQEALSPNgB6mAEwIEbZDQAeuiZpBASAePloAOyqcATQukkfAYBGQACIVd8d7o96x+oEgJZVdsqQOL46sW0rfQAAECvnEwBFjt/XX6xlJlluAlRviUPbeBQIAKK16VOOz/8NNwAq2wHAcSPg6hUNngYGgAjp+f/KHreN3pYbAJXtAOChEZCngQEgPq53/8pyA6CyHQA8NAL+xVYCAADEpu9OGgBnMh0AfDQCMhAIAOLjYwKg5QZAZb0JUDltBNQeAPoAACAeOv3P9QTAqvHyv7IfABr0AQAAFm7TevcDgBoNt5vXhbAfALrkdXGMPgAAiMf22oS4dqlBBWDRiqeBM7fnKPQBAEA8XJ//54asPgHcLIQeAP23dP4wEH0AABA+H+f/YvgJ4GZhBIC6vCGO7b5/XAAAYeu7w/2Rbj1zv2YtRBgBwMNAoK28DAgAwdu+0f1mzvoAoFIYAUAHAjnuA9h9v/umEQBAe/l4AXDzftsjgEtBBIBiIFDV/bsA27gNAADB0uY/1/P/xfj8/2ZhVACUhzuV27gNAADB8nH9L4T7/6WQAsCAOEYFAADC5eH6n1SrVADarvKf8y+q4z4ArQCsXu68fAQAWCS9+rdpvfMXAIdCOf9X4VQAVNV9Z+UjO0YFABAWH9f/JJD7/6WwAoCHeQC7mAcAAMHxcf0vlPv/pbACgId3AXprlzgGAICArFza8NIAONkIp/yvggoAPt4F0OuAvQwFAoBg+Gj+y0QGQ5j/3yysCsCUw+LYHvoAACAYPnb/1UpYu38VXgCou/8i61RAjgEAIAzbax7O/yfDOv9XBIB54BgAAMKgi7+H6X8yEdAEwFJwAaAYC+yh1MIxAADY56P8nxu4r99tf1o7hNgD4Ol5YI4BAMA6H+X/LHPfm9YOYQYAD9cBOQYAANt8lf/rgV3/KwUZAIrrgB4mLj2155wAAGzafa/7o9osX4s+01+sScEJswKgPExcYigQANiks/+9nP8H9PrfTOEGgIaf2wC8DQAA9nia/S+XMjkkgQo2ABSvA4r7sgtvAwCAPbv/g5fyf3DT/5qFWwFQHo4B9InguzZMCgDABi3/991xQVwLcfpfs7ADQMP9bQDFMQAA2LH3834atEO9/lcKOgAUxwCZ++ELj395WAAANvh6/GfzfioAvr0kjmkz4LatfhpOAABX6d1/PQJwLfTyvwo/AHgawMBMAADwz8fdf3Vh0v3ms92CDwC+bgNoMyAzAQDAH193/0Pv/i/FcASg/zW8NGI8/tf0AgCALw9/zs/7O40s/N2/iiMAXJKD4gHNgADgj6eX/yTzdAOt3aIIAL6eCNZmwF33+/kFCAAp271l1EvzX24g1Nn/M8VRAVAenghWj385uCegASB4Pib/qdDv/jeLJwBclkM+ZgJoMyBXAgHAHb3372PynxqPpPyvuiUSegyQvVNUAR4Vx7QX4Nh7twg679WBlWLVyHiX+MDX5OZ+/psV+ZFdXRCH3VvGxIdKRQ7d1y/RlH0rEpHs17JDuuSoeLB1b01GJuIpqACARXru/w9/+3vxZGfo0/+aRbVi+ZoJoLgSCACd523ufwSjf2eKb8vqayZAfgzAYCAA6Bzd/fua/JevLQckMvEFAE8zAfRKIFUAAOgcb4t/rt6Ia/evogsAxUyAqp8uTaoAANA5evffB23+i+Xuf7M4u9Yu+xnTSBUAADrD4+CfqO7+N4syABTNgJ6eaqQKAADtt/fPaf5rt3jvrXmaDEgVAADay+fuP8bmv1K8AcDTZEBFFQAA2sfn7n/Ls/laEqloA0DRDCj0AgBAyHzu/quVOEv/pbhH13m6EqioAgDA4qzsaXjb/avLk/GW/1XUAcDnlUCqAACwOA9/btjb7j/Wq3/N4h9e7+lKoKIKAAALU0z92+Jv8M+FSX9rhyvRBwCfVwKpAgDAwujMf2+d/yIDn+2X4xK5NJ6v83iOo1WAuzZ4+0UMAMHxOvM/16jHv/tXSQQA31WAA4/+UQAA8+PrxT+lV//u7ffTO+ZaOg/Ye+wF2PWFCdm29bwAAG5s0/qLXnf/MQ/+mSmZAFD5qyLRDYonT+3xl2gBIBTP7/pYfIl98M9M6VQAlMdkt633guzZ4THVAoBxXkf+qoR2/6oiicnekQ/yH2riwch4Vf7iG/9ORibSyl0AcDO68B/8ykf+XvzT3f9+2SgJSW8l8pjwuBYIALPzOfSnkNjuXyVXAVA+qwBq19OflhMnewQAMLX7/4e//b34kuLuX6VZi/ac9Pr3fiIAgCnP7zotXiW4+1dJBoDKXxZdnoPiiTYE6oAgAEidNv5tWn9JfEmt879Zut1odXlMPNJrgbwTACBlWvr3+dpfIdHdv0o2APicDqi0IbB/LxMCAaTL87z/pHf/Ku37aJ7fen5kxxgTAgEkSUv/Xif+SdEF77US7FvSAcB3FUC9+I2zHAUASMrKnob30n+lIoc27/f7/d83JtJ4rgLoS4GMCQaQEt+lf3V5Mt2z/1LyAaCoAogcFo90OBBHAQBS0HfH+WLoj0+6+/9Mv7+bYFZQAVAX5UnJZEg84igAQOx01//MzrPi2RC7/ykEgFxlZ7H4e3suWHEUACB2Fkr/uZfY/U8hAJQuyUERv78o9Chg1/3jAgCxsdD1r9f+Nu+XfkGBADCtqALU/V8JefHrZ4tqAADEwsTAH5Xw0J/ZEACaWLgWqAOCXvz6GQGAWDyz44yF0v/rKQ/9mQ0B4HreqwC8FQAgFrrz77vzgvg2WZd9gmsQAGaobJNBC2UifTGQq4EAQlaU/j9vorn5AI1/16sIrpMdlbXSI+/mn9bEo1Nnu+VLT98lIxPkNABh0cX/4Fc+8l76L+b975eNguuwsszCSkOgNgPSDwAgRN/c9kcL5/40/t0AAWAO0xMCXxfPdn1hgn4AAEHRc//tGyfEN534R+Pf3AgAN1KRfb4nBCr6AQCEYtP6iybO/bX0z8S/GyMA3EDREFix8QtIRwUzHwCAZVryf37Xx2JCRuPfzdAEOA/ZMTma/2LaIZ6dGFwqu759lwCARS8/fCqvAFwSAwY275edghuiAjA/j1k4CuitXZL+Rz8RALDmmw98YmXxH5o00MQdAgLAPFg6CtD3AmgKBGCJNv35fuL3igql//niCKAFVo4C1J7+O+TYe7cIAPjUd8d5Ofg3fxAjKP23gApAa0wcBagfP/0xTYEAvNKmv2d2nhUjKP23iADQAktHAfpo0Gv9H8nq5Q0BANesTPorZZnso/TfGo4AFiB7R36S//CgGMDNAAA+GOr4Lwb+bPoOu/9WUQFYiIvFL7RBMUBvBjAuGIBLhjr+GfizCASABbDyVkBpz44xeWqPiRe3AETOVMe/FAGA0v8CEQAWqHgrIJOXxAgNAFwPBNBJuvgbed63dODe/f7fbAkVPQCLlL1TPBvcJ0bs++EGOfLWKgGAdtp976g8s8NMxz/P/LYBFYDFqshDVq4GqgN7P5Heey4KALSLPvBjafHPDdXr3PdfLALAIhVXA/ONtxih1wOP9P+BEACgLaau+5kZ9FPgyl97EADaoPKXcshSP4CGgB9/m0FBABanvOu/ssfOvJG89P/Slmfz77lYNHoA2iQ7KmulR46KoX6AU2e75eH+O4sfAaAV1gb9KM7924sKQJsUVwON9QNoBUCnBVIJANAKq4s/5/7tRQBoo6IfoJGHAEMIAQBaYXHxV9z3bz8CQJtNzwcwNZWKEABgPqwu/sJ9/46gB6BDLL0XUKInAMBcrC7++SL1+qb9tiqrsaAC0CmG3gsoUQkAMBvDZf/BUZ747RgCQIdMNwXutNQUqAgBAJpZXvy16e++flvfQ2NCAOggi02BihAAQBk+89fS/2M0/XUWAaDDiqZAQ5MCS4QAIG2WF//cgc37i++d6CACgAOVB+SgpUmBJUIAkKYAFv9+QcdxC8AhizcDlN4K+Nr3/kROnOwRAHHTh32e3/Wx1bI/Hf8OUQFwaepmwHExRisAPCAExK/vjvPFwz4WF386/t2jAuBYdkxq+a90fTOgJgbt++EGOfLWKgEQl933jlp70veKsuOfpj+3CAAeFCGgIe/mX/21YtALR9YVHwDisPfPz8nez58Ti1j8/eEIwIPieqDYmxFQemrPueIDQPgsL/65oXwVeojF3w8qAB5lb8ve/L/AK2LUyz9dI/2H1wuAMGnJX0v/VlUyeWzTs3JI4AUBwLPsHXky/+FFMerE4FL52vdv5/0AICArexrFNb9N6y+JYVz384wAYEBeCejP/0s8J0bxiBAQDuN3/Ess/gYQAIwIIQQwKwCwTe/46zU/rQAYxuJvBAHAEOshQPUfWi8v/2yNALDl4c8Nyzcf+ESMY/E3hABgTPaPckiq8qgYxjVBwBZd+DUAWJaJHN6yX/YKzCAAGBRCCHjzN8vlucO30hcAeKSl/ue/dFr67rwglrH420QAMCqEEEBzIOBPIM1+LP6GEQAMCyEEjIxX80rAejkywPhgwBW92//NbZ9Yb/Zj8TeOAGBcCCFA0RcAuGF8st8VLP72EQACEEoIOHZimez70W0cCQAdEMp5v2LxDwMBIBChhADmBQDtp/f7n9/1sfnzfsXiHw4CQEBCCQGKIwGgPQK5319g8Q8LASAw2dtyMP+v9oQE4NWBlXkI+BRHAsACaMn/mS+eke0bJyQE+eL/Ur74PykIBgEgQCFMDCxxVRBoXUgl/2lM+AsQASBQIYUAxZEAMD8hlfynsfgHigAQsNBCALcEgLnpbv+ZHWeC6PJvwuIfMAJA4LJ3ijO3FyUQuvj/IK8EMDgIuKrvjvNFyd/6YJ9mlUwe2/SsHBIEiwAQgexX8qB0ySv5f821EoiXf7qmOBIYmagKkCpd8HWoj/WHfGYYymPKY/ful9cFQSMARCI/DujL/2v+JP+0JoGgQRApC7DRTzv9B6UqD235OzkuCB4BICLZsXzxz+SoBBQCFA2CSI3u+nWkb0h08a/XZedn+vMQgCgQACITagigGoAU6G7/+V2n893/JQnM8cm6PMTiHxcCQISyo7JWeuSV/NMHJTBUAxArPefXnX9IjX5Kp/uN1+XJ+/plSBAVAkDEQrsmWKIagJgEer2vwHS/uBEAIhdqCFBUAxC6UHf9hYrs2/wdOSiIFgEgASFeEyxRDUCItMNfp/mFuOvPaan/oc37ZUAQNQJAIkJtDixRDUAIdKf/8GeHg+vwL9HpnxYCQEKKECB5JSCTHRIgrQJ87Xt/IidO9ghgjU7ze2bn2aDu9c8wMFaXh2j2SwcBIEEh9wUonhmGJYFO87sGzX5pIgAkKrQ3BGbiTQFYsHvLaHHWH2ST35ShfBU4QLNfmggACQu9L0C9+Zvl8tzhW6kGwKmQr/aVGOsLAkDiQu8LKNEkCBdCb/Jrwnk/CACYEnpfgOJYAJ0UQZNfgfN+lAgAuCIPAXunQ0BNAsaxANophnL/NJ7xxTUIALhGDH0BpZd/ukZe/tkaggAWJKJyv+IxH1yHAIBZ5dWAg/mvjickcBwLYCGCHuE7g5b8x+vSz3k/ZiIAYE7FkYBeFQxwhPBMDBHCfOg5v+74Iyj3q6FKJvs2PSuHBJgFAQA3FNORgGKIEGYT0Tl/iZI/booAgHmJ4ZZAM/oDoMpzfi35x1DuV3T5Y74IAJi34lXB7mJ6YE0iQH9A2srxvREt/IP5N/THeMUP80UAQEumjwT6808flUgQBNKyvTZejO8N/T7/DAz2QcsIAFiQ4i2BLD8SiKBBsKRBYN+PNsixE7cI4hNZg1+JWf5YMAIAFiy2BsHSsRPL8iBwG/0BkYh04Vc0+mFRCABYtNgaBEvcGAhbhJ39zQ7kZ/39AiwCAQBtEWs1QBEEwqILvzb47b53VGJDox/aiQCAtoq1GqAIArZFNrr3Okz0Q7sRANB2MVcDFEHAlhjv8jdj149OIQCgY2KuBiiCgF+xL/yKXT86iQCAjoq9GqAIAm4lsvCz60fHEQDgROzVAEUQ6KwUFv5pB8bqcpBdPzqNAABnUqgGKIJAe2lXvy76u7eMxr7wD2RV2bfl7+S4AA4QAOBcjFMEZ0MQWJyYr/PNwDQ/eEEAgBcxvikwF4JAayKe3Debgcm6PMY0P/hAAIBX2duyd7o3oCaR0xHDL7y2jrcG5pDSwk+THywgAMC77Gh+FLA0PxaIvEmwxOuD10psx8/VPphBAIAZ08cCP8k/7ZMEpBwEtJlv9+ZRefjPhmN7lvdGaPKDKQQAmJPSsYDSIPBqHgL0I/Y+gYSu8jUbyrJ84X9WDglgCAEAJhXVgEZxLPCEJCTWhsFN6y/K7nvHUrjKdw3K/bCMAADTiiBQkRfzMPCgJCSWhsHUzveb0N0P8wgACEJqxwKlEPsEyvP97RvHk1v46e5HSAgACMr0SGGdHVCThGgQeEerAoaPBxI93y9pif8lRvgiJAQABCelIUKz0T6BI2+tMnM8kHCZv8A5P0JFAECwUu0PKPk8Hki5zN9kIP84QLkfoSIAIHip9geUXB4PaDf/9tpEqmX+kt7j38fCj9ARABCN1IOA0tsDr+bHA+2uCqRe5p/Goz2ICgEA0Um1UbBZO4YLJd7U14wGP0SJAIAopd4o2OzN3ywvqgJv/nbFvP56dvtXsPALYkYAQNQIAlfdqCrAbv9alYocujwpBxjkg5gRAJAEgsC1yqrAx6eq7PavNSB09iMRBAAkpQgCIq/kYWCHQN7/pWDKgLDwIzEEACQp+3UeALrludSDAAGAhR/pIgAgaUUQ6MorAoneGEg4AAwICz8SRwAAJN0ZAgkGgAFh4QcKBACgSWpBIKEAMCAs/MA1CADALFLpEUggAAwICz8wKwIAcAOxB4GIA8CAsPADN0QAAOZhullwr0Q2RyDCADAgLPzAvBAAgBbENlAoogAwICz8QEsIAMACxBIEAg8AQ5WKvM7IXmBhCADAIjQFgS9KgDcHAg0APNIDtAEBAGiDIgg0ZEdoVwgDCwAs/EAbEQCANgtplkAgAeB4XmU5PNaQQyz8QPsQAIAOyX4lD8oSecLyFULjAWBAaOwDOoYAAHSY5YZBiwGgUpFDWb7jZ+EHOosAADhisWHQUADgfB9wjAAAeGClT8BAABjIQ9EbnO8D7hEAAI98Txj0GAAGhPN9wCsCAGCAr+MBxwGAMj9gCAEAMMbl8YCjAECZHzCIAAAY5eJ4oIMBQBf6gfzjJcr8gE0EAMC4Tk4Z7EAAoMwPBIIAAASkGC7UXVQEHpQ2aGMAGBCa+oCgEACAAE1XBZ7Mfwd/VRZRFVhkAGC3DwSMAAAEbrppUINAy1WBBQaAAWG3DwSPAABEYroqoGFAjwhq8/l7WggA7PaByBAAgAjN9wbBPALAgLDbB6JEAAAidrMbBHMEgOP5xxvs9oG4EQCARMxWFWgKAENZQw5XqvI6u30gDQQAIDFNVYEn8gAwxJQ+IE3/H8sxDxxw72RXAAAAAElFTkSuQmCC"
+                                  alt="Ecolyo"
+                                  width="96"
+                                  height="96"
+                                  />
+                                <span>Ecolyo</span>
+                              </div>
+                            </td>
+                          </tr>
+                        </tbody>
+                      </table>
+                    </td>
+                  </tr>
+                  <!-- separateur horizontal -->
+                  <tr>
+                    <td
+                      class="w640"
+                      width="640"
+                      height="2"
+                      bgcolor="#e3b82a"
+                      ></td>
+                  </tr>
+                  <!-- contenu -->
+                  <tr class="content">
+                    <td class="w640" width="640" bgcolor="#000000">
+                      <table
+                        class="w640"
+                        width="640"
+                        cellpadding="0"
+                        cellspacing="0"
+                        border="0"
+                        >
+                        <tbody>
+                          <tr>
+                            <td class="w30" width="30"></td>
+                            <td class="w580" width="580">
+                              <!-- content area -->
+                              <table
+                                class="w580"
+                                width="580"
+                                cellpadding="0"
+                                cellspacing="0"
+                                border="0"
+                                >
+                                <tbody>
+                                  <tr>
+                                    <td class="w580" width="580" align="center">
+                                      <h2
+                                        style="color:#FFFFFF; font-size:22px; padding-top:12px;"
+                                        >
+                                        Coup d'oeil sur le mois passé
+                                      </h2>
+                                      <div
+                                        class="article-content"
+                                        style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                        >
+                                        <p>${period}</p>
+                                      </div>
+                                    </td>
+                                  </tr>
+                                  <tr>
+                                    <td class="w30" width="580" height="20"></td>
+                                  </tr>
+                                  <tr>
+                                    <td
+                                      class="w580"
+                                      width="580"
+                                      height="1"
+                                      bgcolor="#FFFFFF"
+                                      ></td>
+                                  </tr>
+                                </tbody>
+                              </table>
+                              <!-- content area -->
+                              <table
+                                class="w580"
+                                width="580"
+                                cellspacing="0"
+                                cellpadding="0"
+                                border="0"
+                                >
+                                <tbody>
+                                  <tr>
+                                    <td class="w580" width="580" align="left">
+                                      <h2
+                                        style="color:#FFFFFF; font-size:22px; padding-top:12px;"
+                                        >
+                                        Bonjour ${username},
+                                      </h2>
+                                      <div
+                                        class="article-content"
+                                        style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                        >
+                                        <p>
+                                          Vous avez consommé ${monthlyPerformance} par
+                                          rapport au mois précédent.
+                                        </p>
+                                        <p>
+                                          Voici un détail de vos consommations:
+                                        </p>
+                                      </div>
+                                    </td>
+                                  </tr>
+                                  <tr>
+                                    <td class="w30" width="580" height="20"></td>
+                                  </tr>
+                                  <tr>
+                              </table>
+                              <!-- content area -->
+                              <table
+                                class="w580"
+                                width="580"
+                                cellpadding="0"
+                                border="0"
+                                >
+                                <tbody>
+                                  <tr>
+                                    <td colspan="3">
+                                      <h2
+                                        style="color:#FFFFFF; font-size:22px; padding-top:12px;"
+                                        >
+                                        Les facteurs d'influence sur ce mois:
+                                      </h2>
+                                    </td>
+                                  </tr>
+                                  <tr>
+                                    <td class="w275" width="275" valign="top">
+                                      <div
+                                        align="left"
+                                        class="article-content"
+                                        style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                        >
+                                        <p>Défavorable</p>
+                                        <ul>
+                                          <li>La météo</li>
+                                          <li>Autre</li>
+                                        </ul>
+                                      </div>
+                                    </td>
+                                    <td class="w30" width="30" class="w30"></td>
+                                    <td class="w275" width="275" valign="top">
+                                      <div
+                                        align="left"
+                                        class="article-content"
+                                        style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                        >
+                                        <p>Favorable</p>
+                                        <ul>
+                                          <li>La saisons</li>
+                                          <li>Autre</li>
+                                        </ul>
+                                      </div>
+                                    </td>
+                                  </tr>
+                                  <tr>
+                                    <td class="w30" width="580" height="20"></td>
+                                  </tr>
+                                  <tr>
+                                    <td
+                                      colspan="3"
+                                      class="w580"
+                                      height="1"
+                                      bgcolor="#c7c5c5"
+                                      ></td>
+                                  </tr>
+                                </tbody>
+                              </table>
+                              <!-- content area -->
+                              <table
+                                class="w580"
+                                width="580"
+                                cellspacing="0"
+                                cellpadding="0"
+                                border="0"
+                                >
+                                <tbody>
+                                  <tr>
+                                    <td class="w580" width="580" align="left">
+                                      <div
+                                        class="article-content"
+                                        style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                        >
+                                        <p>
+                                          Retrouvez l'analyse complète de vos
+                                          consommations dans votre application
+                                          Ecolyo
+                                        </p>
+                                      </div>
+                                    </td>
+                                  </tr>
+                                  <tr>
+                                    <td class="w580" width="580" align="center">
+                                      <div
+                                        class="article-content"
+                                        style="background-color:#e3b82a; font-size: 16px; font-weight: bold; width: 200px; height: 40px; border-radius: 3px;"
+                                        >
+                                        <a href="${url}" style="color: #000000; display: block; line-height: 40px; text-decoration: none; text-align: center;">
+                                        Allons-y
+                                        </a>
+                                      </div>
+                                    </td>
+                                  </tr>
+                                  <tr>
+                                    <td class="w30" width="580" height="20"></td>
+                                  </tr>
+                                </tbody>
+                              </table>
+                          </tr>
+                        </tbody>
+                      </table>
+                    </td>
+                  </tr>
+                  <!--  separateur horizontal -->
+                  <tr>
+                    <td
+                      class="w640"
+                      width="640"
+                      height="2"
+                      bgcolor="#e3b82a"
+                      ></td>
+                  </tr>
+                  <!-- pied de page -->
+                  <tr class="pagebottom">
+                    <td class="w640" width="640">
+                      <table
+                        class="w640"
+                        width="640"
+                        cellpadding="0"
+                        cellspacing="0"
+                        border="0"
+                        bgcolor="#000000"
+                        >
+                        <tbody>
+                          <tr>
+                            <td colspan="5" height="10"></td>
+                          </tr>
+                          <tr>
+                            <td class="w30" width="30"></td>
+                            <td class="w580" width="580" valign="top">
+                              <p
+                                align="right"
+                                class="pagebottom-content-left"
+                                style="color:#FFFFFF; font-size:16px; padding-top:12px;"
+                                >
+                                Créé par votre application Ecolyo
+                              </p>
+                            </td>
+                            <td class="w30" width="30"></td>
+                          </tr>
+                          <tr>
+                            <td
+                              colspan="5"
+                              height="10"
+                              style="color:#FFFFFF; font-size:11px; padding-top:12px;"
+                              align="center"
+                              >
+                              Pour ne plus recevoir ces rapports hebdomadaires,
+                              désactivez ces emails dans votre profil Ecolyo
+                            </td>
+                          </tr>
+                          <tr>
+                            <td colspan="5" height="10"></td>
+                          </tr>
+                        </tbody>
+                      </table>
+                    </td>
+                  </tr>
+                  <tr>
+                    <td class="w640" width="640" height="60"></td>
+                  </tr>
+                </tbody>
+              </table>
+            </td>
+          </tr>
+        </tbody>
+      </table>
+      </td>
+      </tr>
+      </tbody>
+      </table>
+    </body>
+  </html>
+  `
+}
diff --git a/src/targets/services/monthlyReport.ts b/src/targets/services/monthlyReport.ts
new file mode 100644
index 0000000000000000000000000000000000000000..adadaf71ffeb7f841c9f0dcc2bdf136ce4f9b4ec
--- /dev/null
+++ b/src/targets/services/monthlyReport.ts
@@ -0,0 +1,135 @@
+import logger from 'cozy-logger'
+import { Client } from 'cozy-client'
+import get from 'lodash/get'
+import { DateTime } from 'luxon'
+import { runService } from './service'
+import { createEmail } from './createEmail'
+import { TimePeriod } from 'models'
+import UserProfileService from 'services/userProfile.service'
+import ConsumptionService from 'services/consumption.service'
+import PerformanceIndicatorService from 'services/performanceIndicator.service'
+
+const log = logger.namespace('report')
+
+interface MonthlyReportProps {
+  client: Client
+}
+
+const monthlyReport = async ({ client }: MonthlyReportProps) => {
+  log('info', 'Fetching user profile...')
+  const upm = new UserProfileService(client)
+  const userProfil = await upm.getUserProfile()
+  if (!userProfil || !userProfil.report) {
+    log('info', 'End of process - Report disabled in user profile')
+    return
+  }
+
+  let username = ''
+  let url = ''
+  let periodLabel = ''
+  let monthlyPerformance = '--%'
+
+  log('info', 'Fetching data for mail...')
+  // Retrieve public name from the stack
+  const settings = await client
+    .getStackClient()
+    .fetchJSON('GET', '/settings/instance')
+  const publicName = get(settings, 'data.attributes.public_name')
+  if (publicName) {
+    username = publicName
+  }
+
+  // Retrieve link to ecolyo app from the stack
+  const apps = await client.getStackClient().fetchJSON('GET', '/apps/ecolyo')
+  const appLink = get(apps, 'data.links.related')
+  if (appLink) {
+    url = appLink
+  }
+
+  // Define period for the mail
+  const period: TimePeriod = {
+    startDate: DateTime.local()
+      .minus({
+        months: 1,
+      })
+      .startOf('month'),
+    endDate: DateTime.local()
+      .minus({
+        months: 1,
+      })
+      .endOf('month'),
+  }
+  const comparePeriod: TimePeriod = {
+    startDate: DateTime.local()
+      .minus({
+        months: 2,
+      })
+      .startOf('month'),
+    endDate: DateTime.local()
+      .minus({
+        months: 2,
+      })
+      .endOf('month'),
+  }
+  periodLabel = `${period.startDate.setLocale('fr').toFormat('LLL yyyy')}`
+
+  // Retrieve performance for the concerned period
+  const consumptionService = new ConsumptionService(client)
+  const fetchedPerformanceIndicators = await consumptionService.getPerformanceIndicators(
+    period,
+    20,
+    [0, 1, 2],
+    comparePeriod
+  )
+  if (fetchedPerformanceIndicators) {
+    const performanceIndicatorService = new PerformanceIndicatorService()
+    const performanceIndicators = performanceIndicatorService.aggregatePerformanceIndicators(
+      fetchedPerformanceIndicators
+    )
+    if (performanceIndicators && performanceIndicators.percentageVariation) {
+      const performance = 100 * performanceIndicators.percentageVariation
+      monthlyPerformance =
+        performance > 0
+          ? `+${performance.toLocaleString('fr-FR', {
+              minimumFractionDigits: 2,
+              maximumFractionDigits: 2,
+            })}%`
+          : `-${performance.toLocaleString('fr-FR', {
+              minimumFractionDigits: 2,
+              maximumFractionDigits: 2,
+            })}%`
+    }
+  } else {
+    log('info', 'performanceIndicators not fetched')
+  }
+
+  log('info', 'Creation of mail...')
+  const mailContent = createEmail(
+    username,
+    url,
+    periodLabel,
+    monthlyPerformance
+  )
+
+  const mailData = {
+    mode: 'noreply',
+    subject: '[Ecolyo] - Votre bilan mensuel',
+    parts: [
+      {
+        type: 'text/html',
+        body: mailContent,
+      },
+    ],
+  }
+
+  log('info', 'Sending mail...')
+  try {
+    const jobCollection = client.collection('io.cozy.jobs')
+    await jobCollection.create('sendmail', mailData)
+  } catch (e) {
+    // eslint-disable-next-line no-console
+    console.error(e)
+  }
+}
+
+runService(monthlyReport)
diff --git a/src/targets/services/service.ts b/src/targets/services/service.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c0788e1ffd2154653da9c9bd8e48822ed9900418
--- /dev/null
+++ b/src/targets/services/service.ts
@@ -0,0 +1,24 @@
+import fetch from 'node-fetch'
+global.fetch = fetch
+
+import CozyClient from 'cozy-client'
+import schema from 'doctypes'
+
+const assertEnvVar = (varName: string) => {
+  if (!process.env[varName]) {
+    throw new Error(`${varName} environment variable is not set`)
+  }
+}
+
+export const runService = (service: Function) => {
+  assertEnvVar('COZY_URL')
+  assertEnvVar('COZY_CREDENTIALS')
+
+  const client = CozyClient.fromEnv(process.env, { schema })
+
+  return service({ client }).catch((e: ExceptionInformation) => {
+    // eslint-disable-next-line no-console
+    console.error(e)
+    process.exit(1)
+  })
+}
diff --git a/src/utils/date.ts b/src/utils/date.ts
new file mode 100644
index 0000000000000000000000000000000000000000..b4267dde5383b80fc350a2a5727608bec6dfea54
--- /dev/null
+++ b/src/utils/date.ts
@@ -0,0 +1,54 @@
+import { DateTime } from 'luxon'
+import { TimeStep } from 'enum/timeStep.enum'
+import { TimePeriod } from 'models'
+import { UserChallenge } from 'models'
+
+export function compareDates(dateA: DateTime, dateB: DateTime) {
+  return dateA < dateB ? -1 : 1
+}
+
+export const formatCompareChallengeDate = (challenge: UserChallenge) => {
+  let durationTimeStep = ''
+  let duration = 0
+  if (challenge && challenge.challengeType) {
+    durationTimeStep = Object.keys(challenge.challengeType.duration)[0]
+    duration = (challenge.challengeType.duration as any)[durationTimeStep]
+  }
+  const delay = { [durationTimeStep]: -duration }
+  const startDate = challenge.startingDate.plus(delay)
+  const endDate = challenge.startingDate.plus({ days: -1 }).endOf('day')
+  return ` (du ${startDate.toFormat('dd/MM')} au ${endDate.toFormat('dd/MM')})`
+}
+
+export const convertDateByTimeStep = (
+  timeperiod: TimePeriod | null,
+  timeStep: TimeStep,
+  header = false
+): string => {
+  if (!timeperiod) return ''
+  switch (timeStep) {
+    case TimeStep.HALF_AN_HOUR:
+      return ' du ' + timeperiod.startDate.toFormat('dd/MM')
+
+    case TimeStep.HOUR:
+      return ' du ' + timeperiod.startDate.toFormat('dd/MM')
+
+    case TimeStep.DAY:
+      return (
+        (!header ? 'semaine ' : '') +
+        ' du ' +
+        timeperiod.startDate.toFormat('dd/MM') +
+        ' au ' +
+        timeperiod.endDate.toFormat('dd/MM')
+      )
+
+    case TimeStep.MONTH:
+      return ' du ' + timeperiod.startDate.toFormat('MM/y')
+
+    case TimeStep.YEAR:
+      return ' de ' + timeperiod.startDate.toFormat('y')
+
+    default:
+      return ''
+  }
+}
diff --git a/src/utils/hash.ts b/src/utils/hash.ts
index 8bd0a97296121f4e0e8c3b9aed0d3fd7f555e0f3..89b4eadadd5cdf4f58e44b9c1225bd3e1bd30908 100644
--- a/src/utils/hash.ts
+++ b/src/utils/hash.ts
@@ -3,6 +3,6 @@ import hash from 'object-hash'
 /***
  * sha1 hex encoding (default)
  */
-export function hashFile(file: any) {
+export function hashFile(file: File) {
   return hash(file)
 }
diff --git a/src/utils/picto.ts b/src/utils/picto.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6fc4a3d023d4aac8ba549938a5b02fb538b2df3e
--- /dev/null
+++ b/src/utils/picto.ts
@@ -0,0 +1,59 @@
+import ElecIcon from '../assets/icons/visu/elec.svg'
+import WaterIcon from '../assets/icons/visu/water.svg'
+import GasIcon from '../assets/icons/visu/gas.svg'
+import ElecSmallIcon from '../assets/icons/visu/elec-small.svg'
+import WaterSmallIcon from '../assets/icons/visu/water-small.svg'
+import GasSmallIcon from '../assets/icons/visu/gas-small.svg'
+import AddElecIcon from 'assets/icons/ico/add-elec.svg'
+import AddWaterIcon from 'assets/icons/ico/add-water.svg'
+import AddGasIcon from 'assets/icons/ico/add-gas.svg'
+import ElecParamIcon from 'assets/icons/visu/elec-param.svg'
+import WaterParamIcon from 'assets/icons/visu/water-param.svg'
+import GasParamIcon from 'assets/icons/visu/gas-param.svg'
+import { FluidType } from '../enum/fluid.enum'
+
+/**
+ * Return an icon corresponding to FuildType enum
+ * @param type FluidType
+ */
+export function getPicto(type: FluidType, small = false) {
+  switch (type) {
+    case FluidType.ELECTRICITY:
+      return small ? ElecSmallIcon : ElecIcon
+    case FluidType.WATER:
+      return small ? WaterSmallIcon : WaterIcon
+    case FluidType.GAS:
+      return small ? GasSmallIcon : GasIcon
+    default:
+      return ElecIcon
+  }
+}
+/**
+ * Return an icon corresponding to add FuildType enum
+ * @param type FluidType
+ */
+export function getAddPicto(type: FluidType) {
+  switch (type) {
+    case FluidType.ELECTRICITY:
+      return AddElecIcon
+    case FluidType.WATER:
+      return AddWaterIcon
+    case FluidType.GAS:
+      return AddGasIcon
+    default:
+      return ElecIcon
+  }
+}
+
+export function getParamPicto(type: FluidType) {
+  switch (type) {
+    case FluidType.ELECTRICITY:
+      return ElecParamIcon
+    case FluidType.WATER:
+      return WaterParamIcon
+    case FluidType.GAS:
+      return GasParamIcon
+    default:
+      return ElecParamIcon
+  }
+}
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
index befddaeb59d4853e54140fc792277f01e929dee6..d78737130fa9224854cf07c0c55bcd190ce7b676 100644
--- a/src/utils/utils.ts
+++ b/src/utils/utils.ts
@@ -1,108 +1,6 @@
-import ElecIcon from '../assets/icons/visu/elec.svg'
-import WaterIcon from '../assets/icons/visu/water.svg'
-import GasIcon from '../assets/icons/visu/gas.svg'
-import ElecSmallIcon from '../assets/icons/visu/elec-small.svg'
-import WaterSmallIcon from '../assets/icons/visu/water-small.svg'
-import GasSmallIcon from '../assets/icons/visu/gas-small.svg'
-import AddElecIcon from 'assets/icons/ico/add-elec.svg'
-import AddWaterIcon from 'assets/icons/ico/add-water.svg'
-import AddGasIcon from 'assets/icons/ico/add-gas.svg'
-import ElecParamIcon from 'assets/icons/visu/elec-param.svg'
-import WaterParamIcon from 'assets/icons/visu/water-param.svg'
-import GasParamIcon from 'assets/icons/visu/gas-param.svg'
 import { FluidType } from '../enum/fluid.enum'
-import { DateTime } from 'luxon'
-import { ENEDIS_DAY_DOCTYPE } from 'doctypes'
-import { ITimePeriod, TimeStep } from '../services/dataConsumptionContracts'
-import { UserChallenge } from 'services/dataChallengeContracts'
 
-/**
- * Return an icon corresponding to FuildType enum
- * @param type FluidType
- */
-export function getPicto(type: FluidType, small = false) {
-  switch (type) {
-    case FluidType.ELECTRICITY:
-      return small ? ElecSmallIcon : ElecIcon
-    case FluidType.WATER:
-      return small ? WaterSmallIcon : WaterIcon
-    case FluidType.GAS:
-      return small ? GasSmallIcon : GasIcon
-    default:
-      return ElecIcon
-  }
-}
-/**
- * Return an icon corresponding to add FuildType enum
- * @param type FluidType
- */
-export function getAddPicto(type: FluidType) {
-  switch (type) {
-    case FluidType.ELECTRICITY:
-      return AddElecIcon
-    case FluidType.WATER:
-      return AddWaterIcon
-    case FluidType.GAS:
-      return AddGasIcon
-    default:
-      return ElecIcon
-  }
-}
-
-export function getParamPicto(type: FluidType) {
-  switch (type) {
-    case FluidType.ELECTRICITY:
-      return ElecParamIcon
-    case FluidType.WATER:
-      return WaterParamIcon
-    case FluidType.GAS:
-      return GasParamIcon
-    default:
-      return ElecParamIcon
-  }
-}
-
-/**
- * Return a string corresponding to Fuild style
- * @param type FluidType
- */
-export function getCardColor(type: FluidType) {
-  switch (type) {
-    case FluidType.ELECTRICITY:
-      return 'card orange'
-    case FluidType.WATER:
-      return 'card blue'
-    case FluidType.GAS:
-      return 'card green'
-    default:
-      return 'card'
-  }
-}
-/**
- * Return a string corresponding to Fuild style
- * @param fluidTypes FluidType[]
- */
-export function getColorClass(fluidTypes: FluidType[]) {
-  if (fluidTypes.length === 1) {
-    switch (fluidTypes[0]) {
-      case FluidType.ELECTRICITY:
-        return 'var(--elecColor)'
-      case FluidType.WATER:
-        return 'var(--waterColor)'
-      case FluidType.GAS:
-        return 'var(--gasColor)'
-      default:
-        return 'var(--elecColor)'
-    }
-  }
-  return styles.multiColor
-}
-
-/**
- * Return a FuildType corresponding to type string
- * @param type string
- */
-export function getFuildType(type: string) {
+export function getFluidType(type: string) {
   switch (type.toUpperCase()) {
     case 'ELECTRICITY':
       return FluidType.ELECTRICITY
@@ -124,58 +22,3 @@ export function formatNumberValues(value: number) {
     return '--,--'
   }
 }
-
-export function compareDates(dateA: DateTime, dateB: DateTime) {
-  return dateA < dateB ? -1 : 1
-}
-
-export function getDoctype(fluid: FluidType) {
-  // TODO add doctypes
-  return ENEDIS_DAY_DOCTYPE
-}
-
-export const formatCompareChallengeDate = (challenge: UserChallenge) => {
-  let durationTimeStep = ''
-  let duration = 0
-  if (challenge && challenge.challengeType) {
-    durationTimeStep = Object.keys(challenge.challengeType.duration)[0]
-    duration = (challenge.challengeType.duration as any)[durationTimeStep]
-  }
-  const delay = { [durationTimeStep]: -duration }
-  const startDate = challenge.startingDate.plus(delay)
-  const endDate = challenge.startingDate.plus({ days: -1 }).endOf('day')
-  return ` (du ${startDate.toFormat('dd/MM')} au ${endDate.toFormat('dd/MM')})`
-}
-
-export const convertDateByTimeStep = (
-  timeperiod: ITimePeriod | null,
-  timeStep: TimeStep,
-  header = false
-): string => {
-  if (!timeperiod) return ''
-  switch (timeStep) {
-    case TimeStep.HALF_AN_HOUR:
-      return ' du ' + timeperiod.startDate.toFormat('dd/MM')
-
-    case TimeStep.HOUR:
-      return ' du ' + timeperiod.startDate.toFormat('dd/MM')
-
-    case TimeStep.DAY:
-      return (
-        (!header ? 'semaine ' : '') +
-        ' du ' +
-        timeperiod.startDate.toFormat('dd/MM') +
-        ' au ' +
-        timeperiod.endDate.toFormat('dd/MM')
-      )
-
-    case TimeStep.MONTH:
-      return ' du ' + timeperiod.startDate.toFormat('MM/y')
-
-    case TimeStep.YEAR:
-      return ' de ' + timeperiod.startDate.toFormat('y')
-
-    default:
-      return ''
-  }
-}
diff --git a/test/app.sp_ec.js b/test/app.sp_ec.js
index aedf9c05040ff339ea25d47ffffe405aa62d0db3..ba97cc254013b81aed311fe15aece2450b148d9a 100644
--- a/test/app.sp_ec.js
+++ b/test/app.sp_ec.js
@@ -2,8 +2,8 @@
 
 /* eslint-env jest */
 
-import React from 'react'
-import { shallow } from 'enzyme'
+//import React from 'react'
+//import { shallow } from 'enzyme'
 
 //import { App } from '../src/components/App'
 
diff --git a/test/createDayDataFiles.js b/test/createDayDataFiles.js
index f625c79bcae18f982f557aa8b8b91cf465d84abb..cf968f06f9cc35085a22d8ad77a64b95d80ff4c4 100644
--- a/test/createDayDataFiles.js
+++ b/test/createDayDataFiles.js
@@ -118,7 +118,7 @@ const dumpElec = {
   'com.grandlyon.enedis.year': Elec.yearlyLoad,
 }
 const dumpStringElec = JSON.stringify(dumpElec)
-fs.writeFile('data/dayData-elec.json', dumpStringElec, function(err, result) {
+fs.writeFile('data/dayData-elec.json', dumpStringElec, function(err) {
   if (err) console.log('error', err)
 })
 
@@ -128,7 +128,7 @@ const dumpGas = {
   'com.grandlyon.grdf.year': Gaz.yearlyLoad,
 }
 const dumpStringGas = JSON.stringify(dumpGas)
-fs.writeFile('data/dayData-gas.json', dumpStringGas, function(err, result) {
+fs.writeFile('data/dayData-gas.json', dumpStringGas, function(err) {
   if (err) console.log('error', err)
 })
 
@@ -138,7 +138,7 @@ const dumpWater = {
   'com.grandlyon.egl.year': Eau.yearlyLoad,
 }
 const dumpStringWater = JSON.stringify(dumpWater)
-fs.writeFile('data/dayData-water.json', dumpStringWater, function(err, result) {
+fs.writeFile('data/dayData-water.json', dumpStringWater, function(err) {
   if (err) console.log('error', err)
 })
 
@@ -158,6 +158,6 @@ const dump = {
 
 const dumpString = JSON.stringify(dump)
 
-fs.writeFile('data/dayData.json', dumpString, function(err, result) {
+fs.writeFile('data/dayData.json', dumpString, function(err) {
   if (err) console.log('error', err)
 })
diff --git a/test/createMockFile.js b/test/createMockFile.js
index f26e3d3a8d66ac2e662478d0eca8095df08fbc41..98b0df5dfb80ed5a15995db85a01e58d33f87d81 100644
--- a/test/createMockFile.js
+++ b/test/createMockFile.js
@@ -164,6 +164,6 @@ const dump = {
 
 const dumpString = JSON.stringify(dump)
 
-fs.writeFile('dayData.json', dumpString, function(err, result) {
+fs.writeFile('dayData.json', dumpString, function(err) {
   if (err) console.log('error', err)
 })
diff --git a/test/data/dayData-elec.json b/test/data/dayData-elec.json
index 5dacd1e5536dec375d9ba26261168c8139f8750d..eacc138c9f5e8cdbaa969f83390e7509a36621c9 100644
--- a/test/data/dayData-elec.json
+++ b/test/data/dayData-elec.json
@@ -1 +1 @@
-{"com.grandlyon.enedis.day":[{"load":5.25,"year":2020,"month":1,"day":1,"hour":0,"minute":0},{"load":3.76,"year":2020,"month":1,"day":2,"hour":0,"minute":0},{"load":8.03,"year":2020,"month":1,"day":3,"hour":0,"minute":0},{"load":5.32,"year":2020,"month":1,"day":4,"hour":0,"minute":0},{"load":8.72,"year":2020,"month":1,"day":5,"hour":0,"minute":0},{"load":8.17,"year":2020,"month":1,"day":6,"hour":0,"minute":0},{"load":6.08,"year":2020,"month":1,"day":7,"hour":0,"minute":0},{"load":4.06,"year":2020,"month":1,"day":8,"hour":0,"minute":0},{"load":4.82,"year":2020,"month":1,"day":9,"hour":0,"minute":0},{"load":7.5,"year":2020,"month":1,"day":10,"hour":0,"minute":0},{"load":6.21,"year":2020,"month":1,"day":11,"hour":0,"minute":0},{"load":4.63,"year":2020,"month":1,"day":12,"hour":0,"minute":0},{"load":4.32,"year":2020,"month":1,"day":13,"hour":0,"minute":0},{"load":8.79,"year":2020,"month":1,"day":14,"hour":0,"minute":0},{"load":7.88,"year":2020,"month":1,"day":15,"hour":0,"minute":0},{"load":4.1,"year":2020,"month":1,"day":16,"hour":0,"minute":0},{"load":5.09,"year":2020,"month":1,"day":17,"hour":0,"minute":0},{"load":8.58,"year":2020,"month":1,"day":18,"hour":0,"minute":0},{"load":9.97,"year":2020,"month":1,"day":19,"hour":0,"minute":0},{"load":6.68,"year":2020,"month":1,"day":20,"hour":0,"minute":0},{"load":9.13,"year":2020,"month":1,"day":21,"hour":0,"minute":0},{"load":4.77,"year":2020,"month":1,"day":22,"hour":0,"minute":0},{"load":3.6,"year":2020,"month":1,"day":23,"hour":0,"minute":0},{"load":8.33,"year":2020,"month":1,"day":24,"hour":0,"minute":0},{"load":3.42,"year":2020,"month":1,"day":25,"hour":0,"minute":0},{"load":8.46,"year":2020,"month":1,"day":26,"hour":0,"minute":0},{"load":5.85,"year":2020,"month":1,"day":27,"hour":0,"minute":0},{"load":3.01,"year":2020,"month":1,"day":28,"hour":0,"minute":0},{"load":8.06,"year":2020,"month":1,"day":29,"hour":0,"minute":0},{"load":6.39,"year":2020,"month":1,"day":30,"hour":0,"minute":0},{"load":6.9,"year":2020,"month":1,"day":31,"hour":0,"minute":0},{"load":3.9,"year":2020,"month":2,"day":1,"hour":0,"minute":0},{"load":8.07,"year":2020,"month":2,"day":2,"hour":0,"minute":0},{"load":9.85,"year":2020,"month":2,"day":3,"hour":0,"minute":0},{"load":7.23,"year":2020,"month":2,"day":4,"hour":0,"minute":0},{"load":6.05,"year":2020,"month":2,"day":5,"hour":0,"minute":0},{"load":8.02,"year":2020,"month":2,"day":6,"hour":0,"minute":0},{"load":8.45,"year":2020,"month":2,"day":7,"hour":0,"minute":0},{"load":7.01,"year":2020,"month":2,"day":8,"hour":0,"minute":0},{"load":6.36,"year":2020,"month":2,"day":9,"hour":0,"minute":0},{"load":3.07,"year":2020,"month":2,"day":10,"hour":0,"minute":0},{"load":4.03,"year":2020,"month":2,"day":11,"hour":0,"minute":0},{"load":7.2,"year":2020,"month":2,"day":12,"hour":0,"minute":0},{"load":3.66,"year":2020,"month":2,"day":13,"hour":0,"minute":0},{"load":8.3,"year":2020,"month":2,"day":14,"hour":0,"minute":0},{"load":5.93,"year":2020,"month":2,"day":15,"hour":0,"minute":0},{"load":9.08,"year":2020,"month":2,"day":16,"hour":0,"minute":0},{"load":5.32,"year":2020,"month":2,"day":17,"hour":0,"minute":0},{"load":4.72,"year":2020,"month":2,"day":18,"hour":0,"minute":0},{"load":6,"year":2020,"month":2,"day":19,"hour":0,"minute":0},{"load":7.73,"year":2020,"month":2,"day":20,"hour":0,"minute":0},{"load":3.59,"year":2020,"month":2,"day":21,"hour":0,"minute":0},{"load":7.75,"year":2020,"month":2,"day":22,"hour":0,"minute":0},{"load":5.37,"year":2020,"month":2,"day":23,"hour":0,"minute":0},{"load":8.33,"year":2020,"month":2,"day":24,"hour":0,"minute":0},{"load":9.02,"year":2020,"month":2,"day":25,"hour":0,"minute":0},{"load":5.19,"year":2020,"month":2,"day":26,"hour":0,"minute":0},{"load":6.75,"year":2020,"month":2,"day":27,"hour":0,"minute":0},{"load":5.49,"year":2020,"month":2,"day":28,"hour":0,"minute":0},{"load":8.13,"year":2020,"month":2,"day":29,"hour":0,"minute":0},{"load":7.68,"year":2020,"month":3,"day":1,"hour":0,"minute":0},{"load":5.47,"year":2020,"month":3,"day":2,"hour":0,"minute":0},{"load":4.37,"year":2020,"month":3,"day":3,"hour":0,"minute":0},{"load":8.85,"year":2020,"month":3,"day":4,"hour":0,"minute":0},{"load":9.68,"year":2020,"month":3,"day":5,"hour":0,"minute":0},{"load":8.61,"year":2020,"month":3,"day":6,"hour":0,"minute":0},{"load":6.27,"year":2020,"month":3,"day":7,"hour":0,"minute":0},{"load":8.06,"year":2020,"month":3,"day":8,"hour":0,"minute":0},{"load":9.96,"year":2020,"month":3,"day":9,"hour":0,"minute":0},{"load":9.91,"year":2020,"month":3,"day":10,"hour":0,"minute":0},{"load":5.55,"year":2020,"month":3,"day":11,"hour":0,"minute":0},{"load":6.27,"year":2020,"month":3,"day":12,"hour":0,"minute":0},{"load":9.86,"year":2020,"month":3,"day":13,"hour":0,"minute":0},{"load":8.55,"year":2020,"month":3,"day":14,"hour":0,"minute":0},{"load":3.36,"year":2020,"month":3,"day":15,"hour":0,"minute":0},{"load":7.22,"year":2020,"month":3,"day":16,"hour":0,"minute":0},{"load":7.82,"year":2020,"month":3,"day":17,"hour":0,"minute":0},{"load":5.28,"year":2020,"month":3,"day":18,"hour":0,"minute":0},{"load":5.82,"year":2020,"month":3,"day":19,"hour":0,"minute":0},{"load":4.65,"year":2020,"month":3,"day":20,"hour":0,"minute":0},{"load":5.52,"year":2020,"month":3,"day":21,"hour":0,"minute":0},{"load":6.94,"year":2020,"month":3,"day":22,"hour":0,"minute":0},{"load":4.58,"year":2020,"month":3,"day":23,"hour":0,"minute":0},{"load":6.12,"year":2020,"month":3,"day":24,"hour":0,"minute":0},{"load":6.24,"year":2020,"month":3,"day":25,"hour":0,"minute":0},{"load":5.14,"year":2020,"month":3,"day":26,"hour":0,"minute":0},{"load":7.43,"year":2020,"month":3,"day":27,"hour":0,"minute":0},{"load":8.71,"year":2020,"month":3,"day":28,"hour":0,"minute":0},{"load":4.07,"year":2020,"month":3,"day":29,"hour":0,"minute":0},{"load":6.7,"year":2020,"month":3,"day":30,"hour":0,"minute":0},{"load":5.08,"year":2020,"month":3,"day":31,"hour":0,"minute":0},{"load":4.72,"year":2020,"month":4,"day":1,"hour":0,"minute":0},{"load":3.11,"year":2020,"month":4,"day":2,"hour":0,"minute":0},{"load":9.82,"year":2020,"month":4,"day":3,"hour":0,"minute":0},{"load":8.12,"year":2020,"month":4,"day":4,"hour":0,"minute":0},{"load":3.04,"year":2020,"month":4,"day":5,"hour":0,"minute":0},{"load":6.59,"year":2020,"month":4,"day":6,"hour":0,"minute":0},{"load":4.94,"year":2020,"month":4,"day":7,"hour":0,"minute":0},{"load":5.26,"year":2020,"month":4,"day":8,"hour":0,"minute":0},{"load":4.45,"year":2020,"month":4,"day":9,"hour":0,"minute":0},{"load":8.01,"year":2020,"month":4,"day":10,"hour":0,"minute":0},{"load":8.93,"year":2020,"month":4,"day":11,"hour":0,"minute":0},{"load":7.82,"year":2020,"month":4,"day":12,"hour":0,"minute":0},{"load":4.13,"year":2020,"month":4,"day":13,"hour":0,"minute":0},{"load":6.43,"year":2020,"month":4,"day":14,"hour":0,"minute":0},{"load":5.82,"year":2020,"month":4,"day":15,"hour":0,"minute":0},{"load":5.44,"year":2020,"month":4,"day":16,"hour":0,"minute":0},{"load":9.53,"year":2020,"month":4,"day":17,"hour":0,"minute":0},{"load":7.29,"year":2020,"month":4,"day":18,"hour":0,"minute":0},{"load":3.61,"year":2020,"month":4,"day":19,"hour":0,"minute":0},{"load":3.04,"year":2020,"month":4,"day":20,"hour":0,"minute":0},{"load":7.83,"year":2020,"month":4,"day":21,"hour":0,"minute":0},{"load":3.21,"year":2020,"month":4,"day":22,"hour":0,"minute":0},{"load":3.76,"year":2020,"month":4,"day":23,"hour":0,"minute":0},{"load":9.21,"year":2020,"month":4,"day":24,"hour":0,"minute":0},{"load":5.85,"year":2020,"month":4,"day":25,"hour":0,"minute":0},{"load":7.79,"year":2020,"month":4,"day":26,"hour":0,"minute":0},{"load":6.8,"year":2020,"month":4,"day":27,"hour":0,"minute":0},{"load":3.89,"year":2020,"month":4,"day":28,"hour":0,"minute":0},{"load":7.34,"year":2020,"month":4,"day":29,"hour":0,"minute":0}],"com.grandlyon.enedis.month":[{"load":199.78,"year":2020,"month":1,"day":0,"hour":0,"minute":0},{"load":193.38,"year":2020,"month":2,"day":0,"hour":0,"minute":0},{"load":206.81,"year":2020,"month":3,"day":0,"hour":0,"minute":0},{"load":171.06,"year":2020,"month":4,"day":1,"hour":0,"minute":0}],"com.grandlyon.enedis.year":[{"load":771.03,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
+{"com.grandlyon.enedis.day":[{"load":6.08,"year":2020,"month":5,"day":28,"hour":0,"minute":0},{"load":8.81,"year":2020,"month":5,"day":29,"hour":0,"minute":0},{"load":5.02,"year":2020,"month":5,"day":30,"hour":0,"minute":0},{"load":5.98,"year":2020,"month":5,"day":31,"hour":0,"minute":0},{"load":9.82,"year":2020,"month":6,"day":1,"hour":0,"minute":0},{"load":4.32,"year":2020,"month":6,"day":2,"hour":0,"minute":0},{"load":9.75,"year":2020,"month":6,"day":3,"hour":0,"minute":0},{"load":3.81,"year":2020,"month":6,"day":4,"hour":0,"minute":0},{"load":6.04,"year":2020,"month":6,"day":5,"hour":0,"minute":0},{"load":7.54,"year":2020,"month":6,"day":6,"hour":0,"minute":0},{"load":9.39,"year":2020,"month":6,"day":7,"hour":0,"minute":0},{"load":8.37,"year":2020,"month":6,"day":8,"hour":0,"minute":0},{"load":5.78,"year":2020,"month":6,"day":9,"hour":0,"minute":0},{"load":6.58,"year":2020,"month":6,"day":10,"hour":0,"minute":0},{"load":4.43,"year":2020,"month":6,"day":11,"hour":0,"minute":0},{"load":7.67,"year":2020,"month":6,"day":12,"hour":0,"minute":0},{"load":3.75,"year":2020,"month":6,"day":13,"hour":0,"minute":0},{"load":4.73,"year":2020,"month":6,"day":14,"hour":0,"minute":0},{"load":8.91,"year":2020,"month":6,"day":15,"hour":0,"minute":0},{"load":4.42,"year":2020,"month":6,"day":16,"hour":0,"minute":0},{"load":7.69,"year":2020,"month":6,"day":17,"hour":0,"minute":0},{"load":9.82,"year":2020,"month":6,"day":18,"hour":0,"minute":0},{"load":6.59,"year":2020,"month":6,"day":19,"hour":0,"minute":0},{"load":9.21,"year":2020,"month":6,"day":20,"hour":0,"minute":0},{"load":7.76,"year":2020,"month":6,"day":21,"hour":0,"minute":0},{"load":9.97,"year":2020,"month":6,"day":22,"hour":0,"minute":0},{"load":7.81,"year":2020,"month":6,"day":23,"hour":0,"minute":0},{"load":8.77,"year":2020,"month":6,"day":24,"hour":0,"minute":0},{"load":4.16,"year":2020,"month":6,"day":25,"hour":0,"minute":0},{"load":9.88,"year":2020,"month":6,"day":26,"hour":0,"minute":0},{"load":7.31,"year":2020,"month":6,"day":27,"hour":0,"minute":0},{"load":4.86,"year":2020,"month":6,"day":28,"hour":0,"minute":0},{"load":5.16,"year":2020,"month":6,"day":29,"hour":0,"minute":0},{"load":5.79,"year":2020,"month":6,"day":30,"hour":0,"minute":0},{"load":6.7,"year":2020,"month":7,"day":1,"hour":0,"minute":0},{"load":5.9,"year":2020,"month":7,"day":2,"hour":0,"minute":0},{"load":4.19,"year":2020,"month":7,"day":3,"hour":0,"minute":0},{"load":5.47,"year":2020,"month":7,"day":4,"hour":0,"minute":0},{"load":3.37,"year":2020,"month":7,"day":5,"hour":0,"minute":0},{"load":8.55,"year":2020,"month":7,"day":6,"hour":0,"minute":0},{"load":6.72,"year":2020,"month":7,"day":7,"hour":0,"minute":0},{"load":9.01,"year":2020,"month":7,"day":8,"hour":0,"minute":0},{"load":3.45,"year":2020,"month":7,"day":9,"hour":0,"minute":0},{"load":7.42,"year":2020,"month":7,"day":10,"hour":0,"minute":0},{"load":8.56,"year":2020,"month":7,"day":11,"hour":0,"minute":0},{"load":7.81,"year":2020,"month":7,"day":12,"hour":0,"minute":0},{"load":6.18,"year":2020,"month":7,"day":13,"hour":0,"minute":0},{"load":5.78,"year":2020,"month":7,"day":14,"hour":0,"minute":0},{"load":7.08,"year":2020,"month":7,"day":15,"hour":0,"minute":0},{"load":4.79,"year":2020,"month":7,"day":16,"hour":0,"minute":0},{"load":6.06,"year":2020,"month":7,"day":17,"hour":0,"minute":0},{"load":5.91,"year":2020,"month":7,"day":18,"hour":0,"minute":0},{"load":7,"year":2020,"month":7,"day":19,"hour":0,"minute":0},{"load":6.26,"year":2020,"month":7,"day":20,"hour":0,"minute":0},{"load":4.46,"year":2020,"month":7,"day":21,"hour":0,"minute":0},{"load":6.15,"year":2020,"month":7,"day":22,"hour":0,"minute":0},{"load":4.61,"year":2020,"month":7,"day":23,"hour":0,"minute":0},{"load":5.69,"year":2020,"month":7,"day":24,"hour":0,"minute":0},{"load":7.3,"year":2020,"month":7,"day":25,"hour":0,"minute":0},{"load":6.74,"year":2020,"month":7,"day":26,"hour":0,"minute":0},{"load":6.58,"year":2020,"month":7,"day":27,"hour":0,"minute":0},{"load":3.72,"year":2020,"month":7,"day":28,"hour":0,"minute":0},{"load":8.85,"year":2020,"month":7,"day":29,"hour":0,"minute":0},{"load":4.37,"year":2020,"month":7,"day":30,"hour":0,"minute":0},{"load":8.28,"year":2020,"month":7,"day":31,"hour":0,"minute":0},{"load":5.62,"year":2020,"month":8,"day":1,"hour":0,"minute":0},{"load":9.24,"year":2020,"month":8,"day":2,"hour":0,"minute":0},{"load":9.99,"year":2020,"month":8,"day":3,"hour":0,"minute":0},{"load":3.75,"year":2020,"month":8,"day":4,"hour":0,"minute":0},{"load":4.93,"year":2020,"month":8,"day":5,"hour":0,"minute":0},{"load":4.9,"year":2020,"month":8,"day":6,"hour":0,"minute":0},{"load":8.48,"year":2020,"month":8,"day":7,"hour":0,"minute":0},{"load":6.03,"year":2020,"month":8,"day":8,"hour":0,"minute":0},{"load":4.47,"year":2020,"month":8,"day":9,"hour":0,"minute":0},{"load":5.02,"year":2020,"month":8,"day":10,"hour":0,"minute":0},{"load":4.68,"year":2020,"month":8,"day":11,"hour":0,"minute":0},{"load":5.72,"year":2020,"month":8,"day":12,"hour":0,"minute":0},{"load":3.56,"year":2020,"month":8,"day":13,"hour":0,"minute":0},{"load":9.03,"year":2020,"month":8,"day":14,"hour":0,"minute":0},{"load":5.29,"year":2020,"month":8,"day":15,"hour":0,"minute":0},{"load":9.19,"year":2020,"month":8,"day":16,"hour":0,"minute":0},{"load":4.99,"year":2020,"month":8,"day":17,"hour":0,"minute":0},{"load":8.06,"year":2020,"month":8,"day":18,"hour":0,"minute":0},{"load":9.2,"year":2020,"month":8,"day":19,"hour":0,"minute":0},{"load":5,"year":2020,"month":8,"day":20,"hour":0,"minute":0},{"load":9.42,"year":2020,"month":8,"day":21,"hour":0,"minute":0},{"load":4.85,"year":2020,"month":8,"day":22,"hour":0,"minute":0},{"load":6.55,"year":2020,"month":8,"day":23,"hour":0,"minute":0},{"load":6.52,"year":2020,"month":8,"day":24,"hour":0,"minute":0},{"load":5.64,"year":2020,"month":8,"day":25,"hour":0,"minute":0},{"load":8.91,"year":2020,"month":8,"day":26,"hour":0,"minute":0},{"load":9.87,"year":2020,"month":8,"day":27,"hour":0,"minute":0},{"load":5.38,"year":2020,"month":8,"day":28,"hour":0,"minute":0},{"load":4.93,"year":2020,"month":8,"day":29,"hour":0,"minute":0},{"load":5.02,"year":2020,"month":8,"day":30,"hour":0,"minute":0},{"load":5.1,"year":2020,"month":8,"day":31,"hour":0,"minute":0},{"load":8.9,"year":2020,"month":9,"day":1,"hour":0,"minute":0},{"load":8.43,"year":2020,"month":9,"day":2,"hour":0,"minute":0},{"load":7.32,"year":2020,"month":9,"day":3,"hour":0,"minute":0},{"load":3.65,"year":2020,"month":9,"day":4,"hour":0,"minute":0},{"load":8.47,"year":2020,"month":9,"day":5,"hour":0,"minute":0},{"load":3.65,"year":2020,"month":9,"day":6,"hour":0,"minute":0},{"load":5.37,"year":2020,"month":9,"day":7,"hour":0,"minute":0},{"load":4.26,"year":2020,"month":9,"day":8,"hour":0,"minute":0},{"load":4,"year":2020,"month":9,"day":9,"hour":0,"minute":0},{"load":8.67,"year":2020,"month":9,"day":10,"hour":0,"minute":0},{"load":4.9,"year":2020,"month":9,"day":11,"hour":0,"minute":0},{"load":9.78,"year":2020,"month":9,"day":12,"hour":0,"minute":0},{"load":6.76,"year":2020,"month":9,"day":13,"hour":0,"minute":0},{"load":6.16,"year":2020,"month":9,"day":14,"hour":0,"minute":0},{"load":4.8,"year":2020,"month":9,"day":15,"hour":0,"minute":0},{"load":7.33,"year":2020,"month":9,"day":16,"hour":0,"minute":0},{"load":3.59,"year":2020,"month":9,"day":17,"hour":0,"minute":0},{"load":6.12,"year":2020,"month":9,"day":18,"hour":0,"minute":0},{"load":6.59,"year":2020,"month":9,"day":19,"hour":0,"minute":0},{"load":3.91,"year":2020,"month":9,"day":20,"hour":0,"minute":0},{"load":5.11,"year":2020,"month":9,"day":21,"hour":0,"minute":0},{"load":8.38,"year":2020,"month":9,"day":22,"hour":0,"minute":0},{"load":6.97,"year":2020,"month":9,"day":23,"hour":0,"minute":0},{"load":6.39,"year":2020,"month":9,"day":24,"hour":0,"minute":0}],"com.grandlyon.enedis.month":[{"load":35.71,"year":2020,"month":5,"day":0,"hour":0,"minute":0},{"load":206.97,"year":2020,"month":6,"day":0,"hour":0,"minute":0},{"load":191.88,"year":2020,"month":7,"day":0,"hour":0,"minute":0},{"load":202.62,"year":2020,"month":8,"day":0,"hour":0,"minute":0},{"load":140.61,"year":2020,"month":9,"day":1,"hour":0,"minute":0}],"com.grandlyon.enedis.year":[{"load":777.79,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
diff --git a/test/data/dayData-gas.json b/test/data/dayData-gas.json
index a1f2193c7fde22595a7e2b2888104f6acdf058e4..3be71f94de06487036242948affefada812ec975 100644
--- a/test/data/dayData-gas.json
+++ b/test/data/dayData-gas.json
@@ -1 +1 @@
-{"com.grandlyon.grdf.day":[{"load":52.41,"year":2020,"month":1,"day":1,"hour":0,"minute":0},{"load":58.73,"year":2020,"month":1,"day":2,"hour":0,"minute":0},{"load":41.05,"year":2020,"month":1,"day":3,"hour":0,"minute":0},{"load":17.93,"year":2020,"month":1,"day":4,"hour":0,"minute":0},{"load":41.19,"year":2020,"month":1,"day":5,"hour":0,"minute":0},{"load":53.38,"year":2020,"month":1,"day":6,"hour":0,"minute":0},{"load":37.93,"year":2020,"month":1,"day":7,"hour":0,"minute":0},{"load":39.38,"year":2020,"month":1,"day":8,"hour":0,"minute":0},{"load":65.88,"year":2020,"month":1,"day":9,"hour":0,"minute":0},{"load":45.74,"year":2020,"month":1,"day":10,"hour":0,"minute":0},{"load":17.4,"year":2020,"month":1,"day":11,"hour":0,"minute":0},{"load":33.71,"year":2020,"month":1,"day":12,"hour":0,"minute":0},{"load":36.05,"year":2020,"month":1,"day":13,"hour":0,"minute":0},{"load":62.06,"year":2020,"month":1,"day":14,"hour":0,"minute":0},{"load":34.61,"year":2020,"month":1,"day":15,"hour":0,"minute":0},{"load":64.29,"year":2020,"month":1,"day":16,"hour":0,"minute":0},{"load":25.38,"year":2020,"month":1,"day":17,"hour":0,"minute":0},{"load":65.92,"year":2020,"month":1,"day":18,"hour":0,"minute":0},{"load":22.58,"year":2020,"month":1,"day":19,"hour":0,"minute":0},{"load":32.96,"year":2020,"month":1,"day":20,"hour":0,"minute":0},{"load":30.61,"year":2020,"month":1,"day":21,"hour":0,"minute":0},{"load":26.95,"year":2020,"month":1,"day":22,"hour":0,"minute":0},{"load":44.24,"year":2020,"month":1,"day":23,"hour":0,"minute":0},{"load":54.35,"year":2020,"month":1,"day":24,"hour":0,"minute":0},{"load":37.44,"year":2020,"month":1,"day":25,"hour":0,"minute":0},{"load":28.66,"year":2020,"month":1,"day":26,"hour":0,"minute":0},{"load":59.73,"year":2020,"month":1,"day":27,"hour":0,"minute":0},{"load":58.37,"year":2020,"month":1,"day":28,"hour":0,"minute":0},{"load":16.59,"year":2020,"month":1,"day":29,"hour":0,"minute":0},{"load":58.36,"year":2020,"month":1,"day":30,"hour":0,"minute":0},{"load":62.08,"year":2020,"month":1,"day":31,"hour":0,"minute":0},{"load":21.78,"year":2020,"month":2,"day":1,"hour":0,"minute":0},{"load":54.82,"year":2020,"month":2,"day":2,"hour":0,"minute":0},{"load":51.54,"year":2020,"month":2,"day":3,"hour":0,"minute":0},{"load":45.73,"year":2020,"month":2,"day":4,"hour":0,"minute":0},{"load":36.5,"year":2020,"month":2,"day":5,"hour":0,"minute":0},{"load":24.41,"year":2020,"month":2,"day":6,"hour":0,"minute":0},{"load":64.03,"year":2020,"month":2,"day":7,"hour":0,"minute":0},{"load":26.36,"year":2020,"month":2,"day":8,"hour":0,"minute":0},{"load":66.75,"year":2020,"month":2,"day":9,"hour":0,"minute":0},{"load":26.88,"year":2020,"month":2,"day":10,"hour":0,"minute":0},{"load":38.9,"year":2020,"month":2,"day":11,"hour":0,"minute":0},{"load":33.79,"year":2020,"month":2,"day":12,"hour":0,"minute":0},{"load":46.06,"year":2020,"month":2,"day":13,"hour":0,"minute":0},{"load":40.21,"year":2020,"month":2,"day":14,"hour":0,"minute":0},{"load":32.47,"year":2020,"month":2,"day":15,"hour":0,"minute":0},{"load":63.28,"year":2020,"month":2,"day":16,"hour":0,"minute":0},{"load":24.66,"year":2020,"month":2,"day":17,"hour":0,"minute":0},{"load":61.52,"year":2020,"month":2,"day":18,"hour":0,"minute":0},{"load":51.06,"year":2020,"month":2,"day":19,"hour":0,"minute":0},{"load":30.18,"year":2020,"month":2,"day":20,"hour":0,"minute":0},{"load":31.51,"year":2020,"month":2,"day":21,"hour":0,"minute":0},{"load":60.22,"year":2020,"month":2,"day":22,"hour":0,"minute":0},{"load":49.48,"year":2020,"month":2,"day":23,"hour":0,"minute":0},{"load":24.37,"year":2020,"month":2,"day":24,"hour":0,"minute":0},{"load":40.91,"year":2020,"month":2,"day":25,"hour":0,"minute":0},{"load":33.09,"year":2020,"month":2,"day":26,"hour":0,"minute":0},{"load":58.14,"year":2020,"month":2,"day":27,"hour":0,"minute":0},{"load":67.46,"year":2020,"month":2,"day":28,"hour":0,"minute":0},{"load":47.03,"year":2020,"month":2,"day":29,"hour":0,"minute":0},{"load":50.89,"year":2020,"month":3,"day":1,"hour":0,"minute":0},{"load":39.84,"year":2020,"month":3,"day":2,"hour":0,"minute":0},{"load":48.55,"year":2020,"month":3,"day":3,"hour":0,"minute":0},{"load":54.28,"year":2020,"month":3,"day":4,"hour":0,"minute":0},{"load":24.52,"year":2020,"month":3,"day":5,"hour":0,"minute":0},{"load":36.45,"year":2020,"month":3,"day":6,"hour":0,"minute":0},{"load":35.05,"year":2020,"month":3,"day":7,"hour":0,"minute":0},{"load":18.47,"year":2020,"month":3,"day":8,"hour":0,"minute":0},{"load":58.52,"year":2020,"month":3,"day":9,"hour":0,"minute":0},{"load":41.14,"year":2020,"month":3,"day":10,"hour":0,"minute":0},{"load":42.74,"year":2020,"month":3,"day":11,"hour":0,"minute":0},{"load":54.73,"year":2020,"month":3,"day":12,"hour":0,"minute":0},{"load":23.45,"year":2020,"month":3,"day":13,"hour":0,"minute":0},{"load":55.12,"year":2020,"month":3,"day":14,"hour":0,"minute":0},{"load":47.33,"year":2020,"month":3,"day":15,"hour":0,"minute":0},{"load":20.84,"year":2020,"month":3,"day":16,"hour":0,"minute":0},{"load":60.22,"year":2020,"month":3,"day":17,"hour":0,"minute":0},{"load":38.98,"year":2020,"month":3,"day":18,"hour":0,"minute":0},{"load":59.29,"year":2020,"month":3,"day":19,"hour":0,"minute":0},{"load":23.69,"year":2020,"month":3,"day":20,"hour":0,"minute":0},{"load":45.61,"year":2020,"month":3,"day":21,"hour":0,"minute":0},{"load":22.03,"year":2020,"month":3,"day":22,"hour":0,"minute":0},{"load":22.81,"year":2020,"month":3,"day":23,"hour":0,"minute":0},{"load":65.09,"year":2020,"month":3,"day":24,"hour":0,"minute":0},{"load":39.38,"year":2020,"month":3,"day":25,"hour":0,"minute":0},{"load":34.56,"year":2020,"month":3,"day":26,"hour":0,"minute":0},{"load":50.35,"year":2020,"month":3,"day":27,"hour":0,"minute":0},{"load":31.03,"year":2020,"month":3,"day":28,"hour":0,"minute":0},{"load":51.73,"year":2020,"month":3,"day":29,"hour":0,"minute":0},{"load":40.89,"year":2020,"month":3,"day":30,"hour":0,"minute":0},{"load":64.64,"year":2020,"month":3,"day":31,"hour":0,"minute":0},{"load":28.41,"year":2020,"month":4,"day":1,"hour":0,"minute":0},{"load":56.89,"year":2020,"month":4,"day":2,"hour":0,"minute":0},{"load":41.85,"year":2020,"month":4,"day":3,"hour":0,"minute":0},{"load":41.24,"year":2020,"month":4,"day":4,"hour":0,"minute":0},{"load":26.86,"year":2020,"month":4,"day":5,"hour":0,"minute":0},{"load":40.83,"year":2020,"month":4,"day":6,"hour":0,"minute":0},{"load":59.65,"year":2020,"month":4,"day":7,"hour":0,"minute":0},{"load":34.4,"year":2020,"month":4,"day":8,"hour":0,"minute":0},{"load":66.36,"year":2020,"month":4,"day":9,"hour":0,"minute":0},{"load":66.64,"year":2020,"month":4,"day":10,"hour":0,"minute":0},{"load":33.56,"year":2020,"month":4,"day":11,"hour":0,"minute":0},{"load":20.23,"year":2020,"month":4,"day":12,"hour":0,"minute":0},{"load":54.13,"year":2020,"month":4,"day":13,"hour":0,"minute":0},{"load":38.69,"year":2020,"month":4,"day":14,"hour":0,"minute":0},{"load":33.34,"year":2020,"month":4,"day":15,"hour":0,"minute":0},{"load":44.67,"year":2020,"month":4,"day":16,"hour":0,"minute":0},{"load":17.46,"year":2020,"month":4,"day":17,"hour":0,"minute":0},{"load":39.25,"year":2020,"month":4,"day":18,"hour":0,"minute":0},{"load":49.73,"year":2020,"month":4,"day":19,"hour":0,"minute":0},{"load":57.52,"year":2020,"month":4,"day":20,"hour":0,"minute":0},{"load":47.97,"year":2020,"month":4,"day":21,"hour":0,"minute":0},{"load":36.41,"year":2020,"month":4,"day":22,"hour":0,"minute":0},{"load":37.39,"year":2020,"month":4,"day":23,"hour":0,"minute":0},{"load":26.73,"year":2020,"month":4,"day":24,"hour":0,"minute":0},{"load":17.99,"year":2020,"month":4,"day":25,"hour":0,"minute":0},{"load":48.2,"year":2020,"month":4,"day":26,"hour":0,"minute":0},{"load":21.47,"year":2020,"month":4,"day":27,"hour":0,"minute":0},{"load":38.01,"year":2020,"month":4,"day":28,"hour":0,"minute":0},{"load":25.59,"year":2020,"month":4,"day":29,"hour":0,"minute":0}],"com.grandlyon.grdf.month":[{"load":1347.74,"year":2020,"month":1,"day":0,"hour":0,"minute":0},{"load":1282.25,"year":2020,"month":2,"day":0,"hour":0,"minute":0},{"load":1279.74,"year":2020,"month":3,"day":0,"hour":0,"minute":0},{"load":1123.06,"year":2020,"month":4,"day":1,"hour":0,"minute":0}],"com.grandlyon.grdf.year":[{"load":5032.79,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
+{"com.grandlyon.grdf.day":[{"load":35.53,"year":2020,"month":5,"day":28,"hour":0,"minute":0},{"load":25.49,"year":2020,"month":5,"day":29,"hour":0,"minute":0},{"load":16.23,"year":2020,"month":5,"day":30,"hour":0,"minute":0},{"load":59.35,"year":2020,"month":5,"day":31,"hour":0,"minute":0},{"load":63.01,"year":2020,"month":6,"day":1,"hour":0,"minute":0},{"load":46.92,"year":2020,"month":6,"day":2,"hour":0,"minute":0},{"load":49.29,"year":2020,"month":6,"day":3,"hour":0,"minute":0},{"load":38.33,"year":2020,"month":6,"day":4,"hour":0,"minute":0},{"load":64.76,"year":2020,"month":6,"day":5,"hour":0,"minute":0},{"load":58.58,"year":2020,"month":6,"day":6,"hour":0,"minute":0},{"load":58.57,"year":2020,"month":6,"day":7,"hour":0,"minute":0},{"load":30.01,"year":2020,"month":6,"day":8,"hour":0,"minute":0},{"load":46.96,"year":2020,"month":6,"day":9,"hour":0,"minute":0},{"load":49.11,"year":2020,"month":6,"day":10,"hour":0,"minute":0},{"load":54.54,"year":2020,"month":6,"day":11,"hour":0,"minute":0},{"load":18.32,"year":2020,"month":6,"day":12,"hour":0,"minute":0},{"load":67.22,"year":2020,"month":6,"day":13,"hour":0,"minute":0},{"load":36.71,"year":2020,"month":6,"day":14,"hour":0,"minute":0},{"load":52.45,"year":2020,"month":6,"day":15,"hour":0,"minute":0},{"load":18.15,"year":2020,"month":6,"day":16,"hour":0,"minute":0},{"load":16.12,"year":2020,"month":6,"day":17,"hour":0,"minute":0},{"load":23.03,"year":2020,"month":6,"day":18,"hour":0,"minute":0},{"load":58.67,"year":2020,"month":6,"day":19,"hour":0,"minute":0},{"load":21.87,"year":2020,"month":6,"day":20,"hour":0,"minute":0},{"load":31.59,"year":2020,"month":6,"day":21,"hour":0,"minute":0},{"load":30.95,"year":2020,"month":6,"day":22,"hour":0,"minute":0},{"load":30.73,"year":2020,"month":6,"day":23,"hour":0,"minute":0},{"load":24.53,"year":2020,"month":6,"day":24,"hour":0,"minute":0},{"load":23.6,"year":2020,"month":6,"day":25,"hour":0,"minute":0},{"load":43.88,"year":2020,"month":6,"day":26,"hour":0,"minute":0},{"load":20.22,"year":2020,"month":6,"day":27,"hour":0,"minute":0},{"load":36.81,"year":2020,"month":6,"day":28,"hour":0,"minute":0},{"load":41.63,"year":2020,"month":6,"day":29,"hour":0,"minute":0},{"load":32.63,"year":2020,"month":6,"day":30,"hour":0,"minute":0},{"load":57.19,"year":2020,"month":7,"day":1,"hour":0,"minute":0},{"load":53.01,"year":2020,"month":7,"day":2,"hour":0,"minute":0},{"load":32.09,"year":2020,"month":7,"day":3,"hour":0,"minute":0},{"load":59.38,"year":2020,"month":7,"day":4,"hour":0,"minute":0},{"load":18.23,"year":2020,"month":7,"day":5,"hour":0,"minute":0},{"load":45.7,"year":2020,"month":7,"day":6,"hour":0,"minute":0},{"load":42.09,"year":2020,"month":7,"day":7,"hour":0,"minute":0},{"load":60.09,"year":2020,"month":7,"day":8,"hour":0,"minute":0},{"load":28.81,"year":2020,"month":7,"day":9,"hour":0,"minute":0},{"load":20.35,"year":2020,"month":7,"day":10,"hour":0,"minute":0},{"load":58.91,"year":2020,"month":7,"day":11,"hour":0,"minute":0},{"load":56.64,"year":2020,"month":7,"day":12,"hour":0,"minute":0},{"load":57.47,"year":2020,"month":7,"day":13,"hour":0,"minute":0},{"load":24.81,"year":2020,"month":7,"day":14,"hour":0,"minute":0},{"load":51.01,"year":2020,"month":7,"day":15,"hour":0,"minute":0},{"load":27.62,"year":2020,"month":7,"day":16,"hour":0,"minute":0},{"load":19.69,"year":2020,"month":7,"day":17,"hour":0,"minute":0},{"load":28.89,"year":2020,"month":7,"day":18,"hour":0,"minute":0},{"load":16.59,"year":2020,"month":7,"day":19,"hour":0,"minute":0},{"load":21.56,"year":2020,"month":7,"day":20,"hour":0,"minute":0},{"load":62.16,"year":2020,"month":7,"day":21,"hour":0,"minute":0},{"load":29.34,"year":2020,"month":7,"day":22,"hour":0,"minute":0},{"load":36.89,"year":2020,"month":7,"day":23,"hour":0,"minute":0},{"load":52.78,"year":2020,"month":7,"day":24,"hour":0,"minute":0},{"load":50.75,"year":2020,"month":7,"day":25,"hour":0,"minute":0},{"load":33.32,"year":2020,"month":7,"day":26,"hour":0,"minute":0},{"load":27.03,"year":2020,"month":7,"day":27,"hour":0,"minute":0},{"load":41.7,"year":2020,"month":7,"day":28,"hour":0,"minute":0},{"load":63.76,"year":2020,"month":7,"day":29,"hour":0,"minute":0},{"load":59.09,"year":2020,"month":7,"day":30,"hour":0,"minute":0},{"load":28.01,"year":2020,"month":7,"day":31,"hour":0,"minute":0},{"load":24.6,"year":2020,"month":8,"day":1,"hour":0,"minute":0},{"load":31.23,"year":2020,"month":8,"day":2,"hour":0,"minute":0},{"load":54.23,"year":2020,"month":8,"day":3,"hour":0,"minute":0},{"load":29.09,"year":2020,"month":8,"day":4,"hour":0,"minute":0},{"load":24.93,"year":2020,"month":8,"day":5,"hour":0,"minute":0},{"load":59.86,"year":2020,"month":8,"day":6,"hour":0,"minute":0},{"load":45.15,"year":2020,"month":8,"day":7,"hour":0,"minute":0},{"load":55.66,"year":2020,"month":8,"day":8,"hour":0,"minute":0},{"load":35.11,"year":2020,"month":8,"day":9,"hour":0,"minute":0},{"load":16.84,"year":2020,"month":8,"day":10,"hour":0,"minute":0},{"load":42.01,"year":2020,"month":8,"day":11,"hour":0,"minute":0},{"load":66.55,"year":2020,"month":8,"day":12,"hour":0,"minute":0},{"load":21.88,"year":2020,"month":8,"day":13,"hour":0,"minute":0},{"load":67.07,"year":2020,"month":8,"day":14,"hour":0,"minute":0},{"load":62.52,"year":2020,"month":8,"day":15,"hour":0,"minute":0},{"load":35.62,"year":2020,"month":8,"day":16,"hour":0,"minute":0},{"load":39.83,"year":2020,"month":8,"day":17,"hour":0,"minute":0},{"load":16.18,"year":2020,"month":8,"day":18,"hour":0,"minute":0},{"load":20.51,"year":2020,"month":8,"day":19,"hour":0,"minute":0},{"load":37.5,"year":2020,"month":8,"day":20,"hour":0,"minute":0},{"load":51.84,"year":2020,"month":8,"day":21,"hour":0,"minute":0},{"load":27.74,"year":2020,"month":8,"day":22,"hour":0,"minute":0},{"load":53.13,"year":2020,"month":8,"day":23,"hour":0,"minute":0},{"load":22.31,"year":2020,"month":8,"day":24,"hour":0,"minute":0},{"load":66.84,"year":2020,"month":8,"day":25,"hour":0,"minute":0},{"load":30.64,"year":2020,"month":8,"day":26,"hour":0,"minute":0},{"load":49.45,"year":2020,"month":8,"day":27,"hour":0,"minute":0},{"load":63.1,"year":2020,"month":8,"day":28,"hour":0,"minute":0},{"load":47.9,"year":2020,"month":8,"day":29,"hour":0,"minute":0},{"load":42.83,"year":2020,"month":8,"day":30,"hour":0,"minute":0},{"load":22.05,"year":2020,"month":8,"day":31,"hour":0,"minute":0},{"load":45.14,"year":2020,"month":9,"day":1,"hour":0,"minute":0},{"load":67.47,"year":2020,"month":9,"day":2,"hour":0,"minute":0},{"load":30.49,"year":2020,"month":9,"day":3,"hour":0,"minute":0},{"load":26.48,"year":2020,"month":9,"day":4,"hour":0,"minute":0},{"load":29.7,"year":2020,"month":9,"day":5,"hour":0,"minute":0},{"load":35.01,"year":2020,"month":9,"day":6,"hour":0,"minute":0},{"load":48.61,"year":2020,"month":9,"day":7,"hour":0,"minute":0},{"load":57.15,"year":2020,"month":9,"day":8,"hour":0,"minute":0},{"load":37.78,"year":2020,"month":9,"day":9,"hour":0,"minute":0},{"load":39.95,"year":2020,"month":9,"day":10,"hour":0,"minute":0},{"load":54.51,"year":2020,"month":9,"day":11,"hour":0,"minute":0},{"load":37.81,"year":2020,"month":9,"day":12,"hour":0,"minute":0},{"load":38.04,"year":2020,"month":9,"day":13,"hour":0,"minute":0},{"load":17.11,"year":2020,"month":9,"day":14,"hour":0,"minute":0},{"load":54.43,"year":2020,"month":9,"day":15,"hour":0,"minute":0},{"load":46.72,"year":2020,"month":9,"day":16,"hour":0,"minute":0},{"load":38.12,"year":2020,"month":9,"day":17,"hour":0,"minute":0},{"load":56.3,"year":2020,"month":9,"day":18,"hour":0,"minute":0},{"load":34.16,"year":2020,"month":9,"day":19,"hour":0,"minute":0},{"load":64.01,"year":2020,"month":9,"day":20,"hour":0,"minute":0},{"load":37.92,"year":2020,"month":9,"day":21,"hour":0,"minute":0},{"load":59.28,"year":2020,"month":9,"day":22,"hour":0,"minute":0},{"load":20.37,"year":2020,"month":9,"day":23,"hour":0,"minute":0},{"load":52.95,"year":2020,"month":9,"day":24,"hour":0,"minute":0}],"com.grandlyon.grdf.month":[{"load":199.61,"year":2020,"month":5,"day":0,"hour":0,"minute":0},{"load":1183.37,"year":2020,"month":6,"day":0,"hour":0,"minute":0},{"load":1232.37,"year":2020,"month":7,"day":0,"hour":0,"minute":0},{"load":1284.74,"year":2020,"month":8,"day":0,"hour":0,"minute":0},{"load":984.37,"year":2020,"month":9,"day":1,"hour":0,"minute":0}],"com.grandlyon.grdf.year":[{"load":4884.46,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
diff --git a/test/data/dayData-water.json b/test/data/dayData-water.json
index 268c9df73a7b26381bc1e8775894a04b73fd23fe..476d57f98ec8f33802ca8cd8a56c2057c8100635 100644
--- a/test/data/dayData-water.json
+++ b/test/data/dayData-water.json
@@ -1 +1 @@
-{"com.grandlyon.egl.day":[{"load":299.91,"year":2020,"month":1,"day":1,"hour":0,"minute":0},{"load":296.56,"year":2020,"month":1,"day":2,"hour":0,"minute":0},{"load":240.03,"year":2020,"month":1,"day":3,"hour":0,"minute":0},{"load":236.24,"year":2020,"month":1,"day":4,"hour":0,"minute":0},{"load":291.67,"year":2020,"month":1,"day":5,"hour":0,"minute":0},{"load":210.55,"year":2020,"month":1,"day":6,"hour":0,"minute":0},{"load":203.23,"year":2020,"month":1,"day":7,"hour":0,"minute":0},{"load":281.99,"year":2020,"month":1,"day":8,"hour":0,"minute":0},{"load":250.63,"year":2020,"month":1,"day":9,"hour":0,"minute":0},{"load":259.45,"year":2020,"month":1,"day":10,"hour":0,"minute":0},{"load":238.95,"year":2020,"month":1,"day":11,"hour":0,"minute":0},{"load":236.73,"year":2020,"month":1,"day":12,"hour":0,"minute":0},{"load":280.6,"year":2020,"month":1,"day":13,"hour":0,"minute":0},{"load":205.89,"year":2020,"month":1,"day":14,"hour":0,"minute":0},{"load":254.44,"year":2020,"month":1,"day":15,"hour":0,"minute":0},{"load":292.74,"year":2020,"month":1,"day":16,"hour":0,"minute":0},{"load":296,"year":2020,"month":1,"day":17,"hour":0,"minute":0},{"load":288.7,"year":2020,"month":1,"day":18,"hour":0,"minute":0},{"load":223.4,"year":2020,"month":1,"day":19,"hour":0,"minute":0},{"load":211.4,"year":2020,"month":1,"day":20,"hour":0,"minute":0},{"load":271.46,"year":2020,"month":1,"day":21,"hour":0,"minute":0},{"load":211.2,"year":2020,"month":1,"day":22,"hour":0,"minute":0},{"load":235.32,"year":2020,"month":1,"day":23,"hour":0,"minute":0},{"load":232.02,"year":2020,"month":1,"day":24,"hour":0,"minute":0},{"load":259.27,"year":2020,"month":1,"day":25,"hour":0,"minute":0},{"load":243.77,"year":2020,"month":1,"day":26,"hour":0,"minute":0},{"load":256.47,"year":2020,"month":1,"day":27,"hour":0,"minute":0},{"load":228.03,"year":2020,"month":1,"day":28,"hour":0,"minute":0},{"load":267.64,"year":2020,"month":1,"day":29,"hour":0,"minute":0},{"load":259.33,"year":2020,"month":1,"day":30,"hour":0,"minute":0},{"load":276.25,"year":2020,"month":1,"day":31,"hour":0,"minute":0},{"load":210.73,"year":2020,"month":2,"day":1,"hour":0,"minute":0},{"load":287.85,"year":2020,"month":2,"day":2,"hour":0,"minute":0},{"load":210.99,"year":2020,"month":2,"day":3,"hour":0,"minute":0},{"load":208.92,"year":2020,"month":2,"day":4,"hour":0,"minute":0},{"load":295.65,"year":2020,"month":2,"day":5,"hour":0,"minute":0},{"load":296.67,"year":2020,"month":2,"day":6,"hour":0,"minute":0},{"load":264.52,"year":2020,"month":2,"day":7,"hour":0,"minute":0},{"load":299.73,"year":2020,"month":2,"day":8,"hour":0,"minute":0},{"load":258.76,"year":2020,"month":2,"day":9,"hour":0,"minute":0},{"load":275.98,"year":2020,"month":2,"day":10,"hour":0,"minute":0},{"load":239.97,"year":2020,"month":2,"day":11,"hour":0,"minute":0},{"load":205.36,"year":2020,"month":2,"day":12,"hour":0,"minute":0},{"load":207.2,"year":2020,"month":2,"day":13,"hour":0,"minute":0},{"load":291.79,"year":2020,"month":2,"day":14,"hour":0,"minute":0},{"load":222.06,"year":2020,"month":2,"day":15,"hour":0,"minute":0},{"load":288.42,"year":2020,"month":2,"day":16,"hour":0,"minute":0},{"load":231.57,"year":2020,"month":2,"day":17,"hour":0,"minute":0},{"load":234.53,"year":2020,"month":2,"day":18,"hour":0,"minute":0},{"load":233.43,"year":2020,"month":2,"day":19,"hour":0,"minute":0},{"load":267.26,"year":2020,"month":2,"day":20,"hour":0,"minute":0},{"load":299.93,"year":2020,"month":2,"day":21,"hour":0,"minute":0},{"load":297.36,"year":2020,"month":2,"day":22,"hour":0,"minute":0},{"load":241.96,"year":2020,"month":2,"day":23,"hour":0,"minute":0},{"load":220.85,"year":2020,"month":2,"day":24,"hour":0,"minute":0},{"load":278.39,"year":2020,"month":2,"day":25,"hour":0,"minute":0},{"load":260.37,"year":2020,"month":2,"day":26,"hour":0,"minute":0},{"load":267.83,"year":2020,"month":2,"day":27,"hour":0,"minute":0},{"load":281.76,"year":2020,"month":2,"day":28,"hour":0,"minute":0},{"load":247.64,"year":2020,"month":2,"day":29,"hour":0,"minute":0},{"load":271.26,"year":2020,"month":3,"day":1,"hour":0,"minute":0},{"load":219.47,"year":2020,"month":3,"day":2,"hour":0,"minute":0},{"load":202.65,"year":2020,"month":3,"day":3,"hour":0,"minute":0},{"load":280.34,"year":2020,"month":3,"day":4,"hour":0,"minute":0},{"load":280.48,"year":2020,"month":3,"day":5,"hour":0,"minute":0},{"load":294.57,"year":2020,"month":3,"day":6,"hour":0,"minute":0},{"load":230.79,"year":2020,"month":3,"day":7,"hour":0,"minute":0},{"load":295.34,"year":2020,"month":3,"day":8,"hour":0,"minute":0},{"load":283.26,"year":2020,"month":3,"day":9,"hour":0,"minute":0},{"load":283.79,"year":2020,"month":3,"day":10,"hour":0,"minute":0},{"load":251.3,"year":2020,"month":3,"day":11,"hour":0,"minute":0},{"load":297.2,"year":2020,"month":3,"day":12,"hour":0,"minute":0},{"load":226.87,"year":2020,"month":3,"day":13,"hour":0,"minute":0},{"load":214.02,"year":2020,"month":3,"day":14,"hour":0,"minute":0},{"load":269.95,"year":2020,"month":3,"day":15,"hour":0,"minute":0},{"load":235.28,"year":2020,"month":3,"day":16,"hour":0,"minute":0},{"load":251.1,"year":2020,"month":3,"day":17,"hour":0,"minute":0},{"load":296.24,"year":2020,"month":3,"day":18,"hour":0,"minute":0},{"load":296.49,"year":2020,"month":3,"day":19,"hour":0,"minute":0},{"load":252.83,"year":2020,"month":3,"day":20,"hour":0,"minute":0},{"load":283.27,"year":2020,"month":3,"day":21,"hour":0,"minute":0},{"load":216.5,"year":2020,"month":3,"day":22,"hour":0,"minute":0},{"load":213.42,"year":2020,"month":3,"day":23,"hour":0,"minute":0},{"load":224.05,"year":2020,"month":3,"day":24,"hour":0,"minute":0},{"load":214.4,"year":2020,"month":3,"day":25,"hour":0,"minute":0},{"load":239.42,"year":2020,"month":3,"day":26,"hour":0,"minute":0},{"load":252.32,"year":2020,"month":3,"day":27,"hour":0,"minute":0},{"load":222.37,"year":2020,"month":3,"day":28,"hour":0,"minute":0},{"load":222.35,"year":2020,"month":3,"day":29,"hour":0,"minute":0},{"load":261.47,"year":2020,"month":3,"day":30,"hour":0,"minute":0},{"load":220.18,"year":2020,"month":3,"day":31,"hour":0,"minute":0},{"load":258.52,"year":2020,"month":4,"day":1,"hour":0,"minute":0},{"load":257.72,"year":2020,"month":4,"day":2,"hour":0,"minute":0},{"load":230.25,"year":2020,"month":4,"day":3,"hour":0,"minute":0},{"load":229.2,"year":2020,"month":4,"day":4,"hour":0,"minute":0},{"load":294.61,"year":2020,"month":4,"day":5,"hour":0,"minute":0},{"load":211.77,"year":2020,"month":4,"day":6,"hour":0,"minute":0},{"load":281.43,"year":2020,"month":4,"day":7,"hour":0,"minute":0},{"load":226.14,"year":2020,"month":4,"day":8,"hour":0,"minute":0},{"load":233,"year":2020,"month":4,"day":9,"hour":0,"minute":0},{"load":260.06,"year":2020,"month":4,"day":10,"hour":0,"minute":0},{"load":266.91,"year":2020,"month":4,"day":11,"hour":0,"minute":0},{"load":285.71,"year":2020,"month":4,"day":12,"hour":0,"minute":0},{"load":245.52,"year":2020,"month":4,"day":13,"hour":0,"minute":0},{"load":225.5,"year":2020,"month":4,"day":14,"hour":0,"minute":0},{"load":213.33,"year":2020,"month":4,"day":15,"hour":0,"minute":0},{"load":294.27,"year":2020,"month":4,"day":16,"hour":0,"minute":0},{"load":260.93,"year":2020,"month":4,"day":17,"hour":0,"minute":0},{"load":269.84,"year":2020,"month":4,"day":18,"hour":0,"minute":0},{"load":269.08,"year":2020,"month":4,"day":19,"hour":0,"minute":0},{"load":254.89,"year":2020,"month":4,"day":20,"hour":0,"minute":0},{"load":221.99,"year":2020,"month":4,"day":21,"hour":0,"minute":0},{"load":237.89,"year":2020,"month":4,"day":22,"hour":0,"minute":0},{"load":205.67,"year":2020,"month":4,"day":23,"hour":0,"minute":0},{"load":238.43,"year":2020,"month":4,"day":24,"hour":0,"minute":0},{"load":263.61,"year":2020,"month":4,"day":25,"hour":0,"minute":0},{"load":200.89,"year":2020,"month":4,"day":26,"hour":0,"minute":0},{"load":296.27,"year":2020,"month":4,"day":27,"hour":0,"minute":0},{"load":210.59,"year":2020,"month":4,"day":28,"hour":0,"minute":0},{"load":251.88,"year":2020,"month":4,"day":29,"hour":0,"minute":0}],"com.grandlyon.egl.month":[{"load":8050.6,"year":2020,"month":1,"day":0,"hour":0,"minute":0},{"load":7488.01,"year":2020,"month":2,"day":0,"hour":0,"minute":0},{"load":7790.24,"year":2020,"month":3,"day":0,"hour":0,"minute":0},{"load":6937.38,"year":2020,"month":4,"day":1,"hour":0,"minute":0}],"com.grandlyon.egl.year":[{"load":30266.23,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
+{"com.grandlyon.egl.day":[{"load":237.04,"year":2020,"month":5,"day":28,"hour":0,"minute":0},{"load":242.81,"year":2020,"month":5,"day":29,"hour":0,"minute":0},{"load":212.9,"year":2020,"month":5,"day":30,"hour":0,"minute":0},{"load":268.25,"year":2020,"month":5,"day":31,"hour":0,"minute":0},{"load":266.06,"year":2020,"month":6,"day":1,"hour":0,"minute":0},{"load":289.42,"year":2020,"month":6,"day":2,"hour":0,"minute":0},{"load":289.2,"year":2020,"month":6,"day":3,"hour":0,"minute":0},{"load":286.71,"year":2020,"month":6,"day":4,"hour":0,"minute":0},{"load":207.4,"year":2020,"month":6,"day":5,"hour":0,"minute":0},{"load":288.92,"year":2020,"month":6,"day":6,"hour":0,"minute":0},{"load":233.63,"year":2020,"month":6,"day":7,"hour":0,"minute":0},{"load":202.74,"year":2020,"month":6,"day":8,"hour":0,"minute":0},{"load":278.65,"year":2020,"month":6,"day":9,"hour":0,"minute":0},{"load":284.88,"year":2020,"month":6,"day":10,"hour":0,"minute":0},{"load":276.15,"year":2020,"month":6,"day":11,"hour":0,"minute":0},{"load":257.3,"year":2020,"month":6,"day":12,"hour":0,"minute":0},{"load":277.56,"year":2020,"month":6,"day":13,"hour":0,"minute":0},{"load":264.73,"year":2020,"month":6,"day":14,"hour":0,"minute":0},{"load":298.17,"year":2020,"month":6,"day":15,"hour":0,"minute":0},{"load":234.72,"year":2020,"month":6,"day":16,"hour":0,"minute":0},{"load":249.81,"year":2020,"month":6,"day":17,"hour":0,"minute":0},{"load":224.06,"year":2020,"month":6,"day":18,"hour":0,"minute":0},{"load":222.52,"year":2020,"month":6,"day":19,"hour":0,"minute":0},{"load":213.27,"year":2020,"month":6,"day":20,"hour":0,"minute":0},{"load":259.79,"year":2020,"month":6,"day":21,"hour":0,"minute":0},{"load":216.74,"year":2020,"month":6,"day":22,"hour":0,"minute":0},{"load":226.34,"year":2020,"month":6,"day":23,"hour":0,"minute":0},{"load":248.06,"year":2020,"month":6,"day":24,"hour":0,"minute":0},{"load":298.42,"year":2020,"month":6,"day":25,"hour":0,"minute":0},{"load":204.95,"year":2020,"month":6,"day":26,"hour":0,"minute":0},{"load":291.84,"year":2020,"month":6,"day":27,"hour":0,"minute":0},{"load":229.62,"year":2020,"month":6,"day":28,"hour":0,"minute":0},{"load":233.65,"year":2020,"month":6,"day":29,"hour":0,"minute":0},{"load":292.09,"year":2020,"month":6,"day":30,"hour":0,"minute":0},{"load":278.64,"year":2020,"month":7,"day":1,"hour":0,"minute":0},{"load":226.66,"year":2020,"month":7,"day":2,"hour":0,"minute":0},{"load":243.15,"year":2020,"month":7,"day":3,"hour":0,"minute":0},{"load":282.63,"year":2020,"month":7,"day":4,"hour":0,"minute":0},{"load":254.7,"year":2020,"month":7,"day":5,"hour":0,"minute":0},{"load":260.3,"year":2020,"month":7,"day":6,"hour":0,"minute":0},{"load":267.19,"year":2020,"month":7,"day":7,"hour":0,"minute":0},{"load":248.8,"year":2020,"month":7,"day":8,"hour":0,"minute":0},{"load":254.81,"year":2020,"month":7,"day":9,"hour":0,"minute":0},{"load":230.72,"year":2020,"month":7,"day":10,"hour":0,"minute":0},{"load":292.46,"year":2020,"month":7,"day":11,"hour":0,"minute":0},{"load":233.72,"year":2020,"month":7,"day":12,"hour":0,"minute":0},{"load":212.48,"year":2020,"month":7,"day":13,"hour":0,"minute":0},{"load":232.43,"year":2020,"month":7,"day":14,"hour":0,"minute":0},{"load":222.56,"year":2020,"month":7,"day":15,"hour":0,"minute":0},{"load":228.99,"year":2020,"month":7,"day":16,"hour":0,"minute":0},{"load":270.76,"year":2020,"month":7,"day":17,"hour":0,"minute":0},{"load":291.95,"year":2020,"month":7,"day":18,"hour":0,"minute":0},{"load":230.37,"year":2020,"month":7,"day":19,"hour":0,"minute":0},{"load":221.6,"year":2020,"month":7,"day":20,"hour":0,"minute":0},{"load":293.69,"year":2020,"month":7,"day":21,"hour":0,"minute":0},{"load":283.06,"year":2020,"month":7,"day":22,"hour":0,"minute":0},{"load":273.25,"year":2020,"month":7,"day":23,"hour":0,"minute":0},{"load":284.96,"year":2020,"month":7,"day":24,"hour":0,"minute":0},{"load":247.53,"year":2020,"month":7,"day":25,"hour":0,"minute":0},{"load":241.34,"year":2020,"month":7,"day":26,"hour":0,"minute":0},{"load":222.38,"year":2020,"month":7,"day":27,"hour":0,"minute":0},{"load":273.17,"year":2020,"month":7,"day":28,"hour":0,"minute":0},{"load":236.45,"year":2020,"month":7,"day":29,"hour":0,"minute":0},{"load":291.07,"year":2020,"month":7,"day":30,"hour":0,"minute":0},{"load":283.29,"year":2020,"month":7,"day":31,"hour":0,"minute":0},{"load":249.96,"year":2020,"month":8,"day":1,"hour":0,"minute":0},{"load":241.98,"year":2020,"month":8,"day":2,"hour":0,"minute":0},{"load":250.4,"year":2020,"month":8,"day":3,"hour":0,"minute":0},{"load":207.46,"year":2020,"month":8,"day":4,"hour":0,"minute":0},{"load":224.57,"year":2020,"month":8,"day":5,"hour":0,"minute":0},{"load":281.49,"year":2020,"month":8,"day":6,"hour":0,"minute":0},{"load":208.54,"year":2020,"month":8,"day":7,"hour":0,"minute":0},{"load":271.64,"year":2020,"month":8,"day":8,"hour":0,"minute":0},{"load":295.7,"year":2020,"month":8,"day":9,"hour":0,"minute":0},{"load":287.04,"year":2020,"month":8,"day":10,"hour":0,"minute":0},{"load":278.65,"year":2020,"month":8,"day":11,"hour":0,"minute":0},{"load":282.84,"year":2020,"month":8,"day":12,"hour":0,"minute":0},{"load":268.67,"year":2020,"month":8,"day":13,"hour":0,"minute":0},{"load":246.33,"year":2020,"month":8,"day":14,"hour":0,"minute":0},{"load":208.02,"year":2020,"month":8,"day":15,"hour":0,"minute":0},{"load":210.63,"year":2020,"month":8,"day":16,"hour":0,"minute":0},{"load":258.75,"year":2020,"month":8,"day":17,"hour":0,"minute":0},{"load":264.8,"year":2020,"month":8,"day":18,"hour":0,"minute":0},{"load":298.27,"year":2020,"month":8,"day":19,"hour":0,"minute":0},{"load":282.52,"year":2020,"month":8,"day":20,"hour":0,"minute":0},{"load":271.1,"year":2020,"month":8,"day":21,"hour":0,"minute":0},{"load":283.11,"year":2020,"month":8,"day":22,"hour":0,"minute":0},{"load":243.36,"year":2020,"month":8,"day":23,"hour":0,"minute":0},{"load":287.46,"year":2020,"month":8,"day":24,"hour":0,"minute":0},{"load":281.05,"year":2020,"month":8,"day":25,"hour":0,"minute":0},{"load":237.64,"year":2020,"month":8,"day":26,"hour":0,"minute":0},{"load":258.52,"year":2020,"month":8,"day":27,"hour":0,"minute":0},{"load":270.78,"year":2020,"month":8,"day":28,"hour":0,"minute":0},{"load":266.46,"year":2020,"month":8,"day":29,"hour":0,"minute":0},{"load":217.09,"year":2020,"month":8,"day":30,"hour":0,"minute":0},{"load":202.61,"year":2020,"month":8,"day":31,"hour":0,"minute":0},{"load":283.2,"year":2020,"month":9,"day":1,"hour":0,"minute":0},{"load":267.48,"year":2020,"month":9,"day":2,"hour":0,"minute":0},{"load":243.73,"year":2020,"month":9,"day":3,"hour":0,"minute":0},{"load":292.5,"year":2020,"month":9,"day":4,"hour":0,"minute":0},{"load":243.89,"year":2020,"month":9,"day":5,"hour":0,"minute":0},{"load":288.86,"year":2020,"month":9,"day":6,"hour":0,"minute":0},{"load":240.6,"year":2020,"month":9,"day":7,"hour":0,"minute":0},{"load":230.54,"year":2020,"month":9,"day":8,"hour":0,"minute":0},{"load":223.75,"year":2020,"month":9,"day":9,"hour":0,"minute":0},{"load":257.81,"year":2020,"month":9,"day":10,"hour":0,"minute":0},{"load":200.04,"year":2020,"month":9,"day":11,"hour":0,"minute":0},{"load":204.25,"year":2020,"month":9,"day":12,"hour":0,"minute":0},{"load":297.54,"year":2020,"month":9,"day":13,"hour":0,"minute":0},{"load":214.01,"year":2020,"month":9,"day":14,"hour":0,"minute":0},{"load":277.44,"year":2020,"month":9,"day":15,"hour":0,"minute":0},{"load":292.02,"year":2020,"month":9,"day":16,"hour":0,"minute":0},{"load":273.95,"year":2020,"month":9,"day":17,"hour":0,"minute":0},{"load":224.65,"year":2020,"month":9,"day":18,"hour":0,"minute":0},{"load":205.56,"year":2020,"month":9,"day":19,"hour":0,"minute":0},{"load":233.97,"year":2020,"month":9,"day":20,"hour":0,"minute":0},{"load":283.7,"year":2020,"month":9,"day":21,"hour":0,"minute":0},{"load":236.3,"year":2020,"month":9,"day":22,"hour":0,"minute":0},{"load":242.84,"year":2020,"month":9,"day":23,"hour":0,"minute":0},{"load":232.41,"year":2020,"month":9,"day":24,"hour":0,"minute":0}],"com.grandlyon.egl.month":[{"load":1227.06,"year":2020,"month":5,"day":0,"hour":0,"minute":0},{"load":7659.98,"year":2020,"month":6,"day":0,"hour":0,"minute":0},{"load":7886.43,"year":2020,"month":7,"day":0,"hour":0,"minute":0},{"load":7970.68,"year":2020,"month":8,"day":0,"hour":0,"minute":0},{"load":5707.84,"year":2020,"month":9,"day":1,"hour":0,"minute":0}],"com.grandlyon.egl.year":[{"load":30451.99,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
diff --git a/test/data/dayData.json b/test/data/dayData.json
index 9f2082015db2c64b09c79cfe0b1ac22be300844b..ad70aaebeefc7e679e8f380b10e8d4c5ead91e75 100644
--- a/test/data/dayData.json
+++ b/test/data/dayData.json
@@ -1 +1 @@
-{"com.grandlyon.enedis.day":[{"load":5.25,"year":2020,"month":1,"day":1,"hour":0,"minute":0},{"load":3.76,"year":2020,"month":1,"day":2,"hour":0,"minute":0},{"load":8.03,"year":2020,"month":1,"day":3,"hour":0,"minute":0},{"load":5.32,"year":2020,"month":1,"day":4,"hour":0,"minute":0},{"load":8.72,"year":2020,"month":1,"day":5,"hour":0,"minute":0},{"load":8.17,"year":2020,"month":1,"day":6,"hour":0,"minute":0},{"load":6.08,"year":2020,"month":1,"day":7,"hour":0,"minute":0},{"load":4.06,"year":2020,"month":1,"day":8,"hour":0,"minute":0},{"load":4.82,"year":2020,"month":1,"day":9,"hour":0,"minute":0},{"load":7.5,"year":2020,"month":1,"day":10,"hour":0,"minute":0},{"load":6.21,"year":2020,"month":1,"day":11,"hour":0,"minute":0},{"load":4.63,"year":2020,"month":1,"day":12,"hour":0,"minute":0},{"load":4.32,"year":2020,"month":1,"day":13,"hour":0,"minute":0},{"load":8.79,"year":2020,"month":1,"day":14,"hour":0,"minute":0},{"load":7.88,"year":2020,"month":1,"day":15,"hour":0,"minute":0},{"load":4.1,"year":2020,"month":1,"day":16,"hour":0,"minute":0},{"load":5.09,"year":2020,"month":1,"day":17,"hour":0,"minute":0},{"load":8.58,"year":2020,"month":1,"day":18,"hour":0,"minute":0},{"load":9.97,"year":2020,"month":1,"day":19,"hour":0,"minute":0},{"load":6.68,"year":2020,"month":1,"day":20,"hour":0,"minute":0},{"load":9.13,"year":2020,"month":1,"day":21,"hour":0,"minute":0},{"load":4.77,"year":2020,"month":1,"day":22,"hour":0,"minute":0},{"load":3.6,"year":2020,"month":1,"day":23,"hour":0,"minute":0},{"load":8.33,"year":2020,"month":1,"day":24,"hour":0,"minute":0},{"load":3.42,"year":2020,"month":1,"day":25,"hour":0,"minute":0},{"load":8.46,"year":2020,"month":1,"day":26,"hour":0,"minute":0},{"load":5.85,"year":2020,"month":1,"day":27,"hour":0,"minute":0},{"load":3.01,"year":2020,"month":1,"day":28,"hour":0,"minute":0},{"load":8.06,"year":2020,"month":1,"day":29,"hour":0,"minute":0},{"load":6.39,"year":2020,"month":1,"day":30,"hour":0,"minute":0},{"load":6.9,"year":2020,"month":1,"day":31,"hour":0,"minute":0},{"load":3.9,"year":2020,"month":2,"day":1,"hour":0,"minute":0},{"load":8.07,"year":2020,"month":2,"day":2,"hour":0,"minute":0},{"load":9.85,"year":2020,"month":2,"day":3,"hour":0,"minute":0},{"load":7.23,"year":2020,"month":2,"day":4,"hour":0,"minute":0},{"load":6.05,"year":2020,"month":2,"day":5,"hour":0,"minute":0},{"load":8.02,"year":2020,"month":2,"day":6,"hour":0,"minute":0},{"load":8.45,"year":2020,"month":2,"day":7,"hour":0,"minute":0},{"load":7.01,"year":2020,"month":2,"day":8,"hour":0,"minute":0},{"load":6.36,"year":2020,"month":2,"day":9,"hour":0,"minute":0},{"load":3.07,"year":2020,"month":2,"day":10,"hour":0,"minute":0},{"load":4.03,"year":2020,"month":2,"day":11,"hour":0,"minute":0},{"load":7.2,"year":2020,"month":2,"day":12,"hour":0,"minute":0},{"load":3.66,"year":2020,"month":2,"day":13,"hour":0,"minute":0},{"load":8.3,"year":2020,"month":2,"day":14,"hour":0,"minute":0},{"load":5.93,"year":2020,"month":2,"day":15,"hour":0,"minute":0},{"load":9.08,"year":2020,"month":2,"day":16,"hour":0,"minute":0},{"load":5.32,"year":2020,"month":2,"day":17,"hour":0,"minute":0},{"load":4.72,"year":2020,"month":2,"day":18,"hour":0,"minute":0},{"load":6,"year":2020,"month":2,"day":19,"hour":0,"minute":0},{"load":7.73,"year":2020,"month":2,"day":20,"hour":0,"minute":0},{"load":3.59,"year":2020,"month":2,"day":21,"hour":0,"minute":0},{"load":7.75,"year":2020,"month":2,"day":22,"hour":0,"minute":0},{"load":5.37,"year":2020,"month":2,"day":23,"hour":0,"minute":0},{"load":8.33,"year":2020,"month":2,"day":24,"hour":0,"minute":0},{"load":9.02,"year":2020,"month":2,"day":25,"hour":0,"minute":0},{"load":5.19,"year":2020,"month":2,"day":26,"hour":0,"minute":0},{"load":6.75,"year":2020,"month":2,"day":27,"hour":0,"minute":0},{"load":5.49,"year":2020,"month":2,"day":28,"hour":0,"minute":0},{"load":8.13,"year":2020,"month":2,"day":29,"hour":0,"minute":0},{"load":7.68,"year":2020,"month":3,"day":1,"hour":0,"minute":0},{"load":5.47,"year":2020,"month":3,"day":2,"hour":0,"minute":0},{"load":4.37,"year":2020,"month":3,"day":3,"hour":0,"minute":0},{"load":8.85,"year":2020,"month":3,"day":4,"hour":0,"minute":0},{"load":9.68,"year":2020,"month":3,"day":5,"hour":0,"minute":0},{"load":8.61,"year":2020,"month":3,"day":6,"hour":0,"minute":0},{"load":6.27,"year":2020,"month":3,"day":7,"hour":0,"minute":0},{"load":8.06,"year":2020,"month":3,"day":8,"hour":0,"minute":0},{"load":9.96,"year":2020,"month":3,"day":9,"hour":0,"minute":0},{"load":9.91,"year":2020,"month":3,"day":10,"hour":0,"minute":0},{"load":5.55,"year":2020,"month":3,"day":11,"hour":0,"minute":0},{"load":6.27,"year":2020,"month":3,"day":12,"hour":0,"minute":0},{"load":9.86,"year":2020,"month":3,"day":13,"hour":0,"minute":0},{"load":8.55,"year":2020,"month":3,"day":14,"hour":0,"minute":0},{"load":3.36,"year":2020,"month":3,"day":15,"hour":0,"minute":0},{"load":7.22,"year":2020,"month":3,"day":16,"hour":0,"minute":0},{"load":7.82,"year":2020,"month":3,"day":17,"hour":0,"minute":0},{"load":5.28,"year":2020,"month":3,"day":18,"hour":0,"minute":0},{"load":5.82,"year":2020,"month":3,"day":19,"hour":0,"minute":0},{"load":4.65,"year":2020,"month":3,"day":20,"hour":0,"minute":0},{"load":5.52,"year":2020,"month":3,"day":21,"hour":0,"minute":0},{"load":6.94,"year":2020,"month":3,"day":22,"hour":0,"minute":0},{"load":4.58,"year":2020,"month":3,"day":23,"hour":0,"minute":0},{"load":6.12,"year":2020,"month":3,"day":24,"hour":0,"minute":0},{"load":6.24,"year":2020,"month":3,"day":25,"hour":0,"minute":0},{"load":5.14,"year":2020,"month":3,"day":26,"hour":0,"minute":0},{"load":7.43,"year":2020,"month":3,"day":27,"hour":0,"minute":0},{"load":8.71,"year":2020,"month":3,"day":28,"hour":0,"minute":0},{"load":4.07,"year":2020,"month":3,"day":29,"hour":0,"minute":0},{"load":6.7,"year":2020,"month":3,"day":30,"hour":0,"minute":0},{"load":5.08,"year":2020,"month":3,"day":31,"hour":0,"minute":0},{"load":4.72,"year":2020,"month":4,"day":1,"hour":0,"minute":0},{"load":3.11,"year":2020,"month":4,"day":2,"hour":0,"minute":0},{"load":9.82,"year":2020,"month":4,"day":3,"hour":0,"minute":0},{"load":8.12,"year":2020,"month":4,"day":4,"hour":0,"minute":0},{"load":3.04,"year":2020,"month":4,"day":5,"hour":0,"minute":0},{"load":6.59,"year":2020,"month":4,"day":6,"hour":0,"minute":0},{"load":4.94,"year":2020,"month":4,"day":7,"hour":0,"minute":0},{"load":5.26,"year":2020,"month":4,"day":8,"hour":0,"minute":0},{"load":4.45,"year":2020,"month":4,"day":9,"hour":0,"minute":0},{"load":8.01,"year":2020,"month":4,"day":10,"hour":0,"minute":0},{"load":8.93,"year":2020,"month":4,"day":11,"hour":0,"minute":0},{"load":7.82,"year":2020,"month":4,"day":12,"hour":0,"minute":0},{"load":4.13,"year":2020,"month":4,"day":13,"hour":0,"minute":0},{"load":6.43,"year":2020,"month":4,"day":14,"hour":0,"minute":0},{"load":5.82,"year":2020,"month":4,"day":15,"hour":0,"minute":0},{"load":5.44,"year":2020,"month":4,"day":16,"hour":0,"minute":0},{"load":9.53,"year":2020,"month":4,"day":17,"hour":0,"minute":0},{"load":7.29,"year":2020,"month":4,"day":18,"hour":0,"minute":0},{"load":3.61,"year":2020,"month":4,"day":19,"hour":0,"minute":0},{"load":3.04,"year":2020,"month":4,"day":20,"hour":0,"minute":0},{"load":7.83,"year":2020,"month":4,"day":21,"hour":0,"minute":0},{"load":3.21,"year":2020,"month":4,"day":22,"hour":0,"minute":0},{"load":3.76,"year":2020,"month":4,"day":23,"hour":0,"minute":0},{"load":9.21,"year":2020,"month":4,"day":24,"hour":0,"minute":0},{"load":5.85,"year":2020,"month":4,"day":25,"hour":0,"minute":0},{"load":7.79,"year":2020,"month":4,"day":26,"hour":0,"minute":0},{"load":6.8,"year":2020,"month":4,"day":27,"hour":0,"minute":0},{"load":3.89,"year":2020,"month":4,"day":28,"hour":0,"minute":0},{"load":7.34,"year":2020,"month":4,"day":29,"hour":0,"minute":0}],"com.grandlyon.enedis.month":[{"load":199.78,"year":2020,"month":1,"day":0,"hour":0,"minute":0},{"load":193.38,"year":2020,"month":2,"day":0,"hour":0,"minute":0},{"load":206.81,"year":2020,"month":3,"day":0,"hour":0,"minute":0},{"load":171.06,"year":2020,"month":4,"day":1,"hour":0,"minute":0}],"com.grandlyon.enedis.year":[{"load":771.03,"year":2020,"month":1,"day":1,"hour":0,"minute":0}],"com.grandlyon.grdf.day":[{"load":52.41,"year":2020,"month":1,"day":1,"hour":0,"minute":0},{"load":58.73,"year":2020,"month":1,"day":2,"hour":0,"minute":0},{"load":41.05,"year":2020,"month":1,"day":3,"hour":0,"minute":0},{"load":17.93,"year":2020,"month":1,"day":4,"hour":0,"minute":0},{"load":41.19,"year":2020,"month":1,"day":5,"hour":0,"minute":0},{"load":53.38,"year":2020,"month":1,"day":6,"hour":0,"minute":0},{"load":37.93,"year":2020,"month":1,"day":7,"hour":0,"minute":0},{"load":39.38,"year":2020,"month":1,"day":8,"hour":0,"minute":0},{"load":65.88,"year":2020,"month":1,"day":9,"hour":0,"minute":0},{"load":45.74,"year":2020,"month":1,"day":10,"hour":0,"minute":0},{"load":17.4,"year":2020,"month":1,"day":11,"hour":0,"minute":0},{"load":33.71,"year":2020,"month":1,"day":12,"hour":0,"minute":0},{"load":36.05,"year":2020,"month":1,"day":13,"hour":0,"minute":0},{"load":62.06,"year":2020,"month":1,"day":14,"hour":0,"minute":0},{"load":34.61,"year":2020,"month":1,"day":15,"hour":0,"minute":0},{"load":64.29,"year":2020,"month":1,"day":16,"hour":0,"minute":0},{"load":25.38,"year":2020,"month":1,"day":17,"hour":0,"minute":0},{"load":65.92,"year":2020,"month":1,"day":18,"hour":0,"minute":0},{"load":22.58,"year":2020,"month":1,"day":19,"hour":0,"minute":0},{"load":32.96,"year":2020,"month":1,"day":20,"hour":0,"minute":0},{"load":30.61,"year":2020,"month":1,"day":21,"hour":0,"minute":0},{"load":26.95,"year":2020,"month":1,"day":22,"hour":0,"minute":0},{"load":44.24,"year":2020,"month":1,"day":23,"hour":0,"minute":0},{"load":54.35,"year":2020,"month":1,"day":24,"hour":0,"minute":0},{"load":37.44,"year":2020,"month":1,"day":25,"hour":0,"minute":0},{"load":28.66,"year":2020,"month":1,"day":26,"hour":0,"minute":0},{"load":59.73,"year":2020,"month":1,"day":27,"hour":0,"minute":0},{"load":58.37,"year":2020,"month":1,"day":28,"hour":0,"minute":0},{"load":16.59,"year":2020,"month":1,"day":29,"hour":0,"minute":0},{"load":58.36,"year":2020,"month":1,"day":30,"hour":0,"minute":0},{"load":62.08,"year":2020,"month":1,"day":31,"hour":0,"minute":0},{"load":21.78,"year":2020,"month":2,"day":1,"hour":0,"minute":0},{"load":54.82,"year":2020,"month":2,"day":2,"hour":0,"minute":0},{"load":51.54,"year":2020,"month":2,"day":3,"hour":0,"minute":0},{"load":45.73,"year":2020,"month":2,"day":4,"hour":0,"minute":0},{"load":36.5,"year":2020,"month":2,"day":5,"hour":0,"minute":0},{"load":24.41,"year":2020,"month":2,"day":6,"hour":0,"minute":0},{"load":64.03,"year":2020,"month":2,"day":7,"hour":0,"minute":0},{"load":26.36,"year":2020,"month":2,"day":8,"hour":0,"minute":0},{"load":66.75,"year":2020,"month":2,"day":9,"hour":0,"minute":0},{"load":26.88,"year":2020,"month":2,"day":10,"hour":0,"minute":0},{"load":38.9,"year":2020,"month":2,"day":11,"hour":0,"minute":0},{"load":33.79,"year":2020,"month":2,"day":12,"hour":0,"minute":0},{"load":46.06,"year":2020,"month":2,"day":13,"hour":0,"minute":0},{"load":40.21,"year":2020,"month":2,"day":14,"hour":0,"minute":0},{"load":32.47,"year":2020,"month":2,"day":15,"hour":0,"minute":0},{"load":63.28,"year":2020,"month":2,"day":16,"hour":0,"minute":0},{"load":24.66,"year":2020,"month":2,"day":17,"hour":0,"minute":0},{"load":61.52,"year":2020,"month":2,"day":18,"hour":0,"minute":0},{"load":51.06,"year":2020,"month":2,"day":19,"hour":0,"minute":0},{"load":30.18,"year":2020,"month":2,"day":20,"hour":0,"minute":0},{"load":31.51,"year":2020,"month":2,"day":21,"hour":0,"minute":0},{"load":60.22,"year":2020,"month":2,"day":22,"hour":0,"minute":0},{"load":49.48,"year":2020,"month":2,"day":23,"hour":0,"minute":0},{"load":24.37,"year":2020,"month":2,"day":24,"hour":0,"minute":0},{"load":40.91,"year":2020,"month":2,"day":25,"hour":0,"minute":0},{"load":33.09,"year":2020,"month":2,"day":26,"hour":0,"minute":0},{"load":58.14,"year":2020,"month":2,"day":27,"hour":0,"minute":0},{"load":67.46,"year":2020,"month":2,"day":28,"hour":0,"minute":0},{"load":47.03,"year":2020,"month":2,"day":29,"hour":0,"minute":0},{"load":50.89,"year":2020,"month":3,"day":1,"hour":0,"minute":0},{"load":39.84,"year":2020,"month":3,"day":2,"hour":0,"minute":0},{"load":48.55,"year":2020,"month":3,"day":3,"hour":0,"minute":0},{"load":54.28,"year":2020,"month":3,"day":4,"hour":0,"minute":0},{"load":24.52,"year":2020,"month":3,"day":5,"hour":0,"minute":0},{"load":36.45,"year":2020,"month":3,"day":6,"hour":0,"minute":0},{"load":35.05,"year":2020,"month":3,"day":7,"hour":0,"minute":0},{"load":18.47,"year":2020,"month":3,"day":8,"hour":0,"minute":0},{"load":58.52,"year":2020,"month":3,"day":9,"hour":0,"minute":0},{"load":41.14,"year":2020,"month":3,"day":10,"hour":0,"minute":0},{"load":42.74,"year":2020,"month":3,"day":11,"hour":0,"minute":0},{"load":54.73,"year":2020,"month":3,"day":12,"hour":0,"minute":0},{"load":23.45,"year":2020,"month":3,"day":13,"hour":0,"minute":0},{"load":55.12,"year":2020,"month":3,"day":14,"hour":0,"minute":0},{"load":47.33,"year":2020,"month":3,"day":15,"hour":0,"minute":0},{"load":20.84,"year":2020,"month":3,"day":16,"hour":0,"minute":0},{"load":60.22,"year":2020,"month":3,"day":17,"hour":0,"minute":0},{"load":38.98,"year":2020,"month":3,"day":18,"hour":0,"minute":0},{"load":59.29,"year":2020,"month":3,"day":19,"hour":0,"minute":0},{"load":23.69,"year":2020,"month":3,"day":20,"hour":0,"minute":0},{"load":45.61,"year":2020,"month":3,"day":21,"hour":0,"minute":0},{"load":22.03,"year":2020,"month":3,"day":22,"hour":0,"minute":0},{"load":22.81,"year":2020,"month":3,"day":23,"hour":0,"minute":0},{"load":65.09,"year":2020,"month":3,"day":24,"hour":0,"minute":0},{"load":39.38,"year":2020,"month":3,"day":25,"hour":0,"minute":0},{"load":34.56,"year":2020,"month":3,"day":26,"hour":0,"minute":0},{"load":50.35,"year":2020,"month":3,"day":27,"hour":0,"minute":0},{"load":31.03,"year":2020,"month":3,"day":28,"hour":0,"minute":0},{"load":51.73,"year":2020,"month":3,"day":29,"hour":0,"minute":0},{"load":40.89,"year":2020,"month":3,"day":30,"hour":0,"minute":0},{"load":64.64,"year":2020,"month":3,"day":31,"hour":0,"minute":0},{"load":28.41,"year":2020,"month":4,"day":1,"hour":0,"minute":0},{"load":56.89,"year":2020,"month":4,"day":2,"hour":0,"minute":0},{"load":41.85,"year":2020,"month":4,"day":3,"hour":0,"minute":0},{"load":41.24,"year":2020,"month":4,"day":4,"hour":0,"minute":0},{"load":26.86,"year":2020,"month":4,"day":5,"hour":0,"minute":0},{"load":40.83,"year":2020,"month":4,"day":6,"hour":0,"minute":0},{"load":59.65,"year":2020,"month":4,"day":7,"hour":0,"minute":0},{"load":34.4,"year":2020,"month":4,"day":8,"hour":0,"minute":0},{"load":66.36,"year":2020,"month":4,"day":9,"hour":0,"minute":0},{"load":66.64,"year":2020,"month":4,"day":10,"hour":0,"minute":0},{"load":33.56,"year":2020,"month":4,"day":11,"hour":0,"minute":0},{"load":20.23,"year":2020,"month":4,"day":12,"hour":0,"minute":0},{"load":54.13,"year":2020,"month":4,"day":13,"hour":0,"minute":0},{"load":38.69,"year":2020,"month":4,"day":14,"hour":0,"minute":0},{"load":33.34,"year":2020,"month":4,"day":15,"hour":0,"minute":0},{"load":44.67,"year":2020,"month":4,"day":16,"hour":0,"minute":0},{"load":17.46,"year":2020,"month":4,"day":17,"hour":0,"minute":0},{"load":39.25,"year":2020,"month":4,"day":18,"hour":0,"minute":0},{"load":49.73,"year":2020,"month":4,"day":19,"hour":0,"minute":0},{"load":57.52,"year":2020,"month":4,"day":20,"hour":0,"minute":0},{"load":47.97,"year":2020,"month":4,"day":21,"hour":0,"minute":0},{"load":36.41,"year":2020,"month":4,"day":22,"hour":0,"minute":0},{"load":37.39,"year":2020,"month":4,"day":23,"hour":0,"minute":0},{"load":26.73,"year":2020,"month":4,"day":24,"hour":0,"minute":0},{"load":17.99,"year":2020,"month":4,"day":25,"hour":0,"minute":0},{"load":48.2,"year":2020,"month":4,"day":26,"hour":0,"minute":0},{"load":21.47,"year":2020,"month":4,"day":27,"hour":0,"minute":0},{"load":38.01,"year":2020,"month":4,"day":28,"hour":0,"minute":0},{"load":25.59,"year":2020,"month":4,"day":29,"hour":0,"minute":0}],"com.grandlyon.grdf.month":[{"load":1347.74,"year":2020,"month":1,"day":0,"hour":0,"minute":0},{"load":1282.25,"year":2020,"month":2,"day":0,"hour":0,"minute":0},{"load":1279.74,"year":2020,"month":3,"day":0,"hour":0,"minute":0},{"load":1123.06,"year":2020,"month":4,"day":1,"hour":0,"minute":0}],"com.grandlyon.grdf.year":[{"load":5032.79,"year":2020,"month":1,"day":1,"hour":0,"minute":0}],"com.grandlyon.egl.day":[{"load":299.91,"year":2020,"month":1,"day":1,"hour":0,"minute":0},{"load":296.56,"year":2020,"month":1,"day":2,"hour":0,"minute":0},{"load":240.03,"year":2020,"month":1,"day":3,"hour":0,"minute":0},{"load":236.24,"year":2020,"month":1,"day":4,"hour":0,"minute":0},{"load":291.67,"year":2020,"month":1,"day":5,"hour":0,"minute":0},{"load":210.55,"year":2020,"month":1,"day":6,"hour":0,"minute":0},{"load":203.23,"year":2020,"month":1,"day":7,"hour":0,"minute":0},{"load":281.99,"year":2020,"month":1,"day":8,"hour":0,"minute":0},{"load":250.63,"year":2020,"month":1,"day":9,"hour":0,"minute":0},{"load":259.45,"year":2020,"month":1,"day":10,"hour":0,"minute":0},{"load":238.95,"year":2020,"month":1,"day":11,"hour":0,"minute":0},{"load":236.73,"year":2020,"month":1,"day":12,"hour":0,"minute":0},{"load":280.6,"year":2020,"month":1,"day":13,"hour":0,"minute":0},{"load":205.89,"year":2020,"month":1,"day":14,"hour":0,"minute":0},{"load":254.44,"year":2020,"month":1,"day":15,"hour":0,"minute":0},{"load":292.74,"year":2020,"month":1,"day":16,"hour":0,"minute":0},{"load":296,"year":2020,"month":1,"day":17,"hour":0,"minute":0},{"load":288.7,"year":2020,"month":1,"day":18,"hour":0,"minute":0},{"load":223.4,"year":2020,"month":1,"day":19,"hour":0,"minute":0},{"load":211.4,"year":2020,"month":1,"day":20,"hour":0,"minute":0},{"load":271.46,"year":2020,"month":1,"day":21,"hour":0,"minute":0},{"load":211.2,"year":2020,"month":1,"day":22,"hour":0,"minute":0},{"load":235.32,"year":2020,"month":1,"day":23,"hour":0,"minute":0},{"load":232.02,"year":2020,"month":1,"day":24,"hour":0,"minute":0},{"load":259.27,"year":2020,"month":1,"day":25,"hour":0,"minute":0},{"load":243.77,"year":2020,"month":1,"day":26,"hour":0,"minute":0},{"load":256.47,"year":2020,"month":1,"day":27,"hour":0,"minute":0},{"load":228.03,"year":2020,"month":1,"day":28,"hour":0,"minute":0},{"load":267.64,"year":2020,"month":1,"day":29,"hour":0,"minute":0},{"load":259.33,"year":2020,"month":1,"day":30,"hour":0,"minute":0},{"load":276.25,"year":2020,"month":1,"day":31,"hour":0,"minute":0},{"load":210.73,"year":2020,"month":2,"day":1,"hour":0,"minute":0},{"load":287.85,"year":2020,"month":2,"day":2,"hour":0,"minute":0},{"load":210.99,"year":2020,"month":2,"day":3,"hour":0,"minute":0},{"load":208.92,"year":2020,"month":2,"day":4,"hour":0,"minute":0},{"load":295.65,"year":2020,"month":2,"day":5,"hour":0,"minute":0},{"load":296.67,"year":2020,"month":2,"day":6,"hour":0,"minute":0},{"load":264.52,"year":2020,"month":2,"day":7,"hour":0,"minute":0},{"load":299.73,"year":2020,"month":2,"day":8,"hour":0,"minute":0},{"load":258.76,"year":2020,"month":2,"day":9,"hour":0,"minute":0},{"load":275.98,"year":2020,"month":2,"day":10,"hour":0,"minute":0},{"load":239.97,"year":2020,"month":2,"day":11,"hour":0,"minute":0},{"load":205.36,"year":2020,"month":2,"day":12,"hour":0,"minute":0},{"load":207.2,"year":2020,"month":2,"day":13,"hour":0,"minute":0},{"load":291.79,"year":2020,"month":2,"day":14,"hour":0,"minute":0},{"load":222.06,"year":2020,"month":2,"day":15,"hour":0,"minute":0},{"load":288.42,"year":2020,"month":2,"day":16,"hour":0,"minute":0},{"load":231.57,"year":2020,"month":2,"day":17,"hour":0,"minute":0},{"load":234.53,"year":2020,"month":2,"day":18,"hour":0,"minute":0},{"load":233.43,"year":2020,"month":2,"day":19,"hour":0,"minute":0},{"load":267.26,"year":2020,"month":2,"day":20,"hour":0,"minute":0},{"load":299.93,"year":2020,"month":2,"day":21,"hour":0,"minute":0},{"load":297.36,"year":2020,"month":2,"day":22,"hour":0,"minute":0},{"load":241.96,"year":2020,"month":2,"day":23,"hour":0,"minute":0},{"load":220.85,"year":2020,"month":2,"day":24,"hour":0,"minute":0},{"load":278.39,"year":2020,"month":2,"day":25,"hour":0,"minute":0},{"load":260.37,"year":2020,"month":2,"day":26,"hour":0,"minute":0},{"load":267.83,"year":2020,"month":2,"day":27,"hour":0,"minute":0},{"load":281.76,"year":2020,"month":2,"day":28,"hour":0,"minute":0},{"load":247.64,"year":2020,"month":2,"day":29,"hour":0,"minute":0},{"load":271.26,"year":2020,"month":3,"day":1,"hour":0,"minute":0},{"load":219.47,"year":2020,"month":3,"day":2,"hour":0,"minute":0},{"load":202.65,"year":2020,"month":3,"day":3,"hour":0,"minute":0},{"load":280.34,"year":2020,"month":3,"day":4,"hour":0,"minute":0},{"load":280.48,"year":2020,"month":3,"day":5,"hour":0,"minute":0},{"load":294.57,"year":2020,"month":3,"day":6,"hour":0,"minute":0},{"load":230.79,"year":2020,"month":3,"day":7,"hour":0,"minute":0},{"load":295.34,"year":2020,"month":3,"day":8,"hour":0,"minute":0},{"load":283.26,"year":2020,"month":3,"day":9,"hour":0,"minute":0},{"load":283.79,"year":2020,"month":3,"day":10,"hour":0,"minute":0},{"load":251.3,"year":2020,"month":3,"day":11,"hour":0,"minute":0},{"load":297.2,"year":2020,"month":3,"day":12,"hour":0,"minute":0},{"load":226.87,"year":2020,"month":3,"day":13,"hour":0,"minute":0},{"load":214.02,"year":2020,"month":3,"day":14,"hour":0,"minute":0},{"load":269.95,"year":2020,"month":3,"day":15,"hour":0,"minute":0},{"load":235.28,"year":2020,"month":3,"day":16,"hour":0,"minute":0},{"load":251.1,"year":2020,"month":3,"day":17,"hour":0,"minute":0},{"load":296.24,"year":2020,"month":3,"day":18,"hour":0,"minute":0},{"load":296.49,"year":2020,"month":3,"day":19,"hour":0,"minute":0},{"load":252.83,"year":2020,"month":3,"day":20,"hour":0,"minute":0},{"load":283.27,"year":2020,"month":3,"day":21,"hour":0,"minute":0},{"load":216.5,"year":2020,"month":3,"day":22,"hour":0,"minute":0},{"load":213.42,"year":2020,"month":3,"day":23,"hour":0,"minute":0},{"load":224.05,"year":2020,"month":3,"day":24,"hour":0,"minute":0},{"load":214.4,"year":2020,"month":3,"day":25,"hour":0,"minute":0},{"load":239.42,"year":2020,"month":3,"day":26,"hour":0,"minute":0},{"load":252.32,"year":2020,"month":3,"day":27,"hour":0,"minute":0},{"load":222.37,"year":2020,"month":3,"day":28,"hour":0,"minute":0},{"load":222.35,"year":2020,"month":3,"day":29,"hour":0,"minute":0},{"load":261.47,"year":2020,"month":3,"day":30,"hour":0,"minute":0},{"load":220.18,"year":2020,"month":3,"day":31,"hour":0,"minute":0},{"load":258.52,"year":2020,"month":4,"day":1,"hour":0,"minute":0},{"load":257.72,"year":2020,"month":4,"day":2,"hour":0,"minute":0},{"load":230.25,"year":2020,"month":4,"day":3,"hour":0,"minute":0},{"load":229.2,"year":2020,"month":4,"day":4,"hour":0,"minute":0},{"load":294.61,"year":2020,"month":4,"day":5,"hour":0,"minute":0},{"load":211.77,"year":2020,"month":4,"day":6,"hour":0,"minute":0},{"load":281.43,"year":2020,"month":4,"day":7,"hour":0,"minute":0},{"load":226.14,"year":2020,"month":4,"day":8,"hour":0,"minute":0},{"load":233,"year":2020,"month":4,"day":9,"hour":0,"minute":0},{"load":260.06,"year":2020,"month":4,"day":10,"hour":0,"minute":0},{"load":266.91,"year":2020,"month":4,"day":11,"hour":0,"minute":0},{"load":285.71,"year":2020,"month":4,"day":12,"hour":0,"minute":0},{"load":245.52,"year":2020,"month":4,"day":13,"hour":0,"minute":0},{"load":225.5,"year":2020,"month":4,"day":14,"hour":0,"minute":0},{"load":213.33,"year":2020,"month":4,"day":15,"hour":0,"minute":0},{"load":294.27,"year":2020,"month":4,"day":16,"hour":0,"minute":0},{"load":260.93,"year":2020,"month":4,"day":17,"hour":0,"minute":0},{"load":269.84,"year":2020,"month":4,"day":18,"hour":0,"minute":0},{"load":269.08,"year":2020,"month":4,"day":19,"hour":0,"minute":0},{"load":254.89,"year":2020,"month":4,"day":20,"hour":0,"minute":0},{"load":221.99,"year":2020,"month":4,"day":21,"hour":0,"minute":0},{"load":237.89,"year":2020,"month":4,"day":22,"hour":0,"minute":0},{"load":205.67,"year":2020,"month":4,"day":23,"hour":0,"minute":0},{"load":238.43,"year":2020,"month":4,"day":24,"hour":0,"minute":0},{"load":263.61,"year":2020,"month":4,"day":25,"hour":0,"minute":0},{"load":200.89,"year":2020,"month":4,"day":26,"hour":0,"minute":0},{"load":296.27,"year":2020,"month":4,"day":27,"hour":0,"minute":0},{"load":210.59,"year":2020,"month":4,"day":28,"hour":0,"minute":0},{"load":251.88,"year":2020,"month":4,"day":29,"hour":0,"minute":0}],"com.grandlyon.egl.month":[{"load":8050.6,"year":2020,"month":1,"day":0,"hour":0,"minute":0},{"load":7488.01,"year":2020,"month":2,"day":0,"hour":0,"minute":0},{"load":7790.24,"year":2020,"month":3,"day":0,"hour":0,"minute":0},{"load":6937.38,"year":2020,"month":4,"day":1,"hour":0,"minute":0}],"com.grandlyon.egl.year":[{"load":30266.23,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
+{"com.grandlyon.enedis.day":[{"load":6.08,"year":2020,"month":5,"day":28,"hour":0,"minute":0},{"load":8.81,"year":2020,"month":5,"day":29,"hour":0,"minute":0},{"load":5.02,"year":2020,"month":5,"day":30,"hour":0,"minute":0},{"load":5.98,"year":2020,"month":5,"day":31,"hour":0,"minute":0},{"load":9.82,"year":2020,"month":6,"day":1,"hour":0,"minute":0},{"load":4.32,"year":2020,"month":6,"day":2,"hour":0,"minute":0},{"load":9.75,"year":2020,"month":6,"day":3,"hour":0,"minute":0},{"load":3.81,"year":2020,"month":6,"day":4,"hour":0,"minute":0},{"load":6.04,"year":2020,"month":6,"day":5,"hour":0,"minute":0},{"load":7.54,"year":2020,"month":6,"day":6,"hour":0,"minute":0},{"load":9.39,"year":2020,"month":6,"day":7,"hour":0,"minute":0},{"load":8.37,"year":2020,"month":6,"day":8,"hour":0,"minute":0},{"load":5.78,"year":2020,"month":6,"day":9,"hour":0,"minute":0},{"load":6.58,"year":2020,"month":6,"day":10,"hour":0,"minute":0},{"load":4.43,"year":2020,"month":6,"day":11,"hour":0,"minute":0},{"load":7.67,"year":2020,"month":6,"day":12,"hour":0,"minute":0},{"load":3.75,"year":2020,"month":6,"day":13,"hour":0,"minute":0},{"load":4.73,"year":2020,"month":6,"day":14,"hour":0,"minute":0},{"load":8.91,"year":2020,"month":6,"day":15,"hour":0,"minute":0},{"load":4.42,"year":2020,"month":6,"day":16,"hour":0,"minute":0},{"load":7.69,"year":2020,"month":6,"day":17,"hour":0,"minute":0},{"load":9.82,"year":2020,"month":6,"day":18,"hour":0,"minute":0},{"load":6.59,"year":2020,"month":6,"day":19,"hour":0,"minute":0},{"load":9.21,"year":2020,"month":6,"day":20,"hour":0,"minute":0},{"load":7.76,"year":2020,"month":6,"day":21,"hour":0,"minute":0},{"load":9.97,"year":2020,"month":6,"day":22,"hour":0,"minute":0},{"load":7.81,"year":2020,"month":6,"day":23,"hour":0,"minute":0},{"load":8.77,"year":2020,"month":6,"day":24,"hour":0,"minute":0},{"load":4.16,"year":2020,"month":6,"day":25,"hour":0,"minute":0},{"load":9.88,"year":2020,"month":6,"day":26,"hour":0,"minute":0},{"load":7.31,"year":2020,"month":6,"day":27,"hour":0,"minute":0},{"load":4.86,"year":2020,"month":6,"day":28,"hour":0,"minute":0},{"load":5.16,"year":2020,"month":6,"day":29,"hour":0,"minute":0},{"load":5.79,"year":2020,"month":6,"day":30,"hour":0,"minute":0},{"load":6.7,"year":2020,"month":7,"day":1,"hour":0,"minute":0},{"load":5.9,"year":2020,"month":7,"day":2,"hour":0,"minute":0},{"load":4.19,"year":2020,"month":7,"day":3,"hour":0,"minute":0},{"load":5.47,"year":2020,"month":7,"day":4,"hour":0,"minute":0},{"load":3.37,"year":2020,"month":7,"day":5,"hour":0,"minute":0},{"load":8.55,"year":2020,"month":7,"day":6,"hour":0,"minute":0},{"load":6.72,"year":2020,"month":7,"day":7,"hour":0,"minute":0},{"load":9.01,"year":2020,"month":7,"day":8,"hour":0,"minute":0},{"load":3.45,"year":2020,"month":7,"day":9,"hour":0,"minute":0},{"load":7.42,"year":2020,"month":7,"day":10,"hour":0,"minute":0},{"load":8.56,"year":2020,"month":7,"day":11,"hour":0,"minute":0},{"load":7.81,"year":2020,"month":7,"day":12,"hour":0,"minute":0},{"load":6.18,"year":2020,"month":7,"day":13,"hour":0,"minute":0},{"load":5.78,"year":2020,"month":7,"day":14,"hour":0,"minute":0},{"load":7.08,"year":2020,"month":7,"day":15,"hour":0,"minute":0},{"load":4.79,"year":2020,"month":7,"day":16,"hour":0,"minute":0},{"load":6.06,"year":2020,"month":7,"day":17,"hour":0,"minute":0},{"load":5.91,"year":2020,"month":7,"day":18,"hour":0,"minute":0},{"load":7,"year":2020,"month":7,"day":19,"hour":0,"minute":0},{"load":6.26,"year":2020,"month":7,"day":20,"hour":0,"minute":0},{"load":4.46,"year":2020,"month":7,"day":21,"hour":0,"minute":0},{"load":6.15,"year":2020,"month":7,"day":22,"hour":0,"minute":0},{"load":4.61,"year":2020,"month":7,"day":23,"hour":0,"minute":0},{"load":5.69,"year":2020,"month":7,"day":24,"hour":0,"minute":0},{"load":7.3,"year":2020,"month":7,"day":25,"hour":0,"minute":0},{"load":6.74,"year":2020,"month":7,"day":26,"hour":0,"minute":0},{"load":6.58,"year":2020,"month":7,"day":27,"hour":0,"minute":0},{"load":3.72,"year":2020,"month":7,"day":28,"hour":0,"minute":0},{"load":8.85,"year":2020,"month":7,"day":29,"hour":0,"minute":0},{"load":4.37,"year":2020,"month":7,"day":30,"hour":0,"minute":0},{"load":8.28,"year":2020,"month":7,"day":31,"hour":0,"minute":0},{"load":5.62,"year":2020,"month":8,"day":1,"hour":0,"minute":0},{"load":9.24,"year":2020,"month":8,"day":2,"hour":0,"minute":0},{"load":9.99,"year":2020,"month":8,"day":3,"hour":0,"minute":0},{"load":3.75,"year":2020,"month":8,"day":4,"hour":0,"minute":0},{"load":4.93,"year":2020,"month":8,"day":5,"hour":0,"minute":0},{"load":4.9,"year":2020,"month":8,"day":6,"hour":0,"minute":0},{"load":8.48,"year":2020,"month":8,"day":7,"hour":0,"minute":0},{"load":6.03,"year":2020,"month":8,"day":8,"hour":0,"minute":0},{"load":4.47,"year":2020,"month":8,"day":9,"hour":0,"minute":0},{"load":5.02,"year":2020,"month":8,"day":10,"hour":0,"minute":0},{"load":4.68,"year":2020,"month":8,"day":11,"hour":0,"minute":0},{"load":5.72,"year":2020,"month":8,"day":12,"hour":0,"minute":0},{"load":3.56,"year":2020,"month":8,"day":13,"hour":0,"minute":0},{"load":9.03,"year":2020,"month":8,"day":14,"hour":0,"minute":0},{"load":5.29,"year":2020,"month":8,"day":15,"hour":0,"minute":0},{"load":9.19,"year":2020,"month":8,"day":16,"hour":0,"minute":0},{"load":4.99,"year":2020,"month":8,"day":17,"hour":0,"minute":0},{"load":8.06,"year":2020,"month":8,"day":18,"hour":0,"minute":0},{"load":9.2,"year":2020,"month":8,"day":19,"hour":0,"minute":0},{"load":5,"year":2020,"month":8,"day":20,"hour":0,"minute":0},{"load":9.42,"year":2020,"month":8,"day":21,"hour":0,"minute":0},{"load":4.85,"year":2020,"month":8,"day":22,"hour":0,"minute":0},{"load":6.55,"year":2020,"month":8,"day":23,"hour":0,"minute":0},{"load":6.52,"year":2020,"month":8,"day":24,"hour":0,"minute":0},{"load":5.64,"year":2020,"month":8,"day":25,"hour":0,"minute":0},{"load":8.91,"year":2020,"month":8,"day":26,"hour":0,"minute":0},{"load":9.87,"year":2020,"month":8,"day":27,"hour":0,"minute":0},{"load":5.38,"year":2020,"month":8,"day":28,"hour":0,"minute":0},{"load":4.93,"year":2020,"month":8,"day":29,"hour":0,"minute":0},{"load":5.02,"year":2020,"month":8,"day":30,"hour":0,"minute":0},{"load":5.1,"year":2020,"month":8,"day":31,"hour":0,"minute":0},{"load":8.9,"year":2020,"month":9,"day":1,"hour":0,"minute":0},{"load":8.43,"year":2020,"month":9,"day":2,"hour":0,"minute":0},{"load":7.32,"year":2020,"month":9,"day":3,"hour":0,"minute":0},{"load":3.65,"year":2020,"month":9,"day":4,"hour":0,"minute":0},{"load":8.47,"year":2020,"month":9,"day":5,"hour":0,"minute":0},{"load":3.65,"year":2020,"month":9,"day":6,"hour":0,"minute":0},{"load":5.37,"year":2020,"month":9,"day":7,"hour":0,"minute":0},{"load":4.26,"year":2020,"month":9,"day":8,"hour":0,"minute":0},{"load":4,"year":2020,"month":9,"day":9,"hour":0,"minute":0},{"load":8.67,"year":2020,"month":9,"day":10,"hour":0,"minute":0},{"load":4.9,"year":2020,"month":9,"day":11,"hour":0,"minute":0},{"load":9.78,"year":2020,"month":9,"day":12,"hour":0,"minute":0},{"load":6.76,"year":2020,"month":9,"day":13,"hour":0,"minute":0},{"load":6.16,"year":2020,"month":9,"day":14,"hour":0,"minute":0},{"load":4.8,"year":2020,"month":9,"day":15,"hour":0,"minute":0},{"load":7.33,"year":2020,"month":9,"day":16,"hour":0,"minute":0},{"load":3.59,"year":2020,"month":9,"day":17,"hour":0,"minute":0},{"load":6.12,"year":2020,"month":9,"day":18,"hour":0,"minute":0},{"load":6.59,"year":2020,"month":9,"day":19,"hour":0,"minute":0},{"load":3.91,"year":2020,"month":9,"day":20,"hour":0,"minute":0},{"load":5.11,"year":2020,"month":9,"day":21,"hour":0,"minute":0},{"load":8.38,"year":2020,"month":9,"day":22,"hour":0,"minute":0},{"load":6.97,"year":2020,"month":9,"day":23,"hour":0,"minute":0},{"load":6.39,"year":2020,"month":9,"day":24,"hour":0,"minute":0}],"com.grandlyon.enedis.month":[{"load":35.71,"year":2020,"month":5,"day":0,"hour":0,"minute":0},{"load":206.97,"year":2020,"month":6,"day":0,"hour":0,"minute":0},{"load":191.88,"year":2020,"month":7,"day":0,"hour":0,"minute":0},{"load":202.62,"year":2020,"month":8,"day":0,"hour":0,"minute":0},{"load":140.61,"year":2020,"month":9,"day":1,"hour":0,"minute":0}],"com.grandlyon.enedis.year":[{"load":777.79,"year":2020,"month":1,"day":1,"hour":0,"minute":0}],"com.grandlyon.grdf.day":[{"load":35.53,"year":2020,"month":5,"day":28,"hour":0,"minute":0},{"load":25.49,"year":2020,"month":5,"day":29,"hour":0,"minute":0},{"load":16.23,"year":2020,"month":5,"day":30,"hour":0,"minute":0},{"load":59.35,"year":2020,"month":5,"day":31,"hour":0,"minute":0},{"load":63.01,"year":2020,"month":6,"day":1,"hour":0,"minute":0},{"load":46.92,"year":2020,"month":6,"day":2,"hour":0,"minute":0},{"load":49.29,"year":2020,"month":6,"day":3,"hour":0,"minute":0},{"load":38.33,"year":2020,"month":6,"day":4,"hour":0,"minute":0},{"load":64.76,"year":2020,"month":6,"day":5,"hour":0,"minute":0},{"load":58.58,"year":2020,"month":6,"day":6,"hour":0,"minute":0},{"load":58.57,"year":2020,"month":6,"day":7,"hour":0,"minute":0},{"load":30.01,"year":2020,"month":6,"day":8,"hour":0,"minute":0},{"load":46.96,"year":2020,"month":6,"day":9,"hour":0,"minute":0},{"load":49.11,"year":2020,"month":6,"day":10,"hour":0,"minute":0},{"load":54.54,"year":2020,"month":6,"day":11,"hour":0,"minute":0},{"load":18.32,"year":2020,"month":6,"day":12,"hour":0,"minute":0},{"load":67.22,"year":2020,"month":6,"day":13,"hour":0,"minute":0},{"load":36.71,"year":2020,"month":6,"day":14,"hour":0,"minute":0},{"load":52.45,"year":2020,"month":6,"day":15,"hour":0,"minute":0},{"load":18.15,"year":2020,"month":6,"day":16,"hour":0,"minute":0},{"load":16.12,"year":2020,"month":6,"day":17,"hour":0,"minute":0},{"load":23.03,"year":2020,"month":6,"day":18,"hour":0,"minute":0},{"load":58.67,"year":2020,"month":6,"day":19,"hour":0,"minute":0},{"load":21.87,"year":2020,"month":6,"day":20,"hour":0,"minute":0},{"load":31.59,"year":2020,"month":6,"day":21,"hour":0,"minute":0},{"load":30.95,"year":2020,"month":6,"day":22,"hour":0,"minute":0},{"load":30.73,"year":2020,"month":6,"day":23,"hour":0,"minute":0},{"load":24.53,"year":2020,"month":6,"day":24,"hour":0,"minute":0},{"load":23.6,"year":2020,"month":6,"day":25,"hour":0,"minute":0},{"load":43.88,"year":2020,"month":6,"day":26,"hour":0,"minute":0},{"load":20.22,"year":2020,"month":6,"day":27,"hour":0,"minute":0},{"load":36.81,"year":2020,"month":6,"day":28,"hour":0,"minute":0},{"load":41.63,"year":2020,"month":6,"day":29,"hour":0,"minute":0},{"load":32.63,"year":2020,"month":6,"day":30,"hour":0,"minute":0},{"load":57.19,"year":2020,"month":7,"day":1,"hour":0,"minute":0},{"load":53.01,"year":2020,"month":7,"day":2,"hour":0,"minute":0},{"load":32.09,"year":2020,"month":7,"day":3,"hour":0,"minute":0},{"load":59.38,"year":2020,"month":7,"day":4,"hour":0,"minute":0},{"load":18.23,"year":2020,"month":7,"day":5,"hour":0,"minute":0},{"load":45.7,"year":2020,"month":7,"day":6,"hour":0,"minute":0},{"load":42.09,"year":2020,"month":7,"day":7,"hour":0,"minute":0},{"load":60.09,"year":2020,"month":7,"day":8,"hour":0,"minute":0},{"load":28.81,"year":2020,"month":7,"day":9,"hour":0,"minute":0},{"load":20.35,"year":2020,"month":7,"day":10,"hour":0,"minute":0},{"load":58.91,"year":2020,"month":7,"day":11,"hour":0,"minute":0},{"load":56.64,"year":2020,"month":7,"day":12,"hour":0,"minute":0},{"load":57.47,"year":2020,"month":7,"day":13,"hour":0,"minute":0},{"load":24.81,"year":2020,"month":7,"day":14,"hour":0,"minute":0},{"load":51.01,"year":2020,"month":7,"day":15,"hour":0,"minute":0},{"load":27.62,"year":2020,"month":7,"day":16,"hour":0,"minute":0},{"load":19.69,"year":2020,"month":7,"day":17,"hour":0,"minute":0},{"load":28.89,"year":2020,"month":7,"day":18,"hour":0,"minute":0},{"load":16.59,"year":2020,"month":7,"day":19,"hour":0,"minute":0},{"load":21.56,"year":2020,"month":7,"day":20,"hour":0,"minute":0},{"load":62.16,"year":2020,"month":7,"day":21,"hour":0,"minute":0},{"load":29.34,"year":2020,"month":7,"day":22,"hour":0,"minute":0},{"load":36.89,"year":2020,"month":7,"day":23,"hour":0,"minute":0},{"load":52.78,"year":2020,"month":7,"day":24,"hour":0,"minute":0},{"load":50.75,"year":2020,"month":7,"day":25,"hour":0,"minute":0},{"load":33.32,"year":2020,"month":7,"day":26,"hour":0,"minute":0},{"load":27.03,"year":2020,"month":7,"day":27,"hour":0,"minute":0},{"load":41.7,"year":2020,"month":7,"day":28,"hour":0,"minute":0},{"load":63.76,"year":2020,"month":7,"day":29,"hour":0,"minute":0},{"load":59.09,"year":2020,"month":7,"day":30,"hour":0,"minute":0},{"load":28.01,"year":2020,"month":7,"day":31,"hour":0,"minute":0},{"load":24.6,"year":2020,"month":8,"day":1,"hour":0,"minute":0},{"load":31.23,"year":2020,"month":8,"day":2,"hour":0,"minute":0},{"load":54.23,"year":2020,"month":8,"day":3,"hour":0,"minute":0},{"load":29.09,"year":2020,"month":8,"day":4,"hour":0,"minute":0},{"load":24.93,"year":2020,"month":8,"day":5,"hour":0,"minute":0},{"load":59.86,"year":2020,"month":8,"day":6,"hour":0,"minute":0},{"load":45.15,"year":2020,"month":8,"day":7,"hour":0,"minute":0},{"load":55.66,"year":2020,"month":8,"day":8,"hour":0,"minute":0},{"load":35.11,"year":2020,"month":8,"day":9,"hour":0,"minute":0},{"load":16.84,"year":2020,"month":8,"day":10,"hour":0,"minute":0},{"load":42.01,"year":2020,"month":8,"day":11,"hour":0,"minute":0},{"load":66.55,"year":2020,"month":8,"day":12,"hour":0,"minute":0},{"load":21.88,"year":2020,"month":8,"day":13,"hour":0,"minute":0},{"load":67.07,"year":2020,"month":8,"day":14,"hour":0,"minute":0},{"load":62.52,"year":2020,"month":8,"day":15,"hour":0,"minute":0},{"load":35.62,"year":2020,"month":8,"day":16,"hour":0,"minute":0},{"load":39.83,"year":2020,"month":8,"day":17,"hour":0,"minute":0},{"load":16.18,"year":2020,"month":8,"day":18,"hour":0,"minute":0},{"load":20.51,"year":2020,"month":8,"day":19,"hour":0,"minute":0},{"load":37.5,"year":2020,"month":8,"day":20,"hour":0,"minute":0},{"load":51.84,"year":2020,"month":8,"day":21,"hour":0,"minute":0},{"load":27.74,"year":2020,"month":8,"day":22,"hour":0,"minute":0},{"load":53.13,"year":2020,"month":8,"day":23,"hour":0,"minute":0},{"load":22.31,"year":2020,"month":8,"day":24,"hour":0,"minute":0},{"load":66.84,"year":2020,"month":8,"day":25,"hour":0,"minute":0},{"load":30.64,"year":2020,"month":8,"day":26,"hour":0,"minute":0},{"load":49.45,"year":2020,"month":8,"day":27,"hour":0,"minute":0},{"load":63.1,"year":2020,"month":8,"day":28,"hour":0,"minute":0},{"load":47.9,"year":2020,"month":8,"day":29,"hour":0,"minute":0},{"load":42.83,"year":2020,"month":8,"day":30,"hour":0,"minute":0},{"load":22.05,"year":2020,"month":8,"day":31,"hour":0,"minute":0},{"load":45.14,"year":2020,"month":9,"day":1,"hour":0,"minute":0},{"load":67.47,"year":2020,"month":9,"day":2,"hour":0,"minute":0},{"load":30.49,"year":2020,"month":9,"day":3,"hour":0,"minute":0},{"load":26.48,"year":2020,"month":9,"day":4,"hour":0,"minute":0},{"load":29.7,"year":2020,"month":9,"day":5,"hour":0,"minute":0},{"load":35.01,"year":2020,"month":9,"day":6,"hour":0,"minute":0},{"load":48.61,"year":2020,"month":9,"day":7,"hour":0,"minute":0},{"load":57.15,"year":2020,"month":9,"day":8,"hour":0,"minute":0},{"load":37.78,"year":2020,"month":9,"day":9,"hour":0,"minute":0},{"load":39.95,"year":2020,"month":9,"day":10,"hour":0,"minute":0},{"load":54.51,"year":2020,"month":9,"day":11,"hour":0,"minute":0},{"load":37.81,"year":2020,"month":9,"day":12,"hour":0,"minute":0},{"load":38.04,"year":2020,"month":9,"day":13,"hour":0,"minute":0},{"load":17.11,"year":2020,"month":9,"day":14,"hour":0,"minute":0},{"load":54.43,"year":2020,"month":9,"day":15,"hour":0,"minute":0},{"load":46.72,"year":2020,"month":9,"day":16,"hour":0,"minute":0},{"load":38.12,"year":2020,"month":9,"day":17,"hour":0,"minute":0},{"load":56.3,"year":2020,"month":9,"day":18,"hour":0,"minute":0},{"load":34.16,"year":2020,"month":9,"day":19,"hour":0,"minute":0},{"load":64.01,"year":2020,"month":9,"day":20,"hour":0,"minute":0},{"load":37.92,"year":2020,"month":9,"day":21,"hour":0,"minute":0},{"load":59.28,"year":2020,"month":9,"day":22,"hour":0,"minute":0},{"load":20.37,"year":2020,"month":9,"day":23,"hour":0,"minute":0},{"load":52.95,"year":2020,"month":9,"day":24,"hour":0,"minute":0}],"com.grandlyon.grdf.month":[{"load":199.61,"year":2020,"month":5,"day":0,"hour":0,"minute":0},{"load":1183.37,"year":2020,"month":6,"day":0,"hour":0,"minute":0},{"load":1232.37,"year":2020,"month":7,"day":0,"hour":0,"minute":0},{"load":1284.74,"year":2020,"month":8,"day":0,"hour":0,"minute":0},{"load":984.37,"year":2020,"month":9,"day":1,"hour":0,"minute":0}],"com.grandlyon.grdf.year":[{"load":4884.46,"year":2020,"month":1,"day":1,"hour":0,"minute":0}],"com.grandlyon.egl.day":[{"load":237.04,"year":2020,"month":5,"day":28,"hour":0,"minute":0},{"load":242.81,"year":2020,"month":5,"day":29,"hour":0,"minute":0},{"load":212.9,"year":2020,"month":5,"day":30,"hour":0,"minute":0},{"load":268.25,"year":2020,"month":5,"day":31,"hour":0,"minute":0},{"load":266.06,"year":2020,"month":6,"day":1,"hour":0,"minute":0},{"load":289.42,"year":2020,"month":6,"day":2,"hour":0,"minute":0},{"load":289.2,"year":2020,"month":6,"day":3,"hour":0,"minute":0},{"load":286.71,"year":2020,"month":6,"day":4,"hour":0,"minute":0},{"load":207.4,"year":2020,"month":6,"day":5,"hour":0,"minute":0},{"load":288.92,"year":2020,"month":6,"day":6,"hour":0,"minute":0},{"load":233.63,"year":2020,"month":6,"day":7,"hour":0,"minute":0},{"load":202.74,"year":2020,"month":6,"day":8,"hour":0,"minute":0},{"load":278.65,"year":2020,"month":6,"day":9,"hour":0,"minute":0},{"load":284.88,"year":2020,"month":6,"day":10,"hour":0,"minute":0},{"load":276.15,"year":2020,"month":6,"day":11,"hour":0,"minute":0},{"load":257.3,"year":2020,"month":6,"day":12,"hour":0,"minute":0},{"load":277.56,"year":2020,"month":6,"day":13,"hour":0,"minute":0},{"load":264.73,"year":2020,"month":6,"day":14,"hour":0,"minute":0},{"load":298.17,"year":2020,"month":6,"day":15,"hour":0,"minute":0},{"load":234.72,"year":2020,"month":6,"day":16,"hour":0,"minute":0},{"load":249.81,"year":2020,"month":6,"day":17,"hour":0,"minute":0},{"load":224.06,"year":2020,"month":6,"day":18,"hour":0,"minute":0},{"load":222.52,"year":2020,"month":6,"day":19,"hour":0,"minute":0},{"load":213.27,"year":2020,"month":6,"day":20,"hour":0,"minute":0},{"load":259.79,"year":2020,"month":6,"day":21,"hour":0,"minute":0},{"load":216.74,"year":2020,"month":6,"day":22,"hour":0,"minute":0},{"load":226.34,"year":2020,"month":6,"day":23,"hour":0,"minute":0},{"load":248.06,"year":2020,"month":6,"day":24,"hour":0,"minute":0},{"load":298.42,"year":2020,"month":6,"day":25,"hour":0,"minute":0},{"load":204.95,"year":2020,"month":6,"day":26,"hour":0,"minute":0},{"load":291.84,"year":2020,"month":6,"day":27,"hour":0,"minute":0},{"load":229.62,"year":2020,"month":6,"day":28,"hour":0,"minute":0},{"load":233.65,"year":2020,"month":6,"day":29,"hour":0,"minute":0},{"load":292.09,"year":2020,"month":6,"day":30,"hour":0,"minute":0},{"load":278.64,"year":2020,"month":7,"day":1,"hour":0,"minute":0},{"load":226.66,"year":2020,"month":7,"day":2,"hour":0,"minute":0},{"load":243.15,"year":2020,"month":7,"day":3,"hour":0,"minute":0},{"load":282.63,"year":2020,"month":7,"day":4,"hour":0,"minute":0},{"load":254.7,"year":2020,"month":7,"day":5,"hour":0,"minute":0},{"load":260.3,"year":2020,"month":7,"day":6,"hour":0,"minute":0},{"load":267.19,"year":2020,"month":7,"day":7,"hour":0,"minute":0},{"load":248.8,"year":2020,"month":7,"day":8,"hour":0,"minute":0},{"load":254.81,"year":2020,"month":7,"day":9,"hour":0,"minute":0},{"load":230.72,"year":2020,"month":7,"day":10,"hour":0,"minute":0},{"load":292.46,"year":2020,"month":7,"day":11,"hour":0,"minute":0},{"load":233.72,"year":2020,"month":7,"day":12,"hour":0,"minute":0},{"load":212.48,"year":2020,"month":7,"day":13,"hour":0,"minute":0},{"load":232.43,"year":2020,"month":7,"day":14,"hour":0,"minute":0},{"load":222.56,"year":2020,"month":7,"day":15,"hour":0,"minute":0},{"load":228.99,"year":2020,"month":7,"day":16,"hour":0,"minute":0},{"load":270.76,"year":2020,"month":7,"day":17,"hour":0,"minute":0},{"load":291.95,"year":2020,"month":7,"day":18,"hour":0,"minute":0},{"load":230.37,"year":2020,"month":7,"day":19,"hour":0,"minute":0},{"load":221.6,"year":2020,"month":7,"day":20,"hour":0,"minute":0},{"load":293.69,"year":2020,"month":7,"day":21,"hour":0,"minute":0},{"load":283.06,"year":2020,"month":7,"day":22,"hour":0,"minute":0},{"load":273.25,"year":2020,"month":7,"day":23,"hour":0,"minute":0},{"load":284.96,"year":2020,"month":7,"day":24,"hour":0,"minute":0},{"load":247.53,"year":2020,"month":7,"day":25,"hour":0,"minute":0},{"load":241.34,"year":2020,"month":7,"day":26,"hour":0,"minute":0},{"load":222.38,"year":2020,"month":7,"day":27,"hour":0,"minute":0},{"load":273.17,"year":2020,"month":7,"day":28,"hour":0,"minute":0},{"load":236.45,"year":2020,"month":7,"day":29,"hour":0,"minute":0},{"load":291.07,"year":2020,"month":7,"day":30,"hour":0,"minute":0},{"load":283.29,"year":2020,"month":7,"day":31,"hour":0,"minute":0},{"load":249.96,"year":2020,"month":8,"day":1,"hour":0,"minute":0},{"load":241.98,"year":2020,"month":8,"day":2,"hour":0,"minute":0},{"load":250.4,"year":2020,"month":8,"day":3,"hour":0,"minute":0},{"load":207.46,"year":2020,"month":8,"day":4,"hour":0,"minute":0},{"load":224.57,"year":2020,"month":8,"day":5,"hour":0,"minute":0},{"load":281.49,"year":2020,"month":8,"day":6,"hour":0,"minute":0},{"load":208.54,"year":2020,"month":8,"day":7,"hour":0,"minute":0},{"load":271.64,"year":2020,"month":8,"day":8,"hour":0,"minute":0},{"load":295.7,"year":2020,"month":8,"day":9,"hour":0,"minute":0},{"load":287.04,"year":2020,"month":8,"day":10,"hour":0,"minute":0},{"load":278.65,"year":2020,"month":8,"day":11,"hour":0,"minute":0},{"load":282.84,"year":2020,"month":8,"day":12,"hour":0,"minute":0},{"load":268.67,"year":2020,"month":8,"day":13,"hour":0,"minute":0},{"load":246.33,"year":2020,"month":8,"day":14,"hour":0,"minute":0},{"load":208.02,"year":2020,"month":8,"day":15,"hour":0,"minute":0},{"load":210.63,"year":2020,"month":8,"day":16,"hour":0,"minute":0},{"load":258.75,"year":2020,"month":8,"day":17,"hour":0,"minute":0},{"load":264.8,"year":2020,"month":8,"day":18,"hour":0,"minute":0},{"load":298.27,"year":2020,"month":8,"day":19,"hour":0,"minute":0},{"load":282.52,"year":2020,"month":8,"day":20,"hour":0,"minute":0},{"load":271.1,"year":2020,"month":8,"day":21,"hour":0,"minute":0},{"load":283.11,"year":2020,"month":8,"day":22,"hour":0,"minute":0},{"load":243.36,"year":2020,"month":8,"day":23,"hour":0,"minute":0},{"load":287.46,"year":2020,"month":8,"day":24,"hour":0,"minute":0},{"load":281.05,"year":2020,"month":8,"day":25,"hour":0,"minute":0},{"load":237.64,"year":2020,"month":8,"day":26,"hour":0,"minute":0},{"load":258.52,"year":2020,"month":8,"day":27,"hour":0,"minute":0},{"load":270.78,"year":2020,"month":8,"day":28,"hour":0,"minute":0},{"load":266.46,"year":2020,"month":8,"day":29,"hour":0,"minute":0},{"load":217.09,"year":2020,"month":8,"day":30,"hour":0,"minute":0},{"load":202.61,"year":2020,"month":8,"day":31,"hour":0,"minute":0},{"load":283.2,"year":2020,"month":9,"day":1,"hour":0,"minute":0},{"load":267.48,"year":2020,"month":9,"day":2,"hour":0,"minute":0},{"load":243.73,"year":2020,"month":9,"day":3,"hour":0,"minute":0},{"load":292.5,"year":2020,"month":9,"day":4,"hour":0,"minute":0},{"load":243.89,"year":2020,"month":9,"day":5,"hour":0,"minute":0},{"load":288.86,"year":2020,"month":9,"day":6,"hour":0,"minute":0},{"load":240.6,"year":2020,"month":9,"day":7,"hour":0,"minute":0},{"load":230.54,"year":2020,"month":9,"day":8,"hour":0,"minute":0},{"load":223.75,"year":2020,"month":9,"day":9,"hour":0,"minute":0},{"load":257.81,"year":2020,"month":9,"day":10,"hour":0,"minute":0},{"load":200.04,"year":2020,"month":9,"day":11,"hour":0,"minute":0},{"load":204.25,"year":2020,"month":9,"day":12,"hour":0,"minute":0},{"load":297.54,"year":2020,"month":9,"day":13,"hour":0,"minute":0},{"load":214.01,"year":2020,"month":9,"day":14,"hour":0,"minute":0},{"load":277.44,"year":2020,"month":9,"day":15,"hour":0,"minute":0},{"load":292.02,"year":2020,"month":9,"day":16,"hour":0,"minute":0},{"load":273.95,"year":2020,"month":9,"day":17,"hour":0,"minute":0},{"load":224.65,"year":2020,"month":9,"day":18,"hour":0,"minute":0},{"load":205.56,"year":2020,"month":9,"day":19,"hour":0,"minute":0},{"load":233.97,"year":2020,"month":9,"day":20,"hour":0,"minute":0},{"load":283.7,"year":2020,"month":9,"day":21,"hour":0,"minute":0},{"load":236.3,"year":2020,"month":9,"day":22,"hour":0,"minute":0},{"load":242.84,"year":2020,"month":9,"day":23,"hour":0,"minute":0},{"load":232.41,"year":2020,"month":9,"day":24,"hour":0,"minute":0}],"com.grandlyon.egl.month":[{"load":1227.06,"year":2020,"month":5,"day":0,"hour":0,"minute":0},{"load":7659.98,"year":2020,"month":6,"day":0,"hour":0,"minute":0},{"load":7886.43,"year":2020,"month":7,"day":0,"hour":0,"minute":0},{"load":7970.68,"year":2020,"month":8,"day":0,"hour":0,"minute":0},{"load":5707.84,"year":2020,"month":9,"day":1,"hour":0,"minute":0}],"com.grandlyon.egl.year":[{"load":30451.99,"year":2020,"month":1,"day":1,"hour":0,"minute":0}]}
\ No newline at end of file
diff --git a/test/services/ConsumptionDataFormatter.spec.ts b/test/services/ConsumptionDataFormatter.spec.ts
index c410c1b95062b685eea74102b4f4d1453b49fc04..6d8cbaf780c7f4d0ac5b2fd1b6767e74c7e6eb51 100644
--- a/test/services/ConsumptionDataFormatter.spec.ts
+++ b/test/services/ConsumptionDataFormatter.spec.ts
@@ -1,18 +1,18 @@
 'use strict'
-import ConsumptionDataFormatter from '../../src/services/consumptionDataFormatterService'
+import ConsumptionFormatterService from '../../src/services/consumptionFormatter.service'
 import consumptionHalfHourlyData from '../__mocks__/consumptionHalfHourlyDataFormatterMock'
 import consumptionDailyData from '../__mocks__/consumptionDailyDataFormatterMock'
 import consumptionMonthlyData from '../__mocks__/consumptionMonthlyDataFormatterMock'
 import { DateTime } from 'luxon'
 
-import { TimeStep } from '../../src/services/dataConsumptionContracts'
+import { TimeStep } from '../../src/enum/timeStep.enum'
 
 describe('Consumption Data Formatter service tests', () => {
   beforeEach(() => {
     jest.resetAllMocks()
   })
 
-  const consumptionDataFormatter = new ConsumptionDataFormatter()
+  const consumptionFormatterService = new ConsumptionFormatterService()
 
   const halfHourlyData = JSON.parse(JSON.stringify(consumptionHalfHourlyData))
 
@@ -59,17 +59,17 @@ describe('Consumption Data Formatter service tests', () => {
   const sumReducer = (acc, dataLoad) => acc + dataLoad.value
 
   it('formatGraphData', () => {
-    const halfHourResult = consumptionDataFormatter.formatGraphData(
+    const halfHourResult = consumptionFormatterService.formatGraphData(
       mappedHalfHourlyData,
       dayTimePeriod,
       daytimeStep
     )
-    const dayResult = consumptionDataFormatter.formatGraphData(
+    const dayResult = consumptionFormatterService.formatGraphData(
       mappeddailyDataData,
       monthTimePeriod,
       monthTimeStep
     )
-    const monthResult = consumptionDataFormatter.formatGraphData(
+    const monthResult = consumptionFormatterService.formatGraphData(
       mappedMonthlyData,
       yearTimePeriod,
       yearTimeStep
diff --git a/test/services/ConsumptionDataManager.spec.ts b/test/services/ConsumptionDataManager.spec.ts
index e965fb02636c701039dc0f6d3c4b60ff2b4a89bd..6e244d9f211fd300d62dbf47fb4efe0282ec6aa3 100644
--- a/test/services/ConsumptionDataManager.spec.ts
+++ b/test/services/ConsumptionDataManager.spec.ts
@@ -1,15 +1,13 @@
 'use strict'
-import ConsumptionDataManager from '../../src/services/consumptionDataManagerService'
-import { DateTime } from 'luxon'
+//import ConsumptionDataManager from '../../src/services/consumptionDataManagerService'
+/*import { DateTime } from 'luxon'
 import { TimeStep } from '../../src/services/dataConsumptionContracts'
 
 // client needs to be mocked correctely to test the CDM
 const mockClient = {
   query: jest.fn(),
   get: jest.fn(),
-}
-
-//jest.mock('../../src/services/consumptionDataFormatterService')
+}*/
 
 describe('Consumption Data Manager', () => {
   beforeEach(() => {
diff --git a/test/services/ConsumptionDataValidator.spec.ts b/test/services/ConsumptionDataValidator.spec.ts
index 1b035df9f4c416f2d0b4afb7c81e5fb4117ab3b4..ec8d8104fffe97507c34de982ea8d57791753ae4 100644
--- a/test/services/ConsumptionDataValidator.spec.ts
+++ b/test/services/ConsumptionDataValidator.spec.ts
@@ -1,41 +1,40 @@
 'use strict'
-import ConsumptionDataValidator from '../../src/services/consumptionDataValidatorService'
+import ConsumptionValidatorService from '../../src/services/consumptionValidator.service'
 import { DateTime } from 'luxon'
 import { FluidType } from '../../src/enum/fluid.enum'
-import { TimeStep } from '../../src/services/dataConsumptionContracts'
+import { TimeStep } from '../../src/enum/timeStep.enum'
 
 describe('Consumption Data Validator service tests', () => {
   beforeEach(() => {
     jest.resetAllMocks()
   })
 
-  const consumptionDataValidator = new ConsumptionDataValidator()
+  const consumptionValidatorService = new ConsumptionValidatorService()
 
   /*
-consumptionDataValidator.ValidateGetGraphData(
+consumptionValidatorService.ValidateGetGraphData(
   timePeriod,
   timeStep,
   fluidTypes,
   compareTimePeriod
 )
-*/
 
   const yearTimeStep = TimeStep.MONTH
 
-  const sumReducer = (acc, dataLoad) => acc + dataLoad.value
+  const sumReducer = (acc, dataLoad) => acc + dataLoad.value*/
 
   it('matching fluidTypes and TimeStep', () => {
     const timePeriod = {
       startDate: DateTime.local(2018, 1, 1),
       endDate: DateTime.local(2018, 1, 2),
     }
-    const compareTimePeriod = {
+    /*const compareTimePeriod = {
       startDate: DateTime.local(2018, 1, 2),
       endDate: DateTime.local(2018, 1, 3),
-    }
+    }*/
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(
+      consumptionValidatorService.ValidateGetGraphData(
         timePeriod,
         TimeStep.HALF_AN_HOUR,
         [FluidType.WATER]
@@ -43,7 +42,7 @@ consumptionDataValidator.ValidateGetGraphData(
     ).toBe(false)
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(
+      consumptionValidatorService.ValidateGetGraphData(
         timePeriod,
         TimeStep.HALF_AN_HOUR,
         [FluidType.ELECTRICITY]
@@ -51,7 +50,7 @@ consumptionDataValidator.ValidateGetGraphData(
     ).toBe(true)
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(
+      consumptionValidatorService.ValidateGetGraphData(
         timePeriod,
         TimeStep.HALF_AN_HOUR,
         [FluidType.WATER]
@@ -59,21 +58,27 @@ consumptionDataValidator.ValidateGetGraphData(
     ).toBe(false)
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(timePeriod, TimeStep.HOUR, [
-        FluidType.ELECTRICITY,
-      ])
+      consumptionValidatorService.ValidateGetGraphData(
+        timePeriod,
+        TimeStep.HOUR,
+        [FluidType.ELECTRICITY]
+      )
     ).toBe(false)
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(timePeriod, TimeStep.HOUR, [
-        FluidType.GAS,
-      ])
+      consumptionValidatorService.ValidateGetGraphData(
+        timePeriod,
+        TimeStep.HOUR,
+        [FluidType.GAS]
+      )
     ).toBe(true)
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(timePeriod, TimeStep.HOUR, [
-        FluidType.WATER,
-      ])
+      consumptionValidatorService.ValidateGetGraphData(
+        timePeriod,
+        TimeStep.HOUR,
+        [FluidType.WATER]
+      )
     ).toBe(false)
   })
 
@@ -84,7 +89,7 @@ consumptionDataValidator.ValidateGetGraphData(
     }
 
     expect(
-      consumptionDataValidator.ValidateGetGraphData(
+      consumptionValidatorService.ValidateGetGraphData(
         timePeriod,
         TimeStep.HALF_AN_HOUR,
         [FluidType.ELECTRICITY]
diff --git a/test/services/FluidService.spec.js b/test/services/FluidService.spec.js
index 67159a043b3eba4266b0d77e1c1745792938d67f..b019855e240cc5841916d4f5f2d8c81c6c90291b 100644
--- a/test/services/FluidService.spec.js
+++ b/test/services/FluidService.spec.js
@@ -1,5 +1,5 @@
 'use strict'
-import FluidService from '../../src/services/fluidService'
+import FluidService from '../../src/services/fluid.service'
 import data from '../__mocks__/enedis-dayMock.json'
 /* eslint-env jest */
 
diff --git a/test/services/QueryRunner.spec.ts b/test/services/QueryRunner.spec.ts
index fa7dc3c74e70d051e5ac5deb90e45400c15819d2..132c2849aa3c41784309a95ff9c8ffbe3ec0bc0e 100644
--- a/test/services/QueryRunner.spec.ts
+++ b/test/services/QueryRunner.spec.ts
@@ -1,13 +1,13 @@
 'use strict'
-import QuerryRunner from '../../src/services/queryRunnerService'
-import { DateTime } from 'luxon'
+//import QuerryRunner from '../../src/services/queryRunnerService'
+/*import { DateTime } from 'luxon'
 import { TimeStep } from '../../src/services/dataConsumptionContracts'
 
 // client needs to be mocked correctely to test the CDM
 const mockClient = {
   query: jest.fn(),
   get: jest.fn(),
-}
+}*/
 
 describe('Querry Runner', () => {
   beforeEach(() => {
diff --git a/yarn.lock b/yarn.lock
index da3d28a2ec52f2424ac7afda4e910d403e50ca90..545ed92b970e09d4bd23ff7f735f165880493c84 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,17 +2,28 @@
 # yarn lockfile v1
 
 
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5", "@babel/code-frame@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e"
+"@aspnet/signalr-protocol-msgpack@^1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@aspnet/signalr-protocol-msgpack/-/signalr-protocol-msgpack-1.1.0.tgz#155038149e8e0eee1f97f4d1319f9f3271ff06fb"
+  integrity sha512-AQv5AavWvoFz2iLSIDK1DAIXMNhQ1Jt1qRDouXxLKAKP13u8iFq7i3/MwJ30ShOBGBoL5/zn6pBlNjAzTmAsMA==
   dependencies:
-    "@babel/highlight" "^7.8.3"
+    msgpack5 "^4.0.2"
 
-"@babel/code-frame@^7.0.0 <7.4.0":
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8"
+"@aspnet/signalr@^1.1.4":
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/@aspnet/signalr/-/signalr-1.1.4.tgz#417cf808f4074a8aec45d27f03c4b8df9d96bb0b"
+  integrity sha512-Jp9nPc8hmmhbG9OKiHe2fOKskBHfg+3Y9foSKHxjgGtyI743hXjGFv3uFlUg503K9f8Ilu63gQt3fDkLICBRyg==
+  dependencies:
+    eventsource "^1.0.7"
+    request "^2.88.0"
+    ws "^6.0.0"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a"
+  integrity sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==
   dependencies:
-    "@babel/highlight" "^7.0.0"
+    "@babel/highlight" "^7.10.4"
 
 "@babel/core@7.2.2":
   version "7.2.2"
@@ -33,94 +44,60 @@
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/core@7.5.4":
-  version "7.5.4"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.5.4.tgz#4c32df7ad5a58e9ea27ad025c11276324e0b4ddd"
+"@babel/core@7.9.0":
+  version "7.9.0"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e"
+  integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.5.0"
-    "@babel/helpers" "^7.5.4"
-    "@babel/parser" "^7.5.0"
-    "@babel/template" "^7.4.4"
-    "@babel/traverse" "^7.5.0"
-    "@babel/types" "^7.5.0"
-    convert-source-map "^1.1.0"
-    debug "^4.1.0"
-    json5 "^2.1.0"
-    lodash "^4.17.11"
-    resolve "^1.3.2"
-    semver "^5.4.1"
-    source-map "^0.5.0"
-
-"@babel/core@7.6.2":
-  version "7.6.2"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.2.tgz#069a776e8d5e9eefff76236bc8845566bd31dd91"
-  dependencies:
-    "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.6.2"
-    "@babel/helpers" "^7.6.2"
-    "@babel/parser" "^7.6.2"
-    "@babel/template" "^7.6.0"
-    "@babel/traverse" "^7.6.2"
-    "@babel/types" "^7.6.0"
-    convert-source-map "^1.1.0"
+    "@babel/code-frame" "^7.8.3"
+    "@babel/generator" "^7.9.0"
+    "@babel/helper-module-transforms" "^7.9.0"
+    "@babel/helpers" "^7.9.0"
+    "@babel/parser" "^7.9.0"
+    "@babel/template" "^7.8.6"
+    "@babel/traverse" "^7.9.0"
+    "@babel/types" "^7.9.0"
+    convert-source-map "^1.7.0"
     debug "^4.1.0"
-    json5 "^2.1.0"
+    gensync "^1.0.0-beta.1"
+    json5 "^2.1.2"
     lodash "^4.17.13"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/core@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b"
-  dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.3.4"
-    "@babel/helpers" "^7.2.0"
-    "@babel/parser" "^7.3.4"
-    "@babel/template" "^7.2.2"
-    "@babel/traverse" "^7.3.4"
-    "@babel/types" "^7.3.4"
-    convert-source-map "^1.1.0"
-    debug "^4.1.0"
-    json5 "^2.1.0"
-    lodash "^4.17.11"
-    resolve "^1.3.2"
-    semver "^5.4.1"
-    source-map "^0.5.0"
-
 "@babel/core@^7.1.0":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.3.tgz#30b0ebb4dd1585de6923a0b4d179e0b9f5d82941"
-  dependencies:
-    "@babel/code-frame" "^7.8.3"
-    "@babel/generator" "^7.8.3"
-    "@babel/helpers" "^7.8.3"
-    "@babel/parser" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/traverse" "^7.8.3"
-    "@babel/types" "^7.8.3"
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.5.tgz#1f15e2cca8ad9a1d78a38ddba612f5e7cdbbd330"
+  integrity sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.10.5"
+    "@babel/helper-module-transforms" "^7.10.5"
+    "@babel/helpers" "^7.10.4"
+    "@babel/parser" "^7.10.5"
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.5"
+    "@babel/types" "^7.10.5"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.1"
-    json5 "^2.1.0"
-    lodash "^4.17.13"
+    json5 "^2.1.2"
+    lodash "^4.17.19"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e"
+"@babel/generator@^7.10.5", "@babel/generator@^7.4.0", "@babel/generator@^7.8.3", "@babel/generator@^7.9.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.5.tgz#1b903554bc8c583ee8d25f1e8969732e6b829a69"
+  integrity sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==
   dependencies:
-    "@babel/types" "^7.3.4"
+    "@babel/types" "^7.10.5"
     jsesc "^2.5.1"
-    lodash "^4.17.11"
     source-map "^0.5.0"
-    trim-right "^1.0.1"
 
-"@babel/generator@^7.2.2", "@babel/generator@^7.3.4", "@babel/generator@^7.4.0", "@babel/generator@^7.5.0", "@babel/generator@^7.6.2", "@babel/generator@^7.8.3":
+"@babel/generator@^7.2.2":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.3.tgz#0e22c005b0a94c1c74eafe19ef78ce53a4d45c03"
   dependencies:
@@ -142,7 +119,7 @@
     "@babel/helper-explode-assignable-expression" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-builder-react-jsx@^7.3.0", "@babel/helper-builder-react-jsx@^7.8.3":
+"@babel/helper-builder-react-jsx@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.8.3.tgz#dee98d7d79cc1f003d80b76fe01c7f8945665ff6"
   dependencies:
@@ -190,19 +167,21 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-function-name@^7.1.0", "@babel/helper-function-name@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca"
+"@babel/helper-function-name@^7.10.4", "@babel/helper-function-name@^7.8.3":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz#d2d3b20c59ad8c47112fa7d2a94bc09d5ef82f1a"
+  integrity sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==
   dependencies:
-    "@babel/helper-get-function-arity" "^7.8.3"
-    "@babel/template" "^7.8.3"
-    "@babel/types" "^7.8.3"
+    "@babel/helper-get-function-arity" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
 
-"@babel/helper-get-function-arity@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5"
+"@babel/helper-get-function-arity@^7.10.4", "@babel/helper-get-function-arity@^7.8.3":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2"
+  integrity sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.4"
 
 "@babel/helper-hoist-variables@^7.8.3":
   version "7.8.3"
@@ -210,6 +189,13 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
+"@babel/helper-member-expression-to-functions@^7.10.4":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz#172f56e7a63e78112f3a04055f24365af702e7ee"
+  integrity sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==
+  dependencies:
+    "@babel/types" "^7.10.5"
+
 "@babel/helper-member-expression-to-functions@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c"
@@ -222,7 +208,27 @@
   dependencies:
     "@babel/types" "^7.8.3"
 
-"@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.8.3":
+"@babel/helper-module-imports@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz#4c5c54be04bd31670a7382797d75b9fa2e5b5620"
+  integrity sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-module-transforms@^7.10.5", "@babel/helper-module-transforms@^7.9.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz#120c271c0b3353673fcdfd8c053db3c544a260d6"
+  integrity sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==
+  dependencies:
+    "@babel/helper-module-imports" "^7.10.4"
+    "@babel/helper-replace-supers" "^7.10.4"
+    "@babel/helper-simple-access" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.5"
+    lodash "^4.17.19"
+
+"@babel/helper-module-transforms@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz#d305e35d02bee720fbc2c3c3623aa0c316c01590"
   dependencies:
@@ -233,6 +239,13 @@
     "@babel/types" "^7.8.3"
     lodash "^4.17.13"
 
+"@babel/helper-optimise-call-expression@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz#50dc96413d594f995a77905905b05893cd779673"
+  integrity sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==
+  dependencies:
+    "@babel/types" "^7.10.4"
+
 "@babel/helper-optimise-call-expression@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9"
@@ -243,7 +256,12 @@
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250"
 
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375"
+  integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==
+
+"@babel/helper-plugin-utils@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670"
 
@@ -263,6 +281,16 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
+"@babel/helper-replace-supers@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz#d585cd9388ea06e6031e4cd44b6713cbead9e6cf"
+  integrity sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==
+  dependencies:
+    "@babel/helper-member-expression-to-functions" "^7.10.4"
+    "@babel/helper-optimise-call-expression" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
 "@babel/helper-replace-supers@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz#91192d25f6abbcd41da8a989d4492574fb1530bc"
@@ -272,18 +300,32 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-simple-access@^7.1.0", "@babel/helper-simple-access@^7.8.3":
+"@babel/helper-simple-access@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz#0f5ccda2945277a2a7a2d3a821e15395edcf3461"
+  integrity sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-simple-access@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae"
   dependencies:
     "@babel/template" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helper-split-export-declaration@^7.0.0", "@babel/helper-split-export-declaration@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9"
+"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.8.3":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz#2c70576eaa3b5609b24cb99db2888cc3fc4251d1"
+  integrity sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==
   dependencies:
-    "@babel/types" "^7.8.3"
+    "@babel/types" "^7.10.4"
+
+"@babel/helper-validator-identifier@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2"
+  integrity sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==
 
 "@babel/helper-wrap-function@^7.8.3":
   version "7.8.3"
@@ -294,7 +336,16 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/helpers@^7.2.0", "@babel/helpers@^7.5.4", "@babel/helpers@^7.6.2", "@babel/helpers@^7.8.3":
+"@babel/helpers@^7.10.4", "@babel/helpers@^7.9.0":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.4.tgz#2abeb0d721aff7c0a97376b9e1f6f65d7a475044"
+  integrity sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==
+  dependencies:
+    "@babel/template" "^7.10.4"
+    "@babel/traverse" "^7.10.4"
+    "@babel/types" "^7.10.4"
+
+"@babel/helpers@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.3.tgz#382fbb0382ce7c4ce905945ab9641d688336ce85"
   dependencies:
@@ -302,22 +353,24 @@
     "@babel/traverse" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/highlight@^7.0.0", "@babel/highlight@^7.8.3":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797"
+"@babel/highlight@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.4.tgz#7d1bdfd65753538fabe6c38596cdb76d9ac60143"
+  integrity sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==
   dependencies:
+    "@babel/helper-validator-identifier" "^7.10.4"
     chalk "^2.0.0"
-    esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4", "@babel/parser@^7.4.3", "@babel/parser@^7.5.0", "@babel/parser@^7.6.2", "@babel/parser@^7.8.3":
+"@babel/parser@^7.0.0", "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.10.5", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.3", "@babel/parser@^7.9.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.5.tgz#e7c6bf5a7deff957cec9f04b551e2762909d826b"
+  integrity sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==
+
+"@babel/parser@^7.2.2":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.3.tgz#790874091d2001c9be6ec426c2eed47bc7679081"
 
-"@babel/parser@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c"
-
 "@babel/plugin-proposal-async-generator-functions@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz#bad329c670b382589721b27540c7d288601c6e6f"
@@ -347,7 +400,7 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
 
-"@babel/plugin-proposal-object-rest-spread@^7.3.1", "@babel/plugin-proposal-object-rest-spread@^7.3.4":
+"@babel/plugin-proposal-object-rest-spread@^7.3.1":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.8.3.tgz#eb5ae366118ddca67bed583b53d7554cad9951bb"
   dependencies:
@@ -374,19 +427,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-flow@^7.2.0":
-  version "7.8.3"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f"
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.8.3"
-
 "@babel/plugin-syntax-json-strings@^7.2.0", "@babel/plugin-syntax-json-strings@^7.8.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.0"
 
-"@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.8.3":
+"@babel/plugin-syntax-jsx@^7.8.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94"
   dependencies:
@@ -416,7 +463,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-async-to-generator@^7.2.0", "@babel/plugin-transform-async-to-generator@^7.3.4":
+"@babel/plugin-transform-async-to-generator@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz#4308fad0d9409d71eafb9b1a6ee35f9d64b64086"
   dependencies:
@@ -430,14 +477,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-block-scoping@^7.2.0", "@babel/plugin-transform-block-scoping@^7.3.4":
+"@babel/plugin-transform-block-scoping@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz#97d35dab66857a437c166358b91d09050c868f3a"
   dependencies:
     "@babel/helper-plugin-utils" "^7.8.3"
     lodash "^4.17.13"
 
-"@babel/plugin-transform-classes@^7.2.0", "@babel/plugin-transform-classes@^7.3.4":
+"@babel/plugin-transform-classes@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.8.3.tgz#46fd7a9d2bb9ea89ce88720477979fe0d71b21b8"
   dependencies:
@@ -482,13 +529,6 @@
     "@babel/helper-builder-binary-assignment-operator-visitor" "^7.8.3"
     "@babel/helper-plugin-utils" "^7.8.3"
 
-"@babel/plugin-transform-flow-strip-types@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz#00156236defb7dedddc2d3c9477dcc01a4494327"
-  dependencies:
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-flow" "^7.2.0"
-
 "@babel/plugin-transform-for-of@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.8.3.tgz#15f17bce2fc95c7d59a24b299e83e81cedc22e18"
@@ -516,14 +556,6 @@
     "@babel/helper-plugin-utils" "^7.8.3"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-commonjs@^7.0.0 <7.4.0":
-  version "7.2.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404"
-  dependencies:
-    "@babel/helper-module-transforms" "^7.1.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/helper-simple-access" "^7.1.0"
-
 "@babel/plugin-transform-modules-commonjs@^7.2.0", "@babel/plugin-transform-modules-commonjs@^7.7.5":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.8.3.tgz#df251706ec331bd058a34bdd72613915f82928a5"
@@ -533,7 +565,7 @@
     "@babel/helper-simple-access" "^7.8.3"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-systemjs@^7.2.0", "@babel/plugin-transform-modules-systemjs@^7.3.4":
+"@babel/plugin-transform-modules-systemjs@^7.2.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.8.3.tgz#d8bbf222c1dbe3661f440f2f00c16e9bb7d0d420"
   dependencies:
@@ -604,15 +636,7 @@
     "@babel/helper-plugin-utils" "^7.8.3"
     "@babel/plugin-syntax-jsx" "^7.8.3"
 
-"@babel/plugin-transform-react-jsx@^7.0.0 <7.4.0":
-  version "7.3.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz#f2cab99026631c767e2745a5368b331cfe8f5290"
-  dependencies:
-    "@babel/helper-builder-react-jsx" "^7.3.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-syntax-jsx" "^7.2.0"
-
-"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.3.4":
+"@babel/plugin-transform-regenerator@^7.0.0":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.3.tgz#b31031e8059c07495bf23614c97f3d9698bc6ec8"
   dependencies:
@@ -683,6 +707,14 @@
     "@babel/helper-create-regexp-features-plugin" "^7.8.3"
     "@babel/helper-plugin-utils" "^7.8.3"
 
+"@babel/polyfill@^7.10.4":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.10.4.tgz#915e5bfe61490ac0199008e35ca9d7d151a8e45a"
+  integrity sha512-8BYcnVqQ5kMD2HXoHInBH7H1b/uP3KdnwCYXOqFnXqguOyuu443WXusbIUbWEfY3Z0Txk0M1uG/8YuAMhNl6zg==
+  dependencies:
+    core-js "^2.6.5"
+    regenerator-runtime "^0.13.4"
+
 "@babel/preset-env@7.3.1":
   version "7.3.1"
   resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.1.tgz#389e8ca6b17ae67aaf9a2111665030be923515db"
@@ -731,54 +763,6 @@
     js-levenshtein "^1.1.3"
     semver "^5.3.0"
 
-"@babel/preset-env@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1"
-  dependencies:
-    "@babel/helper-module-imports" "^7.0.0"
-    "@babel/helper-plugin-utils" "^7.0.0"
-    "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
-    "@babel/plugin-proposal-json-strings" "^7.2.0"
-    "@babel/plugin-proposal-object-rest-spread" "^7.3.4"
-    "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.2.0"
-    "@babel/plugin-syntax-async-generators" "^7.2.0"
-    "@babel/plugin-syntax-json-strings" "^7.2.0"
-    "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
-    "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
-    "@babel/plugin-transform-arrow-functions" "^7.2.0"
-    "@babel/plugin-transform-async-to-generator" "^7.3.4"
-    "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
-    "@babel/plugin-transform-block-scoping" "^7.3.4"
-    "@babel/plugin-transform-classes" "^7.3.4"
-    "@babel/plugin-transform-computed-properties" "^7.2.0"
-    "@babel/plugin-transform-destructuring" "^7.2.0"
-    "@babel/plugin-transform-dotall-regex" "^7.2.0"
-    "@babel/plugin-transform-duplicate-keys" "^7.2.0"
-    "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
-    "@babel/plugin-transform-for-of" "^7.2.0"
-    "@babel/plugin-transform-function-name" "^7.2.0"
-    "@babel/plugin-transform-literals" "^7.2.0"
-    "@babel/plugin-transform-modules-amd" "^7.2.0"
-    "@babel/plugin-transform-modules-commonjs" "^7.2.0"
-    "@babel/plugin-transform-modules-systemjs" "^7.3.4"
-    "@babel/plugin-transform-modules-umd" "^7.2.0"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0"
-    "@babel/plugin-transform-new-target" "^7.0.0"
-    "@babel/plugin-transform-object-super" "^7.2.0"
-    "@babel/plugin-transform-parameters" "^7.2.0"
-    "@babel/plugin-transform-regenerator" "^7.3.4"
-    "@babel/plugin-transform-shorthand-properties" "^7.2.0"
-    "@babel/plugin-transform-spread" "^7.2.0"
-    "@babel/plugin-transform-sticky-regex" "^7.2.0"
-    "@babel/plugin-transform-template-literals" "^7.2.0"
-    "@babel/plugin-transform-typeof-symbol" "^7.2.0"
-    "@babel/plugin-transform-unicode-regex" "^7.2.0"
-    browserslist "^4.3.4"
-    invariant "^2.2.2"
-    js-levenshtein "^1.1.3"
-    semver "^5.3.0"
-
 "@babel/preset-react@7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0"
@@ -796,6 +780,22 @@
     "@babel/helper-plugin-utils" "^7.8.3"
     "@babel/plugin-transform-typescript" "^7.8.3"
 
+"@babel/runtime-corejs3@^7.10.2":
+  version "7.11.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.11.2.tgz#02c3029743150188edeb66541195f54600278419"
+  integrity sha512-qh5IR+8VgFz83VBa6OkaET6uN/mJOhHONuy3m1sgF0CV6mXdPSEBdA7e1eUbVvyNtANjMbg22JUv71BaDXLY6A==
+  dependencies:
+    core-js-pure "^3.0.0"
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime-corejs3@^7.8.3":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz#a57fe6c13045ca33768a2aa527ead795146febe1"
+  integrity sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A==
+  dependencies:
+    core-js-pure "^3.0.0"
+    regenerator-runtime "^0.13.4"
+
 "@babel/runtime@7.0.0":
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c"
@@ -814,27 +814,36 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.5.2", "@babel/runtime@^7.6.3":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.5.5":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.5.tgz#303d8bd440ecd5a491eae6117fd3367698674c5c"
+  integrity sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@^7.10.2", "@babel/runtime@^7.10.3":
+  version "7.11.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.11.2.tgz#f549c13c754cc40b87644b9fa9f09a6a95fe0736"
+  integrity sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
+"@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.2", "@babel/runtime@^7.6.3":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.8.3.tgz#0811944f73a6c926bb2ad35e918dcc1bfab279f1"
   dependencies:
     regenerator-runtime "^0.13.2"
 
-"@babel/runtime@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83"
-  dependencies:
-    regenerator-runtime "^0.12.0"
-
-"@babel/template@^7.0.0 <7.4.0":
-  version "7.2.2"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907"
+"@babel/template@^7.10.4", "@babel/template@^7.4.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6":
+  version "7.10.4"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.4.tgz#3251996c4200ebc71d1a8fc405fba940f36ba278"
+  integrity sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.2.2"
-    "@babel/types" "^7.2.2"
+    "@babel/code-frame" "^7.10.4"
+    "@babel/parser" "^7.10.4"
+    "@babel/types" "^7.10.4"
 
-"@babel/template@^7.2.2", "@babel/template@^7.4.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0", "@babel/template@^7.8.3":
+"@babel/template@^7.2.2":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8"
   dependencies:
@@ -842,7 +851,22 @@
     "@babel/parser" "^7.8.3"
     "@babel/types" "^7.8.3"
 
-"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.2.2", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.3", "@babel/traverse@^7.5.0", "@babel/traverse@^7.6.2", "@babel/traverse@^7.8.3":
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.10.5", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.5.tgz#77ce464f5b258be265af618d8fddf0536f20b564"
+  integrity sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/generator" "^7.10.5"
+    "@babel/helper-function-name" "^7.10.4"
+    "@babel/helper-split-export-declaration" "^7.10.4"
+    "@babel/parser" "^7.10.5"
+    "@babel/types" "^7.10.5"
+    debug "^4.1.0"
+    globals "^11.1.0"
+    lodash "^4.17.19"
+
+"@babel/traverse@^7.2.2":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.3.tgz#a826215b011c9b4f73f3a893afbc05151358bf9a"
   dependencies:
@@ -856,21 +880,16 @@
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/traverse@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06"
+"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.9.0":
+  version "7.10.5"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.5.tgz#d88ae7e2fde86bfbfe851d4d81afa70a997b5d15"
+  integrity sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.3.4"
-    "@babel/helper-function-name" "^7.1.0"
-    "@babel/helper-split-export-declaration" "^7.0.0"
-    "@babel/parser" "^7.3.4"
-    "@babel/types" "^7.3.4"
-    debug "^4.1.0"
-    globals "^11.1.0"
-    lodash "^4.17.11"
+    "@babel/helper-validator-identifier" "^7.10.4"
+    lodash "^4.17.19"
+    to-fast-properties "^2.0.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.4", "@babel/types@^7.4.0", "@babel/types@^7.5.0", "@babel/types@^7.6.0", "@babel/types@^7.8.3":
+"@babel/types@^7.2.2":
   version "7.8.3"
   resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c"
   dependencies:
@@ -878,43 +897,40 @@
     lodash "^4.17.13"
     to-fast-properties "^2.0.0"
 
-"@babel/types@^7.0.0 <7.4.0":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed"
-  dependencies:
-    esutils "^2.0.2"
-    lodash "^4.17.11"
-    to-fast-properties "^2.0.0"
-
 "@cnakazawa/watch@^1.0.3":
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.3.tgz#099139eaec7ebf07a27c1786a3ff64f39464d2ef"
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
+  integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
   dependencies:
     exec-sh "^0.3.2"
     minimist "^1.2.0"
 
 "@emotion/cache@^10.0.27":
-  version "10.0.27"
-  resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.27.tgz#7895db204e2c1a991ae33d51262a3a44f6737303"
+  version "10.0.29"
+  resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0"
+  integrity sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==
   dependencies:
     "@emotion/sheet" "0.9.4"
     "@emotion/stylis" "0.8.5"
     "@emotion/utils" "0.11.3"
     "@emotion/weak-memoize" "0.2.5"
 
-"@emotion/hash@0.7.4":
-  version "0.7.4"
-  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.4.tgz#f14932887422c9056b15a8d222a9074a7dfa2831"
+"@emotion/hash@0.8.0":
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413"
+  integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==
 
 "@emotion/memoize@0.7.4":
   version "0.7.4"
   resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
+  integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
 
 "@emotion/serialize@^0.11.15":
-  version "0.11.15"
-  resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.15.tgz#9a0f5873fb458d87d4f23e034413c12ed60a705a"
+  version "0.11.16"
+  resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad"
+  integrity sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==
   dependencies:
-    "@emotion/hash" "0.7.4"
+    "@emotion/hash" "0.8.0"
     "@emotion/memoize" "0.7.4"
     "@emotion/unitless" "0.7.5"
     "@emotion/utils" "0.11.3"
@@ -923,22 +939,27 @@
 "@emotion/sheet@0.9.4":
   version "0.9.4"
   resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.4.tgz#894374bea39ec30f489bbfc3438192b9774d32e5"
+  integrity sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==
 
 "@emotion/stylis@0.8.5":
   version "0.8.5"
   resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
+  integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
 
 "@emotion/unitless@0.7.5":
   version "0.7.5"
   resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
+  integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
 
 "@emotion/utils@0.11.3":
   version "0.11.3"
   resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.11.3.tgz#a759863867befa7e583400d322652a3f44820924"
+  integrity sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==
 
 "@emotion/weak-memoize@0.2.5":
   version "0.2.5"
   resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46"
+  integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==
 
 "@fortawesome/fontawesome-common-types@^0.2.26":
   version "0.2.26"
@@ -962,13 +983,10 @@
   dependencies:
     prop-types "^15.5.10"
 
-"@iarna/toml@^2.2.0":
-  version "2.2.3"
-  resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.3.tgz#f060bf6eaafae4d56a7dac618980838b0696e2ab"
-
 "@jest/console@^24.7.1", "@jest/console@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/console/-/console-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0"
+  integrity sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==
   dependencies:
     "@jest/source-map" "^24.9.0"
     chalk "^2.0.1"
@@ -977,6 +995,7 @@
 "@jest/core@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/core/-/core-24.9.0.tgz#2ceccd0b93181f9c4850e74f2a9ad43d351369c4"
+  integrity sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==
   dependencies:
     "@jest/console" "^24.7.1"
     "@jest/reporters" "^24.9.0"
@@ -1010,6 +1029,7 @@
 "@jest/environment@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-24.9.0.tgz#21e3afa2d65c0586cbd6cbefe208bafade44ab18"
+  integrity sha512-5A1QluTPhvdIPFYnO3sZC3smkNeXPVELz7ikPbhUj0bQjB07EoE9qtLrem14ZUYWdVayYbsjVwIiL4WBIMV4aQ==
   dependencies:
     "@jest/fake-timers" "^24.9.0"
     "@jest/transform" "^24.9.0"
@@ -1019,6 +1039,7 @@
 "@jest/fake-timers@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-24.9.0.tgz#ba3e6bf0eecd09a636049896434d306636540c93"
+  integrity sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==
   dependencies:
     "@jest/types" "^24.9.0"
     jest-message-util "^24.9.0"
@@ -1027,6 +1048,7 @@
 "@jest/reporters@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-24.9.0.tgz#86660eff8e2b9661d042a8e98a028b8d631a5b43"
+  integrity sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==
   dependencies:
     "@jest/environment" "^24.9.0"
     "@jest/test-result" "^24.9.0"
@@ -1053,6 +1075,7 @@
 "@jest/source-map@^24.3.0", "@jest/source-map@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-24.9.0.tgz#0e263a94430be4b41da683ccc1e6bffe2a191714"
+  integrity sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==
   dependencies:
     callsites "^3.0.0"
     graceful-fs "^4.1.15"
@@ -1061,6 +1084,7 @@
 "@jest/test-result@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-24.9.0.tgz#11796e8aa9dbf88ea025757b3152595ad06ba0ca"
+  integrity sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==
   dependencies:
     "@jest/console" "^24.9.0"
     "@jest/types" "^24.9.0"
@@ -1069,15 +1093,17 @@
 "@jest/test-sequencer@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-24.9.0.tgz#f8f334f35b625a4f2f355f2fe7e6036dad2e6b31"
+  integrity sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==
   dependencies:
     "@jest/test-result" "^24.9.0"
     jest-haste-map "^24.9.0"
     jest-runner "^24.9.0"
     jest-runtime "^24.9.0"
 
-"@jest/transform@^24.8.0", "@jest/transform@^24.9.0":
+"@jest/transform@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-24.9.0.tgz#4ae2768b296553fadab09e9ec119543c90b16c56"
+  integrity sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==
   dependencies:
     "@babel/core" "^7.1.0"
     "@jest/types" "^24.9.0"
@@ -1096,14 +1122,26 @@
     source-map "^0.6.1"
     write-file-atomic "2.4.1"
 
-"@jest/types@^24.8.0", "@jest/types@^24.9.0":
+"@jest/types@^24.9.0":
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59"
+  integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==
   dependencies:
     "@types/istanbul-lib-coverage" "^2.0.0"
     "@types/istanbul-reports" "^1.1.1"
     "@types/yargs" "^13.0.0"
 
+"@jest/types@^26.3.0":
+  version "26.3.0"
+  resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.3.0.tgz#97627bf4bdb72c55346eef98e3b3f7ddc4941f71"
+  integrity sha512-BDPG23U0qDeAvU4f99haztXwdAg3hz4El95LkAM+tHAqqhiVzRpEGHHU8EDxT/AnxOrA65YjLBwDahdJ9pTLJQ==
+  dependencies:
+    "@types/istanbul-lib-coverage" "^2.0.0"
+    "@types/istanbul-reports" "^3.0.0"
+    "@types/node" "*"
+    "@types/yargs" "^15.0.0"
+    chalk "^4.0.0"
+
 "@material-ui/core@3":
   version "3.9.4"
   resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-3.9.4.tgz#5297fd4ad9e739a87da4a6d34fc4af5396886e13"
@@ -1153,13 +1191,6 @@
     prop-types "^15.6.0"
     react-is "^16.6.3"
 
-"@mrmlnc/readdir-enhanced@^2.2.1":
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
-  dependencies:
-    call-me-maybe "^1.0.1"
-    glob-to-regexp "^0.3.0"
-
 "@nodelib/fs.scandir@2.1.3":
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b"
@@ -1171,10 +1202,6 @@
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3"
 
-"@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"
-
 "@nodelib/fs.walk@^1.2.3":
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976"
@@ -1182,41 +1209,83 @@
     "@nodelib/fs.scandir" "2.1.3"
     fastq "^1.6.0"
 
-"@parcel/fs@^1.11.0":
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/@parcel/fs/-/fs-1.11.0.tgz#fb8a2be038c454ad46a50dc0554c1805f13535cd"
+"@pollyjs/adapter-node-http@5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/adapter-node-http/-/adapter-node-http-5.0.0.tgz#b0e3f344b8f1587dce5fc8ad1e87ab15ec4222ef"
+  integrity sha512-9WjV6UVHWpcDZc1Dt5Slxn191iN55RpCirEAdt+h5wvPgRJmsLuXMI1vT3r9va8Z+a3qCqM458waNfr5us2Wuw==
   dependencies:
-    "@parcel/utils" "^1.11.0"
-    mkdirp "^0.5.1"
-    rimraf "^2.6.2"
+    "@pollyjs/adapter" "^5.0.0"
+    "@pollyjs/utils" "^5.0.0"
+    lodash-es "^4.17.11"
+    nock "^12.0.3"
 
-"@parcel/logger@^1.11.0":
-  version "1.11.1"
-  resolved "https://registry.yarnpkg.com/@parcel/logger/-/logger-1.11.1.tgz#c55b0744bcbe84ebc291155627f0ec406a23e2e6"
+"@pollyjs/adapter@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/adapter/-/adapter-5.0.0.tgz#faba5a7e68db38f56b4bf04271d8f5a10d5ca8c2"
+  integrity sha512-GaJUp9hKKKbRbh1FDbjVfxNGIYs8/1QQI5SR+zjz+OjpjV2btRPFCq1cqO4ORrHA2pTIC8IvEL3lgPSG4v/cPg==
   dependencies:
-    "@parcel/workers" "^1.11.0"
-    chalk "^2.1.0"
-    grapheme-breaker "^0.3.2"
-    ora "^2.1.0"
-    strip-ansi "^4.0.0"
+    "@pollyjs/utils" "^5.0.0"
 
-"@parcel/utils@^1.11.0":
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/@parcel/utils/-/utils-1.11.0.tgz#539e08fff8af3b26eca11302be80b522674b51ea"
+"@pollyjs/core@5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/core/-/core-5.0.0.tgz#5e61c34ce78245fe6f80768d90ce4ab135a8ec2c"
+  integrity sha512-f/v5z7aKSWdeBCZQFiQGL4aZmdWAuQWV+U/fMbAIEYjkX8Av0gWPhkFyeMfeFriYMg7Ts1XxPNI7LYroCnjn7w==
+  dependencies:
+    "@pollyjs/utils" "^5.0.0"
+    "@sindresorhus/fnv1a" "^1.2.0"
+    blueimp-md5 "^2.10.0"
+    fast-json-stable-stringify "^2.0.0"
+    is-absolute-url "^3.0.0"
+    lodash-es "^4.17.11"
+    route-recognizer "^0.3.4"
+    slugify "^1.3.4"
 
-"@parcel/watcher@^1.12.0":
-  version "1.12.1"
-  resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-1.12.1.tgz#b98b3df309fcab93451b5583fc38e40826696dad"
+"@pollyjs/node-server@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/node-server/-/node-server-5.0.0.tgz#b4b8cb12cd2777b4ad4406ab6dcc7c1d539f7db7"
+  integrity sha512-DK1hqsZnIU7TXECNPI6E+ojaSpv62lt3+8eGn3qFbsa61ToTFQLFEMNfcTWA6ZXArrpdzYAdKVTt8BsdEujHkg==
+  dependencies:
+    "@pollyjs/utils" "^5.0.0"
+    body-parser "^1.19.0"
+    cors "^2.8.5"
+    express "^4.17.1"
+    fs-extra "^8.0.1"
+    http-graceful-shutdown "^2.3.1"
+    morgan "^1.9.1"
+    nocache "^2.1.0"
+
+"@pollyjs/persister-fs@5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/persister-fs/-/persister-fs-5.0.0.tgz#eaa1d4a672a9920b93c9238870aa899149f748d0"
+  integrity sha512-ju75JJ6sSJ/q68rB74wxIlvXCq/riuCqW3pS/Ucd4SFfks/HxXxM3yGTHn0Qq5SrmY9cYbQFfpOz0WCNDIqr+A==
+  dependencies:
+    "@pollyjs/node-server" "^5.0.0"
+    "@pollyjs/persister" "^5.0.0"
+
+"@pollyjs/persister@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/persister/-/persister-5.0.0.tgz#36b85aba8d9a252e3125b257d7c1ec33d015d8fd"
+  integrity sha512-bTJes0c2/y4xrXi1vPypJhup/N/VPC1jY7maOuSv4pOFo6VAvoVJGT2sgMMnPU7qHSRn9Y6v+S7QqGtLOZCyAA==
   dependencies:
-    "@parcel/utils" "^1.11.0"
-    chokidar "^2.1.5"
+    "@pollyjs/utils" "^5.0.0"
+    bowser "^2.4.0"
+    fast-json-stable-stringify "^2.0.0"
+    lodash-es "^4.17.11"
+    set-cookie-parser "^2.3.5"
+    utf8-byte-length "^1.0.4"
 
-"@parcel/workers@^1.11.0":
-  version "1.11.0"
-  resolved "https://registry.yarnpkg.com/@parcel/workers/-/workers-1.11.0.tgz#7b8dcf992806f4ad2b6cecf629839c41c2336c59"
+"@pollyjs/utils@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@pollyjs/utils/-/utils-5.0.0.tgz#c001f93865db82780dd17642c54e3919260c0034"
+  integrity sha512-zXoR13NGR1fVoUAcKR9/8AYCXZsMkG5EdvTZbR1nk5hCYJN1AR73HAKXMPsk/2vkLnBr6LWoAr3f9LjwqJOehQ==
   dependencies:
-    "@parcel/utils" "^1.11.0"
-    physical-cpu-count "^2.0.0"
+    qs "^6.7.0"
+    url-parse "^1.4.7"
+
+"@popperjs/core@^2.4.4":
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.4.4.tgz#11d5db19bd178936ec89cd84519c4de439574398"
+  integrity sha512-1oO6+dN5kdIA3sKPZhRGJTfGVP4SWV6KqlMOwry4J3HfyD68sl/3KmG7DeYUzvN+RbhXDnv/D8vNNB8168tAMg==
 
 "@samverschueren/stream-to-observable@^0.3.0":
   version "0.3.0"
@@ -1224,9 +1293,46 @@
   dependencies:
     any-observable "^0.3.0"
 
+"@sindresorhus/fnv1a@^1.2.0":
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/@sindresorhus/fnv1a/-/fnv1a-1.2.0.tgz#d554da64c406f3b62ad06dfce9efd537a4a55de4"
+  integrity sha512-5ezb/dBSTWtKQ4sLQwMgOJyREXJcZZkTMbendMwKrXTghUhWjZhstzkkmt4/WkFy/GSTSGzfJOKU7dEXv3C/XQ==
+
+"@testing-library/dom@^7.22.3":
+  version "7.24.1"
+  resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-7.24.1.tgz#0e8acd042070f2c1b183fbfe5c0d38b3194ad3c0"
+  integrity sha512-TemHWY59gvzcScGiE5eooZpzYk9GaED0TuuK4WefbIc/DQg0L5wOpnj7MIEeAGF3B7Ekf1kvmVnQ97vwz4Lmhg==
+  dependencies:
+    "@babel/code-frame" "^7.10.4"
+    "@babel/runtime" "^7.10.3"
+    "@types/aria-query" "^4.2.0"
+    aria-query "^4.2.2"
+    chalk "^4.1.0"
+    dom-accessibility-api "^0.5.1"
+    pretty-format "^26.4.2"
+
+"@testing-library/react@^10.4.9":
+  version "10.4.9"
+  resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-10.4.9.tgz#9faa29c6a1a217bf8bbb96a28bd29d7a847ca150"
+  integrity sha512-pHZKkqUy0tmiD81afs8xfiuseXfU/N7rAX3iKjeZYje86t9VaB0LrxYVa+OOsvkrveX5jCK3IjajVn2MbePvqA==
+  dependencies:
+    "@babel/runtime" "^7.10.3"
+    "@testing-library/dom" "^7.22.3"
+
+"@tokenizer/token@^0.1.0", "@tokenizer/token@^0.1.1":
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/@tokenizer/token/-/token-0.1.1.tgz#f0d92c12f87079ddfd1b29f614758b9696bc29e3"
+  integrity sha512-XO6INPbZCxdprl+9qa/AAbFFOMzzwqYxpjPgLICrMD6C2FCw6qfJOPcBk6JqqPLSaZ/Qx87qn4rpPmPMwaAK6w==
+
+"@types/aria-query@^4.2.0":
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0"
+  integrity sha512-iIgQNzCm0v7QMhhe4Jjn9uRh+I6GoPmt03CbEtwx3ao8/EfoQcmgtqH4vQ5Db/lxiIGaWDv6nwvunuh0RyX0+A==
+
 "@types/babel__core@^7.1.0":
-  version "7.1.3"
-  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30"
+  version "7.1.9"
+  resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d"
+  integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw==
   dependencies:
     "@babel/parser" "^7.1.0"
     "@babel/types" "^7.0.0"
@@ -1237,22 +1343,30 @@
 "@types/babel__generator@*":
   version "7.6.1"
   resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04"
+  integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew==
   dependencies:
     "@babel/types" "^7.0.0"
 
 "@types/babel__template@*":
   version "7.0.2"
   resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307"
+  integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==
   dependencies:
     "@babel/parser" "^7.1.0"
     "@babel/types" "^7.0.0"
 
 "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
-  version "7.0.8"
-  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012"
+  version "7.0.13"
+  resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.13.tgz#1874914be974a492e1b4cb00585cabb274e8ba18"
+  integrity sha512-i+zS7t6/s9cdQvbqKDARrcbrPvtJGlbYsMkazo03nTAK3RX9FNrLllXys22uiTGJapPOTZTQ35nHh4ISph4SLQ==
   dependencies:
     "@babel/types" "^7.3.0"
 
+"@types/classnames@^2.2.10":
+  version "2.2.10"
+  resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.10.tgz#cc658ca319b6355399efc1f5b9e818f1a24bf999"
+  integrity sha512-1UzDldn9GfYYEsWWnn/P4wkTlkZDH7lDb0wBMGbtIQc9zXEQq7FlKBdZUn6OBqD8sKZZ2RQO2mAjGpXiDGoRmQ==
+
 "@types/color-name@^1.1.1":
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
@@ -1445,47 +1559,63 @@
     "@types/d3-voronoi" "*"
     "@types/d3-zoom" "*"
 
+"@types/debug@^4.1.5":
+  version "4.1.5"
+  resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.5.tgz#b14efa8852b7768d898906613c23f688713e02cd"
+  integrity sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==
+
 "@types/eslint-visitor-keys@^1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d"
 
-"@types/events@*":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
-
 "@types/geojson@*":
   version "7946.0.7"
   resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.7.tgz#c8fa532b60a0042219cdf173ca21a975ef0666ad"
 
 "@types/glob@^7.1.1":
-  version "7.1.1"
-  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575"
+  version "7.1.3"
+  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183"
+  integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==
   dependencies:
-    "@types/events" "*"
     "@types/minimatch" "*"
     "@types/node" "*"
 
-"@types/history@*", "@types/history@^4.7.5":
+"@types/history@*":
+  version "4.7.6"
+  resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356"
+  integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w==
+
+"@types/history@^4.7.5":
   version "4.7.5"
   resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.5.tgz#527d20ef68571a4af02ed74350164e7a67544860"
 
 "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
+  integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==
 
 "@types/istanbul-lib-report@*":
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+  integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
   dependencies:
     "@types/istanbul-lib-coverage" "*"
 
 "@types/istanbul-reports@^1.1.1":
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a"
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2"
+  integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==
   dependencies:
     "@types/istanbul-lib-coverage" "*"
     "@types/istanbul-lib-report" "*"
 
+"@types/istanbul-reports@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821"
+  integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==
+  dependencies:
+    "@types/istanbul-lib-report" "*"
+
 "@types/jest@^24.0.25":
   version "24.9.1"
   resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.9.1.tgz#02baf9573c78f1b9974a5f36778b366aa77bd534"
@@ -1496,6 +1626,11 @@
   version "7.0.4"
   resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz#38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339"
 
+"@types/json-schema@^7.0.4":
+  version "7.0.5"
+  resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.5.tgz#dcce4430e64b443ba8945f0290fb564ad5bac6dd"
+  integrity sha512-7+2BITlgjgDhH0vvwZU/HZJVyk+2XUlvxXe8dFMedNX/aMkaOq++rMAFXc0tM7ij15QaWlbdQASBR9dihi+bDQ==
+
 "@types/jss@^9.5.6":
   version "9.5.8"
   resolved "https://registry.yarnpkg.com/@types/jss/-/jss-9.5.8.tgz#258391f42211c042fc965508d505cbdc579baa5b"
@@ -1514,10 +1649,20 @@
 "@types/minimatch@*":
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
+  integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
+
+"@types/node-fetch@^2.5.7":
+  version "2.5.7"
+  resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.7.tgz#20a2afffa882ab04d44ca786449a276f9f6bbf3c"
+  integrity sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==
+  dependencies:
+    "@types/node" "*"
+    form-data "^3.0.0"
 
 "@types/node@*":
-  version "13.5.1"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-13.5.1.tgz#6fae50892d1841f4b38b298e2f78fb68c5960cb9"
+  version "14.0.23"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.23.tgz#676fa0883450ed9da0bb24156213636290892806"
+  integrity sha512-Z4U8yDAl5TFkmYsZdFPdjeMa57NOvnaf1tljHzhouaPEp7LCj2JKkejpI1ODviIAQuW4CcQmxkQ77rnLsOOoKw==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.0"
@@ -1531,10 +1676,19 @@
 "@types/prop-types@*":
   version "15.7.3"
   resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
+  integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
 
 "@types/q@^1.5.1":
-  version "1.5.2"
-  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8"
+  version "1.5.4"
+  resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24"
+  integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==
+
+"@types/react-dom@^16.9.8":
+  version "16.9.8"
+  resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423"
+  integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA==
+  dependencies:
+    "@types/react" "*"
 
 "@types/react-lottie@^1.2.3":
   version "1.2.3"
@@ -1544,18 +1698,18 @@
     "@types/react" "*"
 
 "@types/react-router-dom@^5.1.3":
-  version "5.1.3"
-  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.3.tgz#b5d28e7850bd274d944c0fbbe5d57e6b30d71196"
-  integrity sha512-pCq7AkOvjE65jkGS5fQwQhvUp4+4PVD9g39gXLZViP2UqFiFzsEpB3PKf0O6mdbKsewSK8N14/eegisa/0CwnA==
+  version "5.1.5"
+  resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090"
+  integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw==
   dependencies:
     "@types/history" "*"
     "@types/react" "*"
     "@types/react-router" "*"
 
 "@types/react-router@*":
-  version "5.1.4"
-  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.4.tgz#7d70bd905543cb6bcbdcc6bd98902332054f31a6"
-  integrity sha512-PZtnBuyfL07sqCJvGg3z+0+kt6fobc/xmle08jBiezLS8FrmGeiGkJnuxL/8Zgy9L83ypUhniV5atZn/L8n9MQ==
+  version "5.1.8"
+  resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.8.tgz#4614e5ba7559657438e17766bb95ef6ed6acc3fa"
+  integrity sha512-HzOyJb+wFmyEhyfp4D4NYrumi+LQgQL/68HvJO+q6XtuHSDvw6Aqov7sCAhjbNq3bUPgPqbdvjXC5HeB2oEAPg==
   dependencies:
     "@types/history" "*"
     "@types/react" "*"
@@ -1567,8 +1721,9 @@
     "@types/react" "*"
 
 "@types/react@*", "@types/react@^16.9.15":
-  version "16.9.19"
-  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.19.tgz#c842aa83ea490007d29938146ff2e4d9e4360c40"
+  version "16.9.43"
+  resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.43.tgz#c287f23f6189666ee3bebc2eb8d0f84bcb6cdb6b"
+  integrity sha512-PxshAFcnJqIWYpJbLPriClH53Z2WlJcVZE+NP2etUtWQs2s7yIMj3/LDKZT/5CHJ/F62iyjVCDu2H3jHEXIxSg==
   dependencies:
     "@types/prop-types" "*"
     csstype "^2.2.0"
@@ -1576,22 +1731,24 @@
 "@types/stack-utils@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
-
-"@types/strip-bom@^3.0.0":
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2"
-
-"@types/strip-json-comments@0.0.30":
-  version "0.0.30"
-  resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
+  integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
 
 "@types/yargs-parser@*":
   version "15.0.0"
   resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d"
+  integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==
 
 "@types/yargs@^13.0.0":
-  version "13.0.7"
-  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.7.tgz#658d8578a444670a41cc9c338d5e0e0a9910fd9e"
+  version "13.0.9"
+  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1"
+  integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg==
+  dependencies:
+    "@types/yargs-parser" "*"
+
+"@types/yargs@^15.0.0":
+  version "15.0.5"
+  resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79"
+  integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==
   dependencies:
     "@types/yargs-parser" "*"
 
@@ -1658,141 +1815,160 @@
     semver "^6.3.0"
     tsutils "^3.17.1"
 
-"@webassemblyjs/ast@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
+"@webassemblyjs/ast@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964"
+  integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==
   dependencies:
-    "@webassemblyjs/helper-module-context" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/wast-parser" "1.8.5"
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
 
-"@webassemblyjs/floating-point-hex-parser@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721"
+"@webassemblyjs/floating-point-hex-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4"
+  integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==
 
-"@webassemblyjs/helper-api-error@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7"
+"@webassemblyjs/helper-api-error@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2"
+  integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==
 
-"@webassemblyjs/helper-buffer@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204"
+"@webassemblyjs/helper-buffer@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00"
+  integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==
 
-"@webassemblyjs/helper-code-frame@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e"
+"@webassemblyjs/helper-code-frame@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27"
+  integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==
   dependencies:
-    "@webassemblyjs/wast-printer" "1.8.5"
+    "@webassemblyjs/wast-printer" "1.9.0"
 
-"@webassemblyjs/helper-fsm@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452"
+"@webassemblyjs/helper-fsm@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8"
+  integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==
 
-"@webassemblyjs/helper-module-context@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245"
+"@webassemblyjs/helper-module-context@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07"
+  integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    mamacro "^0.0.3"
+    "@webassemblyjs/ast" "1.9.0"
 
-"@webassemblyjs/helper-wasm-bytecode@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61"
+"@webassemblyjs/helper-wasm-bytecode@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790"
+  integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==
 
-"@webassemblyjs/helper-wasm-section@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf"
+"@webassemblyjs/helper-wasm-section@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346"
+  integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-buffer" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/wasm-gen" "1.8.5"
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
 
-"@webassemblyjs/ieee754@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e"
+"@webassemblyjs/ieee754@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4"
+  integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==
   dependencies:
     "@xtuc/ieee754" "^1.2.0"
 
-"@webassemblyjs/leb128@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10"
+"@webassemblyjs/leb128@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95"
+  integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==
   dependencies:
     "@xtuc/long" "4.2.2"
 
-"@webassemblyjs/utf8@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc"
+"@webassemblyjs/utf8@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab"
+  integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==
 
-"@webassemblyjs/wasm-edit@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a"
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-buffer" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/helper-wasm-section" "1.8.5"
-    "@webassemblyjs/wasm-gen" "1.8.5"
-    "@webassemblyjs/wasm-opt" "1.8.5"
-    "@webassemblyjs/wasm-parser" "1.8.5"
-    "@webassemblyjs/wast-printer" "1.8.5"
-
-"@webassemblyjs/wasm-gen@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc"
+"@webassemblyjs/wasm-edit@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf"
+  integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/helper-wasm-section" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-opt" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    "@webassemblyjs/wast-printer" "1.9.0"
+
+"@webassemblyjs/wasm-gen@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c"
+  integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/ieee754" "1.8.5"
-    "@webassemblyjs/leb128" "1.8.5"
-    "@webassemblyjs/utf8" "1.8.5"
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
 
-"@webassemblyjs/wasm-opt@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264"
+"@webassemblyjs/wasm-opt@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61"
+  integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-buffer" "1.8.5"
-    "@webassemblyjs/wasm-gen" "1.8.5"
-    "@webassemblyjs/wasm-parser" "1.8.5"
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-buffer" "1.9.0"
+    "@webassemblyjs/wasm-gen" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
 
-"@webassemblyjs/wasm-parser@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d"
+"@webassemblyjs/wasm-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e"
+  integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-api-error" "1.8.5"
-    "@webassemblyjs/helper-wasm-bytecode" "1.8.5"
-    "@webassemblyjs/ieee754" "1.8.5"
-    "@webassemblyjs/leb128" "1.8.5"
-    "@webassemblyjs/utf8" "1.8.5"
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-wasm-bytecode" "1.9.0"
+    "@webassemblyjs/ieee754" "1.9.0"
+    "@webassemblyjs/leb128" "1.9.0"
+    "@webassemblyjs/utf8" "1.9.0"
 
-"@webassemblyjs/wast-parser@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c"
-  dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/floating-point-hex-parser" "1.8.5"
-    "@webassemblyjs/helper-api-error" "1.8.5"
-    "@webassemblyjs/helper-code-frame" "1.8.5"
-    "@webassemblyjs/helper-fsm" "1.8.5"
+"@webassemblyjs/wast-parser@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914"
+  integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==
+  dependencies:
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/floating-point-hex-parser" "1.9.0"
+    "@webassemblyjs/helper-api-error" "1.9.0"
+    "@webassemblyjs/helper-code-frame" "1.9.0"
+    "@webassemblyjs/helper-fsm" "1.9.0"
     "@xtuc/long" "4.2.2"
 
-"@webassemblyjs/wast-printer@1.8.5":
-  version "1.8.5"
-  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc"
+"@webassemblyjs/wast-printer@1.9.0":
+  version "1.9.0"
+  resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899"
+  integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/wast-parser" "1.8.5"
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/wast-parser" "1.9.0"
     "@xtuc/long" "4.2.2"
 
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+  integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
 
 "@xtuc/long@4.2.2":
   version "4.2.2"
   resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+  integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 
 JSONStream@^1.0.4:
   version "1.3.5"
@@ -1804,19 +1980,22 @@ JSONStream@^1.0.4:
 abab@^2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a"
+  integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==
 
 abbrev@1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+  integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
 
 accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7:
   version "1.3.7"
   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
+  integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
   dependencies:
     mime-types "~2.1.24"
     negotiator "0.6.2"
 
-acorn-globals@^4.1.0, acorn-globals@^4.3.0:
+acorn-globals@^4.1.0:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.3.4.tgz#9fa1926addc11c97308c4e66d7add0d40c3272e7"
   dependencies:
@@ -1829,29 +2008,51 @@ acorn-jsx@^3.0.0:
   dependencies:
     acorn "^3.0.4"
 
-acorn-jsx@^5.0.0, acorn-jsx@^5.1.0:
+acorn-jsx@^5.0.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384"
 
-acorn-walk@^6.0.1, acorn-walk@^6.1.1:
+acorn-jsx@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
+  integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
+
+acorn-walk@^6.0.1:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
+  integrity sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==
+
+acorn-walk@^7.1.1:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+  integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
 
 acorn@^3.0.4:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
 
-acorn@^5.0.0, acorn@^5.5.0, acorn@^5.5.3:
+acorn@^5.5.0:
   version "5.7.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
 
-acorn@^6.0.1, acorn@^6.0.2, acorn@^6.0.4, acorn@^6.0.7, acorn@^6.2.0:
+acorn@^5.5.3:
+  version "5.7.4"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
+  integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
+
+acorn@^6.0.1, acorn@^6.0.7, acorn@^6.2.1:
+  version "6.4.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
+  integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
+
+acorn@^6.0.2:
   version "6.4.0"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784"
 
-acorn@^7.1.0:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
+acorn@^7.1.0, acorn@^7.1.1:
+  version "7.3.1"
+  resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.3.1.tgz#85010754db53c3fbaf3b9ea3e083aa5c5d147ffd"
+  integrity sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==
 
 add-stream@^1.0.0:
   version "1.0.0"
@@ -1900,12 +2101,28 @@ airbnb-prop-types@^2.15.0:
 ajv-errors@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
+  integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==
+
+ajv-keywords@^3.1.0:
+  version "3.5.1"
+  resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.1.tgz#b83ca89c5d42d69031f424cad49aada0236c6957"
+  integrity sha512-KWcq3xN8fDjSB+IMoh2VaXVhRI0BBGxoYp3rx7Pkb6z0cFjYR9Q9l4yZqqals0/zsioCmocC5H6UvsGD4MoIBA==
 
-ajv-keywords@^3.1.0, ajv-keywords@^3.4.1:
+ajv-keywords@^3.4.1:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
 
-ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1:
+ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.5.3, ajv@^6.5.5:
+  version "6.12.3"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706"
+  integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==
+  dependencies:
+    fast-deep-equal "^3.1.1"
+    fast-json-stable-stringify "^2.0.0"
+    json-schema-traverse "^0.4.1"
+    uri-js "^4.2.2"
+
+ajv@^6.9.1:
   version "6.11.0"
   resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9"
   dependencies:
@@ -1914,21 +2131,20 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1:
     json-schema-traverse "^0.4.1"
     uri-js "^4.2.2"
 
-alphanum-sort@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
-
 amdefine@>=0.0.4:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
+  integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
 
 ansi-colors@^3.0.0:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf"
+  integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==
 
 ansi-escapes@^3.0.0, ansi-escapes@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
+  integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
 
 ansi-escapes@^4.2.1:
   version "4.3.0"
@@ -1939,24 +2155,29 @@ ansi-escapes@^4.2.1:
 ansi-gray@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
+  integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
   dependencies:
     ansi-wrap "0.1.0"
 
 ansi-html@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+  integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4=
 
 ansi-regex@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
 
 ansi-regex@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+  integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
 
 ansi-regex@^4.0.0, ansi-regex@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+  integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
 
 ansi-regex@^5.0.0:
   version "5.0.0"
@@ -1965,29 +2186,26 @@ ansi-regex@^5.0.0:
 ansi-styles@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
 
 ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+  integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
   dependencies:
     color-convert "^1.9.0"
 
-ansi-styles@^4.0.0:
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
   dependencies:
     "@types/color-name" "^1.1.1"
     color-convert "^2.0.1"
 
-ansi-to-html@^0.6.4:
-  version "0.6.13"
-  resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.13.tgz#c72eae8b63e5ca0643aab11bfc6e6f2217425833"
-  dependencies:
-    entities "^1.1.2"
-
 ansi-wrap@0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
+  integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
 
 any-observable@^0.3.0:
   version "0.3.0"
@@ -2007,13 +2225,23 @@ anymatch@^1.3.0:
 anymatch@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+  integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
   dependencies:
     micromatch "^3.1.4"
     normalize-path "^2.1.1"
 
+anymatch@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+  integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+  dependencies:
+    normalize-path "^3.0.0"
+    picomatch "^2.0.4"
+
 aproba@^1.0.3, aproba@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+  integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
 
 are-we-there-yet@~1.1.2:
   version "1.1.5"
@@ -2025,9 +2253,23 @@ are-we-there-yet@~1.1.2:
 argparse@^1.0.10, argparse@^1.0.7:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+  integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
   dependencies:
     sprintf-js "~1.0.2"
 
+argsarray@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb"
+  integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs=
+
+aria-query@^4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-4.2.2.tgz#0d2ca6c9aceb56b8977e9fed6aed7e15bbd2f83b"
+  integrity sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==
+  dependencies:
+    "@babel/runtime" "^7.10.2"
+    "@babel/runtime-corejs3" "^7.10.2"
+
 arr-diff@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
@@ -2037,18 +2279,22 @@ arr-diff@^2.0.0:
 arr-diff@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+  integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
 
 arr-flatten@^1.0.1, arr-flatten@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+  integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
 
 arr-union@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+  integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
 
 array-equal@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+  integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
 
 array-filter@^1.0.0:
   version "1.0.0"
@@ -2061,16 +2307,18 @@ array-find-index@^1.0.1:
 array-flatten@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+  integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
 
 array-flatten@^2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+  integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
 
 array-ify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
 
-array-includes@^3.0.3:
+array-includes@^3.0.3, array-includes@^3.1.1:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.1.tgz#cdd67e6852bdf9c1215460786732255ed2459348"
   dependencies:
@@ -2081,6 +2329,7 @@ array-includes@^3.0.3:
 array-union@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+  integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=
   dependencies:
     array-uniq "^1.0.1"
 
@@ -2091,6 +2340,7 @@ array-union@^2.1.0:
 array-uniq@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+  integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=
 
 array-unique@^0.2.1:
   version "0.2.1"
@@ -2099,6 +2349,7 @@ array-unique@^0.2.1:
 array-unique@^0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+  integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
 
 array.prototype.find@^2.1.0:
   version "2.1.0"
@@ -2125,6 +2376,7 @@ asap@~2.0.3:
 asn1.js@^4.0.0:
   version "4.10.1"
   resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+  integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==
   dependencies:
     bn.js "^4.0.0"
     inherits "^2.0.1"
@@ -2133,16 +2385,19 @@ asn1.js@^4.0.0:
 asn1@~0.2.3:
   version "0.2.4"
   resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+  integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
   dependencies:
     safer-buffer "~2.1.0"
 
 assert-plus@1.0.0, assert-plus@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+  integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
 
 assert@^1.1.1:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb"
+  integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==
   dependencies:
     object-assign "^4.1.1"
     util "0.10.3"
@@ -2150,14 +2405,17 @@ assert@^1.1.1:
 assign-symbols@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+  integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
 
 astral-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
+  integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
 
 async-each@^1.0.0, async-each@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
+  integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
 
 async-foreach@^0.1.3:
   version "0.1.3"
@@ -2166,6 +2424,7 @@ async-foreach@^0.1.3:
 async-limiter@~1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
+  integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
 
 async@1.5.2:
   version "1.5.2"
@@ -2174,44 +2433,52 @@ async@1.5.2:
 async@^2.6.2:
   version "2.6.3"
   resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+  integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
   dependencies:
     lodash "^4.17.14"
 
 async@~0.9.0:
   version "0.9.2"
   resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d"
+  integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=
 
 async@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9"
+  integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=
 
 asynckit@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
 
 atob@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+  integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
 
-autoprefixer@9.6.1:
-  version "9.6.1"
-  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.6.1.tgz#51967a02d2d2300bb01866c1611ec8348d355a47"
+autoprefixer@9.7.6:
+  version "9.7.6"
+  resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.6.tgz#63ac5bbc0ce7934e6997207d5bb00d68fa8293a4"
+  integrity sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==
   dependencies:
-    browserslist "^4.6.3"
-    caniuse-lite "^1.0.30000980"
+    browserslist "^4.11.1"
+    caniuse-lite "^1.0.30001039"
     chalk "^2.4.2"
     normalize-range "^0.1.2"
     num2fraction "^1.2.2"
-    postcss "^7.0.17"
-    postcss-value-parser "^4.0.0"
+    postcss "^7.0.27"
+    postcss-value-parser "^4.0.3"
 
 aws-sign2@~0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+  integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
 
 aws4@^1.8.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz#a17b3a8ea811060e74d47d306122400ad4497ae2"
+  integrity sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==
 
 axios@^0.19.0:
   version "0.19.2"
@@ -2219,17 +2486,10 @@ axios@^0.19.0:
   dependencies:
     follow-redirects "1.5.10"
 
-babel-code-frame@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
-  dependencies:
-    chalk "^1.1.3"
-    esutils "^2.0.2"
-    js-tokens "^3.0.2"
-
 babel-core@7.0.0-bridge.0:
   version "7.0.0-bridge.0"
   resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece"
+  integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==
 
 babel-eslint@10.0.1:
   version "10.0.1"
@@ -2242,32 +2502,22 @@ babel-eslint@10.0.1:
     eslint-scope "3.7.1"
     eslint-visitor-keys "^1.0.0"
 
-babel-eslint@10.0.2:
-  version "10.0.2"
-  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.2.tgz#182d5ac204579ff0881684b040560fdcc1558456"
+babel-eslint@10.1.0:
+  version "10.1.0"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz#6968e568a910b78fb3779cdd8b6ac2f479943232"
+  integrity sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.0.0"
-    "@babel/traverse" "^7.0.0"
-    "@babel/types" "^7.0.0"
-    eslint-scope "3.7.1"
+    "@babel/parser" "^7.7.0"
+    "@babel/traverse" "^7.7.0"
+    "@babel/types" "^7.7.0"
     eslint-visitor-keys "^1.0.0"
+    resolve "^1.12.0"
 
-babel-jest@24.8.0:
-  version "24.8.0"
-  resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.8.0.tgz#5c15ff2b28e20b0f45df43fe6b7f2aae93dba589"
-  dependencies:
-    "@jest/transform" "^24.8.0"
-    "@jest/types" "^24.8.0"
-    "@types/babel__core" "^7.1.0"
-    babel-plugin-istanbul "^5.1.0"
-    babel-preset-jest "^24.6.0"
-    chalk "^2.4.2"
-    slash "^2.0.0"
-
-babel-jest@^24.9.0:
+babel-jest@24.9.0, babel-jest@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-24.9.0.tgz#3fc327cb8467b89d14d7bc70e315104a783ccd54"
+  integrity sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==
   dependencies:
     "@jest/transform" "^24.9.0"
     "@jest/types" "^24.9.0"
@@ -2277,20 +2527,16 @@ babel-jest@^24.9.0:
     chalk "^2.4.2"
     slash "^2.0.0"
 
-babel-loader@8.0.6:
-  version "8.0.6"
-  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb"
+babel-loader@8.1.0:
+  version "8.1.0"
+  resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz#c611d5112bd5209abe8b9fa84c3e4da25275f1c3"
+  integrity sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==
   dependencies:
-    find-cache-dir "^2.0.0"
-    loader-utils "^1.0.2"
-    mkdirp "^0.5.1"
+    find-cache-dir "^2.1.0"
+    loader-utils "^1.4.0"
+    mkdirp "^0.5.3"
     pify "^4.0.1"
-
-babel-messages@^6.23.0:
-  version "6.23.0"
-  resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
-  dependencies:
-    babel-runtime "^6.22.0"
+    schema-utils "^2.6.5"
 
 babel-plugin-dynamic-import-node@^2.3.0:
   version "2.3.0"
@@ -2301,6 +2547,7 @@ babel-plugin-dynamic-import-node@^2.3.0:
 babel-plugin-istanbul@^5.1.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz#df4ade83d897a92df069c4d9a25cf2671293c854"
+  integrity sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     find-up "^3.0.0"
@@ -2310,33 +2557,10 @@ babel-plugin-istanbul@^5.1.0:
 babel-plugin-jest-hoist@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.9.0.tgz#4f837091eb407e01447c8843cbec546d0002d756"
+  integrity sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==
   dependencies:
     "@types/babel__traverse" "^7.0.6"
 
-babel-plugin-transform-es2015-modules-commonjs@^6.26.0:
-  version "6.26.2"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
-  dependencies:
-    babel-plugin-transform-strict-mode "^6.24.1"
-    babel-runtime "^6.26.0"
-    babel-template "^6.26.0"
-    babel-types "^6.26.0"
-
-babel-plugin-transform-strict-mode@^6.24.1:
-  version "6.24.1"
-  resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
-  dependencies:
-    babel-runtime "^6.22.0"
-    babel-types "^6.24.1"
-
-babel-polyfill@6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
-  dependencies:
-    babel-runtime "^6.26.0"
-    core-js "^2.5.0"
-    regenerator-runtime "^0.10.5"
-
 babel-preset-cozy-app@1.5.2:
   version "1.5.2"
   resolved "https://registry.yarnpkg.com/babel-preset-cozy-app/-/babel-preset-cozy-app-1.5.2.tgz#56ecfa524b33ee89022f122079eedc6d8da59448"
@@ -2352,9 +2576,10 @@ babel-preset-cozy-app@1.5.2:
     browserslist-config-cozy "0.2.0"
     lodash "4.17.13"
 
-babel-preset-cozy-app@1.7.0:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/babel-preset-cozy-app/-/babel-preset-cozy-app-1.7.0.tgz#edb2f9f733dddf92647069047702bbc8eb7e698d"
+babel-preset-cozy-app@^1.9.0:
+  version "1.9.1"
+  resolved "https://registry.yarnpkg.com/babel-preset-cozy-app/-/babel-preset-cozy-app-1.9.1.tgz#a190df4702feaaea5560eafa2e506d5816024f2a"
+  integrity sha512-zi2NCe1WSWrC0fKU9C9MTiY0XGXQ9EdEZqK3rLTk7mr8M2hRWjWEUwH2HyOMd0ZkL25c29YSUpmYJXk7xBIIWw==
   dependencies:
     "@babel/core" "7.2.2"
     "@babel/helper-plugin-utils" "7.0.0"
@@ -2364,83 +2589,48 @@ babel-preset-cozy-app@1.7.0:
     "@babel/preset-env" "7.3.1"
     "@babel/preset-react" "7.0.0"
     "@babel/runtime" "7.2.0"
-    browserslist-config-cozy "^0.3.0"
-    lodash "4.17.15"
+    browserslist-config-cozy "^0.3.1"
+    lodash "4.17.19"
 
-babel-preset-jest@^24.6.0, babel-preset-jest@^24.9.0:
+babel-preset-jest@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-24.9.0.tgz#192b521e2217fb1d1f67cf73f70c336650ad3cdc"
+  integrity sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==
   dependencies:
     "@babel/plugin-syntax-object-rest-spread" "^7.0.0"
     babel-plugin-jest-hoist "^24.9.0"
 
-babel-runtime@^6.11.6, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+babel-runtime@6.26.0, babel-runtime@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   dependencies:
     core-js "^2.4.0"
     regenerator-runtime "^0.11.0"
 
-babel-template@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
-  dependencies:
-    babel-runtime "^6.26.0"
-    babel-traverse "^6.26.0"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-    lodash "^4.17.4"
-
-babel-traverse@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
-  dependencies:
-    babel-code-frame "^6.26.0"
-    babel-messages "^6.23.0"
-    babel-runtime "^6.26.0"
-    babel-types "^6.26.0"
-    babylon "^6.18.0"
-    debug "^2.6.8"
-    globals "^9.18.0"
-    invariant "^2.2.2"
-    lodash "^4.17.4"
-
-babel-types@^6.15.0, babel-types@^6.24.1, babel-types@^6.26.0:
-  version "6.26.0"
-  resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
-  dependencies:
-    babel-runtime "^6.26.0"
-    esutils "^2.0.2"
-    lodash "^4.17.4"
-    to-fast-properties "^1.0.3"
-
-babylon-walk@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce"
-  dependencies:
-    babel-runtime "^6.11.6"
-    babel-types "^6.15.0"
-    lodash.clone "^4.5.0"
-
-babylon@^6.18.0:
-  version "6.18.0"
-  resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
-
 bail@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776"
+  integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==
 
 balanced-match@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
 base64-js@^1.0.2:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
+  integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
+
+base64url@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d"
+  integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
 
 base@^0.11.1:
   version "0.11.2"
   resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+  integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
   dependencies:
     cache-base "^1.0.1"
     class-utils "^0.3.5"
@@ -2450,60 +2640,110 @@ base@^0.11.1:
     mixin-deep "^1.2.0"
     pascalcase "^0.1.1"
 
+basic-auth@~2.0.1:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a"
+  integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==
+  dependencies:
+    safe-buffer "5.1.2"
+
 batch@0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+  integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
 
 bcrypt-pbkdf@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+  integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
   dependencies:
     tweetnacl "^0.14.3"
 
 bfj@^6.1.1:
   version "6.1.2"
   resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
+  integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
   dependencies:
     bluebird "^3.5.5"
     check-types "^8.0.3"
     hoopy "^0.1.4"
     tryer "^1.0.1"
 
+big-integer@^1.6.44:
+  version "1.6.48"
+  resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e"
+  integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==
+
 big.js@^3.1.3:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+  integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
 
 big.js@^5.2.2:
   version "5.2.2"
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+  integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
 
 binary-extensions@^1.0.0:
   version "1.13.1"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
+  integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==
+
+binary-extensions@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
+  integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
 
 bindings@^1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df"
+  integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==
   dependencies:
     file-uri-to-path "1.0.0"
 
+bl@^2.0.1:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/bl/-/bl-2.2.1.tgz#8c11a7b730655c5d56898cdc871224f40fd901d5"
+  integrity sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==
+  dependencies:
+    readable-stream "^2.3.5"
+    safe-buffer "^5.1.1"
+
 block-stream@*:
   version "0.0.9"
   resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a"
   dependencies:
     inherits "~2.0.0"
 
-bluebird@^3.5.0, bluebird@^3.5.5:
+bluebird-retry@^0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/bluebird-retry/-/bluebird-retry-0.11.0.tgz#1289ab22cbbc3a02587baad35595351dd0c1c047"
+  integrity sha1-EomrIsu8OgJYe6rTVZU1HdDBwEc=
+
+bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.5, bluebird@^3.7.2:
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
+  integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
+
+blueimp-md5@^2.10.0:
+  version "2.17.0"
+  resolved "https://registry.yarnpkg.com/blueimp-md5/-/blueimp-md5-2.17.0.tgz#f4fcac088b115f7b4045f19f5da59e9d01b1bb96"
+  integrity sha512-x5PKJHY5rHQYaADj6NwPUR2QRCUVSggPzrUKkeENpj871o9l9IefJbO2jkT5UvYykeOK9dx0VmkIo6dZ+vThYw==
 
-bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
-  version "4.11.8"
-  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0:
+  version "4.11.9"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828"
+  integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==
 
-body-parser@1.19.0:
+bn.js@^5.1.1:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0"
+  integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==
+
+body-parser@1.19.0, body-parser@^1.19.0:
   version "1.19.0"
   resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
+  integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
   dependencies:
     bytes "3.1.0"
     content-type "~1.0.4"
@@ -2517,12 +2757,19 @@ body-parser@1.19.0:
     type-is "~1.6.17"
 
 body-scroll-lock@^2.5.8:
-  version "2.6.4"
-  resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-2.6.4.tgz#567abc60ef4d656a79156781771398ef40462e94"
+  version "2.7.1"
+  resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-2.7.1.tgz#caf3f9c91773af1ffb684cd66ed9137b5b737014"
+  integrity sha512-hS53SQ8RhM0e4DsQ3PKz6Gr2O7Kpdh59TWU98GHjaQznL7y4dFycEPk7pFQAikqBaUSCArkc5E3pe7CWIt2fZA==
+
+bolgia@>=2.7.4:
+  version "2.8.3"
+  resolved "https://registry.yarnpkg.com/bolgia/-/bolgia-2.8.3.tgz#bae607317a33fbda0c322297b43afd239ea739d2"
+  integrity sha512-BEmes/GII/02PNOHWlFUpXfuGPCV7kN4ABw6vmctoctix1PO+55D5GmjdSFAxwee58TC7r9nFm5gNvVE8scv1Q==
 
 bonjour@^3.5.0:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+  integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU=
   dependencies:
     array-flatten "^2.1.0"
     deep-equal "^1.0.1"
@@ -2534,10 +2781,17 @@ bonjour@^3.5.0:
 boolbase@^1.0.0, boolbase@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
+
+bowser@^2.4.0:
+  version "2.10.0"
+  resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.10.0.tgz#be3736f161c4bb8b10958027ab99465d2a811198"
+  integrity sha512-OCsqTQboTEWWsUjcp5jLSw2ZHsBiv2C105iFs61bOT0Hnwi9p7/uuXdd7mu8RYcarREfdjNN+8LitmEHATsLYg==
 
 brace-expansion@^1.1.7:
   version "1.1.11"
   resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+  integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
   dependencies:
     balanced-match "^1.0.0"
     concat-map "0.0.1"
@@ -2553,6 +2807,7 @@ braces@^1.8.2:
 braces@^2.2.2, braces@^2.3.1, braces@^2.3.2:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+  integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
   dependencies:
     arr-flatten "^1.1.0"
     array-unique "^0.3.2"
@@ -2565,7 +2820,7 @@ braces@^2.2.2, braces@^2.3.1, braces@^2.3.2:
     split-string "^3.0.2"
     to-regex "^3.0.1"
 
-braces@^3.0.1:
+braces@^3.0.1, braces@~3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
   dependencies:
@@ -2575,32 +2830,27 @@ brcast@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/brcast/-/brcast-3.0.1.tgz#6256a8349b20de9eed44257a9b24d71493cd48dd"
 
-brfs@^1.2.0:
-  version "1.6.1"
-  resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3"
-  dependencies:
-    quote-stream "^1.0.1"
-    resolve "^1.1.5"
-    static-module "^2.2.0"
-    through2 "^2.0.0"
-
 brorand@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+  integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=
 
-browser-process-hrtime@^0.1.2:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4"
+browser-process-hrtime@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+  integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
 
 browser-resolve@^1.11.3:
   version "1.11.3"
   resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
+  integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==
   dependencies:
     resolve "1.1.7"
 
 browserify-aes@^1.0.0, browserify-aes@^1.0.4:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+  integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==
   dependencies:
     buffer-xor "^1.0.3"
     cipher-base "^1.0.0"
@@ -2612,6 +2862,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4:
 browserify-cipher@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+  integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
   dependencies:
     browserify-aes "^1.0.4"
     browserify-des "^1.0.0"
@@ -2620,46 +2871,64 @@ browserify-cipher@^1.0.0:
 browserify-des@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+  integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==
   dependencies:
     cipher-base "^1.0.1"
     des.js "^1.0.0"
     inherits "^2.0.1"
     safe-buffer "^5.1.2"
 
-browserify-rsa@^4.0.0:
+browserify-rsa@^4.0.0, browserify-rsa@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+  integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=
   dependencies:
     bn.js "^4.1.0"
     randombytes "^2.0.1"
 
 browserify-sign@^4.0.0:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
-  dependencies:
-    bn.js "^4.1.1"
-    browserify-rsa "^4.0.0"
-    create-hash "^1.1.0"
-    create-hmac "^1.1.2"
-    elliptic "^6.0.0"
-    inherits "^2.0.1"
-    parse-asn1 "^5.0.0"
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11"
+  integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==
+  dependencies:
+    bn.js "^5.1.1"
+    browserify-rsa "^4.0.1"
+    create-hash "^1.2.0"
+    create-hmac "^1.1.7"
+    elliptic "^6.5.2"
+    inherits "^2.0.4"
+    parse-asn1 "^5.1.5"
+    readable-stream "^3.6.0"
+    safe-buffer "^5.2.0"
 
 browserify-zlib@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+  integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==
   dependencies:
     pako "~1.0.5"
 
 browserslist-config-cozy@0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/browserslist-config-cozy/-/browserslist-config-cozy-0.2.0.tgz#6056e7bcfcfe07b04a5319068ea6c12cdcd53d96"
+  integrity sha512-Ma87bBi3cfwA686nMziSxxv+mvGd3kWPQXrqwUeSYcNvXvqcXd8gmvLoMsuo2B4IuwGpVGdNGEcyDy9b7i05tA==
 
-browserslist-config-cozy@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/browserslist-config-cozy/-/browserslist-config-cozy-0.3.0.tgz#8df42275b168885c6961ce4b0d253b5f415d357f"
+browserslist-config-cozy@^0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/browserslist-config-cozy/-/browserslist-config-cozy-0.3.1.tgz#17313c224a8c04e5c0943e8da6fdc7fa03a5936f"
+  integrity sha512-p9YGQRu3eI+uylGrDnaLro6EZpiOnIvAO7I97hTG8gq2sBL0MdcbhybSG8jK9A+UIRwIOSp/Nw/pJeSpyew+lg==
+
+browserslist@^4.11.1:
+  version "4.13.0"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.13.0.tgz#42556cba011e1b0a2775b611cba6a8eca18e940d"
+  integrity sha512-MINatJ5ZNrLnQ6blGvePd/QOz9Xtu+Ne+x29iQSCHfkU5BugKVJwZKn/iiL8UbpIpa3JhviKjz+XxMo0m2caFQ==
+  dependencies:
+    caniuse-lite "^1.0.30001093"
+    electron-to-chromium "^1.3.488"
+    escalade "^3.0.1"
+    node-releases "^1.1.58"
 
-browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.3.4, browserslist@^4.6.3:
+browserslist@^4.3.4:
   version "4.8.5"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.5.tgz#691af4e327ac877b25e7a3f7ee869c4ef36cdea3"
   dependencies:
@@ -2670,50 +2939,92 @@ browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.3.4, browserslist@^4.6
 bser@2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+  integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
   dependencies:
     node-int64 "^0.4.0"
 
-buffer-equal@0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
+btoa@1.2.1, btoa@^1.2.1:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73"
+  integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==
+
+buffer-from@1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+  integrity sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==
 
 buffer-from@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+  integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
 
 buffer-indexof@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+  integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==
 
 buffer-xor@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+  integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=
 
 buffer@^4.3.0:
   version "4.9.2"
   resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8"
+  integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==
   dependencies:
     base64-js "^1.0.2"
     ieee754 "^1.1.4"
     isarray "^1.0.0"
 
+buffer@^5.5.0:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
+  integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
 builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
 
 builtins@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
+  integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og=
 
 bytes@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+  integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=
 
 bytes@3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
+  integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+
+cacache@^10.0.4:
+  version "10.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+  integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==
+  dependencies:
+    bluebird "^3.5.1"
+    chownr "^1.0.1"
+    glob "^7.1.2"
+    graceful-fs "^4.1.11"
+    lru-cache "^4.1.1"
+    mississippi "^2.0.0"
+    mkdirp "^0.5.1"
+    move-concurrently "^1.0.1"
+    promise-inflight "^1.0.1"
+    rimraf "^2.6.2"
+    ssri "^5.2.4"
+    unique-filename "^1.1.0"
+    y18n "^4.0.0"
 
-cacache@^11.3.2, cacache@^11.3.3:
+cacache@^11.3.3:
   version "11.3.3"
   resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc"
   dependencies:
@@ -2733,8 +3044,9 @@ cacache@^11.3.2, cacache@^11.3.3:
     y18n "^4.0.0"
 
 cacache@^12.0.2:
-  version "12.0.3"
-  resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
+  version "12.0.4"
+  resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c"
+  integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==
   dependencies:
     bluebird "^3.5.5"
     chownr "^1.1.1"
@@ -2755,6 +3067,7 @@ cacache@^12.0.2:
 cache-base@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+  integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
   dependencies:
     collection-visit "^1.0.0"
     component-emitter "^1.2.1"
@@ -2766,33 +3079,46 @@ cache-base@^1.0.1:
     union-value "^1.0.0"
     unset-value "^1.0.0"
 
-call-me-maybe@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
-
 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"
+  integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=
+  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"
+  integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=
+
 callsites@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+  integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
 
 callsites@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+  integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
 camel-case@3.0.x:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+  integrity sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=
   dependencies:
     no-case "^2.2.0"
     upper-case "^1.1.1"
@@ -2827,33 +3153,29 @@ camelcase@^4.1.0:
 camelcase@^5.0.0, camelcase@^5.3.1:
   version "5.3.1"
   resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+  integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
 
-caniuse-api@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
-  dependencies:
-    browserslist "^4.0.0"
-    caniuse-lite "^1.0.0"
-    lodash.memoize "^4.1.2"
-    lodash.uniq "^4.5.0"
-
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30001022:
-  version "1.0.30001023"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4"
+caniuse-lite@^1.0.30001022, caniuse-lite@^1.0.30001039, caniuse-lite@^1.0.30001093:
+  version "1.0.30001100"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001100.tgz#2a58615e0c01cf716ab349b20ca4d86ef944aa4e"
+  integrity sha512-0eYdp1+wFCnMlCj2oudciuQn2B9xAFq3WpgpcBIZTxk/1HNA/O2YA7rpeYhnOqsqAJq1AHUgx6i1jtafg7m2zA==
 
 capture-exit@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
+  integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
   dependencies:
     rsvp "^4.8.4"
 
 caseless@~0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+  integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
 
 chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
   dependencies:
     ansi-styles "^2.2.1"
     escape-string-regexp "^1.0.2"
@@ -2861,14 +3183,31 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
     strip-ansi "^3.0.0"
     supports-color "^2.0.0"
 
-chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
+chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+  integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
   dependencies:
     ansi-styles "^3.2.1"
     escape-string-regexp "^1.0.5"
     supports-color "^5.3.0"
 
+chalk@3, chalk@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+  integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
+chalk@^4.0.0, chalk@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
+  integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==
+  dependencies:
+    ansi-styles "^4.1.0"
+    supports-color "^7.1.0"
+
 change-emitter@^0.1.2:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/change-emitter/-/change-emitter-0.1.6.tgz#e8b2fe3d7f1ab7d69a32199aff91ea6931409515"
@@ -2876,24 +3215,34 @@ change-emitter@^0.1.2:
 character-entities-legacy@^1.0.0:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1"
+  integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==
 
 character-entities@^1.0.0:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b"
+  integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==
 
 character-reference-invalid@^1.0.0:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
+  integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
 
 chardet@^0.7.0:
   version "0.7.0"
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
+  integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
+
+charenc@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667"
+  integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=
 
 check-types@^8.0.3:
   version "8.0.3"
   resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
+  integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
 
-cheerio@^1.0.0-rc.2:
+cheerio@1.0.0-rc.3, cheerio@^1.0.0-rc.2, cheerio@^1.0.0-rc.3:
   version "1.0.0-rc.3"
   resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.3.tgz#094636d425b2e9c0f4eb91a46c05630c9a1a8bf6"
   dependencies:
@@ -2919,7 +3268,7 @@ chokidar@1.5.2:
   optionalDependencies:
     fsevents "^1.0.0"
 
-chokidar@^2.0.2, chokidar@^2.1.5, chokidar@^2.1.6:
+chokidar@^2.1.8:
   version "2.1.8"
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
   dependencies:
@@ -2937,43 +3286,77 @@ chokidar@^2.0.2, chokidar@^2.1.5, chokidar@^2.1.6:
   optionalDependencies:
     fsevents "^1.2.7"
 
-chownr@^1.1.1:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142"
+chokidar@^3.4.0:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
+  integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
+  dependencies:
+    anymatch "~3.1.1"
+    braces "~3.0.2"
+    glob-parent "~5.1.0"
+    is-binary-path "~2.1.0"
+    is-glob "~4.0.1"
+    normalize-path "~3.0.0"
+    readdirp "~3.4.0"
+  optionalDependencies:
+    fsevents "~2.1.2"
+
+chownr@^1.0.1, chownr@^1.1.1:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+  integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
 
-chrome-trace-event@^1.0.0:
+chrome-trace-event@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4"
+  integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==
   dependencies:
     tslib "^1.9.0"
 
 ci-info@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+  integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
 
 cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+  integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==
   dependencies:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
+circular-json@^0.3.1:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+  integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
+
 class-utils@^0.3.5:
   version "0.3.6"
   resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+  integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
   dependencies:
     arr-union "^3.1.0"
     define-property "^0.2.5"
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
-classnames@^2.2.5:
+classificator@^0.3.3:
+  version "0.3.3"
+  resolved "https://registry.yarnpkg.com/classificator/-/classificator-0.3.3.tgz#b344cf1dfe90a292c4e507ed221aa72eff45b9d5"
+  integrity sha512-IXJYTuoxUdKENDjYZ9PqMr4lrwI6cp4JX4Og7XKkNwgvvogrroP97POpK2zvs3spm4Fg3TY0kcy4sKtBFSyb4g==
+  dependencies:
+    decimal.js "^10.0.0"
+
+classnames@^2.2.5, classnames@^2.2.6:
   version "2.2.6"
   resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
+  integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
 
 clean-css@4.2.x:
   version "4.2.3"
   resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
+  integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
   dependencies:
     source-map "~0.6.0"
 
@@ -2984,6 +3367,7 @@ clean-stack@^2.0.0:
 cli-cursor@^2.0.0, cli-cursor@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+  integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=
   dependencies:
     restore-cursor "^2.0.0"
 
@@ -2993,6 +3377,18 @@ cli-cursor@^3.1.0:
   dependencies:
     restore-cursor "^3.1.0"
 
+cli-highlight@2.1.4:
+  version "2.1.4"
+  resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz#098cb642cf17f42adc1c1145e07f960ec4d7522b"
+  integrity sha512-s7Zofobm20qriqDoU9sXptQx0t2R9PEgac92mENNm7xaEe1hn71IIMsXMK+6encA6WRCWWxIGQbipr3q998tlQ==
+  dependencies:
+    chalk "^3.0.0"
+    highlight.js "^9.6.0"
+    mz "^2.4.0"
+    parse5 "^5.1.1"
+    parse5-htmlparser2-tree-adapter "^5.1.1"
+    yargs "^15.0.0"
+
 cli-highlight@^1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-1.2.3.tgz#b200f97ed0e43d24633e89de0f489a48bb87d2bf"
@@ -3003,10 +3399,6 @@ cli-highlight@^1.2.3:
     parse5 "^3.0.3"
     yargs "^10.0.3"
 
-cli-spinners@^1.1.0:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
-
 cli-truncate@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574"
@@ -3015,8 +3407,9 @@ cli-truncate@^0.2.1:
     string-width "^1.0.1"
 
 cli-width@^2.0.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
+  integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
 
 cliui@^3.2.0:
   version "3.2.0"
@@ -3029,6 +3422,7 @@ cliui@^3.2.0:
 cliui@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49"
+  integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==
   dependencies:
     string-width "^2.1.1"
     strip-ansi "^4.0.0"
@@ -3037,6 +3431,7 @@ cliui@^4.0.0:
 cliui@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
+  integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
   dependencies:
     string-width "^3.1.0"
     strip-ansi "^5.2.0"
@@ -3050,6 +3445,11 @@ cliui@^6.0.0:
     strip-ansi "^6.0.0"
     wrap-ansi "^6.2.0"
 
+clone-buffer@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+  integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
+
 clone-deep@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
@@ -3058,25 +3458,24 @@ clone-deep@^4.0.1:
     kind-of "^6.0.2"
     shallow-clone "^3.0.0"
 
-clone@2.x, clone@^2.1.1:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
-
 clone@^1.0.2:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
 
-clones@^1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/clones/-/clones-1.2.0.tgz#b34c872045446a9f264ccceb7731bca05c529b71"
+clone@^2.1.1:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
+  integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
 
 co@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+  integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
 
 coa@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3"
+  integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==
   dependencies:
     "@types/q" "^1.5.1"
     chalk "^2.4.1"
@@ -3085,21 +3484,25 @@ coa@^2.0.2:
 code-point-at@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+  integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
 
 collapse-white-space@^1.0.2:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287"
+  integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==
 
 collection-visit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+  integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
   dependencies:
     map-visit "^1.0.0"
     object-visit "^1.0.0"
 
-color-convert@^1.9.0, color-convert@^1.9.1:
+color-convert@^1.9.0:
   version "1.9.3"
   resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+  integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
   dependencies:
     color-name "1.1.3"
 
@@ -3112,36 +3515,26 @@ color-convert@^2.0.1:
 color-name@1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+  integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
 
-color-name@^1.0.0, color-name@~1.1.4:
+color-name@~1.1.4:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
 
-color-string@^1.5.2:
-  version "1.5.3"
-  resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz#c9bbc5f01b58b5492f3d6857459cb6590ce204cc"
-  dependencies:
-    color-name "^1.0.0"
-    simple-swizzle "^0.2.2"
-
 color-support@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2"
-
-color@^3.0.0:
-  version "3.1.2"
-  resolved "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz#68148e7f85d41ad7649c5fa8c8106f098d229e10"
-  dependencies:
-    color-convert "^1.9.1"
-    color-string "^1.5.2"
+  integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==
 
 colors@1.0.x:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
+  integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=
 
 colors@^1.1.2:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
+  integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==
 
 columnify@1.5.4:
   version "1.5.4"
@@ -3150,31 +3543,31 @@ columnify@1.5.4:
     strip-ansi "^3.0.0"
     wcwidth "^1.0.0"
 
-combined-stream@^1.0.6, combined-stream@~1.0.6:
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
   dependencies:
     delayed-stream "~1.0.0"
 
-command-exists@^1.2.6:
-  version "1.2.8"
-  resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291"
-
-commander@2, commander@^2.11.0, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
+commander@2, commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.3:
   version "2.20.3"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
 
 commander@2.17.x:
   version "2.17.1"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+  integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
 
-commander@2.20.0:
-  version "2.20.0"
-  resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
-
-commander@~2.19.0:
+commander@2.19.0, commander@~2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
+  integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
+
+commander@5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
+  integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==
 
 common-tags@^1.4.0:
   version "1.8.0"
@@ -3183,6 +3576,7 @@ common-tags@^1.4.0:
 commondir@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+  integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=
 
 compare-func@^1.3.1:
   version "1.3.2"
@@ -3194,16 +3588,19 @@ compare-func@^1.3.1:
 component-emitter@^1.2.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+  integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
 
 compressible@~2.0.16:
   version "2.0.18"
   resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
+  integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
   dependencies:
     mime-db ">= 1.43.0 < 2"
 
 compression@^1.7.4:
   version "1.7.4"
   resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f"
+  integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
   dependencies:
     accepts "~1.3.5"
     bytes "3.0.0"
@@ -3216,8 +3613,9 @@ compression@^1.7.4:
 concat-map@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+  integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
 
-concat-stream@^1.5.0, concat-stream@~1.6.0:
+concat-stream@^1.5.0:
   version "1.6.2"
   resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
   dependencies:
@@ -3235,9 +3633,19 @@ concat-stream@^2.0.0:
     readable-stream "^3.0.2"
     typedarray "^0.0.6"
 
+condense-newlines@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/condense-newlines/-/condense-newlines-0.2.1.tgz#3de985553139475d32502c83b02f60684d24c55f"
+  integrity sha1-PemFVTE5R10yUCyDsC9gaE0kxV8=
+  dependencies:
+    extend-shallow "^2.0.1"
+    is-whitespace "^0.3.0"
+    kind-of "^3.0.2"
+
 config-chain@^1.1.12:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
+  integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==
   dependencies:
     ini "^1.3.4"
     proto-list "~1.2.1"
@@ -3245,10 +3653,12 @@ config-chain@^1.1.12:
 connect-history-api-fallback@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc"
+  integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==
 
 console-browserify@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336"
+  integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==
 
 console-control-strings@^1.0.0, console-control-strings@~1.1.0:
   version "1.1.0"
@@ -3257,16 +3667,19 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
 constants-browserify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+  integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
 
 content-disposition@0.5.3:
   version "0.5.3"
   resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
+  integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
   dependencies:
     safe-buffer "5.1.2"
 
 content-type@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+  integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
 
 conventional-changelog-angular@^5.0.6:
   version "5.0.6"
@@ -3416,7 +3829,7 @@ conventional-recommended-bump@6.0.5:
     meow "^5.0.0"
     q "^1.5.1"
 
-convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
   dependencies:
@@ -3425,14 +3838,22 @@ convert-source-map@^1.1.0, convert-source-map@^1.4.0, convert-source-map@^1.5.1,
 cookie-signature@1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
+cookie@0.3.1:
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+  integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
 
 cookie@0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+  integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
 
 copy-concurrently@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+  integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==
   dependencies:
     aproba "^1.1.1"
     fs-write-stream-atomic "^1.0.8"
@@ -3444,43 +3865,62 @@ copy-concurrently@^1.0.0:
 copy-descriptor@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+  integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-copy-webpack-plugin@5.0.3:
-  version "5.0.3"
-  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.3.tgz#2179e3c8fd69f13afe74da338896f1f01a875b5c"
+copy-webpack-plugin@4.6.0:
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
+  integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
   dependencies:
-    cacache "^11.3.2"
-    find-cache-dir "^2.1.0"
-    glob-parent "^3.1.0"
+    cacache "^10.0.4"
+    find-cache-dir "^1.0.0"
     globby "^7.1.1"
-    is-glob "^4.0.1"
-    loader-utils "^1.2.3"
+    is-glob "^4.0.0"
+    loader-utils "^1.1.0"
     minimatch "^3.0.4"
-    normalize-path "^3.0.0"
-    p-limit "^2.2.0"
-    schema-utils "^1.0.0"
-    serialize-javascript "^1.7.0"
-    webpack-log "^2.0.0"
+    p-limit "^1.0.0"
+    serialize-javascript "^1.4.0"
+
+core-js-pure@^3.0.0:
+  version "3.6.5"
+  resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813"
+  integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==
 
 core-js@^1.0.0:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636"
 
-core-js@^2.4.0, core-js@^2.5.0:
+core-js@^2.4.0, core-js@^2.6.5:
   version "2.6.11"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
+  integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
 
 core-js@^3.1.4:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.5.0.tgz#66df8e49be4bd775e6f952a9d083b756ad41c1ed"
 
+core-js@^3.6.5:
+  version "3.6.5"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a"
+  integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+  integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+cors@^2.8.5:
+  version "2.8.5"
+  resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
+  integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
+  dependencies:
+    object-assign "^4"
+    vary "^1"
 
 cosmiconfig@^5.0.0, cosmiconfig@^5.2.1:
   version "5.2.1"
   resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a"
+  integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==
   dependencies:
     import-fresh "^2.0.0"
     is-directory "^0.3.1"
@@ -3503,16 +3943,15 @@ cozy-app-publish@^0.22.3:
     tar "4.4.13"
 
 cozy-bar@^7.7.10:
-  version "7.12.2"
-  resolved "https://registry.yarnpkg.com/cozy-bar/-/cozy-bar-7.12.2.tgz#0c7ef8836c0c8745497838f515d8e61c25407e6f"
+  version "7.15.1"
+  resolved "https://registry.yarnpkg.com/cozy-bar/-/cozy-bar-7.15.1.tgz#ecebda03be52b960827236e1151356decaf08d14"
+  integrity sha512-sTfI9FZ2IiJq04ZRfglVJD8R4iDAlbAK+HjAiVp3K9k0v4lr6HkBe2v5+2umExsnlbQoFjRGZiC30kpqvmzs2Q==
   dependencies:
-    "@babel/core" "7.6.2"
-    babel-core "7.0.0-bridge.0"
-    babel-preset-cozy-app "1.7.0"
+    cozy-client "13.8.3"
     cozy-device-helper "1.8.0"
     cozy-interapp "0.4.9"
     cozy-realtime "3.2.1"
-    cozy-ui "22.3.1"
+    cozy-ui "35.22.0"
     enzyme-to-json "3.3.5"
     hammerjs "2.0.8"
     lerna-changelog "0.8.2"
@@ -3520,7 +3959,6 @@ cozy-bar@^7.7.10:
     lodash.debounce "4.0.8"
     lodash.unionwith "4.6.0"
     minilog "https://github.com/cozy/minilog.git#master"
-    parcel "1.12.3"
     piwik-react-router "0.12.1"
     prop-types "15.7.2"
     react-autosuggest "9.4.3"
@@ -3530,56 +3968,189 @@ cozy-bar@^7.7.10:
     redux-thunk "2.3.0"
     semver-compare "^1.0.0"
 
-cozy-client@6.49.0:
-  version "6.49.0"
-  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-6.49.0.tgz#4c1c52e121ead5f91e45de35d32cdd351c8565b6"
-  dependencies:
-    cozy-device-helper "1.6.3"
-    cozy-stack-client "^6.49.0"
-    lodash "4.17.11"
-    microee "0.0.6"
-    prop-types "15.6.2"
-    react "16.7.0"
-    react-redux "5.0.7"
-    redux "3.7.2"
-    redux-thunk "2.3.0"
-    sift "6.0.0"
-    url-search-params-polyfill "^6.0.0"
-
-cozy-device-helper@1.6.3:
-  version "1.6.3"
-  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.6.3.tgz#186cf0682921fa3ec7c2343d94fb84f317c992ba"
+cozy-bi-auth@0.0.11:
+  version "0.0.11"
+  resolved "https://registry.yarnpkg.com/cozy-bi-auth/-/cozy-bi-auth-0.0.11.tgz#95e8229fef454f25a8166baff8736b786df29814"
+  integrity sha512-HJTWaEsGqvNcSviazNqER7IkwXFzb4BayYo1dCuOOu1/lSe29MER+DuTc84MPwKTgoQsdmVUhKJIpQBBX/7L8g==
   dependencies:
-    lodash "4.17.11"
+    cozy-logger "^1.3.0"
+    lodash "^4.17.20"
+    node-jose "^1.1.4"
 
-cozy-device-helper@1.8.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.8.0.tgz#17b41d0ea28a504b906669a43449952e72615abb"
+cozy-client-js@^0.17.3:
+  version "0.17.3"
+  resolved "https://registry.yarnpkg.com/cozy-client-js/-/cozy-client-js-0.17.3.tgz#88dc6db1d9f7d092c30fe0e23c38a3374016b5f1"
+  integrity sha512-+uIdMID7xWckNN1E8PFJXnkD0vYl4lsIoHMaTJBffRa32xVGyLkdBfNa3HZH1myM6q6TCO/9iHuv10tGtgB3Hg==
   dependencies:
-    lodash "4.17.15"
+    core-js "^3.6.5"
+    isomorphic-fetch "^2.2.1"
+    pouchdb-browser "7.0.0"
+    pouchdb-find "7.0.0"
 
-cozy-doctypes@^1.72.0:
-  version "1.72.0"
-  resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.72.0.tgz#42f9a5823b37c181ef60f949532ba70066c4cedb"
+cozy-client@13.15.0:
+  version "13.15.0"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-13.15.0.tgz#866936300e0daf77863e036b9b75300c16a2b679"
+  integrity sha512-iqS/LP4R0UBKy3BizIDRtPRFoAtAMKo+f0AkUBCITSLYzgozIwvSEFpVcsqxuOklzpioPUsFhtqyuQs/R69P8A==
   dependencies:
-    "@babel/runtime" "7.5.5"
+    btoa "^1.2.1"
+    cozy-device-helper "^1.7.3"
     cozy-logger "^1.6.0"
-    date-fns "1.30.1"
-    es6-promise-pool "2.5.0"
-    lodash "4.17.15"
+    cozy-stack-client "^13.12.1"
+    isomorphic-fetch "^2.2.1"
+    lodash "^4.17.13"
+    microee "^0.0.6"
+    minilog "https://github.com/cozy/minilog.git#master"
+    open "^7.0.2"
+    prop-types "^15.6.2"
+    react-redux "^7.2.0"
+    redux "^3.7.2"
+    redux-thunk "^2.3.0"
+    server-destroy "^1.0.1"
+    sift "^6.0.0"
+    url-search-params-polyfill "^7.0.0"
+
+cozy-client@13.18.0:
+  version "13.18.0"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-13.18.0.tgz#5ba2d3f5654f4c6d12b9c3bd02a46fe66300c68a"
+  integrity sha512-TTszkhc006zJKY27Np/J1Pd/FZKcVoeMbg2I1CbARbYjHiTJQXwjlVUGpTuMvihXroSDjc++IJ1Tn9XHAbScvQ==
+  dependencies:
+    btoa "^1.2.1"
+    cozy-device-helper "^1.7.3"
+    cozy-logger "^1.6.0"
+    cozy-stack-client "^13.16.0"
+    isomorphic-fetch "^2.2.1"
+    lodash "^4.17.13"
+    microee "^0.0.6"
+    minilog "https://github.com/cozy/minilog.git#master"
+    open "^7.0.2"
+    prop-types "^15.6.2"
+    react-redux "^7.2.0"
+    redux "^3.7.2"
+    redux-thunk "^2.3.0"
+    server-destroy "^1.0.1"
+    sift "^6.0.0"
+    url-search-params-polyfill "^7.0.0"
+
+cozy-client@13.8.3:
+  version "13.8.3"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-13.8.3.tgz#0bf27284fd2b7708a3ea37fc77e3d58fc923f3db"
+  integrity sha512-SLipjE0rh5YLQBuvOi8yeXTcQeuvdfzJD5B/TTlwgOsWcvJuLh5yazOLtL8A0oRty8SsCWWZe/SbGqVlI7Ue6Q==
+  dependencies:
+    btoa "^1.2.1"
+    cozy-device-helper "^1.7.3"
+    cozy-logger "^1.6.0"
+    cozy-stack-client "^13.8.3"
+    isomorphic-fetch "^2.2.1"
+    lodash "^4.17.13"
+    microee "^0.0.6"
+    minilog "https://github.com/cozy/minilog.git#master"
+    open "^7.0.2"
+    prop-types "^15.6.2"
+    react-redux "^7.2.0"
+    redux "^3.7.2"
+    redux-thunk "^2.3.0"
+    server-destroy "^1.0.1"
+    sift "^6.0.0"
+    url-search-params-polyfill "^7.0.0"
+
+cozy-client@^13.13.0:
+  version "13.21.0"
+  resolved "https://registry.yarnpkg.com/cozy-client/-/cozy-client-13.21.0.tgz#931e3056c933d0760567c734641e3c830381328d"
+  integrity sha512-Rv0Uv7iJdyRDCjFqOj0O1wUlwtCdrWv4QPHqu9uRlltsGuAIXi/bPaFFT3xB6YucdjnPwcd8hjLgCoAGWWbw+A==
+  dependencies:
+    btoa "^1.2.1"
+    cozy-device-helper "^1.7.3"
+    cozy-logger "^1.6.0"
+    cozy-stack-client "^13.20.2"
+    isomorphic-fetch "^2.2.1"
+    lodash "^4.17.13"
+    microee "^0.0.6"
+    minilog "https://github.com/cozy/minilog.git#master"
+    open "^7.0.2"
+    prop-types "^15.6.2"
+    react-redux "^7.2.0"
+    redux "^3.7.2"
+    redux-thunk "^2.3.0"
+    server-destroy "^1.0.1"
+    sift "^6.0.0"
+    url-search-params-polyfill "^7.0.0"
+
+cozy-device-helper@1.8.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.8.0.tgz#17b41d0ea28a504b906669a43449952e72615abb"
+  dependencies:
+    lodash "4.17.15"
+
+cozy-device-helper@^1.10.2:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.10.2.tgz#f744ce65c76d1e5a95e30bf6c08bcc6d9d772f37"
+  integrity sha512-KebAmQZmL9xI500ncXXt8c1m89rhu8qLpNLV7FgyPHmqN8RIodw8taZb/E4bEk0ZkwDfNIsEU10MLSDXi4uAPg==
+  dependencies:
+    lodash "4.17.19"
+
+cozy-device-helper@^1.7.3:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.10.0.tgz#86c102d32b012f648dbce36cc6031d3895ee95a2"
+  integrity sha512-0yqxsgBVlKNs4sI4j1x4Pi5JVsXOh4yf/8aS+KTGZjXHvMcDP1tfUlkWw3JmkWR9qihcBlkaE16TpGxdfsiNSA==
+  dependencies:
+    lodash "4.17.19"
+
+cozy-device-helper@^1.7.5:
+  version "1.10.1"
+  resolved "https://registry.yarnpkg.com/cozy-device-helper/-/cozy-device-helper-1.10.1.tgz#91ec60d67248489738b2daaafe83db8f6a6e1e9f"
+  integrity sha512-BrjZNK5JDQwnihRDV4ZBUj3JbNuGD08m3OS8FkA9yUnBf6vOJZABG3tYyAVLNEIo8gZaMt+XCPwmqfzPqgPXNQ==
+  dependencies:
+    lodash "4.17.19"
+
+cozy-doctypes@^1.73.0:
+  version "1.74.4"
+  resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.74.4.tgz#658f8ce8086b0b59130ed6dc431d097c52d79cdf"
+  integrity sha512-+XC2SyJYIhHAduEvQ9vbkf2UNZJbzRXkDMlj7473zcfBm4G0vKFUqjkbz/uoQchdvksjuiJxSCcC9yNLFg6CnA==
+  dependencies:
+    "@babel/runtime" "7.5.5"
+    cozy-logger "^1.6.0"
+    date-fns "1.30.1"
+    es6-promise-pool "2.5.0"
+    lodash "4.17.19"
+    prop-types "^15.7.2"
+
+cozy-doctypes@^1.74.6:
+  version "1.74.6"
+  resolved "https://registry.yarnpkg.com/cozy-doctypes/-/cozy-doctypes-1.74.6.tgz#e4bcfd5d570dddd74af84b15e3b39aeceb3e9671"
+  integrity sha512-EEGVfLoFoyPEWTloJUuRjGx3mihCkTUftjuS4efegqFMg0GsN58kVx1Lvq/tDgW0WWlcxodIfN2NNW5I1pa6yw==
+  dependencies:
+    "@babel/runtime" "7.5.5"
+    cozy-logger "^1.6.0"
+    date-fns "1.30.1"
+    es6-promise-pool "2.5.0"
+    lodash "4.17.19"
     prop-types "^15.7.2"
 
-cozy-harvest-lib@^1.15.3:
-  version "1.17.3"
-  resolved "https://registry.yarnpkg.com/cozy-harvest-lib/-/cozy-harvest-lib-1.17.3.tgz#5fc8514830fc8110b8e18344bcc7a4fbecd67901"
+cozy-flags@^2.3.4:
+  version "2.3.4"
+  resolved "https://registry.yarnpkg.com/cozy-flags/-/cozy-flags-2.3.4.tgz#a2175fd711529e93175029e0d20e376142035546"
+  integrity sha512-JE8oFfHCeZsHTp9L0xEYtEtNwfTl2Ik3Hr7YaFsjd3H/6YYucNchVNp8FlmEIe3cyA1DWhv/jw/oSTYuSnSo9A==
+  dependencies:
+    microee "^0.0.6"
+
+cozy-harvest-lib@2.16.0:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/cozy-harvest-lib/-/cozy-harvest-lib-2.16.0.tgz#eb255e0170d6af7f4955e895815853c878d4fda4"
+  integrity sha512-2bSJHXJOiKdAg30pyyW2V+34jNeyI3aPXA+Da6ywdY33EVd9+nQg2kr8Q4fg+4J2kzXdrkS+h4nXYuI+vL9uSQ==
   dependencies:
     "@babel/runtime" "^7.5.2"
     "@material-ui/core" "3"
-    cozy-doctypes "^1.72.0"
+    "@testing-library/react" "^10.4.9"
+    cozy-bi-auth "0.0.11"
+    cozy-doctypes "^1.74.6"
+    cozy-flags "^2.3.4"
+    cozy-keys-lib "3.1.2"
+    cozy-logger "1.6.0"
     date-fns "^1.30.1"
     final-form "4.18.5"
-    lodash "4.17.15"
+    lodash "4.17.19"
     microee "^0.0.6"
+    minilog "https://github.com/cozy/minilog.git#master"
     node-polyglot "^2.4.0"
     react-final-form "3.7.0"
     react-markdown "4.2.2"
@@ -3590,82 +4161,176 @@ cozy-interapp@0.4.9:
   version "0.4.9"
   resolved "https://registry.yarnpkg.com/cozy-interapp/-/cozy-interapp-0.4.9.tgz#5ef68d54755cc99c3e154e5a4646b68cbe5f16fd"
 
-cozy-logger@^1.6.0:
+cozy-interapp@0.5.4:
+  version "0.5.4"
+  resolved "https://registry.yarnpkg.com/cozy-interapp/-/cozy-interapp-0.5.4.tgz#2573f1800f073c84c289267d04234954d88eae0c"
+  integrity sha512-f0UaKpBkRUnIKgAWND0e1IwfTTINjizlgDmfQwX3aMyWp8t9wX0xkNFn53TSyKUoBUnfovrclS3hm9fngjEp7A==
+
+cozy-jobs-cli@^1.13.6:
+  version "1.13.6"
+  resolved "https://registry.yarnpkg.com/cozy-jobs-cli/-/cozy-jobs-cli-1.13.6.tgz#04f0e28d260da51ee02fccce1da6f9353a446f46"
+  integrity sha512-m72cmJx80rgcO+v90Xud2R84G5hnHhAJIzSZZTynw0DuxMWShLkv1DzOmk99Ht6lCVJKZLReNzjvRzvh7DNi+g==
+  dependencies:
+    "@pollyjs/adapter-node-http" "5.0.0"
+    "@pollyjs/core" "5.0.0"
+    "@pollyjs/persister-fs" "5.0.0"
+    babel-runtime "6.26.0"
+    cheerio "1.0.0-rc.3"
+    cli-highlight "2.1.4"
+    commander "5.1.0"
+    cozy-client "13.15.0"
+    cozy-konnector-libs "^4.34.5"
+    cozy-logger "1.6.0"
+    open "7.0.4"
+    pretty "2.0.0"
+    strip-json-comments "3.1.1"
+
+cozy-keys-lib@3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/cozy-keys-lib/-/cozy-keys-lib-3.1.2.tgz#524b4360d8e6008c3f234aeb9bd9730f1d2276fc"
+  integrity sha512-AgCO7otBoUvNs5lYWZquXm/YItM3Go+WseeFx99e6KuYs4219cSlEjzNyHgIGythfXRiBlQjWVuZaK4t/yvaPQ==
+  dependencies:
+    "@aspnet/signalr" "^1.1.4"
+    "@aspnet/signalr-protocol-msgpack" "^1.1.0"
+    big-integer "^1.6.44"
+    classnames "^2.2.6"
+    cozy-device-helper "^1.7.5"
+    lodash "^4.17.15"
+    lunr "^2.3.6"
+    microee "^0.0.6"
+    minilog "https://github.com/cozy/minilog.git#master"
+    node-forge "^0.9.0"
+    papaparse "^5.1.1"
+    prop-types "^15.7.2"
+    sweetalert "^2.1.2"
+    tldjs "^2.3.1"
+    zxcvbn "^4.4.2"
+
+cozy-konnector-libs@^4.34.5:
+  version "4.34.5"
+  resolved "https://registry.yarnpkg.com/cozy-konnector-libs/-/cozy-konnector-libs-4.34.5.tgz#6d2b2a02623a54bd916cc6aade25402c60d895c5"
+  integrity sha512-IggQ7203RtLvu2fTvp21+du9Soo1LytGLXSP5K1xLqVagaeJ2NTYaMJx2mtJmu+vOaZOelCovYMprz0ZHwNEhw==
+  dependencies:
+    babel-runtime "^6.26.0"
+    bluebird "^3.7.2"
+    bluebird-retry "^0.11.0"
+    btoa "1.2.1"
+    cheerio "^1.0.0-rc.3"
+    classificator "^0.3.3"
+    cozy-client "^13.13.0"
+    cozy-client-js "^0.17.3"
+    cozy-doctypes "^1.73.0"
+    cozy-logger "^1.6.0"
+    date-fns "^2.14.0"
+    file-type "^14.6.2"
+    geco "^0.11.1"
+    lodash-id "^0.14.0"
+    lowdb "^1.0.0"
+    mime-types "^2.1.27"
+    raven "^2.6.4"
+    raw-body "^2.4.1"
+    request "^2.88.2"
+    request-debug "^0.2.0"
+    request-promise "^4.2.5"
+    strip-json-comments "^3.1.1"
+
+cozy-logger@1.6.0, cozy-logger@^1.3.0, cozy-logger@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/cozy-logger/-/cozy-logger-1.6.0.tgz#51675e081e0a40baae6c38c64718cfaee5ee66ff"
   dependencies:
     chalk "^2.4.2"
     json-stringify-safe "5.0.1"
 
+cozy-realtime@3.10.5:
+  version "3.10.5"
+  resolved "https://registry.yarnpkg.com/cozy-realtime/-/cozy-realtime-3.10.5.tgz#aa040bd921a0f83fd0452092d050ee201e090bff"
+  integrity sha512-PISZsNkXzTWwYAbLTjQn1tIi0iVwEAEZQTVNS2eDu46a8EtIGBje8QM/GQoFZdoIi0wtgciW5VvQUEuP/wY+xQ==
+  dependencies:
+    cozy-device-helper "^1.10.2"
+    minilog "https://github.com/cozy/minilog.git#master"
+
 cozy-realtime@3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/cozy-realtime/-/cozy-realtime-3.2.1.tgz#b22cb9468566ae691edfa0383efbab3071a2f01e"
   dependencies:
     minilog "3.1.0"
 
-cozy-scripts@2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-2.0.2.tgz#a8c7765bae64dee88eff9e5b132960bf94353748"
+cozy-scripts@4.3.3:
+  version "4.3.3"
+  resolved "https://registry.yarnpkg.com/cozy-scripts/-/cozy-scripts-4.3.3.tgz#1175db43eb558a63b907b65864913ae34bc99b7d"
+  integrity sha512-EI+ti3IJnSZxCNXWl6RTSv+6TWYqeXLOn00CZLxkrALRc0jzGzswmBk49dxuWRyCMVeEPFhvBZCbitjg0s3UVg==
   dependencies:
-    "@babel/core" "7.5.4"
-    autoprefixer "9.6.1"
+    "@babel/core" "7.9.0"
+    "@babel/polyfill" "^7.10.4"
+    autoprefixer "9.7.6"
     babel-core "7.0.0-bridge.0"
-    babel-eslint "10.0.2"
-    babel-jest "24.8.0"
-    babel-loader "8.0.6"
-    babel-polyfill "6.26.0"
-    browserslist-config-cozy "0.2.0"
-    chalk "2.4.2"
-    commander "2.20.0"
-    copy-webpack-plugin "5.0.3"
+    babel-eslint "10.1.0"
+    babel-jest "24.9.0"
+    babel-loader "8.1.0"
+    babel-preset-cozy-app "^1.9.0"
+    chalk "3"
+    commander "2.19.0"
+    copy-webpack-plugin "4.6.0"
     cross-spawn "6.0.5"
-    css-loader "3.0.0"
+    css-loader "2.1.0"
     css-mqpacker "7.0.0"
     csswring "7.0.0"
-    eslint "6.0.1"
-    eslint-config-cozy-app "1.1.12"
-    eslint-loader "2.2.1"
+    eslint "5.9.0"
+    eslint-config-cozy-app "1.5.0"
+    eslint-loader "2.1.2"
+    eslint-plugin-prettier "3.1.2"
+    eslint-plugin-react "7.19.0"
+    eslint-plugin-react-hooks "4.0.4"
     expose-loader "0.7.5"
-    file-loader "4.0.0"
-    fs-extra "8.1.0"
-    html-webpack-include-assets-plugin "1.0.10"
+    file-loader "3.0.1"
+    fs-extra "7.0.1"
+    html-webpack-include-assets-plugin "1.0.7"
     html-webpack-plugin "3.2.0"
     identity-obj-proxy "3.0.0"
-    jest "24.8.0"
+    imports-loader "0.8.0"
+    jest "24.9.0"
     json-loader "0.5.7"
-    mini-css-extract-plugin "0.7.0"
+    mini-css-extract-plugin "0.5.0"
     postcss "7.0.17"
     postcss-assets-webpack-plugin "3.0.0"
     postcss-discard-duplicates "4.0.2"
     postcss-discard-empty "4.0.1"
     postcss-loader "3.0.0"
     prompt "1.0.0"
-    react "16.8.6"
-    react-dom "16.8.6"
-    speed-measure-webpack-plugin "1.3.1"
+    script-ext-html-webpack-plugin "2.1.3"
     style-loader "0.23.1"
-    stylus "0.54.5"
+    stylus "0.54.7"
     stylus-loader "3.0.2"
-    svg-sprite-loader "4.1.6"
-    svgo "1.2.2"
+    svg-sprite-loader "4.2.3"
+    svgo "1.3.2"
     validate-npm-package-name "3.0.0"
-    vue-jest "3.0.4"
-    webpack "4.35.3"
-    webpack-bundle-analyzer "3.3.2"
-    webpack-dev-server "3.7.2"
-    webpack-merge "4.2.1"
+    webpack "4.42.1"
+    webpack-bundle-analyzer "3.6.1"
+    webpack-dev-server "3.10.3"
+    webpack-merge "4.2.2"
+
+cozy-stack-client@^13.12.1, cozy-stack-client@^13.20.2, cozy-stack-client@^13.8.3:
+  version "13.20.2"
+  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-13.20.2.tgz#2ff55f93dca809b7ec82ec0afc88a3bc041383c1"
+  integrity sha512-9j52p+0/kw5CAO42hPCqjV1ESwU/My79bfjF96wZRrGMFAciL+gGQy4wVeTpPlYvWIGIIbchFrUl8rQVkMVWYA==
+  dependencies:
+    detect-node "^2.0.4"
+    mime "^2.4.0"
+    qs "^6.7.0"
 
-cozy-stack-client@^6.49.0:
-  version "6.66.0"
-  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-6.66.0.tgz#ba217c2d615dd31a9f40ae131644c68c4108b101"
+cozy-stack-client@^13.16.0:
+  version "13.16.0"
+  resolved "https://registry.yarnpkg.com/cozy-stack-client/-/cozy-stack-client-13.16.0.tgz#e4e7043df34132dc6c1578b030d823e994a7e210"
+  integrity sha512-pAzBsB5pFL0wyccquLK4Hgw5uayMhoAVKJOThU+u+vYFpnYlNEZQ+iY9eFFOpQa47dWy0vTkmI0N0wk5chN/2g==
   dependencies:
     detect-node "^2.0.4"
     mime "^2.4.0"
     qs "^6.7.0"
 
-cozy-ui@21.7.0:
-  version "21.7.0"
-  resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-21.7.0.tgz#fb4c0b9d21504c14ce6a7aafcaf90c8ca74e91d5"
+cozy-ui@35.22.0:
+  version "35.22.0"
+  resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-35.22.0.tgz#ce8e1703740a27073b3cff812f9a7027d3a27e41"
+  integrity sha512-oAP+EIgS4D2J2Y7CiRNPbR9jCFrDrkiLIfpQeWkTjFbGXiCkJTdQabAx7fiZdcI0gxCo9OCv7mhtirMHv/ylKw==
   dependencies:
     "@babel/runtime" "^7.3.4"
     body-scroll-lock "^2.5.8"
@@ -3678,26 +4343,34 @@ cozy-ui@21.7.0:
     react-markdown "^4.0.8"
     react-pdf "^4.0.5"
     react-select "2.2.0"
+    react-swipeable-views "0.13.3"
 
-cozy-ui@22.3.1:
-  version "22.3.1"
-  resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-22.3.1.tgz#9bd22099255e88ab2a9694a8b18d21cde3f627f5"
+cozy-ui@35.45.0:
+  version "35.45.0"
+  resolved "https://registry.yarnpkg.com/cozy-ui/-/cozy-ui-35.45.0.tgz#0af7c9002f99e2d1b40bd92823d35572ecbd1b8f"
+  integrity sha512-Ltce5GpPe/F9hd+lNV9QvdsEH98SLTIa5cdCtwwyXyBGdBnd16BIcjiaZgAblDcqk0EuY6qYKFhhkdn0pmDV4g==
   dependencies:
     "@babel/runtime" "^7.3.4"
+    "@popperjs/core" "^2.4.4"
     body-scroll-lock "^2.5.8"
     classnames "^2.2.5"
+    cozy-interapp "0.5.4"
     date-fns "^1.28.5"
     hammerjs "^2.0.8"
+    intersection-observer "0.11.0"
     node-polyglot "^2.2.2"
     normalize.css "^7.0.0"
     react-hot-loader "^4.3.11"
     react-markdown "^4.0.8"
     react-pdf "^4.0.5"
+    react-popper "^2.2.3"
     react-select "2.2.0"
+    react-swipeable-views "0.13.3"
 
 create-ecdh@^4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+  integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==
   dependencies:
     bn.js "^4.1.0"
     elliptic "^6.0.0"
@@ -3705,15 +4378,17 @@ create-ecdh@^4.0.0:
 create-emotion@^10.0.4:
   version "10.0.27"
   resolved "https://registry.yarnpkg.com/create-emotion/-/create-emotion-10.0.27.tgz#cb4fa2db750f6ca6f9a001a33fbf1f6c46789503"
+  integrity sha512-fIK73w82HPPn/RsAij7+Zt8eCE8SptcJ3WoRMfxMtjteYxud8GDTKKld7MYwAX2TVhrw29uR1N/bVGxeStHILg==
   dependencies:
     "@emotion/cache" "^10.0.27"
     "@emotion/serialize" "^0.11.15"
     "@emotion/sheet" "0.9.4"
     "@emotion/utils" "0.11.3"
 
-create-hash@^1.1.0, create-hash@^1.1.2:
+create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+  integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==
   dependencies:
     cipher-base "^1.0.1"
     inherits "^2.0.1"
@@ -3721,9 +4396,10 @@ create-hash@^1.1.0, create-hash@^1.1.2:
     ripemd160 "^2.0.1"
     sha.js "^2.4.0"
 
-create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+  integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==
   dependencies:
     cipher-base "^1.0.3"
     create-hash "^1.1.0"
@@ -3732,7 +4408,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
-cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.4, cross-spawn@^6.0.5:
+cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5:
   version "6.0.5"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
   dependencies:
@@ -3765,9 +4441,15 @@ cross-spawn@^7.0.0:
     shebang-command "^2.0.0"
     which "^2.0.1"
 
+crypt@0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b"
+  integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=
+
 crypto-browserify@^3.11.0:
   version "3.12.0"
   resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+  integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==
   dependencies:
     browserify-cipher "^1.0.0"
     browserify-sign "^4.0.0"
@@ -3781,59 +4463,41 @@ crypto-browserify@^3.11.0:
     randombytes "^2.0.0"
     randomfill "^1.0.3"
 
-css-color-names@0.0.4, css-color-names@^0.0.4:
-  version "0.0.4"
-  resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
-
-css-declaration-sorter@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22"
-  dependencies:
-    postcss "^7.0.1"
-    timsort "^0.3.0"
-
-css-loader@3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.0.0.tgz#bdd48a4921eefedf1f0a55266585944d4e5efc63"
+css-loader@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-2.1.0.tgz#42952ac22bca5d076978638e9813abce49b8f0cc"
+  integrity sha512-MoOu+CStsGrSt5K2OeZ89q3Snf+IkxRfAIt9aAKg4piioTrhtP1iEFPu+OVn3Ohz24FO6L+rw9UJxBILiSBw5Q==
   dependencies:
-    camelcase "^5.3.1"
-    cssesc "^3.0.0"
-    icss-utils "^4.1.1"
-    loader-utils "^1.2.3"
-    normalize-path "^3.0.0"
-    postcss "^7.0.17"
+    icss-utils "^4.0.0"
+    loader-utils "^1.2.1"
+    lodash "^4.17.11"
+    postcss "^7.0.6"
     postcss-modules-extract-imports "^2.0.0"
-    postcss-modules-local-by-default "^3.0.2"
-    postcss-modules-scope "^2.1.0"
-    postcss-modules-values "^3.0.0"
-    postcss-value-parser "^4.0.0"
+    postcss-modules-local-by-default "^2.0.3"
+    postcss-modules-scope "^2.0.0"
+    postcss-modules-values "^2.0.0"
+    postcss-value-parser "^3.3.0"
     schema-utils "^1.0.0"
 
-css-modules-loader-core@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16"
-  dependencies:
-    icss-replace-symbols "1.1.0"
-    postcss "6.0.1"
-    postcss-modules-extract-imports "1.1.0"
-    postcss-modules-local-by-default "1.2.0"
-    postcss-modules-scope "1.1.0"
-    postcss-modules-values "1.3.0"
-
 css-mqpacker@7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/css-mqpacker/-/css-mqpacker-7.0.0.tgz#48f4a0ff45b81ec661c4a33ed80b9db8a026333b"
+  integrity sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA==
   dependencies:
     minimist "^1.2.0"
     postcss "^7.0.0"
 
-css-parse@1.7.x:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b"
+css-parse@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-2.0.0.tgz#a468ee667c16d81ccf05c58c38d2a97c780dbfd4"
+  integrity sha1-pGjuZnwW2BzPBcWMONKpfHgNv9Q=
+  dependencies:
+    css "^2.0.0"
 
 css-select-base-adapter@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7"
+  integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==
 
 css-select@^1.1.0, css-select@~1.2.0:
   version "1.2.0"
@@ -3847,34 +4511,13 @@ css-select@^1.1.0, css-select@~1.2.0:
 css-select@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef"
+  integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==
   dependencies:
     boolbase "^1.0.0"
     css-what "^3.2.1"
     domutils "^1.7.0"
     nth-check "^1.0.2"
 
-css-selector-tokenizer@^0.7.0:
-  version "0.7.1"
-  resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
-  dependencies:
-    cssesc "^0.1.0"
-    fastparse "^1.1.1"
-    regexpu-core "^1.0.0"
-
-css-tree@1.0.0-alpha.28:
-  version "1.0.0-alpha.28"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
-  dependencies:
-    mdn-data "~1.1.0"
-    source-map "^0.5.3"
-
-css-tree@1.0.0-alpha.29:
-  version "1.0.0-alpha.29"
-  resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
-  dependencies:
-    mdn-data "~1.1.0"
-    source-map "^0.5.3"
-
 css-tree@1.0.0-alpha.37:
   version "1.0.0-alpha.37"
   resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22"
@@ -3882,14 +4525,6 @@ css-tree@1.0.0-alpha.37:
     mdn-data "2.0.4"
     source-map "^0.6.1"
 
-css-unit-converter@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
-
-css-url-regex@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
-
 css-vendor@^0.3.8:
   version "0.3.8"
   resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-0.3.8.tgz#6421cfd3034ce664fe7673972fd0119fc28941fa"
@@ -3899,99 +4534,27 @@ css-vendor@^0.3.8:
 css-what@2.1:
   version "2.1.3"
   resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
+  integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
 
 css-what@^3.2.1:
-  version "3.2.1"
-  resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.2.1.tgz#f4a8f12421064621b456755e34a03a2c22df5da1"
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz#10fec696a9ece2e591ac772d759aacabac38cd39"
+  integrity sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==
 
-css@^2.1.0:
+css@^2.0.0:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/css/-/css-2.2.4.tgz#c646755c73971f2bba6a601e2cf2fd71b1298929"
+  integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
   dependencies:
     inherits "^2.0.3"
     source-map "^0.6.1"
     source-map-resolve "^0.5.2"
     urix "^0.1.0"
 
-cssesc@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
-
-cssesc@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703"
-
 cssesc@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
-
-cssnano-preset-default@^4.0.7:
-  version "4.0.7"
-  resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76"
-  dependencies:
-    css-declaration-sorter "^4.0.1"
-    cssnano-util-raw-cache "^4.0.1"
-    postcss "^7.0.0"
-    postcss-calc "^7.0.1"
-    postcss-colormin "^4.0.3"
-    postcss-convert-values "^4.0.1"
-    postcss-discard-comments "^4.0.2"
-    postcss-discard-duplicates "^4.0.2"
-    postcss-discard-empty "^4.0.1"
-    postcss-discard-overridden "^4.0.1"
-    postcss-merge-longhand "^4.0.11"
-    postcss-merge-rules "^4.0.3"
-    postcss-minify-font-values "^4.0.2"
-    postcss-minify-gradients "^4.0.2"
-    postcss-minify-params "^4.0.2"
-    postcss-minify-selectors "^4.0.2"
-    postcss-normalize-charset "^4.0.1"
-    postcss-normalize-display-values "^4.0.2"
-    postcss-normalize-positions "^4.0.2"
-    postcss-normalize-repeat-style "^4.0.2"
-    postcss-normalize-string "^4.0.2"
-    postcss-normalize-timing-functions "^4.0.2"
-    postcss-normalize-unicode "^4.0.1"
-    postcss-normalize-url "^4.0.1"
-    postcss-normalize-whitespace "^4.0.2"
-    postcss-ordered-values "^4.1.2"
-    postcss-reduce-initial "^4.0.3"
-    postcss-reduce-transforms "^4.0.2"
-    postcss-svgo "^4.0.2"
-    postcss-unique-selectors "^4.0.1"
-
-cssnano-util-get-arguments@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
-
-cssnano-util-get-match@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
-
-cssnano-util-raw-cache@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282"
-  dependencies:
-    postcss "^7.0.0"
-
-cssnano-util-same-parent@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3"
-
-cssnano@^4.0.0, cssnano@^4.1.10:
-  version "4.1.10"
-  resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2"
-  dependencies:
-    cosmiconfig "^5.0.0"
-    cssnano-preset-default "^4.0.7"
-    is-resolvable "^1.0.0"
-    postcss "^7.0.0"
-
-csso@^3.5.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
-  dependencies:
-    css-tree "1.0.0-alpha.29"
+  integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
 
 csso@^4.0.2:
   version "4.0.2"
@@ -3999,23 +4562,29 @@ csso@^4.0.2:
   dependencies:
     css-tree "1.0.0-alpha.37"
 
-cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0", cssom@^0.3.4:
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
   version "0.3.8"
   resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
 
-cssstyle@^1.0.0, cssstyle@^1.1.1:
+cssstyle@^1.0.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.4.0.tgz#9d31328229d3c565c61e586b02041a28fccdccf1"
   dependencies:
     cssom "0.3.x"
 
-csstype@^2.0.0, csstype@^2.2.0, csstype@^2.5.2, csstype@^2.5.7, csstype@^2.6.7:
+csstype@^2.0.0, csstype@^2.5.2, csstype@^2.6.7:
   version "2.6.8"
   resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.8.tgz#0fb6fc2417ffd2816a418c9336da74d7f07db431"
 
+csstype@^2.2.0, csstype@^2.5.7:
+  version "2.6.11"
+  resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.11.tgz#452f4d024149ecf260a852b025e36562a253ffc5"
+  integrity sha512-l8YyEC9NBkSm783PFTvh0FmJy7s5pFKrDp49ZL7zBGX3fWkO+N4EEyan1qqp8cwPLDcD0OSdyY6hAMoxp34JFw==
+
 csswring@7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/csswring/-/csswring-7.0.0.tgz#a5873f727ecedbb33900a864ee5d8ea7413333e8"
+  integrity sha512-yl9lWqdhVn4gD0Vf00BMKKFuLq19hpz87VTDBRYFa+xWjRdfa/+bddCsWN7mbwfXWFoL5RwDOJmKakkC/VaH7w==
   dependencies:
     minimist "^1.2.0"
     onecolor "^3.0.5"
@@ -4030,10 +4599,12 @@ currently-unhandled@^0.4.1:
 cycle@1.0.x:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
+  integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI=
 
 cyclist@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9"
+  integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=
 
 d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0:
   version "1.2.4"
@@ -4260,10 +4831,11 @@ dargs@^4.0.1:
 dashdash@^1.12.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+  integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
   dependencies:
     assert-plus "^1.0.0"
 
-data-urls@^1.0.0, data-urls@^1.1.0:
+data-urls@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-1.1.0.tgz#15ee0582baa5e22bb59c77140da8f9c76963bbfe"
   dependencies:
@@ -4274,46 +4846,47 @@ data-urls@^1.0.0, data-urls@^1.1.0:
 date-fns@1.30.1, date-fns@^1.27.2, date-fns@^1.28.5, date-fns@^1.30.1:
   version "1.30.1"
   resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
+  integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
+
+date-fns@^2.14.0:
+  version "2.16.0"
+  resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.16.0.tgz#d34f0f5f2fd498c984513042e8f7247ea86c4cb7"
+  integrity sha512-DWTRyfOA85sZ4IiXPHhiRIOs3fW5U6Msrp+gElXARa6EpoQTXPyHQmh7hr+ssw2nx9FtOQWnAMJKgL5vaJqILw==
 
 dateformat@^3.0.0:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
 
-deasync@^0.1.14:
-  version "0.1.19"
-  resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.19.tgz#e7ea89fcc9ad483367e8a48fe78f508ca86286e8"
-  dependencies:
-    bindings "^1.5.0"
-    node-addon-api "^1.7.1"
-
 debounce@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131"
 
-debug@*, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
-  dependencies:
-    ms "^2.1.1"
-
-debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8:
+debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+  integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
   dependencies:
     ms "2.0.0"
 
-debug@3.1.0, debug@=3.1.0:
+debug@3.1.0, debug@=3.1.0, debug@~3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
   dependencies:
     ms "2.0.0"
 
-debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5:
+debug@^3.1.0, debug@^3.1.1, debug@^3.2.5:
   version "3.2.6"
   resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
   dependencies:
     ms "^2.1.1"
 
+debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
+  version "4.1.1"
+  resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
+  integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
+  dependencies:
+    ms "^2.1.1"
+
 decamelize-keys@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9"
@@ -4325,9 +4898,15 @@ decamelize@^1.1.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"
 
+decimal.js@^10.0.0:
+  version "10.2.0"
+  resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.0.tgz#39466113a9e036111d02f82489b5fd6b0b5ed231"
+  integrity sha512-vDPw+rDgn3bZe1+F/pyEwb1oMG2XTlRVgAa6B4KccTEpYgF8w6eQllVbQcfIJnZyvzFtFpxnpGtx8dd7DJp/Rw==
+
 decode-uri-component@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+  integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
 
 dedent@^0.7.0:
   version "0.7.0"
@@ -4336,6 +4915,7 @@ dedent@^0.7.0:
 deep-equal@^1.0.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
+  integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
   dependencies:
     is-arguments "^1.0.4"
     is-date-object "^1.0.1"
@@ -4347,14 +4927,17 @@ deep-equal@^1.0.1:
 deep-equal@~0.2.1:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d"
+  integrity sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=
 
 deep-is@~0.1.3:
   version "0.1.3"
   resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+  integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
 
 deepmerge@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050"
+  integrity sha1-FmNpFinU2/42T6EqKk8KqGqjoFA=
 
 deepmerge@^3.0.0:
   version "3.3.0"
@@ -4363,6 +4946,7 @@ deepmerge@^3.0.0:
 default-gateway@^4.2.0:
   version "4.2.0"
   resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
+  integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==
   dependencies:
     execa "^1.0.0"
     ip-regex "^2.1.0"
@@ -4376,24 +4960,28 @@ defaults@^1.0.3:
 define-properties@^1.1.2, define-properties@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+  integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
   dependencies:
     object-keys "^1.0.12"
 
 define-property@^0.2.5:
   version "0.2.5"
   resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+  integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
   dependencies:
     is-descriptor "^0.1.0"
 
 define-property@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+  integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
   dependencies:
     is-descriptor "^1.0.0"
 
 define-property@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+  integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
   dependencies:
     is-descriptor "^1.0.2"
     isobject "^3.0.1"
@@ -4401,6 +4989,7 @@ define-property@^2.0.2:
 del@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4"
+  integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
   dependencies:
     "@types/glob" "^7.1.1"
     globby "^6.1.0"
@@ -4426,6 +5015,7 @@ del@^5.0.0:
 delayed-stream@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
 
 delegates@^1.0.0:
   version "1.0.0"
@@ -4434,10 +5024,17 @@ delegates@^1.0.0:
 depd@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+  integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+
+depd@~2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+  integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
 
 des.js@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843"
+  integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==
   dependencies:
     inherits "^2.0.1"
     minimalistic-assert "^1.0.0"
@@ -4445,6 +5042,7 @@ des.js@^1.0.0:
 destroy@~1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
 
 detect-browser@^5.1.1:
   version "5.1.1"
@@ -4462,18 +5060,22 @@ detect-newline@3.1.0:
 detect-newline@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
+  integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
 
 detect-node@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
+  integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
 
 diff-sequences@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
+  integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
 
 diffie-hellman@^5.0.0:
   version "5.0.3"
   resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+  integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==
   dependencies:
     bn.js "^4.1.0"
     miller-rabin "^4.0.0"
@@ -4482,6 +5084,7 @@ diffie-hellman@^5.0.0:
 dir-glob@^2.0.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4"
+  integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==
   dependencies:
     path-type "^3.0.0"
 
@@ -4502,10 +5105,12 @@ dlv@^1.1.0:
 dns-equal@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+  integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
 
 dns-packet@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
+  integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
   dependencies:
     ip "^1.1.0"
     safe-buffer "^5.0.1"
@@ -4513,6 +5118,7 @@ dns-packet@^1.3.1:
 dns-txt@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+  integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=
   dependencies:
     buffer-indexof "^1.0.0"
 
@@ -4525,18 +5131,26 @@ doctrine@^2.1.0:
 doctrine@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+  integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
   dependencies:
     esutils "^2.0.2"
 
+dom-accessibility-api@^0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.2.tgz#ef3cdb5d3f0d599d8f9c8b18df2fb63c9793739d"
+  integrity sha512-k7hRNKAiPJXD2aBqfahSo4/01cTsKWXf+LqJgglnkN2Nz8TsxXKQBXHhKe0Ye9fEfHEZY49uSA5Sr3AqP/sWKA==
+
 dom-converter@^0.2:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768"
+  integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
   dependencies:
     utila "~0.4"
 
 dom-helpers@^3.2.1, dom-helpers@^3.4.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-3.4.0.tgz#e9b369700f959f62ecde5a6babde4bccd9169af8"
+  integrity sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==
   dependencies:
     "@babel/runtime" "^7.1.2"
 
@@ -4562,46 +5176,55 @@ dom-serializer@~0.1.1:
     entities "^1.1.1"
 
 dom-walk@^0.1.0:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+  integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
 
 domain-browser@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+  integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==
 
 domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
+  integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
 
 domelementtype@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
+  integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
 
 domexception@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
+  integrity sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==
   dependencies:
     webidl-conversions "^4.0.2"
 
 domhandler@^2.3.0:
   version "2.4.2"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+  integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
   dependencies:
     domelementtype "1"
 
 domhandler@^3.0, domhandler@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
+  integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
   dependencies:
     domelementtype "^2.0.1"
 
 domready@1.0.8:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/domready/-/domready-1.0.8.tgz#91f252e597b65af77e745ae24dd0185d5e26d58c"
+  integrity sha1-kfJS5Ze2Wvd+dFriTdAYXV4m1Yw=
 
 domutils@1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+  integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
   dependencies:
     dom-serializer "0"
     domelementtype "1"
@@ -4609,13 +5232,15 @@ domutils@1.5.1:
 domutils@^1.5.1, domutils@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+  integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
   dependencies:
     dom-serializer "0"
     domelementtype "1"
 
 domutils@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16"
+  integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg==
   dependencies:
     dom-serializer "^0.2.1"
     domelementtype "^2.0.1"
@@ -4627,20 +5252,6 @@ dot-prop@^3.0.0:
   dependencies:
     is-obj "^1.0.0"
 
-dot-prop@^4.1.1:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
-  dependencies:
-    is-obj "^1.0.0"
-
-dotenv-expand@^4.2.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275"
-
-dotenv@^5.0.0:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
-
 dotgitignore@2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/dotgitignore/-/dotgitignore-2.1.0.tgz#a4b15a4e4ef3cf383598aaf1dfa4a04bcc089b7b"
@@ -4648,19 +5259,15 @@ dotgitignore@2.1.0:
     find-up "^3.0.0"
     minimatch "^3.0.4"
 
-duplexer2@~0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
-  dependencies:
-    readable-stream "^2.0.2"
-
 duplexer@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+  integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
 
 duplexify@^3.4.2, duplexify@^3.6.0:
   version "3.7.1"
   resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
+  integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==
   dependencies:
     end-of-stream "^1.0.0"
     inherits "^2.0.1"
@@ -4670,6 +5277,7 @@ duplexify@^3.4.2, duplexify@^3.6.0:
 ecc-jsbn@~0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+  integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
   dependencies:
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
@@ -4677,6 +5285,7 @@ ecc-jsbn@~0.1.1:
 editorconfig@^0.15.3:
   version "0.15.3"
   resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
+  integrity sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==
   dependencies:
     commander "^2.19.0"
     lru-cache "^4.1.5"
@@ -4686,22 +5295,26 @@ editorconfig@^0.15.3:
 ee-first@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+  integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
 
 ejs@^2.6.1:
   version "2.7.4"
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba"
+  integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==
 
-electron-to-chromium@^1.3.338:
-  version "1.3.341"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.341.tgz#ad4c039bf621715a12dd814a95a7d89ec80b092c"
+electron-to-chromium@^1.3.338, electron-to-chromium@^1.3.488:
+  version "1.3.498"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.498.tgz#fd7188c8a49d6d0b5df1df55a1f1a4bf2c177457"
+  integrity sha512-W1hGwaQEU8j9su2jeAr3aabkPuuXw+j8t73eajGAkEJWbfWiwbxBwQN/8Qmv2qCy3uCDm2rOAaZneYQM8VGC4w==
 
 elegant-spinner@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
 
-elliptic@^6.0.0:
-  version "6.5.2"
-  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762"
+elliptic@^6.0.0, elliptic@^6.5.2:
+  version "6.5.3"
+  resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6"
+  integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==
   dependencies:
     bn.js "^4.4.0"
     brorand "^1.0.1"
@@ -4714,6 +5327,7 @@ elliptic@^6.0.0:
 emoji-regex@^7.0.1:
   version "7.0.3"
   resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+  integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
 
 emoji-regex@^8.0.0:
   version "8.0.0"
@@ -4722,10 +5336,17 @@ emoji-regex@^8.0.0:
 emojis-list@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+  integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k=
+
+emojis-list@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+  integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
 
 encodeurl@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+  integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
 
 encoding@^0.1.11:
   version "0.1.12"
@@ -4736,24 +5357,27 @@ encoding@^0.1.11:
 end-of-stream@^1.0.0, end-of-stream@^1.1.0:
   version "1.4.4"
   resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
+  integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
   dependencies:
     once "^1.4.0"
 
 enhanced-resolve@^4.1.0:
-  version "4.1.1"
-  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66"
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126"
+  integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==
   dependencies:
     graceful-fs "^4.1.2"
     memory-fs "^0.5.0"
     tapable "^1.0.0"
 
-entities@^1.1.1, entities@^1.1.2, entities@~1.1.1:
+entities@^1.1.1, entities@~1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
 
 entities@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
+  integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
 
 enzyme-adapter-react-16@1.14.0:
   version "1.14.0"
@@ -4818,16 +5442,18 @@ err-code@^1.0.0:
 errno@^0.1.3, errno@~0.1.7:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+  integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==
   dependencies:
     prr "~1.0.1"
 
 error-ex@^1.2.0, error-ex@^1.3.1:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+  integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
   dependencies:
     is-arrayish "^0.2.1"
 
-es-abstract@^1.13.0, es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstract@^1.17.2:
+es-abstract@^1.13.0, es-abstract@^1.17.0:
   version "1.17.4"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184"
   dependencies:
@@ -4843,19 +5469,47 @@ es-abstract@^1.13.0, es-abstract@^1.17.0, es-abstract@^1.17.0-next.1, es-abstrac
     string.prototype.trimleft "^2.1.1"
     string.prototype.trimright "^2.1.1"
 
+es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
+  version "1.17.6"
+  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.6.tgz#9142071707857b2cacc7b89ecb670316c3e2d52a"
+  integrity sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==
+  dependencies:
+    es-to-primitive "^1.2.1"
+    function-bind "^1.1.1"
+    has "^1.0.3"
+    has-symbols "^1.0.1"
+    is-callable "^1.2.0"
+    is-regex "^1.1.0"
+    object-inspect "^1.7.0"
+    object-keys "^1.1.1"
+    object.assign "^4.1.0"
+    string.prototype.trimend "^1.0.1"
+    string.prototype.trimstart "^1.0.1"
+
 es-to-primitive@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+  integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
   dependencies:
     is-callable "^1.1.4"
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
+es6-denodeify@^0.1.1:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/es6-denodeify/-/es6-denodeify-0.1.5.tgz#31d4d5fe9c5503e125460439310e16a2a3f39c1f"
+  integrity sha1-MdTV/pxVA+ElRgQ5MQ4WoqPznB8=
+
+es6-object-assign@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
+  integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=
+
 es6-promise-pool@2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/es6-promise-pool/-/es6-promise-pool-2.5.0.tgz#147c612b36b47f105027f9d2bf54a598a99d9ccb"
 
-es6-promise@^4.0.3:
+es6-promise@^4.0.3, es6-promise@^4.2.8:
   version "4.2.8"
   resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
 
@@ -4865,17 +5519,25 @@ es6-promisify@^5.0.0:
   dependencies:
     es6-promise "^4.0.3"
 
+escalade@^3.0.1:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.0.2.tgz#6a580d70edb87880f22b4c91d0d56078df6962c4"
+  integrity sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==
+
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+  integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
 
 escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
 
-escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.9.1:
-  version "1.13.0"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.13.0.tgz#c7adf9bd3f3cc675bb752f202f79a720189cab29"
+escodegen@^1.9.1:
+  version "1.14.3"
+  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503"
+  integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==
   dependencies:
     esprima "^4.0.1"
     estraverse "^4.2.0"
@@ -4884,17 +5546,6 @@ escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.9.1:
   optionalDependencies:
     source-map "~0.6.1"
 
-escodegen@~1.9.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
-  dependencies:
-    esprima "^3.1.3"
-    estraverse "^4.2.0"
-    esutils "^2.0.2"
-    optionator "^0.8.1"
-  optionalDependencies:
-    source-map "~0.6.1"
-
 eslint-config-cozy-app@1.1.12:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-1.1.12.tgz#0ab562a593274d518ffc085e1b7ff9124d2e76f9"
@@ -4907,21 +5558,43 @@ eslint-config-cozy-app@1.1.12:
     eslint-plugin-vue "5.2.2"
     prettier "1.16.4"
 
+eslint-config-cozy-app@1.5.0:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-cozy-app/-/eslint-config-cozy-app-1.5.0.tgz#a68addd27286984d808304f4cdac95ef8757aa8c"
+  integrity sha512-3iHvM5b77w2Xl9ZnbRvRVmfOaKJt6JmNGkNbOQTqihLesehlX9C6ax4XueEIBfwvJVP/P1b8OAuXOcr+5pi07Q==
+  dependencies:
+    babel-eslint "10.0.1"
+    eslint "5.16.0"
+    eslint-config-prettier "4.3.0"
+    eslint-plugin-prettier "3.1.2"
+    eslint-plugin-react "7.14.3"
+    eslint-plugin-react-hooks "2.3.0"
+    eslint-plugin-vue "5.2.3"
+    prettier "1.18.2"
+
 eslint-config-prettier@4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.1.0.tgz#181364895899fff9fd3605fecb5c4f20e7d5f395"
   dependencies:
     get-stdin "^6.0.0"
 
+eslint-config-prettier@4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-4.3.0.tgz#c55c1fcac8ce4518aeb77906984e134d9eb5a4f0"
+  integrity sha512-sZwhSTHVVz78+kYD3t5pCWSYEdVSBR0PXnwjDRsUs8ytIrK8PLXw+6FKp8r3Z7rx4ZszdetWlXYKOHoUrrwPlA==
+  dependencies:
+    get-stdin "^6.0.0"
+
 eslint-config-prettier@^6.7.0:
   version "6.10.0"
   resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.0.tgz#7b15e303bf9c956875c948f6b21500e48ded6a7f"
   dependencies:
     get-stdin "^6.0.0"
 
-eslint-loader@2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.2.1.tgz#28b9c12da54057af0845e2a6112701a2f6bf8337"
+eslint-loader@2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.1.2.tgz#453542a1230d6ffac90e4e7cb9cadba9d851be68"
+  integrity sha512-rA9XiXEOilLYPOIInvVH5S/hYfyTPyxag6DZhoQOduM+3TkghAEQ3VcFO8VnX4J4qg/UIBzp72aOf/xvYmpmsg==
   dependencies:
     loader-fs-cache "^1.0.0"
     loader-utils "^1.0.2"
@@ -4935,12 +5608,22 @@ eslint-plugin-prettier@3.0.1:
   dependencies:
     prettier-linter-helpers "^1.0.0"
 
-eslint-plugin-prettier@^3.1.1:
+eslint-plugin-prettier@3.1.2, eslint-plugin-prettier@^3.1.1:
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba"
   dependencies:
     prettier-linter-helpers "^1.0.0"
 
+eslint-plugin-react-hooks@2.3.0:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-2.3.0.tgz#53e073961f1f5ccf8dd19558036c1fac8c29d99a"
+  integrity sha512-gLKCa52G4ee7uXzdLiorca7JIQZPPXRAQDXV83J4bUEeUuc5pIEyZYAZ45Xnxe5IuupxEqHS+hUhSLIimK1EMw==
+
+eslint-plugin-react-hooks@4.0.4:
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.4.tgz#aed33b4254a41b045818cacb047b81e6df27fa58"
+  integrity sha512-equAdEIsUETLFNCmmCkiCGq6rkSK5MoJhXFPFYeUebcjKgBmWWcgVOqZyQC8Bv1BwVCnTq9tBxgJFgAJTWoJtA==
+
 eslint-plugin-react@7.12.4:
   version "7.12.4"
   resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.12.4.tgz#b1ecf26479d61aee650da612e425c53a99f48c8c"
@@ -4967,15 +5650,56 @@ eslint-plugin-react@7.14.2:
     prop-types "^15.7.2"
     resolve "^1.10.1"
 
+eslint-plugin-react@7.14.3:
+  version "7.14.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.14.3.tgz#911030dd7e98ba49e1b2208599571846a66bdf13"
+  integrity sha512-EzdyyBWC4Uz2hPYBiEJrKCUi2Fn+BJ9B/pJQcjw5X+x/H2Nm59S4MJIvL4O5NEE0+WbnQwEBxWY03oUk+Bc3FA==
+  dependencies:
+    array-includes "^3.0.3"
+    doctrine "^2.1.0"
+    has "^1.0.3"
+    jsx-ast-utils "^2.1.0"
+    object.entries "^1.1.0"
+    object.fromentries "^2.0.0"
+    object.values "^1.1.0"
+    prop-types "^15.7.2"
+    resolve "^1.10.1"
+
+eslint-plugin-react@7.19.0:
+  version "7.19.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666"
+  integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ==
+  dependencies:
+    array-includes "^3.1.1"
+    doctrine "^2.1.0"
+    has "^1.0.3"
+    jsx-ast-utils "^2.2.3"
+    object.entries "^1.1.1"
+    object.fromentries "^2.0.2"
+    object.values "^1.1.1"
+    prop-types "^15.7.2"
+    resolve "^1.15.1"
+    semver "^6.3.0"
+    string.prototype.matchall "^4.0.2"
+    xregexp "^4.3.0"
+
 eslint-plugin-vue@5.2.2:
   version "5.2.2"
   resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.2.tgz#86601823b7721b70bc92d54f1728cfc03b36283c"
   dependencies:
     vue-eslint-parser "^5.0.0"
 
+eslint-plugin-vue@5.2.3:
+  version "5.2.3"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-5.2.3.tgz#3ee7597d823b5478804b2feba9863b1b74273961"
+  integrity sha512-mGwMqbbJf0+VvpGR5Lllq0PMxvTdrZ/ZPjmhkacrCHbubJeJOt+T6E3HUzAifa2Mxi7RSdJfC9HFpOeSYVMMIw==
+  dependencies:
+    vue-eslint-parser "^5.0.0"
+
 eslint-scope@3.7.1:
   version "3.7.1"
   resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8"
+  integrity sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=
   dependencies:
     esrecurse "^4.1.0"
     estraverse "^4.1.1"
@@ -5004,12 +5728,14 @@ eslint-scope@^5.0.0:
 eslint-utils@^1.3.1, eslint-utils@^1.4.3:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
+  integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
   dependencies:
     eslint-visitor-keys "^1.1.0"
 
 eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
+  integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
 
 eslint@5.15.1:
   version "5.15.1"
@@ -5052,12 +5778,12 @@ eslint@5.15.1:
     table "^5.2.3"
     text-table "^0.2.0"
 
-eslint@6.0.1:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.0.1.tgz#4a32181d72cb999d6f54151df7d337131f81cda7"
+eslint@5.16.0, eslint@^5.0.0:
+  version "5.16.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    ajv "^6.10.0"
+    ajv "^6.9.1"
     chalk "^2.1.0"
     cross-spawn "^6.0.5"
     debug "^4.0.1"
@@ -5065,19 +5791,18 @@ eslint@6.0.1:
     eslint-scope "^4.0.3"
     eslint-utils "^1.3.1"
     eslint-visitor-keys "^1.0.0"
-    espree "^6.0.0"
+    espree "^5.0.1"
     esquery "^1.0.1"
     esutils "^2.0.2"
     file-entry-cache "^5.0.1"
     functional-red-black-tree "^1.0.1"
-    glob-parent "^3.1.0"
+    glob "^7.1.2"
     globals "^11.7.0"
     ignore "^4.0.6"
     import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
     inquirer "^6.2.2"
-    is-glob "^4.0.0"
-    js-yaml "^3.13.1"
+    js-yaml "^3.13.0"
     json-stable-stringify-without-jsonify "^1.0.1"
     levn "^0.3.0"
     lodash "^4.17.11"
@@ -5085,6 +5810,7 @@ eslint@6.0.1:
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
     optionator "^0.8.2"
+    path-is-inside "^1.0.2"
     progress "^2.0.0"
     regexpp "^2.0.1"
     semver "^5.5.1"
@@ -5093,45 +5819,48 @@ eslint@6.0.1:
     table "^5.2.3"
     text-table "^0.2.0"
 
-eslint@^5.0.0:
-  version "5.16.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea"
+eslint@5.9.0:
+  version "5.9.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e"
+  integrity sha512-g4KWpPdqN0nth+goDNICNXGfJF7nNnepthp46CAlJoJtC5K/cLu3NgCM3AHu1CkJ5Hzt9V0Y0PBAO6Ay/gGb+w==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    ajv "^6.9.1"
+    ajv "^6.5.3"
     chalk "^2.1.0"
     cross-spawn "^6.0.5"
     debug "^4.0.1"
-    doctrine "^3.0.0"
-    eslint-scope "^4.0.3"
+    doctrine "^2.1.0"
+    eslint-scope "^4.0.0"
     eslint-utils "^1.3.1"
     eslint-visitor-keys "^1.0.0"
-    espree "^5.0.1"
+    espree "^4.0.0"
     esquery "^1.0.1"
     esutils "^2.0.2"
-    file-entry-cache "^5.0.1"
+    file-entry-cache "^2.0.0"
     functional-red-black-tree "^1.0.1"
     glob "^7.1.2"
     globals "^11.7.0"
     ignore "^4.0.6"
-    import-fresh "^3.0.0"
     imurmurhash "^0.1.4"
-    inquirer "^6.2.2"
-    js-yaml "^3.13.0"
+    inquirer "^6.1.0"
+    is-resolvable "^1.1.0"
+    js-yaml "^3.12.0"
     json-stable-stringify-without-jsonify "^1.0.1"
     levn "^0.3.0"
-    lodash "^4.17.11"
+    lodash "^4.17.5"
     minimatch "^3.0.4"
     mkdirp "^0.5.1"
     natural-compare "^1.4.0"
     optionator "^0.8.2"
     path-is-inside "^1.0.2"
+    pluralize "^7.0.0"
     progress "^2.0.0"
     regexpp "^2.0.1"
+    require-uncached "^1.0.3"
     semver "^5.5.1"
     strip-ansi "^4.0.0"
     strip-json-comments "^2.0.1"
-    table "^5.2.3"
+    table "^5.0.2"
     text-table "^0.2.0"
 
 eslint@^6.7.2:
@@ -5183,7 +5912,7 @@ espree@^3.5.2:
     acorn "^5.5.0"
     acorn-jsx "^3.0.0"
 
-espree@^4.1.0:
+espree@^4.0.0, espree@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f"
   dependencies:
@@ -5199,7 +5928,7 @@ espree@^5.0.1:
     acorn-jsx "^5.0.0"
     eslint-visitor-keys "^1.0.0"
 
-espree@^6.0.0, espree@^6.1.2:
+espree@^6.1.2:
   version "6.1.2"
   resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d"
   dependencies:
@@ -5207,29 +5936,40 @@ espree@^6.0.0, espree@^6.1.2:
     acorn-jsx "^5.1.0"
     eslint-visitor-keys "^1.1.0"
 
-esprima@^3.1.3:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
-
 esprima@^4.0.0, esprima@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+  integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
 
-esquery@^1.0.0, esquery@^1.0.1:
+esquery@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
   dependencies:
     estraverse "^4.0.0"
 
+esquery@^1.0.1:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
+  integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
+  dependencies:
+    estraverse "^5.1.0"
+
 esrecurse@^4.1.0:
   version "4.2.1"
   resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+  integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
   dependencies:
     estraverse "^4.1.0"
 
 estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+  integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0:
+  version "5.1.0"
+  resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
+  integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
 
 esutils@^2.0.0, esutils@^2.0.2:
   version "2.0.3"
@@ -5238,24 +5978,29 @@ esutils@^2.0.0, esutils@^2.0.2:
 etag@~1.8.1:
   version "1.8.1"
   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
 
 eventemitter3@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb"
+  version "4.0.4"
+  resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
+  integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
 
 events@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz#84279af1b34cb75aa88bf5ff291f6d0bd9b31a59"
+  integrity sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==
 
 eventsource@^1.0.7:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
+  integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==
   dependencies:
     original "^1.0.0"
 
 evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+  integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==
   dependencies:
     md5.js "^1.3.4"
     safe-buffer "^5.1.1"
@@ -5263,6 +6008,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
 exec-sh@^0.3.2:
   version "0.3.4"
   resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5"
+  integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==
 
 execa@^0.10.0:
   version "0.10.0"
@@ -5291,6 +6037,7 @@ execa@^0.7.0:
 execa@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+  integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
   dependencies:
     cross-spawn "^6.0.0"
     get-stream "^4.0.0"
@@ -5317,6 +6064,7 @@ execa@^2.0.3:
 exit@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+  integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
 
 expand-brackets@^0.1.4:
   version "0.1.5"
@@ -5327,6 +6075,7 @@ expand-brackets@^0.1.4:
 expand-brackets@^2.1.4:
   version "2.1.4"
   resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+  integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
   dependencies:
     debug "^2.3.3"
     define-property "^0.2.5"
@@ -5345,6 +6094,7 @@ expand-range@^1.8.1:
 expect@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/expect/-/expect-24.9.0.tgz#b75165b4817074fa4a157794f46fe9f1ba15b6ca"
+  integrity sha512-wvVAx8XIol3Z5m9zvZXiyZOQ+sRJqNTIm6sGjdWlaZIeupQGO3WbYI+15D/AmEwZywL6wtJkbAbJtzkOfBuR0Q==
   dependencies:
     "@jest/types" "^24.9.0"
     ansi-styles "^3.2.0"
@@ -5356,10 +6106,12 @@ expect@^24.9.0:
 expose-loader@0.7.5:
   version "0.7.5"
   resolved "https://registry.yarnpkg.com/expose-loader/-/expose-loader-0.7.5.tgz#e29ea2d9aeeed3254a3faa1b35f502db9f9c3f6f"
+  integrity sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==
 
 express@^4.16.3, express@^4.17.1:
   version "4.17.1"
   resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+  integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
   dependencies:
     accepts "~1.3.7"
     array-flatten "1.1.1"
@@ -5395,12 +6147,14 @@ express@^4.16.3, express@^4.17.1:
 extend-shallow@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+  integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
   dependencies:
     is-extendable "^0.1.0"
 
 extend-shallow@^3.0.0, extend-shallow@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+  integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
   dependencies:
     assign-symbols "^1.0.0"
     is-extendable "^1.0.1"
@@ -5412,6 +6166,7 @@ extend@^3.0.0, extend@~3.0.2:
 external-editor@^3.0.3:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
+  integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
   dependencies:
     chardet "^0.7.0"
     iconv-lite "^0.4.24"
@@ -5426,6 +6181,7 @@ extglob@^0.3.1:
 extglob@^2.0.2, extglob@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+  integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
   dependencies:
     array-unique "^0.3.2"
     define-property "^1.0.0"
@@ -5436,36 +6192,25 @@ extglob@^2.0.2, extglob@^2.0.4:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
-extract-from-css@^0.4.4:
-  version "0.4.4"
-  resolved "https://registry.yarnpkg.com/extract-from-css/-/extract-from-css-0.4.4.tgz#1ea7df2e7c7c6eb9922fa08e8adaea486f6f8f92"
-  dependencies:
-    css "^2.1.0"
-
 extsprintf@1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+  integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
 
 extsprintf@^1.2.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+  integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 
 eyes@0.1.x:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0"
-
-falafel@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c"
-  dependencies:
-    acorn "^5.0.0"
-    foreach "^2.0.5"
-    isarray "0.0.1"
-    object-keys "^1.0.6"
+  integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=
 
 fancy-log@^1.3.2:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
+  integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
   dependencies:
     ansi-gray "^0.1.1"
     color-support "^1.1.3"
@@ -5473,24 +6218,14 @@ fancy-log@^1.3.2:
     time-stamp "^1.0.0"
 
 fast-deep-equal@^3.1.1:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4"
+  version "3.1.3"
+  resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+  integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
 
 fast-diff@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
 
-fast-glob@^2.2.2:
-  version "2.2.7"
-  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d"
-  dependencies:
-    "@mrmlnc/readdir-enhanced" "^2.2.1"
-    "@nodelib/fs.stat" "^1.1.2"
-    glob-parent "^3.1.0"
-    is-glob "^4.0.0"
-    merge2 "^1.2.3"
-    micromatch "^3.1.10"
-
 fast-glob@^3.0.3:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.1.1.tgz#87ee30e9e9f3eb40d6f254a7997655da753d7c82"
@@ -5504,15 +6239,12 @@ fast-glob@^3.0.3:
 fast-json-stable-stringify@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+  integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
 
 fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
 
-fastparse@^1.1.1:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9"
-
 fastq@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.6.0.tgz#4ec8a38f4ac25f21492673adb7eae9cfef47d1c2"
@@ -5522,18 +6254,21 @@ fastq@^1.6.0:
 faye-websocket@^0.10.0:
   version "0.10.0"
   resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+  integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=
   dependencies:
     websocket-driver ">=0.5.1"
 
 faye-websocket@~0.11.1:
   version "0.11.3"
   resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e"
+  integrity sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==
   dependencies:
     websocket-driver ">=0.5.1"
 
 fb-watchman@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+  integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
   dependencies:
     bser "2.1.1"
 
@@ -5549,9 +6284,18 @@ fbjs@^0.8.1, fbjs@^0.8.4:
     setimmediate "^1.0.5"
     ua-parser-js "^0.7.18"
 
+fetch-cookie@0.7.0:
+  version "0.7.0"
+  resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.7.0.tgz#a6fc137ad8363aa89125864c6451b86ecb7de802"
+  integrity sha512-Mm5pGlT3agW6t71xVM7vMZPIvI7T4FaTuFW4jari6dVzYHFDb3WZZsGpN22r/o3XMdkM0E7sPd1EGeyVbH2Tgg==
+  dependencies:
+    es6-denodeify "^0.1.1"
+    tough-cookie "^2.3.1"
+
 figgy-pudding@^3.5.1:
-  version "3.5.1"
-  resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790"
+  version "3.5.2"
+  resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e"
+  integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==
 
 figures@3.1.0, figures@^3.0.0:
   version "3.1.0"
@@ -5569,31 +6313,53 @@ figures@^1.7.0:
 figures@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+  integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=
   dependencies:
     escape-string-regexp "^1.0.5"
 
+file-entry-cache@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+  integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=
+  dependencies:
+    flat-cache "^1.2.1"
+    object-assign "^4.0.1"
+
 file-entry-cache@^5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
+  integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
   dependencies:
     flat-cache "^2.0.1"
 
-file-loader@4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-4.0.0.tgz#c3570783fefb6e1bc0978a856f4bf5825b966c2a"
+file-loader@3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
+  integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
   dependencies:
-    loader-utils "^1.2.2"
+    loader-utils "^1.0.2"
     schema-utils "^1.0.0"
 
+file-type@^14.6.2:
+  version "14.7.1"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-14.7.1.tgz#f748732b3e70478bff530e1cf0ec2fe33608b1bb"
+  integrity sha512-sXAMgFk67fQLcetXustxfKX+PZgHIUFn96Xld9uH8aXPdX3xOp0/jg9OdouVTvQrf7mrn+wAa4jN/y9fUOOiRA==
+  dependencies:
+    readable-web-to-node-stream "^2.0.0"
+    strtok3 "^6.0.3"
+    token-types "^2.0.0"
+    typedarray-to-buffer "^3.1.5"
+
 file-uri-to-path@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
+  integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
 
 filename-regex@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
 
-filesize@^3.6.0, filesize@^3.6.1:
+filesize@^3.6.1:
   version "3.6.1"
   resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
 
@@ -5610,6 +6376,7 @@ fill-range@^2.1.0:
 fill-range@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+  integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
   dependencies:
     extend-shallow "^2.0.1"
     is-number "^3.0.0"
@@ -5631,6 +6398,7 @@ final-form@4.18.5:
 finalhandler@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
+  integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
   dependencies:
     debug "2.6.9"
     encodeurl "~1.0.2"
@@ -5640,24 +6408,28 @@ finalhandler@~1.1.2:
     statuses "~1.5.0"
     unpipe "~1.0.0"
 
-find-babel-config@^1.1.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
-  dependencies:
-    json5 "^0.5.1"
-    path-exists "^3.0.0"
-
 find-cache-dir@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+  integrity sha1-yN765XyKUqinhPnjHFfHQumToLk=
   dependencies:
     commondir "^1.0.1"
     mkdirp "^0.5.1"
     pkg-dir "^1.0.0"
 
-find-cache-dir@^2.0.0, find-cache-dir@^2.1.0:
+find-cache-dir@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+  integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=
+  dependencies:
+    commondir "^1.0.1"
+    make-dir "^1.0.0"
+    pkg-dir "^2.0.0"
+
+find-cache-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+  integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
   dependencies:
     commondir "^1.0.1"
     make-dir "^2.0.0"
@@ -5673,6 +6445,7 @@ find-up@4.1.0, find-up@^4.0.0, find-up@^4.1.0:
 find-up@^1.0.0:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+  integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
   dependencies:
     path-exists "^2.0.0"
     pinkie-promise "^2.0.0"
@@ -5686,24 +6459,38 @@ find-up@^2.0.0, find-up@^2.1.0:
 find-up@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+  integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
   dependencies:
     locate-path "^3.0.0"
 
+flat-cache@^1.2.1:
+  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"
+    graceful-fs "^4.1.2"
+    rimraf "~2.6.2"
+    write "^0.2.1"
+
 flat-cache@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
+  integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
   dependencies:
     flatted "^2.0.0"
     rimraf "2.6.3"
     write "1.0.3"
 
 flatted@^2.0.0:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.1.tgz#69e57caa8f0eacbc281d2e2cb458d46fdb449e08"
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
+  integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
 
 flush-write-stream@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8"
+  integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==
   dependencies:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
@@ -5715,20 +6502,21 @@ follow-redirects@1.5.10:
     debug "=3.1.0"
 
 follow-redirects@^1.0.0:
-  version "1.10.0"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.10.0.tgz#01f5263aee921c6a54fb91667f08f4155ce169eb"
-  dependencies:
-    debug "^3.0.0"
+  version "1.12.1"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.12.1.tgz#de54a6205311b93d60398ebc01cf7015682312b6"
+  integrity sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==
 
 for-each@^0.3.3:
   version "0.3.3"
   resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+  integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
   dependencies:
     is-callable "^1.1.3"
 
 for-in@^1.0.1, for-in@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+  integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
 
 for-own@^0.1.4:
   version "0.1.5"
@@ -5736,17 +6524,24 @@ for-own@^0.1.4:
   dependencies:
     for-in "^1.0.1"
 
-foreach@^2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
-
 forever-agent@~0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+  integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682"
+  integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
 
 form-data@~2.3.2:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+  integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
   dependencies:
     asynckit "^0.4.0"
     combined-stream "^1.0.6"
@@ -5755,20 +6550,24 @@ form-data@~2.3.2:
 forwarded@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+  integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
 
 fragment-cache@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+  integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
   dependencies:
     map-cache "^0.2.2"
 
 fresh@0.5.2:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+  integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
 
 from2@^2.1.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+  integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=
   dependencies:
     inherits "^2.0.1"
     readable-stream "^2.0.0"
@@ -5788,9 +6587,10 @@ fs-extra@7.0.1:
     jsonfile "^4.0.0"
     universalify "^0.1.0"
 
-fs-extra@8.1.0:
+fs-extra@^8.0.1:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
+  integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==
   dependencies:
     graceful-fs "^4.2.0"
     jsonfile "^4.0.0"
@@ -5806,6 +6606,7 @@ fs-minipass@^1.2.5:
 fs-write-stream-atomic@^1.0.8:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+  integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=
   dependencies:
     graceful-fs "^4.1.2"
     iferr "^0.1.5"
@@ -5815,14 +6616,28 @@ fs-write-stream-atomic@^1.0.8:
 fs.realpath@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+  integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
 
-fsevents@^1.0.0, fsevents@^1.2.7:
+fsevents@^1.0.0:
   version "1.2.11"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3"
   dependencies:
     bindings "^1.5.0"
     nan "^2.12.1"
 
+fsevents@^1.2.7:
+  version "1.2.13"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38"
+  integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==
+  dependencies:
+    bindings "^1.5.0"
+    nan "^2.12.1"
+
+fsevents@~2.1.2:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
+  integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
+
 fstream@^1.0.0, fstream@^1.0.12:
   version "1.0.12"
   resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045"
@@ -5835,6 +6650,7 @@ fstream@^1.0.0, fstream@^1.0.12:
 function-bind@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+  integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
 
 function.prototype.name@^1.1.0, function.prototype.name@^1.1.1, function.prototype.name@^1.1.2:
   version "1.1.2"
@@ -5847,6 +6663,7 @@ function.prototype.name@^1.1.0, function.prototype.name@^1.1.1, function.prototy
 functional-red-black-tree@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+  integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
 
 functions-have-names@^1.2.0:
   version "1.2.1"
@@ -5871,17 +6688,27 @@ gaze@^1.0.0:
   dependencies:
     globule "^1.0.0"
 
+geco@^0.11.1:
+  version "0.11.1"
+  resolved "https://registry.yarnpkg.com/geco/-/geco-0.11.1.tgz#2dec107202a37bbfbb480892446a94a6ffc41411"
+  integrity sha512-RuZ2QWImhVLwaSCuhS9+iPIEL/kemh2xOa4ovnWXaR86GWWZndMXerMUpAjPyR4WHwnWn8pjY0kmy2iX2a4rwg==
+  dependencies:
+    toni ">=0.6.2"
+
 gensync@^1.0.0-beta.1:
   version "1.0.0-beta.1"
   resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
+  integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==
 
 get-caller-file@^1.0.1:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+  integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
 
 get-caller-file@^2.0.1:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+  integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
 get-own-enumerable-property-symbols@^3.0.0:
   version "3.0.2"
@@ -5897,10 +6724,6 @@ get-pkg-repo@^1.0.0:
     parse-github-repo-url "^1.3.0"
     through2 "^2.0.0"
 
-get-port@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
-
 get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@@ -5920,6 +6743,7 @@ get-stream@^3.0.0:
 get-stream@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+  integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
   dependencies:
     pump "^3.0.0"
 
@@ -5932,10 +6756,12 @@ get-stream@^5.0.0:
 get-value@^2.0.3, get-value@^2.0.6:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+  integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
 
 getpass@^0.1.1:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+  integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
   dependencies:
     assert-plus "^1.0.0"
 
@@ -5992,6 +6818,7 @@ glob-parent@^2.0.0:
 glob-parent@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+  integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=
   dependencies:
     is-glob "^3.1.0"
     path-dirname "^1.0.0"
@@ -6002,9 +6829,12 @@ glob-parent@^5.0.0, glob-parent@^5.1.0:
   dependencies:
     is-glob "^4.0.1"
 
-glob-to-regexp@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+glob-parent@~5.1.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
+  integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
+  dependencies:
+    is-glob "^4.0.1"
 
 glob@7.0.4:
   version "7.0.4"
@@ -6017,20 +6847,10 @@ glob@7.0.4:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
-glob@7.0.x:
-  version "7.0.6"
-  resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a"
-  dependencies:
-    fs.realpath "^1.0.0"
-    inflight "^1.0.4"
-    inherits "2"
-    minimatch "^3.0.2"
-    once "^1.3.0"
-    path-is-absolute "^1.0.0"
-
 glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1:
   version "7.1.6"
   resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+  integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
   dependencies:
     fs.realpath "^1.0.0"
     inflight "^1.0.4"
@@ -6042,6 +6862,7 @@ glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, gl
 global@^4.3.0, global@^4.4.0:
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+  integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
   dependencies:
     min-document "^2.19.0"
     process "^0.11.10"
@@ -6049,6 +6870,7 @@ global@^4.3.0, global@^4.4.0:
 globals@^11.1.0, globals@^11.7.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+  integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
 globals@^12.1.0:
   version "12.3.0"
@@ -6056,10 +6878,6 @@ globals@^12.1.0:
   dependencies:
     type-fest "^0.8.1"
 
-globals@^9.18.0:
-  version "9.18.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
-
 globby@^10.0.1:
   version "10.0.1"
   resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.1.tgz#4782c34cb75dd683351335c5829cc3420e606b22"
@@ -6076,6 +6894,7 @@ globby@^10.0.1:
 globby@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+  integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=
   dependencies:
     array-union "^1.0.1"
     glob "^7.0.3"
@@ -6086,6 +6905,7 @@ globby@^6.1.0:
 globby@^7.1.1:
   version "7.1.1"
   resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680"
+  integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA=
   dependencies:
     array-union "^1.0.1"
     dir-glob "^2.0.0"
@@ -6102,28 +6922,29 @@ globule@^1.0.0:
     lodash "~4.17.10"
     minimatch "~3.0.2"
 
-graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2:
+graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
+  version "4.2.4"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
+  integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+
+graceful-fs@^4.2.2:
   version "4.2.3"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423"
 
-grapheme-breaker@^0.3.2:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac"
-  dependencies:
-    brfs "^1.2.0"
-    unicode-trie "^0.3.1"
-
 growly@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+  integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
 
 gud@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0"
+  integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==
 
 gzip-size@^5.0.0:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+  integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
   dependencies:
     duplexer "^0.1.1"
     pify "^4.0.1"
@@ -6133,8 +6954,9 @@ hammerjs@2.0.8, hammerjs@^2.0.8:
   resolved "https://registry.yarnpkg.com/hammerjs/-/hammerjs-2.0.8.tgz#04ef77862cff2bb79d30f7692095930222bf60f1"
 
 handle-thing@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e"
+  integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
 
 handlebars@^4.4.0:
   version "4.7.2"
@@ -6149,10 +6971,12 @@ handlebars@^4.4.0:
 har-schema@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+  integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
 
-har-validator@~5.1.0:
+har-validator@~5.1.0, har-validator@~5.1.3:
   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"
@@ -6160,24 +6984,34 @@ har-validator@~5.1.0:
 harmony-reflect@^1.4.6:
   version "1.6.1"
   resolved "https://registry.yarnpkg.com/harmony-reflect/-/harmony-reflect-1.6.1.tgz#c108d4f2bb451efef7a37861fdbdae72c9bdefa9"
+  integrity sha512-WJTeyp0JzGtHcuMsi7rw2VwtkvLa+JyfEKJCFyfcS0+CDkjQ5lHPu7zEhFZP+PDSRrEgXa5Ah0l1MbgbE41XjA==
 
 has-ansi@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
   dependencies:
     ansi-regex "^2.0.0"
 
 has-flag@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+  integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
 
 has-flag@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+  integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-flag@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+  integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
 
 has-symbols@^1.0.0, has-symbols@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8"
+  integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==
 
 has-unicode@^2.0.0:
   version "2.0.1"
@@ -6186,6 +7020,7 @@ has-unicode@^2.0.0:
 has-value@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+  integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
   dependencies:
     get-value "^2.0.3"
     has-values "^0.1.4"
@@ -6194,6 +7029,7 @@ has-value@^0.3.1:
 has-value@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+  integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
   dependencies:
     get-value "^2.0.6"
     has-values "^1.0.0"
@@ -6202,30 +7038,35 @@ has-value@^1.0.0:
 has-values@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+  integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
 
 has-values@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+  integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
   dependencies:
     is-number "^3.0.0"
     kind-of "^4.0.0"
 
-has@^1.0.0, has@^1.0.1, has@^1.0.3:
+has@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
   dependencies:
     function-bind "^1.1.1"
 
 hash-base@^3.0.0:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33"
+  integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==
   dependencies:
-    inherits "^2.0.1"
-    safe-buffer "^5.0.1"
+    inherits "^2.0.4"
+    readable-stream "^3.6.0"
+    safe-buffer "^5.2.0"
 
 hash.js@^1.0.0, hash.js@^1.0.3:
   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"
@@ -6233,10 +7074,7 @@ hash.js@^1.0.0, hash.js@^1.0.3:
 he@1.2.x, he@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
-
-hex-color-regex@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+  integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
 
 highlight.js@^9.6.0:
   version "9.18.0"
@@ -6245,6 +7083,7 @@ highlight.js@^9.6.0:
 history@^4.9.0:
   version "4.10.1"
   resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
+  integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==
   dependencies:
     "@babel/runtime" "^7.1.2"
     loose-envify "^1.2.0"
@@ -6256,12 +7095,13 @@ history@^4.9.0:
 hmac-drbg@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+  integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=
   dependencies:
     hash.js "^1.0.3"
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.1"
 
-hoist-non-react-statics@^2.3.1, hoist-non-react-statics@^2.5.0:
+hoist-non-react-statics@^2.3.1:
   version "2.5.5"
   resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz#c5903cf409c0dfd908f388e619d86b9c1174cb47"
 
@@ -6274,32 +7114,23 @@ hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.2.1, hoist-non-react-
 hoopy@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+  integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
 
 hosted-git-info@^2.1.4:
-  version "2.8.5"
-  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c"
+  version "2.8.8"
+  resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
+  integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
 
 hpack.js@^2.1.6:
   version "2.1.6"
   resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+  integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=
   dependencies:
     inherits "^2.0.1"
     obuf "^1.0.0"
     readable-stream "^2.0.1"
     wbuf "^1.1.0"
 
-hsl-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
-
-hsla-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
-
-html-comment-regex@^1.1.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7"
-
 html-element-map@^1.0.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22"
@@ -6309,20 +7140,24 @@ html-element-map@^1.0.0:
 html-encoding-sniffer@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+  integrity sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==
   dependencies:
     whatwg-encoding "^1.0.1"
 
 html-entities@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44"
+  integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==
 
 html-escaper@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491"
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+  integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
 
 html-minifier@^3.2.3:
   version "3.5.21"
   resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz#d0040e054730e354db008463593194015212d20c"
+  integrity sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==
   dependencies:
     camel-case "3.0.x"
     clean-css "4.2.x"
@@ -6332,22 +7167,20 @@ html-minifier@^3.2.3:
     relateurl "0.2.x"
     uglify-js "3.4.x"
 
-html-tags@^1.0.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/html-tags/-/html-tags-1.2.0.tgz#c78de65b5663aa597989dd2b7ab49200d7e4db98"
-
 html-to-react@^1.3.4:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.2.tgz#7b628ab56cd63a52f2d0b79d0fa838a51f088a57"
+  version "1.4.3"
+  resolved "https://registry.yarnpkg.com/html-to-react/-/html-to-react-1.4.3.tgz#1430a1cb581ef29533892ec70a2fdc4554b17ffd"
+  integrity sha512-txe09A3vxW8yEZGJXJ1is5gGDfBEVACmZDSgwDyH5EsfRdOubBwBCg63ZThZP0xBn0UE4FyvMXZXmohusCxDcg==
   dependencies:
     domhandler "^3.0"
-    htmlparser2 "^4.0"
+    htmlparser2 "^4.1.0"
     lodash.camelcase "^4.3.0"
-    ramda "^0.26"
+    ramda "^0.27"
 
-html-webpack-include-assets-plugin@1.0.10:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/html-webpack-include-assets-plugin/-/html-webpack-include-assets-plugin-1.0.10.tgz#11a7bd7d2c5d58d955051bb17f6f04f7f84d7569"
+html-webpack-include-assets-plugin@1.0.7:
+  version "1.0.7"
+  resolved "https://registry.yarnpkg.com/html-webpack-include-assets-plugin/-/html-webpack-include-assets-plugin-1.0.7.tgz#654d7edb0de4ffde23c006b018aff95a205b8b88"
+  integrity sha512-cgldzFAQ/DfBgidL5e9JU0SO8ARyJolV4D9QFrqrTUsDE07VuCtH0ttxpF5YiUhQJf4zI/oQHMJr99giKvoRsA==
   dependencies:
     glob "^7.1.3"
     minimatch "^3.0.4"
@@ -6356,6 +7189,7 @@ html-webpack-include-assets-plugin@1.0.10:
 html-webpack-plugin@3.2.0, html-webpack-plugin@^3.2.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz#b01abbd723acaaa7b37b6af4492ebda03d9dd37b"
+  integrity sha1-sBq71yOsqqeze2r0SS69oD2d03s=
   dependencies:
     html-minifier "^3.2.3"
     loader-utils "^0.2.16"
@@ -6365,20 +7199,7 @@ html-webpack-plugin@3.2.0, html-webpack-plugin@^3.2.0:
     toposort "^1.0.0"
     util.promisify "1.0.0"
 
-htmlnano@^0.2.2:
-  version "0.2.5"
-  resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.2.5.tgz#134fd9548c7cbe51c8508ce434a3f9488cff1b0b"
-  dependencies:
-    cssnano "^4.1.10"
-    normalize-html-whitespace "^1.0.0"
-    posthtml "^0.12.0"
-    posthtml-render "^1.1.5"
-    purgecss "^1.4.0"
-    svgo "^1.3.2"
-    terser "^4.3.9"
-    uncss "^0.17.2"
-
-htmlparser2@^3.3.0, htmlparser2@^3.8.3, htmlparser2@^3.9.1, htmlparser2@^3.9.2:
+htmlparser2@^3.3.0, htmlparser2@^3.8.3, htmlparser2@^3.9.1:
   version "3.10.1"
   resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
   dependencies:
@@ -6389,9 +7210,10 @@ htmlparser2@^3.3.0, htmlparser2@^3.8.3, htmlparser2@^3.9.1, htmlparser2@^3.9.2:
     inherits "^2.0.1"
     readable-stream "^3.1.1"
 
-htmlparser2@^4.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.0.0.tgz#6034658db65b7713a572a9ebf79f650832dceec8"
+htmlparser2@^4.1.0:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
+  integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
   dependencies:
     domelementtype "^2.0.1"
     domhandler "^3.0.0"
@@ -6405,10 +7227,12 @@ http-cache-semantics@^3.8.1:
 http-deceiver@^1.2.7:
   version "1.2.7"
   resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+  integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=
 
 http-errors@1.7.2:
   version "1.7.2"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
+  integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
   dependencies:
     depd "~1.1.2"
     inherits "2.0.3"
@@ -6416,28 +7240,38 @@ http-errors@1.7.2:
     statuses ">= 1.5.0 < 2"
     toidentifier "1.0.0"
 
+http-errors@1.7.3, http-errors@~1.7.2:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.4"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
 http-errors@~1.6.2:
   version "1.6.3"
   resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+  integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=
   dependencies:
     depd "~1.1.2"
     inherits "2.0.3"
     setprototypeof "1.1.0"
     statuses ">= 1.4.0 < 2"
 
-http-errors@~1.7.2:
-  version "1.7.3"
-  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+http-graceful-shutdown@^2.3.1:
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/http-graceful-shutdown/-/http-graceful-shutdown-2.3.2.tgz#2334e3036c88283567fdab5e371ffad327fb886e"
+  integrity sha512-Dn7fJjHWboN7WjNDuo7d7ZISdUlbnyQEtOjBwMGJig45ZztHQxCsnW9N89Pr3gb6VzvZy1HySgAu2Q98j6S17w==
   dependencies:
-    depd "~1.1.2"
-    inherits "2.0.4"
-    setprototypeof "1.1.1"
-    statuses ">= 1.5.0 < 2"
-    toidentifier "1.0.0"
+    debug "^4.1.1"
 
-"http-parser-js@>=0.4.0 <0.4.11":
-  version "0.4.10"
-  resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.10.tgz#92c9c1374c35085f75db359ec56cc257cbb93fa4"
+http-parser-js@>=0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77"
+  integrity sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==
 
 http-proxy-agent@^2.1.0:
   version "2.1.0"
@@ -6446,9 +7280,10 @@ http-proxy-agent@^2.1.0:
     agent-base "4"
     debug "3.1.0"
 
-http-proxy-middleware@^0.19.1:
+http-proxy-middleware@0.19.1:
   version "0.19.1"
   resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a"
+  integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==
   dependencies:
     http-proxy "^1.17.0"
     is-glob "^4.0.0"
@@ -6456,8 +7291,9 @@ http-proxy-middleware@^0.19.1:
     micromatch "^3.1.10"
 
 http-proxy@^1.17.0:
-  version "1.18.0"
-  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a"
+  version "1.18.1"
+  resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+  integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
   dependencies:
     eventemitter3 "^4.0.0"
     follow-redirects "^1.0.0"
@@ -6466,6 +7302,7 @@ http-proxy@^1.17.0:
 http-signature@~1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+  integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
   dependencies:
     assert-plus "^1.0.0"
     jsprim "^1.2.2"
@@ -6474,6 +7311,7 @@ http-signature@~1.2.0:
 https-browserify@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+  integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=
 
 https-proxy-agent@^2.2.1:
   version "2.2.4"
@@ -6485,6 +7323,7 @@ https-proxy-agent@^2.2.1:
 human-size@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/human-size/-/human-size-1.1.0.tgz#052562be999841c037022c20259990c56ea996f9"
+  integrity sha1-BSVivpmYQcA3AiwgJZmQxW6plvk=
 
 humanize-ms@^1.2.1:
   version "1.2.1"
@@ -6515,6 +7354,7 @@ hyphenate-style-name@^1.0.2:
 i@0.3.x:
   version "0.3.6"
   resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
+  integrity sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=
 
 iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
   version "0.4.24"
@@ -6522,37 +7362,43 @@ iconv-lite@0.4, iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0:
+icss-replace-symbols@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
 
-icss-utils@^4.0.0, icss-utils@^4.1.1:
+icss-utils@^4.0.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467"
+  integrity sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==
   dependencies:
     postcss "^7.0.14"
 
 identity-obj-proxy@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz#94d2bda96084453ef36fbc5aaec37e0f79f1fc14"
+  integrity sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=
   dependencies:
     harmony-reflect "^1.4.6"
 
-ieee754@^1.1.4:
+ieee754@^1.1.13, ieee754@^1.1.4:
   version "1.1.13"
   resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
 
 iferr@^0.1.5:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+  integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE=
 
 ignore@^3.3.5:
   version "3.3.10"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+  integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
 
 ignore@^4.0.6:
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
+  integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
 ignore@^5.1.1:
   version "5.1.4"
@@ -6561,20 +7407,23 @@ ignore@^5.1.1:
 image-size@^0.5.1:
   version "0.5.5"
   resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
+  integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
 
-immediate@~3.0.5:
+immediate@3.0.6, immediate@~3.0.5:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
 
 import-cwd@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9"
+  integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=
   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"
@@ -6582,6 +7431,7 @@ import-fresh@^2.0.0:
 import-fresh@^3.0.0:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
+  integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
   dependencies:
     parent-module "^1.0.0"
     resolve-from "^4.0.0"
@@ -6589,19 +7439,30 @@ import-fresh@^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"
+  integrity sha1-M1238qev/VOqpHHUuAId7ja387E=
   dependencies:
     resolve-from "^3.0.0"
 
 import-local@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d"
+  integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==
   dependencies:
     pkg-dir "^3.0.0"
     resolve-cwd "^2.0.0"
 
+imports-loader@0.8.0:
+  version "0.8.0"
+  resolved "https://registry.yarnpkg.com/imports-loader/-/imports-loader-0.8.0.tgz#030ea51b8ca05977c40a3abfd9b4088fe0be9a69"
+  integrity sha512-kXWL7Scp8KQ4552ZcdVTeaQCZSLW+e6nJfp3cwUMB673T7Hr98Xjx5JK+ql7ADlJUvj1JS5O01RLbKoutN5QDQ==
+  dependencies:
+    loader-utils "^1.0.2"
+    source-map "^0.6.1"
+
 imurmurhash@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+  integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
 
 in-publish@^2.0.0:
   version "2.0.0"
@@ -6630,37 +7491,44 @@ indent-string@^4.0.0:
 indexes-of@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+  integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
 infer-owner@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
+  integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==
 
 inflight@^1.0.4:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+  integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
   dependencies:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
 
 inherits@2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+  integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=
 
 inherits@2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+  integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
 
 ini@^1.3.2, ini@^1.3.4:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+  integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
 
-inquirer@^6.2.2:
+inquirer@^6.1.0, inquirer@^6.2.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca"
+  integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==
   dependencies:
     ansi-escapes "^3.2.0"
     chalk "^2.4.2"
@@ -6697,13 +7565,29 @@ inquirer@^7.0.0:
 internal-ip@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907"
+  integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==
   dependencies:
     default-gateway "^4.2.0"
     ipaddr.js "^1.9.0"
 
-invariant@^2.0.0, invariant@^2.2.2, invariant@^2.2.4:
+internal-slot@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.2.tgz#9c2e9fb3cd8e5e4256c6f45fe310067fcfa378a3"
+  integrity sha512-2cQNfwhAfJIkU4KZPkDI+Gj5yNNnbqi40W9Gge6dfnk4TocEVm00B3bdiL+JINrbGJil2TeHvM4rETGzk/f/0g==
+  dependencies:
+    es-abstract "^1.17.0-next.1"
+    has "^1.0.3"
+    side-channel "^1.0.2"
+
+intersection-observer@0.11.0:
+  version "0.11.0"
+  resolved "https://registry.yarnpkg.com/intersection-observer/-/intersection-observer-0.11.0.tgz#f4ea067070326f68393ee161cc0a2ca4c0040c6f"
+  integrity sha512-KZArj2QVnmdud9zTpKf279m2bbGfG+4/kn16UU0NL3pTVl52ZHiJ9IRNSsnn6jaHrL9EGLFM5eWjTx2fz/+zoQ==
+
+invariant@^2.2.2, invariant@^2.2.4:
   version "2.2.4"
   resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+  integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
   dependencies:
     loose-envify "^1.0.0"
 
@@ -6714,50 +7598,49 @@ invert-kv@^1.0.0:
 invert-kv@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02"
+  integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==
 
 ip-regex@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
+  integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=
 
 ip@1.1.5, ip@^1.1.0, ip@^1.1.5:
   version "1.1.5"
   resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
 
-ipaddr.js@1.9.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
-
-ipaddr.js@^1.9.0:
+ipaddr.js@1.9.1, ipaddr.js@^1.9.0:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+  integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
 
-is-absolute-url@^2.0.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
-
-is-absolute-url@^3.0.1:
+is-absolute-url@^3.0.0, is-absolute-url@^3.0.3:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698"
 
 is-accessor-descriptor@^0.1.6:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+  integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
   dependencies:
     kind-of "^3.0.2"
 
 is-accessor-descriptor@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+  integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
   dependencies:
     kind-of "^6.0.0"
 
 is-alphabetical@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d"
+  integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==
 
 is-alphanumerical@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf"
+  integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==
   dependencies:
     is-alphabetical "^1.0.0"
     is-decimal "^1.0.0"
@@ -6765,73 +7648,75 @@ is-alphanumerical@^1.0.0:
 is-arguments@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3"
+  integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==
 
 is-arrayish@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
-
-is-arrayish@^0.3.1:
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+  integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
 
 is-binary-path@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+  integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=
   dependencies:
     binary-extensions "^1.0.0"
 
+is-binary-path@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
+  integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+  dependencies:
+    binary-extensions "^2.0.0"
+
 is-boolean-object@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e"
 
-is-buffer@^1.1.4, is-buffer@^1.1.5:
+is-buffer@^1.1.4, is-buffer@^1.1.5, is-buffer@~1.1.6:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
 
-is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab"
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb"
+  integrity sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==
 
 is-ci@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+  integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
   dependencies:
     ci-info "^2.0.0"
 
-is-color-stop@^1.0.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
-  dependencies:
-    css-color-names "^0.0.4"
-    hex-color-regex "^1.1.0"
-    hsl-regex "^1.0.0"
-    hsla-regex "^1.0.0"
-    rgb-regex "^1.0.1"
-    rgba-regex "^1.0.0"
-
 is-data-descriptor@^0.1.4:
   version "0.1.4"
   resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+  integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
   dependencies:
     kind-of "^3.0.2"
 
 is-data-descriptor@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+  integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
   dependencies:
     kind-of "^6.0.0"
 
 is-date-object@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
+  integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
 
 is-decimal@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
+  integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==
 
 is-descriptor@^0.1.0:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+  integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
   dependencies:
     is-accessor-descriptor "^0.1.6"
     is-data-descriptor "^0.1.4"
@@ -6840,6 +7725,7 @@ is-descriptor@^0.1.0:
 is-descriptor@^1.0.0, is-descriptor@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+  integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
   dependencies:
     is-accessor-descriptor "^1.0.0"
     is-data-descriptor "^1.0.0"
@@ -6848,6 +7734,12 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
 is-directory@^0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+  integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+
+is-docker@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz#2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b"
+  integrity sha512-pJEdRugimx4fBMra5z2/5iRdZ63OhYV0vr0Dwm5+xtW4D1FvRkB8hamMIhnWfyJeDdyr/aa7BDyNbtG38VxgoQ==
 
 is-dotfile@^1.0.0:
   version "1.0.3"
@@ -6862,10 +7754,12 @@ is-equal-shallow@^0.1.3:
 is-extendable@^0.1.0, is-extendable@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+  integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
 
 is-extendable@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+  integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
   dependencies:
     is-plain-object "^2.0.4"
 
@@ -6876,6 +7770,7 @@ is-extglob@^1.0.0:
 is-extglob@^2.1.0, is-extglob@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
 
 is-finite@^1.0.0:
   version "1.0.2"
@@ -6886,12 +7781,14 @@ is-finite@^1.0.0:
 is-fullwidth-code-point@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
   dependencies:
     number-is-nan "^1.0.0"
 
 is-fullwidth-code-point@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+  integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
 
 is-fullwidth-code-point@^3.0.0:
   version "3.0.0"
@@ -6900,6 +7797,7 @@ is-fullwidth-code-point@^3.0.0:
 is-generator-fn@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+  integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
 
 is-glob@^2.0.0, is-glob@^2.0.1:
   version "2.0.1"
@@ -6910,24 +7808,21 @@ is-glob@^2.0.0, is-glob@^2.0.1:
 is-glob@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+  integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=
   dependencies:
     is-extglob "^2.1.0"
 
-is-glob@^4.0.0, is-glob@^4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+  integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
   dependencies:
     is-extglob "^2.1.1"
 
 is-hexadecimal@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
-
-is-html@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464"
-  dependencies:
-    html-tags "^1.0.0"
+  integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
 
 is-in-browser@^1.0.2, is-in-browser@^1.1.3:
   version "1.1.3"
@@ -6946,6 +7841,7 @@ is-number@^2.1.0:
 is-number@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+  integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
   dependencies:
     kind-of "^3.0.2"
 
@@ -6974,12 +7870,14 @@ is-path-cwd@^2.0.0, is-path-cwd@^2.2.0:
 is-path-in-cwd@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb"
+  integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
   dependencies:
     is-path-inside "^2.1.0"
 
 is-path-inside@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2"
+  integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
   dependencies:
     path-is-inside "^1.0.2"
 
@@ -6987,13 +7885,15 @@ is-path-inside@^3.0.1:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
 
-is-plain-obj@^1.0.0, is-plain-obj@^1.1, is-plain-obj@^1.1.0:
+is-plain-obj@^1.1, is-plain-obj@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+  integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
 
 is-plain-object@^2.0.3, is-plain-object@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+  integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
   dependencies:
     isobject "^3.0.1"
 
@@ -7006,26 +7906,29 @@ is-primitive@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
 
 is-promise@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
+  integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
 
-is-regex@^1.0.4, is-regex@^1.0.5:
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
+is-regex@^1.0.4, is-regex@^1.0.5, is-regex@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz#ece38e389e490df0dc21caea2bd596f987f767ff"
+  integrity sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==
   dependencies:
-    has "^1.0.3"
+    has-symbols "^1.0.1"
 
 is-regexp@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
 
-is-resolvable@^1.0.0:
+is-resolvable@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
 
 is-stream@^1.0.1, is-stream@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+  integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
 
 is-stream@^2.0.0:
   version "2.0.0"
@@ -7043,15 +7946,10 @@ is-subset@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
 
-is-svg@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
-  dependencies:
-    html-comment-regex "^1.1.0"
-
 is-symbol@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
+  integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
   dependencies:
     has-symbols "^1.0.1"
 
@@ -7061,13 +7959,10 @@ is-text-path@^1.0.1:
   dependencies:
     text-extensions "^1.0.0"
 
-is-typedarray@~1.0.0:
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
-
-is-url@^1.2.2:
-  version "1.2.4"
-  resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+  integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
 
 is-utf8@^0.2.0:
   version "0.2.1"
@@ -7076,42 +7971,63 @@ is-utf8@^0.2.0:
 is-whitespace-character@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
+  integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+
+is-whitespace@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
+  integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38=
 
 is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+  integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
 
 is-word-character@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230"
+  integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==
 
 is-wsl@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
+
+is-wsl@^2.1.1:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+  dependencies:
+    is-docker "^2.0.0"
 
 isarray@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+  integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
 
 isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+  integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
 
 isexe@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+  integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
 isobject@^2.0.0, isobject@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+  integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
   dependencies:
     isarray "1.0.0"
 
 isobject@^3.0.0, isobject@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+  integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
 
-isomorphic-fetch@^2.1.1:
+isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9"
   dependencies:
@@ -7121,14 +8037,17 @@ isomorphic-fetch@^2.1.1:
 isstream@0.1.x, isstream@~0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+  integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
 
 istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49"
+  integrity sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==
 
 istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz#a5f63d91f0bbc0c3e479ef4c5de027335ec6d630"
+  integrity sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==
   dependencies:
     "@babel/generator" "^7.4.0"
     "@babel/parser" "^7.4.3"
@@ -7141,6 +8060,7 @@ istanbul-lib-instrument@^3.0.1, istanbul-lib-instrument@^3.3.0:
 istanbul-lib-report@^2.0.4:
   version "2.0.8"
   resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz#5a8113cd746d43c4889eba36ab10e7d50c9b4f33"
+  integrity sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==
   dependencies:
     istanbul-lib-coverage "^2.0.5"
     make-dir "^2.1.0"
@@ -7149,6 +8069,7 @@ istanbul-lib-report@^2.0.4:
 istanbul-lib-source-maps@^3.0.1:
   version "3.0.6"
   resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz#284997c48211752ec486253da97e3879defba8c8"
+  integrity sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==
   dependencies:
     debug "^4.1.1"
     istanbul-lib-coverage "^2.0.5"
@@ -7159,20 +8080,23 @@ istanbul-lib-source-maps@^3.0.1:
 istanbul-reports@^2.2.6:
   version "2.2.7"
   resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.2.7.tgz#5d939f6237d7b48393cc0959eab40cd4fd056931"
+  integrity sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==
   dependencies:
     html-escaper "^2.0.0"
 
 jest-changed-files@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039"
+  integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==
   dependencies:
     "@jest/types" "^24.9.0"
     execa "^1.0.0"
     throat "^4.0.0"
 
-jest-cli@^24.8.0:
+jest-cli@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-24.9.0.tgz#ad2de62d07472d419c6abc301fc432b98b10d2af"
+  integrity sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==
   dependencies:
     "@jest/core" "^24.9.0"
     "@jest/test-result" "^24.9.0"
@@ -7191,6 +8115,7 @@ jest-cli@^24.8.0:
 jest-config@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-24.9.0.tgz#fb1bbc60c73a46af03590719efa4825e6e4dd1b5"
+  integrity sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==
   dependencies:
     "@babel/core" "^7.1.0"
     "@jest/test-sequencer" "^24.9.0"
@@ -7222,12 +8147,14 @@ jest-diff@^24.3.0, jest-diff@^24.9.0:
 jest-docblock@^24.3.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-24.9.0.tgz#7970201802ba560e1c4092cc25cbedf5af5a8ce2"
+  integrity sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==
   dependencies:
     detect-newline "^2.1.0"
 
 jest-each@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-24.9.0.tgz#eb2da602e2a610898dbc5f1f6df3ba86b55f8b05"
+  integrity sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==
   dependencies:
     "@jest/types" "^24.9.0"
     chalk "^2.0.1"
@@ -7238,6 +8165,7 @@ jest-each@^24.9.0:
 jest-environment-jsdom@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-24.9.0.tgz#4b0806c7fc94f95edb369a69cc2778eec2b7375b"
+  integrity sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==
   dependencies:
     "@jest/environment" "^24.9.0"
     "@jest/fake-timers" "^24.9.0"
@@ -7249,6 +8177,7 @@ jest-environment-jsdom@^24.9.0:
 jest-environment-node@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3"
+  integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==
   dependencies:
     "@jest/environment" "^24.9.0"
     "@jest/fake-timers" "^24.9.0"
@@ -7259,10 +8188,12 @@ jest-environment-node@^24.9.0:
 jest-get-type@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
+  integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
 
 jest-haste-map@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-24.9.0.tgz#b38a5d64274934e21fa417ae9a9fbeb77ceaac7d"
+  integrity sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==
   dependencies:
     "@jest/types" "^24.9.0"
     anymatch "^2.0.0"
@@ -7281,6 +8212,7 @@ jest-haste-map@^24.9.0:
 jest-jasmine2@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-24.9.0.tgz#1f7b1bd3242c1774e62acabb3646d96afc3be6a0"
+  integrity sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==
   dependencies:
     "@babel/traverse" "^7.1.0"
     "@jest/environment" "^24.9.0"
@@ -7302,6 +8234,7 @@ jest-jasmine2@^24.9.0:
 jest-leak-detector@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-24.9.0.tgz#b665dea7c77100c5c4f7dfcb153b65cf07dcf96a"
+  integrity sha512-tYkFIDsiKTGwb2FG1w8hX9V0aUb2ot8zY/2nFg087dUageonw1zrLMP4W6zsRO59dPkTSKie+D4rhMuP9nRmrA==
   dependencies:
     jest-get-type "^24.9.0"
     pretty-format "^24.9.0"
@@ -7309,6 +8242,7 @@ jest-leak-detector@^24.9.0:
 jest-matcher-utils@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-24.9.0.tgz#f5b3661d5e628dffe6dd65251dfdae0e87c3a073"
+  integrity sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==
   dependencies:
     chalk "^2.0.1"
     jest-diff "^24.9.0"
@@ -7318,6 +8252,7 @@ jest-matcher-utils@^24.9.0:
 jest-message-util@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-24.9.0.tgz#527f54a1e380f5e202a8d1149b0ec872f43119e3"
+  integrity sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==
   dependencies:
     "@babel/code-frame" "^7.0.0"
     "@jest/test-result" "^24.9.0"
@@ -7331,20 +8266,24 @@ jest-message-util@^24.9.0:
 jest-mock@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-24.9.0.tgz#c22835541ee379b908673ad51087a2185c13f1c6"
+  integrity sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==
   dependencies:
     "@jest/types" "^24.9.0"
 
 jest-pnp-resolver@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a"
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
+  integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
 
 jest-regex-util@^24.3.0, jest-regex-util@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-24.9.0.tgz#c13fb3380bde22bf6575432c493ea8fe37965636"
+  integrity sha512-05Cmb6CuxaA+Ys6fjr3PhvV3bGQmO+2p2La4hFbU+W5uOc479f7FdLXUWXw4pYMAhhSZIuKHwSXSu6CsSBAXQA==
 
 jest-resolve-dependencies@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-24.9.0.tgz#ad055198959c4cfba8a4f066c673a3f0786507ab"
+  integrity sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==
   dependencies:
     "@jest/types" "^24.9.0"
     jest-regex-util "^24.3.0"
@@ -7353,6 +8292,7 @@ jest-resolve-dependencies@^24.9.0:
 jest-resolve@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-24.9.0.tgz#dff04c7687af34c4dd7e524892d9cf77e5d17321"
+  integrity sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==
   dependencies:
     "@jest/types" "^24.9.0"
     browser-resolve "^1.11.3"
@@ -7363,6 +8303,7 @@ jest-resolve@^24.9.0:
 jest-runner@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-24.9.0.tgz#574fafdbd54455c2b34b4bdf4365a23857fcdf42"
+  integrity sha512-KksJQyI3/0mhcfspnxxEOBueGrd5E4vV7ADQLT9ESaCzz02WnbdbKWIf5Mkaucoaj7obQckYPVX6JJhgUcoWWg==
   dependencies:
     "@jest/console" "^24.7.1"
     "@jest/environment" "^24.9.0"
@@ -7387,6 +8328,7 @@ jest-runner@^24.9.0:
 jest-runtime@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-24.9.0.tgz#9f14583af6a4f7314a6a9d9f0226e1a781c8e4ac"
+  integrity sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==
   dependencies:
     "@jest/console" "^24.7.1"
     "@jest/environment" "^24.9.0"
@@ -7415,10 +8357,12 @@ jest-runtime@^24.9.0:
 jest-serializer@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-24.9.0.tgz#e6d7d7ef96d31e8b9079a714754c5d5c58288e73"
+  integrity sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==
 
 jest-snapshot@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-24.9.0.tgz#ec8e9ca4f2ec0c5c87ae8f925cf97497b0e951ba"
+  integrity sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==
   dependencies:
     "@babel/types" "^7.0.0"
     "@jest/types" "^24.9.0"
@@ -7437,6 +8381,7 @@ jest-snapshot@^24.9.0:
 jest-util@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-24.9.0.tgz#7396814e48536d2e85a37de3e4c431d7cb140162"
+  integrity sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==
   dependencies:
     "@jest/console" "^24.9.0"
     "@jest/fake-timers" "^24.9.0"
@@ -7454,6 +8399,7 @@ jest-util@^24.9.0:
 jest-validate@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab"
+  integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==
   dependencies:
     "@jest/types" "^24.9.0"
     camelcase "^5.3.1"
@@ -7465,6 +8411,7 @@ jest-validate@^24.9.0:
 jest-watcher@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-24.9.0.tgz#4b56e5d1ceff005f5b88e528dc9afc8dd4ed2b3b"
+  integrity sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==
   dependencies:
     "@jest/test-result" "^24.9.0"
     "@jest/types" "^24.9.0"
@@ -7477,30 +8424,38 @@ jest-watcher@^24.9.0:
 jest-worker@^24.6.0, jest-worker@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5"
+  integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==
   dependencies:
     merge-stream "^2.0.0"
     supports-color "^6.1.0"
 
-jest@24.8.0:
-  version "24.8.0"
-  resolved "https://registry.yarnpkg.com/jest/-/jest-24.8.0.tgz#d5dff1984d0d1002196e9b7f12f75af1b2809081"
+jest@24.9.0:
+  version "24.9.0"
+  resolved "https://registry.yarnpkg.com/jest/-/jest-24.9.0.tgz#987d290c05a08b52c56188c1002e368edb007171"
+  integrity sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==
   dependencies:
     import-local "^2.0.0"
-    jest-cli "^24.8.0"
+    jest-cli "^24.9.0"
 
-js-base64@^2.1.8, js-base64@^2.1.9:
+js-base64@^2.1.8:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121"
 
-js-beautify@^1.6.14, js-beautify@^1.8.9:
-  version "1.10.3"
-  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.10.3.tgz#c73fa10cf69d3dfa52d8ed624f23c64c0a6a94c1"
+js-base64@^2.1.9:
+  version "2.6.3"
+  resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.6.3.tgz#7afdb9b57aa7717e15d370b66e8f36a9cb835dc3"
+  integrity sha512-fiUvdfCaAXoQTHdKMgTvg6IkecXDcVz6V5rlftUTclF9IKBjMizvSdQaCl/z/6TApDeby5NL+axYou3i0mu1Pg==
+
+js-beautify@^1.6.12:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.0.tgz#a056d5d3acfd4918549aae3ab039f9f3c51eebb2"
+  integrity sha512-/Tbp1OVzZjbwzwJQFIlYLm9eWQ+3aYbBXLSaqb1mEJzhcQAfrqMMQYtjb6io+U6KpD0ID4F+Id3/xcjH3l/sqA==
   dependencies:
     config-chain "^1.1.12"
     editorconfig "^0.15.3"
     glob "^7.1.3"
-    mkdirp "~0.5.1"
-    nopt "~4.0.1"
+    mkdirp "^1.0.4"
+    nopt "^5.0.0"
 
 js-levenshtein@^1.1.3:
   version "1.1.6"
@@ -7509,25 +8464,32 @@ js-levenshtein@^1.1.3:
 "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+  integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
-js-tokens@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-
-js-yaml@^3.10.0, js-yaml@^3.12.0, js-yaml@^3.13.0, js-yaml@^3.13.1:
+js-yaml@^3.12.0, js-yaml@^3.13.0:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
   dependencies:
     argparse "^1.0.7"
     esprima "^4.0.0"
 
+js-yaml@^3.13.1:
+  version "3.14.0"
+  resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
+  integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
+  dependencies:
+    argparse "^1.0.7"
+    esprima "^4.0.0"
+
 jsbn@~0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+  integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
 
 jsdom@^11.5.1:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.12.0.tgz#1a80d40ddd378a1de59656e9e6dc5a3ba8657bc8"
+  integrity sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==
   dependencies:
     abab "^2.0.0"
     acorn "^5.5.3"
@@ -7556,40 +8518,10 @@ jsdom@^11.5.1:
     ws "^5.2.0"
     xml-name-validator "^3.0.0"
 
-jsdom@^14.1.0:
-  version "14.1.0"
-  resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-14.1.0.tgz#916463b6094956b0a6c1782c94e380cd30e1981b"
-  dependencies:
-    abab "^2.0.0"
-    acorn "^6.0.4"
-    acorn-globals "^4.3.0"
-    array-equal "^1.0.0"
-    cssom "^0.3.4"
-    cssstyle "^1.1.1"
-    data-urls "^1.1.0"
-    domexception "^1.0.1"
-    escodegen "^1.11.0"
-    html-encoding-sniffer "^1.0.2"
-    nwsapi "^2.1.3"
-    parse5 "5.1.0"
-    pn "^1.1.0"
-    request "^2.88.0"
-    request-promise-native "^1.0.5"
-    saxes "^3.1.9"
-    symbol-tree "^3.2.2"
-    tough-cookie "^2.5.0"
-    w3c-hr-time "^1.0.1"
-    w3c-xmlserializer "^1.1.2"
-    webidl-conversions "^4.0.2"
-    whatwg-encoding "^1.0.5"
-    whatwg-mimetype "^2.3.0"
-    whatwg-url "^7.0.0"
-    ws "^6.1.2"
-    xml-name-validator "^3.0.0"
-
 jsesc@^2.5.1:
   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"
@@ -7598,6 +8530,7 @@ jsesc@~0.5.0:
 json-loader@0.5.7:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+  integrity sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==
 
 json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2:
   version "1.0.2"
@@ -7606,42 +8539,51 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet
 json-schema-traverse@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+  integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
 
 json-schema@0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+  integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
 
 json-stable-stringify-without-jsonify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+  integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
 
 json-stringify-safe@5.0.1, json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
   version "5.0.1"
   resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+  integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
 
 json3@^3.3.2:
   version "3.3.3"
   resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81"
+  integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==
 
-json5@^0.5.0, json5@^0.5.1:
+json5@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+  integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
 
 json5@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+  integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
   dependencies:
     minimist "^1.2.0"
 
-json5@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6"
+json5@^2.1.0, json5@^2.1.2:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43"
+  integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==
   dependencies:
-    minimist "^1.2.0"
+    minimist "^1.2.5"
 
 jsonfile@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+  integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=
   optionalDependencies:
     graceful-fs "^4.1.6"
 
@@ -7652,6 +8594,7 @@ jsonparse@^1.2.0:
 jsprim@^1.2.2:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+  integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
   dependencies:
     assert-plus "1.0.0"
     extsprintf "1.3.0"
@@ -7703,6 +8646,14 @@ jsx-ast-utils@^2.0.1, jsx-ast-utils@^2.1.0:
     array-includes "^3.0.3"
     object.assign "^4.1.0"
 
+jsx-ast-utils@^2.2.3:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.4.1.tgz#1114a4c1209481db06c690c2b4f488cc665f657e"
+  integrity sha512-z1xSldJ6imESSzOjd3NNkieVJKRlKYSOtMG8SFyCj2FIrvSaSuli/WjpBkEzCBoR9bYYYFgqJw61Xhu7Lcgk+w==
+  dependencies:
+    array-includes "^3.1.1"
+    object.assign "^4.1.0"
+
 keycode@^2.1.7:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04"
@@ -7710,30 +8661,36 @@ keycode@^2.1.7:
 killable@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
+  integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==
 
 kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+  integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
   dependencies:
     is-buffer "^1.1.5"
 
 kind-of@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+  integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
   dependencies:
     is-buffer "^1.1.5"
 
 kind-of@^5.0.0, kind-of@^5.0.2:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+  integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
 
 kind-of@^6.0.0, kind-of@^6.0.2:
   version "6.0.3"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+  integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
 
 kleur@^3.0.3:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+  integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
 
 lcid@^1.0.0:
   version "1.0.0"
@@ -7744,12 +8701,14 @@ lcid@^1.0.0:
 lcid@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf"
+  integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==
   dependencies:
     invert-kv "^2.0.0"
 
 left-pad@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.3.0.tgz#5b8a3a7765dfe001261dde915589e782f8c94d1e"
+  integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==
 
 lerna-changelog@0.8.2:
   version "0.8.2"
@@ -7768,10 +8727,12 @@ lerna-changelog@0.8.2:
 leven@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+  integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
 
 levn@^0.3.0, levn@~0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+  integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
   dependencies:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
@@ -7858,6 +8819,7 @@ load-json-file@^1.0.0, load-json-file@^1.1.0:
 load-json-file@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b"
+  integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs=
   dependencies:
     graceful-fs "^4.1.2"
     parse-json "^4.0.0"
@@ -7865,31 +8827,35 @@ load-json-file@^4.0.0:
     strip-bom "^3.0.0"
 
 loader-fs-cache@^1.0.0:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz#54cedf6b727e1779fd8f01205f05f6e88706f086"
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz#f08657646d607078be2f0a032f8bd69dd6f277d9"
+  integrity sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==
   dependencies:
     find-cache-dir "^0.1.1"
-    mkdirp "0.5.1"
+    mkdirp "^0.5.1"
 
-loader-runner@^2.3.0:
+loader-runner@^2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357"
+  integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==
 
 loader-utils@^0.2.16:
   version "0.2.17"
   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+  integrity sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=
   dependencies:
     big.js "^3.1.3"
     emojis-list "^2.0.0"
     json5 "^0.5.0"
     object-assign "^4.0.1"
 
-loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.2, loader-utils@^1.2.3:
-  version "1.2.3"
-  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
+loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.1, loader-utils@^1.2.3, loader-utils@^1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613"
+  integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
   dependencies:
     big.js "^5.2.2"
-    emojis-list "^2.0.0"
+    emojis-list "^3.0.0"
     json5 "^1.0.1"
 
 localforage@1.7.3:
@@ -7908,6 +8874,7 @@ locate-path@^2.0.0:
 locate-path@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+  integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
   dependencies:
     p-locate "^3.0.0"
     path-exists "^3.0.0"
@@ -7918,9 +8885,15 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
-lodash-es@^4.17.5, lodash-es@^4.2.1:
+lodash-es@^4.17.11, lodash-es@^4.2.1:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.15.tgz#21bd96839354412f23d7a10340e5eac6ee455d78"
+  integrity sha512-rlrc3yU3+JNOpZ9zj5pQtxnx2THmvRykwL4Xlxoa8I9lHBlVbbyPhgyPMioxVZ4NqyxaVVtaJnzsyOidQIhyyQ==
+
+lodash-id@^0.14.0:
+  version "0.14.0"
+  resolved "https://registry.yarnpkg.com/lodash-id/-/lodash-id-0.14.0.tgz#baf48934e543a1b5d6346f8c84698b1a8c803896"
+  integrity sha1-uvSJNOVDobXWNG+MhGmLGoyAOJY=
 
 lodash._reinterpolate@^3.0.0:
   version "3.0.0"
@@ -7937,14 +8910,12 @@ lodash.assigninwith@^4.0.0:
 lodash.camelcase@^4.3.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
-
-lodash.clone@^4.5.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
+  integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
 
 lodash.clonedeep@^4.5.0:
   version "4.5.0"
   resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
 
 lodash.debounce@4.0.8:
   version "4.0.8"
@@ -7977,10 +8948,6 @@ lodash.isplainobject@^4.0.6:
   version "4.0.6"
   resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
 
-lodash.memoize@^4.1.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
-
 lodash.merge@^4.6.0:
   version "4.6.2"
   resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
@@ -7988,6 +8955,7 @@ lodash.merge@^4.6.0:
 lodash.once@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+  integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
 
 lodash.rest@^4.0.0:
   version "4.0.5"
@@ -7996,6 +8964,7 @@ lodash.rest@^4.0.0:
 lodash.sortby@^4.7.0:
   version "4.7.0"
   resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
+  integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
 
 lodash.template@^4.0.2:
   version "4.5.0"
@@ -8018,34 +8987,30 @@ lodash.unionwith@4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/lodash.unionwith/-/lodash.unionwith-4.6.0.tgz#74d140b5ca8146e6c643c3724f5152538d9ac1f0"
 
-lodash.uniq@^4.5.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
-
-lodash@4.17.11:
-  version "4.17.11"
-  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+lodash@4, lodash@^4.17.20:
+  version "4.17.20"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
+  integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
 
 lodash@4.17.13:
   version "4.17.13"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.13.tgz#0bdc3a6adc873d2f4e0c4bac285df91b64fc7b93"
 
-lodash@4.17.15, lodash@^4.0.0, lodash@^4.14.2, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1, lodash@~4.17.10:
+lodash@4.17.15, lodash@^4.0.0, lodash@^4.14.2, lodash@^4.15.0, lodash@^4.17.15, lodash@~4.17.10:
   version "4.17.15"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
 
+lodash@4.17.19, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.1:
+  version "4.17.19"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
+  integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
+
 log-symbols@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18"
   dependencies:
     chalk "^1.0.0"
 
-log-symbols@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
-  dependencies:
-    chalk "^2.0.1"
-
 log-symbols@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
@@ -8067,13 +9032,19 @@ loglevel-colored-level-prefix@^1.0.0:
     chalk "^1.1.3"
     loglevel "^1.4.1"
 
-loglevel@^1.4.1, loglevel@^1.6.3, loglevel@^1.6.6:
+loglevel@^1.4.1, loglevel@^1.6.6:
   version "1.6.6"
   resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312"
 
+long@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+  integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==
+
 loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+  integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
   dependencies:
     js-tokens "^3.0.0 || ^4.0.0"
 
@@ -8089,11 +9060,23 @@ loud-rejection@^1.0.0:
     currently-unhandled "^0.4.1"
     signal-exit "^3.0.0"
 
+lowdb@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064"
+  integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==
+  dependencies:
+    graceful-fs "^4.1.3"
+    is-promise "^2.1.0"
+    lodash "4"
+    pify "^3.0.0"
+    steno "^0.4.1"
+
 lower-case@^1.1.1:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+  integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw=
 
-lru-cache@^4.0.1, lru-cache@^4.1.5:
+lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.5:
   version "4.1.5"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
   dependencies:
@@ -8103,22 +9086,30 @@ lru-cache@^4.0.1, lru-cache@^4.1.5:
 lru-cache@^5.1.1:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
   dependencies:
     yallist "^3.0.2"
 
+lunr@^2.3.6:
+  version "2.3.9"
+  resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1"
+  integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==
+
 luxon@^1.21.3:
   version "1.22.0"
   resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.22.0.tgz#639525c7c69e594953c7b142794466b8ea85b868"
 
-magic-string@^0.22.4:
-  version "0.22.5"
-  resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+make-dir@^1.0.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+  integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
   dependencies:
-    vlq "^0.2.2"
+    pify "^3.0.0"
 
 make-dir@^2.0.0, make-dir@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+  integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
   dependencies:
     pify "^4.0.1"
     semver "^5.6.0"
@@ -8126,6 +9117,7 @@ make-dir@^2.0.0, make-dir@^2.1.0:
 make-event-props@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/make-event-props/-/make-event-props-1.2.0.tgz#96b87d88919533b8f8934b58b4c3d5679459a0cf"
+  integrity sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg==
 
 make-fetch-happen@^4.0.1:
   version "4.0.2"
@@ -8146,22 +9138,21 @@ make-fetch-happen@^4.0.1:
 makeerror@1.0.x:
   version "1.0.11"
   resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+  integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
   dependencies:
     tmpl "1.0.x"
 
-mamacro@^0.0.3:
-  version "0.0.3"
-  resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
-
 map-age-cleaner@^0.1.1:
   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"
 
 map-cache@^0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+  integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
 
 map-obj@^1.0.0, map-obj@^1.0.1:
   version "1.0.1"
@@ -8174,12 +9165,14 @@ map-obj@^2.0.0:
 map-visit@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+  integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
   dependencies:
     object-visit "^1.0.0"
 
 markdown-escapes@^1.0.0:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535"
+  integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
 
 math-random@^1.0.1:
   version "1.0.4"
@@ -8188,14 +9181,25 @@ math-random@^1.0.1:
 md5.js@^1.3.4:
   version "1.3.5"
   resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f"
+  integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==
   dependencies:
     hash-base "^3.0.0"
     inherits "^2.0.1"
     safe-buffer "^5.1.2"
 
+md5@^2.2.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f"
+  integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==
+  dependencies:
+    charenc "0.0.2"
+    crypt "0.0.2"
+    is-buffer "~1.1.6"
+
 mdast-add-list-metadata@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/mdast-add-list-metadata/-/mdast-add-list-metadata-1.0.1.tgz#95e73640ce2fc1fa2dcb7ec443d09e2bfe7db4cf"
+  integrity sha512-fB/VP4MJ0LaRsog7hGPxgOrSL3gE/2uEdZyDuSEnKCv/8IkYHiDkIQSbChiJoHyxZZXZ9bzckyRk+vNxFzh8rA==
   dependencies:
     unist-util-visit-parents "1.1.2"
 
@@ -8203,13 +9207,10 @@ mdn-data@2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
 
-mdn-data@~1.1.0:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
-
 media-typer@0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+  integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
 
 mem@^1.1.0:
   version "1.1.0"
@@ -8220,6 +9221,7 @@ mem@^1.1.0:
 mem@^4.0.0:
   version "4.3.0"
   resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178"
+  integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==
   dependencies:
     map-age-cleaner "^0.1.1"
     mimic-fn "^2.0.0"
@@ -8228,10 +9230,12 @@ mem@^4.0.0:
 memoize-one@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/memoize-one/-/memoize-one-4.1.0.tgz#a2387c58c03fff27ca390c31b764a79addf3f906"
+  integrity sha512-2GApq0yI/b22J2j9rhbrAlsHb0Qcz+7yWxeLG8h+95sl1XPUgeLimQSOdur4Vw7cUhrBHwaUZxWFZueojqNRzA==
 
-memory-fs@^0.4.1, memory-fs@~0.4.1:
+memory-fs@^0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+  integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=
   dependencies:
     errno "^0.1.3"
     readable-stream "^2.0.1"
@@ -8239,6 +9243,7 @@ memory-fs@^0.4.1, memory-fs@~0.4.1:
 memory-fs@^0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c"
+  integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==
   dependencies:
     errno "^0.1.3"
     readable-stream "^2.0.1"
@@ -8293,26 +9298,24 @@ meow@^5.0.0:
 merge-class-names@^1.1.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/merge-class-names/-/merge-class-names-1.3.0.tgz#c4cdc1a981a81dd9afc27aa4287e912a337c5dee"
+  integrity sha512-k0Qaj36VBpKgdc8c188LEZvo6v/zzry/FUufwopWbMSp6/knfVFU/KIB55/hJjeIpg18IH2WskXJCRnM/1BrdQ==
 
 merge-descriptors@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+  integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
 
 merge-options@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/merge-options/-/merge-options-1.0.1.tgz#2a64b24457becd4e4dc608283247e94ce589aa32"
+  integrity sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==
   dependencies:
     is-plain-obj "^1.1"
 
-merge-source-map@1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f"
-  dependencies:
-    source-map "^0.5.6"
-
 merge-stream@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+  integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
 
 merge2@^1.2.3, merge2@^1.3.0:
   version "1.3.0"
@@ -8321,14 +9324,17 @@ merge2@^1.2.3, merge2@^1.3.0:
 methods@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+  integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
 
 microee@0.0.6, microee@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/microee/-/microee-0.0.6.tgz#a12bdb0103681e8b126a9b071eba4c467c78fffe"
+  integrity sha1-oSvbAQNoHosSapsHHrpMRnx4//4=
 
 micromatch@3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.0.tgz#5102d4eaf20b6997d6008e3acfe1c44a3fa815e2"
+  integrity sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==
   dependencies:
     arr-diff "^4.0.0"
     array-unique "^0.3.2"
@@ -8362,7 +9368,7 @@ micromatch@^2.1.5:
     parse-glob "^3.0.4"
     regex-cache "^0.4.2"
 
-micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8:
+micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
   dependencies:
@@ -8390,56 +9396,73 @@ micromatch@^4.0.2:
 miller-rabin@^4.0.0:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+  integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==
   dependencies:
     bn.js "^4.0.0"
     brorand "^1.0.1"
 
-mime-db@1.43.0, "mime-db@>= 1.43.0 < 2":
-  version "1.43.0"
-  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58"
+mime-db@1.44.0, "mime-db@>= 1.43.0 < 2":
+  version "1.44.0"
+  resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
+  integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
 
-mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
-  version "2.1.26"
-  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06"
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
+  version "2.1.27"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
+  integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
   dependencies:
-    mime-db "1.43.0"
+    mime-db "1.44.0"
 
 mime@1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
 
 mime@^2.4.0, mime@^2.4.4:
-  version "2.4.4"
-  resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
+  version "2.4.6"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
+  integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==
 
 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==
 
 mimic-fn@^2.0.0, mimic-fn@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+  integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
 min-document@^2.19.0:
   version "2.19.0"
   resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+  integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
   dependencies:
     dom-walk "^0.1.0"
 
 mini-create-react-context@^0.3.0:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189"
+  integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw==
   dependencies:
     "@babel/runtime" "^7.4.0"
     gud "^1.0.0"
     tiny-warning "^1.0.2"
 
-mini-css-extract-plugin@0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.7.0.tgz#5ba8290fbb4179a43dd27cca444ba150bee743a0"
+mini-create-react-context@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040"
+  integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    tiny-warning "^1.0.3"
+
+mini-css-extract-plugin@0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
+  integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==
   dependencies:
     loader-utils "^1.1.0"
-    normalize-url "1.9.1"
     schema-utils "^1.0.0"
     webpack-sources "^1.1.0"
 
@@ -8449,17 +9472,27 @@ minilog@3.1.0, "minilog@https://github.com/cozy/minilog.git#master":
   dependencies:
     microee "0.0.6"
 
+"minilog@git+https://github.com/cozy/minilog.git#master":
+  version "3.1.0"
+  uid f01f7d9dfe20981177dd34b9662c2f077d818f82
+  resolved "git+https://github.com/cozy/minilog.git#f01f7d9dfe20981177dd34b9662c2f077d818f82"
+  dependencies:
+    microee "0.0.6"
+
 minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+  integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
 
 minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+  integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
 
-"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2:
+"minimatch@2 || 3", minimatch@^3.0.4, minimatch@~3.0.2:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
   dependencies:
     brace-expansion "^1.1.7"
 
@@ -8473,11 +9506,17 @@ minimist-options@^3.0.1:
 minimist@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+  integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
 
-minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+minimist@^1.1.0, minimist@^1.1.3:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
 
+minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
+  version "1.2.5"
+  resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+  integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
 minimist@~0.0.1:
   version "0.0.10"
   resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
@@ -8497,9 +9536,26 @@ minizlib@^1.2.1:
   dependencies:
     minipass "^2.9.0"
 
+mississippi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+  integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==
+  dependencies:
+    concat-stream "^1.5.0"
+    duplexify "^3.4.2"
+    end-of-stream "^1.1.0"
+    flush-write-stream "^1.0.0"
+    from2 "^2.1.0"
+    parallel-transform "^1.1.0"
+    pump "^2.0.1"
+    pumpify "^1.3.3"
+    stream-each "^1.1.0"
+    through2 "^2.0.0"
+
 mississippi@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022"
+  integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==
   dependencies:
     concat-stream "^1.5.0"
     duplexify "^3.4.2"
@@ -8515,20 +9571,34 @@ mississippi@^3.0.0:
 mitt@1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.2.tgz#380e61480d6a615b660f07abb60d51e0a4e4bed6"
+  integrity sha1-OA5hSA1qYVtmDwertg1R4KTkvtY=
 
 mixin-deep@^1.2.0:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+  integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
   dependencies:
     for-in "^1.0.2"
     is-extendable "^1.0.1"
 
-mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+mkdirp@0.x.x, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@~0.5.1, mkdirp@~0.5.x:
+  version "0.5.5"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+  integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+  dependencies:
+    minimist "^1.2.5"
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
   dependencies:
     minimist "0.0.8"
 
+mkdirp@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
+  integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
+
 modify-values@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
@@ -8547,6 +9617,17 @@ moo@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.1.tgz#7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4"
 
+morgan@^1.9.1:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7"
+  integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==
+  dependencies:
+    basic-auth "~2.0.1"
+    debug "2.6.9"
+    depd "~2.0.0"
+    on-finished "~2.3.0"
+    on-headers "~1.0.2"
+
 mout@~0.5.0:
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/mout/-/mout-0.5.0.tgz#ff967566a90f29595e9cb8b6e7800a5b56635583"
@@ -8554,6 +9635,7 @@ mout@~0.5.0:
 move-concurrently@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+  integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=
   dependencies:
     aproba "^1.1.1"
     copy-concurrently "^1.0.0"
@@ -8565,22 +9647,36 @@ move-concurrently@^1.0.1:
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
 ms@2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+  integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
 
 ms@^2.0.0, ms@^2.1.1:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
 
+msgpack5@^4.0.2:
+  version "4.2.1"
+  resolved "https://registry.yarnpkg.com/msgpack5/-/msgpack5-4.2.1.tgz#007233691af34c4168cea9477cb3236aae854f03"
+  integrity sha512-Xo7nE9ZfBVonQi1rSopNAqPdts/QHyuSEUwIEzAkB+V2FtmkkLUbP6MyVqVVQxsZYI65FpvW3Bb8Z9ZWEjbgHQ==
+  dependencies:
+    bl "^2.0.1"
+    inherits "^2.0.3"
+    readable-stream "^2.3.6"
+    safe-buffer "^5.1.2"
+
 multicast-dns-service-types@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+  integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=
 
 multicast-dns@^6.0.1:
   version "6.2.3"
   resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+  integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==
   dependencies:
     dns-packet "^1.3.1"
     thunky "^1.0.2"
@@ -8588,10 +9684,12 @@ multicast-dns@^6.0.1:
 mute-stream@0.0.7:
   version "0.0.7"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+  integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
 
 mute-stream@0.0.8, mute-stream@~0.0.4:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
+  integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
 mz@^2.4.0:
   version "2.7.0"
@@ -8601,13 +9699,19 @@ mz@^2.4.0:
     object-assign "^4.0.1"
     thenify-all "^1.0.0"
 
-nan@^2.12.1, nan@^2.13.2:
+nan@^2.12.1:
+  version "2.14.1"
+  resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
+  integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
+
+nan@^2.13.2:
   version "2.14.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
 
 nanomatch@^1.2.1, nanomatch@^1.2.9:
   version "1.2.13"
   resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+  integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
   dependencies:
     arr-diff "^4.0.0"
     array-unique "^0.3.2"
@@ -8624,10 +9728,12 @@ nanomatch@^1.2.1, nanomatch@^1.2.9:
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+  integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
 
 ncp@1.0.x:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/ncp/-/ncp-1.0.1.tgz#d15367e5cb87432ba117d2bf80fdf45aecfb4246"
+  integrity sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=
 
 nearley@^2.7.10:
   version "2.19.1"
@@ -8642,35 +9748,48 @@ nearley@^2.7.10:
 negotiator@0.6.2:
   version "0.6.2"
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
+  integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
-neo-async@^2.5.0, neo-async@^2.6.0, neo-async@^2.6.1:
+neo-async@^2.5.0:
+  version "2.6.2"
+  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+neo-async@^2.6.0, neo-async@^2.6.1:
   version "2.6.1"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c"
 
 nice-try@^1.0.4:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+  integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
 no-case@^2.2.0:
   version "2.3.2"
   resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+  integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==
   dependencies:
     lower-case "^1.1.1"
 
-node-addon-api@^1.7.1:
-  version "1.7.1"
-  resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.1.tgz#cf813cd69bb8d9100f6bdca6755fc268f54ac492"
+nocache@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/nocache/-/nocache-2.1.0.tgz#120c9ffec43b5729b1d5de88cd71aa75a0ba491f"
+  integrity sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==
 
-node-cache@^4.1.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/node-cache/-/node-cache-4.2.1.tgz#efd8474dee4edec4138cdded580f5516500f7334"
+nock@^12.0.3:
+  version "12.0.3"
+  resolved "https://registry.yarnpkg.com/nock/-/nock-12.0.3.tgz#83f25076dbc4c9aa82b5cdf54c9604c7a778d1c9"
+  integrity sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==
   dependencies:
-    clone "2.x"
-    lodash "^4.17.15"
+    debug "^4.1.0"
+    json-stringify-safe "^5.0.1"
+    lodash "^4.17.13"
+    propagate "^2.0.0"
 
 node-ensure@^0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/node-ensure/-/node-ensure-0.0.0.tgz#ecae764150de99861ec5c810fd5d096b183932a7"
+  integrity sha1-7K52QVDemYYexcgQ/V0Jaxg5Mqc=
 
 node-fetch-npm@^2.0.2:
   version "2.0.2"
@@ -8680,7 +9799,7 @@ node-fetch-npm@^2.0.2:
     json-parse-better-errors "^1.0.0"
     safe-buffer "^5.1.1"
 
-node-fetch@2.6.0:
+node-fetch@2.6.0, node-fetch@^2.0.0:
   version "2.6.0"
   resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
   integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
@@ -8695,10 +9814,17 @@ node-fetch@^1.0.1:
 node-forge@0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579"
+  integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
 
-node-forge@^0.7.1:
-  version "0.7.6"
-  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
+node-forge@^0.8.5:
+  version "0.8.5"
+  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.5.tgz#57906f07614dc72762c84cef442f427c0e1b86ee"
+  integrity sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==
+
+node-forge@^0.9.0:
+  version "0.9.2"
+  resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.2.tgz#b35a44c28889b2ea55cabf8c79e3563f9676190a"
+  integrity sha512-naKSScof4Wn+aoHU6HBsifh92Zeicm1GDQKd1vp3Y/kOi8ub0DozCa9KpvYNCXslFHYRmLNiqRopGdTGwNLpNw==
 
 node-gyp@^3.8.0:
   version "3.8.0"
@@ -8720,10 +9846,28 @@ node-gyp@^3.8.0:
 node-int64@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+  integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+node-jose@^1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/node-jose/-/node-jose-1.1.4.tgz#af3f44a392e586d26b123b0e12dc09bef1e9863b"
+  integrity sha512-L31IFwL3pWWcMHxxidCY51ezqrDXMkvlT/5pLTfNw5sXmmOLJuN6ug7txzF/iuZN55cRpyOmoJrotwBQIoo5Lw==
+  dependencies:
+    base64url "^3.0.1"
+    browserify-zlib "^0.2.0"
+    buffer "^5.5.0"
+    es6-promise "^4.2.8"
+    lodash "^4.17.15"
+    long "^4.0.0"
+    node-forge "^0.8.5"
+    process "^0.11.10"
+    react-zlib-js "^1.0.4"
+    uuid "^3.3.3"
 
-node-libs-browser@^2.0.0:
+node-libs-browser@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425"
+  integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==
   dependencies:
     assert "^1.1.1"
     browserify-zlib "^0.2.0"
@@ -8752,10 +9896,12 @@ node-libs-browser@^2.0.0:
 node-modules-regexp@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
+  integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
 
 node-notifier@^5.4.2:
   version "5.4.3"
   resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50"
+  integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q==
   dependencies:
     growly "^1.3.0"
     is-wsl "^1.1.0"
@@ -8766,17 +9912,17 @@ node-notifier@^5.4.2:
 node-polyglot@^2.2.2, node-polyglot@^2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/node-polyglot/-/node-polyglot-2.4.0.tgz#0d2717ed06640d9ff48a2aebe8d13e39ef03518f"
+  integrity sha512-KRzKwzMWm3wSAjOSop7/WwNyzaMkCe9ddkwXTQsIZEJmvEnqy/bCqLpAVw6xBszKfy4iLdYVA0d83L+cIkYPbA==
   dependencies:
     for-each "^0.3.3"
     has "^1.0.3"
     string.prototype.trim "^1.1.2"
     warning "^4.0.3"
 
-node-releases@^1.1.46:
-  version "1.1.47"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4"
-  dependencies:
-    semver "^6.3.0"
+node-releases@^1.1.46, node-releases@^1.1.58:
+  version "1.1.59"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.59.tgz#4d648330641cec704bff10f8e4fe28e453ab8e8e"
+  integrity sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==
 
 node-sass@^4.13.0:
   version "4.13.1"
@@ -8806,21 +9952,17 @@ node-sass@^4.13.0:
   dependencies:
     abbrev "1"
 
-nopt@~4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+nopt@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
+  integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==
   dependencies:
     abbrev "1"
-    osenv "^0.1.4"
 
 normalize-git-url@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4"
 
-normalize-html-whitespace@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34"
-
 normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5, normalize-package-data@^2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
@@ -8833,37 +9975,28 @@ normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-
 normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+  integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
   dependencies:
     remove-trailing-separator "^1.0.1"
 
-normalize-path@^3.0.0:
+normalize-path@^3.0.0, normalize-path@~3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+  integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
 
 normalize-range@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+  integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=
 
 normalize-scroll-left@^0.1.2:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/normalize-scroll-left/-/normalize-scroll-left-0.1.2.tgz#6b79691ba79eb5fb107fa5edfbdc06b55caee2aa"
 
-normalize-url@1.9.1:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
-  dependencies:
-    object-assign "^4.0.1"
-    prepend-http "^1.0.0"
-    query-string "^4.1.0"
-    sort-keys "^1.0.0"
-
-normalize-url@^3.0.0:
-  version "3.3.0"
-  resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
-
 normalize.css@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/normalize.css/-/normalize.css-7.0.0.tgz#abfb1dd82470674e0322b53ceb1aaf412938e4bf"
+  integrity sha1-q/sd2CRwZ04DIrU86xqvQSk45L8=
 
 npm-run-all@^4.1.5:
   version "4.1.5"
@@ -8882,6 +10015,7 @@ npm-run-all@^4.1.5:
 npm-run-path@^2.0.0:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+  integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
   dependencies:
     path-key "^2.0.0"
 
@@ -8903,6 +10037,7 @@ npm-run-path@^3.0.0:
 nth-check@^1.0.2, nth-check@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
+  integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
   dependencies:
     boolbase "~1.0.0"
 
@@ -8913,30 +10048,35 @@ null-check@^1.0.0:
 num2fraction@^1.2.2:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+  integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
 
 number-is-nan@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+  integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
 
-nwsapi@^2.0.7, nwsapi@^2.1.3:
+nwsapi@^2.0.7:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
 
 oauth-sign@~0.9.0:
   version "0.9.0"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+  integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
 
 object-assign@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
 
-object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
 
 object-copy@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+  integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
   dependencies:
     copy-descriptor "^0.1.0"
     define-property "^0.2.5"
@@ -8945,37 +10085,46 @@ object-copy@^0.1.0:
 object-hash@^1.1.4:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz#fde452098a951cb145f039bb7d455449ddc126df"
+  integrity sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==
 
 object-hash@^2.0.3:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.0.3.tgz#d12db044e03cd2ca3d77c0570d87225b02e1e6ea"
   integrity sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==
 
-object-inspect@^1.6.0, object-inspect@^1.7.0:
+object-inspect@^1.6.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67"
 
-object-inspect@~1.4.0:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4"
+object-inspect@^1.7.0:
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
+  integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
 
 object-is@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4"
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6"
+  integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
-object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1:
+object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+  integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
 
 object-visit@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+  integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
   dependencies:
     isobject "^3.0.0"
 
 object.assign@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da"
+  integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==
   dependencies:
     define-properties "^1.1.2"
     function-bind "^1.1.1"
@@ -8991,6 +10140,15 @@ object.entries@^1.0.4, object.entries@^1.1.0:
     function-bind "^1.1.1"
     has "^1.0.3"
 
+object.entries@^1.1.1:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.2.tgz#bc73f00acb6b6bb16c203434b10f9a7e797d3add"
+  integrity sha512-BQdB9qKmb/HyNdMNWVr7O3+z5MUIx3aiegEIJqjMBbBf0YT9RRxTJSim4mzFqtyr7PDAHigq0N9dO0m0tRakQA==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+    has "^1.0.3"
+
 object.fromentries@^2.0.0, object.fromentries@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.2.tgz#4a09c9b9bb3843dd0f89acdb517a794d4f355ac9"
@@ -9003,6 +10161,7 @@ object.fromentries@^2.0.0, object.fromentries@^2.0.2:
 object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
+  integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
@@ -9017,12 +10176,14 @@ object.omit@^2.0.0:
 object.pick@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+  integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
   dependencies:
     isobject "^3.0.1"
 
-object.values@^1.0.4, object.values@^1.1.0:
+object.values@^1.0.4, object.values@^1.1.0, object.values@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz#68a99ecde356b7e9295a3c5e0ce31dc8c953de5e"
+  integrity sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
@@ -9032,30 +10193,36 @@ object.values@^1.0.4, object.values@^1.1.0:
 obuf@^1.0.0, obuf@^1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+  integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
 
 on-finished@~2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+  integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
   dependencies:
     ee-first "1.1.1"
 
 on-headers@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f"
+  integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
 
 once@^1.3.0, once@^1.3.1, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+  integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
   dependencies:
     wrappy "1"
 
 onecolor@^3.0.5:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/onecolor/-/onecolor-3.1.0.tgz#b72522270a49569ac20d244b3cd40fe157fda4d2"
+  integrity sha512-YZSypViXzu3ul5LMu/m6XjJ9ol8qAy9S2VjHl5E6UlhUH1KGKWabyEJifn0Jjpw23bYDzC2ucKMPGiH5kfwSGQ==
 
 onetime@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+  integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=
   dependencies:
     mimic-fn "^1.0.0"
 
@@ -9065,6 +10232,22 @@ onetime@^5.1.0:
   dependencies:
     mimic-fn "^2.1.0"
 
+open@7.0.4:
+  version "7.0.4"
+  resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83"
+  integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ==
+  dependencies:
+    is-docker "^2.0.0"
+    is-wsl "^2.1.1"
+
+open@^7.0.2:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/open/-/open-7.1.0.tgz#68865f7d3cb238520fa1225a63cf28bcf8368a1c"
+  integrity sha512-lLPI5KgOwEYCDKXf4np7y1PBEkj7HYIyP2DY8mVDRnx0VIIu6bNrRB0R66TuO7Mack6EnTNLm4uvcl1UoklTpA==
+  dependencies:
+    is-docker "^2.0.0"
+    is-wsl "^2.1.1"
+
 opencollective-postinstall@^2.0.2:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89"
@@ -9072,8 +10255,9 @@ opencollective-postinstall@^2.0.2:
 opener@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
+  integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
 
-opn@^5.1.0, opn@^5.5.0:
+opn@^5.5.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc"
   dependencies:
@@ -9089,6 +10273,7 @@ optimist@^0.6.1:
 optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3:
   version "0.8.3"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+  integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
   dependencies:
     deep-is "~0.1.3"
     fast-levenshtein "~2.0.6"
@@ -9097,30 +10282,22 @@ optionator@^0.8.1, optionator@^0.8.2, optionator@^0.8.3:
     type-check "~0.3.2"
     word-wrap "~1.2.3"
 
-ora@^2.1.0:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b"
-  dependencies:
-    chalk "^2.3.1"
-    cli-cursor "^2.1.0"
-    cli-spinners "^1.1.0"
-    log-symbols "^2.2.0"
-    strip-ansi "^4.0.0"
-    wcwidth "^1.0.1"
-
 original@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
+  integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
   dependencies:
     url-parse "^1.4.3"
 
 os-browserify@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+  integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=
 
 os-homedir@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+  integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M=
 
 os-locale@^1.4.0:
   version "1.4.0"
@@ -9147,10 +10324,12 @@ os-locale@^3.0.0, os-locale@^3.1.0:
 os-tmpdir@^1.0.0, os-tmpdir@~1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+  integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
 
-osenv@0, osenv@^0.1.4:
+osenv@0:
   version "0.1.5"
   resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+  integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
   dependencies:
     os-homedir "^1.0.0"
     os-tmpdir "^1.0.0"
@@ -9158,16 +10337,19 @@ osenv@0, osenv@^0.1.4:
 p-defer@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c"
+  integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=
 
 p-each-series@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71"
+  integrity sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=
   dependencies:
     p-reduce "^1.0.0"
 
 p-finally@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+  integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
 
 p-finally@^2.0.0:
   version "2.0.1"
@@ -9176,16 +10358,18 @@ p-finally@^2.0.0:
 p-is-promise@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e"
+  integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==
 
-p-limit@^1.1.0:
+p-limit@^1.0.0, p-limit@^1.1.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
   dependencies:
     p-try "^1.0.0"
 
 p-limit@^2.0.0, p-limit@^2.2.0:
-  version "2.2.2"
-  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e"
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+  integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
   dependencies:
     p-try "^2.0.0"
 
@@ -9198,6 +10382,7 @@ p-locate@^2.0.0:
 p-locate@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+  integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
   dependencies:
     p-limit "^2.0.0"
 
@@ -9214,6 +10399,7 @@ p-map@^1.2.0:
 p-map@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175"
+  integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
 
 p-map@^3.0.0:
   version "3.0.0"
@@ -9224,10 +10410,12 @@ p-map@^3.0.0:
 p-reduce@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa"
+  integrity sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=
 
 p-retry@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328"
+  integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==
   dependencies:
     retry "^0.12.0"
 
@@ -9238,18 +10426,22 @@ p-try@^1.0.0:
 p-try@^2.0.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
-
-pako@^0.2.5:
-  version "0.2.9"
-  resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+  integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
 
 pako@~1.0.5:
-  version "1.0.10"
-  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732"
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+  integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
+papaparse@^5.1.1:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-5.3.0.tgz#ab1702feb96e79ab4309652f36db9536563ad05a"
+  integrity sha512-Lb7jN/4bTpiuGPrYy4tkKoUS8sTki8zacB5ke1p5zolhcSE4TlWgrlsxjrDTbG/dFVh07ck7X36hUf/b5V68pg==
 
 parallel-transform@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc"
+  integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==
   dependencies:
     cyclist "^1.0.1"
     inherits "^2.0.3"
@@ -9258,80 +10450,21 @@ parallel-transform@^1.1.0:
 param-case@2.1.x:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+  integrity sha1-35T9jPZTHs915r75oIWPvHK+Ikc=
   dependencies:
     no-case "^2.2.0"
 
-parcel@1.12.3:
-  version "1.12.3"
-  resolved "https://registry.yarnpkg.com/parcel/-/parcel-1.12.3.tgz#1f1341589380f20be924f1dd67c7fed193b346ec"
-  dependencies:
-    "@babel/code-frame" "^7.0.0 <7.4.0"
-    "@babel/core" "^7.0.0 <7.4.0"
-    "@babel/generator" "^7.0.0 <7.4.0"
-    "@babel/parser" "^7.0.0 <7.4.0"
-    "@babel/plugin-transform-flow-strip-types" "^7.0.0 <7.4.0"
-    "@babel/plugin-transform-modules-commonjs" "^7.0.0 <7.4.0"
-    "@babel/plugin-transform-react-jsx" "^7.0.0 <7.4.0"
-    "@babel/preset-env" "^7.0.0 <7.4.0"
-    "@babel/runtime" "^7.0.0 <7.4.0"
-    "@babel/template" "^7.0.0 <7.4.0"
-    "@babel/traverse" "^7.0.0 <7.4.0"
-    "@babel/types" "^7.0.0 <7.4.0"
-    "@iarna/toml" "^2.2.0"
-    "@parcel/fs" "^1.11.0"
-    "@parcel/logger" "^1.11.0"
-    "@parcel/utils" "^1.11.0"
-    "@parcel/watcher" "^1.12.0"
-    "@parcel/workers" "^1.11.0"
-    ansi-to-html "^0.6.4"
-    babylon-walk "^1.0.2"
-    browserslist "^4.1.0"
-    chalk "^2.1.0"
-    clone "^2.1.1"
-    command-exists "^1.2.6"
-    commander "^2.11.0"
-    cross-spawn "^6.0.4"
-    css-modules-loader-core "^1.1.0"
-    cssnano "^4.0.0"
-    deasync "^0.1.14"
-    dotenv "^5.0.0"
-    dotenv-expand "^4.2.0"
-    fast-glob "^2.2.2"
-    filesize "^3.6.0"
-    get-port "^3.2.0"
-    htmlnano "^0.2.2"
-    is-glob "^4.0.0"
-    is-url "^1.2.2"
-    js-yaml "^3.10.0"
-    json5 "^1.0.1"
-    micromatch "^3.0.4"
-    mkdirp "^0.5.1"
-    node-forge "^0.7.1"
-    node-libs-browser "^2.0.0"
-    opn "^5.1.0"
-    postcss "^7.0.11"
-    postcss-value-parser "^3.3.1"
-    posthtml "^0.11.2"
-    posthtml-parser "^0.4.0"
-    posthtml-render "^1.1.3"
-    resolve "^1.4.0"
-    semver "^5.4.1"
-    serialize-to-js "^1.1.1"
-    serve-static "^1.12.4"
-    source-map "0.6.1"
-    terser "^3.7.3"
-    v8-compile-cache "^2.0.0"
-    ws "^5.1.1"
-
 parent-module@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+  integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
   dependencies:
     callsites "^3.0.0"
 
-parse-asn1@^5.0.0:
+parse-asn1@^5.0.0, parse-asn1@^5.1.5:
   version "5.1.5"
   resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e"
+  integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==
   dependencies:
     asn1.js "^4.0.0"
     browserify-aes "^1.0.0"
@@ -9343,6 +10476,7 @@ parse-asn1@^5.0.0:
 parse-entities@^1.1.0:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.2.2.tgz#c31bf0f653b6661354f8973559cb86dd1d5edf50"
+  integrity sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==
   dependencies:
     character-entities "^1.0.0"
     character-entities-legacy "^1.0.0"
@@ -9373,6 +10507,7 @@ parse-json@^2.2.0:
 parse-json@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+  integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
   dependencies:
     error-ex "^1.3.1"
     json-parse-better-errors "^1.0.1"
@@ -9389,14 +10524,19 @@ parse-json@^5.0.0:
 parse-node-version@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b"
+  integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==
+
+parse5-htmlparser2-tree-adapter@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz#e8c743d4e92194d5293ecde2b08be31e67461cbc"
+  integrity sha512-CF+TKjXqoqyDwHqBhFQ+3l5t83xYi6fVT1tQNg+Ye0JRLnTxWvIroCjEp1A0k4lneHNBGnICUf0cfYVYGEazqw==
+  dependencies:
+    parse5 "^5.1.1"
 
 parse5@4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608"
-
-parse5@5.1.0:
-  version "5.1.0"
-  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.0.tgz#c59341c9723f414c452975564c7c00a68d58acd2"
+  integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==
 
 parse5@^3.0.1, parse5@^3.0.3:
   version "3.0.3"
@@ -9404,31 +10544,42 @@ parse5@^3.0.1, parse5@^3.0.3:
   dependencies:
     "@types/node" "*"
 
+parse5@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178"
+  integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==
+
 parseurl@~1.3.2, parseurl@~1.3.3:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+  integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
 
 pascalcase@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+  integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
 
 path-browserify@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
+  integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
 
 path-dirname@^1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+  integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=
 
 path-exists@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+  integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
   dependencies:
     pinkie-promise "^2.0.0"
 
 path-exists@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+  integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
 
 path-exists@^4.0.0:
   version "4.0.0"
@@ -9441,14 +10592,17 @@ path-is-absolute@1.0.0:
 path-is-absolute@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+  integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
 
 path-is-inside@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+  integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
 
 path-key@^2.0.0, path-key@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+  integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
 
 path-key@^3.0.0, path-key@^3.1.0:
   version "3.1.1"
@@ -9457,14 +10611,17 @@ path-key@^3.0.0, path-key@^3.1.0:
 path-parse@^1.0.6:
   version "1.0.6"
   resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+  integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
 
 path-to-regexp@0.1.7:
   version "0.1.7"
   resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+  integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
 
 path-to-regexp@^1.7.0:
   version "1.8.0"
   resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
+  integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==
   dependencies:
     isarray "0.0.1"
 
@@ -9479,6 +10636,7 @@ path-type@^1.0.0:
 path-type@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+  integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
   dependencies:
     pify "^3.0.0"
 
@@ -9487,8 +10645,9 @@ path-type@^4.0.0:
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
 
 pbkdf2@^3.0.3:
-  version "3.0.17"
-  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94"
+  integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==
   dependencies:
     create-hash "^1.1.2"
     create-hmac "^1.1.4"
@@ -9499,17 +10658,25 @@ pbkdf2@^3.0.3:
 pdfjs-dist@2.1.266:
   version "2.1.266"
   resolved "https://registry.yarnpkg.com/pdfjs-dist/-/pdfjs-dist-2.1.266.tgz#cded02268b389559e807f410d2a729db62160026"
+  integrity sha512-Jy7o1wE3NezPxozexSbq4ltuLT0Z21ew/qrEiAEeUZzHxMHGk4DUV1D7RuCXg5vJDvHmjX1YssN+we9QfRRgXQ==
   dependencies:
     node-ensure "^0.0.0"
     worker-loader "^2.0.0"
 
+peek-readable@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/peek-readable/-/peek-readable-3.1.0.tgz#250b08b7de09db8573d7fd8ea475215bbff14348"
+  integrity sha512-KGuODSTV6hcgdZvDrIDBUkN0utcAVj1LL7FfGbM0viKTtCHmtZcuEJ+lGqsp0fTFkGqesdtemV2yUSMeyy3ddA==
+
 performance-now@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+  integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
 
-physical-cpu-count@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660"
+picomatch@^2.0.4, picomatch@^2.2.1:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+  integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
 
 picomatch@^2.0.5:
   version "2.1.1"
@@ -9522,28 +10689,34 @@ pidtree@^0.3.0:
 pify@^2.0.0, pify@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+  integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
 
 pify@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+  integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
 
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+  integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
 
 pinkie-promise@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+  integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
   dependencies:
     pinkie "^2.0.0"
 
 pinkie@^2.0.0:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+  integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 
 pirates@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
+  integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
   dependencies:
     node-modules-regexp "^1.0.0"
 
@@ -9566,12 +10739,21 @@ pkg-conf@^1.1.2:
 pkg-dir@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+  integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q=
   dependencies:
     find-up "^1.0.0"
 
+pkg-dir@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+  integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=
+  dependencies:
+    find-up "^2.1.0"
+
 pkg-dir@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+  integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
   dependencies:
     find-up "^3.0.0"
 
@@ -9584,10 +10766,12 @@ pkg-dir@^4.2.0:
 pkginfo@0.3.x:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21"
+  integrity sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=
 
 pkginfo@0.x.x:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff"
+  integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=
 
 please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0:
   version "3.2.0"
@@ -9595,17 +10779,24 @@ please-upgrade-node@^3.1.1, please-upgrade-node@^3.2.0:
   dependencies:
     semver-compare "^1.0.0"
 
+pluralize@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+  integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
+
 pn@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb"
+  integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==
 
 popper.js@^1.14.1:
   version "1.16.1"
   resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b"
 
-portfinder@^1.0.20:
-  version "1.0.25"
-  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca"
+portfinder@^1.0.25:
+  version "1.0.26"
+  resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70"
+  integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==
   dependencies:
     async "^2.6.2"
     debug "^3.1.1"
@@ -9614,69 +10805,34 @@ portfinder@^1.0.20:
 posix-character-classes@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+  integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
 
 postcss-assets-webpack-plugin@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/postcss-assets-webpack-plugin/-/postcss-assets-webpack-plugin-3.0.0.tgz#cb15a748cc23a48b956e887d9a2b954c756a289c"
+  integrity sha512-ZnpKR1BfhHJgUFEjY4P47zIXFkmxZU3XT5fLBQAMQ1/SYZ/gw/8AJmxjK8Xt8qveJGMIvRPF7T1EOiZxDi2eHA==
   dependencies:
     fancy-log "^1.3.2"
     human-size "^1.1.0"
     postcss "^7.0.0"
     webpack-sources "^1.1.0"
 
-postcss-calc@^7.0.1:
-  version "7.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.1.tgz#36d77bab023b0ecbb9789d84dcb23c4941145436"
-  dependencies:
-    css-unit-converter "^1.1.1"
-    postcss "^7.0.5"
-    postcss-selector-parser "^5.0.0-rc.4"
-    postcss-value-parser "^3.3.1"
-
-postcss-colormin@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381"
-  dependencies:
-    browserslist "^4.0.0"
-    color "^3.0.0"
-    has "^1.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-convert-values@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f"
-  dependencies:
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-discard-comments@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033"
-  dependencies:
-    postcss "^7.0.0"
-
-postcss-discard-duplicates@4.0.2, postcss-discard-duplicates@^4.0.2:
+postcss-discard-duplicates@4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb"
   dependencies:
     postcss "^7.0.0"
 
-postcss-discard-empty@4.0.1, postcss-discard-empty@^4.0.1:
+postcss-discard-empty@4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765"
   dependencies:
     postcss "^7.0.0"
 
-postcss-discard-overridden@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57"
-  dependencies:
-    postcss "^7.0.0"
-
 postcss-load-config@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003"
+  integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==
   dependencies:
     cosmiconfig "^5.0.0"
     import-cwd "^2.0.0"
@@ -9684,229 +10840,53 @@ postcss-load-config@^2.0.0:
 postcss-loader@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d"
+  integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==
   dependencies:
     loader-utils "^1.1.0"
     postcss "^7.0.0"
     postcss-load-config "^2.0.0"
     schema-utils "^1.0.0"
 
-postcss-merge-longhand@^4.0.11:
-  version "4.0.11"
-  resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24"
-  dependencies:
-    css-color-names "0.0.4"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-    stylehacks "^4.0.0"
-
-postcss-merge-rules@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650"
-  dependencies:
-    browserslist "^4.0.0"
-    caniuse-api "^3.0.0"
-    cssnano-util-same-parent "^4.0.0"
-    postcss "^7.0.0"
-    postcss-selector-parser "^3.0.0"
-    vendors "^1.0.0"
-
-postcss-minify-font-values@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6"
-  dependencies:
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-minify-gradients@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471"
-  dependencies:
-    cssnano-util-get-arguments "^4.0.0"
-    is-color-stop "^1.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-minify-params@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874"
-  dependencies:
-    alphanum-sort "^1.0.0"
-    browserslist "^4.0.0"
-    cssnano-util-get-arguments "^4.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-    uniqs "^2.0.0"
-
-postcss-minify-selectors@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8"
-  dependencies:
-    alphanum-sort "^1.0.0"
-    has "^1.0.0"
-    postcss "^7.0.0"
-    postcss-selector-parser "^3.0.0"
-
-postcss-modules-extract-imports@1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb"
-  dependencies:
-    postcss "^6.0.1"
-
 postcss-modules-extract-imports@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e"
+  integrity sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==
   dependencies:
     postcss "^7.0.5"
 
-postcss-modules-local-by-default@1.2.0:
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
-  dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
-
-postcss-modules-local-by-default@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915"
-  dependencies:
-    icss-utils "^4.1.1"
-    postcss "^7.0.16"
-    postcss-selector-parser "^6.0.2"
-    postcss-value-parser "^4.0.0"
-
-postcss-modules-scope@1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+postcss-modules-local-by-default@^2.0.3:
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-2.0.6.tgz#dd9953f6dd476b5fd1ef2d8830c8929760b56e63"
+  integrity sha512-oLUV5YNkeIBa0yQl7EYnxMgy4N6noxmiwZStaEJUSe2xPMcdNc8WmBQuQCx18H5psYbVxz8zoHk0RAAYZXP9gA==
   dependencies:
-    css-selector-tokenizer "^0.7.0"
-    postcss "^6.0.1"
+    postcss "^7.0.6"
+    postcss-selector-parser "^6.0.0"
+    postcss-value-parser "^3.3.1"
 
-postcss-modules-scope@^2.1.0:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba"
+postcss-modules-scope@^2.0.0:
+  version "2.2.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee"
+  integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==
   dependencies:
     postcss "^7.0.6"
     postcss-selector-parser "^6.0.0"
 
-postcss-modules-values@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+postcss-modules-values@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-2.0.0.tgz#479b46dc0c5ca3dc7fa5270851836b9ec7152f64"
+  integrity sha512-Ki7JZa7ff1N3EIMlPnGTZfUMe69FFwiQPnVSXC9mnn3jozCRBYIxiZd44yJOV2AmabOo4qFf8s0dC/+lweG7+w==
   dependencies:
     icss-replace-symbols "^1.1.0"
-    postcss "^6.0.1"
-
-postcss-modules-values@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10"
-  dependencies:
-    icss-utils "^4.0.0"
     postcss "^7.0.6"
 
-postcss-normalize-charset@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4"
-  dependencies:
-    postcss "^7.0.0"
-
-postcss-normalize-display-values@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a"
-  dependencies:
-    cssnano-util-get-match "^4.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-positions@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f"
-  dependencies:
-    cssnano-util-get-arguments "^4.0.0"
-    has "^1.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-repeat-style@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c"
-  dependencies:
-    cssnano-util-get-arguments "^4.0.0"
-    cssnano-util-get-match "^4.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-string@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c"
-  dependencies:
-    has "^1.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-timing-functions@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9"
-  dependencies:
-    cssnano-util-get-match "^4.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-unicode@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb"
-  dependencies:
-    browserslist "^4.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-url@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1"
-  dependencies:
-    is-absolute-url "^2.0.0"
-    normalize-url "^3.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-normalize-whitespace@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82"
-  dependencies:
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-ordered-values@^4.1.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee"
-  dependencies:
-    cssnano-util-get-arguments "^4.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
 postcss-prefix-selector@^1.6.0:
   version "1.7.2"
   resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.7.2.tgz#3adeed903985734298f19d8f5e0b657f9d90d43c"
+  integrity sha512-ddmzjWNmGs7E/nyolJ021/Gk6oBLRQLyyXKGV4Mu+Y0gquo+XlXSDP0/Y2J8C/cad/GLyftf2H0XtuDFQZxN3w==
   dependencies:
     postcss "^7.0.0"
 
-postcss-reduce-initial@^4.0.3:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df"
-  dependencies:
-    browserslist "^4.0.0"
-    caniuse-api "^3.0.0"
-    has "^1.0.0"
-    postcss "^7.0.0"
-
-postcss-reduce-transforms@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29"
-  dependencies:
-    cssnano-util-get-match "^4.0.0"
-    has "^1.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-
-postcss-selector-parser@6.0.2, postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2:
+postcss-selector-parser@^6.0.0:
   version "6.0.2"
   resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz#934cf799d016c83411859e09dcecade01286ec5c"
   dependencies:
@@ -9914,58 +10894,19 @@ postcss-selector-parser@6.0.2, postcss-selector-parser@^6.0.0, postcss-selector-
     indexes-of "^1.0.1"
     uniq "^1.0.1"
 
-postcss-selector-parser@^3.0.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
-  dependencies:
-    dot-prop "^4.1.1"
-    indexes-of "^1.0.1"
-    uniq "^1.0.1"
-
-postcss-selector-parser@^5.0.0-rc.4:
-  version "5.0.0"
-  resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz#249044356697b33b64f1a8f7c80922dddee7195c"
-  dependencies:
-    cssesc "^2.0.0"
-    indexes-of "^1.0.1"
-    uniq "^1.0.1"
-
-postcss-svgo@^4.0.2:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258"
-  dependencies:
-    is-svg "^3.0.0"
-    postcss "^7.0.0"
-    postcss-value-parser "^3.0.0"
-    svgo "^1.0.0"
-
-postcss-unique-selectors@^4.0.1:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac"
-  dependencies:
-    alphanum-sort "^1.0.0"
-    postcss "^7.0.0"
-    uniqs "^2.0.0"
-
-postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.1:
+postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1:
   version "3.3.1"
   resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
 
-postcss-value-parser@^4.0.0:
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9"
-
-postcss@6.0.1:
-  version "6.0.1"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.1.tgz#000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2"
-  dependencies:
-    chalk "^1.1.3"
-    source-map "^0.5.6"
-    supports-color "^3.2.3"
+postcss-value-parser@^4.0.3:
+  version "4.1.0"
+  resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
+  integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
 
 postcss@7.0.17:
   version "7.0.17"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.17.tgz#4da1bdff5322d4a0acaab4d87f3e782436bad31f"
+  integrity sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"
@@ -9974,23 +10915,17 @@ postcss@7.0.17:
 postcss@^5.2.17:
   version "5.2.18"
   resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+  integrity sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==
   dependencies:
     chalk "^1.1.3"
     js-base64 "^2.1.9"
     source-map "^0.5.6"
     supports-color "^3.2.3"
 
-postcss@^6.0.1:
-  version "6.0.23"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
-  dependencies:
-    chalk "^2.4.1"
-    source-map "^0.6.1"
-    supports-color "^5.4.0"
-
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.5, postcss@^7.0.6:
-  version "7.0.26"
-  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587"
+postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6:
+  version "7.0.32"
+  resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz#4310d6ee347053da3433db2be492883d62cec59d"
+  integrity sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==
   dependencies:
     chalk "^2.4.2"
     source-map "^0.6.1"
@@ -9999,63 +10934,156 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.14, postcss@^7.0.1
 posthtml-parser@^0.2.0, posthtml-parser@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.2.1.tgz#35d530de386740c2ba24ff2eb2faf39ccdf271dd"
+  integrity sha1-NdUw3jhnQMK6JP8usvrznM3ycd0=
   dependencies:
     htmlparser2 "^3.8.3"
     isobject "^2.1.0"
 
-posthtml-parser@^0.4.0, posthtml-parser@^0.4.1:
-  version "0.4.2"
-  resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.2.tgz#a132bbdf0cd4bc199d34f322f5c1599385d7c6c1"
-  dependencies:
-    htmlparser2 "^3.9.2"
-
 posthtml-rename-id@^1.0:
-  version "1.0.11"
-  resolved "https://registry.yarnpkg.com/posthtml-rename-id/-/posthtml-rename-id-1.0.11.tgz#02281a1e4482aa3c8c30f798cf9a888e32d9275c"
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz#cf7f6eb37146bf1afac31e68f18c6cc19ae61433"
+  integrity sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==
   dependencies:
     escape-string-regexp "1.0.5"
 
-posthtml-render@^1.0.5, posthtml-render@^1.0.6, posthtml-render@^1.1.3, posthtml-render@^1.1.5:
-  version "1.1.5"
-  resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.1.5.tgz#387934e85438a3de77085fbc7d264efb00bd0e0f"
+posthtml-render@^1.0.5, posthtml-render@^1.0.6:
+  version "1.2.2"
+  resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.2.2.tgz#f554a19ed40d40e2bfc160826b0a91d4a23656cd"
+  integrity sha512-MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ==
 
 posthtml-svg-mode@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz#abd554face81223cab0cb367e18e4efd2a4e74b0"
+  integrity sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==
   dependencies:
     merge-options "1.0.1"
     posthtml "^0.9.2"
     posthtml-parser "^0.2.1"
     posthtml-render "^1.0.6"
 
-posthtml@^0.11.2:
-  version "0.11.6"
-  resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.6.tgz#e349d51af7929d0683b9d8c3abd8166beecc90a8"
-  dependencies:
-    posthtml-parser "^0.4.1"
-    posthtml-render "^1.1.5"
-
-posthtml@^0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.12.0.tgz#6e2a2fcd774eaed1a419a95c5cc3a92b676a40a6"
-  dependencies:
-    posthtml-parser "^0.4.1"
-    posthtml-render "^1.1.5"
-
 posthtml@^0.9.2:
   version "0.9.2"
   resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.9.2.tgz#f4c06db9f67b61fd17c4e256e7e3d9515bf726fd"
+  integrity sha1-9MBtufZ7Yf0XxOJW5+PZUVv3Jv0=
   dependencies:
     posthtml-parser "^0.2.0"
     posthtml-render "^1.0.5"
 
+pouchdb-abstract-mapreduce@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-7.0.0.tgz#946d79073c9795ca03c9b5c318a64372422e8740"
+  integrity sha512-C1sb9AIJYTFOUPtuPaAYBCfd09DK82LmeYEtM4h1Z+wG76zj9U1NEg8T+CwxcpOF7eX3ZN5EmSfa3k/ZlyMUgQ==
+  dependencies:
+    pouchdb-binary-utils "7.0.0"
+    pouchdb-collate "7.0.0"
+    pouchdb-collections "7.0.0"
+    pouchdb-errors "7.0.0"
+    pouchdb-fetch "7.0.0"
+    pouchdb-mapreduce-utils "7.0.0"
+    pouchdb-md5 "7.0.0"
+    pouchdb-utils "7.0.0"
+
+pouchdb-binary-utils@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-binary-utils/-/pouchdb-binary-utils-7.0.0.tgz#cb71a288b09572a231f6bab1b4aed201c4d219a7"
+  integrity sha512-yUktdOPIPvOVouCjJN3uop+bCcpdPwePrLm9eUAZNgEYnUFu0njdx7Q0WRsZ7UJ6l75HinL5ZHk4bnvEt86FLw==
+  dependencies:
+    buffer-from "1.1.0"
+
+pouchdb-browser@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-browser/-/pouchdb-browser-7.0.0.tgz#d493fd738f21f7c91f17bbb7ee7ad97c2072e546"
+  integrity sha512-a0AikmIM8BJ4ROWnfRtmQWW3JlFdHvfcQQWxY2V1CesLJYqPkTzwSUDD3QsiU+edpTSK8fIrEq257W15qZzXYQ==
+  dependencies:
+    argsarray "0.0.1"
+    immediate "3.0.6"
+    inherits "2.0.3"
+    spark-md5 "3.0.0"
+    uuid "3.2.1"
+    vuvuzela "1.0.3"
+
+pouchdb-collate@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-collate/-/pouchdb-collate-7.0.0.tgz#4f9a0a03c236f1677a971c400b79b7baf6379a4d"
+  integrity sha512-0O67rnNGVD9OUbDx+6DLPcE3zz7w6gieNCvrbvaI5ibIXuLpyMyLjD6OdRe/19LbstEfZaOp+SYUhQs+TP8Plg==
+
+pouchdb-collections@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-7.0.0.tgz#fd1f632337dc6301b0ff8649732ca79204e41780"
+  integrity sha512-DaoUr/vU24Q3gM6ghj0va9j/oBanPwkbhkvnqSyC3Dm5dgf5pculNxueLF9PKMo3ycApoWzHMh6N2N8KJbDU2Q==
+
+pouchdb-errors@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-errors/-/pouchdb-errors-7.0.0.tgz#4e2a5a8b82af20cbe5f9970ca90b7ec74563caa0"
+  integrity sha512-dTusY8nnTw4HIztCrNl7AoGgwvS1bVf/3/97hDaGc4ytn72V9/4dK8kTqlimi3UpaurohYRnqac0SGXYP8vgXA==
+  dependencies:
+    inherits "2.0.3"
+
+pouchdb-fetch@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-fetch/-/pouchdb-fetch-7.0.0.tgz#6b56cc49863837f8d5e38b0956ace03f1fcaf8e0"
+  integrity sha512-9XGEogHQcYZCJp2PvLE7oDgGzIsBy4Vh28EhDS26iJFwtDVpHYm7fIzJ//SDGcUNjnlR9WKTegFLg9p7jYIQWQ==
+  dependencies:
+    fetch-cookie "0.7.0"
+    node-fetch "^2.0.0"
+
+pouchdb-find@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-find/-/pouchdb-find-7.0.0.tgz#f390c3f7a9455e700eb178eb89b235aaf7dc3beb"
+  integrity sha512-nqAdnbmmxcIrWF//k5LKDGXaDZScgvhqVoyGjXhiUan35ASI0KYn1R8Z0nGsl0PD/DRK1kveQjbC9+50QgdTRg==
+  dependencies:
+    pouchdb-abstract-mapreduce "7.0.0"
+    pouchdb-collate "7.0.0"
+    pouchdb-errors "7.0.0"
+    pouchdb-fetch "7.0.0"
+    pouchdb-md5 "7.0.0"
+    pouchdb-selector-core "7.0.0"
+    pouchdb-utils "7.0.0"
+
+pouchdb-mapreduce-utils@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-7.0.0.tgz#ff342e9d515d4c9cf0b19ad85c78f10f2568493b"
+  integrity sha512-kj74SpirbQAC7BSlBpPO42RBbUw8XmxbkLCnHyL7CVktyEn24VHbCoirutUI2mRPii7MAVHtleGKXRijR5QIpw==
+  dependencies:
+    argsarray "0.0.1"
+    inherits "2.0.3"
+    pouchdb-collections "7.0.0"
+    pouchdb-utils "7.0.0"
+
+pouchdb-md5@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-md5/-/pouchdb-md5-7.0.0.tgz#935dc6bb507a5f3978fb653ca5790331bae67c96"
+  integrity sha512-yaSJKhLA3QlgloKUQeb2hLdT3KmUmPfoYdryfwHZuPTpXIRKTnMQTR9qCIRUszc0ruBpDe53DRslCgNUhAyTNQ==
+  dependencies:
+    pouchdb-binary-utils "7.0.0"
+    spark-md5 "3.0.0"
+
+pouchdb-selector-core@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-selector-core/-/pouchdb-selector-core-7.0.0.tgz#824bd0980bd9778b3ddef869306a6cdb928df703"
+  integrity sha512-8Lpa8S7TCRGUEy3aEMd+Zy85IU4KwCVNf3TT+HJ8XAKICtmgArPrQGimIXFOHoyjRSpCXtByzEriP8CBCUjp7g==
+  dependencies:
+    pouchdb-collate "7.0.0"
+    pouchdb-utils "7.0.0"
+
+pouchdb-utils@7.0.0:
+  version "7.0.0"
+  resolved "https://registry.yarnpkg.com/pouchdb-utils/-/pouchdb-utils-7.0.0.tgz#48bfced6665b8f5a2b2d2317e2aa57635ed1e88e"
+  integrity sha512-1bnoX1KdZYHv9wicDIFdO0PLiVIMzNDUBUZ/yOJZ+6LW6niQCB8aCv09ZztmKfSQcU5nnN3fe656tScBgP6dOQ==
+  dependencies:
+    argsarray "0.0.1"
+    clone-buffer "1.0.0"
+    immediate "3.0.6"
+    inherits "2.0.3"
+    pouchdb-collections "7.0.0"
+    pouchdb-errors "7.0.0"
+    pouchdb-md5 "7.0.0"
+    uuid "3.2.1"
+
 prelude-ls@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
-
-prepend-http@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+  integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
 
 preserve@^0.2.0:
   version "0.2.0"
@@ -10089,6 +11117,11 @@ prettier@1.16.4:
   version "1.16.4"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.4.tgz#73e37e73e018ad2db9c76742e2647e21790c9717"
 
+prettier@1.18.2:
+  version "1.18.2"
+  resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea"
+  integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw==
+
 prettier@^1.19.1, prettier@^1.7.0:
   version "1.19.1"
   resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
@@ -10096,6 +11129,7 @@ prettier@^1.19.1, prettier@^1.7.0:
 pretty-error@^2.0.2:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
+  integrity sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=
   dependencies:
     renderkid "^2.0.1"
     utila "~0.4"
@@ -10110,12 +11144,32 @@ pretty-format@^23.0.1:
 pretty-format@^24.9.0:
   version "24.9.0"
   resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
+  integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
   dependencies:
     "@jest/types" "^24.9.0"
     ansi-regex "^4.0.0"
     ansi-styles "^3.2.0"
     react-is "^16.8.4"
 
+pretty-format@^26.4.2:
+  version "26.4.2"
+  resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.4.2.tgz#d081d032b398e801e2012af2df1214ef75a81237"
+  integrity sha512-zK6Gd8zDsEiVydOCGLkoBoZuqv8VTiHyAbKznXe/gaph/DAeZOmit9yMfgIz5adIgAMMs5XfoYSwAX3jcCO1tA==
+  dependencies:
+    "@jest/types" "^26.3.0"
+    ansi-regex "^5.0.0"
+    ansi-styles "^4.0.0"
+    react-is "^16.12.0"
+
+pretty@2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/pretty/-/pretty-2.0.0.tgz#adbc7960b7bbfe289a557dc5f737619a220d06a5"
+  integrity sha1-rbx5YLe7/iiaVX3F9zdhmiINBqU=
+  dependencies:
+    condense-newlines "^0.2.1"
+    extend-shallow "^2.0.1"
+    js-beautify "^1.6.12"
+
 private@^0.1.6:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -10123,18 +11177,27 @@ private@^0.1.6:
 process-nextick-args@~2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+  integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
 
 process@^0.11.10:
   version "0.11.10"
   resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
 progress@^2.0.0:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+  integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
 
 promise-inflight@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+  integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM=
+
+promise-polyfill@^6.0.2:
+  version "6.1.0"
+  resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-6.1.0.tgz#dfa96943ea9c121fca4de9b5868cb39d3472e057"
+  integrity sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=
 
 promise-retry@^1.1.1:
   version "1.1.1"
@@ -10152,6 +11215,7 @@ promise@^7.1.1:
 prompt@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.0.0.tgz#8e57123c396ab988897fb327fd3aedc3e735e4fe"
+  integrity sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=
   dependencies:
     colors "^1.1.2"
     pkginfo "0.x.x"
@@ -10161,11 +11225,12 @@ prompt@1.0.0:
     winston "2.1.x"
 
 prompts@^2.0.1:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.0.tgz#a444e968fa4cc7e86689a74050685ac8006c4cc4"
+  version "2.3.2"
+  resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068"
+  integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==
   dependencies:
     kleur "^3.0.3"
-    sisteransi "^1.0.3"
+    sisteransi "^1.0.4"
 
 prop-types-exact@^1.2.0:
   version "1.2.0"
@@ -10175,13 +11240,6 @@ prop-types-exact@^1.2.0:
     object.assign "^4.1.0"
     reflect.ownkeys "^0.2.0"
 
-prop-types@15.6.2:
-  version "15.6.2"
-  resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
-  dependencies:
-    loose-envify "^1.3.1"
-    object-assign "^4.1.1"
-
 prop-types@15.7.2, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2:
   version "15.7.2"
   resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
@@ -10190,32 +11248,43 @@ prop-types@15.7.2, prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8,
     object-assign "^4.1.1"
     react-is "^16.8.1"
 
+propagate@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/propagate/-/propagate-2.0.1.tgz#40cdedab18085c792334e64f0ac17256d38f9a45"
+  integrity sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==
+
 proto-list@~1.2.1:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+  integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
 
 proxy-addr@~2.0.5:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
+  version "2.0.6"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
+  integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
   dependencies:
     forwarded "~0.1.2"
-    ipaddr.js "1.9.0"
+    ipaddr.js "1.9.1"
 
 prr@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+  integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
 
 pseudomap@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+  integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
 
 psl@^1.1.24, psl@^1.1.28:
-  version "1.7.0"
-  resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c"
+  version "1.8.0"
+  resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+  integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
 
 public-encrypt@^4.0.0:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0"
+  integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==
   dependencies:
     bn.js "^4.1.0"
     browserify-rsa "^4.0.0"
@@ -10224,9 +11293,10 @@ public-encrypt@^4.0.0:
     randombytes "^2.0.1"
     safe-buffer "^5.1.2"
 
-pump@^2.0.0:
+pump@^2.0.0, pump@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+  integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==
   dependencies:
     end-of-stream "^1.1.0"
     once "^1.3.1"
@@ -10234,6 +11304,7 @@ pump@^2.0.0:
 pump@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
+  integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
   dependencies:
     end-of-stream "^1.1.0"
     once "^1.3.1"
@@ -10241,6 +11312,7 @@ pump@^3.0.0:
 pumpify@^1.3.3:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+  integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==
   dependencies:
     duplexify "^3.6.0"
     inherits "^2.0.3"
@@ -10249,43 +11321,42 @@ pumpify@^1.3.3:
 punycode@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+  integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
 
 punycode@^1.2.4, punycode@^1.4.1:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+  integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
 
 punycode@^2.1.0, punycode@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
-
-purgecss@^1.4.0:
-  version "1.4.2"
-  resolved "https://registry.yarnpkg.com/purgecss/-/purgecss-1.4.2.tgz#67ab50cb4f5c163fcefde56002467c974e577f41"
-  dependencies:
-    glob "^7.1.3"
-    postcss "^7.0.14"
-    postcss-selector-parser "^6.0.0"
-    yargs "^14.0.0"
+  integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
 
 q@^1.1.2, q@^1.5.1:
   version "1.5.1"
   resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+  integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=
 
 qs@6.7.0:
   version "6.7.0"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
+  integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
 
 qs@^6.7.0:
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.1.tgz#20082c65cb78223635ab1a9eaca8875a29bf8ec9"
+  version "6.9.4"
+  resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
+  integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
 
 qs@~6.5.2:
   version "6.5.2"
   resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+  integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
 
-query-string@^4.1.0, query-string@^4.3.2:
+query-string@^4.3.2:
   version "4.3.4"
   resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+  integrity sha1-u7aTucqRXCMlFbIosaArYJBD2+s=
   dependencies:
     object-assign "^4.1.0"
     strict-uri-encode "^1.0.0"
@@ -10293,30 +11364,26 @@ query-string@^4.1.0, query-string@^4.3.2:
 querystring-es3@^0.2.0:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+  integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=
 
 querystring@0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+  integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
 
 querystringify@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
+  integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
 
 quick-lru@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8"
 
-quote-stream@^1.0.1, quote-stream@~1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2"
-  dependencies:
-    buffer-equal "0.0.1"
-    minimist "^1.1.3"
-    through2 "^2.0.0"
-
 raf@^3.4.0:
   version "3.4.1"
   resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
+  integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
   dependencies:
     performance-now "^2.1.0"
 
@@ -10324,9 +11391,10 @@ railroad-diagrams@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
 
-ramda@^0.26:
-  version "0.26.1"
-  resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06"
+ramda@^0.27:
+  version "0.27.0"
+  resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.0.tgz#915dc29865c0800bf3f69b8fd6c279898b59de43"
+  integrity sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==
 
 randexp@0.4.6:
   version "0.4.6"
@@ -10343,15 +11411,17 @@ randomatic@^3.0.0:
     kind-of "^6.0.0"
     math-random "^1.0.1"
 
-randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+  integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
   dependencies:
     safe-buffer "^5.1.0"
 
 randomfill@^1.0.3:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+  integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==
   dependencies:
     randombytes "^2.0.5"
     safe-buffer "^5.1.0"
@@ -10359,16 +11429,39 @@ randomfill@^1.0.3:
 range-parser@^1.2.1, range-parser@~1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+  integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raven@^2.6.4:
+  version "2.6.4"
+  resolved "https://registry.yarnpkg.com/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3"
+  integrity sha512-6PQdfC4+DQSFncowthLf+B6Hr0JpPsFBgTVYTAOq7tCmx/kR4SXbeawtPch20+3QfUcQDoJBLjWW1ybvZ4kXTw==
+  dependencies:
+    cookie "0.3.1"
+    md5 "^2.2.1"
+    stack-trace "0.0.10"
+    timed-out "4.0.1"
+    uuid "3.3.2"
 
 raw-body@2.4.0:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
+  integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
   dependencies:
     bytes "3.1.0"
     http-errors "1.7.2"
     iconv-lite "0.4.24"
     unpipe "1.0.0"
 
+raw-body@^2.4.1:
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
+  integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==
+  dependencies:
+    bytes "3.1.0"
+    http-errors "1.7.3"
+    iconv-lite "0.4.24"
+    unpipe "1.0.0"
+
 react-autosuggest@9.4.3:
   version "9.4.3"
   resolved "https://registry.yarnpkg.com/react-autosuggest/-/react-autosuggest-9.4.3.tgz#eb46852422a48144ab9f39fb5470319222f26c7c"
@@ -10385,14 +11478,15 @@ react-autowhatever@^10.1.2:
     react-themeable "^1.1.0"
     section-iterator "^2.0.0"
 
-react-dom@16.8.6:
-  version "16.8.6"
-  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f"
+react-dom@16.12.0:
+  version "16.12.0"
+  resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.12.0.tgz#0da4b714b8d13c2038c9396b54a92baea633fe11"
+  integrity sha512-LMxFfAGrcS3kETtQaCkTKjMiifahaMySFDn71fZUNpPHZQEzmk/GiAeIT8JSOrHB23fnuCOMruL2a8NYlw+8Gw==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
     prop-types "^15.6.2"
-    scheduler "^0.13.6"
+    scheduler "^0.18.0"
 
 react-event-listener@^0.6.0, react-event-listener@^0.6.2:
   version "0.6.6"
@@ -10402,6 +11496,11 @@ react-event-listener@^0.6.0, react-event-listener@^0.6.2:
     prop-types "^15.6.0"
     warning "^4.0.1"
 
+react-fast-compare@^3.0.1:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb"
+  integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
+
 react-final-form@3.7.0:
   version "3.7.0"
   resolved "https://registry.yarnpkg.com/react-final-form/-/react-final-form-3.7.0.tgz#89196cc18340d0bcdb308941ea3e5dafe0f26684"
@@ -10422,8 +11521,9 @@ react-hot-loader@4.12.6:
     source-map "^0.7.3"
 
 react-hot-loader@^4.3.11:
-  version "4.12.19"
-  resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.19.tgz#99a1c763352828f404fa51cd887c5e16bb5b74d1"
+  version "4.12.21"
+  resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-4.12.21.tgz#332e830801fb33024b5a147d6b13417f491eb975"
+  integrity sha512-Ynxa6ROfWUeKWsTHxsrL2KMzujxJVPjs385lmB2t5cHUxdoRPGind9F00tOkdc1l5WBleOF4XEAMILY1KPIIDA==
   dependencies:
     fast-levenshtein "^2.0.6"
     global "^4.3.0"
@@ -10437,10 +11537,16 @@ react-hot-loader@^4.3.11:
 react-input-autosize@^2.2.1:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/react-input-autosize/-/react-input-autosize-2.2.2.tgz#fcaa7020568ec206bc04be36f4eb68e647c4d8c2"
+  integrity sha512-jQJgYCA3S0j+cuOwzuCd1OjmBmnZLdqQdiLKRYrsMMzbjUrVDS5RvJUDwJqA7sKuksDuzFtm6hZGKFu7Mjk5aw==
   dependencies:
     prop-types "^15.5.8"
 
-react-is@^16.6.0, react-is@^16.6.3, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
+react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6:
+  version "16.13.1"
+  resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+  integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^16.6.3, react-is@^16.9.0:
   version "16.12.0"
   resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
 
@@ -10472,6 +11578,7 @@ react-markdown@4.2.2:
 react-markdown@^4.0.8:
   version "4.3.1"
   resolved "https://registry.yarnpkg.com/react-markdown/-/react-markdown-4.3.1.tgz#39f0633b94a027445b86c9811142d05381300f2f"
+  integrity sha512-HQlWFTbDxTtNY6bjgp3C3uv1h2xcjCSi1zAEzfBW9OwJJvENSYiLXWNXN5hHLsoqai7RnZiiHzcnWdXk2Splzw==
   dependencies:
     html-to-react "^1.3.4"
     mdast-add-list-metadata "1.0.1"
@@ -10485,6 +11592,7 @@ react-markdown@^4.0.8:
 react-pdf@^4.0.5:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/react-pdf/-/react-pdf-4.1.0.tgz#fcb874f28050fe9593c4e04652c7bff94bb1acf9"
+  integrity sha512-SYwkWc+vRQHfrpDls3DOgn4G+wT0mYGJRor20e28GPRW8VB+6o8WqZ4QZxsl50z+dKM7UscXFnK/02eN3NXi2g==
   dependencies:
     "@babel/runtime" "^7.0.0"
     lodash.once "^4.1.1"
@@ -10493,16 +11601,13 @@ react-pdf@^4.0.5:
     pdfjs-dist "2.1.266"
     prop-types "^15.6.2"
 
-react-redux@5.0.7:
-  version "5.0.7"
-  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.0.7.tgz#0dc1076d9afb4670f993ffaef44b8f8c1155a4c8"
+react-popper@^2.2.3:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.3.tgz#33d425fa6975d4bd54d9acd64897a89d904b9d97"
+  integrity sha512-mOEiMNT1249js0jJvkrOjyHsGvqcJd3aGW/agkiMoZk3bZ1fXN1wQszIQSjHIai48fE67+zwF8Cs+C4fWqlfjw==
   dependencies:
-    hoist-non-react-statics "^2.5.0"
-    invariant "^2.0.0"
-    lodash "^4.17.5"
-    lodash-es "^4.17.5"
-    loose-envify "^1.1.0"
-    prop-types "^15.6.0"
+    react-fast-compare "^3.0.1"
+    warning "^4.0.2"
 
 react-redux@5.1.1:
   version "5.1.1"
@@ -10516,15 +11621,27 @@ react-redux@5.1.1:
     react-is "^16.6.0"
     react-lifecycles-compat "^3.0.0"
 
-react-router-dom@5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.0.1.tgz#ee66f4a5d18b6089c361958e443489d6bab714be"
+react-redux@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.0.tgz#f970f62192b3981642fec46fd0db18a074fe879d"
+  integrity sha512-EvCAZYGfOLqwV7gh849xy9/pt55rJXPwmYvI4lilPM5rUT/1NxuuN59ipdBksRVSvz0KInbPnp4IfoXJXCqiDA==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    hoist-non-react-statics "^3.3.0"
+    loose-envify "^1.4.0"
+    prop-types "^15.7.2"
+    react-is "^16.9.0"
+
+react-router-dom@5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662"
+  integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==
   dependencies:
     "@babel/runtime" "^7.1.2"
     history "^4.9.0"
     loose-envify "^1.3.1"
     prop-types "^15.6.2"
-    react-router "5.0.1"
+    react-router "5.2.0"
     tiny-invariant "^1.0.2"
     tiny-warning "^1.0.0"
 
@@ -10540,9 +11657,9 @@ react-router-dom@^5.0.1:
     tiny-invariant "^1.0.2"
     tiny-warning "^1.0.0"
 
-react-router@5.0.1:
-  version "5.0.1"
-  resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.0.1.tgz#04ee77df1d1ab6cb8939f9f01ad5702dbadb8b0f"
+react-router@5.1.2:
+  version "5.1.2"
+  resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418"
   dependencies:
     "@babel/runtime" "^7.1.2"
     history "^4.9.0"
@@ -10555,15 +11672,16 @@ react-router@5.0.1:
     tiny-invariant "^1.0.2"
     tiny-warning "^1.0.0"
 
-react-router@5.1.2:
-  version "5.1.2"
-  resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418"
+react-router@5.2.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293"
+  integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==
   dependencies:
     "@babel/runtime" "^7.1.2"
     history "^4.9.0"
     hoist-non-react-statics "^3.1.0"
     loose-envify "^1.3.1"
-    mini-create-react-context "^0.3.0"
+    mini-create-react-context "^0.4.0"
     path-to-regexp "^1.7.0"
     prop-types "^15.6.2"
     react-is "^16.6.0"
@@ -10573,6 +11691,7 @@ react-router@5.1.2:
 react-select@2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/react-select/-/react-select-2.2.0.tgz#67c8b5c2dcb8df0384f2a103efe952570f5d6b93"
+  integrity sha512-FOnsm/zrJ2pZvYsEfs58Xvru0SHL1jXAZTCFTWcOxmQSnRKgYuXUDFdpDiET90GLtJEF+t6BaZeD43bUH6/NZQ==
   dependencies:
     classnames "^2.2.5"
     create-emotion "^10.0.4"
@@ -10589,6 +11708,26 @@ react-swipeable-views-core@^0.13.1, react-swipeable-views-core@^0.13.6:
     "@babel/runtime" "^7.0.0"
     warning "^4.0.1"
 
+react-swipeable-views-core@^0.13.7:
+  version "0.13.7"
+  resolved "https://registry.yarnpkg.com/react-swipeable-views-core/-/react-swipeable-views-core-0.13.7.tgz#c082b553f26e83fd20fc17f934200eb717023c8a"
+  integrity sha512-ekn9oDYfBt0oqJSGGwLEhKvn+QaqMGTy//9dURTLf+vp7W5j6GvmKryYdnwJCDITaPFI2hujXV4CH9krhvaE5w==
+  dependencies:
+    "@babel/runtime" "7.0.0"
+    warning "^4.0.1"
+
+react-swipeable-views-utils@^0.13.3:
+  version "0.13.9"
+  resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.9.tgz#a66e98f2f4502d8b00182901f80d13b2f903e10f"
+  integrity sha512-QLGxRKrbJCbWz94vkWLzb1Daaa2Y/TZKmsNKQ6WSNrS+chrlfZ3z9tqZ7YUJlW6pRWp3QZdLSY3UE3cN0TXXmw==
+  dependencies:
+    "@babel/runtime" "7.0.0"
+    keycode "^2.1.7"
+    prop-types "^15.6.0"
+    react-event-listener "^0.6.0"
+    react-swipeable-views-core "^0.13.7"
+    shallow-equal "^1.2.1"
+
 react-swipeable-views-utils@^0.13.4:
   version "0.13.6"
   resolved "https://registry.yarnpkg.com/react-swipeable-views-utils/-/react-swipeable-views-utils-0.13.6.tgz#1b93185087aa87128e8c5d8f8c8924630e785333"
@@ -10600,6 +11739,18 @@ react-swipeable-views-utils@^0.13.4:
     react-event-listener "^0.6.0"
     react-swipeable-views-core "^0.13.6"
 
+react-swipeable-views@0.13.3:
+  version "0.13.3"
+  resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.3.tgz#2ad886767c6b2de88000606a14bedde12156e6d0"
+  integrity sha512-LBHRA5ZouipmoLLwi0cqB8qc7NHLskbXmT1I+ZztC9JfmgKrfichw5R+7q4igQ+5VbaP6jL1vn8BtHW96WYNFQ==
+  dependencies:
+    "@babel/runtime" "7.0.0"
+    dom-helpers "^3.2.1"
+    prop-types "^15.5.4"
+    react-swipeable-views-core "^0.13.1"
+    react-swipeable-views-utils "^0.13.3"
+    warning "^4.0.1"
+
 react-swipeable-views@0.13.4:
   version "0.13.4"
   resolved "https://registry.yarnpkg.com/react-swipeable-views/-/react-swipeable-views-0.13.4.tgz#ebbe50a8592b185dbedf9e0060eaee09cf6b2c67"
@@ -10638,29 +11789,26 @@ react-themeable@^1.1.0:
 react-transition-group@^2.2.1:
   version "2.9.0"
   resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-2.9.0.tgz#df9cdb025796211151a436c69a8f3b97b5b07c8d"
+  integrity sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==
   dependencies:
     dom-helpers "^3.4.0"
     loose-envify "^1.4.0"
     prop-types "^15.6.2"
     react-lifecycles-compat "^3.0.4"
 
-react@16.7.0:
-  version "16.7.0"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.7.0.tgz#b674ec396b0a5715873b350446f7ea0802ab6381"
-  dependencies:
-    loose-envify "^1.1.0"
-    object-assign "^4.1.1"
-    prop-types "^15.6.2"
-    scheduler "^0.12.0"
+react-zlib-js@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/react-zlib-js/-/react-zlib-js-1.0.5.tgz#7bb433e1a4ae53a8e6f361b3d36166baf5bbc60f"
+  integrity sha512-TLcPdmqhIl+ylwOwlfm1WUuI7NVvhAv3L74d1AabhjyaAbmLOROTA/Q4EQ/UMCFCOjIkVim9fT3UZOQSFk/mlA==
 
-react@16.8.6:
-  version "16.8.6"
-  resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe"
+react@16.12.0:
+  version "16.12.0"
+  resolved "https://registry.yarnpkg.com/react/-/react-16.12.0.tgz#0c0a9c6a142429e3614834d5a778e18aa78a0b83"
+  integrity sha512-fglqy3k5E+81pA8s+7K0/T3DBCF0ZDOher1elBFzF7O6arXJgzyu/FW+COxFvAWXJoJN9KIZbT2LXlukwphYTA==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
     prop-types "^15.6.2"
-    scheduler "^0.13.6"
 
 read-pkg-up@^1.0.1:
   version "1.0.1"
@@ -10679,6 +11827,7 @@ read-pkg-up@^3.0.0:
 read-pkg-up@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978"
+  integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==
   dependencies:
     find-up "^3.0.0"
     read-pkg "^3.0.0"
@@ -10694,6 +11843,7 @@ read-pkg@^1.0.0:
 read-pkg@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+  integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=
   dependencies:
     load-json-file "^4.0.0"
     normalize-package-data "^2.3.2"
@@ -10711,10 +11861,11 @@ read-pkg@^5.2.0:
 read@1.0.x:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4"
+  integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=
   dependencies:
     mute-stream "~0.0.4"
 
-"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6:
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6, readable-stream@~2.3.6:
   version "2.3.7"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
   dependencies:
@@ -10726,7 +11877,7 @@ read@1.0.x:
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
-"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1:
+"readable-stream@2 || 3", readable-stream@^3.0.2:
   version "3.5.0"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.5.0.tgz#465d70e6d1087f6162d079cd0b5db7fbebfd1606"
   dependencies:
@@ -10734,20 +11885,48 @@ read@1.0.x:
     string_decoder "^1.1.1"
     util-deprecate "^1.0.1"
 
+readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0:
+  version "3.6.0"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+  integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+  dependencies:
+    inherits "^2.0.3"
+    string_decoder "^1.1.1"
+    util-deprecate "^1.0.1"
+
+readable-web-to-node-stream@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/readable-web-to-node-stream/-/readable-web-to-node-stream-2.0.0.tgz#751e632f466552ac0d5c440cc01470352f93c4b7"
+  integrity sha512-+oZJurc4hXpaaqsN68GoZGQAQIA3qr09Or4fqEsargABnbe5Aau8hFn6ISVleT3cpY/0n/8drn7huyyEvTbghA==
+
 readdirp@^2.0.0, readdirp@^2.2.1:
   version "2.2.1"
   resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+  integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==
   dependencies:
     graceful-fs "^4.1.11"
     micromatch "^3.1.10"
     readable-stream "^2.0.2"
 
+readdirp@~3.4.0:
+  version "3.4.0"
+  resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
+  integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
+  dependencies:
+    picomatch "^2.2.1"
+
 realpath-native@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.1.0.tgz#2003294fea23fb0672f2476ebe22fcf498a2d65c"
+  integrity sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==
   dependencies:
     util.promisify "^1.0.0"
 
+recoil@^0.0.13:
+  version "0.0.13"
+  resolved "https://registry.yarnpkg.com/recoil/-/recoil-0.0.13.tgz#23e6d63135c07d8defbd91aaa35dca94ec5c15a6"
+  integrity sha512-2OToaQ8GR//KsdKdaEhMi04QKStLGRpk3qjC58iBpZpUtsByZ4dUy2UJtRcYuhnVlltGZ8HNwcEQRdFOS864SQ==
+
 "recompose@0.28.0 - 0.30.0":
   version "0.30.0"
   resolved "https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0"
@@ -10783,13 +11962,15 @@ redux-persist@5.10.0:
   version "5.10.0"
   resolved "https://registry.yarnpkg.com/redux-persist/-/redux-persist-5.10.0.tgz#5d8d802c5571e55924efc1c3a9b23575283be62b"
 
-redux-thunk@2.3.0:
+redux-thunk@2.3.0, redux-thunk@^2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/redux-thunk/-/redux-thunk-2.3.0.tgz#51c2c19a185ed5187aaa9a2d08b666d0d6467622"
+  integrity sha512-km6dclyFnmcvxhAcrQV2AkZmPQjzPDjgVlQtR0EQjxZPyJ0BnMf3in1ryuR8A2qU0HldVRfxYXbFSKlI3N7Slw==
 
-redux@3.7.2:
+redux@3.7.2, redux@^3.7.2:
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/redux/-/redux-3.7.2.tgz#06b73123215901d25d065be342eb026bc1c8537b"
+  integrity sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==
   dependencies:
     lodash "^4.2.1"
     lodash-es "^4.2.1"
@@ -10806,25 +11987,23 @@ regenerate-unicode-properties@^8.1.0:
   dependencies:
     regenerate "^1.4.0"
 
-regenerate@^1.2.1, regenerate@^1.4.0:
+regenerate@^1.4.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
 
-regenerator-runtime@^0.10.5:
-  version "0.10.5"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
-
 regenerator-runtime@^0.11.0:
   version "0.11.1"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
 
 regenerator-runtime@^0.12.0:
   version "0.12.1"
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
 
-regenerator-runtime@^0.13.2:
-  version "0.13.3"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
+regenerator-runtime@^0.13.2, regenerator-runtime@^0.13.4:
+  version "0.13.5"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
+  integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
 
 regenerator-transform@^0.14.0:
   version "0.14.1"
@@ -10841,13 +12020,15 @@ regex-cache@^0.4.2:
 regex-not@^1.0.0, regex-not@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+  integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
   dependencies:
     extend-shallow "^3.0.2"
     safe-regex "^1.1.0"
 
-regexp.prototype.flags@^1.2.0:
+regexp.prototype.flags@^1.2.0, regexp.prototype.flags@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75"
+  integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
@@ -10855,19 +12036,12 @@ regexp.prototype.flags@^1.2.0:
 regexpp@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
+  integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
 
 regexpp@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e"
 
-regexpu-core@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
-  dependencies:
-    regenerate "^1.2.1"
-    regjsgen "^0.2.0"
-    regjsparser "^0.1.4"
-
 regexpu-core@^4.6.0:
   version "4.6.0"
   resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6"
@@ -10879,20 +12053,10 @@ regexpu-core@^4.6.0:
     unicode-match-property-ecmascript "^1.0.4"
     unicode-match-property-value-ecmascript "^1.1.0"
 
-regjsgen@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
-
 regjsgen@^0.5.0:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c"
 
-regjsparser@^0.1.4:
-  version "0.1.5"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
-  dependencies:
-    jsesc "~0.5.0"
-
 regjsparser@^0.6.0:
   version "0.6.2"
   resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.2.tgz#fd62c753991467d9d1ffe0a9f67f27a529024b96"
@@ -10902,10 +12066,12 @@ regjsparser@^0.6.0:
 relateurl@0.2.x:
   version "0.2.7"
   resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+  integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=
 
 remark-parse@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95"
+  integrity sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==
   dependencies:
     collapse-white-space "^1.0.2"
     is-alphabetical "^1.0.0"
@@ -10926,10 +12092,12 @@ remark-parse@^5.0.0:
 remove-trailing-separator@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+  integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
 
 renderkid@^2.0.1:
   version "2.0.3"
   resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149"
+  integrity sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==
   dependencies:
     css-select "^1.1.0"
     dom-converter "^0.2"
@@ -10940,6 +12108,7 @@ renderkid@^2.0.1:
 repeat-element@^1.1.2:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+  integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==
 
 repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1:
   version "1.6.1"
@@ -10954,22 +12123,49 @@ repeating@^2.0.0:
 replace-ext@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+  integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=
+
+request-debug@^0.2.0:
+  version "0.2.0"
+  resolved "https://registry.yarnpkg.com/request-debug/-/request-debug-0.2.0.tgz#fc054ec817181b04ca41a052c136f61c48abaf78"
+  integrity sha1-/AVOyBcYGwTKQaBSwTb2HEirr3g=
+  dependencies:
+    stringify-clone "^1.0.0"
 
 request-promise-core@1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9"
+  integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==
   dependencies:
     lodash "^4.17.15"
 
+request-promise-core@1.1.4:
+  version "1.1.4"
+  resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
+  integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==
+  dependencies:
+    lodash "^4.17.19"
+
 request-promise-native@^1.0.5:
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36"
+  integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==
   dependencies:
     request-promise-core "1.1.3"
     stealthy-require "^1.1.1"
     tough-cookie "^2.3.3"
 
-request@2.88.0, request@^2.87.0, request@^2.88.0:
+request-promise@^4.2.5:
+  version "4.2.6"
+  resolved "https://registry.yarnpkg.com/request-promise/-/request-promise-4.2.6.tgz#7e7e5b9578630e6f598e3813c0f8eb342a27f0a2"
+  integrity sha512-HCHI3DJJUakkOr8fNoCc73E5nU5bqITjOYFMDrKHYOXWXrgD/SBaC7LjwuPymUprRyuF06UK7hd/lMHkmUXglQ==
+  dependencies:
+    bluebird "^3.5.0"
+    request-promise-core "1.1.4"
+    stealthy-require "^1.1.1"
+    tough-cookie "^2.3.3"
+
+request@2.88.0, request@^2.88.0:
   version "2.88.0"
   resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
   dependencies:
@@ -10994,53 +12190,109 @@ request@2.88.0, request@^2.87.0, request@^2.88.0:
     tunnel-agent "^0.6.0"
     uuid "^3.3.2"
 
+request@^2.87.0, request@^2.88.2:
+  version "2.88.2"
+  resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+  integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+  dependencies:
+    aws-sign2 "~0.7.0"
+    aws4 "^1.8.0"
+    caseless "~0.12.0"
+    combined-stream "~1.0.6"
+    extend "~3.0.2"
+    forever-agent "~0.6.1"
+    form-data "~2.3.2"
+    har-validator "~5.1.3"
+    http-signature "~1.2.0"
+    is-typedarray "~1.0.0"
+    isstream "~0.1.2"
+    json-stringify-safe "~5.0.1"
+    mime-types "~2.1.19"
+    oauth-sign "~0.9.0"
+    performance-now "^2.1.0"
+    qs "~6.5.2"
+    safe-buffer "^5.1.2"
+    tough-cookie "~2.5.0"
+    tunnel-agent "^0.6.0"
+    uuid "^3.3.2"
+
 require-directory@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+  integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
 
 require-main-filename@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+  integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
 
 require-main-filename@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+  integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
 
 require-relative@^0.8.7:
   version "0.8.7"
   resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de"
 
+require-uncached@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+  integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=
+  dependencies:
+    caller-path "^0.1.0"
+    resolve-from "^1.0.0"
+
 requires-port@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+  integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
 
 resolve-cwd@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+  integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=
   dependencies:
     resolve-from "^3.0.0"
 
+resolve-from@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+  integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=
+
 resolve-from@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+  integrity sha1-six699nWiBvItuZTM17rywoYh0g=
 
 resolve-from@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+  integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
 
 resolve-pathname@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
+  integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
 
 resolve-url@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+  integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
 
 resolve@1.1.7:
   version "1.1.7"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+  integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
+
+resolve@^1.10.0, resolve@^1.12.0, resolve@^1.15.1, resolve@^1.3.2:
+  version "1.17.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
+  integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
+  dependencies:
+    path-parse "^1.0.6"
 
-resolve@^1.1.5, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1, resolve@^1.9.0:
+resolve@^1.10.1, resolve@^1.8.1, resolve@^1.9.0:
   version "1.15.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5"
   dependencies:
@@ -11049,6 +12301,7 @@ resolve@^1.1.5, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.3.2, resolve@^1.4.0
 restore-cursor@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+  integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368=
   dependencies:
     onetime "^2.0.0"
     signal-exit "^3.0.2"
@@ -11063,6 +12316,7 @@ restore-cursor@^3.1.0:
 ret@~0.1.10:
   version "0.1.15"
   resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+  integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
 
 retry@^0.10.0:
   version "0.10.1"
@@ -11071,6 +12325,7 @@ retry@^0.10.0:
 retry@^0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
+  integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
 
 reusify@^1.0.0:
   version "1.0.4"
@@ -11079,14 +12334,7 @@ reusify@^1.0.0:
 revalidator@0.1.x:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
-
-rgb-regex@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
-
-rgba-regex@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+  integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs=
 
 rimraf@2, rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3:
   version "2.7.1"
@@ -11094,9 +12342,10 @@ rimraf@2, rimraf@2.x.x, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6
   dependencies:
     glob "^7.1.3"
 
-rimraf@2.6.3:
+rimraf@2.6.3, rimraf@~2.6.2:
   version "2.6.3"
   resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
+  integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
   dependencies:
     glob "^7.1.3"
 
@@ -11109,10 +12358,16 @@ rimraf@^3.0.0:
 ripemd160@^2.0.0, ripemd160@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+  integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==
   dependencies:
     hash-base "^3.0.0"
     inherits "^2.0.1"
 
+route-recognizer@^0.3.4:
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/route-recognizer/-/route-recognizer-0.3.4.tgz#39ab1ffbce1c59e6d2bdca416f0932611e4f3ca3"
+  integrity sha512-2+MhsfPhvauN1O8KaXpXAOfR/fwe8dnUXVM+xw7yt40lJRfPVQxV6yryZm0cgRvAj5fMF/mdRZbL2ptwbs5i2g==
+
 rst-selector-parser@^2.2.3:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
@@ -11123,12 +12378,12 @@ rst-selector-parser@^2.2.3:
 rsvp@^4.8.4:
   version "4.8.5"
   resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
+  integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
 
 run-async@^2.2.0:
-  version "2.3.0"
-  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
-  dependencies:
-    is-promise "^2.1.0"
+  version "2.4.1"
+  resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
+  integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
 
 run-node@^1.0.0:
   version "1.0.0"
@@ -11141,6 +12396,7 @@ run-parallel@^1.1.9:
 run-queue@^1.0.0, run-queue@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+  integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=
   dependencies:
     aproba "^1.1.1"
 
@@ -11148,12 +12404,19 @@ rw@1:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
 
-rxjs@^6.3.3, rxjs@^6.4.0:
+rxjs@^6.3.3:
   version "6.5.3"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a"
   dependencies:
     tslib "^1.9.0"
 
+rxjs@^6.4.0:
+  version "6.6.0"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84"
+  integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==
+  dependencies:
+    tslib "^1.9.0"
+
 rxjs@^6.5.3:
   version "6.5.4"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
@@ -11163,30 +12426,29 @@ rxjs@^6.5.3:
 safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+  integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
-safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
-  version "5.2.0"
-  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
+safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0:
+  version "5.2.1"
+  resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+  integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
 
 safe-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+  integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
   dependencies:
     ret "~0.1.10"
 
-"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
-
-safer-eval@^1.3.0:
-  version "1.3.6"
-  resolved "https://registry.yarnpkg.com/safer-eval/-/safer-eval-1.3.6.tgz#ee51e3348c39fdc4117a47dfb4b69df56a2e40cf"
-  dependencies:
-    clones "^1.2.0"
+  integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
 sane@^4.0.3:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
+  integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
   dependencies:
     "@cnakazawa/watch" "^1.0.3"
     anymatch "^2.0.0"
@@ -11217,30 +12479,15 @@ sass-loader@^8.0.0:
     schema-utils "^2.6.1"
     semver "^6.3.0"
 
-sax@0.5.x:
-  version "0.5.8"
-  resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1"
-
 sax@^1.2.4, sax@~1.2.4:
   version "1.2.4"
   resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
-
-saxes@^3.1.9:
-  version "3.1.11"
-  resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.11.tgz#d59d1fd332ec92ad98a2e0b2ee644702384b1c5b"
-  dependencies:
-    xmlchars "^2.1.1"
-
-scheduler@^0.12.0:
-  version "0.12.0"
-  resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.12.0.tgz#8ab17699939c0aedc5a196a657743c496538647b"
-  dependencies:
-    loose-envify "^1.1.0"
-    object-assign "^4.1.1"
+  integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
 scheduler@^0.13.6:
   version "0.13.6"
   resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
+  integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==
   dependencies:
     loose-envify "^1.1.0"
     object-assign "^4.1.1"
@@ -11255,6 +12502,7 @@ scheduler@^0.18.0:
 schema-utils@^0.4.0:
   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==
   dependencies:
     ajv "^6.1.0"
     ajv-keywords "^3.1.0"
@@ -11262,6 +12510,7 @@ schema-utils@^0.4.0:
 schema-utils@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
+  integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==
   dependencies:
     ajv "^6.1.0"
     ajv-errors "^1.0.0"
@@ -11274,6 +12523,22 @@ schema-utils@^2.6.1:
     ajv "^6.10.2"
     ajv-keywords "^3.4.1"
 
+schema-utils@^2.6.5:
+  version "2.7.0"
+  resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
+  integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==
+  dependencies:
+    "@types/json-schema" "^7.0.4"
+    ajv "^6.12.2"
+    ajv-keywords "^3.4.1"
+
+script-ext-html-webpack-plugin@2.1.3:
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/script-ext-html-webpack-plugin/-/script-ext-html-webpack-plugin-2.1.3.tgz#b4bf703cddbe3de2e6f483e19dfeba2b5ec4abfe"
+  integrity sha512-a/gqxJFw2IAs8LK/ZFBKv1YoeFysbntdiLBVdNfgHgMKWW1mMcRGY6Hm3aihSaY9tqqhcaXuQJ4nn19loNbkuQ==
+  dependencies:
+    debug "^4.1.0"
+
 scss-tokenizer@^0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1"
@@ -11288,10 +12553,12 @@ section-iterator@^2.0.0:
 select-hose@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+  integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=
 
-selfsigned@^1.10.4:
+selfsigned@^1.10.7:
   version "1.10.7"
   resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz#da5819fd049d5574f28e88a9bcc6dbc6e6f3906b"
+  integrity sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==
   dependencies:
     node-forge "0.9.0"
 
@@ -11302,14 +12569,16 @@ semver-compare@^1.0.0:
 "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
   version "5.7.1"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
 
 semver@5.5.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
 
-semver@6.3.0, semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
+semver@6.3.0, semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
   version "6.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
 
 semver@~5.3.0:
   version "5.3.0"
@@ -11318,6 +12587,7 @@ semver@~5.3.0:
 send@0.17.1:
   version "0.17.1"
   resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+  integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
   dependencies:
     debug "2.6.9"
     depd "~1.1.2"
@@ -11333,24 +12603,22 @@ send@0.17.1:
     range-parser "~1.2.1"
     statuses "~1.5.0"
 
-serialize-javascript@^1.7.0:
+serialize-javascript@^1.4.0:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
+  integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
 
-serialize-javascript@^2.1.2:
-  version "2.1.2"
-  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
-
-serialize-to-js@^1.1.1:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-1.2.2.tgz#1a567b0c9bf557bc7d7b77b503dfae0a8218d15d"
+serialize-javascript@^3.1.0:
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz#8bf3a9170712664ef2561b44b691eafe399214ea"
+  integrity sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==
   dependencies:
-    js-beautify "^1.8.9"
-    safer-eval "^1.3.0"
+    randombytes "^2.1.0"
 
 serve-index@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+  integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=
   dependencies:
     accepts "~1.3.4"
     batch "0.6.1"
@@ -11360,7 +12628,7 @@ serve-index@^1.9.1:
     mime-types "~2.1.17"
     parseurl "~1.3.2"
 
-serve-static@1.14.1, serve-static@^1.12.4:
+serve-static@1.14.1:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
   dependencies:
@@ -11369,6 +12637,11 @@ serve-static@1.14.1, serve-static@^1.12.4:
     parseurl "~1.3.3"
     send "0.17.1"
 
+server-destroy@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
+  integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=
+
 set-blocking@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-1.0.0.tgz#cd5e5d938048df1ac92dfe92e1f16add656f5ec5"
@@ -11376,10 +12649,17 @@ set-blocking@^1.0.0:
 set-blocking@^2.0.0, set-blocking@~2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+  integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+set-cookie-parser@^2.3.5:
+  version "2.4.6"
+  resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.6.tgz#43bdea028b9e6f176474ee5298e758b4a44799c3"
+  integrity sha512-mNCnTUF0OYPwYzSHbdRdCfNNHqrne+HS5tS5xNb6yJbdP9wInV0q5xPLE0EyfV/Q3tImo3y/OXpD8Jn0Jtnjrg==
 
 set-value@^2.0.0, set-value@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
+  integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
   dependencies:
     extend-shallow "^2.0.1"
     is-extendable "^0.1.1"
@@ -11389,18 +12669,22 @@ set-value@^2.0.0, set-value@^2.0.1:
 setimmediate@^1.0.4, setimmediate@^1.0.5:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+  integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
 
 setprototypeof@1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+  integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
 
 setprototypeof@1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
+  integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
 
 sha.js@^2.4.0, sha.js@^2.4.8:
   version "2.4.11"
   resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+  integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
   dependencies:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
@@ -11411,21 +12695,19 @@ shallow-clone@^3.0.0:
   dependencies:
     kind-of "^6.0.2"
 
-shallow-copy@~0.0.1:
-  version "0.0.1"
-  resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
-
-shallow-equal@^1.0.0:
+shallow-equal@^1.0.0, shallow-equal@^1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da"
 
 shallowequal@^1.0.2, shallowequal@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
+  integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
 
 shebang-command@^1.2.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+  integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
   dependencies:
     shebang-regex "^1.0.0"
 
@@ -11438,6 +12720,7 @@ shebang-command@^2.0.0:
 shebang-regex@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+  integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
 
 shebang-regex@^3.0.0:
   version "3.0.0"
@@ -11450,36 +12733,45 @@ shell-quote@^1.6.1:
 shellwords@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+  integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
+
+side-channel@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947"
+  integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA==
+  dependencies:
+    es-abstract "^1.17.0-next.1"
+    object-inspect "^1.7.0"
 
-sift@6.0.0:
+sift@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/sift/-/sift-6.0.0.tgz#f93a778e5cbf05a5024ebc391e6b32511a6d1f82"
+  integrity sha1-+Tp3jly/BaUCTrw5HmsyURptH4I=
 
 sigmund@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+  integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=
 
 signal-exit@^3.0.0, signal-exit@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
-
-simple-swizzle@^0.2.2:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
-  dependencies:
-    is-arrayish "^0.3.1"
+  version "3.0.3"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+  integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
 
-sisteransi@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3"
+sisteransi@^1.0.4:
+  version "1.0.5"
+  resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+  integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
 
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+  integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=
 
 slash@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
+  integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
 
 slash@^3.0.0:
   version "3.0.0"
@@ -11492,11 +12784,17 @@ slice-ansi@0.0.4:
 slice-ansi@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
+  integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
   dependencies:
     ansi-styles "^3.2.0"
     astral-regex "^1.0.0"
     is-fullwidth-code-point "^2.0.0"
 
+slugify@^1.3.4:
+  version "1.4.5"
+  resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.4.5.tgz#a7517acf5f4c02a4df41e735354b660a4ed1efcf"
+  integrity sha512-WpECLAgYaxHoEAJ8Q1Lo8HOs1ngn7LN7QjXgOLbmmfkcWvosyk4ZTXkTzKyhngK640USTZUlgoQJfED1kz5fnQ==
+
 smart-buffer@^4.1.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba"
@@ -11504,6 +12802,7 @@ smart-buffer@^4.1.0:
 snapdragon-node@^2.0.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+  integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
   dependencies:
     define-property "^1.0.0"
     isobject "^3.0.0"
@@ -11512,12 +12811,14 @@ snapdragon-node@^2.0.1:
 snapdragon-util@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+  integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
   dependencies:
     kind-of "^3.2.0"
 
 snapdragon@^0.8.1:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+  integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
   dependencies:
     base "^0.11.1"
     debug "^2.2.0"
@@ -11528,9 +12829,10 @@ snapdragon@^0.8.1:
     source-map-resolve "^0.5.0"
     use "^3.1.0"
 
-sockjs-client@1.3.0:
-  version "1.3.0"
-  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177"
+sockjs-client@1.4.0:
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz#c9f2568e19c8fd8173b4997ea3420e0bb306c7d5"
+  integrity sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==
   dependencies:
     debug "^3.2.5"
     eventsource "^1.0.7"
@@ -11542,6 +12844,7 @@ sockjs-client@1.3.0:
 sockjs@0.3.19:
   version "0.3.19"
   resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
+  integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==
   dependencies:
     faye-websocket "^0.10.0"
     uuid "^3.0.1"
@@ -11560,19 +12863,15 @@ socks@~2.3.2:
     ip "1.1.5"
     smart-buffer "^4.1.0"
 
-sort-keys@^1.0.0:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
-  dependencies:
-    is-plain-obj "^1.0.0"
-
 source-list-map@^2.0.0:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
+  integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
 
 source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
   version "0.5.3"
   resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+  integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
   dependencies:
     atob "^2.1.2"
     decode-uri-component "^0.2.0"
@@ -11580,9 +12879,10 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
     source-map-url "^0.4.0"
     urix "^0.1.0"
 
-source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12:
-  version "0.5.16"
-  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042"
+source-map-support@^0.5.6, source-map-support@~0.5.12:
+  version "0.5.19"
+  resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+  integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
   dependencies:
     buffer-from "^1.0.0"
     source-map "^0.6.0"
@@ -11590,16 +12890,7 @@ source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.1
 source-map-url@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
-
-source-map@0.1.x:
-  version "0.1.43"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346"
-  dependencies:
-    amdefine ">=0.0.4"
-
-source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
-  version "0.6.1"
-  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+  integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=
 
 source-map@^0.4.2:
   version "0.4.4"
@@ -11607,28 +12898,42 @@ source-map@^0.4.2:
   dependencies:
     amdefine ">=0.0.4"
 
-source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6:
+source-map@^0.5.0, source-map@^0.5.6:
   version "0.5.7"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+  integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+  version "0.6.1"
+  resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
 
 source-map@^0.7.3:
   version "0.7.3"
   resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+  integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
+spark-md5@3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.0.tgz#3722227c54e2faf24b1dc6d933cc144e6f71bfef"
+  integrity sha1-NyIifFTi+vJLHcbZM8wUTm9xv+8=
 
 spdx-correct@^3.0.0:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4"
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+  integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
   dependencies:
     spdx-expression-parse "^3.0.0"
     spdx-license-ids "^3.0.0"
 
 spdx-exceptions@^2.1.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977"
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+  integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
 
 spdx-expression-parse@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+  integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
   dependencies:
     spdx-exceptions "^2.1.0"
     spdx-license-ids "^3.0.0"
@@ -11636,10 +12941,12 @@ spdx-expression-parse@^3.0.0:
 spdx-license-ids@^3.0.0:
   version "3.0.5"
   resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
+  integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
 
 spdy-transport@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
+  integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
   dependencies:
     debug "^4.1.0"
     detect-node "^2.0.4"
@@ -11648,9 +12955,10 @@ spdy-transport@^3.0.0:
     readable-stream "^3.0.6"
     wbuf "^1.7.3"
 
-spdy@^4.0.0:
-  version "4.0.1"
-  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.1.tgz#6f12ed1c5db7ea4f24ebb8b89ba58c87c08257f2"
+spdy@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b"
+  integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
   dependencies:
     debug "^4.1.0"
     handle-thing "^2.0.0"
@@ -11658,15 +12966,10 @@ spdy@^4.0.0:
     select-hose "^2.0.0"
     spdy-transport "^3.0.0"
 
-speed-measure-webpack-plugin@1.3.1:
-  version "1.3.1"
-  resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz#69840a5cdc08b4638697dac7db037f595d7f36a0"
-  dependencies:
-    chalk "^2.0.1"
-
 split-string@^3.0.1, split-string@^3.0.2:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+  integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
   dependencies:
     extend-shallow "^3.0.0"
 
@@ -11685,10 +12988,12 @@ split@^1.0.0:
 sprintf-js@~1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+  integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
 
 sshpk@^1.7.0:
   version "1.16.1"
   resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+  integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
   dependencies:
     asn1 "~0.2.3"
     assert-plus "^1.0.0"
@@ -11700,6 +13005,13 @@ sshpk@^1.7.0:
     safer-buffer "^2.0.2"
     tweetnacl "~0.14.0"
 
+ssri@^5.2.4:
+  version "5.3.0"
+  resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+  integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==
+  dependencies:
+    safe-buffer "^5.1.1"
+
 ssri@^6.0.0, ssri@^6.0.1:
   version "6.0.1"
   resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8"
@@ -11709,14 +13021,17 @@ ssri@^6.0.0, ssri@^6.0.1:
 stable@^0.1.8:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+  integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
 
-stack-trace@0.0.x:
+stack-trace@0.0.10, stack-trace@0.0.x:
   version "0.0.10"
   resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0"
+  integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=
 
 stack-utils@^1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8"
+  integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==
 
 stampit@1.2.0:
   version "1.2.0"
@@ -11747,42 +13062,20 @@ standard-version@^7.0.1:
 state-toggle@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe"
-
-static-eval@^2.0.0:
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.3.tgz#cb62fc79946bd4d5f623a45ad428233adace4d72"
-  dependencies:
-    escodegen "^1.11.1"
+  integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==
 
 static-extend@^0.1.1:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+  integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
   dependencies:
     define-property "^0.2.5"
     object-copy "^0.1.0"
 
-static-module@^2.2.0:
-  version "2.2.5"
-  resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf"
-  dependencies:
-    concat-stream "~1.6.0"
-    convert-source-map "^1.5.1"
-    duplexer2 "~0.1.4"
-    escodegen "~1.9.0"
-    falafel "^2.1.0"
-    has "^1.0.1"
-    magic-string "^0.22.4"
-    merge-source-map "1.0.4"
-    object-inspect "~1.4.0"
-    quote-stream "~1.0.2"
-    readable-stream "~2.3.3"
-    shallow-copy "~0.0.1"
-    static-eval "^2.0.0"
-    through2 "~2.0.3"
-
 "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+  integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
 
 stdout-stream@^1.4.0:
   version "1.4.1"
@@ -11793,10 +13086,19 @@ stdout-stream@^1.4.0:
 stealthy-require@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+  integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
+steno@^0.4.1:
+  version "0.4.4"
+  resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb"
+  integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=
+  dependencies:
+    graceful-fs "^4.1.3"
 
 stream-browserify@^2.0.1:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+  integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
   dependencies:
     inherits "~2.0.1"
     readable-stream "^2.0.2"
@@ -11804,6 +13106,7 @@ stream-browserify@^2.0.1:
 stream-each@^1.1.0:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae"
+  integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==
   dependencies:
     end-of-stream "^1.1.0"
     stream-shift "^1.0.0"
@@ -11811,6 +13114,7 @@ stream-each@^1.1.0:
 stream-http@^2.7.2:
   version "2.8.3"
   resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+  integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==
   dependencies:
     builtin-status-codes "^3.0.0"
     inherits "^2.0.1"
@@ -11821,10 +13125,12 @@ stream-http@^2.7.2:
 stream-shift@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d"
+  integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==
 
 strict-uri-encode@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+  integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=
 
 string-argv@^0.3.0:
   version "0.3.1"
@@ -11833,6 +13139,7 @@ string-argv@^0.3.0:
 string-length@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed"
+  integrity sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=
   dependencies:
     astral-regex "^1.0.0"
     strip-ansi "^4.0.0"
@@ -11840,6 +13147,7 @@ string-length@^2.0.0:
 string-width@^1.0.1, string-width@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
   dependencies:
     code-point-at "^1.0.0"
     is-fullwidth-code-point "^1.0.0"
@@ -11848,6 +13156,7 @@ string-width@^1.0.1, string-width@^1.0.2:
 "string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+  integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
   dependencies:
     is-fullwidth-code-point "^2.0.0"
     strip-ansi "^4.0.0"
@@ -11855,6 +13164,7 @@ string-width@^1.0.1, string-width@^1.0.2:
 string-width@^3.0.0, string-width@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+  integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
   dependencies:
     emoji-regex "^7.0.1"
     is-fullwidth-code-point "^2.0.0"
@@ -11868,6 +13178,18 @@ string-width@^4.1.0, string-width@^4.2.0:
     is-fullwidth-code-point "^3.0.0"
     strip-ansi "^6.0.0"
 
+string.prototype.matchall@^4.0.2:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.2.tgz#48bb510326fb9fdeb6a33ceaa81a6ea04ef7648e"
+  integrity sha512-N/jp6O5fMf9os0JU3E72Qhf590RSRZU/ungsL/qJUYVTNv7hTG0P/dbPjxINVN9jpscu3nzYwKESU3P3RY5tOg==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.0"
+    has-symbols "^1.0.1"
+    internal-slot "^1.0.2"
+    regexp.prototype.flags "^1.3.0"
+    side-channel "^1.0.2"
+
 string.prototype.padend@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz#dc08f57a8010dc5c153550318f67e13adbb72ac3"
@@ -11878,37 +13200,65 @@ string.prototype.padend@^3.0.0:
 string.prototype.trim@^1.1.2:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.1.tgz#141233dff32c82bfad80684d7e5f0869ee0fb782"
+  integrity sha512-MjGFEeqixw47dAMFMtgUro/I0+wNqZB5GKXGt1fFr24u3TzDXCPu7J9Buppzoe3r/LqkSDLDDJzE15RGWDGAVw==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.0-next.1"
     function-bind "^1.1.1"
 
+string.prototype.trimend@^1.0.0, string.prototype.trimend@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913"
+  integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
+
 string.prototype.trimleft@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74"
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz#4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc"
+  integrity sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==
   dependencies:
     define-properties "^1.1.3"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
+    string.prototype.trimstart "^1.0.0"
 
 string.prototype.trimright@^2.1.1:
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9"
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz#c76f1cef30f21bbad8afeb8db1511496cfb0f2a3"
+  integrity sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==
   dependencies:
     define-properties "^1.1.3"
-    function-bind "^1.1.1"
+    es-abstract "^1.17.5"
+    string.prototype.trimend "^1.0.0"
+
+string.prototype.trimstart@^1.0.0, string.prototype.trimstart@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
+  integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==
+  dependencies:
+    define-properties "^1.1.3"
+    es-abstract "^1.17.5"
 
 string_decoder@^1.0.0, string_decoder@^1.1.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+  integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
   dependencies:
     safe-buffer "~5.2.0"
 
 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"
 
+stringify-clone@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/stringify-clone/-/stringify-clone-1.1.1.tgz#309a235fb4ecfccd7d388dbe18ba904facaf433b"
+  integrity sha1-MJojX7Ts/M19OI2+GLqQT6yvQzs=
+
 stringify-object@^3.3.0:
   version "3.3.0"
   resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
@@ -11924,18 +13274,21 @@ stringify-package@1.0.1:
 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"
+  integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
   dependencies:
     ansi-regex "^2.0.0"
 
 strip-ansi@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+  integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8=
   dependencies:
     ansi-regex "^3.0.0"
 
 strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+  integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
   dependencies:
     ansi-regex "^4.1.0"
 
@@ -11954,10 +13307,12 @@ strip-bom@^2.0.0:
 strip-bom@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=
 
 strip-eof@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+  integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
 
 strip-final-newline@^2.0.0:
   version "2.0.0"
@@ -11973,29 +13328,37 @@ strip-indent@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68"
 
-strip-json-comments@2.0.1, strip-json-comments@^2.0.0, strip-json-comments@^2.0.1:
+strip-json-comments@2.0.1, strip-json-comments@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+  integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+strip-json-comments@3.1.1, strip-json-comments@^3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+  integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
 
 strip-json-comments@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7"
 
+strtok3@^6.0.3:
+  version "6.0.4"
+  resolved "https://registry.yarnpkg.com/strtok3/-/strtok3-6.0.4.tgz#ede0d20fde5aa9fda56417c3558eaafccc724694"
+  integrity sha512-rqWMKwsbN9APU47bQTMEYTPcwdpKDtmf1jVhHzNW2cL1WqAxaM9iBb9t5P2fj+RV2YsErUWgQzHD5JwV0uCTEQ==
+  dependencies:
+    "@tokenizer/token" "^0.1.1"
+    "@types/debug" "^4.1.5"
+    peek-readable "^3.1.0"
+
 style-loader@0.23.1:
   version "0.23.1"
   resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925"
+  integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg==
   dependencies:
     loader-utils "^1.1.0"
     schema-utils "^1.0.0"
 
-stylehacks@^4.0.0:
-  version "4.0.3"
-  resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
-  dependencies:
-    browserslist "^4.0.0"
-    postcss "^7.0.0"
-    postcss-selector-parser "^3.0.0"
-
 stylint@1.5.9:
   version "1.5.9"
   resolved "https://registry.yarnpkg.com/stylint/-/stylint-1.5.9.tgz#29f4dc129fa1ca22150cd867223cee2bed5ff6a2"
@@ -12015,55 +13378,72 @@ stylint@1.5.9:
 stylus-loader@3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6"
+  integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==
   dependencies:
     loader-utils "^1.0.2"
     lodash.clonedeep "^4.5.0"
     when "~3.6.x"
 
-stylus@0.54.5:
-  version "0.54.5"
-  resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79"
+stylus@0.54.7:
+  version "0.54.7"
+  resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.7.tgz#c6ce4793965ee538bcebe50f31537bfc04d88cd2"
+  integrity sha512-Yw3WMTzVwevT6ZTrLCYNHAFmanMxdylelL3hkWNgPMeTCpMwpV3nXjpOHuBXtFv7aiO2xRuQS6OoAdgkNcSNug==
   dependencies:
-    css-parse "1.7.x"
-    debug "*"
-    glob "7.0.x"
-    mkdirp "0.5.x"
-    sax "0.5.x"
-    source-map "0.1.x"
+    css-parse "~2.0.0"
+    debug "~3.1.0"
+    glob "^7.1.3"
+    mkdirp "~0.5.x"
+    safer-buffer "^2.1.2"
+    sax "~1.2.4"
+    semver "^6.0.0"
+    source-map "^0.7.3"
 
 supports-color@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
 
 supports-color@^3.2.3:
   version "3.2.3"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+  integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
   dependencies:
     has-flag "^1.0.0"
 
-supports-color@^5.3.0, supports-color@^5.4.0:
+supports-color@^5.3.0:
   version "5.5.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+  integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
   dependencies:
     has-flag "^3.0.0"
 
 supports-color@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
+  integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
   dependencies:
     has-flag "^3.0.0"
 
-svg-baker-runtime@1.4.1:
-  version "1.4.1"
-  resolved "https://registry.yarnpkg.com/svg-baker-runtime/-/svg-baker-runtime-1.4.1.tgz#d3f77dffdf1f1a8b8f1e84ef67d2c1b53d60d770"
+supports-color@^7.1.0:
+  version "7.1.0"
+  resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
+  integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
+  dependencies:
+    has-flag "^4.0.0"
+
+svg-baker-runtime@^1.4.5:
+  version "1.4.7"
+  resolved "https://registry.yarnpkg.com/svg-baker-runtime/-/svg-baker-runtime-1.4.7.tgz#f4720637f5b6202eef6378d81f1fead0815f8a4e"
+  integrity sha512-Zorfwwj5+lWjk/oxwSMsRdS2sPQQdTmmsvaSpzU+i9ZWi3zugHLt6VckWfnswphQP0LmOel3nggpF5nETbt6xw==
   dependencies:
     deepmerge "1.3.2"
     mitt "1.1.2"
-    svg-baker "^1.4.0"
+    svg-baker "^1.7.0"
 
-svg-baker@^1.4.0, svg-baker@^1.4.1:
-  version "1.5.0"
-  resolved "https://registry.yarnpkg.com/svg-baker/-/svg-baker-1.5.0.tgz#e94e75523d9303e9a2b3448987080d966cb90af4"
+svg-baker@^1.5.0, svg-baker@^1.7.0:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/svg-baker/-/svg-baker-1.7.0.tgz#8367f78d875550c52fe4756f7303d5c5d7c2e9a7"
+  integrity sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==
   dependencies:
     bluebird "^3.5.0"
     clone "^2.1.1"
@@ -12079,9 +13459,10 @@ svg-baker@^1.4.0, svg-baker@^1.4.1:
     query-string "^4.3.2"
     traverse "^0.6.6"
 
-svg-sprite-loader@4.1.6:
-  version "4.1.6"
-  resolved "https://registry.yarnpkg.com/svg-sprite-loader/-/svg-sprite-loader-4.1.6.tgz#ca03d51201e326c1c018389c81d5b0eb78dc01de"
+svg-sprite-loader@4.2.3:
+  version "4.2.3"
+  resolved "https://registry.yarnpkg.com/svg-sprite-loader/-/svg-sprite-loader-4.2.3.tgz#1fb39ebc886827b11c53bf82a5ce0490e1e4febf"
+  integrity sha512-BKZpTttCpIugyvezWGGXRI7GCuk7BMeuFjM+1m42NpvmhNQHavVye8HdKQ+j3z+SbFbC0oObFNLTT7TLZk1Jsg==
   dependencies:
     bluebird "^3.5.0"
     deepmerge "1.3.2"
@@ -12089,30 +13470,11 @@ svg-sprite-loader@4.1.6:
     escape-string-regexp "1.0.5"
     html-webpack-plugin "^3.2.0"
     loader-utils "^1.1.0"
-    svg-baker "^1.4.1"
-    svg-baker-runtime "1.4.1"
+    svg-baker "^1.5.0"
+    svg-baker-runtime "^1.4.5"
     url-slug "2.0.0"
 
-svgo@1.2.2:
-  version "1.2.2"
-  resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.2.2.tgz#0253d34eccf2aed4ad4f283e11ee75198f9d7316"
-  dependencies:
-    chalk "^2.4.1"
-    coa "^2.0.2"
-    css-select "^2.0.0"
-    css-select-base-adapter "^0.1.1"
-    css-tree "1.0.0-alpha.28"
-    css-url-regex "^1.1.0"
-    csso "^3.5.1"
-    js-yaml "^3.13.1"
-    mkdirp "~0.5.1"
-    object.values "^1.1.0"
-    sax "~1.2.4"
-    stable "^0.1.8"
-    unquote "~1.1.1"
-    util.promisify "~1.0.0"
-
-svgo@^1.0.0, svgo@^1.3.2:
+svgo@1.3.2:
   version "1.3.2"
   resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167"
   dependencies:
@@ -12130,30 +13492,42 @@ svgo@^1.0.0, svgo@^1.3.2:
     unquote "~1.1.1"
     util.promisify "~1.0.0"
 
+sweetalert@^2.1.2:
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/sweetalert/-/sweetalert-2.1.2.tgz#010baaa80d0dbdc86f96bfcaa96b490728594b79"
+  integrity sha512-iWx7X4anRBNDa/a+AdTmvAzQtkN1+s4j/JJRWlHpYE8Qimkohs8/XnFcWeYHH2lMA8LRCa5tj2d244If3S/hzA==
+  dependencies:
+    es6-object-assign "^1.1.0"
+    promise-polyfill "^6.0.2"
+
 symbol-observable@1.2.0, symbol-observable@^1.0.3, symbol-observable@^1.0.4, symbol-observable@^1.1.0:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
+  integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==
 
 symbol-tree@^3.2.2:
   version "3.2.4"
   resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
 symbol@^0.2.1:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/symbol/-/symbol-0.2.3.tgz#3b9873b8a901e47c6efe21526a3ac372ef28bbc7"
 
-table@^5.2.3:
+table@^5.0.2, table@^5.2.3:
   version "5.4.6"
   resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
+  integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
   dependencies:
     ajv "^6.10.2"
     lodash "^4.17.14"
     slice-ansi "^2.1.0"
     string-width "^3.0.0"
 
-tapable@^1.0.0, tapable@^1.1.0:
+tapable@^1.0.0, tapable@^1.1.3:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
+  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 
 tar@4.4.13:
   version "4.4.13"
@@ -12176,31 +13550,25 @@ tar@^2.0.0:
     fstream "^1.0.12"
     inherits "2"
 
-terser-webpack-plugin@^1.1.0:
-  version "1.4.3"
-  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz#5ecaf2dbdc5fb99745fd06791f46fc9ddb1c9a7c"
+terser-webpack-plugin@^1.4.3:
+  version "1.4.4"
+  resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz#2c63544347324baafa9a56baaddf1634c8abfc2f"
+  integrity sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==
   dependencies:
     cacache "^12.0.2"
     find-cache-dir "^2.1.0"
     is-wsl "^1.1.0"
     schema-utils "^1.0.0"
-    serialize-javascript "^2.1.2"
+    serialize-javascript "^3.1.0"
     source-map "^0.6.1"
     terser "^4.1.2"
     webpack-sources "^1.4.0"
     worker-farm "^1.7.0"
 
-terser@^3.7.3:
-  version "3.17.0"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2"
-  dependencies:
-    commander "^2.19.0"
-    source-map "~0.6.1"
-    source-map-support "~0.5.10"
-
-terser@^4.1.2, terser@^4.3.9:
-  version "4.6.3"
-  resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.3.tgz#e33aa42461ced5238d352d2df2a67f21921f8d87"
+terser@^4.1.2:
+  version "4.8.0"
+  resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17"
+  integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==
   dependencies:
     commander "^2.20.0"
     source-map "~0.6.1"
@@ -12209,6 +13577,7 @@ terser@^4.1.2, terser@^4.3.9:
 test-exclude@^5.2.3:
   version "5.2.3"
   resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-5.2.3.tgz#c3d3e1e311eb7ee405e092dac10aefd09091eac0"
+  integrity sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==
   dependencies:
     glob "^7.1.3"
     minimatch "^3.0.4"
@@ -12222,6 +13591,7 @@ text-extensions@^1.0.0:
 text-table@^0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+  integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
 
 thenify-all@^1.0.0:
   version "1.6.0"
@@ -12238,8 +13608,9 @@ thenify-all@^1.0.0:
 throat@^4.0.0:
   version "4.1.0"
   resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
+  integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
 
-through2@^2.0.0, through2@^2.0.2, through2@~2.0.3:
+through2@^2.0.0, through2@^2.0.2:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
   dependencies:
@@ -12255,68 +13626,80 @@ through2@^3.0.0:
 through@2, "through@>=2.2.7 <3", through@^2.3.6:
   version "2.3.8"
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
 thunky@^1.0.2:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
+  integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
 
 time-stamp@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
+  integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
+
+timed-out@4.0.1:
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+  integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
 
 timers-browserify@^2.0.4:
   version "2.0.11"
   resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f"
+  integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==
   dependencies:
     setimmediate "^1.0.4"
 
-timsort@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
-
-tiny-inflate@^1.0.0:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4"
-
 tiny-invariant@^1.0.2:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.0.6.tgz#b3f9b38835e36a41c843a3b0907a5a7b3755de73"
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875"
+  integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==
 
-tiny-warning@^1.0.0, tiny-warning@^1.0.2:
+tiny-warning@^1.0.0, tiny-warning@^1.0.2, tiny-warning@^1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
+tldjs@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/tldjs/-/tldjs-2.3.1.tgz#cf09c3eb5d7403a9e214b7d65f3cf9651c0ab039"
+  integrity sha512-W/YVH/QczLUxVjnQhFC61Iq232NWu3TqDdO0S/MtXVz4xybejBov4ud+CIwN9aYqjOecEqIy0PscGkwpG9ZyTw==
+  dependencies:
+    punycode "^1.4.1"
 
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+  integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
   dependencies:
     os-tmpdir "~1.0.2"
 
 tmpl@1.0.x:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+  integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
 
 to-arraybuffer@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
-
-to-fast-properties@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+  integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
 
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+  integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
 to-object-path@^0.3.0:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+  integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
   dependencies:
     kind-of "^3.0.2"
 
 to-regex-range@^2.1.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+  integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
   dependencies:
     is-number "^3.0.0"
     repeat-string "^1.6.1"
@@ -12330,6 +13713,7 @@ to-regex-range@^5.0.1:
 to-regex@^3.0.1, to-regex@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+  integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
   dependencies:
     define-property "^2.0.2"
     extend-shallow "^3.0.2"
@@ -12339,12 +13723,29 @@ to-regex@^3.0.1, to-regex@^3.0.2:
 toidentifier@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
+  integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+
+token-types@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/token-types/-/token-types-2.0.0.tgz#b23618af744818299c6fbf125e0fdad98bab7e85"
+  integrity sha512-WWvu8sGK8/ZmGusekZJJ5NM6rRVTTDO7/bahz4NGiSDb/XsmdYBn6a1N/bymUHuWYTWeuLUg98wUzvE4jPdCZw==
+  dependencies:
+    "@tokenizer/token" "^0.1.0"
+    ieee754 "^1.1.13"
+
+toni@>=0.6.2:
+  version "0.6.2"
+  resolved "https://registry.yarnpkg.com/toni/-/toni-0.6.2.tgz#a6af3bd70ae64de5ab1856e7036fb3b3e5e73cf8"
+  integrity sha1-pq871wrmTeWrGFbnA2+zs+XnPPg=
+  dependencies:
+    bolgia ">=2.7.4"
 
 toposort@^1.0.0:
   version "1.0.7"
   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.5.0:
+tough-cookie@^2.3.1, tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.5.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
   dependencies:
@@ -12354,6 +13755,7 @@ tough-cookie@^2.3.3, tough-cookie@^2.3.4, tough-cookie@^2.5.0:
 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==
   dependencies:
     psl "^1.1.24"
     punycode "^1.4.1"
@@ -12361,12 +13763,14 @@ tough-cookie@~2.4.3:
 tr46@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09"
+  integrity sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=
   dependencies:
     punycode "^2.1.0"
 
 traverse@^0.6.6:
   version "0.6.6"
   resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137"
+  integrity sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=
 
 trim-newlines@^1.0.0:
   version "1.0.0"
@@ -12380,21 +13784,20 @@ trim-off-newlines@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3"
 
-trim-right@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
-
 trim-trailing-lines@^1.0.0:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz#7f0739881ff76657b7776e10874128004b625a94"
+  integrity sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==
 
 trim@0.0.1:
   version "0.0.1"
   resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd"
+  integrity sha1-WFhUf2spB1fulczMZm+1AITEYN0=
 
 trough@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406"
+  integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==
 
 "true-case-path@^1.0.2":
   version "1.0.3"
@@ -12405,20 +13808,17 @@ trough@^1.0.0:
 tryer@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+  integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
 
-tsconfig@^7.0.0:
-  version "7.0.0"
-  resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7"
-  dependencies:
-    "@types/strip-bom" "^3.0.0"
-    "@types/strip-json-comments" "0.0.30"
-    strip-bom "^3.0.0"
-    strip-json-comments "^2.0.0"
-
-tslib@^1.8.1, tslib@^1.9.0:
+tslib@^1.8.1:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
 
+tslib@^1.9.0:
+  version "1.13.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
+  integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
+
 tsutils@^3.17.1:
   version "3.17.1"
   resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
@@ -12428,20 +13828,24 @@ tsutils@^3.17.1:
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+  integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=
 
 tunnel-agent@^0.6.0:
   version "0.6.0"
   resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+  integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
   dependencies:
     safe-buffer "^5.0.1"
 
 tweetnacl@^0.14.3, tweetnacl@~0.14.0:
   version "0.14.5"
   resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+  integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
 
 type-check@~0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+  integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
   dependencies:
     prelude-ls "~1.1.2"
 
@@ -12456,13 +13860,22 @@ type-fest@^0.8.1:
 type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+  integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
   dependencies:
     media-typer "0.3.0"
     mime-types "~2.1.24"
 
+typedarray-to-buffer@^3.1.5:
+  version "3.1.5"
+  resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+  integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+  dependencies:
+    is-typedarray "^1.0.0"
+
 typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+  integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
 typescript@^3.2.1, typescript@^3.7.3:
   version "3.7.3"
@@ -12475,6 +13888,7 @@ ua-parser-js@^0.7.18:
 uglify-js@3.4.x:
   version "3.4.10"
   resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
+  integrity sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==
   dependencies:
     commander "~2.19.0"
     source-map "~0.6.1"
@@ -12486,23 +13900,10 @@ uglify-js@^3.1.4:
     commander "~2.20.3"
     source-map "~0.6.1"
 
-uncss@^0.17.2:
-  version "0.17.2"
-  resolved "https://registry.yarnpkg.com/uncss/-/uncss-0.17.2.tgz#fac1c2429be72108e8a47437c647d58cf9ea66f1"
-  dependencies:
-    commander "^2.20.0"
-    glob "^7.1.4"
-    is-absolute-url "^3.0.1"
-    is-html "^1.1.0"
-    jsdom "^14.1.0"
-    lodash "^4.17.15"
-    postcss "^7.0.17"
-    postcss-selector-parser "6.0.2"
-    request "^2.88.0"
-
 unherit@^1.0.4:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22"
+  integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==
   dependencies:
     inherits "^2.0.0"
     xtend "^4.0.0"
@@ -12526,20 +13927,15 @@ unicode-property-aliases-ecmascript@^1.0.4:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz#a9cc6cc7ce63a0a3023fc99e341b94431d405a57"
 
-unicode-trie@^0.3.1:
-  version "0.3.1"
-  resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085"
-  dependencies:
-    pako "^0.2.5"
-    tiny-inflate "^1.0.0"
-
 unidecode@0.1.8:
   version "0.1.8"
   resolved "https://registry.yarnpkg.com/unidecode/-/unidecode-0.1.8.tgz#efbb301538bc45246a9ac8c559d72f015305053e"
+  integrity sha1-77swFTi8RSRqmsjFWdcvAVMFBT4=
 
 unified@^6.1.5:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/unified/-/unified-6.2.0.tgz#7fbd630f719126d67d40c644b7e3f617035f6dba"
+  integrity sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==
   dependencies:
     bail "^1.0.0"
     extend "^3.0.0"
@@ -12551,6 +13947,7 @@ unified@^6.1.5:
 union-value@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+  integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
   dependencies:
     arr-union "^3.1.0"
     get-value "^2.0.6"
@@ -12560,68 +13957,77 @@ union-value@^1.0.0:
 uniq@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+  integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=
 
-uniqs@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
-
-unique-filename@^1.1.1:
+unique-filename@^1.1.0, unique-filename@^1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230"
+  integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==
   dependencies:
     unique-slug "^2.0.0"
 
 unique-slug@^2.0.0:
   version "2.0.2"
   resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c"
+  integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==
   dependencies:
     imurmurhash "^0.1.4"
 
 unist-util-is@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-3.0.0.tgz#d9e84381c2468e82629e4a5be9d7d05a2dd324cd"
+  integrity sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==
 
 unist-util-remove-position@^1.0.0:
   version "1.1.4"
   resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz#ec037348b6102c897703eee6d0294ca4755a2020"
+  integrity sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==
   dependencies:
     unist-util-visit "^1.1.0"
 
 unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz#3f37fcf351279dcbca7480ab5889bb8a832ee1c6"
+  integrity sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==
 
 unist-util-visit-parents@1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-1.1.2.tgz#f6e3afee8bdbf961c0e6f028ea3c0480028c3d06"
+  integrity sha512-yvo+MMLjEwdc3RhhPYSximset7rwjMrdt9E41Smmvg25UQIenzrN83cRnF1JMzoMi9zZOQeYXHSDf7p+IQkW3Q==
 
 unist-util-visit-parents@^2.0.0:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz#25e43e55312166f3348cae6743588781d112c1e9"
+  integrity sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==
   dependencies:
     unist-util-is "^3.0.0"
 
 unist-util-visit@^1.1.0, unist-util-visit@^1.3.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.4.1.tgz#4724aaa8486e6ee6e26d7ff3c8685960d560b1e3"
+  integrity sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==
   dependencies:
     unist-util-visit-parents "^2.0.0"
 
 universalify@^0.1.0:
   version "0.1.2"
   resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+  integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
 
 unpipe@1.0.0, unpipe@~1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+  integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
 
 unquote@~1.1.1:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+  integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=
 
 unset-value@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+  integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
   dependencies:
     has-value "^0.3.1"
     isobject "^3.0.0"
@@ -12629,45 +14035,53 @@ unset-value@^1.0.0:
 upath@^1.1.1:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
+  integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
 
 upper-case@^1.1.1:
   version "1.1.3"
   resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+  integrity sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=
 
 uri-js@^4.2.2:
   version "4.2.2"
   resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+  integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==
   dependencies:
     punycode "^2.1.0"
 
 urix@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+  integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
 url-join@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78"
 
-url-parse@^1.4.3:
+url-parse@^1.4.3, url-parse@^1.4.7:
   version "1.4.7"
   resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
+  integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==
   dependencies:
     querystringify "^2.1.1"
     requires-port "^1.0.0"
 
-url-search-params-polyfill@^6.0.0:
-  version "6.0.0"
-  resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-6.0.0.tgz#f5e5fc230d56125f5b0ba67d9cbcd6555fa347e3"
+url-search-params-polyfill@^7.0.0:
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-7.0.1.tgz#b900cd9a0d9d2ff757d500135256f2344879cbff"
+  integrity sha512-bAw7L2E+jn9XHG5P9zrPnHdO0yJub4U+yXJOdpcpkr7OBd9T8oll4lUos0iSGRcDvfZoLUKfx9a6aNmIhJ4+mQ==
 
 url-slug@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/url-slug/-/url-slug-2.0.0.tgz#a789d5aed4995c0d95af33377ad1d5c68d4d7027"
+  integrity sha1-p4nVrtSZXA2VrzM3etHVxo1NcCc=
   dependencies:
     unidecode "0.1.8"
 
 url@^0.11.0:
   version "0.11.0"
   resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+  integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=
   dependencies:
     punycode "1.3.2"
     querystring "0.2.0"
@@ -12675,6 +14089,7 @@ url@^0.11.0:
 use@^3.1.0:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+  integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
 
 user-home@2.0.0:
   version "2.0.0"
@@ -12682,13 +14097,20 @@ user-home@2.0.0:
   dependencies:
     os-homedir "^1.0.0"
 
+utf8-byte-length@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61"
+  integrity sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=
+
 util-deprecate@^1.0.1, util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+  integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
 util.promisify@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+  integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==
   dependencies:
     define-properties "^1.1.2"
     object.getownpropertydescriptors "^2.0.3"
@@ -12696,6 +14118,7 @@ util.promisify@1.0.0:
 util.promisify@^1.0.0, util.promisify@~1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee"
+  integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==
   dependencies:
     define-properties "^1.1.3"
     es-abstract "^1.17.2"
@@ -12705,22 +14128,26 @@ util.promisify@^1.0.0, util.promisify@~1.0.0:
 util@0.10.3:
   version "0.10.3"
   resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+  integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk=
   dependencies:
     inherits "2.0.1"
 
 util@^0.11.0:
   version "0.11.1"
   resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61"
+  integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==
   dependencies:
     inherits "2.0.3"
 
 utila@^0.4.0, utila@~0.4:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+  integrity sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=
 
 utile@0.3.x:
   version "0.3.0"
   resolved "https://registry.yarnpkg.com/utile/-/utile-0.3.0.tgz#1352c340eb820e4d8ddba039a4fbfaa32ed4ef3a"
+  integrity sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=
   dependencies:
     async "~0.9.0"
     deep-equal "~0.2.1"
@@ -12732,18 +14159,31 @@ utile@0.3.x:
 utils-merge@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+  integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
+  integrity sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==
 
-uuid@^3.0.1, uuid@^3.3.2:
+uuid@3.3.2:
+  version "3.3.2"
+  resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+  integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
+
+uuid@^3.0.1, uuid@^3.3.2, uuid@^3.3.3:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+  integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
 
-v8-compile-cache@^2.0.0, v8-compile-cache@^2.0.3:
+v8-compile-cache@^2.0.3:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
 
 validate-npm-package-license@^3.0.1:
   version "3.0.4"
   resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+  integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
   dependencies:
     spdx-correct "^3.0.0"
     spdx-expression-parse "^3.0.0"
@@ -12751,24 +14191,24 @@ validate-npm-package-license@^3.0.1:
 validate-npm-package-name@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e"
+  integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34=
   dependencies:
     builtins "^1.0.3"
 
 value-equal@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
+  integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
 
-vary@~1.1.2:
+vary@^1, vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
-
-vendors@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
+  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
 
 verror@1.10.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+  integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
   dependencies:
     assert-plus "^1.0.0"
     core-util-is "1.0.2"
@@ -12777,29 +14217,29 @@ verror@1.10.0:
 vfile-location@^2.0.0:
   version "2.0.6"
   resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.6.tgz#8a274f39411b8719ea5728802e10d9e0dff1519e"
+  integrity sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==
 
 vfile-message@^1.0.0:
   version "1.1.1"
   resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.1.1.tgz#5833ae078a1dfa2d96e9647886cd32993ab313e1"
+  integrity sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==
   dependencies:
     unist-util-stringify-position "^1.1.1"
 
 vfile@^2.0.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a"
+  integrity sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==
   dependencies:
     is-buffer "^1.1.4"
     replace-ext "1.0.0"
     unist-util-stringify-position "^1.0.0"
     vfile-message "^1.0.0"
 
-vlq@^0.2.2:
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
-
 vm-browserify@^1.0.1:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
+  integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
 
 vue-eslint-parser@^2.0.2:
   version "2.0.3"
@@ -12823,42 +14263,22 @@ vue-eslint-parser@^5.0.0:
     esquery "^1.0.1"
     lodash "^4.17.11"
 
-vue-jest@3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/vue-jest/-/vue-jest-3.0.4.tgz#b6a2b0d874968f26fa775ac901903fece531e08b"
-  dependencies:
-    babel-plugin-transform-es2015-modules-commonjs "^6.26.0"
-    chalk "^2.1.0"
-    extract-from-css "^0.4.4"
-    find-babel-config "^1.1.0"
-    js-beautify "^1.6.14"
-    node-cache "^4.1.1"
-    object-assign "^4.1.1"
-    source-map "^0.5.6"
-    tsconfig "^7.0.0"
-    vue-template-es2015-compiler "^1.6.0"
-
-vue-template-es2015-compiler@^1.6.0:
-  version "1.9.1"
-  resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
+vuvuzela@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
+  integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws=
 
 w3c-hr-time@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045"
-  dependencies:
-    browser-process-hrtime "^0.1.2"
-
-w3c-xmlserializer@^1.1.2:
-  version "1.1.2"
-  resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz#30485ca7d70a6fd052420a3d12fd90e6339ce794"
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+  integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
   dependencies:
-    domexception "^1.0.1"
-    webidl-conversions "^4.0.2"
-    xml-name-validator "^3.0.0"
+    browser-process-hrtime "^1.0.0"
 
 walker@^1.0.7, walker@~1.0.5:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+  integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
   dependencies:
     makeerror "1.0.x"
 
@@ -12868,27 +14288,39 @@ warning@^3.0.0:
   dependencies:
     loose-envify "^1.0.0"
 
-warning@^4.0.1, warning@^4.0.3:
+warning@^4.0.1, warning@^4.0.2, warning@^4.0.3:
   version "4.0.3"
   resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+  integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
   dependencies:
     loose-envify "^1.0.0"
 
-watchpack@^1.5.0:
-  version "1.6.0"
-  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+watchpack-chokidar2@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0"
+  integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==
+  dependencies:
+    chokidar "^2.1.8"
+
+watchpack@^1.6.0:
+  version "1.7.2"
+  resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa"
+  integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==
   dependencies:
-    chokidar "^2.0.2"
     graceful-fs "^4.1.2"
     neo-async "^2.5.0"
+  optionalDependencies:
+    chokidar "^3.4.0"
+    watchpack-chokidar2 "^2.0.0"
 
 wbuf@^1.1.0, wbuf@^1.7.3:
   version "1.7.3"
   resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+  integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
   dependencies:
     minimalistic-assert "^1.0.0"
 
-wcwidth@^1.0.0, wcwidth@^1.0.1:
+wcwidth@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
   dependencies:
@@ -12897,13 +14329,15 @@ wcwidth@^1.0.0, wcwidth@^1.0.1:
 webidl-conversions@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+  integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==
 
-webpack-bundle-analyzer@3.3.2:
-  version "3.3.2"
-  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz#3da733a900f515914e729fcebcd4c40dde71fc6f"
+webpack-bundle-analyzer@3.6.1:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.6.1.tgz#bdb637c2304424f2fbff9a950c7be42a839ae73b"
+  integrity sha512-Nfd8HDwfSx1xBwC+P8QMGvHAOITxNBSvu/J/mCJvOwv+G4VWkU7zir9SSenTtyCi0LnVtmsc7G5SZo1uV+bxRw==
   dependencies:
-    acorn "^6.0.7"
-    acorn-walk "^6.1.1"
+    acorn "^7.1.1"
+    acorn-walk "^7.1.1"
     bfj "^6.1.1"
     chalk "^2.4.1"
     commander "^2.18.0"
@@ -12911,14 +14345,15 @@ webpack-bundle-analyzer@3.3.2:
     express "^4.16.3"
     filesize "^3.6.1"
     gzip-size "^5.0.0"
-    lodash "^4.17.10"
+    lodash "^4.17.15"
     mkdirp "^0.5.1"
     opener "^1.5.1"
     ws "^6.0.0"
 
-webpack-dev-middleware@^3.7.0:
+webpack-dev-middleware@^3.7.2:
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3"
+  integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==
   dependencies:
     memory-fs "^0.4.1"
     mime "^2.4.4"
@@ -12926,103 +14361,112 @@ webpack-dev-middleware@^3.7.0:
     range-parser "^1.2.1"
     webpack-log "^2.0.0"
 
-webpack-dev-server@3.7.2:
-  version "3.7.2"
-  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.7.2.tgz#f79caa5974b7f8b63268ef5421222a8486d792f5"
+webpack-dev-server@3.10.3:
+  version "3.10.3"
+  resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0"
+  integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ==
   dependencies:
     ansi-html "0.0.7"
     bonjour "^3.5.0"
-    chokidar "^2.1.6"
+    chokidar "^2.1.8"
     compression "^1.7.4"
     connect-history-api-fallback "^1.6.0"
     debug "^4.1.1"
     del "^4.1.1"
     express "^4.17.1"
     html-entities "^1.2.1"
-    http-proxy-middleware "^0.19.1"
+    http-proxy-middleware "0.19.1"
     import-local "^2.0.0"
     internal-ip "^4.3.0"
     ip "^1.1.5"
+    is-absolute-url "^3.0.3"
     killable "^1.0.1"
-    loglevel "^1.6.3"
+    loglevel "^1.6.6"
     opn "^5.5.0"
     p-retry "^3.0.1"
-    portfinder "^1.0.20"
+    portfinder "^1.0.25"
     schema-utils "^1.0.0"
-    selfsigned "^1.10.4"
-    semver "^6.1.1"
+    selfsigned "^1.10.7"
+    semver "^6.3.0"
     serve-index "^1.9.1"
     sockjs "0.3.19"
-    sockjs-client "1.3.0"
-    spdy "^4.0.0"
+    sockjs-client "1.4.0"
+    spdy "^4.0.1"
     strip-ansi "^3.0.1"
     supports-color "^6.1.0"
     url "^0.11.0"
-    webpack-dev-middleware "^3.7.0"
+    webpack-dev-middleware "^3.7.2"
     webpack-log "^2.0.0"
+    ws "^6.2.1"
     yargs "12.0.5"
 
 webpack-log@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f"
+  integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==
   dependencies:
     ansi-colors "^3.0.0"
     uuid "^3.3.2"
 
-webpack-merge@4.2.1:
-  version "4.2.1"
-  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4"
+webpack-merge@4.2.2:
+  version "4.2.2"
+  resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz#a27c52ea783d1398afd2087f547d7b9d2f43634d"
+  integrity sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==
   dependencies:
-    lodash "^4.17.5"
+    lodash "^4.17.15"
 
-webpack-sources@^1.1.0, webpack-sources@^1.3.0, webpack-sources@^1.4.0:
+webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933"
+  integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
   dependencies:
     source-list-map "^2.0.0"
     source-map "~0.6.1"
 
-webpack@4.35.3:
-  version "4.35.3"
-  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.35.3.tgz#66bc35ef215a7b75e8790f84d560013ffecf0ca3"
+webpack@4.42.1:
+  version "4.42.1"
+  resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef"
+  integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==
   dependencies:
-    "@webassemblyjs/ast" "1.8.5"
-    "@webassemblyjs/helper-module-context" "1.8.5"
-    "@webassemblyjs/wasm-edit" "1.8.5"
-    "@webassemblyjs/wasm-parser" "1.8.5"
-    acorn "^6.2.0"
-    ajv "^6.1.0"
-    ajv-keywords "^3.1.0"
-    chrome-trace-event "^1.0.0"
+    "@webassemblyjs/ast" "1.9.0"
+    "@webassemblyjs/helper-module-context" "1.9.0"
+    "@webassemblyjs/wasm-edit" "1.9.0"
+    "@webassemblyjs/wasm-parser" "1.9.0"
+    acorn "^6.2.1"
+    ajv "^6.10.2"
+    ajv-keywords "^3.4.1"
+    chrome-trace-event "^1.0.2"
     enhanced-resolve "^4.1.0"
-    eslint-scope "^4.0.0"
+    eslint-scope "^4.0.3"
     json-parse-better-errors "^1.0.2"
-    loader-runner "^2.3.0"
-    loader-utils "^1.1.0"
-    memory-fs "~0.4.1"
-    micromatch "^3.1.8"
-    mkdirp "~0.5.0"
-    neo-async "^2.5.0"
-    node-libs-browser "^2.0.0"
+    loader-runner "^2.4.0"
+    loader-utils "^1.2.3"
+    memory-fs "^0.4.1"
+    micromatch "^3.1.10"
+    mkdirp "^0.5.3"
+    neo-async "^2.6.1"
+    node-libs-browser "^2.2.1"
     schema-utils "^1.0.0"
-    tapable "^1.1.0"
-    terser-webpack-plugin "^1.1.0"
-    watchpack "^1.5.0"
-    webpack-sources "^1.3.0"
+    tapable "^1.1.3"
+    terser-webpack-plugin "^1.4.3"
+    watchpack "^1.6.0"
+    webpack-sources "^1.4.1"
 
 websocket-driver@>=0.5.1:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9"
+  version "0.7.4"
+  resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760"
+  integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
   dependencies:
-    http-parser-js ">=0.4.0 <0.4.11"
+    http-parser-js ">=0.5.1"
     safe-buffer ">=5.1.0"
     websocket-extensions ">=0.1.1"
 
 websocket-extensions@>=0.1.1:
-  version "0.1.3"
-  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42"
+  integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
 
-whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
+whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
   dependencies:
@@ -13032,13 +14476,14 @@ whatwg-fetch@>=0.10.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb"
 
-whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
+whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
 
 whatwg-url@^6.4.1:
   version "6.5.0"
   resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.5.0.tgz#f2df02bff176fd65070df74ad5ccbb5a199965a8"
+  integrity sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==
   dependencies:
     lodash.sortby "^4.7.0"
     tr46 "^1.0.1"
@@ -13047,6 +14492,7 @@ whatwg-url@^6.4.1:
 whatwg-url@^7.0.0:
   version "7.1.0"
   resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06"
+  integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==
   dependencies:
     lodash.sortby "^4.7.0"
     tr46 "^1.0.1"
@@ -13055,6 +14501,7 @@ whatwg-url@^7.0.0:
 when@~3.6.x:
   version "3.6.4"
   resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e"
+  integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=
 
 which-module@^1.0.0:
   version "1.0.0"
@@ -13063,10 +14510,12 @@ which-module@^1.0.0:
 which-module@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+  integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
 
 which@1, which@^1.2.9, which@^1.3.0:
   version "1.3.1"
   resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+  integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
   dependencies:
     isexe "^2.0.0"
 
@@ -13089,6 +14538,7 @@ window-size@^0.2.0:
 winston@2.1.x:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.1.tgz#3c9349d196207fd1bdff9d4bc43ef72510e3a12e"
+  integrity sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=
   dependencies:
     async "~1.0.0"
     colors "1.0.x"
@@ -13101,6 +14551,7 @@ winston@2.1.x:
 word-wrap@~1.2.3:
   version "1.2.3"
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+  integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
 
 wordwrap@~0.0.2:
   version "0.0.3"
@@ -13109,12 +14560,14 @@ wordwrap@~0.0.2:
 worker-farm@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
+  integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==
   dependencies:
     errno "~0.1.7"
 
 worker-loader@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/worker-loader/-/worker-loader-2.0.0.tgz#45fda3ef76aca815771a89107399ee4119b430ac"
+  integrity sha512-tnvNp4K3KQOpfRnD20m8xltE3eWh89Ye+5oj7wXEEHKac1P4oZ6p9oTj8/8ExqoSBnk9nu5Pr4nKfQ1hn2APJw==
   dependencies:
     loader-utils "^1.0.0"
     schema-utils "^0.4.0"
@@ -13122,6 +14575,7 @@ worker-loader@^2.0.0:
 wrap-ansi@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
   dependencies:
     string-width "^1.0.1"
     strip-ansi "^3.0.1"
@@ -13136,6 +14590,7 @@ wrap-ansi@^3.0.1:
 wrap-ansi@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
+  integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
   dependencies:
     ansi-styles "^3.2.0"
     string-width "^3.0.0"
@@ -13152,10 +14607,12 @@ wrap-ansi@^6.2.0:
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
 
 write-file-atomic@2.4.1:
   version "2.4.1"
   resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.1.tgz#d0b05463c188ae804396fd5ab2a370062af87529"
+  integrity sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==
   dependencies:
     graceful-fs "^4.1.11"
     imurmurhash "^0.1.4"
@@ -13164,16 +14621,24 @@ write-file-atomic@2.4.1:
 write@1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
+  integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
+  dependencies:
+    mkdirp "^0.5.1"
+
+write@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+  integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=
   dependencies:
     mkdirp "^0.5.1"
 
-ws@^5.1.1, ws@^5.2.0:
+ws@^5.2.0:
   version "5.2.2"
   resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
   dependencies:
     async-limiter "~1.0.0"
 
-ws@^6.0.0, ws@^6.1.2:
+ws@^6.0.0, ws@^6.2.1:
   version "6.2.1"
   resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
   dependencies:
@@ -13182,14 +14647,19 @@ ws@^6.0.0, ws@^6.1.2:
 x-is-string@^0.1.0:
   version "0.1.0"
   resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82"
+  integrity sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=
 
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+  integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
 
-xmlchars@^2.1.1:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+xregexp@^4.3.0:
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.3.0.tgz#7e92e73d9174a99a59743f67a4ce879a04b5ae50"
+  integrity sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==
+  dependencies:
+    "@babel/runtime-corejs3" "^7.8.3"
 
 xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1:
   version "4.0.2"
@@ -13202,14 +14672,17 @@ y18n@^3.2.1:
 "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+  integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
 
 yallist@^2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+  integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
 
 yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+  integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
 
 yargs-parser@^10.0.0:
   version "10.1.0"
@@ -13220,27 +14693,30 @@ yargs-parser@^10.0.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@^13.1.1:
-  version "13.1.1"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0"
+yargs-parser@^13.1.2:
+  version "13.1.2"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
+  integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
   dependencies:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^15.0.0:
-  version "15.0.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.0.tgz#cdd7a97490ec836195f59f3f4dbe5ea9e8f75f08"
+yargs-parser@^16.1.0:
+  version "16.1.0"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1"
   dependencies:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
 
-yargs-parser@^16.1.0:
-  version "16.1.0"
-  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-16.1.0.tgz#73747d53ae187e7b8dbe333f95714c76ea00ecf1"
+yargs-parser@^18.1.2:
+  version "18.1.3"
+  resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+  integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
   dependencies:
     camelcase "^5.0.0"
     decamelize "^1.2.0"
@@ -13273,6 +14749,7 @@ yargs-parser@^9.0.2:
 yargs@12.0.5:
   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"
@@ -13356,8 +14833,9 @@ yargs@^11.0.0:
     yargs-parser "^9.0.2"
 
 yargs@^13.3.0:
-  version "13.3.0"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83"
+  version "13.3.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
+  integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
   dependencies:
     cliui "^5.0.0"
     find-up "^3.0.0"
@@ -13368,23 +14846,24 @@ yargs@^13.3.0:
     string-width "^3.0.0"
     which-module "^2.0.0"
     y18n "^4.0.0"
-    yargs-parser "^13.1.1"
+    yargs-parser "^13.1.2"
 
-yargs@^14.0.0:
-  version "14.2.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.2.tgz#2769564379009ff8597cdd38fba09da9b493c4b5"
+yargs@^15.0.0:
+  version "15.4.1"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+  integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
   dependencies:
-    cliui "^5.0.0"
+    cliui "^6.0.0"
     decamelize "^1.2.0"
-    find-up "^3.0.0"
+    find-up "^4.1.0"
     get-caller-file "^2.0.1"
     require-directory "^2.1.1"
     require-main-filename "^2.0.0"
     set-blocking "^2.0.0"
-    string-width "^3.0.0"
+    string-width "^4.2.0"
     which-module "^2.0.0"
     y18n "^4.0.0"
-    yargs-parser "^15.0.0"
+    yargs-parser "^18.1.2"
 
 yargs@^7.0.0:
   version "7.1.0"
@@ -13403,3 +14882,8 @@ yargs@^7.0.0:
     which-module "^1.0.0"
     y18n "^3.2.1"
     yargs-parser "^5.0.0"
+
+zxcvbn@^4.4.2:
+  version "4.4.2"
+  resolved "https://registry.yarnpkg.com/zxcvbn/-/zxcvbn-4.4.2.tgz#28ec17cf09743edcab056ddd8b1b06262cc73c30"
+  integrity sha1-KOwXzwl0PtyrBW3dixsGJizHPDA=