diff --git a/.eslintrc b/.eslintrc
index 4f0655a0efe2b12a7baeae04dd53ae1fed30c849..b3818b8140ae0cb17a94250cdc82098c286d32b2 100755
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,5 +1,5 @@
 {
-  "extends": "airbnb",
+  "extends": ["airbnb", "prettier"],
   "env": {
     "amd": true,
     "browser": true,
@@ -14,12 +14,12 @@
     "react/no-multi-comp": [0, { "ignoreStateless": 1 }],
     "import/extensions": ["off", "never"],
     "import/no-unresolved": 0,
-    "no-underscore-dangle" : 0,
-    "linebreak-style" : 0,
-    "no-extra-bind" : 0
+    "no-underscore-dangle": 0,
+    "linebreak-style": 0,
+    "no-extra-bind": 0
   },
   "parser": "babel-eslint",
   "parserOptions": {
     "sourceType": "module"
   }
-}
\ No newline at end of file
+}
diff --git a/522256 b/522256
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/522768 b/522768
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/79776 b/79776
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/80304 b/80304
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/81348 b/81348
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/8196 b/8196
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/82564 b/82564
deleted file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000
diff --git a/assets/js/TranscriptPage.jsx b/assets/js/TranscriptPage.jsx
index 5cc1337ea91ce89efdb25da65f41a0cabb3a4aae..bc6b79ce4c38452c05154ecab3003a0dc9987a30 100755
--- a/assets/js/TranscriptPage.jsx
+++ b/assets/js/TranscriptPage.jsx
@@ -1,38 +1,34 @@
-import React from 'react';
+import React, { useState, useEffect } from 'react';
 import PropTypes from 'prop-types';
 import CourseList from './components/CourseList';
 import Server from './lib/Server';
 
