gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-merchant-backoffice] branch master updated: several changes detai


From: gnunet
Subject: [taler-merchant-backoffice] branch master updated: several changes detailed in TODO file, 50% of tasks done. ref #5859
Date: Wed, 17 Feb 2021 14:25:22 +0100

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

sebasjm pushed a commit to branch master
in repository merchant-backoffice.

The following commit(s) were added to refs/heads/master by this push:
     new d37369b  several changes detailed in TODO file, 50% of tasks done. ref 
#5859
d37369b is described below

commit d37369bbdeb9ff471cee42e794076a3d7d7eda45
Author: Sebastian <sebasjm@gmail.com>
AuthorDate: Wed Feb 17 10:25:09 2021 -0300

    several changes detailed in TODO file, 50% of tasks done. ref #5859
---
 TODO                                               |  32 ++
 package.json                                       |   1 +
 preact.config.js                                   |  12 +-
 src/assets/logo.jpeg                               | Bin 0 -> 39336 bytes
 src/components/auth/LoginPage.tsx                  |  42 +-
 src/components/hooks/backend.ts                    |  59 ++-
 src/components/hooks/useBackend.ts                 |  23 +
 src/components/hooks/useLang.ts                    |   6 +
 src/components/hooks/useLocalStorage.ts            |  37 ++
 src/components/navbar/index.tsx                    |  63 ++-
 src/components/notifications/index.tsx             |   1 -
 src/components/yup/YupField.tsx                    | 178 ++++++++
 src/components/yup/YupInput.tsx                    |  40 --
 src/declaration.d.ts                               |  29 +-
 src/hooks/notifications.ts                         |   2 +-
 src/i18n/index.ts                                  |  81 +++-
 src/routes/index.tsx                               |  10 +-
 src/routes/instanceDetail/index.tsx                |   6 -
 src/routes/instances/CardTable.tsx                 |   2 +-
 ...{CreateModal.stories.tsx => Create.stories.tsx} |   6 +-
 src/routes/instances/Create.tsx                    |  90 ++++
 src/routes/instances/CreateModal.tsx               |  40 --
 src/routes/instances/Update.tsx                    |  90 ++++
 src/routes/instances/UpdateModal.tsx               |  18 +-
 src/routes/instances/View.tsx                      |  27 +-
 src/routes/instances/index.tsx                     |  59 ++-
 src/schemas/index.ts                               |  82 ++--
 src/scss/main.scss                                 |   2 +
 template.env                                       |   1 -
 tests/hooks/notification.test.ts                   |   3 +-
 yarn.lock                                          | 485 +--------------------
 31 files changed, 804 insertions(+), 723 deletions(-)