-export default class TranscriptPage extends React.Component {
-  static propTypes = {
-    params: PropTypes.object.isRequired,
-    user: PropTypes.object.isRequired,
-  };
+const TranscriptPage = ({ user: { role }, params: { id } }) => {
+  const [text, setText] = useState('Mohon Tunggu...');
+  const [data, setData] = useState(undefined);
+
+  useEffect(() => {
+    const url =
+      role === 'student'
+        ? `/students/${id}/transcript/`
+        : `/applications/${id}/transcript/`;
 
-  constructor(props) {
-    super(props);
-    /* istanbul ignore next */
-    this.state = { text: 'Mohon Tunggu..' };
-    const url = this.props.user.role === 'student'
-      ? `/students/${this.props.params.id}/transcript/`
-      : `/applications/${this.props.params.id}/transcript/`;
     Server.get(url).then(
-      (response) => this.setState({ data: response }),
-      () => this.setState({
-        text: 'Anda tidak berhak untuk melihat transkrip ini',
-      }),
+      (response) => setData(response),
+      () => setText('Anda tidak berhak untuk melihat transkrip ini'),
     );
-  }
+  });
 
-  render() {
-    return this.state.data ? (
-      <CourseList data={this.state.data} />
-    ) : (
-      <h5 style={{ textAlign: 'center' }}>
-        {' '}
-        {this.state.text}
-        {' '}
-      </h5>
-    );
-  }
-}
+  return data ? (
+    <CourseList data={data} />
+  ) : (
+    <h5 style={{ textAlign: 'center' }}>{text}</h5>
+  );
+};
+
+TranscriptPage.propTypes = {
+  params: PropTypes.object.isRequired,
+  user: PropTypes.object.isRequired,
+};
+
+export default TranscriptPage;
diff --git a/assets/js/VacancyPage.jsx b/assets/js/VacancyPage.jsx
index cc57f59bab18af6de33e5f4439a8cdeb3855e985..76c12a7732fdefe123e4e299ea171a8116572ea4 100755
--- a/assets/js/VacancyPage.jsx
+++ b/assets/js/VacancyPage.jsx
@@ -9,24 +9,21 @@ import Pagination from './components/Pagination';
 import Storage from './lib/Storage';
 
 export default class VacancyPage extends React.Component {
-  static propTypes = {
-    user: PropTypes.object.isRequired,
-  };
-
   static getId(user) {
-    const role = user.role;
+    const { role, data } = user;
     if (role === 'student') {
-      return user.data.student.id;
-    } else if (
-      role === 'company' ||
-      (role === 'admin' && user.data.company != null)
-    ) {
-      return user.data.company.id;
-    } else if (
+      return data.student.id;
+    }
+
+    if (role === 'company' || (role === 'admin' && data.company != null)) {
+      return data.company.id;
+    }
+
+    if (
       role === 'supervisor' ||
-      (role === 'admin' && user.data.supervisor != null)
+      (role === 'admin' && data.supervisor != null)
     ) {
-      return user.data.supervisor.id;
+      return data.supervisor.id;
     }
 
     return 0;
@@ -36,123 +33,82 @@ export default class VacancyPage extends React.Component {
     super(props);
     /* istanbul ignore next */
     this.state = {
-      vacancies: [],
-      id: VacancyPage.getId(this.props.user),
+      id: VacancyPage.getId(props.user),
     };
 
-    console.log('vacancy');
     Storage.set('menu-active-state', 'Beranda');
   }
 
   generateVacancies() {
-    if (this.props.user.role === 'student') {
+    const { user } = this.props;
+    const { id } = this.state;
+
+    if (user.role === 'student') {
       return (
         <Tabs selected={0}>
           <Pane label="Lowongan">
             <Pagination
               key={1}
               url="/vacancies/"
-              child={
-                <VacancyList
-                  user={this.props.user}
-                  key={1}
-                  userId={this.state.id}
-                />
-              }
+              child={<VacancyList user={user} key={1} userId={id} />}
             />
           </Pane>
           <Pane label="Lamaran Saya">
             <Pagination
               key={2}
-              url={`/students/${this.state.id}/applied-vacancies/`}
-              child={
-                <VacancyList
-                  user={this.props.user}
-                  key={2}
-                  userId={this.state.id}
-                />
-              }
+              url={`/students/${id}/applied-vacancies/`}
+              child={<VacancyList user={user} key={2} userId={id} />}
             />
           </Pane>
           <Pane label="Ditandai">
             <Pagination
               key={3}
-              url={`/students/${this.state.id}/bookmarked-vacancies/`}
-              child={
-                <VacancyList
-                  key={3}
-                  user={this.props.user}
-                  userId={this.state.id}
-                />
-              }
+              url={`/students/${id}/bookmarked-vacancies/`}
+              child={<VacancyList key={3} user={user} userId={id} />}
             />
           </Pane>
           <Pane label="Lowongan Tersedia">
             <Pagination
               key={4}
               url="/vacancies/opened_only=1"
-              child={
-                <VacancyList
-                  user={this.props.user}
-                  key={4}
-                  userId={this.state.id}
-                />
-              }
+              child={<VacancyList user={user} key={4} userId={id} />}
             />
           </Pane>
         </Tabs>
       );
-    } else if (
-      (this.props.user.role === 'admin' &&
-        this.props.user.data.company != null) ||
-      this.props.user.role === 'company'
+    }
+
+    if (
+      (user.role === 'admin' && user.data.company != null) ||
+      user.role === 'company'
     ) {
       return (
         <Segment className="paginationCompany">
           <Pagination
             key={1}
-            url={`/companies/${this.state.id}/vacancies/`}
-            child={
-              <VacancyList
-                key={1}
-                user={this.props.user}
-                userId={this.state.id}
-              />
-            }
+            url={`/companies/${id}/vacancies/`}
+            child={<VacancyList key={1} user={user} userId={id} />}
             error="Akun anda belum terverifikasi. Harap hubungi pihak administrasi"
           />
         </Segment>
       );
-    } else if (
-      this.props.user.role === 'admin' ||
-      this.props.user.role === 'supervisor'
-    ) {
+    }
+
+    if (user.role === 'admin' || user.role === 'supervisor') {
       return (
         <Tabs selected={0}>
           <Pane label="Lowongan Belum Terverifikasi">
             <Pagination
               key={1}
               url="/vacancies/?verified=false"
-              child={
-                <VacancyList
-                  user={this.props.user}
-                  key={1}
-                  userId={this.state.id}
-                />
-              }
+              child={<VacancyList user={user} key={1} userId={id} />}
             />
           </Pane>
           <Pane label="Lowongan Terverifikasi">
             <Pagination
               key={2}
               url="/vacancies/?verified=true"
-              child={
-                <VacancyList
-                  user={this.props.user}
-                  key={2}
-                  userId={this.state.id}
-                />
-              }
+              child={<VacancyList user={user} key={2} userId={id} />}
             />
           </Pane>
         </Tabs>
@@ -170,11 +126,13 @@ export default class VacancyPage extends React.Component {
   }
 
   companyHeader() {
-    if (
-      (this.props.user.role === 'admin' &&
-        this.props.user.data.company != null) ||
-      this.props.user.role === 'company'
-    ) {
+    const {
+      user: {
+        role,
+        data: { company },
+      },
+    } = this.props;
+    if ((role === 'admin' && company != null) || role === 'company') {
       return (
         <div style={{ float: 'left' }}>
           <Button
@@ -201,18 +159,19 @@ export default class VacancyPage extends React.Component {
   }
 
   render() {
-    console.log(this.props.user);
+    const {
+      user: { role },
+    } = this.props;
     return (
       <div className="applicant">
         <br />
-        {this.props.user.role === 'student' || (
+        {role === 'student' || (
           <div
             className="administrationButtons"
             style={{ display: 'inline-block' }}
           >
             {this.companyHeader()}
-            {(this.props.user.role === 'admin' ||
-              this.props.user.role === 'supervisor') && (
+            {(role === 'admin' || role === 'supervisor') && (
               <Button
                 as={Link}
                 to="/rekap"
@@ -229,3 +188,5 @@ export default class VacancyPage extends React.Component {
     );
   }
 }
+
+VacancyPage.propTypes = { user: PropTypes.object.isRequired };
diff --git a/assets/js/__test__/TranscriptPage-test.jsx b/assets/js/__test__/TranscriptPage-test.jsx
index 967d90827ef02252a2e30b08495cd5c9d90b7a62..259d3ee28aed41ecdfe7e3ead821c5ff9d0f8855 100755
--- a/assets/js/__test__/TranscriptPage-test.jsx
+++ b/assets/js/__test__/TranscriptPage-test.jsx
@@ -1,13 +1,29 @@
 import React from 'react';
 import ReactTestUtils from 'react-dom/test-utils';
 import fetchMock from 'fetch-mock';
+import sinon from 'sinon';
 import TranscriptPage from '../TranscriptPage';
+import Server from '../lib/Server';
+
+class Wrapper extends React.Component {
+  render() {
+    return this.props.children;
+  }
+}
 
 describe('TranscriptPage', () => {
+  let stub;
+
   const data = {
     transcript: [
-      { kelas: { nm_kls: 'kelas1', nm_mk_cl: { nm_mk: 'mata_kuliah' } }, nilai: 'A' },
-      { kelas: { nm_kls: 'kelas2', nm_mk_cl: { nm_mk: 'mata_kuliah' } }, nilai: 'B' },
+      {
+        kelas: { nm_kls: 'kelas1', nm_mk_cl: { nm_mk: 'mata_kuliah' } },
+        nilai: 'A',
+      },
+      {
+        kelas: { nm_kls: 'kelas2', nm_mk_cl: { nm_mk: 'mata_kuliah' } },
+        nilai: 'B',
+      },
       { nilai: 'B' },
     ],
     name: 'Badak Terbang',
@@ -15,12 +31,28 @@ describe('TranscriptPage', () => {
 
   fetchMock.get('*', data);
 
+  before(() => {
+    stub = sinon.stub(Server, 'get').resolves(data);
+  });
+
+  after(() => Server.get.restore());
+
   it('renders for admin without problem', () => {
-    const transcriptPage1 = ReactTestUtils.renderIntoDocument(<TranscriptPage params={{ id: 1 }} user={{ role: 'student' }} />);
-    const transcriptPage2 = ReactTestUtils.renderIntoDocument(<TranscriptPage params={{ id: 1 }} user={{ role: 'admin' }} />);
-    transcriptPage1.setState({ data });
-    transcriptPage2.setState({ data });
-    expect(transcriptPage1).to.exist;
-    expect(transcriptPage2).to.exist;
+    const transcriptPage = ReactTestUtils.renderIntoDocument(
+      <Wrapper>
+        <TranscriptPage params={{ id: 1 }} user={{ role: 'admin' }} />
+      </Wrapper>,
+    );
+
+    return expect(transcriptPage).to.exist;
+  });
+
+  it('renders for student withour problem', () => {
+    const transcriptPage = ReactTestUtils.renderIntoDocument(
+      <Wrapper>
+        <TranscriptPage params={{ id: 1 }} user={{ role: 'student' }} />
+      </Wrapper>,
+    );
+    return expect(transcriptPage).to.exist;
   });
 });
diff --git a/package-lock.json b/package-lock.json
index b8b760a60a7077b79dd3f811e7b089262319713b..c5fbb079e8b86fff0f76ad2632fc370952ac528f 100755
--- a/package-lock.json
+++ b/package-lock.json
@@ -1750,7 +1750,7 @@
     "@babel/plugin-proposal-do-expressions": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.6.0.tgz",
-      "integrity": "sha1-GSlT/thiDRPRKmH2je/Sb0EFkZM=",
+      "integrity": "sha512-qJDaoBDbLySwU1tG0jbAomOwz8W1PEiiiK0iLQAnHLr4PYIMVX4ltDGkj3uAKx4HDs1WJ0tozGW1zAQjuTIiWg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1770,7 +1770,7 @@
     "@babel/plugin-proposal-export-default-from": {
       "version": "7.5.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz",
-      "integrity": "sha1-LArC3MNuOyRD/q0sPF/HlvsbUUU=",
+      "integrity": "sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1780,7 +1780,7 @@
     "@babel/plugin-proposal-export-namespace-from": {
       "version": "7.5.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.5.2.tgz",
-      "integrity": "sha1-zNXtBbBtcAaI/x2wGp3ScVXg0qA=",
+      "integrity": "sha512-TKUdOL07anjZEbR1iSxb5WFh810KyObdd29XLFLGo1IDsSuGrjH3ouWSbAxHNmrVKzr9X71UYl2dQ7oGGcRp0g==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1801,7 +1801,7 @@
     "@babel/plugin-proposal-json-strings": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
-      "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=",
+      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1811,7 +1811,7 @@
     "@babel/plugin-proposal-logical-assignment-operators": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.2.0.tgz",
-      "integrity": "sha1-ilzqbEKnyHRGlZ4C//X60BLFb1c=",
+      "integrity": "sha512-0w797xwdPXKk0m3Js74hDi0mCTZplIu93MOSfb1ZLd/XFe3abWypx1QknVk0J+ohnsjYpvjH4Gwfo2i3RicB6Q==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1821,7 +1821,7 @@
     "@babel/plugin-proposal-nullish-coalescing-operator": {
       "version": "7.4.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz",
-      "integrity": "sha1-QcNg1ZSB2I4M46P4N98QEhp2mzk=",
+      "integrity": "sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1831,7 +1831,7 @@
     "@babel/plugin-proposal-numeric-separator": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.2.0.tgz",
-      "integrity": "sha1-ZGhU2vTNIv1nM/YHYBOpNjEEQ6w=",
+      "integrity": "sha512-DohMOGDrZiMKS7LthjUZNNcWl8TAf5BZDwZAH4wpm55FuJTHgfqPGdibg7rZDmont/8Yg0zA03IgT6XLeP+4sg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1861,7 +1861,7 @@
     "@babel/plugin-proposal-optional-chaining": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz",
-      "integrity": "sha1-6b8fm5uhDHfAMwgtp18Gg4kEGvg=",
+      "integrity": "sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1871,7 +1871,7 @@
     "@babel/plugin-proposal-pipeline-operator": {
       "version": "7.5.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.5.0.tgz",
-      "integrity": "sha1-QQDsVe9PakwkkLX1pPKiLfonLAY=",
+      "integrity": "sha512-HFYuu/yGnkn69ligXxU0ohOVvQDsMNOUJs/c4PYLUVS6ntCYOyGmRQQaSYJARJ9rvc7/ulZKIzxd4wk91hN63A==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1881,7 +1881,7 @@
     "@babel/plugin-proposal-throw-expressions": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.2.0.tgz",
-      "integrity": "sha1-LZ5FLTcPE5AA5R22XQqF3GDGRzk=",
+      "integrity": "sha512-adsydM8DQF4i5DLNO4ySAU5VtHTPewOtNBV3u7F4lNMPADFF9bWQ+iDtUUe8+033cYCUz+bFlQdXQJmJOwoLpw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1928,7 +1928,7 @@
     "@babel/plugin-syntax-dynamic-import": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
-      "integrity": "sha1-acFZ/69JmBIhYa2OvF5tH1XfhhI=",
+      "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -1964,7 +1964,7 @@
     "@babel/plugin-syntax-import-meta": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.2.0.tgz",
-      "integrity": "sha1-IzPvS4dVU6O80ek/jrwJ9bkhOkA=",
+      "integrity": "sha512-Hq6kFSZD7+PHkmBN8bCpHR6J8QEoCuEV/B38AIQscYjgMZkGlXB7cHNFzP5jR4RCh5545yP1ujHdmO7hAgKtBA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -2769,6 +2769,45 @@
         }
       }
     },
+    "@sinonjs/commons": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.6.0.tgz",
+      "integrity": "sha512-w4/WHG7C4WWFyE5geCieFJF6MZkbW4VAriol5KlmQXpAQdxvV0p26sqNZOW6Qyw6Y0l9K4g+cHvvczR2sEEpqg==",
+      "requires": {
+        "type-detect": "4.0.8"
+      },
+      "dependencies": {
+        "type-detect": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="
+        }
+      }
+    },
+    "@sinonjs/formatio": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz",
+      "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==",
+      "requires": {
+        "@sinonjs/commons": "^1",
+        "@sinonjs/samsam": "^3.1.0"
+      }
+    },
+    "@sinonjs/samsam": {
+      "version": "3.3.3",
+      "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz",
+      "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==",
+      "requires": {
+        "@sinonjs/commons": "^1.3.0",
+        "array-from": "^2.1.1",
+        "lodash": "^4.17.15"
+      }
+    },
+    "@sinonjs/text-encoding": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
+      "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ=="
+    },
     "@types/events": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
@@ -3011,7 +3050,7 @@
     "ajv": {
       "version": "6.10.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-      "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=",
+      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3139,6 +3178,11 @@
       "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
       "dev": true
     },
+    "array-from": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz",
+      "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU="
+    },
     "array-includes": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz",
@@ -3340,7 +3384,7 @@
     "babel-eslint": {
       "version": "10.0.3",
       "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz",
-      "integrity": "sha1-gaLGab4PIF4ZRi/tJILTPkaHqIo=",
+      "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -3401,7 +3445,7 @@
     "babel-loader": {
       "version": "8.0.6",
       "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
-      "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=",
+      "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
       "dev": true,
       "requires": {
         "find-cache-dir": "^2.0.0",
@@ -3428,7 +3472,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -4404,7 +4448,7 @@
     "compression-webpack-plugin": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-3.0.0.tgz",
-      "integrity": "sha1-CX0uTZXDoUy1yO0giZAJq1ubvKA=",
+      "integrity": "sha512-ls+oKw4eRbvaSv/hj9NmctihhBcR26j76JxV0bLRLcWhrUBdQFgd06z/Kgg7exyQvtWWP484wZxs0gIUX3NO0Q==",
       "requires": {
         "cacache": "^11.2.0",
         "find-cache-dir": "^3.0.0",
@@ -4999,8 +5043,7 @@
     "diff": {
       "version": "3.5.0",
       "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
-      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
-      "dev": true
+      "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA=="
     },
     "diffie-hellman": {
       "version": "5.0.3",
@@ -5526,7 +5569,7 @@
     "eslint-config-airbnb": {
       "version": "18.0.1",
       "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz",
-      "integrity": "sha1-o6dMwptGQTtglpZQJTgd+PuQhVk=",
+      "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==",
       "dev": true,
       "requires": {
         "eslint-config-airbnb-base": "^14.0.0",
@@ -5545,6 +5588,23 @@
         "object.entries": "^1.1.0"
       }
     },
+    "eslint-config-prettier": {
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.7.0.tgz",
+      "integrity": "sha512-FamQVKM3jjUVwhG4hEMnbtsq7xOIDm+SY5iBPfR8gKsJoAB2IQnNF+bk1+8Fy44Nq7PPJaLvkRxILYdJWoguKQ==",
+      "dev": true,
+      "requires": {
+        "get-stdin": "^6.0.0"
+      },
+      "dependencies": {
+        "get-stdin": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
+          "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
+          "dev": true
+        }
+      }
+    },
     "eslint-import-resolver-node": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz",
@@ -5639,7 +5699,7 @@
     "eslint-plugin-jsx-a11y": {
       "version": "6.2.3",
       "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz",
-      "integrity": "sha1-uHKgnV3lGvcKl9se6n3JMwQ3CKo=",
+      "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.4.5",
@@ -5656,7 +5716,7 @@
     "eslint-plugin-react": {
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz",
-      "integrity": "sha1-mSjk8+ISLtO6altW0DA7o+QdjAk=",
+      "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==",
       "dev": true,
       "requires": {
         "array-includes": "^3.0.3",
@@ -5673,7 +5733,7 @@
         "doctrine": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2"
@@ -5693,7 +5753,7 @@
     "eslint-plugin-react-hooks": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
-      "integrity": "sha1-YhC21aNyBfC5KFj4laToJwIKfQQ="
+      "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
     },
     "eslint-scope": {
       "version": "4.0.3",
@@ -5729,7 +5789,7 @@
     "eslint-watch": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-6.0.1.tgz",
-      "integrity": "sha1-4Jg5FlinwUjeyhcq0glQZa2gU1k=",
+      "integrity": "sha512-tWT6gQQWzGVn4KMs6ZAdG+nkNNQHg+c6wGdw/mwhp+jWyA7OWEOLxQnRhrP34ddJjpgDafhHOHBNtpVOtXXv4g==",
       "dev": true,
       "requires": {
         "chokidar": "^3.1.1",
@@ -5766,7 +5826,7 @@
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
             "ms": "^2.1.1"
@@ -7212,9 +7272,9 @@
       "dev": true
     },
     "handlebars": {
-      "version": "4.4.3",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.4.3.tgz",
-      "integrity": "sha512-B0W4A2U1ww3q7VVthTKfh+epHx+q4mCt6iK+zEAzbMBpWQAwxCeKxEGpj/1oQTpzPXDNSOG7hmG14TsISH50yw==",
+      "version": "4.5.3",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
+      "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
       "dev": true,
       "requires": {
         "neo-async": "^2.6.0",
@@ -7293,8 +7353,7 @@
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-symbols": {
       "version": "1.0.0",
@@ -8215,7 +8274,7 @@
     "istanbul-instrumenter-loader": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
-      "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=",
+      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
       "dev": true,
       "requires": {
         "convert-source-map": "^1.5.0",
@@ -8266,7 +8325,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -8486,6 +8545,11 @@
         "object.assign": "^4.1.0"
       }
     },
+    "just-extend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz",
+      "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw=="
+    },
     "karma": {
       "version": "4.4.1",
       "resolved": "https://registry.npmjs.org/karma/-/karma-4.4.1.tgz",
@@ -8541,12 +8605,42 @@
         "chai-things": "^0.2.0",
         "sinon": "^2.1.0",
         "sinon-chai": "^2.8.0"
+      },
+      "dependencies": {
+        "lolex": {
+          "version": "1.6.0",
+          "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+          "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+          "dev": true
+        },
+        "sinon": {
+          "version": "2.4.1",
+          "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
+          "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
+          "dev": true,
+          "requires": {
+            "diff": "^3.1.0",
+            "formatio": "1.2.0",
+            "lolex": "^1.6.0",
+            "native-promise-only": "^0.8.1",
+            "path-to-regexp": "^1.7.0",
+            "samsam": "^1.1.3",
+            "text-encoding": "0.6.4",
+            "type-detect": "^4.0.0"
+          }
+        },
+        "type-detect": {
+          "version": "4.0.8",
+          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+          "dev": true
+        }
       }
     },
     "karma-chrome-launcher": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
-      "integrity": "sha1-gFpYZ5mk0F9OVPcqIEl58/MGZzg=",
+      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
       "dev": true,
       "requires": {
         "which": "^1.2.1"
@@ -8566,7 +8660,7 @@
     "karma-coverage": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.1.tgz",
-      "integrity": "sha1-8CTxkfDxNd7iQDdjrDbMUqrCeaw=",
+      "integrity": "sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ==",
       "dev": true,
       "requires": {
         "dateformat": "^1.0.6",
@@ -8584,13 +8678,13 @@
         "istanbul-lib-coverage": {
           "version": "2.0.5",
           "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
-          "integrity": "sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k=",
+          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
           "dev": true
         },
         "istanbul-lib-instrument": {
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
-          "integrity": "sha1-pfY9kfC7wMPkee9MXeAnM17G1jA=",
+          "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
           "dev": true,
           "requires": {
             "@babel/generator": "^7.4.0",
@@ -8613,7 +8707,7 @@
     "karma-coverage-istanbul-reporter": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.0.tgz",
-      "integrity": "sha1-XxvME8XhTuHZGCHuiUaGFnT1THU=",
+      "integrity": "sha512-UH0mXPJFJyK5uiK7EkwGtQ8f30lCBAfqRResnZ4pzLJ04SOp4SPlYkmwbbZ6iVJ6sQFVzlDUXlntBEsLRdgZpg==",
       "dev": true,
       "requires": {
         "istanbul-api": "^2.1.6",
@@ -8715,7 +8809,7 @@
     "karma-webpack": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-4.0.2.tgz",
-      "integrity": "sha1-IyGb2VvdqFPjBz04dNNER8d7ztA=",
+      "integrity": "sha512-970/okAsdUOmiMOCY8sb17A2I8neS25Ad9uhyK3GHgmRSIFJbDcNEFE8dqqUhNe9OHiCC9k3DMrSmtd/0ymP1A==",
       "dev": true,
       "requires": {
         "clone-deep": "^4.0.1",
@@ -8744,7 +8838,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -8761,7 +8855,7 @@
         "source-map": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
           "dev": true
         }
       }
@@ -8988,10 +9082,9 @@
       "dev": true
     },
     "lolex": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
-      "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
-      "dev": true
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz",
+      "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg=="
     },
     "loose-envify": {
       "version": "1.4.0",
@@ -9829,6 +9922,18 @@
       "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
       "dev": true
     },
+    "nise": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.2.tgz",
+      "integrity": "sha512-/6RhOUlicRCbE9s+94qCUsyE+pKlVJ5AhIv+jEE7ESKwnbXqulKZ1FYU+XAtHHWE9TinYvAxDUJAb912PwPoWA==",
+      "requires": {
+        "@sinonjs/formatio": "^3.2.1",
+        "@sinonjs/text-encoding": "^0.7.1",
+        "just-extend": "^4.0.2",
+        "lolex": "^4.1.0",
+        "path-to-regexp": "^1.7.0"
+      }
+    },
     "node-environment-flags": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
@@ -10867,7 +10972,7 @@
     "react-datepicker": {
       "version": "0.60.2",
       "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-0.60.2.tgz",
-      "integrity": "sha1-EIPcHLn/BjK8oywDmYz4PuHOLgE=",
+      "integrity": "sha512-5WNtLhozO5i6iGlcgpvjP/Wu4l7RqvTC48CEE/pS1juUny/T4juYHSv53mo+Z90qO4qfyUj59jECTT8AIwAVRQ==",
       "requires": {
         "classnames": "^2.2.5",
         "moment": "^2.17.1",
@@ -11396,7 +11501,7 @@
     "semantic-ui-react": {
       "version": "0.79.1",
       "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.79.1.tgz",
-      "integrity": "sha1-gL0Mz7OzwRhKGxs/YGerEiWu1fA=",
+      "integrity": "sha512-Z/QHE/h+l4MrZMilKe7RCBv6wPSBopcwRh5fPPZ1Cavxw4703XizJ3m+g7qcYXa5F40NnM0LKaVDuaReJ0f/3w==",
       "requires": {
         "babel-runtime": "^6.25.0",
         "classnames": "^2.2.5",
@@ -11602,26 +11707,26 @@
       "dev": true
     },
     "sinon": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz",
-      "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==",
-      "dev": true,
+      "version": "7.5.0",
+      "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz",
+      "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==",
       "requires": {
-        "diff": "^3.1.0",
-        "formatio": "1.2.0",
-        "lolex": "^1.6.0",
-        "native-promise-only": "^0.8.1",
-        "path-to-regexp": "^1.7.0",
-        "samsam": "^1.1.3",
-        "text-encoding": "0.6.4",
-        "type-detect": "^4.0.0"
+        "@sinonjs/commons": "^1.4.0",
+        "@sinonjs/formatio": "^3.2.1",
+        "@sinonjs/samsam": "^3.3.3",
+        "diff": "^3.5.0",
+        "lolex": "^4.2.0",
+        "nise": "^1.5.2",
+        "supports-color": "^5.5.0"
       },
       "dependencies": {
-        "type-detect": {
-          "version": "4.0.8",
-          "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
-          "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
-          "dev": true
+        "supports-color": {
+          "version": "5.5.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -12622,20 +12727,20 @@
       "integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
     },
     "uglify-js": {
-      "version": "3.6.1",
-      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz",
-      "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==",
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.1.tgz",
+      "integrity": "sha512-pnOF7jY82wdIhATVn87uUY/FHU+MDUdPLkmGFvGoclQmeu229eTkbG5gjGGBi3R7UuYYSEeYXY/TTY5j2aym2g==",
       "dev": true,
       "optional": true,
       "requires": {
-        "commander": "2.20.0",
+        "commander": "~2.20.3",
         "source-map": "~0.6.1"
       },
       "dependencies": {
         "commander": {
-          "version": "2.20.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
-          "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
+          "version": "2.20.3",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+          "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
           "dev": true,
           "optional": true
         },
@@ -12651,7 +12756,7 @@
     "uglifyjs-webpack-plugin": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz",
-      "integrity": "sha1-51vIDn8ZN/cllUybTFoeln6p0Nc=",
+      "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==",
       "requires": {
         "cacache": "^12.0.2",
         "find-cache-dir": "^2.1.0",
@@ -12672,7 +12777,7 @@
         "find-cache-dir": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-          "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
           "requires": {
             "commondir": "^1.0.1",
             "make-dir": "^2.0.0",
@@ -13217,7 +13322,7 @@
     "webpack-bundle-tracker": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/webpack-bundle-tracker/-/webpack-bundle-tracker-0.4.3.tgz",
-      "integrity": "sha1-SKPiIm3bnSTXBGQKtBaMLRIPRSY=",
+      "integrity": "sha512-Sl/+OsNhFAH3/c6XADupRu8jLvGojfXX0pZIIm3O5ZcJqkHHqlY4nLG+NVRcbDgM/jOeWimKDGQMVEa8FBeJ2g==",
       "requires": {
         "deep-extend": "^0.6.0",
         "mkdirp": "^0.5.1",
diff --git a/package.json b/package.json
index 547fcaab888272c66ba60013a27eed9129565c75..275e346ae63414b00d6bb3cd2dc1f7a67d7df0d4 100755
--- a/package.json
+++ b/package.json
@@ -40,6 +40,7 @@
     "babel-loader": "^8.0.6",
     "eslint": "^6.6.0",
     "eslint-config-airbnb": "^18.0.1",
+    "eslint-config-prettier": "^6.7.0",
     "eslint-plugin-import": "^2.2.0",
     "eslint-plugin-jsx-a11y": "^6.2.3",
     "eslint-plugin-react": "^7.16.0",
@@ -61,8 +62,6 @@
     "mock-cookie": "^0.3.2",
     "react-hot-loader": "^3.0.0-beta.5",
     "react-test-utils": "0.0.1",
-    "webpack": "^4.41.2",
-    "webpack-bundle-tracker": "0.0.93",
     "webpack-cli": "^3.3.10",
     "webpack-dev-server": "^3.9.0"
   },
@@ -83,6 +82,7 @@
     "react-dom": "^16.12.0",
     "react-router": "^3.2.5",
     "semantic-ui-react": "^0.79.1",
+    "sinon": "^7.5.0",
     "starwars": "^1.0.1",
     "uglifyjs-webpack-plugin": "^2.2.0",
     "webpack": "^4.41.2",
diff --git a/sonar-project.properties b/sonar-project.properties
index 7a082a2783b934a1cdb77fdc8b37fc1068c5c2bb..6b0e489a1a186cb8b04b1574b0ed768189d286af 100755
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -6,7 +6,7 @@
 ## Project Configuration
 sonar.projectKey=id.ac.ui.cs.foss:kape
 sonar.sources=core,assets/js
-sonar.exclusions=.devcontainer/,.gitlab/,.config.js,.tmp/,assets/admin/**/*,assets/rest_framework/**/*,assets/rest_framework_swagger/**/*,assets/silk/**/*,kape/**/*,manage.py,core/tests/**/*,assets/js/__test__/**/*
+sonar.exclusions=.devcontainer/,.gitlab/,.config.js,.tmp/,assets/admin/**/*,assets/rest_framework/**/*,assets/rest_framework_swagger/**/*,assets/silk/**/*,kape/**/*,manage.py,core/tests/**/*,assets/js/__test__/**/*,core/migrations/**/*
 sonar.scm.provider=git
 sonar.projectVersion=1.0.0
 sonar.python.coverage.reportPaths=test/backend/coverage.xml