diff --git a/TODO b/TODO
new file mode 100644
index 0000000..f069951
--- /dev/null
+++ b/TODO
@@ -0,0 +1,32 @@
+TODO
+
+Already done:
+ * take the url where the spa was loaded as a default backend url 
+ * let the user change the backend url when ask for the auth token
+ * button of the form to the right
+ * refactor the popup to be a page
+ * add supported currency for Amount fields (like taler bank)
+ * rename name to business name
+ * change auth field to have a checkbox that activate the validation and show 
an input to set the token
+ * rename PayTo URI to bank account
+ * change id input to reflect that is going to be use in the url (prepend the 
backend url as a non editable and put the input after)
+ * refactor create page
+ * add the information popup into the fields to help with the description 
(like https://b2b.dab-bank.de/smartbroker/)
+ * take default lang from the browser for localization  
+ * take the currency from merchant-backend
+
+Next to do: 
+ * implement proper error handling
+ * change the input PayTO URI to a string field with a + button to add more
+ * refactor update page
+
+Queue:
+ * replace Yup and type definition with a taler-library for the purpose (first 
wait Florian to refactor wallet core)
+ * replace default exports for named exports
+ * implement pnpm
+ * add copyright headers to every source file
+ * add more doc style comments 
+ * check the field names in forms dont break spaces
+ * add default values to some fields: default_max_deposit_fee, 
default_max_wire_fee, default_wire_fee_amortization, default_pay_delay, 
default_wire_transfer_delay
+ * Login button should be centered
+ * update spanish lang
diff --git a/package.json b/package.json
index 45a9666..266a6c0 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
   "devDependencies": {
     "@babel/core": "^7.12.13",
     "@babel/plugin-transform-react-jsx-source": "^7.12.13",
+    "@creativebulma/bulma-tooltip": "^1.2.0",
     "@storybook/addon-a11y": "^6.1.17",
     "@storybook/addon-actions": "^6.1.16",
     "@storybook/addon-essentials": "^6.1.16",
diff --git a/preact.config.js b/preact.config.js
index 0135cfa..6993d17 100644
--- a/preact.config.js
+++ b/preact.config.js
@@ -1,14 +1,14 @@
-import { DefinePlugin } from 'webpack';
+// import { DefinePlugin } from 'webpack';
 import { config } from 'dotenv';
 const { parsed } = config();
 
 export default {
     webpack(config, env, helpers, options) {
         config.node.process = 'mock'
-        config.plugins.push(
-            new DefinePlugin({
-                'process.env.BACKEND_ENDPOINT': 
JSON.stringify(parsed['BACKEND_ENDPOINT']),
-            }),
-        );
+        // config.plugins.push(
+            // new DefinePlugin({
+            //     // 'process.env.BACKEND_ENDPOINT': 
JSON.stringify(parsed['BACKEND_ENDPOINT']),
+            // }),
+        // );
     }
 }
diff --git a/src/assets/logo.jpeg b/src/assets/logo.jpeg
new file mode 100644
index 0000000..489832f
Binary files /dev/null and b/src/assets/logo.jpeg differ
diff --git a/src/components/auth/LoginPage.tsx 
b/src/components/auth/LoginPage.tsx
index de41d8b..41335f7 100644
--- a/src/components/auth/LoginPage.tsx
+++ b/src/components/auth/LoginPage.tsx
@@ -1,13 +1,17 @@
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
+import useBackend from "../hooks/useBackend";
 
 interface Props {
-  onLogIn: (token: string) => void;
+  onConfirm?: () => void;
 }
 
-export default function LoginPage({ onLogIn }: Props): VNode {
-  const [token, update] = useState('')
-  
+export default function LoginPage({ onConfirm }: Props): VNode {
+  const [backend, setBackend] = useBackend()
+  const [url, setUrl] = useState(backend.url)
+  const [token, setToken] = useState(backend.token)
+  const [changeToken, setChangeToken] = useState(false)
+
   return <div class="modal is-active is-clipped">
     <div class="modal-background" />
     <div class="modal-card">
@@ -15,22 +19,42 @@ export default function LoginPage({ onLogIn }: Props): 
VNode {
         <p class="modal-card-title">Authentication required</p>
       </header>
       <section class="modal-card-body">
-        Please enter your auth id, it sould start with "secret-token:"
+        Please enter your auth token. Token should have "secret-token:" and 
start with Bearer or ApiKey
+        <div class="field is-horizontal">
+          <div class="field-label is-normal">
+            <label class="label">Change Token</label>
+          </div>
+          <div class="field-body">
+            <div class="field has-addons">
+              <label class="b-checkbox checkbox">
+                <input type="checkbox" checked={changeToken} onClick={(): void 
=> setChangeToken(!changeToken)} />
+                <span class="check" />
+              </label>
+
+              <p class="control is-expanded">
+                <input class="input" type="text" placeholder={changeToken ? 
"set new token" : "hidden token value"} disabled={!changeToken} name="id" 
value={token} onInput={(e): void => setToken(e?.currentTarget.value)} />
+              </p>
+            </div>
+          </div>
+        </div>
         <div class="field is-horizontal">
           <div class="field-label is-normal">
-            <label class="label">Id</label>
+            <label class="label">URL</label>
           </div>
           <div class="field-body">
             <div class="field">
-              <p class="control is-expanded has-icons-left">
-                <input class="input" type="text" placeholder="abcdef" 
name="id" value={token} onInput={(e): void => update(e?.currentTarget.value)} />
+              <p class="control is-expanded">
+                <input class="input" type="text" placeholder="set new url" 
name="id" value={url} onInput={(e): void => setUrl(e?.currentTarget.value)} />
               </p>
             </div>
           </div>
         </div>
       </section>
       <footer class="modal-card-foot">
-        <button class="button is-info" onClick={(): void => onLogIn(token)} 
>Confirm</button>
+        <button class="button is-info" onClick={(): void => {
+          setBackend({token, url});
+          onConfirm && onConfirm();
+        }} >Confirm</button>
       </footer>
     </div>
   </div>
diff --git a/src/components/hooks/backend.ts b/src/components/hooks/backend.ts
index bd2bcba..8ccf696 100644
--- a/src/components/hooks/backend.ts
+++ b/src/components/hooks/backend.ts
@@ -1,4 +1,4 @@
-import useSWR, { mutate as globalMutate } from 'swr';
+import useSWR, { mutate } from 'swr';
 import axios from 'axios'
 import { MerchantBackend } from '../../declaration';
 
@@ -13,29 +13,27 @@ interface HttpResponseError<T> {
   error: Error;
 }
 
-const BACKEND = process.env.BACKEND_ENDPOINT
-const TOKEN_KEY = 'backend-token'
 
 type Methods = 'get' | 'post' | 'patch' | 'delete' | 'put';
 
 async function request(url: string, method?: Methods, data?: object): 
Promise<any> {
-  const token = localStorage.getItem(TOKEN_KEY)
-  const headers = token ? { Authorization: `Bearer ${token}` } : undefined
+  const backend = localStorage.getItem('backend-url')
+  const token = localStorage.getItem('backend-token')
+  const headers = token ? { Authorization: `${token}` } : undefined
 
   try {
     const res = await axios({
       method: method || 'get',
-      url: `${BACKEND}/private${url}`,
+      url: `${backend}${url}`,
       responseType: 'json',
       headers,
       data
     })
     return res.data
   } catch (e) {
-    const error = new Error('An error occurred while fetching the data.')
-    const info = e.response.data
-    const status = e.response.status
-    throw { info, status, ...error }
+    const info = e.response?.data
+    const status = e.response?.status
+    throw { info, status, error:e, backend, hasToken: !!token }
   }
 
 }
@@ -44,15 +42,6 @@ async function fetcher(url: string): Promise<any> {
   return request(url, 'get')
 }
 
-export function updateToken(token: string | null): void {
-  if (token) {
-    localStorage.setItem(TOKEN_KEY, token)
-  } else {
-    localStorage.removeItem(TOKEN_KEY)
-  }
-  globalMutate('/instances', null)
-}
-
 interface WithCreate<T> {
   create: (data: T) => Promise<void>;
 }
@@ -64,32 +53,38 @@ interface WithDelete {
 }
 
 export function useBackendInstances(): 
HttpResponse<MerchantBackend.Instances.InstancesResponse> & 
WithCreate<MerchantBackend.Instances.InstanceConfigurationMessage> {
-  const { data, error, mutate } = 
useSWR<MerchantBackend.Instances.InstancesResponse>('/instances', fetcher)
+  const { data, error } = 
useSWR<MerchantBackend.Instances.InstancesResponse>('/private/instances', 
fetcher)
 
-  const create = async (instance: 
MerchantBackend.Instances.InstanceConfigurationMessage) => {
-    await request('/instances', 'post', instance)
+  const create = async (instance: 
MerchantBackend.Instances.InstanceConfigurationMessage): Promise<void> => {
+    await request('/private/instances', 'post', instance)
 
-    globalMutate('/instances')
+    mutate('/private/instances')
   }
 
   return { data, needsAuth: error?.status === 401, error, create }
 }
 
 export function useBackendInstance(id: string | null): 
HttpResponse<MerchantBackend.Instances.QueryInstancesResponse> & 
WithUpdate<MerchantBackend.Instances.InstanceReconfigurationMessage> & 
WithDelete {
-  const { data, error } = 
useSWR<MerchantBackend.Instances.QueryInstancesResponse>(id ? 
`/instances/${id}` : null, fetcher)
+  const { data, error } = 
useSWR<MerchantBackend.Instances.QueryInstancesResponse>(id ? 
`/private/instances/${id}` : null, fetcher)
 
-  const update = async (updateId: string, instance: 
MerchantBackend.Instances.InstanceReconfigurationMessage) => {
-    await request(`/instances/${updateId}`, 'patch', instance)
+  const update = async (updateId: string, instance: 
MerchantBackend.Instances.InstanceReconfigurationMessage): Promise<void> => {
+    await request(`/private/instances/${updateId}`, 'patch', instance)
 
-    globalMutate('/instances', null)
-    globalMutate(`/instances/${updateId}`, null)
+    mutate('/private/instances', null)
+    mutate(`/private/instances/${updateId}`, null)
   };
-  const _delete = async (deleteId: string) => {
-    await request(`/instances/${deleteId}`, 'delete')
+  const _delete = async (deleteId: string): Promise<void> => {
+    await request(`/private/instances/${deleteId}`, 'delete')
 
-    globalMutate('/instances', null)
-    globalMutate(`/instances/${deleteId}`, null)
+    mutate('/private/instances', null)
+    mutate(`/private/instances/${deleteId}`, null)
   }
 
   return { data, needsAuth: error?.status === 401, error, update, delete: 
_delete }
 }
+
+export function useBackendConfig(): 
HttpResponse<MerchantBackend.VersionResponse>  {
+  const { data, error } = useSWR<MerchantBackend.VersionResponse>(`/config`, 
fetcher)
+
+  return { data, needsAuth: error?.status === 401, error }
+}
diff --git a/src/components/hooks/useBackend.ts 
b/src/components/hooks/useBackend.ts
new file mode 100644
index 0000000..89f1e12
--- /dev/null
+++ b/src/components/hooks/useBackend.ts
@@ -0,0 +1,23 @@
+import { StateUpdater } from "preact/hooks";
+import {useLocalStorage} from "./useLocalStorage";
+import { mutate } from 'swr';
+
+interface State {
+  token?: string;
+  url: string;
+}
+
+export default function useBackend(): [State, StateUpdater<State>] {
+  const [url, setUrl] = useLocalStorage('backend-url', window.location.origin)
+  const [token, setToken] = useLocalStorage('backend-token')
+
+  const updater: StateUpdater<State> = (value:State | ((value: State) => 
State)) => {
+    const valueToStore = value instanceof Function ? value({token, url: url || 
window.location.origin}) : value;
+    setUrl(valueToStore.url)
+    setToken(valueToStore.token)
+
+    mutate('/private/instances', null)
+  }
+
+  return [{token, url: url || window.location.origin}, updater]
+}
diff --git a/src/components/hooks/useLang.ts b/src/components/hooks/useLang.ts
new file mode 100644
index 0000000..c954495
--- /dev/null
+++ b/src/components/hooks/useLang.ts
@@ -0,0 +1,6 @@
+import { StateUpdater } from "preact/hooks";
+import { useNotNullLocalStorage } from "./useLocalStorage";
+
+export default function useLang(): [string, StateUpdater<string>] {
+  return useNotNullLocalStorage('lang-preference', navigator.language || 
(navigator as any).userLanguage )
+}
diff --git a/src/components/hooks/useLocalStorage.ts 
b/src/components/hooks/useLocalStorage.ts
new file mode 100644
index 0000000..7c9fc4a
--- /dev/null
+++ b/src/components/hooks/useLocalStorage.ts
@@ -0,0 +1,37 @@
+import { StateUpdater, useState } from "preact/hooks";
+
+export function useLocalStorage(key: string, initialValue?: string): [string | 
undefined, StateUpdater<string | undefined>] {
+  const [storedValue, setStoredValue] = useState<string | undefined>((): 
string | undefined => {
+    return window.localStorage.getItem(key) || initialValue;
+  });
+
+  const setValue = (value?: string | ((val?: string) => string | undefined)) 
=> {
+    const valueToStore = value instanceof Function ? value(storedValue) : 
value;
+    setStoredValue(valueToStore);
+    if (!valueToStore) {
+      window.localStorage.removeItem(key)
+    } else {
+      window.localStorage.setItem(key, valueToStore);
+    }
+  };
+
+  return [storedValue, setValue];
+}
+
+export function useNotNullLocalStorage(key: string, initialValue: string): 
[string, StateUpdater<string>] {
+  const [storedValue, setStoredValue] = useState<string>((): string => {
+    return window.localStorage.getItem(key) || initialValue;
+  });
+
+  const setValue = (value: string | ((val: string) => string)) => {
+    const valueToStore = value instanceof Function ? value(storedValue) : 
value;
+    setStoredValue(valueToStore);
+    if (!valueToStore) {
+      window.localStorage.removeItem(key)
+    } else {
+      window.localStorage.setItem(key, valueToStore);
+    }
+  };
+
+  return [storedValue, setValue];
+}
diff --git a/src/components/navbar/index.tsx b/src/components/navbar/index.tsx
index 855b5cb..4423617 100644
--- a/src/components/navbar/index.tsx
+++ b/src/components/navbar/index.tsx
@@ -1,25 +1,50 @@
 import { h, VNode } from 'preact';
-import { updateToken } from '../hooks/backend';
+import { useState } from 'preact/hooks';
+import LoginPage from '../auth/LoginPage';
+import i18n from '../../i18n'
+import logo from '../../assets/logo.jpeg'
 
-export default function NavigationBar(): VNode {
-  return (
-    <nav id="navbar-main" class="navbar is-fixed-top">
-      <div class="navbar-brand">
-        <a class="navbar-item is-hidden-desktop jb-aside-mobile-toggle">
-          <span class="icon"><i class="mdi mdi-forwardburger mdi-24px" 
/></span>
-        </a>
-        <div class="navbar-item has-control">
-          {/* <div class="control"><input placeholder="Search everywhere..." 
class="input" /></div> */}
+interface Props {
+  lang: string;
+  setLang: (l: string) => void;
+}
+
+export default function NavigationBar({ lang, setLang }: Props): VNode {
+  const [showLogin, setShowLogin] = useState(false)
+  return (<nav class="navbar is-fixed-top" role="navigation" aria-label="main 
navigation">
+    <div class="navbar-brand">
+      <a class="navbar-item" href="https://taler.net";>
+        <img src={logo} style={{height: 50, maxHeight: 50}} />
+      </a>
+
+      <a role="button" class="navbar-burger" aria-label="menu" 
aria-expanded="false" data-target="navbarBasicExample">
+        <span aria-hidden="true" />
+        <span aria-hidden="true" />
+        <span aria-hidden="true" />
+      </a>
+    </div>
+
+    <div class="navbar-menu">
+
+      <div class="navbar-end">
+        <div class="navbar-item">
+          <div class="control has-icons-left">
+            <div class="select">
+              <select onChange={(e): void => setLang(e.currentTarget.value)}>
+                {Object.keys(i18n).map(l => <option selected={lang === l} 
value={l}>{l}</option>)}
+              </select>
+            </div>
+            <div class="icon is-small is-left">
+              <i class="mdi mdi-web" />
+            </div>
+          </div>
+        </div>
+        <div class="navbar-item">
+          <button class="button is-primary" onClick={(): void => 
setShowLogin(true)}>Change access</button>
         </div>
       </div>
-      <div class="navbar-brand is-right">
-        <a class="navbar-item is-hidden-desktop jb-navbar-menu-toggle">
-          <span class="icon"><i class="mdi mdi-dots-vertical" /></span>
-        </a>
-      </div>
-      <div class="navbar-menu navbar-end">
-        <button class="button is-primary" onClick={ () => updateToken(null) 
}>Log out</button>
-      </div>
-    </nav>
+    </div>
+    {showLogin && <LoginPage onConfirm={(): void => setShowLogin(false)} />}
+  </nav>
   );
 }
\ No newline at end of file
diff --git a/src/components/notifications/index.tsx 
b/src/components/notifications/index.tsx
index cc74be0..7bf937c 100644
--- a/src/components/notifications/index.tsx
+++ b/src/components/notifications/index.tsx
@@ -21,7 +21,6 @@ export default function Notifications({ notifications }: 
Props): VNode {
     {notifications.map(n => <article class={messageStyle(n.type)}>
       <div class="message-header">
         <p><Text id={`notification.${n.messageId}.title`} /> </p>
-        <button class="delete" aria-label="delete" />
       </div>
       <div class="message-body">
         <Text id={`notification.${n.messageId}.description`} fields={n.params} 
/>
diff --git a/src/components/yup/YupField.tsx b/src/components/yup/YupField.tsx
new file mode 100644
index 0000000..9549539
--- /dev/null
+++ b/src/components/yup/YupField.tsx
@@ -0,0 +1,178 @@
+import { h, VNode } from "preact";
+import { Localizer, Text, useText } from "preact-i18n";
+import { useState } from "preact/hooks";
+import { KeyValue } from "../../declaration";
+import { useBackendConfig } from "../hooks/backend";
+import useBackend from "../hooks/useBackend";
+
+interface Props {
+  name: string;
+  value: string;
+  readonly?: boolean;
+  errors: any;
+  onChange: any;
+}
+
+interface Props2 {
+  name: string;
+  info: any;
+  value: any;
+  errors: any;
+  onChange: any;
+}
+
+
+export default function YupField(name: string, field: string, errors: any, 
object: any, valueHandler: any, info: any): VNode {
+  const updateField = (f: string) => (v: string): void => valueHandler((prev: 
any) => ({ ...prev, [f]: v }))
+  const values = {
+    name, errors,
+    readonly: info?.meta?.readonly,
+    value: object && object[field],
+    onChange: updateField(field)
+  }
+  const [backend] = useBackend()
+  const {data} = useBackendConfig()
+  
+  switch (info.meta?.type) {
+    case 'group': return <YupObjectInput name={name}
+      info={info} errors={errors}
+      value={object && object[field]}
+      onChange={(updater: any): void => valueHandler((prev: any) => ({ 
...prev, [field]: updater(prev[field]) }))}
+    />
+    case 'amount': return <YupInputWithAddon {...values} addon={data?.currency 
|| ''} />;
+    case 'url': return <YupInputWithAddon {...values} 
addon={`${backend.url}/private/instances/`} />;
+    case 'secured': return <YupInputSecured {...values} />;
+    case 'duration': return <YupInput {...values} value={object && 
object[field]?.d_ms} />;
+    default: return <YupInput {...values} />;
+
+  }
+}
+
+function YupObjectInput({ name, info, value, errors, onChange }: Props2): 
VNode {
+  const [active, setActive] = useState(false)
+  return <div class="card">
+    <header class="card-header">
+      <p class="card-header-title">
+        <Text id={`fields.instance.${name}.label`} />
+      </p>
+      <button class="card-header-icon" aria-label="more options" onClick={(): 
void => setActive(!active)}>
+        <span class="icon">
+          { active ? 
+            <i class="mdi mdi-arrow-up" /> :
+            <i class="mdi mdi-arrow-down" /> }
+        </span>
+      </button>
+    </header>
+    <div class={active ? "card-content" : "is-hidden"}>
+      <div class="content">
+        {Object.keys(info.fields).map(f => YupField(`${name}.${f}`, f, errors, 
value, onChange, info.fields[f]))}
+      </div>
+    </div>
+  </div>
+}
+
+function YupInput({ name, readonly, value, errors, onChange }: Props): VNode {
+  const dict = useText({
+    placeholder: `fields.instance.${name}.placeholder`,
+    tooltip: `fields.instance.${name}.tooltip`,
+  })
+
+  return <div class="field is-horizontal">
+    <div class="field-label is-normal">
+      <label class="label">
+        <Text id={`fields.instance.${name}.label`} />
+        {dict.tooltip && <span class="icon" data-tooltip={dict.tooltip}>
+          <i class="mdi mdi-information" />
+        </span>}
+      </label>
+    </div>
+    <div class="field-body">
+      <div class="field">
+        <p class="control">
+          <input class={errors[name] ? "input is-danger" : "input"} type="text"
+            placeholder={dict['placeholder']} readonly={readonly}
+            name={name} value={value}
+            onChange={(e): void => onChange(e.currentTarget.value)} />
+          <Text id={`fields.instance.${name}.help`} />
+        </p>
+        {errors[name] ? <p class="help is-danger">
+          <Text id={`validation.${errors[name].type}`} 
fields={errors[name].params}>{errors[name].message}</Text>
+        </p> : null}
+      </div>
+    </div>
+  </div>
+}
+
+function YupInputWithAddon({ name, readonly, value, errors, onChange, addon }: 
Props & { addon: string }): VNode {
+  const dict = useText({
+    placeholder: `fields.instance.${name}.placeholder`,
+    tooltip: `fields.instance.${name}.tooltip`,
+  })
+
+  return <div class="field is-horizontal">
+    <div class="field-label is-normal">
+      <label class="label">
+        <Text id={`fields.instance.${name}.label`} />
+        {dict.tooltip && <span class="icon" data-tooltip={dict.tooltip}>
+          <i class="mdi mdi-information" />
+        </span>}
+      </label>
+    </div>
+    <div class="field-body">
+      <div class="field">
+        <div class="field has-addons">
+          <div class="control">
+            <a class="button is-static">{addon}</a>
+          </div>
+          <p class="control is-expanded">
+            <input class={errors[name] ? "input is-danger" : "input"} 
type="text"
+              placeholder={dict['placeholder']} readonly={readonly}
+              name={name} value={value}
+              onChange={(e): void => onChange(e.currentTarget.value)} />
+            <Text id={`fields.instance.${name}.help`} />
+          </p>
+        </div>
+        {errors[name] ? <p class="help is-danger"><Text 
id={`validation.${errors[name].type}`} 
fields={errors[name].params}>{errors[name].message}</Text></p> : null}
+      </div>
+    </div>
+  </div>
+}
+
+function YupInputSecured({ name, readonly, value, errors, onChange }: Props): 
VNode {
+  const dict = useText({
+    placeholder: `fields.instance.${name}.placeholder`,
+    tooltip: `fields.instance.${name}.tooltip`,
+  })
+
+  const [active, setActive] = useState(false)
+  
+  return <div class="field is-horizontal">
+    <div class="field-label is-normal">
+      <label class="label">
+        <Text id={`fields.instance.${name}.label`} />
+        {dict.tooltip && <span class="icon" data-tooltip={dict.tooltip}>
+          <i class="mdi mdi-information" />
+        </span>}
+      </label>
+    </div>
+    <div class="field-body">
+      <div class="field">
+        <div class="field has-addons">
+          <label class="b-checkbox checkbox">
+            <input type="checkbox" checked={active} onClick={(): void => { 
onChange(''); setActive(!active) }} />
+            <span class="check" />
+          </label>
+          <p class="control">
+            <input class="input" type="text"
+              placeholder={dict.placeholder} readonly={readonly || !active}
+              disabled={readonly || !active}
+              name={name} value={value}
+              onChange={(e): void => onChange(e.currentTarget.value)} />
+            <Text id={`fields.instance.${name}.help`} />
+          </p>
+        </div>
+        {errors[name] ? <p class="help is-danger"><Text 
id={`validation.${errors[name].type}`} 
fields={errors[name].params}>{errors[name].message}</Text></p> : null}
+      </div>
+    </div>
+  </div>
+}
diff --git a/src/components/yup/YupInput.tsx b/src/components/yup/YupInput.tsx
deleted file mode 100644
index faf8da4..0000000
--- a/src/components/yup/YupInput.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { h, VNode } from "preact";
-import { Text, useText } from "preact-i18n";
-
-interface Props {
-  name: string;
-  object: any;
-  info: any;
-  errors: any;
-  valueHandler: any;
-}
-
-function convert(object: any, name: string, type?: string): any {
-  switch (type) {
-    case 'duration': return object[name]?.d_ms;
-    default: return object[name];
-  }
-}
-
-export default function YupInput({ name, info, object, errors, valueHandler }: 
Props): VNode {
-  const dict = useText({ placeholder: `fields.instance.${name}.placeholder` })
-  const value = convert(object, name, info.meta?.type)
-
-  return <div class="field is-horizontal">
-    <div class="field-label is-normal">
-      <label class="label"><Text id={`fields.instance.${name}.label`} 
/></label>
-    </div>
-    <div class="field-body">
-      <div class="field">
-        <p class="control is-expanded has-icons-left">
-          <input class="input" type="text"
-            placeholder={dict['placeholder']} readonly={info?.meta?.readonly}
-            name={name} value={value}
-            onChange={(e): void => valueHandler((prev: any) => ({ ...prev, 
[name]: e.currentTarget.value }))} />
-          <Text id={`fields.instance.${name}.help`} />
-        </p>
-        {errors[name] ? <p class="help is-danger"><Text 
id={`validation.${errors[name].type}`} 
fields={errors[name].params}>{errors[name].message}</Text></p> : null}
-      </div>
-    </div>
-  </div>
-}
diff --git a/src/declaration.d.ts b/src/declaration.d.ts
index b729051..2cc71c8 100644
--- a/src/declaration.d.ts
+++ b/src/declaration.d.ts
@@ -4,19 +4,27 @@ declare module "*.css" {
     const mapping: Record<string, string>;
     export default mapping;
 }
+declare module "*.jpeg" {
+    const mapping: Record<string, string>;
+    export default mapping;
+}
 declare module "*.scss" {
     const mapping: Record<string, string>;
     export default mapping;
 }
 
+interface KeyValue {
+    [key: string]: string;
+}
+
 interface Notification {
     messageId: string;
     type: MessageType;
     params?: any;
-  }
-  
-  type MessageType = 'INFO' | 'WARN' | 'ERROR' | 'SUCCESS'
-  
+}
+
+type MessageType = 'INFO' | 'WARN' | 'ERROR' | 'SUCCESS'
+
 type EddsaPublicKey = string;
 type RelativeTime = Duration;
 interface Timestamp {
@@ -50,6 +58,19 @@ export namespace MerchantBackend {
         tax: Amount;
     }
 
+    interface VersionResponse {
+        // libtool-style representation of the Merchant protocol version, see
+        // 
https://www.gnu.org/software/libtool/manual/html_node/Versioning.html#Versioning
+        // The format is "current:revision:age".
+        version: string;
+
+        // Name of the protocol.
+        name: "taler-merchant";
+
+        // Currency supported by this backend.
+        currency: string;
+
+    }
     interface Location {
         // Nation with its own government.
         country?: string;
diff --git a/src/hooks/notifications.ts b/src/hooks/notifications.ts
index 013fa3e..2f47076 100644
--- a/src/hooks/notifications.ts
+++ b/src/hooks/notifications.ts
@@ -6,7 +6,7 @@ interface Result {
   pushNotification: (n: Notification) => void;
 }
 
-export function useNotifications(timeout = 2000): Result {
+export function useNotifications(timeout = 3000): Result {
   const [notifications, setNotifications] = useState<(Notification & { since: 
Date })[]>([])
   const pushNotification = (n: Notification): void => {
     const entry = { ...n, since: new Date() }
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
index 7a99719..c0d1acc 100644
--- a/src/i18n/index.ts
+++ b/src/i18n/index.ts
@@ -55,7 +55,7 @@ export default {
         payto_uris: {
           label: 'PaytTO URI',
           placeholder: 'valores separados por coma',
-          help: 'payto://x-taler-bank/bank.taler:5882/blogger',
+          help: 'example: payto://<authority>/<path>/<name>',
         },
         default_max_deposit_fee: {
           label: 'Máximo pago por depósito',
@@ -100,6 +100,10 @@ export default {
         title: 'unauthorized access',
         description: 'backend has denied access'
       },
+      error: {
+        title: 'Error query the backend',
+        description: 'Got message: "{{error.message}}" from: {{backend}} 
(hasToken: {{hasToken}})'
+      },
       create_error: {
         title: 'create error',
         description: 'the create process went wrong, server says: 
{{info.hint}}'
@@ -132,6 +136,9 @@ export default {
         id: {
           label: 'Id',
         },
+        auth_token: {
+          label: 'Auth Token',
+        },
         merchant_pub: {
           label: 'Public Key'
         },
@@ -139,10 +146,11 @@ export default {
           label: 'Payment targets',
         },
         name: {
-          label: 'Name',
+          label: 'Business Name',
+          tooltip: 'the name of the merchant instance'
         },
         payto_uris: {
-          label: 'PaytTO URI',
+          label: 'Bank accounts',
           placeholder: 'comma separated values',
           help: 'payto://x-taler-bank/bank.taler:5882/blogger',
         },
@@ -161,6 +169,72 @@ export default {
         default_wire_transfer_delay: {
           label: 'Wire transfer delay'
         },
+        address: {
+          label: 'Address',
+          country: {
+            label: 'Country',
+          },
+          country_subdivision: {
+            label: 'Country subdivision',
+          },
+          town: {
+            label: 'Town',
+          },
+          district: {
+            label: 'District',
+          },
+          town_location: {
+            label: 'Town Location',
+          },
+          post_code: {
+            label: 'Post code',
+          },
+          street: {
+            label: 'Street',
+          },
+          building_name: {
+            label: 'Building name',
+          },
+          building_number: {
+            label: 'Building number',
+          },
+          address_lines: {
+            label: 'Address lines',
+          }
+        },
+        jurisdiction: {
+          label: 'Jurisdiction',
+          country: {
+            label: 'Country',
+          },
+          country_subdivision: {
+            label: 'Country subdivision',
+          },
+          town: {
+            label: 'Town',
+          },
+          district: {
+            label: 'District',
+          },
+          town_location: {
+            label: 'Town Location',
+          },
+          post_code: {
+            label: 'Post code',
+          },
+          street: {
+            label: 'Street',
+          },
+          building_name: {
+            label: 'Building name',
+          },
+          building_number: {
+            label: 'Building number',
+          },
+          address_lines: {
+            label: 'Address lines',
+          }
+        }
       }
     },
     validation: {
@@ -172,6 +246,7 @@ export default {
       instances: 'Instances',
       merchant: 'Merchant',
       list_of_configured_instances: 'List of configured instances',
+      create_new_instance: 'Create new instance',
       
       instance: {
         empty_list: 'No instance configured yet, setup one pressing the + 
button',
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
index e02aa01..bc8668e 100644
--- a/src/routes/index.tsx
+++ b/src/routes/index.tsx
@@ -7,23 +7,23 @@ import Instances from './instances';
 import Footer from '../components/footer';
 import Sidebar from '../components/sidebar';
 import NavigationBar from '../components/navbar';
-import InstanceDetail from './instanceDetail';
 import Notifications from '../components/notifications';
 import { useNotifications } from '../hooks/notifications';
-import lang from '../i18n';
+import i18n from '../i18n';
+import useLang from '../components/hooks/useLang';
 
 
 export default function PageRouter(): VNode {
   const { notifications, pushNotification } = useNotifications()
+  const [lang, setLang] = useLang()
   return (
-    <IntlProvider definition={lang.en}>
+    <IntlProvider definition={(i18n as any)[lang] || i18n.en }>
       <div id="app">
-        <NavigationBar />
+        <NavigationBar lang={lang} setLang={setLang} />
         <Sidebar />
         <Notifications notifications={notifications} />
         <Router>
           <Route path="/" component={Instances} 
pushNotification={pushNotification} />
-          <Route path="/i/:instance" component={InstanceDetail} />
           <NotFoundPage default />
         </Router>
         <Footer />
diff --git a/src/routes/instanceDetail/index.tsx 
b/src/routes/instanceDetail/index.tsx
deleted file mode 100644
index e80a65a..0000000
--- a/src/routes/instanceDetail/index.tsx
+++ /dev/null
@@ -1,6 +0,0 @@
-import { h, VNode } from 'preact';
-
-
-export default function InstanceDetail({ instance }: any): VNode {
-  return <div>hola {instance}</div>
-}
\ No newline at end of file
diff --git a/src/routes/instances/CardTable.tsx 
b/src/routes/instances/CardTable.tsx
index ccd9aec..d7129f3 100644
--- a/src/routes/instances/CardTable.tsx
+++ b/src/routes/instances/CardTable.tsx
@@ -50,7 +50,7 @@ export default function CardTable({ instances, onCreate, 
onSelect, selected }: P
     <header class="card-header">
       <p class="card-header-title"><span class="icon"><i class="mdi 
mdi-account-multiple" /></span><Text id="text.instances" /></p>
       
-      <button class={rowSelection.length > 0 ? "card-header-icon" : 
"card-header-icon is-hidden"} 
+      <button class={rowSelection.length > 0 ? "card-header-icon" : 
"is-hidden"} 
         type="button" onClick={(): void => 
actionQueueHandler(buildActions(instances, rowSelection, 'DELETE'))} >
 
         <span class="icon"><i class="mdi mdi-trash-can" /></span>
diff --git a/src/routes/instances/CreateModal.stories.tsx 
b/src/routes/instances/Create.stories.tsx
similarity index 67%
rename from src/routes/instances/CreateModal.stories.tsx
rename to src/routes/instances/Create.stories.tsx
index 1906f0c..534a0c5 100644
--- a/src/routes/instances/CreateModal.stories.tsx
+++ b/src/routes/instances/Create.stories.tsx
@@ -1,11 +1,11 @@
 /* eslint-disable @typescript-eslint/camelcase */
 import { h, VNode } from 'preact';
-import CreateModal from './CreateModal'
+import Create from './Create'
 
 
 export default {
   title: 'Instances/CreateModal',
-  component: CreateModal,
+  component: Create,
   argTypes: {
     element: { control: 'object' },
     onCancel: { action: 'onCancel' },
@@ -13,4 +13,4 @@ export default {
   }
 };
 
-export const Example = (a: any): VNode => <CreateModal {...a} />;
+export const Example = (a: any): VNode => <Create {...a} />;
diff --git a/src/routes/instances/Create.tsx b/src/routes/instances/Create.tsx
new file mode 100644
index 0000000..644ad0c
--- /dev/null
+++ b/src/routes/instances/Create.tsx
@@ -0,0 +1,90 @@
+import { h, VNode } from "preact";
+import { useState } from "preact/hooks";
+import { MerchantBackend } from "../../declaration";
+import * as yup from 'yup';
+import YupField from "../../components/yup/YupField"
+import { InstanceCreateSchema as schema } from '../../schemas'
+import { Text } from "preact-i18n";
+
+interface Props {
+  onCreate: (d: MerchantBackend.Instances.InstanceConfigurationMessage) => 
void;
+  isLoading: boolean;
+  goBack: () => void;
+}
+
+interface KeyValue {
+  [key: string]: string;
+}
+
+function with_defaults(): 
Partial<MerchantBackend.Instances.InstanceConfigurationMessage> {
+  return { 
+    default_pay_delay: { d_ms: 1000 },
+    default_wire_fee_amortization: 10,
+    default_wire_transfer_delay: { d_ms: 2000 },
+  };
+}
+
+export default function CreateModal({ onCreate, isLoading, goBack }: Props): 
VNode {
+  const [value, valueHandler] = useState(with_defaults())
+  const [errors, setErrors] = useState<KeyValue>({})
+
+  const submit = (): void => {
+    try {
+      schema.validateSync(value, { abortEarly: false })
+      onCreate(schema.cast(value) as 
MerchantBackend.Instances.InstanceConfigurationMessage);
+      goBack()
+    } catch (err) {
+      const errors = err.inner as yup.ValidationError[]
+      const pathMessages = errors.reduce((prev, cur) => !cur.path ? prev : ({ 
...prev, [cur.path]: { type: cur.type, params: cur.params, message: cur.message 
} }), {})
+      setErrors(pathMessages)
+    }
+  }
+
+  return <div>
+    <section class="section is-title-bar">
+
+      <div class="level">
+        <div class="level-left">
+          <div class="level-item">
+            <ul>
+              <li><Text id="text.merchant" /></li>
+              <li><Text id="text.instances" /></li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </section>
+
+    <section class={isLoading ? "hero is-hero-bar" : "hero is-hero-bar 
is-loading"}>
+      <div class="hero-body">
+        <div class="level">
+          <div class="level-left">
+            <div class="level-item">
+              <h1 class="title">
+                <Text id="text.create_new_instances" />
+              </h1>
+            </div>
+          </div>
+          <div class="level-right" style="display: none;">
+            <div class="level-item" />
+          </div>
+        </div>
+      </div>
+    </section>
+
+    <section class="section is-main-section">
+      <div class="columns">
+        <div class="column" />
+        <div class="column is-two-thirds">
+          {Object.keys(schema.fields).map(f => YupField(f, f, errors, value, 
valueHandler, schema.fields[f].describe()))}
+          <div class="buttons is-right">
+            <button class="button" onClick={goBack} ><Text id="cancel" 
/></button>
+            <button class="button is-success" onClick={submit} ><Text 
id="confirm" /></button>
+          </div>
+        </div>
+        <div class="column" />
+      </div>
+    </section>
+
+  </div>
+}
\ No newline at end of file
diff --git a/src/routes/instances/CreateModal.tsx 
b/src/routes/instances/CreateModal.tsx
deleted file mode 100644
index d9e9828..0000000
--- a/src/routes/instances/CreateModal.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import { h, VNode } from "preact";
-import { useState } from "preact/hooks";
-import { MerchantBackend } from "../../declaration";
-import * as yup from 'yup';
-import ConfirmModal from "../../components/modal";
-import YupInput from "../../components/yup/YupInput"
-import { InstanceCreateSchema as schema } from '../../schemas'
-
-interface Props {
-  onCancel: () => void;
-  onConfirm: (i: MerchantBackend.Instances.InstanceConfigurationMessage) => 
void;
-}
-
-interface KeyValue {
-  [key: string]: string;
-}
-
-export default function CreateModal({ onCancel, onConfirm }: Props): VNode {
-  const [value, valueHandler] = useState({} as any)
-  const [errors, setErrors] = useState<KeyValue>({})
-
-  const submit = (): void => {
-    try {
-      schema.validateSync(value, { abortEarly: false })
-      onConfirm({ ...schema.cast(value), address: {}, jurisdiction: {}, 
default_wire_transfer_delay: { d_ms: 6000 }, default_pay_delay: { d_ms: 3000 } 
} as MerchantBackend.Instances.InstanceConfigurationMessage);
-    } catch (err) {
-      const errors = err.inner as yup.ValidationError[]
-      const pathMessages = errors.reduce((prev, cur) => !cur.path ? prev : ({ 
...prev, [cur.path]: { type: cur.type, params: cur.params, message: cur.message 
} }), {})
-      setErrors(pathMessages)
-    }
-  }
-
-  return <ConfirmModal description="create_instance" active onConfirm={submit} 
onCancel={onCancel}>
-    {Object.keys(schema.fields).map(f => {
-      const info = schema.fields[f].describe()
-      return <YupInput name={f} info={info} errors={errors} object={value} 
valueHandler={valueHandler} />
-    })}
-
-  </ConfirmModal>
-}
\ No newline at end of file
diff --git a/src/routes/instances/Update.tsx b/src/routes/instances/Update.tsx
new file mode 100644
index 0000000..e30039b
--- /dev/null
+++ b/src/routes/instances/Update.tsx
@@ -0,0 +1,90 @@
+import { h, VNode } from "preact";
+import { useState } from "preact/hooks";
+import { MerchantBackend, WidthId } from "../../declaration";
+import * as yup from 'yup';
+import YupField from "../../components/yup/YupField"
+import { InstanceUpdateSchema as schema } from '../../schemas'
+import { Text } from "preact-i18n";
+
+interface Props {
+  onUpdate: (id: string, d: 
MerchantBackend.Instances.InstanceReconfigurationMessage) => void;
+  selected: MerchantBackend.Instances.QueryInstancesResponse & WidthId;
+  isLoading: boolean;
+  goBack: () => void;
+}
+
+interface KeyValue {
+  [key: string]: string;
+}
+
+function convert(from: MerchantBackend.Instances.QueryInstancesResponse): 
MerchantBackend.Instances.InstanceReconfigurationMessage {
+  const payto_uris = from.accounts.map(a => a.payto_uri)  
+  return {default_pay_delay: { d_ms: 1000 }, ...from, payto_uris,  };
+}
+
+export default function UpdateModal({ onUpdate, isLoading, selected, goBack }: 
Props): VNode {
+  const [value, valueHandler] = useState(convert(selected))
+  const [errors, setErrors] = useState<KeyValue>({})
+
+  const submit = (): void => {
+    try {
+      schema.validateSync(value, { abortEarly: false })
+      onUpdate(selected.id, schema.cast(value));
+      goBack()
+    } catch (err) {
+      const errors = err.inner as yup.ValidationError[]
+      const pathMessages = errors.reduce((prev, cur) => !cur.path ? prev : ({ 
...prev, [cur.path]: { type: cur.type, params: cur.params, message: cur.message 
} }), {})
+      setErrors(pathMessages)
+    }
+  }
+
+  return <div>
+    <section class="section is-title-bar">
+
+      <div class="level">
+        <div class="level-left">
+          <div class="level-item">
+            <ul>
+              <li><Text id="text.merchant" /></li>
+              <li><Text id="text.instances" /></li>
+            </ul>
+          </div>
+        </div>
+      </div>
+    </section>
+
+    <section class={isLoading ? "hero is-hero-bar" : "hero is-hero-bar 
is-loading"}>
+      <div class="hero-body">
+        <div class="level">
+          <div class="level-left">
+            <div class="level-item">
+              <h1 class="title">
+                <Text id="text.create_new_instances" />
+              </h1>
+            </div>
+          </div>
+          <div class="level-right" style="display: none;">
+            <div class="level-item" />
+          </div>
+        </div>
+      </div>
+    </section>
+
+    <section class="section is-main-section">
+      <div class="columns">
+        <div class="column" />
+        <div class="column is-two-thirds">
+          {Object.keys(schema.fields).map(f => YupField(f, f, errors, value, 
valueHandler, schema.fields[f].describe()))}
+          <div class="buttons is-right">
+            <button class="button" onClick={goBack} ><Text id="cancel" 
/></button>
+            <button class="button is-success" onClick={submit} ><Text 
id="confirm" /></button>
+          </div>
+        </div>
+        <div class="column" />
+      </div>
+    </section>
+
+  </div>
+
+  // </ConfirmModal>
+}
\ No newline at end of file
diff --git a/src/routes/instances/UpdateModal.tsx 
b/src/routes/instances/UpdateModal.tsx
index 8340465..c42bb5f 100644
--- a/src/routes/instances/UpdateModal.tsx
+++ b/src/routes/instances/UpdateModal.tsx
@@ -1,9 +1,9 @@
 import { h, VNode } from "preact";
 import { useState } from "preact/hooks";
-import { MerchantBackend } from "../../declaration";
+import { KeyValue, MerchantBackend } from "../../declaration";
 import * as yup from 'yup';
 import ConfirmModal from '../../components/modal'
-import YupInput from "../../components/yup/YupInput";
+import YupField from "../../components/yup/YupField";
 import { InstanceUpdateSchema as schema } from '../../schemas'
 
 interface Props {
@@ -12,10 +12,6 @@ interface Props {
   onConfirm: (i: MerchantBackend.Instances.InstanceReconfigurationMessage) => 
void;
 }
 
-interface KeyValue {
-  [key: string]: string;
-}
-
 export default function UpdateModal({ element, onCancel, onConfirm }: Props): 
VNode {
   const copy: any = !element ? {} : Object.keys(schema.fields).reduce((prev, 
cur) => ({ ...prev, [cur]: (element as any)[cur] }), {})
 
@@ -26,7 +22,7 @@ export default function UpdateModal({ element, onCancel, 
onConfirm }: Props): VN
     try {
       schema.validateSync(value, { abortEarly: false })
 
-      onConfirm({ ...schema.cast(value), address: {}, jurisdiction: {} } as 
MerchantBackend.Instances.InstanceReconfigurationMessage);
+      onConfirm(schema.cast(value) as 
MerchantBackend.Instances.InstanceReconfigurationMessage);
     } catch (err) {
       const errors = err.inner as yup.ValidationError[]
       const pathMessages = errors.reduce((prev, cur) => !cur.path ? prev : ({ 
...prev, [cur.path]: { type: cur.type, params: cur.params, message: cur.message 
} }), {})
@@ -35,12 +31,6 @@ export default function UpdateModal({ element, onCancel, 
onConfirm }: Props): VN
   }
 
   return <ConfirmModal description="update_instance" active={element != null} 
onConfirm={submit} onCancel={onCancel}>
-    {Object.keys(schema.fields).map(f => {
-
-      const info = schema.fields[f].describe()
-      return <YupInput name={f} info={info} errors={errors} object={value} 
valueHandler={valueHandler} />
-
-    })}
-
+    {Object.keys(schema.fields).map(f => YupField(f, f, errors, value, 
valueHandler, schema.fields[f].describe()))}
   </ConfirmModal>
 }
\ No newline at end of file
diff --git a/src/routes/instances/View.tsx b/src/routes/instances/View.tsx
index 61435cd..de950b8 100644
--- a/src/routes/instances/View.tsx
+++ b/src/routes/instances/View.tsx
@@ -3,14 +3,12 @@ import { useState } from "preact/hooks";
 import { MerchantBackend, WidthId } from "../../declaration";
 import Table from './CardTable';
 import DeleteModal from './DeleteModal'
-import UpdateModal from './UpdateModal'
-import CreateModal from './CreateModal'
 import { Text } from "preact-i18n";
 
 interface Props {
   instances: MerchantBackend.Instances.Instance[];
-  onCreate: (d: MerchantBackend.Instances.InstanceConfigurationMessage) => 
void;
-  onUpdate: (id: string, d: 
MerchantBackend.Instances.InstanceReconfigurationMessage) => void;
+  onCreate: (s: boolean) => void;
+  onUpdate: (s: boolean) => void;
   onDelete: (id: string) => void;
   onSelect: (id: string | null) => void;
   selected: MerchantBackend.Instances.QueryInstancesResponse & WidthId | 
undefined;
@@ -18,12 +16,12 @@ interface Props {
 }
 
 export default function View({ instances, isLoading, onCreate, onDelete, 
onSelect, onUpdate, selected }: Props): VNode {
-  const [create, setCreate] = useState<boolean>(false)
   const [action, setAction] = useState<'UPDATE' | 'DELETE' | null>(null)
 
   const onSelectAction = (id: string | null, action?: 'UPDATE' | 'DELETE'): 
void => {
     onSelect(id)
     setAction(action || null)
+    if (action === 'UPDATE') onUpdate(true)
   }
 
   return <div id="app">
@@ -46,7 +44,9 @@ export default function View({ instances, isLoading, 
onCreate, onDelete, onSelec
         <div class="level">
           <div class="level-left">
             <div class="level-item">
-              <h1 class="title"><Text id="text.list_of_configured_instances" 
/></h1>
+              <h1 class="title">
+                <Text id="text.list_of_configured_instances" />
+              </h1>
             </div>
           </div>
           <div class="level-right" style="display: none;">
@@ -56,7 +56,7 @@ export default function View({ instances, isLoading, 
onCreate, onDelete, onSelec
       </div>
     </section>
     <section class="section is-main-section">
-      <Table instances={instances} onSelect={onSelectAction} 
selected={selected} onCreate={(): void => setCreate(true)} />
+      <Table instances={instances} onSelect={onSelectAction} 
selected={selected} onCreate={(): void => onCreate(true)} />
     </section>
 
     {selected && action === 'DELETE' ?
@@ -67,18 +67,5 @@ export default function View({ instances, isLoading, 
onCreate, onDelete, onSelec
       />
       : null}
 
-    {selected && action === 'UPDATE' ?
-      <UpdateModal element={selected} onCancel={(): void => 
onSelectAction(null)} onConfirm={(i): void => {
-        onUpdate(selected.id, i);
-        onSelectAction(null);
-      }}
-      />
-      : null}
-
-    {create ? <CreateModal onCancel={(): void => setCreate(false)} 
onConfirm={(i): void => {
-      onCreate(i)
-      setCreate(false);
-    }} /> : null}
-
   </div >
 }
\ No newline at end of file
diff --git a/src/routes/instances/index.tsx b/src/routes/instances/index.tsx
index aab50aa..789026f 100644
--- a/src/routes/instances/index.tsx
+++ b/src/routes/instances/index.tsx
@@ -1,9 +1,11 @@
 import { h, VNode } from 'preact';
 import View from './View';
 import LoginPage from '../../components/auth/LoginPage';
-import { updateToken, useBackendInstance, useBackendInstances } from 
'../../components/hooks/backend';
+import { useBackendInstance, useBackendInstances } from 
'../../components/hooks/backend';
 import { useEffect, useState } from 'preact/hooks';
 import { Notification } from '../../declaration';
+import CreatePage from './Create';
+import UpdatePage from './Update';
 
 interface Props {
   pushNotification: (n: Notification) => void;
@@ -13,33 +15,60 @@ export default function Instances({ pushNotification }: 
Props): VNode {
   const list = useBackendInstances()
   const [selectedId, select] = useState<string | null>(null)
   const details = useBackendInstance(selectedId)
+  const [create, setCreate] = useState<boolean>(false)
+  const [update, setUpdate] = useState<boolean>(false)
 
 
   const requiresToken = (!list.data && list.needsAuth) || (selectedId != null 
&& !details.data && details.needsAuth)
   const isLoadingTheList = (!list.data && !list.error)
   const isLoadingTheDetails = (!details.data && !details.error)
-  
+
+  const genericError = !list.data && list.error || !details.data && 
details.error
+
   useEffect(() => {
-    if (requiresToken) pushNotification({messageId: 'unauthorized', type: 
'ERROR' })
-  }, [requiresToken])
+    if (requiresToken) {
+      pushNotification({ messageId: 'unauthorized', type: 'ERROR' })
+    } else if (genericError) {
+      pushNotification({messageId: 'error', params: genericError, type: 
'ERROR'})
+    }
+  }, [requiresToken, genericError])
+
 
   if (requiresToken) {
-    return <LoginPage onLogIn={updateToken} />
+    return <LoginPage />
+  }
+
+  if (create) {
+    return <CreatePage 
+      goBack={() => setCreate(false)} 
+      isLoading={false}
+
+      onCreate={(d): Promise<void> => list.create(d)
+        .then((): void => pushNotification({ messageId: 'create_success', 
type: 'SUCCESS' }))
+        .catch((error): void => pushNotification({ messageId: 'create_error', 
type: 'ERROR', params: error }))
+      }
+    />
+  }
+
+  if (update && details.data && selectedId) {
+    return <UpdatePage 
+      goBack={() => setUpdate(false)} 
+      isLoading={false}
+      selected={{ ...details.data, id: selectedId }}
+      onUpdate={(id, d): Promise<void> => details.update(id, d)
+        .then((): void => pushNotification({ messageId: 'update_success', 
type: 'SUCCESS' }))
+        .catch((error): void => pushNotification({ messageId: 'update_error', 
type: 'ERROR', params: error }))
+      }
+    />
   }
 
   return <View instances={list.data?.instances || []}
     isLoading={isLoadingTheList || isLoadingTheDetails}
-    onCreate={(d): Promise<void> => list.create(d)
-      .then((): void => pushNotification({messageId: 'create_success', 
type:'SUCCESS'}))
-      .catch((error): void => pushNotification({messageId: 'create_error', 
type:'ERROR', params: error}))
-    }
-    onUpdate={(id, d): Promise<void> => details.update(id, d)
-      .then((): void => pushNotification({messageId: 'update_success', 
type:'SUCCESS'}))
-      .catch((error): void => pushNotification({messageId: 'update_error', 
type:'ERROR', params: error}))
-    }
+    onCreate={setCreate}
+    onUpdate={setUpdate}
     onDelete={(id): Promise<void> => details.delete(id)
-      .then((): void => pushNotification({messageId: 'delete_success', 
type:'SUCCESS'}))
-      .catch((error): void => pushNotification({messageId: 'delete_error', 
type:'ERROR', params: error}))
+      .then((): void => pushNotification({ messageId: 'delete_success', type: 
'SUCCESS' }))
+      .catch((error): void => pushNotification({ messageId: 'delete_error', 
type: 'ERROR', params: error }))
     }
     onSelect={select}
     selected={!details.data || !selectedId ? undefined : { ...details.data, 
id: selectedId }}
diff --git a/src/schemas/index.ts b/src/schemas/index.ts
index 53cd709..c3ad791 100644
--- a/src/schemas/index.ts
+++ b/src/schemas/index.ts
@@ -7,8 +7,8 @@ yup.setLocale({
     default: 'field_invalid',
   },
   number: {
-    min: ({ min }) => ({ key: 'field_too_short', values: { min } }),
-    max: ({ max }) => ({ key: 'field_too_big', values: { max } }),
+    min: ({ min }: any) => ({ key: 'field_too_short', values: { min } }),
+    max: ({ max }: any) => ({ key: 'field_too_big', values: { max } }),
   },
 });
 
@@ -23,63 +23,67 @@ function listOfPayToUrisAreValid(values?: (string | 
undefined)[]): boolean {
 
 function numberToDuration(this: yup.AnySchema, current: any, original: 
string): Duration {
   if (this.isType(current)) return current;
-  const d_ms = parseInt(original, 10)
+  const d_ms = parseInt(original, 10) * 1000
   return { d_ms }
 }
 
 function currencyWithAmountIsValid(value?: string): boolean {
   return !!value && AMOUNT_REGEX.test(value)
 }
-
-export const InstanceUpdateSchema = yup.object().shape({
-  name: yup.string().required(),
-  payto_uris: yup.array().of(yup.string())
-    .min(1)
-    .transform(stringToArray)
-    .test('payto', '{path} is not valid', listOfPayToUrisAreValid),
-  default_max_deposit_fee: yup.string()
-    .required()
-    .test('amount', '{path} is not valid', currencyWithAmountIsValid),
-  default_max_wire_fee: yup.string()
-    .required()
-    .test('amount', '{path} is not valid', currencyWithAmountIsValid),
-  default_wire_fee_amortization: yup.number()
-    .required(),
-    default_pay_delay: yup.object()
-    .shape({d_ms: yup.number() })
-    .required()
-    .meta({type:'duration'})
-    .transform(numberToDuration),
-  default_wire_transfer_delay: yup.object()
-    .shape({d_ms: yup.number() })
-    .required()
-    .meta({type:'duration'})
-    .transform(numberToDuration),
-});
-
-export const InstanceCreateSchema = yup.object().shape({
-  id: yup.string().required(),
+const InstanceSchema = yup.object().shape({
+  id: yup.string().required().meta({type: 'url'}),
   name: yup.string().required(),
+  auth_token: yup.string().min(8).max(20).optional().meta({type: 'secured'}),
   payto_uris: yup.array().of(yup.string())
     .min(1)
     .transform(stringToArray)
     .test('payto', '{path} is not valid', listOfPayToUrisAreValid),
   default_max_deposit_fee: yup.string()
     .required()
-    .test('amount', '{path} is not valid', currencyWithAmountIsValid),
+    .test('amount', '{path} is not valid', currencyWithAmountIsValid)
+    .meta({type: 'amount'}),
   default_max_wire_fee: yup.string()
     .required()
-    .test('amount', '{path} is not valid', currencyWithAmountIsValid),
+    .test('amount', '{path} is not valid', currencyWithAmountIsValid)
+    .meta({type: 'amount'}),
   default_wire_fee_amortization: yup.number()
     .required(),
+  address: yup.object().shape({
+    country: yup.string().optional(),
+    country_subdivision: yup.string().optional(),
+    district: yup.string().optional(),
+    town: yup.string(),
+    town_location: yup.string().optional(),
+    post_code: yup.string().optional(),
+    street: yup.string().optional(),
+    building_name: yup.string().optional(),
+    building_number: yup.string().optional(),
+    address_lines: yup.array().of(yup.string()).max(7).optional(),
+  }).meta({type:'group'}),
+  jurisdiction: yup.object().shape({
+    country: yup.string().optional(),
+    country_subdivision: yup.string().optional(),
+    district: yup.string().optional(),
+    town: yup.string(),
+    town_location: yup.string().optional(),
+    post_code: yup.string().optional(),
+    street: yup.string().optional(),
+    building_name: yup.string().optional(),
+    building_number: yup.string().optional(),
+    address_lines: yup.array().of(yup.string()).max(7).optional(),
+  }).meta({type:'group'}),
   default_pay_delay: yup.object()
-    .shape({d_ms: yup.number() })
+    .shape({ d_ms: yup.number() })
     .required()
-    .meta({type:'duration'})
+    .meta({ type: 'duration' })
     .transform(numberToDuration),
   default_wire_transfer_delay: yup.object()
-    .shape({d_ms: yup.number() })
+    .shape({ d_ms: yup.number() })
     .required()
-    .meta({type:'duration'})
+    .meta({ type: 'duration' })
     .transform(numberToDuration),
-});
+})
+
+export const InstanceUpdateSchema = InstanceSchema.clone().omit(['id']);
+export const InstanceCreateSchema = InstanceSchema.clone();
+
diff --git a/src/scss/main.scss b/src/scss/main.scss
index 5146c41..2679db2 100644
--- a/src/scss/main.scss
+++ b/src/scss/main.scss
@@ -24,6 +24,8 @@
 @import "fonts/nunito.css";
 @import "icons/materialdesignicons-4.9.95.min.css";
 
+@import 
"../../node_modules/@creativebulma/bulma-tooltip/dist/bulma-tooltip.min.css";
+
 .toast {
   position: fixed;
   right: 10px;
diff --git a/template.env b/template.env
deleted file mode 100644
index ac990ee..0000000
--- a/template.env
+++ /dev/null
@@ -1 +0,0 @@
-BACKEND_ENDPOINT=http://localhost:9965
diff --git a/tests/hooks/notification.test.ts b/tests/hooks/notification.test.ts
index e33b04a..b7f6288 100644
--- a/tests/hooks/notification.test.ts
+++ b/tests/hooks/notification.test.ts
@@ -13,8 +13,7 @@ test('notification should disapear after timeout', () => {
 
   act(() => {
     result.current?.pushNotification({
-      description: 'desc',
-      title: 'title',
+      messageId: 'some_id',
       type: 'INFO'
     });
   });
diff --git a/yarn.lock b/yarn.lock
index c2e4733..2e62101 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -968,7 +968,7 @@
     core-js-pure "^3.0.0"
     regenerator-runtime "^0.13.4"
 
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.10.2", 
"@babel/runtime@^7.10.5", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.13", 
"@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.0", 
"@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", "@babel/runtime@^7.8.4", 
"@babel/runtime@^7.9.2":
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.10.2", "@babel/runtime@^7.10.5", 
"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.3.1", 
"@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.2", 
"@babel/runtime@^7.8.4":
   version "7.12.13"
   resolved 
"https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d";
   integrity 
sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==
@@ -1026,6 +1026,11 @@
     exec-sh "^0.3.2"
     minimist "^1.2.0"
 
+"@creativebulma/bulma-tooltip@^1.2.0":
+  version "1.2.0"
+  resolved 
"https://registry.yarnpkg.com/@creativebulma/bulma-tooltip/-/bulma-tooltip-1.2.0.tgz#84dcdd59d94c09c2975fadbec1d3d765ae29c471";
+  integrity 
sha512-ooImbeXEBxf77cttbzA7X5rC5aAWm9UsXIGViFOnsqB+6M944GkB28S5R4UWRqjFd2iW4zGEkEifAU+q43pt2w==
+
 "@emotion/cache@^10.0.27":
   version "10.0.29"
   resolved 
"https://registry.yarnpkg.com/@emotion/cache/-/cache-10.0.29.tgz#87e7e64f412c060102d589fe7c6dc042e6f9d1e0";
@@ -1036,7 +1041,7 @@
     "@emotion/utils" "0.11.3"
     "@emotion/weak-memoize" "0.2.5"
 
-"@emotion/core@^10.0.9", "@emotion/core@^10.1.1":
+"@emotion/core@^10.1.1":
   version "10.1.1"
   resolved 
"https://registry.yarnpkg.com/@emotion/core/-/core-10.1.1.tgz#c956c1365f2f2481960064bcb8c4732e5fb612c3";
   integrity 
sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==
@@ -1100,7 +1105,7 @@
     "@emotion/serialize" "^0.11.15"
     "@emotion/utils" "0.11.3"
 
-"@emotion/styled@^10.0.23", "@emotion/styled@^10.0.7":
+"@emotion/styled@^10.0.23":
   version "10.0.27"
   resolved 
"https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.27.tgz#12cb67e91f7ad7431e1875b1d83a94b814133eaf";
   integrity 
sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==
@@ -1460,7 +1465,7 @@
     "@prefresh/core" "^0.8.1"
     "@prefresh/utils" "^0.3.1"
 
-"@reach/router@^1.2.1", "@reach/router@^1.3.3":
+"@reach/router@^1.3.3":
   version "1.3.4"
   resolved 
"https://registry.yarnpkg.com/@reach/router/-/router-1.3.4.tgz#d2574b19370a70c80480ed91f3da840136d10f8c";
   integrity 
sha512-+mtn9wjlB9NN2CNnnC/BRYtwdKBfSyyasPYraNAyvaV1occr/5NnB4CVzjEZipNHwYebQwcndGUmpFzxAUoqSA==
@@ -1709,18 +1714,6 @@
     prop-types "^15.7.2"
     regenerator-runtime "^0.13.7"
 
-"@storybook/addons@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/addons/-/addons-5.1.9.tgz#ecf218d08508b97ca5e6e0f1ed361081385bd3ff";
-  integrity 
sha512-1bavbcS/NiE65DwyKj8c0DmWmz9VekOinB+has2Pqt2bOffZoZwVnbmepcz9hH3GUyvp5fQBYbxTEmTDvF2lLA==
-  dependencies:
-    "@storybook/api" "5.1.9"
-    "@storybook/channels" "5.1.9"
-    "@storybook/client-logger" "5.1.9"
-    core-js "^3.0.1"
-    global "^4.3.2"
-    util-deprecate "^1.0.2"
-
 "@storybook/addons@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/addons/-/addons-6.1.17.tgz#ab0666446acb9fc19c94d7204dc9aafdefb6c7c2";
@@ -1736,29 +1729,6 @@
     global "^4.3.2"
     regenerator-runtime "^0.13.7"
 
-"@storybook/api@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/api/-/api-5.1.9.tgz#eec5b2f775392ce0803930104c6ce14fa4931e8b";
-  integrity 
sha512-d1HhpOkW+706/WJ9lP5nCqOrp/icvbm0o+6jFFOGJ35AW5O9D8vDBxzvgMEO45jjN4I+rtbcNHQCxshSbPvP9w==
-  dependencies:
-    "@storybook/channels" "5.1.9"
-    "@storybook/client-logger" "5.1.9"
-    "@storybook/core-events" "5.1.9"
-    "@storybook/router" "5.1.9"
-    "@storybook/theming" "5.1.9"
-    core-js "^3.0.1"
-    fast-deep-equal "^2.0.1"
-    global "^4.3.2"
-    lodash "^4.17.11"
-    memoizerific "^1.11.3"
-    prop-types "^15.6.2"
-    react "^16.8.3"
-    semver "^6.0.0"
-    shallow-equal "^1.1.0"
-    store2 "^2.7.1"
-    telejson "^2.2.1"
-    util-deprecate "^1.0.2"
-
 "@storybook/api@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/api/-/api-6.1.17.tgz#50393ce9b718063b67680212df895eceacc0c11d";
@@ -1797,13 +1767,6 @@
     qs "^6.6.0"
     telejson "^5.0.2"
 
-"@storybook/channels@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/channels/-/channels-5.1.9.tgz#003cfca0b9f1ba6cf47ce68304aedd71bdb55e74";
-  integrity 
sha512-R6i7859FsXgY9XFFErVe7gS37wGYpQEEWsO1LzUW7YptGuFTUa8yLgKkNkgfy7Zs61Xm+GiBq8PvS/CWxjotPw==
-  dependencies:
-    core-js "^3.0.1"
-
 "@storybook/channels@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/channels/-/channels-6.1.17.tgz#2cc89a6b9727d19c24b15fa3cb15569b469db864";
@@ -1813,24 +1776,6 @@
     ts-dedent "^2.0.0"
     util-deprecate "^1.0.2"
 
-"@storybook/client-api@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.1.9.tgz#b598efe4ab07bffaeb4cb9e30ed9c21add739df1";
-  integrity 
sha512-J5HDtOS7x5YRpF/CMiHdxywV5NIh1i/03Xh2RhG15lmPy87VStIGpLzhF71uCRPLEJinYelcjuXRNAJgRzUOlg==
-  dependencies:
-    "@storybook/addons" "5.1.9"
-    "@storybook/client-logger" "5.1.9"
-    "@storybook/core-events" "5.1.9"
-    "@storybook/router" "5.1.9"
-    common-tags "^1.8.0"
-    core-js "^3.0.1"
-    eventemitter3 "^3.1.0"
-    global "^4.3.2"
-    is-plain-object "^3.0.0"
-    lodash "^4.17.11"
-    memoizerific "^1.11.3"
-    qs "^6.6.0"
-
 "@storybook/client-api@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.1.17.tgz#3ced22f08a47af70ccf8929111bc44b79e9e8ec0";
@@ -1855,13 +1800,6 @@
     ts-dedent "^2.0.0"
     util-deprecate "^1.0.2"
 
-"@storybook/client-logger@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.1.9.tgz#87e2f7578416269adeccd407584010bc353f14d3";
-  integrity 
sha512-1+Otcn0EFgWNviDPNCR5LtUViADlboz9fmpZc7UY7bgaY5FVNIUO01E4T43tO7fduiRZoEvdltwTuQRm260Vjw==
-  dependencies:
-    core-js "^3.0.1"
-
 "@storybook/client-logger@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.1.17.tgz#0d89aaf824457f19bf9aa585bbcada57595e7d01";
@@ -1870,30 +1808,6 @@
     core-js "^3.0.1"
     global "^4.3.2"
 
-"@storybook/components@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/components/-/components-5.1.9.tgz#2a5258780fff07172d103287759946dbb4b13e2d";
-  integrity 
sha512-F4xcRlifSAfqkuFWtCKRvQDahXyfWBWV2Wa+kYy4YGwEfm3kKtIHVlgdgARL22g9BdYpRFEOJ+42juOu5YvIeQ==
-  dependencies:
-    "@storybook/client-logger" "5.1.9"
-    "@storybook/theming" "5.1.9"
-    core-js "^3.0.1"
-    global "^4.3.2"
-    markdown-to-jsx "^6.9.1"
-    memoizerific "^1.11.3"
-    polished "^3.3.1"
-    popper.js "^1.14.7"
-    prop-types "^15.7.2"
-    react "^16.8.3"
-    react-dom "^16.8.3"
-    react-focus-lock "^1.18.3"
-    react-helmet-async "^1.0.2"
-    react-popper-tooltip "^2.8.3"
-    react-syntax-highlighter "^8.0.1"
-    react-textarea-autosize "^7.1.0"
-    recompose "^0.30.0"
-    simplebar-react "^1.0.0-alpha.6"
-
 "@storybook/components@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/components/-/components-6.1.17.tgz#f92d36e370ec6039d8c7cee9ef13dda866eed3da";
@@ -1920,13 +1834,6 @@
     react-textarea-autosize "^8.1.1"
     ts-dedent "^2.0.0"
 
-"@storybook/core-events@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.1.9.tgz#441a6297e2ccfa743e15d1db1f4ac445b91f40d8";
-  integrity 
sha512-jHe2uyoLj9i6fntHtOj5azfGdLOb75LF0e1xXE8U2SX7Zp3uwbLAcfJ+dPStdc/q+f/wBiip3tH1dIjaNuUiMw==
-  dependencies:
-    core-js "^3.0.1"
-
 "@storybook/core-events@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.1.17.tgz#697ed916fcb2a411bc9f8bdbfacd0eb9d394eb58";
@@ -2087,17 +1994,6 @@
   resolved 
"https://registry.yarnpkg.com/@storybook/preset-scss/-/preset-scss-1.0.3.tgz#8ac834545c642dada0f64f510ef08dfb882e9737";
   integrity 
sha512-o9Iz6wxPeNENrQa2mKlsDKynBfqU2uWaRP80HeWp4TkGgf7/x3DVF2O7yi9N0x/PI1qzzTTpxlQ90D62XmpiTw==
 
-"@storybook/router@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/router/-/router-5.1.9.tgz#8cd97bea4f2acf8ec5f6694d06fb0633dde33417";
-  integrity 
sha512-eAmeerE/OTIwCV7WBnb1BPINVN1GTSMsUXLNWpqSISuyWJ+NZAJlObFkvXoc57QSQlv0cvXlm1FMkmRt8ku1Hw==
-  dependencies:
-    "@reach/router" "^1.2.1"
-    core-js "^3.0.1"
-    global "^4.3.2"
-    memoizerific "^1.11.3"
-    qs "^6.6.0"
-
 "@storybook/router@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/router/-/router-6.1.17.tgz#96746878c50c6c97c7de5a1b23a9503c5d648775";
@@ -2135,24 +2031,6 @@
     regenerator-runtime "^0.13.7"
     source-map "^0.7.3"
 
-"@storybook/theming@5.1.9":
-  version "5.1.9"
-  resolved 
"https://registry.yarnpkg.com/@storybook/theming/-/theming-5.1.9.tgz#c425f5867fae0db79e01112853b1808332a5f1a2";
-  integrity 
sha512-4jIFJwTWVf9tsv27noLoFHlKC2Jl9DHV3q+rxGPU8bTNbufCu4oby82SboO5GAKuS3eu1cxL1YY9pYad9WxfHg==
-  dependencies:
-    "@emotion/core" "^10.0.9"
-    "@emotion/styled" "^10.0.7"
-    "@storybook/client-logger" "5.1.9"
-    common-tags "^1.8.0"
-    core-js "^3.0.1"
-    deep-object-diff "^1.1.0"
-    emotion-theming "^10.0.9"
-    global "^4.3.2"
-    memoizerific "^1.11.3"
-    polished "^3.3.1"
-    prop-types "^15.7.2"
-    resolve-from "^5.0.0"
-
 "@storybook/theming@6.1.17":
   version "6.1.17"
   resolved 
"https://registry.yarnpkg.com/@storybook/theming/-/theming-6.1.17.tgz#99cc120a230c30458d833b40c806b9b4dff7b34a";
@@ -3160,11 +3038,6 @@ arrify@^2.0.1:
   resolved 
"https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa";
   integrity 
sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
 
-asap@~2.0.3:
-  version "2.0.6"
-  resolved 
"https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46";
-  integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
-
 asn1.js@^5.2.0:
   version "5.4.1"
   resolved 
"https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07";
@@ -3663,7 +3536,7 @@ babel-preset-jest@^26.6.2:
     babel-plugin-transform-undefined-to-void "^6.9.4"
     lodash "^4.17.11"
 
-babel-runtime@^6.18.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";
   integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -4199,11 +4072,6 @@ camelcase@^6.0.0:
   resolved 
"https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809";
   integrity 
sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
 
-can-use-dom@^0.1.0:
-  version "0.1.0"
-  resolved 
"https://registry.yarnpkg.com/can-use-dom/-/can-use-dom-0.1.0.tgz#22cc4a34a0abc43950f42c6411024a3f6366b45a";
-  integrity sha1-IsxKNKCrxDlQ9CxkEQJKP2NmtFo=
-
 caniuse-api@^3.0.0:
   version "3.0.0"
   resolved 
"https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0";
@@ -4286,11 +4154,6 @@ chalk@^4.0.0, chalk@^4.1.0:
     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";
-  integrity sha1-6LL+PX8at9aaMhma/5HqaTFAlRU=
-
 char-regex@^1.0.2:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf";
@@ -4833,11 +4696,6 @@ core-js-pure@^3.0.0, core-js-pure@^3.0.1:
   resolved 
"https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.8.3.tgz#10e9e3b2592ecaede4283e8f3ad7020811587c02";
   integrity 
sha512-V5qQZVAr9K0xu7jXg1M7qTEwuxUgqr7dUOezGaNa7i+Xn9oXAU/d1fzqD9ObuwpVQOaorO5s70ckyi1woP9lVA==
 
-core-js@^1.0.0:
-  version "1.2.7"
-  resolved 
"https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636";
-  integrity sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=
-
 core-js@^2.4.0:
   version "2.6.12"
   resolved 
"https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec";
@@ -4930,7 +4788,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, 
create-hmac@^1.1.7:
     safe-buffer "^5.0.1"
     sha.js "^2.4.8"
 
-create-react-context@0.3.0, create-react-context@^0.3.0:
+create-react-context@0.3.0:
   version "0.3.0"
   resolved 
"https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c";
   integrity 
sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw==
@@ -5313,7 +5171,7 @@ decompress-response@^3.3.0:
   dependencies:
     mimic-response "^1.0.0"
 
-deep-equal@^1.0.1, deep-equal@^1.1.1:
+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==
@@ -5814,7 +5672,7 @@ emojis-list@^3.0.0:
   resolved 
"https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78";
   integrity 
sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
 
-emotion-theming@^10.0.19, emotion-theming@^10.0.9:
+emotion-theming@^10.0.19:
   version "10.0.27"
   resolved 
"https://registry.yarnpkg.com/emotion-theming/-/emotion-theming-10.0.27.tgz#1887baaec15199862c89b1b984b79806f2b9ab10";
   integrity 
sha512-MlF1yu/gYh8u+sLUqA0YuA9JX0P4Hb69WlKc/9OLo+WCXuX6sy/KoIa+qJimgmr2dWqnypYKYPX37esjDBbhdw==
@@ -5828,13 +5686,6 @@ encodeurl@~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.13"
-  resolved 
"https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9";
-  integrity 
sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==
-  dependencies:
-    iconv-lite "^0.6.2"
-
 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";
@@ -6241,11 +6092,6 @@ etag@~1.8.1:
   resolved 
"https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887";
   integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
 
-eventemitter3@^3.1.0:
-  version "3.1.2"
-  resolved 
"https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7";
-  integrity 
sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
-
 eventemitter3@^4.0.0:
   version "4.0.7"
   resolved 
"https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f";
@@ -6431,11 +6277,6 @@ fast-async@^6.3.7:
     nodent-compiler "^3.2.10"
     nodent-runtime ">=3.2.1"
 
-fast-deep-equal@^2.0.1:
-  version "2.0.1"
-  resolved 
"https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
-  integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=
-
 fast-deep-equal@^3.1.1:
   version "3.1.3"
   resolved 
"https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525";
@@ -6463,7 +6304,7 @@ fast-levenshtein@~2.0.6:
   resolved 
"https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917";
   integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
 
-fault@^1.0.0, fault@^1.0.2:
+fault@^1.0.0:
   version "1.0.4"
   resolved 
"https://registry.yarnpkg.com/fault/-/fault-1.0.4.tgz#eafcfc0a6d214fc94601e170df29954a4f842f13";
   integrity 
sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==
@@ -6484,19 +6325,6 @@ fb-watchman@^2.0.0:
   dependencies:
     bser "2.1.1"
 
-fbjs@^0.8.1:
-  version "0.8.17"
-  resolved 
"https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.17.tgz#c4d598ead6949112653d6588b01a5cdcd9f90fdd";
-  integrity sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=
-  dependencies:
-    core-js "^1.0.0"
-    isomorphic-fetch "^2.1.1"
-    loose-envify "^1.0.0"
-    object-assign "^4.1.0"
-    promise "^7.1.1"
-    setimmediate "^1.0.5"
-    ua-parser-js "^0.7.18"
-
 figgy-pudding@^3.5.1:
   version "3.5.2"
   resolved 
"https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e";
@@ -6653,11 +6481,6 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.3"
     readable-stream "^2.3.6"
 
-focus-lock@^0.6.3:
-  version "0.6.8"
-  resolved 
"https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.8.tgz#61985fadfa92f02f2ee1d90bc738efaf7f3c9f46";
-  integrity 
sha512-vkHTluRCoq9FcsrldC0ulQHiyBYgVJB2CX53I8r0nTC6KnEij7Of0jpBspjt3/CuNb6fyoj3aOh9J2HgQUM0og==
-
 follow-redirects@^1.0.0, follow-redirects@^1.10.0:
   version "1.13.2"
   resolved 
"https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.2.tgz#dd73c8effc12728ba5cf4259d760ea5fb83e3147";
@@ -7347,16 +7170,6 @@ hast-util-to-parse5@^6.0.0:
     xtend "^4.0.0"
     zwitch "^1.0.0"
 
-hastscript@^5.0.0:
-  version "5.1.2"
-  resolved 
"https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz#bde2c2e56d04c62dd24e8c5df288d050a355fb8a";
-  integrity 
sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==
-  dependencies:
-    comma-separated-tokens "^1.0.0"
-    hast-util-parse-selector "^2.0.0"
-    property-information "^5.0.0"
-    space-separated-tokens "^1.0.0"
-
 hastscript@^6.0.0:
   version "6.0.0"
   resolved 
"https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640";
@@ -7388,11 +7201,6 @@ highlight.js@~10.5.0:
   resolved 
"https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.5.0.tgz#3f09fede6a865757378f2d9ebdcbc15ba268f98f";
   integrity 
sha512-xTmvd9HiIHR6L53TMC7TKolEj65zG1XU+Onr8oi86mYa+nLcIbxTTWkpW7CsEwv/vK7u1zb8alZIMLDqqN6KTw==
 
-highlight.js@~9.12.0:
-  version "9.12.0"
-  resolved 
"https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e";
-  integrity sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=
-
 hmac-drbg@^1.0.1:
   version "1.0.1"
   resolved 
"https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1";
@@ -7402,11 +7210,6 @@ hmac-drbg@^1.0.1:
     minimalistic-assert "^1.0.0"
     minimalistic-crypto-utils "^1.0.1"
 
-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";
-  integrity 
sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==
-
 hoist-non-react-statics@^3.3.0:
   version "3.3.2"
   resolved 
"https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45";
@@ -7664,13 +7467,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
-iconv-lite@^0.6.2:
-  version "0.6.2"
-  resolved 
"https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01";
-  integrity 
sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==
-  dependencies:
-    safer-buffer ">= 2.1.2 < 3.0.0"
-
 icss-utils@^4.0.0, icss-utils@^4.1.1:
   version "4.1.1"
   resolved 
"https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467";
@@ -8133,7 +7929,7 @@ is-fullwidth-code-point@^3.0.0:
   resolved 
"https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d";
   integrity 
sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
-is-function@^1.0.1, is-function@^1.0.2:
+is-function@^1.0.2:
   version "1.0.2"
   resolved 
"https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08";
   integrity 
sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
@@ -8268,7 +8064,7 @@ is-plain-obj@^2.0.0:
   resolved 
"https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287";
   integrity 
sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==
 
-is-plain-object@3.0.1, is-plain-object@^3.0.0:
+is-plain-object@3.0.1:
   version "3.0.1"
   resolved 
"https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b";
   integrity 
sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
@@ -8313,7 +8109,7 @@ is-set@^2.0.2:
   resolved 
"https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec";
   integrity 
sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
 
-is-stream@^1.0.1, is-stream@^1.1.0:
+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=
@@ -8426,14 +8222,6 @@ isobject@^4.0.0:
   resolved 
"https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0";
   integrity 
sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==
 
-isomorphic-fetch@^2.1.1:
-  version "2.2.1"
-  resolved 
"https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9";
-  integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=
-  dependencies:
-    node-fetch "^1.0.1"
-    whatwg-fetch ">=0.10.0"
-
 isomorphic-unfetch@^3.0.0:
   version "3.1.0"
   resolved 
"https://registry.yarnpkg.com/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz#87341d5f4f7b63843d468438128cb087b7c3e98f";
@@ -9316,11 +9104,6 @@ lodash._reinterpolate@^3.0.0:
   resolved 
"https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d";
   integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
 
-lodash.debounce@^4.0.8:
-  version "4.0.8"
-  resolved 
"https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
-  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
-
 lodash.escape@^4.0.1:
   version "4.0.1"
   resolved 
"https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98";
@@ -9361,11 +9144,6 @@ lodash.templatesettings@^4.0.0:
   dependencies:
     lodash._reinterpolate "^3.0.0"
 
-lodash.throttle@^4.1.1:
-  version "4.1.1"
-  resolved 
"https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4";
-  integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
-
 lodash.uniq@4.5.0, lodash.uniq@^4.5.0:
   version "4.5.0"
   resolved 
"https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773";
@@ -9433,14 +9211,6 @@ lowlight@^1.14.0:
     fault "^1.0.0"
     highlight.js "~10.5.0"
 
-lowlight@~1.9.1:
-  version "1.9.2"
-  resolved 
"https://registry.yarnpkg.com/lowlight/-/lowlight-1.9.2.tgz#0b9127e3cec2c3021b7795dd81005c709a42fdd1";
-  integrity 
sha512-Ek18ElVCf/wF/jEm1b92gTnigh94CtBNWiZ2ad+vTgW7cTmQxUY3I98BjHK68gZAJEWmybGBZgx9qv3QxLQB/Q==
-  dependencies:
-    fault "^1.0.2"
-    highlight.js "~9.12.0"
-
 lru-cache@^4.0.1:
   version "4.1.5"
   resolved 
"https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
@@ -9524,7 +9294,7 @@ markdown-escapes@^1.0.0:
   resolved 
"https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535";
   integrity 
sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==
 
-markdown-to-jsx@^6.11.4, markdown-to-jsx@^6.9.1:
+markdown-to-jsx@^6.11.4:
   version "6.11.4"
   resolved 
"https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz#b4528b1ab668aef7fe61c1535c27e837819392c5";
   integrity 
sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw==
@@ -10007,14 +9777,6 @@ no-case@^3.0.4:
     lower-case "^2.0.2"
     tslib "^2.0.3"
 
-node-fetch@^1.0.1:
-  version "1.7.3"
-  resolved 
"https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef";
-  integrity 
sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==
-  dependencies:
-    encoding "^0.1.11"
-    is-stream "^1.0.1"
-
 node-fetch@^2.6.0, node-fetch@^2.6.1:
   version "2.6.1"
   resolved 
"https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052";
@@ -10612,18 +10374,6 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
     pbkdf2 "^3.0.3"
     safe-buffer "^5.1.1"
 
-parse-entities@^1.1.2:
-  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"
-    character-reference-invalid "^1.0.0"
-    is-alphanumerical "^1.0.0"
-    is-decimal "^1.0.0"
-    is-hexadecimal "^1.0.0"
-
 parse-entities@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8";
@@ -10872,7 +10622,7 @@ pnp-webpack-plugin@1.6.4:
   dependencies:
     ts-pnp "^1.1.6"
 
-polished@^3.3.1, polished@^3.4.4:
+polished@^3.4.4:
   version "3.7.0"
   resolved 
"https://registry.yarnpkg.com/polished/-/polished-3.7.0.tgz#ece3368df30d33082bc8a957aa212d3f98119278";
   integrity 
sha512-1tnvQ2wsxfR/DyPE2Xu9sRbnLAwXAarCWiZJ8Hfirw59bTigqjbzEWSAmzYizT6ocQW995V8n7RP48jq50DjJA==
@@ -10880,11 +10630,6 @@ polished@^3.3.1, polished@^3.4.4:
     "@babel/runtime" "^7.12.5"
     "@scarf/scarf" "^1.1.0"
 
-popper.js@^1.14.4, popper.js@^1.14.7:
-  version "1.16.1"
-  resolved 
"https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b";
-  integrity 
sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==
-
 portfinder@^1.0.26:
   version "1.0.28"
   resolved 
"https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778";
@@ -11419,20 +11164,13 @@ pretty-hrtime@^1.0.3:
   resolved 
"https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1";
   integrity sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=
 
-prismjs@^1.21.0, prismjs@^1.8.4, prismjs@~1.23.0:
+prismjs@^1.21.0, prismjs@~1.23.0:
   version "1.23.0"
   resolved 
"https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz#d3b3967f7d72440690497652a9d40ff046067f33";
   integrity 
sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==
   optionalDependencies:
     clipboard "^2.0.0"
 
-prismjs@~1.17.0:
-  version "1.17.1"
-  resolved 
"https://registry.yarnpkg.com/prismjs/-/prismjs-1.17.1.tgz#e669fcbd4cdd873c35102881c33b14d0d68519be";
-  integrity 
sha512-PrEDJAFdUGbOP6xK/UsfkC5ghJsPJviKgnQOoxaDbBjwc8op68Quupwt1DeAFoG8GImPhiKXAvvsH7wDSLsu1Q==
-  optionalDependencies:
-    clipboard "^2.0.0"
-
 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";
@@ -11487,13 +11225,6 @@ promise.prototype.finally@^3.1.0:
     es-abstract "^1.17.0-next.0"
     function-bind "^1.1.1"
 
-promise@^7.1.1:
-  version "7.3.1"
-  resolved 
"https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf";
-  integrity 
sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
-  dependencies:
-    asap "~2.0.3"
-
 prompts@^2.0.1, prompts@^2.2.1:
   version "2.4.0"
   resolved 
"https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7";
@@ -11721,13 +11452,6 @@ rc@^1.2.8:
     minimist "^1.2.0"
     strip-json-comments "~2.0.1"
 
-react-clientside-effect@^1.2.0:
-  version "1.2.4"
-  resolved 
"https://registry.yarnpkg.com/react-clientside-effect/-/react-clientside-effect-1.2.4.tgz#42cca8bd3b8aec29b811b0f30ab7674d8da9d3d2";
-  integrity 
sha512-rJEnS+TKyrznJlzJ4XPoWBLITpfJ5ez1t2OqhE9gIiicLlEypgtvhQqksfuh5sq+0n3kCoGGkY9rN3SKu+aGKQ==
-  dependencies:
-    "@babel/runtime" "^7.12.13"
-
 react-color@^2.17.0:
   version "2.19.3"
   resolved 
"https://registry.yarnpkg.com/react-color/-/react-color-2.19.3.tgz#ec6c6b4568312a3c6a18420ab0472e146aa5683d";
@@ -11781,16 +11505,6 @@ react-dom@16.13.1:
     prop-types "^15.6.2"
     scheduler "^0.19.1"
 
-react-dom@^16.8.3:
-  version "16.14.0"
-  resolved 
"https://registry.yarnpkg.com/react-dom/-/react-dom-16.14.0.tgz#7ad838ec29a777fb3c75c3a190f661cf92ab8b89";
-  integrity 
sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==
-  dependencies:
-    loose-envify "^1.1.0"
-    object-assign "^4.1.1"
-    prop-types "^15.6.2"
-    scheduler "^0.19.1"
-
 react-draggable@^4.0.3:
   version "4.4.3"
   resolved 
"https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.3.tgz#0727f2cae5813e36b0e4962bf11b2f9ef2b406f3";
@@ -11817,16 +11531,6 @@ react-fast-compare@^3.0.1, react-fast-compare@^3.2.0:
   resolved 
"https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb";
   integrity 
sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==
 
-react-focus-lock@^1.18.3:
-  version "1.19.1"
-  resolved 
"https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-1.19.1.tgz#2f3429793edaefe2d077121f973ce5a3c7a0651a";
-  integrity 
sha512-TPpfiack1/nF4uttySfpxPk4rGZTLXlaZl7ncZg/ELAk24Iq2B1UUaUioID8H8dneUXqznT83JTNDHDj+kwryw==
-  dependencies:
-    "@babel/runtime" "^7.0.0"
-    focus-lock "^0.6.3"
-    prop-types "^15.6.2"
-    react-clientside-effect "^1.2.0"
-
 react-helmet-async@^1.0.2:
   version "1.0.7"
   resolved 
"https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.7.tgz#b988fbc3abdc4b704982bb74b9cb4a08fcf062c1";
@@ -11864,19 +11568,11 @@ react-is@^17.0.1:
   resolved 
"https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339";
   integrity 
sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==
 
-react-lifecycles-compat@^3.0.2, react-lifecycles-compat@^3.0.4:
+react-lifecycles-compat@^3.0.4:
   version "3.0.4"
   resolved 
"https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362";
   integrity 
sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
 
-react-popper-tooltip@^2.8.3:
-  version "2.11.1"
-  resolved 
"https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.11.1.tgz#3c4bdfd8bc10d1c2b9a162e859bab8958f5b2644";
-  integrity 
sha512-04A2f24GhyyMicKvg/koIOQ5BzlrRbKiAgP6L+Pdj1MVX3yJ1NeZ8+EidndQsbejFT55oW1b++wg2Z8KlAyhfQ==
-  dependencies:
-    "@babel/runtime" "^7.9.2"
-    react-popper "^1.3.7"
-
 react-popper-tooltip@^3.1.1:
   version "3.1.1"
   resolved 
"https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-3.1.1.tgz#329569eb7b287008f04fcbddb6370452ad3f9eac";
@@ -11886,19 +11582,6 @@ react-popper-tooltip@^3.1.1:
     "@popperjs/core" "^2.5.4"
     react-popper "^2.2.4"
 
-react-popper@^1.3.7:
-  version "1.3.7"
-  resolved 
"https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324";
-  integrity 
sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww==
-  dependencies:
-    "@babel/runtime" "^7.1.2"
-    create-react-context "^0.3.0"
-    deep-equal "^1.1.1"
-    popper.js "^1.14.4"
-    prop-types "^15.6.1"
-    typed-styles "^0.0.7"
-    warning "^4.0.2"
-
 react-popper@^2.2.4:
   version "2.2.4"
   resolved 
"https://registry.yarnpkg.com/react-popper/-/react-popper-2.2.4.tgz#d2ad3d2474ac9f1abf93df3099d408e5aa6a2e22";
@@ -11933,25 +11616,6 @@ react-syntax-highlighter@^13.5.0:
     prismjs "^1.21.0"
     refractor "^3.1.0"
 
-react-syntax-highlighter@^8.0.1:
-  version "8.1.0"
-  resolved 
"https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-8.1.0.tgz#59103ff17a828a27ed7c8f035ae2558f09b6b78c";
-  integrity 
sha512-G2bkZxmF3VOa4atEdXIDSfwwCqjw6ZQX5znfTaHcErA1WqHIS0o6DaSCDKFPVaOMXQEB9Hf1UySYQvuJmV8CXg==
-  dependencies:
-    babel-runtime "^6.18.0"
-    highlight.js "~9.12.0"
-    lowlight "~1.9.1"
-    prismjs "^1.8.4"
-    refractor "^2.4.1"
-
-react-textarea-autosize@^7.1.0:
-  version "7.1.2"
-  resolved 
"https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-7.1.2.tgz#70fdb333ef86bcca72717e25e623e90c336e2cda";
-  integrity 
sha512-uH3ORCsCa3C6LHxExExhF4jHoXYCQwE5oECmrRsunlspaDAbS4mGKNlWZqjLfInWtFQcf0o1n1jC/NGXFdUBCg==
-  dependencies:
-    "@babel/runtime" "^7.1.2"
-    prop-types "^15.6.0"
-
 react-textarea-autosize@^8.1.1:
   version "8.3.0"
   resolved 
"https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.0.tgz#e6e2fd186d9f61bb80ac6e2dcb4c55504f93c2fa";
@@ -11970,15 +11634,6 @@ react@16.13.1:
     object-assign "^4.1.1"
     prop-types "^15.6.2"
 
-react@^16.8.1, react@^16.8.3:
-  version "16.14.0"
-  resolved 
"https://registry.yarnpkg.com/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d";
-  integrity 
sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==
-  dependencies:
-    loose-envify "^1.1.0"
-    object-assign "^4.1.1"
-    prop-types "^15.6.2"
-
 reactcss@^1.2.0:
   version "1.2.3"
   resolved 
"https://registry.yarnpkg.com/reactcss/-/reactcss-1.2.3.tgz#c00013875e557b1cf0dfd9a368a1c3dab3b548dd";
@@ -12067,18 +11722,6 @@ rechoir@^0.6.2:
   dependencies:
     resolve "^1.1.6"
 
-recompose@^0.30.0:
-  version "0.30.0"
-  resolved 
"https://registry.yarnpkg.com/recompose/-/recompose-0.30.0.tgz#82773641b3927e8c7d24a0d87d65aeeba18aabd0";
-  integrity 
sha512-ZTrzzUDa9AqUIhRk4KmVFihH0rapdCSMFXjhHbNrjAWxBuUD/guYlyysMnuHjlZC/KRiOKRtB4jf96yYSkKE8w==
-  dependencies:
-    "@babel/runtime" "^7.0.0"
-    change-emitter "^0.1.2"
-    fbjs "^0.8.1"
-    hoist-non-react-statics "^2.3.1"
-    react-lifecycles-compat "^3.0.2"
-    symbol-observable "^1.0.4"
-
 recursive-readdir@2.2.2:
   version "2.2.2"
   resolved 
"https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f";
@@ -12094,15 +11737,6 @@ redent@^1.0.0:
     indent-string "^2.1.0"
     strip-indent "^1.0.1"
 
-refractor@^2.4.1:
-  version "2.10.1"
-  resolved 
"https://registry.yarnpkg.com/refractor/-/refractor-2.10.1.tgz#166c32f114ed16fd96190ad21d5193d3afc7d34e";
-  integrity 
sha512-Xh9o7hQiQlDbxo5/XkOX6H+x/q8rmlmZKr97Ie1Q8ZM32IRRd3B/UxuA/yXDW79DBSXGWxm2yRTbcTVmAciJRw==
-  dependencies:
-    hastscript "^5.0.0"
-    parse-entities "^1.1.2"
-    prismjs "~1.17.0"
-
 refractor@^3.1.0:
   version "3.3.1"
   resolved 
"https://registry.yarnpkg.com/refractor/-/refractor-3.3.1.tgz#ebbc04b427ea81dc25ad333f7f67a0b5f4f0be3a";
@@ -12373,11 +12007,6 @@ requires-port@^1.0.0:
   resolved 
"https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff";
   integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
 
-resize-observer-polyfill@^1.5.1:
-  version "1.5.1"
-  resolved 
"https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464";
-  integrity 
sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==
-
 resolve-cwd@^2.0.0:
   version "2.0.0"
   resolved 
"https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a";
@@ -12580,7 +12209,7 @@ safe-regex@^1.1.0:
   dependencies:
     ret "~0.1.10"
 
-"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", 
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.0:
   version "2.1.2"
   resolved 
"https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a";
   integrity 
sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -12814,7 +12443,7 @@ set-value@^2.0.0, set-value@^2.0.1:
     is-plain-object "^2.0.3"
     split-string "^3.0.1"
 
-setimmediate@^1.0.4, setimmediate@^1.0.5:
+setimmediate@^1.0.4:
   version "1.0.5"
   resolved 
"https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285";
   integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=
@@ -12837,11 +12466,6 @@ sha.js@^2.4.0, sha.js@^2.4.8:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-shallow-equal@^1.1.0:
-  version "1.2.1"
-  resolved 
"https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da";
-  integrity 
sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==
-
 shallowequal@^1.1.0:
   version "1.1.0"
   resolved 
"https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8";
@@ -12911,26 +12535,6 @@ simple-swizzle@^0.2.2:
   dependencies:
     is-arrayish "^0.3.1"
 
-simplebar-react@^1.0.0-alpha.6:
-  version "1.2.3"
-  resolved 
"https://registry.yarnpkg.com/simplebar-react/-/simplebar-react-1.2.3.tgz#bd81fa9827628470e9470d06caef6ece15e1c882";
-  integrity 
sha512-1EOWJzFC7eqHUp1igD1/tb8GBv5aPQA5ZMvpeDnVkpNJ3jAuvmrL2kir3HuijlxhG7njvw9ssxjjBa89E5DrJg==
-  dependencies:
-    prop-types "^15.6.1"
-    simplebar "^4.2.3"
-
-simplebar@^4.2.3:
-  version "4.2.3"
-  resolved 
"https://registry.yarnpkg.com/simplebar/-/simplebar-4.2.3.tgz#dac40aced299c17928329eab3d5e6e795fafc10c";
-  integrity 
sha512-9no0pK7/1y+8/oTF3sy/+kx0PjQ3uk4cYwld5F1CJGk2gx+prRyUq8GRfvcVLq5niYWSozZdX73a2wIr1o9l/g==
-  dependencies:
-    can-use-dom "^0.1.0"
-    core-js "^3.0.1"
-    lodash.debounce "^4.0.8"
-    lodash.memoize "^4.1.2"
-    lodash.throttle "^4.1.1"
-    resize-observer-polyfill "^1.5.1"
-
 sirv-cli@^1.0.0-next.3:
   version "1.0.11"
   resolved 
"https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-1.0.11.tgz#a3f4bed53b7c09306ed7f16ebea6e1e7be676c74";
@@ -13259,16 +12863,6 @@ store2@^2.7.1:
   resolved 
"https://registry.yarnpkg.com/store2/-/store2-2.12.0.tgz#e1f1b7e1a59b6083b2596a8d067f6ee88fd4d3cf";
   integrity 
sha512-7t+/wpKLanLzSnQPX8WAcuLCCeuSHoWdQuh9SB3xD0kNOM38DNf+0Oa+wmvxmYueRzkmh6IcdKFtvTa+ecgPDw==
 
-storybook-addon-i18n@^5.1.13:
-  version "5.1.13"
-  resolved 
"https://registry.yarnpkg.com/storybook-addon-i18n/-/storybook-addon-i18n-5.1.13.tgz#3dc70c12bae47de3f2d6ce3f6ecc0230e8ade00b";
-  integrity 
sha512-qbHygTbB52Bgz9llV3F/fkGf7SNfp1OIX/c9CAWcXDa/xirfLPFTWDSiEWqb/862KxlgmOvAPTPhctoEpWsKSg==
-  dependencies:
-    "@storybook/addons" "5.1.9"
-    "@storybook/client-api" "5.1.9"
-    "@storybook/components" "5.1.9"
-    react "^16.8.1"
-
 stream-browserify@^2.0.1:
   version "2.0.2"
   resolved 
"https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b";
@@ -13587,11 +13181,6 @@ swr@^0.4.1:
   dependencies:
     dequal "2.0.2"
 
-symbol-observable@^1.0.4:
-  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, symbol-tree@^3.2.4:
   version "3.2.4"
   resolved 
"https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2";
@@ -13647,19 +13236,6 @@ tar@^6.0.2:
     mkdirp "^1.0.3"
     yallist "^4.0.0"
 
-telejson@^2.2.1:
-  version "2.2.2"
-  resolved 
"https://registry.yarnpkg.com/telejson/-/telejson-2.2.2.tgz#d61d721d21849a6e4070d547aab302a9bd22c720";
-  integrity 
sha512-YyNwnKY0ilabOwYgC/J754En1xOe5PBIUIw+C9e0+5HjVVcnQE5/gdu2yET2pmSbp5bxIDqYNjvndj2PUkIiYA==
-  dependencies:
-    global "^4.3.2"
-    is-function "^1.0.1"
-    is-regex "^1.0.4"
-    is-symbol "^1.0.2"
-    isobject "^3.0.1"
-    lodash "^4.17.11"
-    memoizerific "^1.11.3"
-
 telejson@^5.0.2:
   version "5.1.0"
   resolved 
"https://registry.yarnpkg.com/telejson/-/telejson-5.1.0.tgz#cc04e4c2a355f9eb6af557e37acd6449feb1d146";
@@ -14045,11 +13621,6 @@ type-is@~1.6.17, type-is@~1.6.18:
     media-typer "0.3.0"
     mime-types "~2.1.24"
 
-typed-styles@^0.0.7:
-  version "0.0.7"
-  resolved 
"https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9";
-  integrity 
sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q==
-
 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";
@@ -14072,11 +13643,6 @@ typescript@^4.1.3:
   resolved 
"https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7";
   integrity 
sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg==
 
-ua-parser-js@^0.7.18:
-  version "0.7.23"
-  resolved 
"https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.23.tgz#704d67f951e13195fbcd3d78818577f5bc1d547b";
-  integrity 
sha512-m4hvMLxgGHXG3O3fQVAyyAQpZzDOvwnhOTjYz5Xmr7r/+LpkNy3vJXdVRWgd1TkAb7NGROZuSy96CrlNVjA7KA==
-
 uglify-js@3.4.x:
   version "3.4.10"
   resolved 
"https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f";
@@ -14762,11 +14328,6 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5:
   dependencies:
     iconv-lite "0.4.24"
 
-whatwg-fetch@>=0.10.0:
-  version "3.5.0"
-  resolved 
"https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.5.0.tgz#605a2cd0a7146e5db141e29d1c62ab84c0c4c868";
-  integrity 
sha512-jXkLtsR42xhXg7akoDKvKWE40eJeI+2KZqcp2h3NsOrRnDvtWX36KcKl30dy+hxECivdk2BVUHVNrPtoMBUx6A==
-
 whatwg-mimetype@^2.2.0, whatwg-mimetype@^2.3.0:
   version "2.3.0"
   resolved 
"https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf";

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]