Browse Source

switch from gitbook to docusaurus

windhamdavid 3 years ago
commit
79edc87c11
100 changed files with 61016 additions and 0 deletions
  1. 23 0
      .gitignore
  2. 21 0
      README.md
  3. 3 0
      babel.config.js
  4. 1069 0
      docs/db/MongoDB.md
  5. 255 0
      docs/db/MySQL.md
  6. 135 0
      docs/db/PostgreSQL.md
  7. 289 0
      docs/db/Redis.md
  8. 135 0
      docs/editors/atom.md
  9. 509 0
      docs/editors/bash.md
  10. 288 0
      docs/editors/custom.md
  11. 641 0
      docs/editors/git.md
  12. 253 0
      docs/editors/phpstorm.md
  13. 42 0
      docs/editors/sublime.md
  14. 141 0
      docs/editors/subversion.md
  15. 131 0
      docs/editors/terminal.md
  16. 111 0
      docs/editors/textmate.md
  17. 233 0
      docs/editors/unix.md
  18. 288 0
      docs/editors/vi.md
  19. 499 0
      docs/editors/zsh.md
  20. 3 0
      docs/host/Discourse.md
  21. 1 0
      docs/host/Drupal.md
  22. 100 0
      docs/host/Gitea.md
  23. 94 0
      docs/host/Gogs.md
  24. 82 0
      docs/host/Icecast.md
  25. 8 0
      docs/host/InvoicePlane.md
  26. 2211 0
      docs/host/Laravel.md
  27. 70 0
      docs/host/Lychee.md
  28. 7 0
      docs/host/Mailcow.md
  29. 4 0
      docs/host/Nodebb.md
  30. 6 0
      docs/host/Phproject.md
  31. 7 0
      docs/host/Piwik.md
  32. 520 0
      docs/host/Siege-sproxy.md
  33. 23 0
      docs/host/Webmin.md
  34. 362 0
      docs/host/WordPress.md
  35. 5 0
      docs/host/Zammad.md
  36. 103 0
      docs/index.md
  37. 0 0
      docs/lang/C.md
  38. 757 0
      docs/lang/Golang.md
  39. 839 0
      docs/lang/GraphQL.md
  40. 1526 0
      docs/lang/JavaScript.md
  41. 50 0
      docs/lang/PHP.md
  42. 12 0
      docs/lang/Python.md
  43. 452 0
      docs/lang/Ruby.md
  44. 1003 0
      docs/lang/Rust.md
  45. 180 0
      docs/localhost/_log.md
  46. 683 0
      docs/localhost/adobe.md
  47. 76 0
      docs/localhost/apple.md
  48. 261 0
      docs/localhost/brew.md
  49. 88 0
      docs/localhost/chrome.md
  50. 119 0
      docs/localhost/macs.md
  51. 3 0
      docs/localhost/ngrok.md
  52. 111 0
      docs/localhost/sketch.md
  53. 1 0
      docs/projects/dw.md
  54. 2 0
      docs/projects/gzet.md
  55. 92 0
      docs/projects/juryd.md
  56. 280 0
      docs/projects/pants.md
  57. 380 0
      docs/projects/woozer.md
  58. 636 0
      docs/projects/zeke.md
  59. 53 0
      docs/projects/zw.md
  60. 4 0
      docs/saas/aws.md
  61. 959 0
      docs/saas/google.md
  62. 1 0
      docs/saas/heroku.md
  63. 11 0
      docs/saas/linode.md
  64. 8 0
      docs/saas/now.md
  65. 5 0
      docs/saas/stripe.md
  66. 3 0
      docs/saas/twilio.md
  67. 4 0
      docs/server/apache.md
  68. 532 0
      docs/server/docker.md
  69. 13 0
      docs/server/goaccess.md
  70. 374 0
      docs/server/htop.md
  71. 1329 0
      docs/server/iptables.md
  72. 280 0
      docs/server/kubernetes.md
  73. 522 0
      docs/server/letsencrypt.md
  74. 753 0
      docs/server/lynis.md
  75. 928 0
      docs/server/mail.md
  76. 207 0
      docs/server/monit.md
  77. 183 0
      docs/server/nginx.md
  78. 1417 0
      docs/server/ubuntu.md
  79. 16 0
      docs/server/ufw.md
  80. 64 0
      docs/waf/nodejs.md
  81. 3511 0
      docs/waf/npm.md
  82. 14 0
      docs/waf/rails.md
  83. 557 0
      docs/waf/react.md
  84. 9 0
      docs/waf/react_native.md
  85. 1 0
      docs/waf/vue.md
  86. 70 0
      docusaurus.config.js
  87. 30583 0
      package-lock.json
  88. 37 0
      package.json
  89. 141 0
      sidebars.js
  90. 32 0
      src/css/custom.css
  91. 29 0
      src/pages/about.md
  92. 541 0
      src/pages/help.md
  93. 131 0
      src/pages/index.md
  94. 8 0
      src/pages/styles.module.css
  95. 521 0
      src/theme/SearchBar/algolia.css
  96. 106 0
      src/theme/SearchBar/index.js
  97. 306 0
      src/theme/SearchBar/lib/DocSearch.js
  98. 146 0
      src/theme/SearchBar/lib/lunar-search.js
  99. 114 0
      src/theme/SearchBar/lib/templates.js
  100. 270 0
      src/theme/SearchBar/lib/utils.js

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+/static
+
+# Dependencies
+/node_modules
+
+# Production
+/build
+
+# Generated files
+.docusaurus
+.cache-loader
+
+# Misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*

+ 21 - 0
README.md

@@ -0,0 +1,21 @@
+
+### (TIL) Today I Learned  
+
+---  
+
+
+#### Notes: 
+#### 03/18/2021
+
+Migrated this version from Gitbook because it wasn't playing nicely with Node.js v14 and it had a couple security vulnerabilities in the packages. Gitbook stop supporting the open source version likely for business reasons, so I migrated it all to ~~[https://docsify.js.org/](https://docsify.js.org/)~~ ... didn't do docsify because I can't generate static HTML which is what my DOM parser depends on to pull content elsewhere. Decided on using [https://docusaurus.io/](https://docusaurus.io/) instead. It required a bit of cleanup in the Markdown to do so. See: [https://davidawindham.com/til/help](https://davidawindham.com/til/help)
+
+#### 05/02/2017  
+
+While working on another project yesterday afternoon, I ran into set of documentation ([https://docs.feathersjs.com/](https://docs.feathersjs.com/)) that I spent a lot of time reading and will likely forget about sometime soon after I abandon using the library in other projects. Of course I stuffed a bookmark of the documentation into my quasi organized set of chrome bookmarks based on each project, but the fact that the documentation was hosted using [Gitbook](https://github.com/GitbookIO/gitbook), reminded me of a practice I've seen others do.
+
+I'm often searching online documentation for answers to commands, configurations, and error messages. The problem is that I've found myself repeating those searches because of the breadth and depth of the amount of functions and libraries involved in development. My wife suggested I call it TIHIDI (this is how I did it) after explaining what I was working on. It makes sense to put my daily explorations into this publication in lieu of publishing them in the database of my main site because Gitbook is quicker, easier to search, and I can keep all the files in a version control repository on my local machine as well. It'll help keep me keep my bookmarks as little less cluttered and it'll leave my [desk page](https://davidawindham.com/desk) free for longer form essays.  I'm hoping this document will be of assistance. After this README, I'll write a help page and I'll add some of my vi cheat sheets to get started.
+
+Today I learned that Google will translate to and from [Zulu](https://en.wikipedia.org/wiki/Zulu_language). My page is referring to the database and computer operating system and not the Zulu philosophy of a universal bond of sharing that connects all humanity. (https://en.wikipedia.org/wiki/Ubuntu_(philosophy) One of the best sub-reddits is [TIL](https://www.reddit.com/r/todayilearned/) and other organizations have published thier own TILs ([https://github.com/thoughtbot/til](https://github.com/thoughtbot/til) & [http://video.nationalgeographic.com/video/til](http://video.nationalgeographic.com/video/til)) . I figured that since I spend most of my working time with the terminal, git, and text files, a more efficient and easier method of documenting the time I spend reading other documentation would be to build my own TIL. This way the information I aquire will be easy to record, search and edit.
+
+  
+

+ 3 - 0
babel.config.js

@@ -0,0 +1,3 @@
+module.exports = {
+  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
+};

+ 1069 - 0
docs/db/MongoDB.md

@@ -0,0 +1,1069 @@
+
+
+**11/10/18** - Ran a > brew upgrade which caused mongodb issues, so I had to downgrade my localhost version in order to repair the databases to bring them up to version 4.0.2 see [https://docs.mongodb.com/manual/release-notes/4.0-upgrade-standalone/](https://docs.mongodb.com/manual/release-notes/4.0-upgrade-standalone/)
+
+
+
+```shell
+brew uninstall MongoDB
+brew install mongodb@3.2
+
+<!-- start mongodb -->
+/usr/local/opt/mongodb@3.2/bin/mongod
+> db.adminCommand( { setFeatureCompatibilityVersion: "3.2" } )
+>quit();
+
+<!-- Quit Mongodb -->
+Kill the process by $ kill <PID>
+brew uninstall mongodb@3.2
+
+<!-- Repeat the process for 3.4 and 3.6 -->
+brew install mongodb@3.4
+/usr/local/opt/mongodb@3.4/bin/mongod
+> db.adminCommand( { setFeatureCompatibilityVersion: "3.4" } )
+>quit();
+Kill the process by $ kill <PID>
+brew uninstall mongodb@3.2
+
+brew install mongodb@3.6
+/usr/local/opt/mongodb@3.6/bin/mongod
+> db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )
+>quit();
+Kill the process by $ kill <PID>
+brew uninstall mongodb@3.6
+
+<!-- Bring it up to verion 4.0.2 -->
+brew install mongodb
+
+
+```  
+
+##### Remote Install
+
+* Install MongoDB on Ubuntu 16.04
+* [Install MongoDB Community Edition on Ubuntu — MongoDB Manual 3.2](#install-mongodb-community-edition-on-ubuntu-—-mongodb-manual-32)  
+
+##### Resources
+
+* [How To Run a Secure MongoDB Server with OpenVPN and Docker on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-run-a-secure-mongodb-server-with-openvpn-and-docker-on-ubuntu-16-04)
+* [Data Model Design](https://docs.mongodb.com/manual/core/data-model-design/)
+* [mongoexport](https://docs.mongodb.com/manual/reference/program/mongoexport/)
+
+
+###### GUI
+
+* [MongoDB Compass GUI](https://docs.mongodb.com/compass/current/)
+* [MongoClient](https://github.com/mongoclient/mongoclient)
+* [Mongotron](https://github.com/officert/mongotron)
+* [Mongo Express](https://github.com/mongo-express/mongo-express)
+* [RoboMongo](https://robomongo.org/)
+* [Studio3T](https://github.com/Studio3T/robomongo)
+
+###### Hosted
+
+* [mongodb Atlas](https://cloud.mongodb.com)
+* [mLab](https://mlab.com/)
+* [on AWS](http://docs.aws.amazon.com/quickstart/latest/mongodb/welcome.html)
+
+
+##### My MongoDB
+
+```
+// shell
+$ mongo
+
+// Print a list of all databases on the server.
+> show dbs
+// create user
+> db.createUser({user:"username",pwd:"Password", roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
+> use user
+
+$ mongo --port 27017 -u "user" -p "password" --authenticationDatabase "database"
+
+
+//Add SSL to mongodb
+$ sudo mkdir /etc/ssl/mongodb/
+$ cd /etc/ssl/mongodb/
+$ sudo openssl req -new -x509 -days 365 -out mongodb-server-cert.crt -keyout mongodb-server-cert.key
+
+	Enter PEM pass phrase:
+	Common Name (e.g. server FQDN or YOUR name) []: mongodb_server_private_ip
+
+$ sudo bash -c 'cat mongodb-server-cert.key mongodb-server-cert.crt > mongodb-server.pem'
+$ sudo openssl req -new -x509 -days 365 -out mongodb-client-cert.crt -keyout mongodb-client-cert.key
+$ sudo bash -c 'cat mongodb-client-cert.key mongodb-client-cert.crt > mongodb-client.pem'
+
+//connect to client with SSL
+$ mongo --ssl --sslCAFile /etc/ssl/mongodb/mongodb-server.pem \
+--sslPEMKeyFile /etc/ssl/mongodb/mongodb-client.pem \
+--sslPEMKeyPassword (PEM Passphrase) \
+--host 127.0.0.1 --port 27017 \
+--u "user" -p "passowrd" --authenticationDatabase "database"
+
+
+//mongdb.conf
+security:
+  authorization: enabled
+net:
+  port: 27017
+  bindIp: 127.0.0.1
+  // add access from cluster
+  bindIp: [IP of server]
+  // add SSL
+  ssl:
+       mode: requireSSL
+       PEMKeyFile: /etc/ssl/mongodb/mongodb-server.pem
+       CAFile: /etc/ssl/mongodb/mongodb-client.pem
+       PEMKeyPassword: mongodb_server_test_ssl
+
+storage:
+	dbPath: /var/lib/mongodb
+	journal:
+		enabled: true
+
+```
+
+
+
+===============================
+``mongo`` Shell Quick Reference
+===============================
+[Source](https://github.com/mongodb/docs/blob/master/source/reference/mongo-shell.txt)
+
+.. default-domain:: mongodb
+
+.. contents:: On this page
+   :local:
+   :backlinks: none
+   :depth: 1
+   :class: singlecol
+
+``mongo`` Shell Command History
+-------------------------------
+
+You can retrieve previous commands issued in the :program:`mongo` shell
+with the up and down arrow keys. Command history is stored in
+``~/.dbshell`` file. See :ref:`.dbshell <mongo-dbshell-file>` for more
+information.
+
+Command Line Options
+--------------------
+
+The :program:`mongo` shell can be started with numerous options. See
+:doc:`mongo shell </reference/program/mongo>` page for details on all
+available options.
+
+The following table displays some common options for :program:`mongo`:
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Option
+     - Description
+
+   * - :option:`--help <mongo --help>`
+     - Show command line options
+
+   * - :option:`--nodb <mongo --nodb>`
+
+     - Start :program:`mongo` shell without connecting to a database.
+
+       To connect later, see :ref:`mongo-shell-new-connections`.
+
+   * - :option:`--shell <mongo --shell>`
+
+     - Used in conjunction with a JavaScript file (i.e.
+       :ref:`\<file.js\> <mongo-shell-file>`) to continue in the
+       :program:`mongo` shell after running the JavaScript file.
+
+       See :ref:`JavaScript file <mongo-shell-javascript-file>` for an
+       example.
+
+.. _command-helpers:
+
+Command Helpers
+---------------
+
+The :program:`mongo` shell provides various help. The following table
+displays some common help methods and commands:
+
+.. list-table::
+   :header-rows: 1
+   :widths: 30 70
+
+   * - Help Methods and Commands
+     - Description
+
+   * - ``help``
+
+     - Show help.
+
+   * - :method:`db.help()`
+
+     - Show help for database methods.
+
+   * - :method:`db.\<collection\>.help() <db.collection.help>`
+
+     - Show help on collection methods. The ``<collection>`` can be the
+       name of an existing collection or a non-existing collection.
+
+   * - ``show dbs``
+
+     - Print a list of all databases on the server.
+
+   * - ``use <db>``
+
+     - Switch current database to ``<db>``. The :program:`mongo` shell
+       variable ``db`` is set to the current database.
+
+   * - ``show collections``
+
+     - Print a list of all collections for current database
+
+   * - ``show users``
+
+     - Print a list of users for current database.
+
+   * - ``show roles``
+
+     - Print a list of all roles, both user-defined and built-in, for
+       the current database.
+
+   * - ``show profile``
+
+     - Print the five most recent operations that took 1 millisecond or
+       more. See documentation on the :doc:`database profiler
+       </tutorial/manage-the-database-profiler>` for more information.
+
+   * - ``show databases``
+
+     - Print a list of all available databases.
+
+   * - ``load()``
+
+     - Execute a JavaScript file. See
+       :doc:`/tutorial/write-scripts-for-the-mongo-shell`
+       for more information.
+
+Basic Shell JavaScript Operations
+----------------------------------
+
+The :program:`mongo` shell provides a
+:doc:`JavaScript API </reference/method>` for database operations.
+
+In the :program:`mongo` shell, ``db`` is the variable that references
+the current database. The variable is automatically set to the default
+database ``test`` or is set when you use the ``use <db>`` to switch
+current database.
+
+The following table displays some common JavaScript operations:
+
+.. list-table::
+   :header-rows: 1
+   :widths: 40 60
+
+   * - JavaScript Database Operations
+     - Description
+
+   * - :method:`db.auth()`
+
+     - If running in secure mode, authenticate the user.
+
+   * - ``coll = db.<collection>``
+
+     - Set a specific collection in the current database to a variable
+       ``coll``, as in the following example:
+
+       .. code-block:: javascript
+
+          coll = db.myCollection;
+
+       You can perform operations on the ``myCollection`` using the
+       variable, as in the following example:
+
+       .. code-block:: javascript
+
+          coll.find();
+
+   * - :method:`db.collection.find()`
+
+     - Find all documents in the collection and returns a cursor.
+
+       See the :method:`db.collection.find()` and
+       :doc:`/tutorial/query-documents` for more information and
+       examples.
+
+       See :doc:`/tutorial/iterate-a-cursor` for information on
+       cursor handling in the :program:`mongo` shell.
+
+   * - :method:`db.collection.insertOne()`
+
+     - Insert a new document into the collection.
+
+   * - :method:`db.collection.insertMany()`
+
+     - Insert multiple new documents into the collection.
+
+   * - :method:`db.collection.updateOne()`
+
+     - Update a single existing document in the collection.
+
+   * - :method:`db.collection.updateMany()`
+
+     - Update multiple existing documents in the collection.
+
+   * - :method:`db.collection.save()`
+
+     - Insert either a new document or update an existing document in
+       the collection.
+
+   * - :method:`db.collection.deleteOne()`
+
+     - Delete a single document from the collection.
+
+   * - :method:`db.collection.deleteMany()`
+
+     - Delete documents from the collection.
+
+   * - :method:`db.collection.drop()`
+
+     - Drops or removes completely the collection.
+
+   * - :method:`db.collection.createIndex()`
+
+     - Create a new index on the collection if the index does not
+       exist; otherwise, the operation has no effect.
+
+   * - :method:`db.getSiblingDB()`
+
+     - Return a reference to another database using this same
+       connection without explicitly switching the current database.
+       This allows for cross database queries.
+
+For more information on performing operations in the shell, see:
+
+- :doc:`/crud`
+
+- :ref:`js-administrative-methods`
+
+Keyboard Shortcuts
+------------------
+
+The :program:`mongo` shell provides most keyboard shortcuts similar to
+those found in the ``bash`` shell or in Emacs. For some functions
+:program:`mongo` provides multiple key bindings, to accommodate
+several familiar paradigms.
+
+The following table enumerates the keystrokes supported by the
+:program:`mongo` shell:
+
+.. list-table::
+   :header-rows: 1
+
+   * - **Keystroke**
+     - **Function**
+   * - Up-arrow
+     - previous-history
+   * - Down-arrow
+     - next-history
+   * - Home
+     - beginning-of-line
+   * - End
+     - end-of-line
+   * - Tab
+     - autocomplete
+   * - Left-arrow
+     - backward-character
+   * - Right-arrow
+     - forward-character
+   * - Ctrl-left-arrow
+     - backward-word
+   * - Ctrl-right-arrow
+     - forward-word
+   * - Meta-left-arrow
+     - backward-word
+   * - Meta-right-arrow
+     - forward-word
+   * - Ctrl-A
+     - beginning-of-line
+   * - Ctrl-B
+     - backward-char
+   * - Ctrl-C
+     - exit-shell
+   * - Ctrl-D
+     - delete-char (or exit shell)
+   * - Ctrl-E
+     - end-of-line
+   * - Ctrl-F
+     - forward-char
+   * - Ctrl-G
+     - abort
+   * - Ctrl-J
+     - accept-line
+   * - Ctrl-K
+     - kill-line
+   * - Ctrl-L
+     - clear-screen
+   * - Ctrl-M
+     - accept-line
+   * - Ctrl-N
+     - next-history
+   * - Ctrl-P
+     - previous-history
+   * - Ctrl-R
+     - reverse-search-history
+   * - Ctrl-S
+     - forward-search-history
+   * - Ctrl-T
+     - transpose-chars
+   * - Ctrl-U
+     - unix-line-discard
+   * - Ctrl-W
+     - unix-word-rubout
+   * - Ctrl-Y
+     - yank
+   * - Ctrl-Z
+     - Suspend (job control works in linux)
+   * - Ctrl-H (i.e. Backspace)
+     - backward-delete-char
+   * - Ctrl-I (i.e. Tab)
+     - complete
+   * - Meta-B
+     - backward-word
+   * - Meta-C
+     - capitalize-word
+   * - Meta-D
+     - kill-word
+   * - Meta-F
+     - forward-word
+   * - Meta-L
+     - downcase-word
+   * - Meta-U
+     - upcase-word
+   * - Meta-Y
+     - yank-pop
+   * - Meta-[Backspace]
+     - backward-kill-word
+   * - Meta-<
+     - beginning-of-history
+   * - Meta->
+     - end-of-history
+
+
+
+Queries
+-------
+
+In the :program:`mongo` shell, perform read operations using the
+:method:`~db.collection.find()` and :method:`~db.collection.findOne()`
+methods.
+
+The :method:`~db.collection.find()` method returns a cursor object
+which the :program:`mongo` shell iterates to print documents on
+screen. By default, :program:`mongo` prints the first 20. The
+:program:`mongo` shell will prompt the user to "``Type it``" to continue
+iterating the next 20 results.
+
+The following table provides some common read operations in the
+:program:`mongo` shell:
+
+.. list-table::
+   :header-rows: 1
+
+   * - Read Operations
+
+     - Description
+
+   * - :method:`db.collection.find(\<query\>) <db.collection.find()>`
+
+     - Find the documents matching the ``<query>`` criteria in the
+       collection. If the ``<query>`` criteria is not specified or is
+       empty (i.e ``{}`` ), the read operation selects all documents in
+       the collection.
+
+       The following example selects the documents in the ``users``
+       collection with the ``name`` field equal to ``"Joe"``:
+
+       .. code-block:: javascript
+
+          coll = db.users;
+          coll.find( { name: "Joe" } );
+
+       For more information on specifying the ``<query>`` criteria, see
+       :ref:`read-operations-query-argument`.
+
+   * - :method:`db.collection.find(\<query\>, \<projection\>)
+       <db.collection.find()>`
+
+     - Find documents matching the ``<query>`` criteria and return just
+       specific fields in the ``<projection>``.
+
+       The following example selects all documents from the collection
+       but returns only the ``name`` field and the ``_id`` field. The
+       ``_id`` is always returned unless explicitly specified to not
+       return.
+
+       .. code-block:: javascript
+
+          coll = db.users;
+          coll.find( { }, { name: true } );
+
+       For more information on specifying the ``<projection>``, see
+       :ref:`read-operations-projection`.
+
+   * - :method:`db.collection.find().sort(\<sort order\>) <cursor.sort()>`
+
+     - Return results in the specified ``<sort order>``.
+
+       The following example selects all documents from the collection
+       and returns the results sorted by the ``name`` field in
+       ascending order (``1``).  Use ``-1`` for descending order:
+
+       .. code-block:: javascript
+
+          coll = db.users;
+          coll.find().sort( { name: 1 } );
+
+   * - :method:`db.collection.find(\<query\>).sort(\<sort order\>)
+       <cursor.sort()>`
+
+     - Return the documents matching the ``<query>`` criteria in the
+       specified ``<sort order>``.
+
+   * - :method:`db.collection.find( ... ).limit( \<n\> ) <cursor.limit()>`
+
+     - Limit result to ``<n>`` rows. Highly recommended if you need only
+       a certain number of rows for best performance.
+
+   * - :method:`db.collection.find( ... ).skip( \<n\> )
+       <cursor.skip()>`
+
+     - Skip ``<n>`` results.
+
+   * - :method:`db.collection.count()`
+
+     - Returns total number of documents in the collection.
+
+   * - :method:`db.collection.find(\<query\>).count() <cursor.count()>`
+
+     - Returns the total number of documents that match the query.
+
+       The :method:`~cursor.count()` ignores :method:`~cursor.limit()` and :method:`~cursor.skip()`. For
+       example, if 100 records match but the limit is 10,
+       :method:`~cursor.count()` will return 100. This will be
+       faster than iterating yourself, but still take time.
+
+   * - :method:`db.collection.findOne(\<query\>) <db.collection.findOne()>`
+
+     - Find and return a single document. Returns null if not found.
+
+       The following example selects a single document in the ``users``
+       collection with the ``name`` field matches to ``"Joe"``:
+
+       .. code-block:: javascript
+
+          coll = db.users;
+          coll.findOne( { name: "Joe" } );
+
+       Internally, the :method:`~db.collection.findOne()`
+       method is the :method:`~db.collection.find()` method
+       with a :method:`limit(1) <cursor.limit()>`.
+
+See :doc:`/tutorial/query-documents` documentation for more information and
+examples. See :doc:`/reference/operator/query` to specify other query
+operators.
+
+Error Checking Methods
+----------------------
+
+.. versionchanged:: 2.6
+
+The :program:`mongo` shell write methods now integrates the
+:doc:`/reference/write-concern` directly into the method execution rather
+than with a separate :method:`db.getLastError()` method. As such, the
+write methods now return a :method:`WriteResult()` object that
+contains the results of the operation, including any write errors and
+write concern errors.
+
+Previous versions used :method:`db.getLastError()` and
+:method:`db.getLastErrorObj()` methods to return error information.
+
+.. _mongo-dba-helpers:
+.. _mongo-shell-admin-helpers:
+
+Administrative Command Helpers
+------------------------------
+
+The following table lists some common methods to support database
+administration:
+
+.. list-table::
+   :header-rows: 1
+
+   * - **JavaScript Database Administration Methods**
+     - **Description**
+
+   * - :method:`db.cloneDatabase(\<host\>) <db.cloneDatabase()>`
+
+     - Clone the current database from the ``<host>`` specified. The
+       ``<host>`` database instance must be in noauth mode.
+
+   * - :method:`db.copyDatabase(\<from\>, \<to\>, \<host\>) <db.copyDatabase()>`
+
+     - Copy the ``<from>`` database from the ``<host>`` to the ``<to>``
+       database on the current server.
+
+       The ``<host>`` database instance must be in ``noauth`` mode.
+
+   * - :method:`db.fromColl.renameCollection(\<toColl\>)
+       <db.collection.renameCollection()>`
+
+     - Rename collection from ``fromColl`` to ``<toColl>``.
+
+   * - :method:`db.repairDatabase()`
+
+     - Repair and compact the current database. This operation can be
+       very slow on large databases.
+
+   * - :method:`db.getCollectionNames()`
+
+     - Get the list of all collections in the current database.
+
+   * - :method:`db.dropDatabase()`
+
+     - Drops the current database.
+
+See also :ref:`administrative database methods
+<js-administrative-methods>` for a full list of methods.
+
+Opening Additional Connections
+------------------------------
+
+You can create new connections within the :program:`mongo` shell.
+
+The following table displays the methods to create the connections:
+
+.. list-table::
+   :header-rows: 1
+
+   * - JavaScript Connection Create Methods
+
+     - Description
+
+```
+
+          db = connect("<host><:port>/<dbname>")
+```
+
+     - Open a new database connection.
+
+   * - .. code-block:: javascript
+
+          conn = new Mongo()
+          db = conn.getDB("dbname")
+
+     - Open a connection to a new server using ``new Mongo()``.
+
+       Use ``getDB()`` method of the connection to select a database.
+
+See also :ref:`mongo-shell-new-connections` for more information on the
+opening new connections from the :program:`mongo` shell.
+
+Miscellaneous
+-------------
+
+The following table displays some miscellaneous methods:
+
+.. list-table::
+   :header-rows: 1
+
+   * - **Method**
+     - **Description**
+'''
+   * - ``Object.bsonsize(<document>)``
+     - Prints the :term:`BSON` size of a <document> in bytes
+'''
+See the `MongoDB JavaScript API Documentation
+<http://api.mongodb.org/js/index.html>`_ for a full list of JavaScript
+methods .
+
+Additional Resources
+--------------------
+
+Consider the following reference material that addresses the
+:program:`mongo` shell and its interface:
+
+- :program:`mongo`
+- :ref:`js-administrative-methods`
+- :ref:`database-commands`
+- :ref:`aggregation-reference`
+- :gettingstarted:`Getting Started Guide </shell>`
+
+Additionally, the MongoDB source code repository includes a `jstests
+directory <https://github.com/mongodb/mongo/tree/master/jstests/>`_
+which contains numerous :program:`mongo` shell scripts.
+
+------
+
+## Install MongoDB on Ubuntu 16.04
+[Source](https://github.com/linode/docs/blob/master/docs/databases/mongodb/install-mongodb-on-ubuntu-16-04.md)
+
+
+### Add the MongoDB Repository
+
+The `mongodb-server` package from the Ubuntu repository includes version 2.6. However, this version reached end of life in October 2016, so it should not be used in production environments. The most current version available is 3.2 and, as of this writing, the default Ubuntu repositories do not contain an updated package.
+
+Because the Ubuntu repositories don't contain a current version, we'll need to use the MongoDB repository.
+
+1.  Import the MongoDB public GPG key for package signing:
+
+        sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
+
+2.  Add the MongoDB repository to your `sources.list.d` directory:
+
+        echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
+
+3.  Update your repositories. This allows `apt` to read from the newly added MongoDB repo:
+
+        sudo apt-get update
+
+### Install MongoDB
+
+Now that the MongoDB repository has been added, we're ready to install the latest stable version of MongoDB:
+
+    sudo apt-get install mongodb-org
+
+This command installs `mongodb-org`, a meta-package that includes the following:
+
+-   `mongodb-org-server` - The standard MongoDB daemon, and relevant init scripts and configurations
+-   `mongodb-org-mongos` - The MongoDB Shard daemon
+-   `mongodb-org-shell` - The MongoDB shell, used to interact with MongoDB via the command line
+-   `mongodb-org-tools` - Contains a few basic tools to restore, import, and export data, as well as a variety of other functions.
+
+These packages provide a good base that will serve most use cases, and we recommend installing them all. However, if you want a more minimal installation, you can selectively install packages from the above list rather than using the `mongodb-org` metapackage.
+
+For more information on the installation process and options, refer to the [official MongoDB installation tutorial](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/).
+
+### Configure MongoDB
+
+The configuration file for MongoDB is located at `/etc/mongod.conf`, and is written in YAML format. Most of the settings are well commented within the file. We've outlined the default options below:
+
+- `dbPath` indicates where the database files will be stored (`/var/lib/mongodb` by default)
+- `systemLog` specifies the various logging options, explained below:
+    - `destination` tells MongoDB whether to store the log output as a file or syslog
+    - `logAppend` specifies whether to append new entries to the end of an existing log when the daemon restarts (as opposed to creating a backup and starting a new log upon restarting)
+    - `path` tells the daemon where to send its logging information (`/var/log/mongodb/mongod.log` by default)
+- `net` specifies the various network options, explained below:
+    - `port` is the port on which the MongoDB daemon will run
+    - `bindIP` specifies the IP addresses MongoDB to which binds, so it can listen for connections from other applications
+
+These are only a few basic configuration options that are set by default.
+
+We **strongly** recommend uncommenting the `security` section and adding the following:
+
+{: .file-excerpt}
+/etc/mongod.conf
+:   ~~~ conf
+    security:
+      authorization: enabled
+    ~~~
+
+The `authorization` option enables [role-based access control](https://docs.mongodb.com/manual/core/authorization/) for your databases. If no value is specified, any user will have the ability to modify any database. We'll explain how to create database users and set their permissions later in this guide.
+
+For more information on how to customize these and other values in your configuration file, refer to the [official MongoDB configuration tutorial](https://docs.mongodb.com/manual/reference/configuration-options/).
+
+After making changes to the MongoDB configuration file, restart the service as shown in the following section.
+
+## Start and Stop MongoDB
+
+To start, restart, or stop the MongoDB service, issue the appropriate command from the following:
+
+    sudo systemctl start mongod
+    sudo systemctl restart mongod
+    sudo systemctl stop mongod
+
+You can also enable MongoDB to start on boot:
+
+    sudo systemctl enable mongod
+
+## Create Database Users
+
+If you enabled role-based access control in the [Configure MongoDB](#configure-mongodb) section, create a user administrator with credentials for use on the database:
+
+1.  Open the `mongo` shell:
+
+        mongo
+
+2.  By default, MongoDB connects to a database called `test`. Before adding any users, create a database to store user data for authentication:
+
+        use admin
+
+3.  Use the following command to create an administrative user with the ability to create other users on any database. For better security, change the values `mongo-admin` and `password`:
+
+        db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})
+
+    Keep these credentials in a safe place for future reference. The output will display all the information written to the database except the password:
+
+        Successfully added user: {
+            "user" : "mongo-admin",
+            "roles" : [
+                    {
+                        "role" : "userAdminAnyDatabase",
+                        "db" : "admin"
+                    }
+            ]
+        }
+
+4.  Exit the mongo shell:
+
+        quit()
+
+5.  Test your connection to MongoDB with the credentials created in Step 3, using the `admin` database for authentication:
+
+        mongo -u mongo-admin -p --authenticationDatabase admin
+
+    The `-u`, `-p`, and `--authenticationDatabase` options in the above command are required in order to authenticate connections to the shell. Without authentication, the MongoDB shell can be accessed but will not allow connections to databases.
+
+    The `mongo-admin` user created in Step 3 is purely administrative based on the roles specified. It is defined as an administrator of user for all databases, but does not have any database permissions itself. You may use it to create additional users and define their roles. If you are using multiple applications with MongoDB, set up different users with custom permissions for their corresponding databases.
+
+6.  As the `mongo-admin` user, create a new database to store regular user data for authentication. The following example calls this database `user-data`:
+
+        use user-data
+
+7.  Permissions for different databases are handled in separate `roles` objects. This example creates the user, `example-user`, with read-only permissions for the `user-data` database and has read and write permissions for the `exampleDB` database that we'll create in the [Manage Data and Collections](#manage-data-and-collections) section below.
+
+    Create a new, non-administrative user to enter test data. Change both `example-user` and `password` to something relevant and secure:
+
+        db.createUser({user: "example-user", pwd: "password", roles:[{role: "read", db: "user-data"}, {role:"readWrite", db: "exampleDB"}]})
+
+    To create additional users, repeat Steps 6 and 7 as the administrative user, creating new usernames, passwords and roles by substituing the appropriate values.
+
+8.  Exit the mongo shell:
+
+        quit()
+
+For more information on access control and user management, as well as other tips on securing your databases, refer to the [MongoDB Security Documentation](https://docs.mongodb.org/v3.2/security).
+
+## Manage Data and Collections
+
+Much of MongoDB's popularity comes from its ease of integration. Interactions with databases are done via JavaScript methods, but [drivers for other languages](http://docs.mongodb.org/ecosystem/drivers/) are available. This section will demonstrate a few basic features, but we encourage you to do further research based on your specific use case.
+
+1.  Open the MongoDB shell using the `example-user` we created above:
+
+        mongo -u example-user -p --authenticationDatabase user-data
+
+2.  Create a new database. This example calls it `exampleDB`:
+
+        use exampleDB
+
+    Make sure that this database name corresponds with the one for which the user has read and write permissions (we added these permissions in Step 7 of the previous section).
+
+    To show the name of the current working database, run the `db` command.
+
+3.  Create a new *collection* called `exampleCollection`:
+
+        db.createCollection("exampleCollection", {capped: false})
+
+    If you're not familiar with MongoDB terminology, you can think of a collection as analogous to a table in a relational database management system. For more information on creating new collections, see the MongoDB documentation on the [db.createCollection() method](https://docs.mongodb.com/v3.2/reference/method/db.createCollection/).
+
+    {: .note}
+    > Collection names should not include certain punctuation such as hyphens. However, exceptions may not be raised until you attempt to use or modify the collection. For more information, refer to MongoDB's [naming restrictions](https://docs.mongodb.com/manual/reference/limits/#naming-restrictions).
+
+4.  Create sample data for entry into the test database. MongoDB accepts input as *documents* in the form of JSON objects such as those below. The `a` and `b` variables are used to simplify entry; objects can be inserted directly via functions as well.
+
+        var a = { name : "John Doe",  attributes: { age : 30, address : "123 Main St", phone : 8675309 }}
+        var b = { name : "Jane Doe",  attributes: { age : 29, address : "321 Main Rd", favorites : { food : "Spaghetti", animal : "Dog" } }}
+
+    Note that documents inserted into a collection need not have the same schema, which is one of many benefits of using a NoSQL database.
+
+5.  Insert the data into `exampleCollection`, using the `insert` method:
+
+        db.exampleCollection.insert(a)
+        db.exampleCollection.insert(b)
+
+    The output for each of these operations will show the number of objects successfully written to the current working database:
+
+        WriteResult({ "nInserted" : 1 })
+
+6.  Confirm that the `exampleCollection` collection was properly created:
+
+        show collections
+
+    The output will list all collections containing data within the current working database:
+
+        exampleCollection
+
+7.  View unfiltered data in the `exampleCollection` collection using the `find` method. This returns up to the first 20 documents in a collection, if a query is not passed:
+
+        db.exampleCollection.find()
+
+    The output will resemble the following:
+
+        { "_id" : ObjectId("571a3e7507d0fcd78baef08f"), "name" : "John Doe" }
+        { "_id" : ObjectId("571a3e8707d0fcd78baef090"), "age" : 30 }
+
+    You may notice the objects we entered are preceded by `_id` keys and `ObjectId` values. These are unique indexes generated by MongoDB when an `_id` value is not explicitly defined. `ObjectId` values can be used as primary keys when entering queries, although for ease of use, you may wish to create your own index as you would with any other database system.
+
+    The `find` method can also be used to search for a specific document or field by entering a search term parameter (in the form of an object) rather than leaving it empty. For example:
+
+        db.exampleCollection.find({"name" : "John Doe"})
+
+    Running the command above returns a list of documents containing the `{"name" : "John Doe"}` object.
+
+## Additional MongoDB Functionality
+
+As noted above, MongoDB has an available collection of language-specific drivers that can be used to interact with your databases from within non-JavaScript applications. One advantage these drivers provide is the ability to allow applications written in different languages to use the same database without the strict need for an object data mapper (ODM). If you do want to use an object data mapper, however, many well-supported ODMs are available.
+
+The `mongodb-org-tools` package we installed also includes several other tools such as `mongodump` and `mongorestore` for creating and restoring backups and snapshots, as well as `mongoimport` and `mongoexport` for importing and exporting content from extended JSON, or supported CSV or TSV files.
+
+To view the available options or how to use a particular method, append `.help()` to the end of your commands. For example, to see a list of options for the `find` method in Step 6 of [Manage Data and Collections](#manage-data-and-collections):
+
+    db.exampleCollection.find().help()
+
+
+
+
+# How to Install MongoDB on Ubuntu 16.04
+[Source](https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-16-04)
+
+### Introduction
+
+MongoDB is a free and open-source NoSQL document database used commonly in modern web applications. This tutorial will help you set up MongoDB on your server for a production application environment.
+
+As of publication time, the official Ubuntu 16.04 MongoDB packages have not yet been updated to use the new `systemd` init system [which is enabled by default on Ubuntu 16.04][1]. Running MongoDB using those packages on a clean Ubuntu 16.04 server involves following an additional step to configure MongoDB as a `systemd` service that will automatically start on boot.  
+
+## Prerequisites
+
+To follow this tutorial, you will need:
+
+## Step 1 — Adding the MongoDB Repository
+
+MongoDB is already included in Ubuntu package repositories, but the official MongoDB repository provides most up-to-date version and is the recommended way of installing the software. In this step, we will add this official repository to our server.
+
+Ubuntu ensures the authenticity of software packages by verifying that they are signed with GPG keys, so we first have to import they key for the official MongoDB repository.
+
+        * sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
+
+
+After successfully importing the key, you will see:
+
+Output
+
+
+    gpg: Total number processed: 1
+    gpg:               imported: 1  (RSA: 1)
+
+
+Next, we have to add the MongoDB repository details so `apt` will know where to download the packages from.
+
+Issue the following command to create a list file for MongoDB.
+
+        * echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
+
+
+After adding the repository details, we need to update the packages list.
+
+## Step 2 — Installing and Verifying MongoDB
+
+Now we can install the MongoDB package itself.
+
+        * sudo apt-get install -y mongodb-org
+
+
+This command will install several packages containing latest stable version of MongoDB along with helpful management tools for the MongoDB server.
+
+In order to properly launch MongoDB as a service on Ubuntu 16.04, we additionally need to create a unit file describing the service. A _unit file_ tells `systemd` how to manage a resource. The most common unit type is a _service_, which determines how to start or stop the service, when should it be automatically started at boot, and whether it is dependent on other software to run.
+
+We'll create a unit file to manage the MongoDB service. Create a configuration file named `mongodb.service` in the `/etc/systemd/system` directory using `nano` or your favorite text editor.
+
+        * sudo nano /etc/systemd/system/mongodb.service
+
+
+Paste in the following contents, then save and close the file.
+
+/etc/systemd/system/mongodb.service
+
+
+    [Unit]
+    Description=High-performance, schema-free document-oriented database
+    After=network.target
+
+    [Service]
+    User=mongodb
+    ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
+
+    [Install]
+    WantedBy=multi-user.target
+
+
+This file has a simple structure:
+
+* The **Unit** section contains the overview (e.g. a human-readable description for MongoDB service) as well as dependencies that must be satisfied before the service is started. In our case, MongoDB depends on networking already being available, hence `network.target` here.
+* The **Service** section how the service should be started. The `User` directive specifies that the server will be run under the `mongodb` user, and the `ExecStart` directive defines the startup command for MongoDB server.
+* The last section, **Install**, tells `systemd` when the service should be automatically started. The `multi-user.target` is a standard system startup sequence, which means the server will be automatically started during boot.
+
+Next, start the newly created service with `systemctl`.
+
+        * sudo systemctl start mongodb
+
+
+While there is no output to this command, you can also use `systemctl` to check that the service has started properly.
+
+        * sudo systemctl status mongodb
+
+
+Output
+
+
+    ● mongodb.service - High-performance, schema-free document-oriented database
+       Loaded: loaded (/etc/systemd/system/mongodb.service; enabled; vendor preset: enabled)
+       Active: active (running) since Mon 2016-04-25 14:57:20 EDT; 1min 30s ago
+     Main PID: 4093 (mongod)
+        Tasks: 16 (limit: 512)
+       Memory: 47.1M
+          CPU: 1.224s
+       CGroup: /system.slice/mongodb.service
+               └─4093 /usr/bin/mongod --quiet --config /etc/mongod.conf
+
+
+The last step is to enable automatically starting MongoDB when the system starts.
+
+        * sudo systemctl enable mongodb
+
+
+The MongoDB server now configured and running, and you can manage the MongoDB service using the `systemctl` command (e.g. `sudo systemctl mongodb stop`, `sudo systemctl mongodb start`).
+
+## Step 3 — Adjusting the Firewall (Optional)
+
+Assuming you have followed the [initial server setup tutorial][2] instructions to enable the firewall on your server, MongoDB server will be inaccessible from the internet.
+
+If you intend to use the MongoDB server only locally with applications running on the same server, it is a recommended and secure setting. However, if you would like to be able to connect to your MongoDB server from the internet, we have to allow the incoming connections in `ufw`.
+
+To allow access to MongoDB on its default port `27017` from everywhere, you could use `sudo ufw allow 27017`. However, enabling internet access to MongoDB server on a default installation gives unrestricted access to the whole database server.
+
+in most cases, MongoDB should be accessed only from certain trusted locations, such as another server hosting an application. To accomplish this task, you can allow access on MongoDB's default port while specifying the IP address of another server that will be explicitly allowed to connect.
+
+        * sudo ufw allow from your_other_server_ip/32 to any port 27017
+
+
+You can verify the change in firewall settings with `ufw`.
+
+You should see traffic to `27017` port allowed in the output.If you have decided to allow only a certain IP address to connect to MongoDB server, the IP address of the allowed location will be listed instead of _Anywhere_ in the output.
+
+Output
+
+
+    Status: active
+
+    To                         Action      From
+    --                         ------      ----
+    27017                      ALLOW       Anywhere
+    OpenSSH                    ALLOW       Anywhere
+    27017 (v6)                 ALLOW       Anywhere (v6)
+    OpenSSH (v6)               ALLOW       Anywhere (v6)
+
+
+
+
+[Source](https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/ "Permalink to Install MongoDB Community Edition on Ubuntu — MongoDB Manual 3.2")

+ 255 - 0
docs/db/MySQL.md

@@ -0,0 +1,255 @@
+
+#### notes:
+things I tend to forget :)
+```
+#find config file load order
+mysql --help | grep cnf
+sudo vi .my.cnf
+    [mysqd]
+    character-set-server=utfmb4
+    collation-server=utfmb4_unicode_ci
+
+```
+
+
+* 20/03/29 migrating databases
+#### Migrating Tables to InnoDB
+some tables I'm dealing with were created with MySQL v5.1 [ v5.7.29 zeke/woozer & v8.0.19 -macs ]
+
+```
+SET @DATABASE_NAME = 'name_of_db';
+
+SELECT  CONCAT('ALTER TABLE `', table_name, '` ENGINE=InnoDB;') AS sql_statements
+FROM    information_schema.tables AS tb
+WHERE   table_schema = @DATABASE_NAME
+AND     `ENGINE` = 'MyISAM'
+AND     `TABLE_TYPE` = 'BASE TABLE'
+ORDER BY table_name DESC;
+```
+
+* [https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html](https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html)   
+In MySQL 8.0, the default authentication plugin has changed from mysql_native_password to caching_sha2_password, and the 'root'@'localhost' administrative account uses caching_sha2_password by default. If you prefer that the root account use the previous default authentication plugin (mysql_native_password), see caching_sha2_password and the root Administrative Account.
+
+```sh
+cd /usr/local/mysql
+mkdir mysql-files
+chown mysql:mysql mysql-files
+chmod 750 mysql-files
+bin/mysqld --initialize --user=mysql
+
+```
+
+```
+#######  caching_sha2_password -> mysql_native_password in v8 #######
+
+mysql> ALTER USER 'pma'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
+ERROR 1726 (HY000): Storage engine 'MyISAM' does not support system tables. [mysql.db]
+
+mysql> alter table mysql.db ENGINE=InnoDB
+
+mysql> REPAIR TABLE mysql.db;
++----------+--------+----------+---------------------------------------------------------+
+| Table    | Op     | Msg_type | Msg_text                                                |
++----------+--------+----------+---------------------------------------------------------+
+| mysql.db | repair | note     | The storage engine for the table doesnt support repair
+```
+* also had to grab v5.7 via homebrew so that I could switch between versions.
+```sh
+If you need to have mysql@5.7 first in your PATH run:
+  echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.zshrc
+
+For compilers to find mysql@5.7 you may need to set:
+  export LDFLAGS="-L/usr/local/opt/mysql@5.7/lib"
+  export CPPFLAGS="-I/usr/local/opt/mysql@5.7/include"
+
+For pkg-config to find mysql@5.7 you may need to set:
+  export PKG_CONFIG_PATH="/usr/local/opt/mysql@5.7/lib/pkgconfig"
+
+To have launchd start mysql@5.7 now and restart at login:
+  brew services start mysql@5.7
+Or, if you don't want/need a background service you can just run:
+  /usr/local/opt/mysql@5.7/bin/mysql.server start
+```
+needed a new pmauser on 5.7
+```
+GRANT USAGE ON mysql.* TO 'pma'@'localhost' IDENTIFIED BY 'pmapass';
+GRANT SELECT (
+    Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv,
+    Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv,
+    File_priv, Grant_priv, References_priv, Index_priv, Alter_priv,
+    Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv,
+    Execute_priv, Repl_slave_priv, Repl_client_priv
+    ) ON mysql.user TO 'pma'@'localhost';
+GRANT SELECT ON mysql.db TO 'pma'@'localhost';
+GRANT SELECT ON mysql.host TO 'pma'@'localhost';
+GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv)
+    ON mysql.tables_priv TO 'pma'@'localhost';
+```
+
+* January 2020 Notes:  
+Migrated all of my local machines to MySQL v.8.0.19  
+Still debating MariaDB and I've chosen to stick with MySQL for the time being due to existing documentation for the various software. Had to briefly install multiple versions using Homebrew and DBengin in order to rectify some issues between versions by [defining datadir=](https://dev.mysql.com/doc/refman/8.0/en/multiple-data-directories.html).  As of MySQL 8.0.16, the server performs the tasks previously handled by mysql_upgrade. After installation of a new MySQL version, the server now automatically performs all necessary upgrade tasks at the next startup and is not dependent on the DBA invoking mysql_upgrade. All of my existing working local and remote databases are backed up by folder date on my two external drives.  
+
+[What's New is MySQL 8](https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html)  
+[MySQL 8 Release Notes](https://dev.mysql.com/doc/relnotes/mysql/8.0/en/)
+
+### commands
+
+    mysql > status  
+    mysql > exhibit
+
+
+    Access monitor: `mysql -u [username] -p;` (will prompt for password)
+
+Show all databases: `show databases;`
+
+Access database: `mysql -u [username] -p [database]` (will prompt for password)
+
+Create new database: `create database [database];`
+
+Select database: `use [database];`
+
+Determine what database is in use: `select database();`
+
+Show all tables: `show tables;`
+
+Show table structure: `describe [table];`
+
+List all indexes on a table: `show index from [table];`
+
+Create new table with columns: `CREATE TABLE [table] ([column] VARCHAR(120), [another-column] DATETIME);`
+
+Adding a column: `ALTER TABLE [table] ADD COLUMN [column] VARCHAR(120);`
+
+Adding a column with an unique, auto-incrementing ID: `ALTER TABLE [table] ADD COLUMN [column] int NOT NULL AUTO_INCREMENT PRIMARY KEY;`
+
+Inserting a record: `INSERT INTO [table] ([column], [column]) VALUES ('[value]', [value]');`
+
+MySQL function for datetime input: `NOW()`
+
+Selecting records: `SELECT * FROM [table];`
+
+Explain records: `EXPLAIN SELECT * FROM [table];`
+
+Selecting parts of records: `SELECT [column], [another-column] FROM [table];`
+
+Counting records: `SELECT COUNT([column]) FROM [table];`
+
+Counting and selecting grouped records: `SELECT *, (SELECT COUNT([column]) FROM [table]) AS count FROM [table] GROUP BY [column];`
+
+Selecting specific records: `SELECT * FROM [table] WHERE [column] = [value];` (Selectors: `<`, `>`, `!=`; combine multiple selectors with `AND`, `OR`)
+
+Select records containing `[value]`: `SELECT * FROM [table] WHERE [column] LIKE '%[value]%';`
+
+Select records starting with `[value]`: `SELECT * FROM [table] WHERE [column] LIKE '[value]%';`
+
+Select records starting with `val` and ending with `ue`: `SELECT * FROM [table] WHERE [column] LIKE '[val_ue]';`
+
+Select a range: `SELECT * FROM [table] WHERE [column] BETWEEN [value1] and [value2];`
+
+Select with custom order and only limit: `SELECT * FROM [table] WHERE [column] ORDER BY [column] ASC LIMIT [value];` (Order: `DESC`, `ASC`)
+
+Updating records: `UPDATE [table] SET [column] = '[updated-value]' WHERE [column] = [value];`
+
+Deleting records: `DELETE FROM [table] WHERE [column] = [value];`
+
+Delete *all records* from a table (without dropping the table itself): `DELETE FROM [table];`
+(This also resets the incrementing counter for auto generated columns like an id column.)
+
+Delete all records in a table: `truncate table [table];`
+
+Removing table columns: `ALTER TABLE [table] DROP COLUMN [column];`
+
+Deleting tables: `DROP TABLE [table];`
+
+Deleting databases: `DROP DATABASE [database];`
+
+Custom column output names: `SELECT [column] AS [custom-column] FROM [table];`
+
+Export a database dump (more info [here](http://stackoverflow.com/a/21091197/1815847)): `mysqldump -u [username] -p [database] > db_backup.sql`
+
+Use `--lock-tables=false` option for locked tables (more info [here](http://stackoverflow.com/a/104628/1815847)).
+
+Import a database dump (more info [here](http://stackoverflow.com/a/21091197/1815847)): `mysql -u [username] -p -h localhost [database] < db_backup.sql`
+
+Logout: `exit;`
+
+
+Aggregate functions
+-----------
+
+Select but without duplicates: `SELECT distinct name, email, acception FROM owners WHERE acception = 1 AND date >= 2015-01-01 00:00:00`
+
+Calculate total number of records: `SELECT SUM([column]) FROM [table];`
+
+Count total number of `[column]` and group by `[category-column]`: `SELECT [category-column], SUM([column]) FROM [table] GROUP BY [category-column];`
+
+Get largest value in `[column]`: `SELECT MAX([column]) FROM [table];`
+
+Get smallest value: `SELECT MIN([column]) FROM [table];`
+
+Get average value: `SELECT AVG([column]) FROM [table];`
+
+Get rounded average value and group by `[category-column]`: `SELECT [category-column], ROUND(AVG([column]), 2) FROM [table] GROUP BY [category-column];`
+
+
+Multiple tables
+-----------
+
+Select from multiple tables: `SELECT [table1].[column], [table1].[another-column], [table2].[column] FROM [table1], [table2];`
+
+Combine rows from different tables: `SELECT * FROM [table1] INNER JOIN [table2] ON [table1].[column] = [table2].[column];`
+
+Combine rows from different tables but do not require the join condition: `SELECT * FROM [table1] LEFT OUTER JOIN [table2] ON [table1].[column] = [table2].[column];` (The left table is the first table that appears in the statement.)
+
+Rename column or table using an _alias_: `SELECT [table1].[column] AS '[value]', [table2].[column] AS '[value]' FROM [table1], [table2];`
+
+
+Users functions
+-----------
+
+List all users: `SELECT User,Host FROM mysql.user;`
+
+Create new user: `CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';`
+
+Grant `ALL` access to user for `*` tables: `GRANT ALL ON database.* TO 'user'@'localhost';`
+
+##### Remote database Server   
+
+      sudo apt-get install mysql-server
+      systemctl status mysql
+      mysql_secure_installation
+      sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
+      [mysqld]
+      bind-address = [database server IP address]
+      [add] require_secure_transport = on
+
+setup ssl   
+
+      sudo mysql_ssl_rsa_setup --uid=mysql
+      sudo systemctl restart mysql
+
+check that it's listening for external connection
+
+      sudo netstat -plunt | grep mysqld
+
+make sure the port is open on the servers   
+
+      sudo ufw allow mysql
+
+      sudo iptables -L -nv --line-numbers
+      sudo iptables -I INPUT 7 -p tcp --dport 3306 -m state --state NEW -j ACCEPT
+see also [iptables](../server/iptables.md) & [UFW](../server/ufw.md)
+
+
+###Performance Tuning
+
+[https://github.com/major/MySQLTuner-perl](https://github.com/major/MySQLTuner-perl)
+
+      wget http://mysqltuner.pl/ -O mysqltuner.pl
+      perl mysqltuner.pl --host targetDNS_IP --user admin_user --pass admin_password
+
+### avoid swapping
+  [https://mariadb.com/kb/en/mariadb/configuring-swappiness/](https://mariadb.com/kb/en/mariadb/configuring-swappiness/)
+
+## MariaDB

+ 135 - 0
docs/db/PostgreSQL.md

@@ -0,0 +1,135 @@
+
+
+
+
+### PostgreSQL on Ubuntu 16.04
+
+
+Install PostgreSQL from the Ubuntu package repository:
+
+    sudo apt-get install postgresql postgresql-contrib
+
+#### Configure PostgreSQL
+
+#### Modify the Postgres Users
+
+By default, PostgreSQL will create a Linux user named `postgres` to access the database software.
+
+{: .caution}
+>
+>The `postgres` user should not be used for for other purposes (e.g. connecting to other networks). Doing so presents a serious risk to the security of your databases.
+
+1.  Change the `postgres` user's Linux password:
+
+        sudo passwd postgres
+
+2.  Issue the following commands to set a password for the `postgres` database user. Be sure to replace `newpassword` with a strong password and keep it in a secure place.
+
+        su - postgres
+        psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'newpassword';"
+
+    Note that this user is distinct from the `postgres` Linux user. The Linux user is used to access the database, and the PostgreSQL user is used to perform administrative tasks on the databases.
+
+    The password set in this step will be used to connect to the database via the network. Peer authentication will be used by default for local connections. See the [Secure Local PostgreSQL Access section](#secure-local-postgresql-access) for information about changing this setting.
+
+#### Create a Database
+
+Run the commands in this section as the `postgres` Linux user.
+
+1.  Create a sample database called `mytestdb`:
+
+        createdb mytestdb
+
+2.  Connect to the test database:
+
+        psql mytestdb
+
+3.  You will see the following output:
+
+        psql (9.5.2)
+        Type "help" for help.
+
+        mytestdb=#
+
+    This is the PostgreSQL client shell, in which you can issue SQL commands. To see a list of available commands, use the `\h` command. You may find more information on a specific command by adding it after `\h`.
+
+#### Create Tables
+
+This section contains examples which create a test database with an employee's first and last name, assigning each a unique key. When creating your own tables, you may specify as many parameters (columns) as you need and name them appropriately. Run the commands in this section from the PostgreSQL shell, opened in Step 2 of the [Create a Database](#create-a-database) section.
+
+1.  Create a table called "employees" in your test database:
+
+        CREATE TABLE employees (employee_id int, first_name varchar, last_name varchar);
+
+2.  Insert a record into the table:
+
+        INSERT INTO employees VALUES (1, 'John', 'Doe');
+
+3.  View the contents of the "employees" table:
+
+        SELECT * FROM employees;
+
+    This produces the following output:
+
+         employee_id | first_name | last_name
+        -------------+------------+-----------
+                   1 | John       | Doe
+        (1 row)
+
+4.  Exit the PostgreSQL shell by entering the `\q` command.
+
+### Create PostgreSQL Roles
+
+PostgreSQL grants database access via *roles* which are used to specify privileges. Roles can be understood as having a similar function to Linux "users." In addition, roles may also be created as a set of other roles, similar to a Linux "group." PostgreSQL roles apply globally, so you will not need to create the same role twice if you'd like to grant it access to more than one database on the same server.
+
+The example commands in this section should be run as the `postgres` Linux user.
+
+1.  Add a new user role, then a password at the prompt:
+
+        createuser examplerole --pwprompt
+
+    If you need to delete a role, you can use the `dropuser` command in place of `createuser`.
+
+2.  Connect to the database:
+
+        psql mytestdb
+
+    You'll be connected as the `postgres` database user by default.
+
+3.  From the PostgreSQL shell, enter the following to grant all privileges on the table `employees` to the user `examplerole`:
+
+        GRANT ALL ON employees TO examplerole;
+
+4.  Exit the PostgreSQL shell by entering `\q`.
+
+### Secure Local PostgreSQL Access
+
+PostgreSQL uses *peer authentication* by default. This means database connections will be granted to local system users that own or have privileges on the database being connected to. Such authentication is useful in cases where a particular system user will be running a local program (e.g. scripts, CGI/FastCGI processes owned by separate users, etc.), but for greater security, you may wish to require passwords to access your databases.
+
+Commands in this section should be run as the `postgres` Linux user unless otherwise specified.
+
+1.  Edit the `/etc/postgresql/9.5/main/pg_hba.conf` file, under the `# "local" is for Unix domain socket connections only` header:
+
+    {: .file-excerpt }
+    /etc/postgresql/9.5/main/pg_hba.conf
+    :   ~~~
+        # "local" is for Unix domain socket connections only
+        local    all        all             peer
+        ~~~
+
+    Replace `peer` with `md5` on this line to activate password authentication using an MD5 hash.
+
+2.  To enable these changes, we need to restart PostgreSQL. However, we did not grant the `postgres` user sudo privileges for security reasons. Return to the normal user shell:
+
+        exit
+
+3.  Restart PostgreSQL and switch back to the `postgres` user:
+
+        sudo service postgresql restart
+        su - postgres
+
+4.  As `postgres`, connect to the test database as the `examplerole` PostgreSQL user:
+
+        psql -U examplerole -W mytestdb
+
+    You will be prompted to enter the password for the `examplerole` user and given `psql` shell access to the database. When using a database, you may check access privileges for each of its tables with the `\z` command.

+ 289 - 0
docs/db/Redis.md

@@ -0,0 +1,289 @@
+---
+title: Redis
+---
+
+
+
+### Redis datastructures
+```
+string , list , hash , set and sorted set
+```
+#### String
+##### Set value
+```
+set <key name> <value>
+set name "hiren"
+```
+##### Get value
+```
+get <key name>
+get name #return "hiren"
+```
+##### Get value using range
+```
+getrange <key> <range>
+getrange name 0 3 #return "hire"
+```
+##### Set value using range
+```
+setrange <key> <position> <value>
+setrange name 5 RST
+```
+##### Override value
+```
+getset <key> <new value>
+getset name "Rater Santo Tara"
+```
+##### Multiset value
+```
+mset <key> <value> <key> <value>
+mset name "Rater Santo Tara" age 20
+```
+##### Increment value (only works for numbers)
+```
+incr age ## increment age by 1
+```
+##### Decrement value
+```
+decr <key>
+```
+##### Increment and decrement by specific number
+```
+incrby <key> 5
+decrby <key> 20
+```
+##### Float increment (only for integer )
+```
+incrbyfloat <key> <float value>
+```
+##### Set expire time
+```
+setex <key> <time in second> <value>
+setex name 4 hiren
+```
+##### Only set value if doesnt exits
+```
+setnx <key> <value>
+```
+##### Multi setnx
+```
+msetnx <key> <value> <key> <value>
+```
+##### Length of a value
+```
+strlen <key>
+```
+
+#### List
+##### Lpush ( Left push )
+```
+lpush <list name or key >  <value> <value>
+```
+##### Rpush ( Right push )
+```
+rpush <key or list name > <value> <value>
+```
+##### Lpushx and Rpushx (push if the list is exits)
+```
+lpushx <list name or the key > <value>
+rpushx <list name or the key > <value>
+```
+##### Length of a list
+```
+llen <list name >
+llen hiren
+```
+##### Get values
+```
+lrange <list name> <starting position> <ending position>
+```
+Tips : For grabbing whole list use starting position = 0 and ending position = -1
+
+##### Pop from left or right side
+```
+lpop <value>
+rpop <value>
+```
+##### Remove value
+```
+lrem <list name> 2 <value>
+```
+##### Insert middle
+```
+linsert <list name> before <existing value> <new value>
+linsert <list name> after <existing value> <new value>
+```
+##### Get value using index
+```
+lindex <list name> <index no>
+```
+##### Set value using index
+```
+lset <list name> <index number> <new value>
+```
+##### Trim
+```
+ltrim <list name> <starting position> <ending position>
+```
+##### List sorting
+##### Basic Sorting
+```
+sort <list key>
+```
+##### Sort with limit
+```
+sort <list key> limit <starting point> <ending point>
+```
+##### Sort descending or ascending
+```
+sort <list key> asc
+sort <list key> desc
+```
+##### Sort characters
+```
+sort <list key name> alpha
+```
+
+#### Hash
+##### Set command
+```
+hset <key> <subkey> <value>
+hset hiren age 20
+```
+##### Get command
+```
+hget <key> <subkey>
+```
+##### Get all value
+```
+hgetall <key>
+```
+##### Return only keys or values
+```
+hvals <key>
+hkeys <key>
+```
+##### Check value existence
+```
+hexits <key> <subkey>
+```
+##### Increment
+```
+hincrby <key> <subkey>
+hincrbyfloat <key> <subkey>
+```
+##### Check length
+```
+hlen <key>
+```
+##### Multiple get
+```
+hmget <key> <subkey> <subkey>
+```
+##### Multipke set
+```
+hmset <key> <subkey> <value> <subkey> <value>
+```
+##### Set if doesnt exits
+```
+hsetnx <key> <subkey> <value>
+```
+##### Delete
+```
+hdel <key> <subkey>
+```
+#### Set
+##### Add single or multiple value
+```
+sadd <set name> <value> <value>
+```
+##### Remove value
+```
+srem <set name> <value>
+```
+##### Show all members
+```
+smembers <set name>
+```
+##### CHeck if already exists or not
+```
+sismember <setname> <value>
+```
+##### Check how many item in set
+```
+scard <set name>
+```
+##### Take random item from set
+```
+sranmember <set name>
+```
+##### Take random member out of the set
+```
+spop <set name>
+```
+##### Check member defference in two set
+```
+sdiff <set name> <set name>
+```
+##### Check difference and store in new set
+```
+sdiff <new set name>  <set name> <set name>
+```
+##### Intersection(common members) in both set
+```
+sinter <set 1> <set 2>
+```
+##### Union between sets
+```
+sunion <set 1> <set 2>
+```
+##### Store union result
+```
+sunionstore  <new set >  <set 1> <set 2>
+```
+##### Move value from 1 set to another
+```
+smove <old set> <new set> <value>
+```
+
+## Other Commands
+
+##### Search all keys
+```
+keys *
+```
+##### Search using specific pattern
+```
+keys hiren*
+keys hire
+```
+##### Check if key exist
+```
+exits <key name>
+```
+##### Check type of a key
+```
+type <key name>
+```
+##### Delete key
+```
+del <key name>
+```
+##### Move to different database
+```
+move <key name>  <database number>
+move hiren 2
+```
+##### Select database
+```
+select <database number>
+select 1
+```
+##### Expire
+```
+expire <key name> <Second>
+```
+##### Time to live
+```
+ttl <keyname> <secound>
+```

+ 135 - 0
docs/editors/atom.md

@@ -0,0 +1,135 @@
+#Atom  
+[Atom text editor](https://atom.io)  
+
+
+#### My Packages
+
+[https://github.com/windhamdavid/atom-sunburst](https://github.com/windhamdavid/atom-sunburst)
+[https://atom.io/themes/atom-sunburst](https://atom.io/themes/atom-sunburst)
+
+```
+//commands I forget
+
+```
+
+#### Packages I use
+
+- [https://atom.io/packages/motepair](https://atom.io/packages/motepair)
+- [https://atom.io/packages/git-history](https://atom.io/packages/git-history)
+- [https://atom.io/packages/git-time-machine](https://atom.io/packages/git-time-machine)
+- [https://atom.io/packages/tree-view-git-status](https://atom.io/packages/tree-view-git-status)
+- [https://atom.io/packages/markdown-preview-plus](https://atom.io/packages/markdown-preview-plus)
+- [https://atom.io/packages/vim-mode-plus](https://atom.io/packages/vim-mode-plus)
+- [https://atom.io/packages/autocomplete-wordpress-hooks](https://atom.io/packages/autocomplete-wordpress-hooks)
+- [https://atom.io/packages/atom-autocomplete-php](https://atom.io/packages/atom-autocomplete-php)
+- [https://atom.io/packages/language-jade](https://atom.io/packages/language-jade)
+- [https://atom.io/packages/atom-handlebars](https://atom.io/packages/atom-handlebars)
+- [https://atom.io/packages/split-diff](https://atom.io/packages/split-diff)
+- [https://atom.io/packages/minimap-split-diff](https://atom.io/packages/minimap-split-diff)
+- [https://atom.io/packages/outline-selection](https://atom.io/packages/outline-selection)
+- [https://atom.io/packages/rails-transporter](https://atom.io/packages/rails-transporter)
+- [https://atom.io/packages/motepair](https://atom.io/packages/motepair)
+- [https://atom.io/packages/nuclide](https://atom.io/packages/nuclide)
+- [https://atom.io/packages/react-snippets](https://atom.io/packages/react-snippets)
+- [https://atom.io/packages/nuclide-test-runner-jest](https://atom.io/packages/nuclide-test-runner-jest)
+- [https://atom.io/packages/turbo-javascript](https://atom.io/packages/turbo-javascript)
+- [https://atom.io/packages/es6-javascript](https://atom.io/packages/es6-javascript)
+- [https://atom.io/packages/aligner](https://atom.io/packages/aligner)
+- [https://atom.io/packages/vue-autocomplete](https://atom.io/packages/vue-autocomplete)
+- [https://atom.io/packages/file-icons](https://atom.io/packages/file-icons)
+- [https://atom.io/packages/linter](https://atom.io/packages/linter)
+- [https://atom.io/packages/linter-ui-default](https://atom.io/packages/linter-ui-default)
+- [https://atom.io/packages/atom-beautify](https://atom.io/packages/atom-beautify)
+- [https://atom.io/packages/language-elm](https://atom.io/packages/language-elm)
+
+
+
+### Atom Keyboard Shortcuts
+[Source](https://github.com/nwinkler/atom-keyboard-shortcuts)
+
+Complete listing of all available shortcuts, consult the _Settings > Keybindings_ page in Atom.
+
+
+#### General
+
+Some general keyboard shortcuts that I use frequently.
+
+| Command | macOS | Windows | Linux | Description |
+| ------- | -------- | ------- | ----- | ----------- |
+| Preferences/Settings | `cmd-,` | `ctrl-,`  | `ctrl-,` | Opens the Preferences/Settings view |
+| Command Palette | `shift-cmd-p` | `shift-ctrl-p`  | `ctrl-shift-p` | Opens & closes the command palette |
+| Open File (Fuzzy) | `cmd-p` | `ctrl-p`<br/>or<br/>`ctrl-t`  | `ctrl-p` | Opens the Fuzzy Finder palette in which you can search and open files  |
+| Browse Open Files | `cmd-b` | `ctrl-b`  | `ctrl-b` | Browse tabs within the window  |
+| Grammar Selector | `ctrl-shift-l` | `ctrl-shift-l`  | `ctrl-shift-l` | Selects the language the file is in  |
+| Markdown Preview | `ctrl-shift-m` | `ctrl-shift-m`  | `ctrl-shift-m` | Previews the file in the Markdown format |
+| Key Binding Resolver | `cmd-.` | `ctrl-.`  | `ctrl-.` | Shows what keybindings the pressed key combination resolves to |
+| Toggle Tree View | `cmd-k cmd-b`<br/>or<br/>`cmd-\` | `ctrl-k ctrl-b`<br/>or<br/>`ctrl-\` | `ctrl-k ctrl-b`<br/>or<br/>`ctrl-\`| Toggles Atom's file Tree View |
+| Reload Atom | `ctrl-alt-cmd-l` | `alt-ctrl-r` | `alt-ctrl-r` | Reloads the Editor  |
+| Open Link | `ctrl-shift-o` |  |  | Opens up a HTTP or HTTPS link |
+| Toggle Developer Tools | `alt-cmd-i` | `ctrl-alt-i`  | `ctrl-shift-i` | Opens up the Chrome Developer Tools/Console |
+| Show Available Snippets | `alt-shift-s` | `alt-shift-s`  | `alt-shift-s` | Shows the snippets available to Atom  |
+
+
+#### Window Management
+
+| Command | macOS | Windows | Linux | Description |
+| ------- | -------- | ------- | ----- | ----------- |
+| New File | `cmd-n` | `ctrl-n`  | `ctrl-n` | Opens an empty file in a new tab |
+| New Window | `shift-cmd-n` | `ctrl-shift-n`  | `ctrl-shift-n` | Opens a new editor window |
+| Open | `cmd-o` | `ctrl-o`  | `ctrl-o` | Shows the _Open File_ dialog, which lets you select a file to open in the editor |
+| Open Folder | `cmd-shift-o` | `ctrl-shift-o`  | `ctrl-shift-o` | Shows the _Open Folder_ dialog, which lets you select a folder to add to the editor's Tree View |
+| Save | `cmd-s` | `ctrl-s`  | `ctrl-s` | Saves the currently active file |
+| Save As | `shift-cmd-s` | `ctrl-shift-s`  | `ctrl-shift-s` | Saves the currently active file under a different name  |
+| Save All | `alt-cmd-s` |  |  | Saves all changed files |
+| Close Tab | `cmd-w` |  `ctrl-w` | `ctrl-w` | Closes the currently active tab|
+| Close Window | `shift-cmd-w` | `ctrl-shift-w`  | `ctrl-shift-w` | Closes the currently active editor window  |
+
+#### Editing
+
+| Command | macOS | Windows | Linux | Description |
+| ------- | -------- | ------- | ----- | ----------- |
+| Duplicate Lines | `shift-cmd-d` | `ctrl-shift-d` | `ctrl-shift-d` | Duplicates the line of the current cursor position and creates a new line under it with the same contents |
+| Delete Line | `ctrl-shift-k` | `ctrl-shift-k` | `ctrl-shift-k` | Deletes the current line |
+| Move Line Up | `ctrl-cmd-up` | `ctrl-up`  | `ctrl-up` | Moves the contents of the current cursor position up one line. If there is a line above with content, the current lines content will swap with the one above it. |
+| Move Line Down | `ctrl-cmd-down` | `ctrl-down`  | `ctrl-down` | Moves the contents of the current cursor position down one line. If there is a line below with content, the line's content will swap with the one below it. |
+| Find/Replace | `cmd-f` | `ctrl-f`  | `ctrl-f` | Opens up the Find/Replace panel |
+| Find Next | `cmd-g` | `F3`  | `F3` | Toggles forward through the results of the current buffer in the file while the Find/Replace panel is active |
+| Find Previous | `shift-cmd-g` | `shift-F3`  | `shift-F3` | Toggles backward through the results of the current buffer in the file while the Find/Replace panel is active|
+| Find in Project | `shift-cmd-f` | `ctrl-shift-f`  | `ctrl-shift-f` | Opens the Find in Project Panel |
+| Go To Line | `ctrl-g` | `ctrl-g`  | `ctrl-g` | Opens the Go To Line panel |
+| Go To Matching Bracket | `ctrl-m` | `ctrl-m`  | `ctrl-m` | The cursor goes to the matching top bracket that the cursor is ecapsulated in  |
+| Select Line | `cmd-l` | `ctrl-l`  | `ctrl-l` | Selects the entire line the cursor's current position is in |
+| Toggle Comment | `cmd-/` | `ctrl-/`  | `ctrl-/` | Toggles the selected text into a comment of the current grammar |
+| Column Selection | `ctrl-shift-up/down` |  | `shift-alt-up/down`  | Allows to select multiple rows, where the same edit will be applied |
+| Select Same Words | `cmd-d` | `ctrl-d` | `ctrl-d` | If you select a word, and then hit the key combo for this command, Atom will select the next same word for you. Then you can either type directly (which will replace the old words) or use left or right arrow to append things.
+
+#### Various Packages
+
+These are some packages I find useful, and their most useful key bindings. A list of my favorite packages can be found [here](https://atom.io/users/nwinkler/stars).
+
+| Command | macOS | Windows | Linux | Package |
+| ------- | -------- | ------- | ----- | ----------- |
+| Block Travel up/down | `alt-up`, `alt-down` |  |  | [Block Travel](https://atom.io/packages/block-travel) |
+| Beautify | `ctrl-alt-b` |  |  | [Beautify](https://atom.io/packages/atom-beautify) |
+| Expand Abbreviation | `shift-cmd-e` | `ctrl-e` | `ctrl-e` | [Emmet](https://atom.io/packages/emmet) |
+| Incremental Search | `cmd-i` |  |  | [Incremental Search](https://atom.io/packages/incremental-search) |
+| Git Plus Menu | `shift-cmd-h` | `ctrl-shift-h` | `ctrl-shift-h` | [Git Plus](https://atom.io/packages/git-plus) |
+| Jumpy | `shift-enter` |  |  | [Jumpy](https://atom.io/packages/jumpy) |
+| Minimap Toggle | `ctrl-k ctrl-m` |  |  | [Minimap](https://atom.io/packages/minimap) |
+| Open File in Browser | `ctrl-alt-m` |  |  | [Open in Browser](https://atom.io/packages/open-in-browser) |
+| Run Script | `ctrl-cmd-i` |  |  | [Script](https://atom.io/packages/script) - Keybinding remapped from original `cmd-i` to avoid conflict with Incremental Search |
+| Open Terminal | `ctrl-alt-t` |  |  | [Term2](https://atom.io/packages/term2) |
+| Open Project | `ctrl-cmd-p` | `alt-shift-p` | `ctrl-alt-shift-p` | [Project Manager](https://atom.io/packages/project-manager) |
+| Open In | `ctrl-alt-o` |  |  | [Open In](https://atom.io/packages/open-in) |
+| Sublime Style Column Selection | `alt-mouse` |  |  | [Sublime Style Column Selection](https://atom.io/packages/Sublime-Style-Column-Selection) |
+
+#### apm
+
+`apm` is Atom's package manager, based on Node's `npm` tool.
+
+| Command | Description |
+| ------- | ----------- |
+| `apm upgrade` | Updates all locally installed packages |
+| `apm upgrade --no-confirm` | Updates all locally installed packages without asking any questions |
+| `apm stars --install` | Installs/updates all packages that you have marked as a favorite (_starred_) in your Atom.io profile |
+| `apm publish minor` | If you're developing your own package, run this in the package's directory to publish a new version of the package, increasing the minor version number by one. |

+ 509 - 0
docs/editors/bash.md

@@ -0,0 +1,509 @@
+
+### SHORTCUTS and HISTORY
+---
+
+CTRL+A  -move to beginning of line    
+CTRL+B  -moves backward one character    
+CTRL+C  -halts the current command    
+CTRL+D  -deletes one character backward or logs out of current session, similar to exit    
+CTRL+E  -moves to end of line  
+CTRL+F  -moves forward one character  
+CTRL+G  -aborts the current editing command and ring the terminal bell  
+CTRL+H  -deletes one character under cursor (same as DELETE)  
+CTRL+J  -same as RETURN  
+CTRL+K  -deletes (kill) forward to end of line  
+CTRL+L  -clears screen and redisplay the line  
+CTRL+M  -same as RETURN  
+CTRL+N  -next line in command history  
+CTRL+O  -same as RETURN, then displays next line in history file  
+CTRL+P  -previous line in command history  
+CTRL+R  -searches backward  
+CTRL+S  -searches forward  
+CTRL+T  -transposes two characters  
+CTRL+U  -kills backward from point to the beginning of line  
+CTRL+V  -makes the next character typed verbatim  
+CTRL+W  -kills the word behind the cursor  
+CTRL+X  -lists the possible filename completions of the current word  
+CTRL+Y  -retrieves (yank) last item killed  
+CTRL+Z  -stops the current command, resume with fg in the foreground or bg in the background  
+  
+ALT+B   -moves backward one word  
+ALT+D   -deletes next word  
+ALT+F   -moves forward one word  
+ALT+H   -deletes one character backward  
+ALT+T   -transposes two words  
+ALT+.   -pastes last word from the last command. Pressing it repeatedly traverses through command history.  
+ALT+U   -capitalizes every character from the current cursor position to the end of the word  
+ALT+L   -uncapitalizes every character from the current cursor position to the end of the word  
+ALT+C   -capitalizes the letter under the cursor. The cursor then moves to the end of the word.  
+ALT+R   -reverts any changes to a command you’ve pulled from your history if you’ve edited it.  
+
+BACKSPACE  -deletes one character backward
+DELETE     -deletes one character under cursor
+
+history   -shows command line history
+!!        -repeats the last command
+!n      -refers to command line 'n'
+!string -refers to command starting with 'string'
+
+exit      -logs out of current session
+
+
+
+### BASH BASICS  
+---
+env                 -displays all environment variables  
+  
+echo $SHELL         -displays the shell you're using  
+echo $BASH_VERSION  -displays bash version  
+  
+bash                -if you want to use bash (type exit to go back to your previously opened shell)  
+whereis bash        -locates the binary, source and manual-page for a command  
+which bash          -finds out which program is executed as 'bash' (default: /bin/bash, can change across environments)  
+  
+clear               -clears content on window (hide displayed lines)  
+
+
+
+### FILE COMMANDS
+
+ls                            -lists your files in current directory, ls dir to print files in a specific directory  
+ls -l                         -lists your files in 'long format', which contains the exact size of the file, who owns the file and who has the right to look at it, and when it was last modified  
+ls -a                         -lists all files in 'long format', including hidden files (name beginning with '.')  
+ln -s filename link       -creates symbolic link to file  
+touch filename              -creates or updates (edit) your file  
+cat filename                -prints file raw content (will not be interpreted)  
+any_command  filename      -'' is used to perform redirections, it will set any_command's stdout to file instead of "real stdout" (generally /dev/stdout)  
+more filename               -shows the first part of a file (move with space and type q to quit)  
+head filename               -outputs the first lines of file (default: 10 lines)  
+tail filename               -outputs the last lines of file (useful with -f option) (default: 10 lines)  
+vim filename                -opens a file in VIM (VI iMproved) text editor, will create it if it does not exist  
+mv filename1 dest         -moves a file to destination, behavior will change based on 'dest' type (dir: file is placed into dir; file: file will replace dest (tip: useful for renaming))  
+cp filename1 dest         -copies a file  
+rm filename                 -removes a file  
+find . -name name type    -searches for a file or a directory in the current directory and all its sub-directories by its name  
+diff filename1 filename2  -compares files, and shows where they differ  
+wc filename                 -tells you how many lines, words and characters there are in a file. Use -lwc (lines, word, character) to ouput only 1 of those informations  
+sort filename               -sorts the contents of a text file line by line in alphabetical order, use -n for numeric sort and -r for reversing order.  
+sort -t -k filename         -sorts the contents on specific sort key field starting from 1, using the field separator t.  
+chmod -options filename     -lets you change the read, write, and execute permissions on your files (more infos: SUID, GUID)  
+gzip filename               -compresses files using gzip algorithm  
+gunzip filename             -uncompresses files compressed by gzip  
+gzcat filename              -lets you look at gzipped file without actually having to gunzip it  
+lpr filename                -prints the file  
+lpq                           -checks out the printer queue  
+lprm jobnumber              -removes something from the printer queue  
+genscript                     -converts plain text files into postscript for printing and gives you some options for formatting  
+dvips filename              -prints .dvi files (i.e. files produced by LaTeX)  
+grep pattern filenames    -looks for the string in the files  
+grep -r pattern dir       -search recursively for pattern in directory  
+head -n file_name | tail +n   -Print nth line from file.  
+head -y lines.txt | tail +x   -want to display all the lines from x to y. This includes the xth and yth lines.  
+  
+  
+
+### DIRECTORY COMMANDS
+---
+mkdir dirname               -makes a new directory
+rmdir dirname               -remove an empty directory
+rmdir -rf dirname           -remove a non-empty directory
+mv dir1 dir2              -rename a directory from dir1 to dir2
+cd                            -changes to home
+cd ..                         -changes to the parent directory
+cd dirname                  -changes directory
+cp -r dir1 dir2           -copy dir1 into dir2 including sub-directories
+pwd                           -tells you where you currently are
+cd ~                          -changes to home.
+
+
+### SSH, SYSTEM INFO & NETWORK COMMANDS
+---
+ssh user@host            -connects to host as user  
+ssh -p port user@host  -connects to host on specified port as user  
+ssh-copy-id user@host    -adds your ssh key to host for user to enable a keyed or passwordless login  
+  
+whoami                   -returns your username  
+passwd                   -lets you change your password  
+quota -v                 -shows what your disk quota is  
+date                     -shows the current date and time  
+cal                      -shows the month's calendar  
+uptime                   -shows current uptime  
+w                        -displays whois online  
+finger user            -displays information about user  
+uname -a                 -shows kernel information  
+man command            -shows the manual for specified command  
+df                       -shows disk usage  
+du filename            -shows the disk usage of the files and directories in filename (du -s give only a total)  
+last yourUsername      -lists your last logins  
+ps -u yourusername       -lists your processes  
+kill PID               -kills the processes with the ID you gave  
+killall processname    -kill all processes with the name  
+top                      -displays your currently active processes  
+lsof                     -lists open files  
+bg                       -lists stopped or background jobs ; resume a stopped job in the background  
+fg                       -brings the most recent job in the foreground  
+fg job                 -brings job to the foreground  
+  
+ping host              -pings host and outputs results  
+whois domain           -gets whois information for domain  
+dig domain             -gets DNS information for domain  
+dig -x host            -reverses lookup host  
+wget file              -downloads file  
+
+
+
+### VARIABLES
+---
+varname=value                -defines a variable  
+varname=value command        -defines a variable to be in the environment of a particular subprocess  
+echo $varname                -checks a variable's value  
+echo $$                      -prints process ID of the current shell  
+echo $!                      -prints process ID of the most recently invoked background job  
+echo $?                      -displays the exit status of the last command  
+read varname               -reads a string from the input and assigns it to a variable   
+let varname = equation   -performs mathematical calculation using operators like +, -, *, /, %  
+export VARNAME=value         -defines an environment variable (will be available in subprocesses)  
+  
+array[0]=valA                -how to define an array  
+array[1]=valB  
+array[2]=valC  
+array=([2]=valC [0]=valA [1]=valB)  -another way  
+array=(valA valB valC)              -and another  
+  
+${array[i]}                  -displays array's value for this index. If no index is supplied, array element 0 is assumed  
+${#array[i]}                 -to find out the length of any element in the array  
+${#array[@]}                 -to find out how many values there are in the array  
+  
+declare -a                   -the variables are treated as arrays  
+declare -f                   -uses function names only  
+declare -F                   -displays function names without definitions  
+declare -i                   -the variables are treated as integers  
+declare -r                   -makes the variables read-only  
+declare -x                   -marks the variables for export via the environment  
+  
+${varname:-word}             -if varname exists and isn't null, return its value; otherwise return word  
+${varname:=word}             -if varname exists and isn't null, return its value; otherwise set it word and then return its value  
+${varname:?message}          -if varname exists and isn't null, return its value; otherwise print varname, followed by message and abort the current command or script  
+${varname:+word}             -if varname exists and isn't null, return word; otherwise return null  
+${varname:offset:length}     -performs substring expansion. It returns the substring of $varname starting at offset and up to length characters  
+  
+${variable#pattern}          -if the pattern matches the beginning of the variable's value, delete the shortest part that matches and return the rest  
+${variable##pattern}         -if the pattern matches the beginning of the variable's value, delete the longest part that matches and return the rest  
+${variable%pattern}          -if the pattern matches the end of the variable's value, delete the shortest part that matches and return the rest  
+${variable%%pattern}         -if the pattern matches the end of the variable's value, delete the longest part that matches and return the rest  
+${variable/pattern/string}   -the longest match to pattern in variable is replaced by string. Only the first match is replaced  
+${variable//pattern/string}  -the longest match to pattern in variable is replaced by string. All matches are replaced  
+  
+${#varname}                  -returns the length of the value of the variable as a character string  
+  
+*(patternlist)               -matches zero or more occurrences of the given patterns  
++(patternlist)               -matches one or more occurrences of the given patterns  
+?(patternlist)               -matches zero or one occurrence of the given patterns  
+@(patternlist)               -matches exactly one of the given patterns  
+!(patternlist)               -matches anything except one of the given patterns  
+  
+$(UNIX command)              -command substitution: runs the command and returns standard output  
+
+
+
+### FUNCTIONS
+---
+-The function refers to passed arguments by position (as if they were positional parameters), that is, $1, $2, and so forth.  
+-$@ is equal to "$1" "$2"... "$N", where N is the number of positional parameters. $-holds the number of positional parameters.  
+  
+  
+function functname() {  
+  shell commands  
+}  
+  
+unset -f functname  -deletes a function definition  
+declare -f          -displays all defined functions in your login session  
+
+
+
+
+### FLOW CONTROLS
+---
+statement1 && statement2  -and operator  
+statement1 || statement2  -or operator  
+  
+-a                        -and operator inside a test conditional expression  
+-o                        -or operator inside a test conditional expression  
+  
+#### STRINGS  
+--- 
+str1 == str2               -str1 matches str2  
+str1 != str2               -str1 does not match str2  
+str1  str2                -str1 is less than str2 (alphabetically)  
+str1  str2                -str1 is greater than str2 (alphabetically)  
+str1 \ str2               -str1 is sorted after str2  
+str1 \ str2               -str1 is sorted before str2  
+-n str1                    -str1 is not null (has length greater than 0)  
+-z str1                    -str1 is null (has length 0)  
+  
+### FILES  
+---
+-a file                   -file exists or its compilation is successful  
+-d file                   -file exists and is a directory  
+-e file                   -file exists; same -a  
+-f file                   -file exists and is a regular file (i.e., not a directory or other special type of file)  
+-r file                   -you have read permission  
+-s file                   -file exists and is not empty  
+-w file                   -your have write permission  
+-x file                   -you have execute permission on file, or directory search permission if it is a directory  
+-N file                   -file was modified since it was last read  
+-O file                   -you own file  
+-G file                   -file's group ID matches yours (or one of yours, if you are in multiple groups)  
+file1 -nt file2           -file1 is newer than file2  
+file1 -ot file2           -file1 is older than file2  
+
+#### NUMBERS
+--- 
+-lt                       -less than  
+-le                       -less than or equal  
+-eq                       -equal  
+-ge                       -greater than or equal  
+-gt                       -greater than  
+-ne                       -not equal  
+  
+if condition  
+then  
+  statements  
+[elif condition  
+  then statements...]  
+[else  
+  statements]  
+fi  
+  
+for x in {1..10}  
+do  
+  statements  
+done  
+  
+for name [in list]  
+do  
+  statements that can use $name  
+done  
+  
+for (( initialisation ; ending condition ; update ))  
+do  
+  statements...  
+done  
+  
+case expression in  
+  pattern1 )  
+    statements ;;  
+  pattern2 )  
+    statements ;;  
+esac  
+  
+select name [in list]  
+do  
+  statements that can use $name  
+done  
+  
+while condition; do  
+  statements  
+done  
+  
+until condition; do  
+  statements  
+done  
+
+
+### COMMAND-LINE PROCESSING CYCLE
+---
+
+
+-The default order for command lookup is functions, followed by built-ins, with scripts and executables last.  
+-There are three built-ins that you can use to override this order: `command`, `builtin` and `enable`.  
+  
+command  -removes alias and function lookup. Only built-ins and commands found in the search path are executed  
+builtin  -looks up only built-in commands, ignoring functions and commands found in PATH  
+enable   -enables and disables shell built-ins  
+  
+eval     -takes arguments and run them through the command-line processing steps all over again  
+
+
+
+### INPUT/OUTPUT REDIRECTORS
+---
+
+
+cmd1|cmd2  -pipe; takes standard output of cmd1 as standard input to cmd2  
+ file     -takes standard input from file  
+ file     -directs standard output to file  
+ file    -directs standard output to file; append to file if it already exists  
+|file     -forces standard output to file even if noclobber is set  
+n|file    -forces output to file from file descriptor n even if noclobber is set  
+ file    -uses file as both standard input and standard output  
+nfile    -uses file as both input and output for file descriptor n  
+nfile     -directs file descriptor n to file  
+nfile     -takes file descriptor n from file  
+nfile    -directs file description n to file; append to file if it already exists  
+n&        -duplicates standard output to file descriptor n  
+n&        -duplicates standard input from file descriptor n  
+n&m       -file descriptor n is made to be a copy of the output file descriptor  
+n&m       -file descriptor n is made to be a copy of the input file descriptor  
+&file     -directs standard output and standard error to file  
+&-        -closes the standard input  
+&-        -closes the standard output  
+n&-       -closes the ouput from file descriptor n  
+n&-       -closes the input from file descripor n  
+
+
+
+### PROCESS HANDLING
+---
+
+
+-To suspend a job, type CTRL+Z while it is running. You can also suspend a job with CTRL+Y.  
+-This is slightly different from CTRL+Z in that the process is only stopped when it attempts to read input from terminal.  
+-Of course, to interrupt a job, type CTRL+C.  
+  
+myCommand &  -runs job in the background and prompts back the shell  
+  
+jobs         -lists all jobs (use with -l to see associated PID)  
+  
+fg           -brings a background job into the foreground  
+fg %+        -brings most recently invoked background job  
+fg %-        -brings second most recently invoked background job  
+fg %N        -brings job number N  
+fg %string   -brings job whose command begins with string  
+fg %?string  -brings job whose command contains string  
+  
+kill -l               -returns a list of all signals on the system, by name and number  
+kill PID              -terminates process with specified PID  
+kill -s SIGKILL 4500  -sends a signal to force or terminate the process  
+kill -15 913          -Ending PID 913 process with signal 15 (TERM)  
+kill %1               -Where %1 is the number of job as read from 'jobs' command.  
+  
+ps           -prints a line of information about the current running login shell and any processes running under it  
+ps -a        -selects all processes with a tty except session leaders  
+  
+trap cmd sig1 sig2  -executes a command when a signal is received by the script  
+trap "" sig1 sig2   -ignores that signals  
+trap - sig1 sig2    -resets the action taken when the signal is received to the default  
+  
+disown PID|JID    -removes the process from the list of jobs  
+  
+wait                -waits until all background jobs have finished  
+
+
+
+### TIPS & TRICKS
+---
+
+
+-set an alias  
+cd; nano .bash_profile  
+ alias gentlenode='ssh admin@gentlenode.com -p 3404'  -add your alias in .bash_profile  
+  
+-to quickly go to a specific directory  
+cd; nano .bashrc  
+ shopt -s cdable_vars  
+ export websites="/Users/mac/Documents/websites"  
+  
+source .bashrc  
+cd $websites  
+
+
+
+### DEBUGGING SHELL PROGRAMS
+---
+
+
+bash -n scriptname  -don't run commands; check for syntax errors only  
+set -o noexec       -alternative (set option in script)  
+  
+bash -v scriptname  -echo commands before running them  
+set -o verbose      -alternative (set option in script)  
+  
+bash -x scriptname  -echo commands after command-line processing  
+set -o xtrace       -alternative (set option in script)  
+  
+trap 'echo $varname' EXIT  -useful when you want to print out the values of variables at the point that your script exits  
+  
+function errtrap {  
+  es=$?  
+  echo "ERROR line $1: Command exited with status $es."  
+}  
+  
+trap 'errtrap $LINENO' ERR  -is run whenever a command in the surrounding script or function exits with non-zero status  
+  
+function dbgtrap {  
+  echo "badvar is $badvar"  
+}  
+  
+trap dbgtrap DEBUG  -causes the trap code to be executed before every statement in a function or script  
+-...section of code in which the problem occurs...  
+trap - DEBUG  -turn off the DEBUG trap  
+  
+function returntrap {  
+  echo "A return occurred"  
+}  
+  
+trap returntrap RETURN  -is executed each time a shell function or a script executed with the . or source commands finishes executing  
+  
+
+### COLORS AND BACKGROUNDS 
+---
+
+-Reset  
+Color_Off='\033[0m' -Text Reset  
+  
+-Regular Colors  
+Black='\033[0;30m'  -Black  
+Red='\033[0;31m'    -Red  
+Green='\033[0;32m'  -Green  
+Yellow='\033[0;33m' -Yellow  
+Blue='\033[0;34m'   -Blue  
+Purple='\033[0;35m' -Purple  
+Cyan='\033[0;36m'   -Cyan  
+White='\033[0;97m'  -White  
+  
+-Additional colors  
+LGrey='\033[0;37m'  -Ligth Gray  
+DGrey='\033[0;90m'  -Dark Gray  
+LRed='\033[0;91m'   -Ligth Red  
+LGreen='\033[0;92m' -Ligth Green  
+LYellow='\033[0;93m'-Ligth Yellow  
+LBlue='\033[0;94m'  -Ligth Blue  
+LPurple='\033[0;95m'-Light Purple  
+LCyan='\033[0;96m'  -Ligth Cyan  
+  
+  
+-Bold  
+BBlack='\033[1;30m' -Black  
+BRed='\033[1;31m'   -Red  
+BGreen='\033[1;32m' -Green  
+BYellow='\033[1;33m'-Yellow  
+BBlue='\033[1;34m'  -Blue  
+BPurple='\033[1;35m'-Purple  
+BCyan='\033[1;36m'  -Cyan  
+BWhite='\033[1;37m' -White  
+  
+-Underline  
+UBlack='\033[4;30m' -Black  
+URed='\033[4;31m'   -Red  
+UGreen='\033[4;32m' -Green  
+UYellow='\033[4;33m'-Yellow  
+UBlue='\033[4;34m'  -Blue  
+UPurple='\033[4;35m'-Purple  
+UCyan='\033[4;36m'  -Cyan  
+UWhite='\033[4;37m' -White  
+  
+-Background  
+On_Black='\033[40m' -Black  
+On_Red='\033[41m'   -Red  
+On_Green='\033[42m' -Green  
+On_Yellow='\033[43m'-Yellow  
+On_Blue='\033[44m'  -Blue  
+On_Purple='\033[45m'-Purple  
+On_Cyan='\033[46m'  -Cyan  
+On_White='\033[47m' -White  
+  
+-Example of usage  
+echo -e "${Green}This is GREEN text${Color_Off} and normal text"  
+echo -e "${Red}${On_White}This is Red test on White background${Color_Off}"   
+  

+ 288 - 0
docs/editors/custom.md

@@ -0,0 +1,288 @@
+
+
+### my dotfiles  
+- [https://github.com/windhamdavid/dotfiles/](https://github.com/windhamdavid/dotfiles/)  
+- [https://code.davidawindham.com/david/dotfiles](https://code.davidawindham.com/david/dotfiles)  
+
+---
+
+
+#### Commands
+just the things I tend to forget.  
+
+Vim config -> [vim](vi.md)  
+Control + N = NERDTree  
+
+#### Terminal
+- Command + D - Split Window Pane
+- Shift + Command + D = Close Split Pane
+
+#### bindkey
+```sh
+### ~/.zshrc
+
+bindkey '^P' up-history
+bindkey '^N' down-history
+bindkey '^?' backward-delete-char
+bindkey '^h' backward-delete-char
+bindkey '^w' backward-kill-word
+bindkey '^r' history-incremental-search-backward
+
+bindkey '^[[A' history-substring-search-up
+bindkey '^[[B' history-substring-search-down
+bindkey "$terminfo[kcuu1]" history-substring-search-up
+bindkey "$terminfo[kcud1]" history-substring-search-down
+```
+
+#### alias  
+
+```sh
+### ~/.zshrc
+
+###### LIST ######
+alias l='ls -lFh'     #size,show type,human readable
+alias la='ls -lAFh'   #long list,show almost all,show type,human readable
+alias lr='ls -tRFh'   #sorted by date,recursive,show type,human readable
+alias lt='ls -ltFh'   #long list,sorted by date,show type,human readable
+alias ll='ls -l'      #long list
+
+###### GIT #######
+#alias zshconfig="mate ~/.zshrc"
+alias ga="git add"
+alias gaa="git add -A"
+alias gc="git commit -m '"
+alias gs="git status"
+alias gcm="git checkout master"
+alias gcd="git checkout dev"
+alias gmd="git merge dev"
+alias gpom="git push origin master"
+alias gpcm="git push code master"
+alias gpod="git push origin dev"
+alias gpcd="git push code dev"
+
+##### NPM #####
+alias nit="npm init --yes"
+alias not="npm outdated"
+alias nu="npm update"
+alias ni="npm install"
+alias nu="npm uninstall"
+alias nis="npm install --save"
+alias nus="npm uninstall --save"
+alias nid="npm install --save-dev"
+alias nud="npm uninstall --save-dev"
+alias nip="npm install --save-prod"
+alias nup="npm uninstall --save-prod"
+
+##### GULP ######
+alias gr="gulp run"
+alias gb="gulp build"
+alias gc="gulp clean"
+
+##### GOLANG ######
+alias gob='go build'
+alias goc='go clean'
+alias god='go doc'
+alias gof='go fmt'
+alias gofa='go fmt ./...'
+alias gog='go get'
+alias goi='go install'
+alias gol='go list'
+alias gom='go mod'
+alias gop='cd $GOPATH'
+alias gopb='cd $GOPATH/bin'
+alias gops='cd $GOPATH/src'
+alias gor='go run'
+alias got='go test'
+alias gov='go vet'
+
+####### BREW #########
+alias brewp='brew pin'
+alias brews='brew list -1'
+alias brewsp='brew list --pinned'
+alias bubo='brew update && brew outdated'
+alias bubc='brew upgrade && brew cleanup'
+alias bubu='bubo && bubc'
+alias bcubo='brew update && brew cask outdated'
+alias bcubc='brew cask reinstall $(brew cask outdated) && brew cleanup'
+
+####### Laravel ########
+alias pa='php artisan'
+alias pacache='php artisan cache:clear'
+alias paroutes='php artisan route:list'
+alias pavendor='php artisan vendor:publish'
+
+```
+
+### Plugins
+- [https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins)
+
+```sh
+### https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins
+plugins=(history-substring-search tmux colorize git golang gulp grunt composer bundler ruby rails textmate)
+
+```
+
+#### zsh-history-substring-search
+
+2.  Bind keyboard shortcuts to this script's functions:
+
+        # bind UP and DOWN arrow keys
+        zmodload zsh/terminfo
+        bindkey "$terminfo[kcuu1]" history-substring-search-up
+        bindkey "$terminfo[kcud1]" history-substring-search-down
+
+        # bind UP and DOWN arrow keys (compatibility fallback
+        # for Ubuntu 12.04, Fedora 21, and MacOSX 10.9 users)
+        bindkey '^[[A' history-substring-search-up
+        bindkey '^[[B' history-substring-search-down
+
+        # bind P and N for EMACS mode
+        bindkey -M emacs '^P' history-substring-search-up
+        bindkey -M emacs '^N' history-substring-search-down
+
+        # bind k and j for VI mode
+        bindkey -M vicmd 'k' history-substring-search-up
+        bindkey -M vicmd 'j' history-substring-search-down
+
+3.  Type any part of any previous command and then:
+
+    * Press the UP arrow key to select the nearest command that (1) contains
+      your query and (2) is older than the current command in the command
+      history.
+
+    * Press the DOWN arrow key to select the nearest command that (1)
+      contains your query and (2) is newer than the current command in the
+      command history.
+
+    * Press ^U (the Control and U keys simultaneously) to abort the search.
+
+4.  If a matching command spans more than one line of text, press the LEFT
+    arrow key to move the cursor away from the end of the command, and then:
+
+    * Press the UP arrow key to move the cursor to the line above.  When the
+      cursor reaches the first line of the command, pressing the UP arrow
+      key again will cause this script to perform another search.
+
+    * Press the DOWN arrow key to move the cursor to the line below.  When
+      the cursor reaches the last line of the command, pressing the DOWN
+      arrow key again will cause this script to perform another search.
+
+  ## tmux
+
+  This plugin provides aliases for [tmux](https://tmux.github.io/), the terminal multiplexer.
+  To use it add `tmux` to the plugins array in your zshrc file.
+
+  ```zsh
+  plugins=(... tmux)
+  ```
+
+  The plugin also supports the following:
+
+  - determines if tmux is installed or not, if not, prompts user to install tmux
+  - determines if the terminal supports the 256 colors or not, sets the appropriate configuration variable
+  - sets the correct local config file to use
+
+  ### Aliases
+
+  | Alias  | Command                | Description                                               |
+  | ------ | -----------------------|---------------------------------------------------------- |
+  | `ta`   | tmux attach -t         | Attach new tmux session to already running named session  |
+  | `tad`  | tmux attach -d -t      | Detach named tmux session                                 |
+  | `ts`   | tmux new-session -s    | Create a new named tmux session                           |
+  | `tl`   | tmux list-sessions     | Displays a list of running tmux sessions                  |
+  | `tksv` | tmux kill-server       | Terminate all running tmux sessions                       |
+  | `tkss` | tmux kill-session -t   | Terminate named running tmux session                      |
+  | `tmux` | `_zsh_tmux_plugin_run` | Start a new tmux session                                  |
+
+  ### Configuration Variables
+
+  | Variable                            | Description                                                                   |
+  |-------------------------------------|-------------------------------------------------------------------------------|
+  | `ZSH_TMUX_AUTOSTART`                | Automatically starts tmux (default: `false`)                                  |
+  | `ZSH_TMUX_AUTOSTART_ONCE`           | Autostart only if tmux hasn't been started previously (default: `true`)       |
+  | `ZSH_TMUX_AUTOCONNECT`              | Automatically connect to a previous session if it exits (default: `true`)     |
+  | `ZSH_TMUX_AUTOQUIT`                 | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) |
+  | `ZSH_TMUX_FIXTERM`                  | Sets `$TERM` to 256-color term or not based on current terminal support       |
+  | `ZSH_TMUX_ITERM2`                   | Sets the `-CC` option for iTerm2 tmux integration (default: `false`)          |
+  | `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `screen`)                |
+  | `ZSH_TMUX_FIXTERM_WITH_256COLOR`    | `$TERM` to use for 256-color terminals (default: `screen-256color`            |
+  | `ZSH_TMUX_CONFIG`                   | Set the configuration path (default: `$HOME/.tmux.conf`)                      |
+  | `ZSH_TMUX_UNICODE`                  | Set `tmux -u` option to support unicode                                       |
+
+### gulp / grunt
+
+autocompletion for tasks. grabs all tasks in the current directory.
+
+### Bundler
+
+- adds completion for basic bundler commands
+- adds short aliases for common bundler commands
+  - `be` aliased to `bundle exec`.
+    It also supports aliases (if `rs` is `rails server`, `be rs` will bundle-exec `rails server`).
+  - `bl` aliased to `bundle list`
+  - `bp` aliased to `bundle package`
+  - `bo` aliased to `bundle open`
+  - `bout` aliased to `bundle outdated`
+  - `bu` aliased to `bundle update`
+  - `bi` aliased to `bundle install --jobs=<cpu core count>` (only for bundler `>= 1.4.0`)
+- adds a wrapper for common gems:
+  - looks for a binstub under `./bin/` and executes it (if present)
+  - calls `bundle exec <gem executable>` otherwise
+
+Common gems wrapped by default (by name of the executable):
+`annotate`, `cap`, `capify`, `cucumber`, `foodcritic`, `guard`, `hanami`, `irb`, `jekyll`, `kitchen`, `knife`, `middleman`, `nanoc`, `pry`, `puma`, `rackup`, `rainbows`, `rake`, `rspec`, `rubocop`, `shotgun`, `sidekiq`, `spec`, `spork`, `spring`, `strainer`, `tailor`, `taps`, `thin`, `thor`, `unicorn` and `unicorn_rails`.
+
+#### Configuration
+
+Please use the exact name of the executable and not the gem name.
+
+#### Add additional gems to be wrapped
+
+Add this before the plugin-list in your `.zshrc`:
+```sh
+BUNDLED_COMMANDS=(rubocop)
+plugins=(... bundler ...)
+```
+This will add the wrapper for the `rubocop` gem (i.e. the executable).
+
+
+#### Exclude gems from being wrapped
+
+Add this before the plugin-list in your `.zshrc`:
+```sh
+UNBUNDLED_COMMANDS=(foreman spin)
+plugins=(... bundler ...)
+```
+This will exclude the `foreman` and `spin` gems (i.e. their executable) from being wrapped.
+
+#### Excluded gems
+
+These gems should not be called with `bundle exec`. Please see [issue #2923](https://github.com/ohmyzsh/ohmyzsh/pull/2923) on GitHub for clarification.
+
+`berks`
+`foreman`
+`mailcatcher`
+`rails`
+`ruby`
+`spin`
+
+---
+
+### Composer
+
+
+| Alias  | Command                                        | Description                                                                            |
+| ------ | ---------------------------------------------- | -------------------------------------------------------------------------------------- |
+| `c`    | `composer`                                     | Starts composer                                                                        |
+| `csu`  | `composer self-update`                         | Updates composer to the latest version                                                 |
+| `cu`   | `composer update`                              | Updates composer dependencies and `composer.lock` file                                 |
+| `cr`   | `composer require`                             | Adds new packages to `composer.json`                                                   |
+| `crm`  | `composer remove`                              | Removes packages from `composer.json`                                                  |
+| `ci`   | `composer install`                             | Resolves and installs dependencies from `composer.json`                                |
+| `ccp`  | `composer create-project`                      | Create new project from an existing package                                            |
+| `cdu`  | `composer dump-autoload`                       | Updates the autoloader                                                                 |
+| `cdo`  | `composer dump-autoload --optimize-autoloader` | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) |
+| `cgu`  | `composer global update`                       | Allows update command to run on COMPOSER_HOME directory                                |
+| `cgr`  | `composer global require`                      | Allows require command to run on COMPOSER_HOME directory                               |
+| `cgrm` | `composer global remove`                       | Allows remove command to run on COMPOSER_HOME directory                                |
+| `cget` | `curl -s https://getcomposer.org/installer`    | Installs composer in the current directory                                             |

+ 641 - 0
docs/editors/git.md

@@ -0,0 +1,641 @@
+# git
+* [https://git-scm.com/](https://git-scm.com/)
+
+#### notes:
+
+Sparse checkout
+* [https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/](https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/)
+```sh
+git init
+git remote add origin <url>
+git config core.sparseCheckout true
+echo "app" >> .git/info/sparse-checkout
+git pull origin master
+git checkout tags/v1.0
+```
+
+removing commit history of file   
+[https://help.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository](https://help.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository)
+```sh
+git filter-branch --force --index-filter \
+  "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \ --prune-empty --tag-name-filter cat -- --all
+git push origin --force --all
+```
+
+## Setup
+
+##### Show current configuration:
+```
+$ git config --list
+```
+##### Show repository configuration:
+```
+$ git config --local --list
+```
+
+##### Show global configuration:
+```
+$ git config --global --list
+```
+
+##### Show system configuration:
+```
+$ git config --system --list
+```
+
+##### Set a name that is identifiable for credit when review version history:
+```
+$ git config --global user.name “[firstname lastname]”
+```
+
+##### Set an email address that will be associated with each history marker:
+```
+$ git config --global user.email “[valid-email]”
+```
+
+##### Set automatic command line coloring for Git for easy reviewing:
+```
+$ git config --global color.ui auto
+```
+
+##### Set global editor for commit
+```
+$ git config --global core.editor vi
+```
+
+<hr/>
+
+## Configuration Files
+
+##### Repository specific configuration file [--local]:
+```
+<repo>/.git/config
+```
+
+##### User-specific configuration file [--global]:
+```
+~/.gitconfig
+```
+
+##### System-wide configuration file [--system]:
+```
+/etc/gitconfig
+```
+
+<hr/>
+
+## Create
+
+##### Clone an existing repository:
+
+There are two ways:
+
+Via SSH
+
+```
+$ git clone ssh://user@domain.com/repo.git
+```
+
+Via HTTP
+
+```
+$ git clone http://domain.com/user/repo.git
+```
+
+##### Create a new local repository:
+```
+$ git init
+```
+<hr/>
+## Local Changes
+
+##### Changes in working directory:
+```
+$ git status
+```
+
+##### Changes to tracked files:
+```
+$ git diff
+```
+
+##### Add all current changes to the next commit:
+```
+$ git add .
+```
+
+##### Add some changes in &lt;file&gt; to the next commit:
+```
+$ git add -p <file>
+```
+
+##### Commit all local changes in tracked files:
+```
+$ git commit -a
+```
+
+##### Commit previously staged changes:
+```
+$ git commit
+```
+
+##### Commit with message:
+```
+$ git commit -m 'message here'
+```
+
+##### Commit skipping the staging area and adding message:
+```
+$ git commit -am 'message here'
+```
+
+##### Commit to some previous date:
+```
+$ git commit --date="`date --date='n day ago'`" -am "<Commit Message Here>"
+```
+
+##### Change last commit:<br/>
+<em><sub>Don't amend published commits!</sub></em>
+
+```
+$ git commit -a --amend
+```
+
+##### Amend with last commit but use the previous commit log message
+<em><sub>Don't amend published commits!</sub></em>
+
+```shell
+$ git commit --amend --no-edit
+```
+
+##### Change committer date of last commit:
+```
+GIT_COMMITTER_DATE="date" git commit --amend
+```
+
+##### Change Author date of last commit:
+```shell
+$ git commit --amend --date="date"
+```
+
+##### Move uncommitted changes from current branch to some other branch:<br/>
+```
+$ git stash
+$ git checkout branch2
+$ git stash pop
+```
+
+##### Restore stashed changes back to current branch:
+```shell
+$ git stash apply
+```
+
+#### Restore particular stash back to current branch:
+- *{stash_number}* can be obtained from `git stash list`
+
+```shell
+$ git stash apply stash@{stash_number}
+```
+
+##### Remove the last set of stashed changes:
+```
+$ git stash drop
+```
+
+<hr/>
+
+## Search
+
+##### A text search on all files in the directory:
+```
+$ git grep "Hello"
+```
+
+##### In any version of a text search:
+```
+$ git grep "Hello" v2.5
+```
+
+<hr/>
+
+## Commit History
+
+##### Show all commits, starting with newest (it'll show the hash, author information, date of commit and title of the commit):
+```
+$ git log
+```
+
+##### Show all the commits(it'll show just the commit hash and the commit message):
+```
+$ git log --oneline
+```
+
+##### Show all commits of a specific user:
+```
+$ git log --author="username"
+```
+
+##### Show changes over time for a specific file:
+```
+$ git log -p <file>
+```
+
+##### Display commits that are present only in remote/branch in right side
+```
+$ git log --oneline <origin/master>..<remote/master> --left-right
+```
+
+##### Who changed, what and when in &lt;file&gt;:
+```
+$ git blame <file>
+```
+
+##### Show Reference log:
+```
+$ git reflog show
+```
+
+##### Delete Reference log:
+```
+$ git reflog delete
+```
+<hr/>
+
+## Branches & Tags
+
+##### List all local branches:
+```
+$ git branch
+```
+
+#### List local/remote branches
+```
+$ git branch -a
+```
+
+##### List all remote branches:
+```
+$ git branch -r
+```
+
+##### Switch HEAD branch:
+```
+$ git checkout <branch>
+```
+
+##### Checkout single file from different branch
+```
+$ git checkout <branch> -- <filename>
+```
+
+##### Create and switch new branch:
+```
+$ git checkout -b <branch>
+```
+
+#### Checkout and create a new branch from existing commit
+```
+$ git checkout <commit-hash> -b <new_branch_name>
+```
+
+##### Create a new branch based on your current HEAD:
+```
+$ git branch <new-branch>
+```
+
+##### Create a new tracking branch based on a remote branch:
+```
+$ git branch --track <new-branch> <remote-branch>
+```
+
+##### Delete a local branch:
+```
+$ git branch -d <branch>
+```
+
+##### Rename current branch to new branch name
+```shell
+$ git branch -m <new_branch_name>
+```
+
+##### Force delete a local branch:
+<em><sub>You will lose unmerged changes!</sub></em>
+
+```
+$ git branch -D <branch>
+```
+
+##### Mark the current commit with a tag:
+```
+$ git tag <tag-name>
+```
+
+##### Mark the current commit with a tag that includes a message:
+```
+$ git tag -a <tag-name>
+```
+<hr/>
+
+## Update & Publish
+
+##### List all current configured remotes:
+```
+$ git remote -v
+```
+
+##### Show information about a remote:
+```
+$ git remote show <remote>
+```
+
+##### Add new remote repository, named &lt;remote&gt;:
+```
+$ git remote add <remote> <url>
+```
+
+##### Download all changes from &lt;remote&gt;, but don't integrate into HEAD:
+```
+$ git fetch <remote>
+```
+
+##### Download changes and directly merge/integrate into HEAD:
+```
+$ git remote pull <remote> <url>
+```
+
+##### Get all changes from HEAD to local repository:
+```
+$ git pull origin master
+```
+
+##### Get all changes from HEAD to local repository without a merge:
+```
+$ git pull --rebase <remote> <branch>
+```
+
+##### Publish local changes on a remote:
+```
+$ git push remote <remote> <branch>
+```
+
+##### Delete a branch on the remote:
+```
+$ git push <remote> :<branch> (since Git v1.5.0)
+```
+OR
+```
+$ git push <remote> --delete <branch> (since Git v1.7.0)
+```
+
+##### Publish your tags:
+```
+$ git push --tags
+```
+<hr/>
+
+#### Configure the merge tool globally to meld (editor)
+```bash
+$ git config --global merge.tool meld
+```
+
+##### Use your configured merge tool to solve conflicts:
+```
+$ git mergetool
+```
+
+## Merge & Rebase
+
+##### Merge branch into your current HEAD:
+```
+$ git merge <branch>
+```
+
+##### Rebase your current HEAD onto &lt;branch&gt;:<br/>
+<em><sub>Don't rebase published commit!</sub></em>
+
+```
+$ git rebase <branch>
+```
+
+##### Abort a rebase:
+```
+$ git rebase --abort
+```
+
+##### Continue a rebase after resolving conflicts:
+```
+$ git rebase --continue
+```
+
+##### Use your editor to manually solve conflicts and (after resolving) mark file as resolved:
+```
+$ git add <resolved-file>
+```
+
+```
+$ git rm <resolved-file>
+```
+
+##### Squashing commits:
+```
+$ git rebase -i <commit-just-before-first>
+```
+
+Now replace this,
+
+```
+pick <commit_id>
+pick <commit_id2>
+pick <commit_id3>
+```
+
+to this,
+
+```
+pick <commit_id>
+squash <commit_id2>
+squash <commit_id3>
+```
+<hr/>
+
+## Undo
+
+##### Discard all local changes in your working directory:
+```
+$ git reset --hard HEAD
+```
+
+##### Get all the files out of the staging area(i.e. undo the last `git add`):
+```
+$ git reset HEAD
+```
+
+##### Discard local changes in a specific file:
+```
+$ git checkout HEAD <file>
+```
+
+##### Revert a commit (by producing a new commit with contrary changes):
+```
+$ git revert <commit>
+```
+
+##### Reset your HEAD pointer to a previous commit and discard all changes since then:
+```
+$ git reset --hard <commit>
+```
+
+##### Reset your HEAD pointer to a remote branch current state.
+```
+$ git reset --hard <remote/branch> e.g., upstream/master, origin/my-feature
+```
+
+##### Reset your HEAD pointer to a previous commit and preserve all changes as unstaged changes:
+```
+$ git reset <commit>
+```
+
+##### Reset your HEAD pointer to a previous commit and preserve uncommitted local changes:
+```
+$ git reset --keep <commit>
+```
+
+##### Remove files that were accidentally committed before they were added to .gitignore
+```
+$ git rm -r --cached .
+$ git add .
+$ git commit -m "remove xyz file"
+```
+<hr/>
+
+## Git-Flow
+Improved [Git-flow](https://github.com/petervanderdoes/gitflow-avh)
+
+### Index
+* [Setup](#setup)
+* [Getting Started](#getting-started)
+* [Features](#features)
+* [Make a Release](#make-a-release)
+* [Hotfixes](#hotfixes)
+* [Commands](#commands)
+
+<hr/>
+
+### Setup
+###### You need a working git installation as prerequisite. Git flow works on OSX, Linux and Windows.
+
+##### OSX Homebrew:
+```
+$ brew install git-flow-avh
+```
+
+##### OSX Macports:
+```
+$ port install git-flow
+```
+
+##### Linux (Debian-based):
+```
+$ sudo apt-get install git-flow
+```
+
+##### Windows (Cygwin):
+###### You need wget and util-linux to install git-flow.
+```bash
+$ wget -q -O - --no-check-certificate https://raw.githubusercontent.com/petervanderdoes/gitflow/develop/contrib/gitflow-installer.sh install <state> | bash
+```
+<hr/>
+
+### Getting Started
+###### Git flow needs to be initialized in order to customize your project setup. Start using git-flow by initializing it inside an existing git repository:
+##### Initialize:
+###### You'll have to answer a few questions regarding the naming conventions for your branches. It's recommended to use the default values.
+```shell
+git flow init
+```
+OR
+###### To use default
+```shell
+git flow init -d
+```
+<hr/>
+
+### Features
+###### Develop new features for upcoming releases. Typically exist in developers repos only.
+##### Start a new feature:
+###### This action creates a new feature branch based on 'develop' and switches to it.
+```
+git flow feature start MYFEATURE
+```
+
+##### Finish up a feature:
+###### Finish the development of a feature. This action performs the following:
+###### 1) Merged MYFEATURE into 'develop'.
+###### 2) Removes the feature branch.
+###### 3) Switches back to 'develop' branch
+```
+git flow feature finish MYFEATURE
+```
+
+##### Publish a feature:
+###### Are you developing a feature in collaboration? Publish a feature to the remote server so it can be used by other users.
+```
+git flow feature publish MYFEATURE
+```
+
+##### Getting a published feature:
+###### Get a feature published by another user.
+```
+git flow feature pull origin MYFEATURE
+```
+
+##### Tracking a origin feature:
+###### You can track a feature on origin by using
+```
+git flow feature track MYFEATURE
+```
+<hr/>
+
+### Make a Release
+###### Support preparation of a new production release. Allow for minor bug fixes and preparing meta-data for a release
+
+##### Start a release:
+###### To start a release, use the git flow release command. It creates a release branch created from the 'develop' branch. You can optionally supply a [BASE] commit sha-1 hash to start the release from. The commit must be on the 'develop' branch.
+```
+git flow release start RELEASE [BASE]
+```
+###### It's wise to publish the release branch after creating it to allow release commits by other developers. Do it similar to feature publishing with the command:
+```
+git flow release publish RELEASE
+```
+###### (You can track a remote release with the: ```git flow release track RELEASE``` command)
+
+##### Finish up a release:
+###### Finishing a release is one of the big steps in git branching. It performs several actions:
+###### 1) Merges the release branch back into 'master'
+###### 2) Tags the release with its name
+###### 3) Back-merges the release into 'develop'
+###### 4) Removes the release branch
+```
+git flow release finish RELEASE
+```
+###### Don't forget to push your tags with ```git push --tags```
+
+<hr/>
+
+### Hotfixes
+###### Hotfixes arise from the necessity to act immediately upon an undesired state of a live production version. May be branched off from the corresponding tag on the master branch that marks the production version.
+
+##### Git flow hotfix start:
+###### Like the other git flow commands, a hotfix is started with
+```
+$ git flow hotfix start VERSION [BASENAME]
+```
+###### The version argument hereby marks the new hotfix release name. Optionally you can specify a basename to start from.
+
+##### Finish a hotfix:
+###### By finishing a hotfix it gets merged back into develop and master. Additionally the master merge is tagged with the hotfix version
+```
+git flow hotfix finish VERSION
+```
+<hr/>

+ 253 - 0
docs/editors/phpstorm.md

@@ -0,0 +1,253 @@
+#PhpStorm  
+
+PHPStorm Cheat Sheet   
+
+Editing
+
+**Alt + Enter**
+
+Show intention actions and quick-fixes
+
+**Ctrl + P**
+
+Parameter info (within method call arguments)
+
+**Ctrl + Q**
+
+Quick documentation lookup
+
+**Alt + Insert**
+
+Generate code... (Getters, Setters, Constructors)
+
+**Ctrl + I**
+
+Implement methods
+
+**Ctrl + W**
+
+Select successively increasing code blocks
+
+**Ctrl + Shift + W**
+
+Decrease current selection to previous state
+
+**Ctrl + D**
+
+Duplicate current line or selected block
+
+**Ctrl + Y**
+
+Delete line at caret
+
+**Shift + Enter**
+
+Start new line
+
+**Ctrl + Shift + U**
+
+Toggle case for word at caret or selected block
+
+**Ctrl + Shift + \] / \[**
+
+Select till code block end/start
+
+**Ctrl + Delete**
+
+Delete to word end
+
+**Ctrl + Backspace**
+
+Delete to word start
+
+**Ctrl + Shift + V**
+
+Paste from history
+
+Debugging
+
+**F8**
+
+Step over
+
+**F7**
+
+Step into
+
+**Shift + F8**
+
+Step out
+
+**Alt + F8**
+
+Evaluate expression
+
+**F9**
+
+Resume program
+
+**Ctrl + F8**
+
+Toggle breakpoint
+
+**Ctrl+Shift+F8**
+
+View breakpoints
+
+Search/Replace
+
+**Ctrl + F/R**
+
+Find/Replace
+
+**F3/Shift + F3**
+
+Find next/previous
+
+**Ctrl + Shift + F/R**
+
+Find/Replace in path
+
+Usage Search
+
+**Alt + F7 / Ctrl + F7**
+
+Find usages / Find usages in file
+
+**Ctrl + Shift + F7**
+
+Highlight usages in file
+
+**Ctrl + Alt + F7**
+
+Show usages
+
+Navigation
+
+**Ctrl + N**
+
+Go to class
+
+**Ctrl + Shift + N**
+
+Go to file
+
+**Ctrl + G**
+
+Go to line
+
+**Alt + Right/Left**
+
+Go to next/previous editor tab
+
+**Ctrl + E**
+
+Recent files popup
+
+**Ctrl + Shift + Backspace**
+
+Navigate to last edit location
+
+**Ctrl + B or Ctrl + Click**
+
+Go to declaration
+
+**Ctrl + Alt + B**
+
+Go to implementation(s)
+
+**Ctrl + Shift + I**
+
+Open quick definition lookup
+
+**Ctrl + U**
+
+Go to super-method/super-class
+
+**Alt + Up/Down**
+
+Go to previous/next method
+
+**Ctrl + \] / \[**
+
+Move to code block end/start
+
+**F2 / Shift + F2**
+
+Next/previous highlighted error
+
+**F4 / Ctrl + Enter**
+
+Edit source / View source
+
+Refactoring
+
+**F5/F6**
+
+Copy/Move
+
+**Shift + F6**
+
+Rename
+
+VCS/Local History
+
+**Ctrl + K**
+
+Commit project to VCS
+
+**Ctrl + T**
+
+Update project from VCS
+
+General
+
+**Double Shift**
+
+Search everywhere
+
+**Ctrl + Tab**
+
+Switch between tabs and tool window
+
+Database (Datagrip)
+
+**Ctrl + Enter**
+
+Execute Query / Submit changes
+
+**F4 (on a foreign key)**
+
+Open foreign table
+
+**Ctrl + B**
+
+Go to declaration / Show source
+
+**Ctrl + Shift + A**
+
+Transpose - Flip orientation of columns and rows
+
+**Ctrl + Y**
+
+Delete selected row(s)
+
+**Alt + Insert**
+
+Add new row
+
+**Ctrl + D**
+
+Duplicate selected row(s)
+
+**Alt + Insert**
+
+Expand Column list (with cursor on \*)
+
+**Shift + F6**
+
+Rename symbol on query
+
+**Ctrl + Shift + Alt + N**
+
+Search symbol everywhere

+ 42 - 0
docs/editors/sublime.md

@@ -0,0 +1,42 @@
+#Sublime  
+
+### Keyboard shorcuts
+
+- `CTRL` + `SHIFT` + `p`: Command panel
+- `CTRL` + `p`: File search
+- `CTRL` + `r`: Method search inside current file
+- `CTRL` + `g`: Go to line #
+- `CTRL` + `SHIFT` + `[`: Fold code
+- `CTRL` + `SHIFT` + `]`: Unfold code
+- `ALT` + `SHIFT` + `2`: Double column/file mode
+- `ALT` + `SHIFT` + `1`: Single column/file mode
+- `CTRL` + `k` + `b`: Toggle Folders sidebar
+
+### Useful config params
+- `"draw_white_space": "all"` : Draw indentation spaces and tabs
+- `"rulers": [120]` : Draw vertical ruler at 120 characters
+- `"tab_size": 2` + `"translate_tabs_to_spaces": true` + `"detect_indentation": false`
+- `"font_size": 9.5`: Font size allows decimals for fine tunning
+- `"file_exclude_patterns": [ "*.log" ]`: Excludes certain file extensions by default from searches & folder view
+- `"folder_exclude_patterns": [ "__pycache__" ],`: Excludes folders from searches & folder view
+- `"animation_enabled": false` + `"tree_animation_enabled": false`: Disable some small animations
+- `"trim_trailing_white_space_on_save": true`: Self-explaining
+- `"font_options": ["no_italic"]`: Remove italics
+- `"enable_telemetry": "disabled"`: Privacy control
+- `"default_line_ending": "unix"`: Change line endings (`system`, `windows` (CRLF), `unix` (LF))
+
+### Useful custom keybindings
+- `{ "keys": ["ctrl+shift+r"], "command": "reveal_in_side_bar" }`
+
+### Packages and tools
+- [Package Control](https://packagecontrol.io/installation)
+- Packages
+  - [All Autocomplete](https://github.com/alienhard/SublimeAllAutocomplete)
+  - [ColorSublime](https://github.com/Colorsublime/Colorsublime-Plugin)
+  - [Git](https://github.com/kemayo/sublime-text-git/wiki)
+  - [Git Gutter](https://packagecontrol.io/packages/GitGutter)
+  - [GoSublime](https://github.com/DisposaBoy/GoSublime)
+  - [Markdown Preview](https://packagecontrol.io/packages/Markdown%20Preview)
+  - [Pretty JSON](https://github.com/dzhibas/SublimePrettyJson)
+  - [SublimeCodeIntel](https://github.com/Kronuz/SublimeCodeIntel)
+  - [Terminal](https://packagecontrol.io/packages/Terminal)

+ 141 - 0
docs/editors/subversion.md

@@ -0,0 +1,141 @@
+# Subversion  
+
+* [https://subversion.apache.org/](https://subversion.apache.org/)
+
+
+
+|     Subversion Resources    ||
+|  :----------  |  :---------- |
+|Homepage | [http://subversion.apache.org/](http://subversion.apache.org/)|
+|SVN Book | [http://svnbook.red-bean.com/](http://svnbook.red-bean.com/)|
+
+|     Subversion Components   ||
+|  :----------  |  :---------- |
+| svn | Command line program |
+| svnversion | Revision of working copy |
+| svnlook | Inspect repository |
+| svnadmin | Repository administration |
+| svndumpfilter | Filter repository stream |
+| mod_dav_svn | Apache module |
+| svnserve | SVN server (SVN protocol) |
+| svnsync | Mirror repository |
+
+| Subversion Protocols ||
+|  :----------  |  :---------- |
+| file:// | Local machine |
+| http:// | HTTP (Apache) |
+| https:// | HTTPS (SSL) |
+| svn:// | SVN (svnserve) |
+| svn%2Bssh:// | SVN over SSH |
+
+| Subversion Help ||
+|  :----------  |  :---------- |
+|$ svn help||
+| $ svn help import Show help for "import" command
+| The $ symbol is used to denote commands to be typed. ||
+
+| Subversion Repository Administration ||
+|  :----------  |  :---------- |
+|$ svnadmin create "/path/to/repository"| Create new repository |
+|$ svnadmin setlog "/path" -r 7 message.txt | Change log message for revision 7 to contents of file message.txt |
+| $ svnadmin dump "/path/to/repository" &gt; filename | Dump repository to file (backup) |
+| $ svnadmin load "/path/to/repository" &lt; filename | Load repository from file (restore) |
+
+| Subversion Property Commands ||
+|  :----------  |  :---------- |
+| $ svn proplist "/path" | List properties |
+| $ svn propset PROP VAL "/path" | Set PROP to VAL for path. |
+| $ svn propget PROP "/path" | Get value of PROP |
+| $ svn propedit PROP "/path" | Edit PROP |
+| $ svn propdel PROP "/path" | Delete PROP |
+
+
+| Subversion Checkout Working Copy ||
+|  :----------  |  :---------- |
+| $ svn checkout "/path/to/repository" | Checkout working copy into current folder |
+| $ svn checkout "/path/to/repository" "/path/to/folder" | Checkout working copy into target folder |
+
+| Subversion Update Working Copy ||
+|  :----------  |  :---------- |
+| $ svn update "/path" | Update path |
+| $ svn update -r9 "/path" | Update path to revision 9 |
+
+
+| Subversion Add Files and Folders ||
+|  :----------  |  :---------- |
+| $ svn add * | Add all items, recursively |
+| $ svn add itemname | Add itemname (if folder, adds recursively) |
+| $ svn add * --force | Force recursion into versioned directories |
+
+| Subversion Commit Changes ||
+|  :----------  |  :---------- |
+| $ svn commit "/path" | Commit changes to path |
+| $ svn commit -m "Message" "/path" | Commit with log message |
+| $ svn commit -N "/path" | Commit without recursion |
+| $ svn import "/path/to/folder" "/path" | Import and commit local folder |
+
+
+| Subversion Deleting, Copying and Moving ||
+|  :----------  |  :---------- |
+| $ svn delete "/path" | Delete path |
+| $ svn -m "Delete message" delete "/path" | Delete with log message |
+| $ svn copy "/source" "/target" | Copy source to target |
+| $ svn move "/source" "/target" | Move source to target |
+
+| Subversion Logs and Blame ||
+|  :----------  |  :---------- |
+| $ svn log "/path" | Show log messages for path |
+| $ svn blame "/path" | Show commits for path |
+
+| Subversion Revert Changes ||
+|  :----------  |  :---------- |
+| $ svn revert "/path" | Revert changes to path |
+| $ svn revert -R "/path" | Revert changes recursively |
+
+| Subversion Differences Between Files |
+|  :----------  |
+|$ svn diff "/path/file"|
+|$ svn diff "/path/file@2" "/path/file@7"|
+|$ svn diff -r 2:7 "/path/folder"|
+
+| Subversion Merge Changes ||
+|  :----------  |  :---------- |
+| $ svn merge -r2:7 "item" "/path" | Apply diff between revisions 2 and 7 of "item" to path |
+| $ svn merge "url1" "url2" "/path" | Apply diff between "url1" and "url2" to path |
+
+
+| Subversion Miscellaneous Commands ||
+|  :----------  |  :---------- |
+| $ svn resolve "/path" | Resolve conflict |
+| $ svn cleanup "/path" | Remove locks and complete operations |
+| $ svn lock "/path" | Lock path |
+| $ svn unlock "/path" | Unlock path |
+| $ svn status "/path" | Get path status |
+| $ svn cat "/path" | View file contents |
+
+
+| Subversion Item and Property Statuses ||
+|  :----------  |  :---------- |
+||No modifications (blank)|
+| A | Addition |
+| D | Deletion |
+| M | Modified |
+| R | Item replaced |
+| C | In conflict |
+| X | Externals definition |
+| I | Ignored |
+| ? | Not in repository |
+| ! | Item missing |
+| ~ | Object type changed |
+
+
+| Subversion Argument Shortcuts ||
+|  :----------  |  :---------- |
+| -m "Message" | \--message |
+| -q | \--quiet |
+| -v | \--verbose |
+| -r | \--revision |
+| -c | \--change |
+| -t | \--transaction |
+| -R | \--recursive |
+| -N |\--non-recursive  |

+ 131 - 0
docs/editors/terminal.md

@@ -0,0 +1,131 @@
+# Terminal (macOS)
+
+#### SHORTCUTS
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| Ctrl + A   | Go to the beginning of the line you are currently typing on.  This also works for most text input fields system wide.  Netbeans being one exception |
+| Ctrl + E   | Go to the end of the line you are currently typing on.  This also works for most text input fields system wide.  Netbeans being one exception |
+| Ctrl + Q   | Clears everything on current line |
+| Ctrl + L   | Clears the Screen |
+| ⌘Cmd + K |Clears the Screen |
+| Ctrl + U   | Cut everything backwards to beginning of line |
+| Ctrl + K   | Cut everything forward to end of line |
+| Ctrl + W   | Cut one word backwards using white space as delimiter |
+| Ctrl + Y   | Paste whatever was cut by the last cut command |
+| Ctrl + H   | Same as backspace |
+| Ctrl + C   | Kill whatever you are running |
+| Ctrl + D   | Exit the current shell when no process is running, or send EOF to a the running process |
+| Ctrl + Z   | Puts whatever you are running into a suspended background process. fg restores it. |
+| Ctrl + _   | Undo the last command. (Underscore.  So it's actually Ctrl + Shift + minus) |
+| Ctrl + T   | Swap the last two characters before the cursor |
+| Ctrl + F   | Move cursor one character forward |
+| Ctrl + B   | Move cursor one character backward |
+| Esc + F  | Move cursor one word forward |
+| Esc + B  | Move cursor one word backward |
+| Esc + T  | Swap the last two words before the cursor |
+| Tab  | Auto-complete files and folder names |
+
+## CORE COMMANDS
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| cd |  Home directory |
+| cd [folder] | Change directory e.g. `cd documents` |
+| cd /  | Root of drive |
+| cd -  | Previous directory |
+| ls | Short listing |
+| ls -l | Long listing |
+| ls -a | Listing incl. hidden files |
+| ls -lh| Long listing with Human readable file sizes |
+| ls -R | Entire content of folder recursively |
+| sudo [command] | Run command with the security privileges of the superuser (Super User DO) |
+| open [file] | Opens a file ( as if you double clicked it ) |
+| top | Displays active processes. Press q to quit |
+| nano [file] | Opens the file using the nano editor |
+| vim [file] | Opens the file using the vim editor |
+| clear |  Clear screen |
+| reset |  Resets the terminal display |
+
+#### CHAINING COMMANDS
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| [command-a]; [command-b] | Run command A and then B, regardless of success of A |
+| [command-a] && [command-b] | Run command B if A succeeded |
+| [command-a] || [command-b] | Run command B if A failed |
+| [command-a] & | Run command A in background |
+
+
+#### PIPING COMMANDS
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| [command-a] \| [command-b] | Run command A and then pass the result to command B e.g ps auxwww \| grep google
+|
+
+
+#### COMMAND HISTORY
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| history n |  Shows the stuff typed – add a number to limit the last n items |
+| Ctrl + r  | Interactively search through previously typed commands |
+| ![value] |  Execute the last command typed that starts with ‘value’ |
+| !! |  Execute the last command typed |
+
+#### FILE MANAGEMENT
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| touch [file] |   Create new file |
+| pwd | Full path to working directory |
+| . |  Current folder, e.g. `ls .` |
+| .. | Parent/enclosing directory, e.g. `ls ..` |
+| `ls -l ..` | Long listing of parent directory |
+| `cd ../../` | Move 2 levels up |
+| cat | Concatenate to screen |
+| rm [file] |  Remove a file, e.g. `rm data.tmp` |
+| rm -i [file] | Remove with confirmation |
+| rm -r [dir] | Remove a directory and contents |
+| rm -f [file] | Force removal without confirmation |
+| cp [file] [newfile] | Copy file to file |
+| cp [file] [dir] | Copy file to directory |
+| mv [file] [new filename] |  Move/Rename, e.g. `mv file1.ad /tmp` |
+| pbcopy < [file] | Copies file contents to clipboard |
+| pbpaste | Paste clipboard contents |
+| pbpaste > [file] | Past clipboard contents into file, `pbpaste > paste-test.txt` |
+
+#### DIRECTORY MANAGEMENT
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| mkdir [dir] | Create new directory |
+| mkdir -p [dir]/[dir] |  Create nested directories |
+| rmdir [dir] | Remove directory ( only operates on empty directories ) |
+| rm -R [dir] | Remove directory and contents |
+| [command] \| [command] | Allows to combine multiple commands that generate output, e.g. `cat data.txt | pbcopy` |
+| less |  Output content delivered in screensize chunks |
+| [command] > [file] |  Push output to file, keep in mind it will get overwritten |
+| [command] >> [file] | Append output to existing file |
+| [command] < [file] |  Tell command to read content from a file |
+
+#### SEARCH
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| find [dir] -name [search_pattern] | Search for files, e.g. `find /Users -name "file.txt"` |
+| grep [search_pattern] [file] | Search for all lines that contain the pattern, e.g. `grep "Tom" file.txt` |
+| grep -r [search_pattern] [file] | Recursively search for all lines that do not contain the pattern |
+| grep -v [search_pattern] [file] | Search for all lines that do NOT contain the pattern |
+
+#### HELP
+
+| Key/Command | Description |
+| ----------- | ----------- |
+| [command] -h |  Offers help |
+| [command] —help | Offers help |
+| info [command] | Offers help |
+| man [command] |  Show the help manual for [command] |
+| whatis [command] | Gives a one-line description of [command] |
+| apropos [search-pattern] | Searches for command with keywords in description |

+ 111 - 0
docs/editors/textmate.md

@@ -0,0 +1,111 @@
+
+
+#### tend to forget?
+column editing:   
+curser at front of line then ⇧⌥↓ to select lines   
+tap ⌥ to switch to column selection mode   
+move to the end of all lines (⌘→):   
+* [https://macromates.com/blog/2011/multiple-carets/](https://macromates.com/blog/2011/multiple-carets/)
+
+---
+
+#### TextMate Cheat Sheet
+[Source](https://gist.github.com/jqr/45264 "Permalink to TextMate Cheat Sheet · GitHub")
+
+
+|   | ⌘Command, ⇧ Shift, ⌃ Control, ⌥ Option/Alt, ⎋ Escape, ↩ Enter/Return, ⌫ Backspace, ⇥ Tab |  
+| - | ---------------------------------------------------------------------------------------- |  
+|   | Help                                                                                     |  
+|   | ⌘? Help                                                                                  |  
+|   | ⌃⌘⌥B Bundle Docs/Editor                                                                  |  
+|   |                                                                                          |  
+|   | File                                                                                     |  
+|   | ⌘S Save File                                                                             |  
+|   | ⌘W Close File                                                                            |  
+|   | ⌃⌘S Save Project                                                                         |  
+|   | ⌃⌘W Close All Tabs in Project                                                            |  
+|   | ⇧⌘W Close Project/Window                                                                 |  
+|   | ⌃⌘R Reveal in Project                                                                    |  
+|   | ⌃⇧⌘R Reveal in Finder                                                                    |  
+|   |                                                                                          |  
+|   | General                                                                                  |  
+|   | ⌃⌘⌥D Toggle Drawer                                                                       |  
+|   | ⌘T Go to File... (supports abbreviations)                                                |  
+|   | ⇧⌘T Go to Symbol... (supports abbreviations)                                             |  
+|   | ⌃ ⇧A Ack in Project                                                                      |  
+|   | ⎋ Complete                                                                               |  
+|   | ⌘L Go to Line...                                                                         |  
+|   | ⌃U Convert to Uppercase                                                                  |  
+|   | ⌃ ⇧U Convert to Lowercase                                                                |  
+|   | ⌃ ⌥U Convert to Title Case (Entire Line)                                                 |  
+|   | ⌘↩ Newline After Line                                                                    |  
+|   | ⌘] Increase Indent                                                                       |  
+|   | ⌘[ Decrease Indent                                                                       |  
+|   | ⌘⌥[ Auto Indent                                                                          |  
+|   | ⌃⇧J Join With Next Line                                                                  |  
+|   | ⌥⌫ Delete to Previous Word                                                               |  
+|   | ⌃K Delete to End of Line                                                                 |  
+|   | ⌃⇧K Delete Line                                                                          |  
+|   | ⌃⇧N Statistics for Document (Word Count)                                                 |  
+|   | ⌘⌥W Toggle Soft Warp                                                                     |  
+|   | ⌃Q Wrap Text                                                                             |  
+|   | ⌥⌘R Filter Document Through Command                                                      |  
+|   | ⌃⇧O Open Project in Terminal                                                             |  
+|   |                                                                                          |  
+|   | lorem⇥ Insert Lorem ipsum dolor...                                                       |  
+|   |                                                                                          |  
+|   | Selections                                                                               |  
+|   | ⌃W Select Word                                                                           |  
+|   | ⌘⇧L Select Line                                                                          |  
+|   | ⌘⇧B Select Enclosing Brackets                                                            |  
+|   | ⌘⌥A Edit Multiple Lines                                                                  |  
+|   | ⌥ Change to Column Selection                                                             |  
+|   | ⌥ drag Column Select                                                                     |  
+|   | ⌘⇧ arrow Move Selection                                                                  |  
+|   |                                                                                          |  
+|   | Code                                                                                     |  
+|   | ⌃_ Toggle camelCase / snake_case / PascalCase                                            |  
+|   | ⌘/ Toggle Comment                                                                        |  
+|   | ⌃" Toggle Quotes                                                                         |  
+|   | ⌃H Docs for Language                                                                     |  
+|   | ⇧↩ New Method                                                                            |  
+|   | ⌃⇧T FIXME/TODO/CHANGED                                                                   |  
+|   | ⌃↩ Descriptive Newline                                                                   |  
+|   | ⌘⌥↩ Insert Semicolon at End of Line                                                      |  
+|   | if⇥ If Statement                                                                         |  
+|   | ife⇥ If Else Statement                                                                   |  
+|   |                                                                                          |  
+|   | :⇥ Key Value pair                                                                        |  
+|   |                                                                                          |  
+|   | Ruby on Rails                                                                            |  
+|   | ⌃H Ruby and Ruby on Rails Docs                                                           |  
+|   | %{ Toggle Block Style (do..end / {})                                                     |  
+|   | ⌘⇧H Create Partial from Selection                                                        |  
+|   | ⌃⇧M Quick Migration                                                                      |  
+|   | ⌃L Hash Arrow                                                                            |  
+|   |                                                                                          |  
+|   | cla⇥ Class Definitions                                                                   |  
+|   | mod⇥ Module Definitions                                                                  |  
+|   | ea⇥ Each                                                                                 |  
+|   | resources⇥ Create Resource Controller                                                    |  
+|   |                                                                                          |  
+|   | mcol⇥ Modify Column                                                                      |  
+|   | mtab⇥ Modify Table                                                                       |  
+|   | mind⇥ Modify Indexes                                                                     |  
+|   | dir⇥ File.dirname(__FILE__)                                                              |  
+|   |                                                                                          |  
+|   | Javascript                                                                               |  
+|   | :⇥ Key "value" pair                                                                      |  
+|   | :,⇥ Key Value pair                                                                       |  
+|   | f⇥ Anonymous Function                                                                    |  
+|   | :f⇥ Object Method                                                                        |  
+|   |                                                                                          |  
+|   | HTML                                                                                     |  
+|   | ⌃&lt; Insert Open/Close Tag                                                                 |  
+|   | ⌃H Lookup W3 Docs                                                                        |  
+|   | ⌘⌥. Insert Close Tag                                                                     |  
+|   | ⌘&amp; Url/Entity Encode/Decode                                                              |  
+|   | ⌃⇧W Wrap in Tag                                                                          |  
+|   |                                                                                          |  
+|   | doctype⇥ Insert Doctype                                                                  |  
+|   | !⇥ Conditional Comments                                                                  |  

+ 233 - 0
docs/editors/unix.md

@@ -0,0 +1,233 @@
+
+
+## Commands
+
+### Files
+
+* **ls** \--- lists your files   
+**ls -l** \--- lists your files in 'long format', which contains lots of useful information, e.g. the exact size of the file, who owns the file and who has the right to look at it, and when it was last modified.   
+**ls -a ** \--- lists all files, including the ones whose filenames begin in a dot, which you do not always want to see.   
+There are many more options, for example to list files by size, by date, recursively etc.
+* **more _filename_** \--- shows the first part of a file, just as much as will fit on one screen. Just hit the space bar to see more or **q** to quit. You can use **/_pattern_** to search for a pattern.
+* **emacs _filename_** \--- is an editor that lets you create and edit a file. See the [emacs page][3].
+* **mv _filename1 filename2_** \--- moves a file (i.e. gives it a different name, or moves it into a different directory (see below)
+* **cp _filename1 filename2_** \--- copies a file
+* **rm _filename_** \--- removes a file. It is wise to use the option rm -i, which will ask you for confirmation before actually deleting anything. You can make this your default by making an [alias][4] in your .cshrc file.
+* **diff _filename1 filename2_** \--- compares files, and shows where they differ
+* **wc _filename_** \--- tells you how many lines, words, and characters there are in a file
+* **chmod _options filename_** \--- lets you change the read, write, and execute permissions on your files. The default is that only you can look at them and change them, but you may sometimes want to change these permissions. For example, **chmod o+r _filename_** will make the file readable for everyone, and **chmod o-r _filename_** will make it unreadable for others again. Note that for someone to be able to actually look at the file the directories it is in need to be at least executable. See [help protection][5] for more details.
+* File Compression
+    * **gzip _filename_** \--- compresses files, so that they take up much less space. Usually text files compress to about half their original size, but it depends very much on the size of the file and the nature of the contents. There are other tools for this purpose, too (e.g. **compress**), but gzip usually gives the highest compression rate. Gzip produces files with the ending '.gz' appended to the original filename.
+    * **gunzip _filename_** \--- uncompresses files compressed by gzip.
+    * **gzcat _filename_** \--- lets you look at a gzipped file without actually having to gunzip it (same as **gunzip -c**). You can even print it directly, using **gzcat _filename_ | lpr**
+* printing
+    * **lpr _filename_** \--- print. Use the -P option to specify the printer name if you want to use a printer other than your default printer. For example, if you want to print double-sided, use 'lpr -Pvalkyr-d', or if you're at CSLI, you may want to use 'lpr -Pcord115-d'. See 'help printers' for more information about printers and their locations.
+    * **lpq** \--- check out the printer queue, e.g. to get the number needed for removal, or to see how many other files will be printed before yours will come out
+    * **lprm _jobnumber_** \--- remove something from the printer queue. You can find the job number by using lpq. Theoretically you also have to specify a printer name, but this isn't necessary as long as you use your default printer in the department.
+    * **genscript** \--- converts plain text files into postscript for printing, and gives you some options for formatting. Consider making an alias like **alias ecop 'genscript -2 -r !* | lpr -h -Pvalkyr'** to print two pages on one piece of paper.
+    * **dvips _filename_** \--- print **.dvi** files (i.e. files produced by LaTeX). You can use **dviselect** to print only selected pages. See the [LaTeX page][6] for more information about how to save paper when printing drafts.
+
+### Directories
+
+Directories, like folders on a Macintosh, are used to group files together in a hierarchical structure.
+
+* **mkdir _dirname_** \--- make a new directory
+* **cd _dirname_** \--- change directory. You basically 'go' to another directory, and you will see the files in that directory when you do 'ls'. You always start out in your 'home directory', and you can get back there by typing 'cd' without arguments. 'cd ..' will get you one level up from your current position. You don't have to walk along step by step - you can make big leaps or avoid walking around by specifying [pathnames][7].
+* **pwd** \--- tells you where you currently are.
+
+### Finding things
+
+* **ff** \--- find files anywhere on the system. This can be extremely useful if you've forgotten in which directory you put a file, but do remember the name. In fact, if you use **ff -p** you don't even need the full name, just the beginning. This can also be useful for finding other things on the system, e.g. documentation.
+* **grep _string filename(s)_** \--- looks for the string in the files. This can be useful a lot of purposes, e.g. finding the right file among many, figuring out which is the right version of something, and even doing serious corpus work. grep comes in several varieties (**grep**, **egrep**, and **fgrep**) and has a lot of very flexible options. Check out the man pages if this sounds good to you.
+
+### About other people
+
+* **w** \--- tells you who's logged in, and what they're doing. Especially useful: the 'idle' part. This allows you to see whether they're actually sitting there typing away at their keyboards right at the moment.
+* **who** \--- tells you who's logged on, and where they're coming from. Useful if you're looking for someone who's actually physically in the same building as you, or in some other particular location.
+* **finger _username_** \--- gives you lots of information about that user, e.g. when they last read their mail and whether they're logged in. Often people put other practical information, such as phone numbers and addresses, in a file called **.plan**. This information is also displayed by 'finger'.
+* **last -1 _username_** \--- tells you when the user last logged on and off and from where. Without any options, **last** will give you a list of everyone's logins.
+* **talk _username_** \--- lets you have a (typed) conversation with another user
+* **write _username_** \--- lets you exchange one-line messages with another user
+* **elm** \--- lets you send e-mail messages to people around the world (and, of course, read them). It's not the only mailer you can use, but the one we recommend. See the [elm page][8], and find out about the departmental [ mailing lists][9] (which you can also find in /user/linguistics/helpfile).
+
+### About your (electronic) self
+
+* **whoami** \--- returns your username. Sounds useless, but isn't. You may need to find out who it is who forgot to log out somewhere, and make sure *you* have logged out.
+* **finger** & .plan files   
+of course you can finger yourself, too. That can be useful e.g. as a quick check whether you got new mail. Try to create a useful .plan file soon. Look at other people's .plan files for ideas. The file needs to be readable for everyone in order to be visible through 'finger'. Do 'chmod a+r .plan' if necessary. You should realize that this information is accessible from anywhere in the world, not just to other people on turing.
+* **passwd** \--- lets you change your password, which you should do regularly (at least once a year). See the [LRB guide][10] and/or look at [help password][11].
+* **ps -u _yourusername_** \--- lists your processes. Contains lots of information about them, including the process ID, which you need if you have to kill a process. Normally, when you have been kicked out of a dialin session or have otherwise managed to get yourself disconnected abruptly, this list will contain the processes you need to kill. Those may include the shell (tcsh or whatever you're using), and anything you were running, for example emacs or elm. Be careful not to kill your current shell - the one with the number closer to the one of the ps command you're currently running. But if it happens, don't panic. Just try again :) If you're using an X-display you may have to kill some X processes before you can start them again. These will show only when you use **ps -efl**, because they're root processes.
+* **kill _PID_** \--- kills (ends) the processes with the ID you gave. This works only for your own processes, of course. Get the ID by using **ps**. If the process doesn't 'die' properly, use the option -9. But attempt without that option first, because it doesn't give the process a chance to finish possibly important business before dying. You may need to kill processes for example if your modem connection was interrupted and you didn't get logged out properly, which sometimes happens.
+* **quota -v** \--- show what your disk quota is (i.e. how much space you have to store files), how much you're actually using, and in case you've exceeded your quota (which you'll be given an automatic warning about by the system) how much time you have left to sort them out (by deleting or gzipping some, or moving them to your own computer).
+* **du _filename_** \--- shows the disk usage of the files and directories in _filename_ (without argument the current directory is used). **du -s** gives only a total.
+* **last _yourusername_** \--- lists your last logins. Can be a useful memory aid for when you were where, how long you've been working for, and keeping track of your phonebill if you're making a non-local phonecall for dialling in.  
+
+
+
+```
+du -hsx * | sort -rh | head -10
+
+* du command -h option : display file sizes in human readable format.
+* du command -s option : Show total for each argument.
+* du command -x option : Skip directories. (if on different file systems)
+* sort command -r option : Reverse the result of comparisons.
+* sort command -h option : Compare the numbers.
+* head command -10 OR -n 10 option : Displays the first 10 lines of the output.
+
+```
+find the largest files & directories on Linux per directory (cd to /path/)
+
+    find . -regextype posix-egrep -regex ".*(rb|js)$"
+
+Find all files ending in .rb or .js.
+
+    find . -name "*js" -o -name "*rb"
+
+Same as above, not using regular expressions.
+
+    find . -regextype posix-ergep -regex ".*(rb|js)$" -exec grep -l matchNameHere {} \;
+
+Find all files ending in .rb or .js, then search those files for 'matchNameHere'. The -l option prints the line number of the occurance. (http://www.devdaily.com/unix/edu/examples/find.shtml)
+
+    find ~/some/directory -name "*rb" -exec basename {} \;
+
+Find all files ending in .rb, then print a list of filenames (no paths). **Note that the '\;' is mandatory, it tells find where to stop the command execution**
+
+### sed
+
+    ls *.rb | awk '{print("mv "$1" "$1)}' | sed 's/\.rb/_service\.rb/2' | /bin/sh
+
+Batch rename all files matching a pattern, insert the `_service` before the file suffix
+
+    find /some/path -name "*rb" -o -name "*yml" | xargs grep -sl "some_phrase" | xargs sed -i -e 's/some_phrase/replacement_phrase'
+
+Find all files ending in *rb or *yml, then grep those files for *some_phrase*, then replace those instances using sed
+
+    cat /some/file.txt | awk '{print "mkdir /path/to/"$0""}' | /bin/sh
+
+Read input from file, pipe to awk to generate a system command, then execute it.
+
+##### display file with line numbers  
+    cat file -n
+
+##### display gzipped file with line numbers  
+    zcat file | cat -n
+
+##### display file from the i. line to j. line (that is j minus i there)
+    cat file | head -n j | tail -n j-i
+
+##### remove first line of the file (efficient)
+    tail -n +2 file > new_file
+
+##### remove first line of the file (less efficient)
+    sed 1d file > newfile
+
+##### count how many lines of a file contain a pattern
+    cat file | grep pattern | wc -l
+    grep pattern -c file
+
+##### select non-matching lines
+    cat file | grep -v pattern
+
+##### get the number of the first line where a pattern occur
+    cat file -n | grep pattern -m 1 | cut -f1 | tr -d ' '
+
+##### display N lines after, before, around pattern
+    grep -A N pattern file
+    grep -B N pattern file
+    grep -C N pattern file
+
+##### display N lines around pattern (only first appearance, useful if you know that pattern is unique)
+    grep -m 1 -C N pattern file
+
+##### adding together two (or more) files and create a new file from the result
+    cat file1 file2 > newfile
+
+##### create new compressed tar archive
+    tar -zcvf archive.tar.gz dirname
+
+##### extract from tar archive
+    tar -xzf archive.tar.gz
+
+##### view an tar archive
+    tar tvf archive.tar.gz
+
+##### extract tar.bz2
+    tar jxf filename.tar.bz2
+
+##### add user
+    sudo adduser <username>
+
+##### add group
+    sudo groupadd <groupname>
+
+##### add existing user to group
+    sudo usermod -a -G <groupname> <username>
+
+##### add a user to multiple groups
+    sudo usermod -a -G <groupname1>,<groupname2>,<groupname3> <username>
+
+##### view user's group assignemnts
+    id <username>
+    groups <username>
+
+##### make a directory accessible for a group
+##### change group of all files/directories recursively
+    sudo chgrp -R <groupname> directory
+##### add write permissions to group
+    sudo chmod -R g+w directory
+##### set "GID", so that all new files and directories created under directory are owned by the group
+    sudo find directory -type d -exec chmod 2775 {} \;
+
+##### randomize lines of a big file memory efficiently
+    uuid -v 4 -n $(wc -l < lines.txt) | paste - lines.txt | sort | cut -f2 > lines_random.txt
+
+##### change hostname
+    sudo vim /etc/hostname -> change old name to new name
+    sudo vim /etc/hosts -> change old name to new name
+    sudo /etc/init.d/hostname restart
+
+##### search a device for bad blocks
+    sudo badblocks -v <device_name>
+    sudo badblocks -v /dev/md2
+
+##### renice (reset priority of processgroup): niceness: 0 (normal) - 19 (low)
+    sudo renice -n <niceness> -g <pid>
+
+##### count and filter csv files
+##### remove header (first line), the separator in csv file is ","; count the rows where the value in the second column is above a threshold value (4.5)
+    tail -n +2 file.csv | awk -F "," '$2 >= <my threshold value>' | wc -l
+
+##### pg_dump ssh tunnel
+    ssh -o "Compression=no" mydbserver "pg_dump -Fc -Z9 -U postgres mydb" > mydb.dump
+
+##### generate random password
+##### of course there are tons of ways to do this
+##### you can replace 32 with the desired password length
+    < /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c${1:-32};echo;
+
+##### force the user to change their password upon next login
+    sudo chage -d 0 <username>
+
+##### server shutdown
+    sudo shutdown -h now
+    sudo poweroff
+
+##### encrypt/decrypt file with openssl
+    openssl aes-256-cbc -salt -in <file> -out <encrypted_file> -k <passphrase>
+    openssl aes-256-cbc -d -in <encrypted_file> -out <file> -k <passphrase>
+
+##### generate your dhparam.pem file
+    openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
+
+##### search for pattern in codebase
+    grep -inIEr --color=ALWAYS "<pattern_to_search>" .
+
+##### copy directory tree recursively without overwrite
+    rsync -a -v --ignore-existing <src_dir> <dst_dir>
+
+##### find processes with most memory usage
+    ps -e -orss,%mem,cputime,%cpu,pid,args | sort -b -k1,1n | pr -TW$COLUMNS
+
+##### find processes with maximum file descriptors
+    lsof -Fpcn | nawk '/^p/ { pid=substr($0,2) } /^c/ { cmd=substr($0,2) } /^n/ { fd[cmd"["pid"]"]++ } END  { for (cc in fd) printf("%-30s %i\n",cc,fd[cc]) } ' | sort -n -k 2 | tail -30

+ 288 - 0
docs/editors/vi.md

@@ -0,0 +1,288 @@
+# Vim
+
+```
+vimdiff file file
+cntl+n (for Nerdtree in Vim)
+```
+
+#### Configuration
+[https://github.com/windhamdavid/dotfiles/blob/master/macs.local/.vimrc](https://github.com/windhamdavid/dotfiles/blob/master/macs.local/.vimrc)  
+[https://github.com/VundleVim/Vundle.vim](https://github.com/VundleVim/Vundle.vim)  
+[https://github.com/scrooloose/nerdtree](https://github.com/scrooloose/nerdtree)
+[https://github.com/Xuyuanp/nerdtree-git-plugin](https://github.com/Xuyuanp/nerdtree-git-plugin)
+
+#### vi cheatsheets
+
+[![vi-2](/img/vim2.png)](/img/vim2.png)
+[![vi-1](/img/vim-1.png)](/img/vim-1.png)
+
+
+
+## Vim Cheatsheet
+
+
+#### Global
+```bash
+:help keyword # open help for keyword
+:o file       # open file
+:saveas file  # save file as
+:close        # close current pane
+```
+
+#### Cursor movement
+```bash
+h        # move cursor left
+j        # move cursor down
+k        # move cursor up
+l        # move cursor right
+H        # move to top of screen
+M        # move to middle of screen
+L        # move to bottom of screen
+w        # jump forwards to the start of a word
+W        # jump forwards to the start of a word (words can contain punctuation)
+e        # jump forwards to the end of a word
+E        # jump forwards to the end of a word (words can contain punctuation)
+b        # jump backwards to the start of a word
+B        # jump backwards to the start of a word (words can contain punctuation)
+0        # jump to the start of the line
+^        # jump to the first non-blank character of the line
+$        # jump to the end of the line
+g_       # jump to the last non-blank character of the line
+gg       # go to the first line of the document
+G        # go to the last line of the document
+5G       # go to line 5
+fx       # jump to next occurrence of character x
+tx       # jump to before next occurrence of character x
+}        # jump to next paragraph (or function/block, when editing code)
+{        # jump to previous paragraph (or function/block, when editing code)
+zz       # center cursor on screen
+Ctrl + b # move back one full screen
+Ctrl + f # move forward one full screen
+Ctrl + d # move forward 1/2 a screen
+Ctrl + u # move back 1/2 a screen
+```
+
+#### Insert mode - inserting/appending text
+```bash
+i        # insert before the cursor
+I        # insert at the beginning of the line
+a        # insert (append) after the cursor
+A        # insert (append) at the end of the line
+o        # append (open) a new line below the current line
+O        # append (open) a new line above the current line
+ea       # insert (append) at the end of the word
+Esc      # exit insert mode
+```
+
+#### Editing
+```bash
+r        # replace a single character
+J        # join line below to the current one
+cc       # change (replace) entire line
+cw       # change (replace) to the end of the word
+c$       # change (replace) to the end of the line
+s        # delete character and substitute text
+S        # delete line and substitute text (same as cc)
+xp       # transpose two letters (delete and paste)
+.        # repeat last command
+u        # undo
+Ctrl + r # redo
+```
+
+#### Marking text (visual mode)
+```bash
+v        # start visual mode, mark lines, then do a command (like y-yank)
+V        # start linewise visual mode
+o        # move to other end of marked area
+O        # move to other corner of block
+aw       # mark a word
+ab       # a block with ()
+aB       # a block with {}
+ib       # inner block with ()
+iB       # inner block with {}
+Esc      # exit visual mode
+Ctrl + v # start visual block mode
+```
+
+#### Visual commands
+```bash
+>       # shift text right
+<       # shift text left
+y       # yank (copy) marked text
+d       # delete marked text
+~       # switch case
+```
+
+#### Cut and paste
+```bash
+yy       # yank (copy) a line
+2yy      # yank (copy) 2 lines
+yw       # yank (copy) the characters of the word from the cursor position to the start of the next word
+y$       # yank (copy) to end of line
+p        # put (paste) the clipboard after cursor
+P        # put (paste) before cursor
+dd       # delete (cut) a line
+2dd      # delete (cut) 2 lines
+dw       # delete (cut) the characters of the word from the cursor position to the start of the next word
+D        # delete (cut) to the end of the line
+d$       # delete (cut) to the end of the line
+x        # delete (cut) character
+```
+
+#### Search and replace
+```bash
+/pattern       # search for pattern
+?pattern       # search backward for pattern
+\vpattern      # 'very magic' pattern: non-alphanumeric characters are interpreted as special regex symbols (no escaping needed)
+n              # repeat search in same direction
+N              # repeat search in opposite direction
+:%s/old/new/g  # replace all old with new throughout file
+:%s/old/new/gc # replace all old with new throughout file with confirmations
+:noh           # remove highlighting of search matches
+```
+
+#### Search in multiple files
+```bash
+:vimgrep /pattern/ {file} # search for pattern in multiple files
+:cn                       # jump to the next match
+:cp                       # jump to the previous match
+:copen                    # open a window containing the list of matches
+```
+
+#### Exiting
+```bash
+:w              # write (save) the file, but don't exit
+:w !sudo tee %  # write out the current file using sudo
+:wq or :x or ZZ # write (save) and quit
+:q              # quit (fails if there are unsaved changes)
+:q! or ZQ       # quit and throw away unsaved changes
+```
+
+#### Working with multiple files
+```bash
+:e file       # edit a file in a new buffer
+:bnext or :bn # go to the next buffer
+:bprev or :bp # go to the previous buffer
+:bd           # delete a buffer (close a file)
+:ls           # list all open buffers
+:sp file      # open a file in a new buffer and split window
+:vsp file     # open a file in a new buffer and vertically split window
+Ctrl + ws     # split window
+Ctrl + ww     # switch windows
+Ctrl + wq     # quit a window
+Ctrl + wv     # split window vertically
+Ctrl + wh     # move cursor to the left window (vertical split)
+Ctrl + wl     # move cursor to the right window (vertical split)
+Ctrl + wj     # move cursor to the window below (horizontal split)
+Ctrl + wk     # move cursor to the window above (horizontal split)
+```
+
+#### Tabs
+```bash
+:tabnew or :tabnew file # open a file in a new tab
+Ctrl + wT               # move the current split window into its own tab
+gt or :tabnext or :tabn # move to the next tab
+gT or :tabprev or :tabp # move to the previous tab
+<number>gt              # move to tab <number>
+:tabmove <number>       # move current tab to the <number>th position (indexed from 0)
+:tabclose or :tabc      # close the current tab and all its windows
+:tabonly or :tabo       # close all tabs except for the current one
+:tabdo command          # run the command on all tabs (e.g. :tabdo q - closes all opened tabs)
+```
+
+#### NERDTree
+    o.......Open files, directories and bookmarks....................|NERDTree-o|
+    go......Open selected file, but leave cursor in the NERDTree.....|NERDTree-go|
+    t.......Open selected node/bookmark in a new tab.................|NERDTree-t|
+    T.......Same as 't' but keep the focus on the current tab........|NERDTree-T|
+    i.......Open selected file in a split window.....................|NERDTree-i|
+    gi......Same as i, but leave the cursor on the NERDTree..........|NERDTree-gi|
+    s.......Open selected file in a new vsplit.......................|NERDTree-s|
+    gs......Same as s, but leave the cursor on the NERDTree..........|NERDTree-gs|
+    O.......Recursively open the selected directory..................|NERDTree-O|
+    x.......Close the current nodes parent...........................|NERDTree-x|
+    X.......Recursively close all children of the current node.......|NERDTree-X|
+    e.......Edit the current dif.....................................|NERDTree-e|
+
+    <CR>...............same as |NERDTree-o|.
+    double-click.......same as the |NERDTree-o| map.
+    middle-click.......same as |NERDTree-i| for files, same as
+                      |NERDTree-e| for dirs.
+
+    D.......Delete the current bookmark .............................|NERDTree-D|
+
+    P.......Jump to the root node....................................|NERDTree-P|
+    p.......Jump to current nodes parent.............................|NERDTree-p|
+    K.......Jump up inside directories at the current tree depth.....|NERDTree-K|
+    J.......Jump down inside directories at the current tree depth...|NERDTree-J|
+    <C-J>...Jump down to the next sibling of the current directory...|NERDTree-C-J|
+    <C-K>...Jump up to the previous sibling of the current directory.|NERDTree-C-K|
+
+    C.......Change the tree root to the selected dir.................|NERDTree-C|
+    u.......Move the tree root up one directory......................|NERDTree-u|
+    U.......Same as 'u' except the old root node is left open........|NERDTree-U|
+    r.......Recursively refresh the current directory................|NERDTree-r|
+    R.......Recursively refresh the current root.....................|NERDTree-R|
+    m.......Display the NERD tree menu...............................|NERDTree-m|
+    cd......Change the CWD to the dir of the selected node...........|NERDTree-cd|
+
+    I.......Toggle whether hidden files displayed....................|NERDTree-I|
+    f.......Toggle whether the file filters are used.................|NERDTree-f|
+    F.......Toggle whether files are displayed.......................|NERDTree-F|
+    B.......Toggle whether the bookmark table is displayed...........|NERDTree-B|
+
+    q.......Close the NERDTree window................................|NERDTree-q|
+    A.......Zoom (maximize/minimize) the NERDTree window.............|NERDTree-A|
+    ?.......Toggle the display of the quick help.....................|NERDTree-?|
+	 
+	 
+	 
+### vimdiff cheet sheet
+
+#### git mergetool
+
+```
+git config --global merge.tool=vimdiff
+```
+
+#### vimdiff key mappings
+
+```
+map <Leader>1 :diffget LOCAL<CR>
+map <Leader>2 :diffget BASE<CR>
+map <Leader>3 :diffget REMOTE<CR>
+```
+
+#### vimdiff commands
+
+```
+]c :            next difference
+[c :            previous difference
+do              diff obtain
+dp              diff put
+zo              open folded text
+zc              close folded text
+:diffupdate     re-scan the files for differences
+```
+
+#### moving between windows
+
+```
+CTRL-W h        move to the window on the left
+CTRL-W j        move to the window below
+CTRL-W k        move to the window above
+CTRL-W l        move to the window on the right
+CTRL-W t        move to the TOP window
+CTRL-W b        move to the BOTTOM window
+CTRL-W CTRL-W   move to the next window
+```
+
+#### moving windows
+
+```
+CTRL-W K        move window to the upper
+CTRL-W H        move window to the far left
+CTRL-W J        move window to the bottom
+CTRL-W L        move window to the far right
+
+

+ 499 - 0
docs/editors/zsh.md

@@ -0,0 +1,499 @@
+#Z shell
+
+- my customizations on listed on the [editor home page](/docs/editors/custom)
+
+### Oh My ZSH
+
+####  Upgrade
+
+To upgrade .oh-my-zsh, run:  
+
+```
+upgrade_oh_my_zsh
+```
+[Source](https://github.com/robbyrussell/oh-my-zsh/wiki/Cheatsheet "Permalink to Cheatsheet · robbyrussell/oh-my-zsh Wiki · GitHub")
+##  Commands
+
+| Command               | Description                                                                                                                  |  
+| --------------------- | ---------------------------------------------------------------------------------------------------------------------------- |  
+| _tabs_                | Create a new tab in the current directory (macOS - requires enabling access for assistive devices under System Preferences). |  
+| _take_                | Create a new directory and change to it, will create intermediate directories as required.                                   |  
+| _x_ / _extract_       | Extract an archive (supported types: tar.{bz2,gz,xz,lzma}, bz2, rar, gz, tar, tbz2, tgz, zip, Z, 7z).                        |  
+| _zsh_stats_           | Get a list of the top 20 commands and how many times they have been run.                                                     |  
+| _uninstall_oh_my_zsh_ | Uninstall Oh-my-zsh.                                                                                                         |  
+| _upgrade_oh_my_zsh_   | Upgrade Oh-my-zsh.                                                                                                           |  
+| source ~/.zshrc       | Uptake new changes                                                                                                           |  
+
+* * *
+
+| Alias   | Command                               |  
+| ------- | ------------------------------------- |  
+| _alias_ | list all aliases                      |  
+| ..      | cd ..                                 |  
+| ...     | cd ../..                              |  
+| ....    | cd ../../..                           |  
+| .....   | cd ../../../..                        |  
+| /       | cd /                                  |  
+| ~       | cd ~                                  |  
+| _cd +n_ | switch to directory number `n`        |  
+| _1_     | cd -                                  |  
+| _2_     | cd +2                                 |  
+| _3_     | cd +3                                 |  
+| _4_     | cd +4                                 |  
+| _5_     | cd +5                                 |  
+| _6_     | cd +6                                 |  
+| _7_     | cd +7                                 |  
+| _8_     | cd +8                                 |  
+| _9_     | cd +9                                 |  
+| _md_    | mkdir -p                              |  
+| _rd_    | rmdir                                 |  
+| _d_     | dirs -v (lists last used directories) |  
+
+See `~/.oh-my-zsh/lib/directories.zsh`
+
+###  Alias
+
+example:
+
+
+    alias -s rb=vim #opens ruby files in vim
+    # $ foo.rb
+    # vim => foo.rb
+    alias -g gp='| grep -i' #creates a global alias for grep
+    # $ ps ax gp ruby
+    # (all ruby process will be displayed)
+
+| Flag | Description                                    |  
+| ---- | ---------------------------------------------- |  
+| L    | print each alias in the form of calls to alias |  
+| g    | list or define global aliases                  |  
+| m    | print aliases matching specified pattern       |  
+| r    | list or define regular aliases                 |  
+| s    | list or define suffix aliases                  |  
+
+##  Tab-completion
+
+| For options and helpful text of what they do |  
+| -------------------------------------------- |  
+| _ls -(tab)_                                  |  
+| _cap (tab)_                                  |  
+| _rake (tab)_                                 |  
+| _ssh (tab)_                                  |  
+| _sudo umount (tab)_                          |  
+| _kill (tab)_                                 |  
+| _unrar (tab)_                                |  
+
+##  Git
+
+| Dynamic access to current branch name with the current_branch function |  
+| ---------------------------------------------------------------------- |  
+| git pull origin $(current_branch)                                      |  
+| grb publish $(current_branch) origin                                   |  
+
+| Alias |  Command |  
+| ---- | ----  |
+| _g_ |  git |  
+| _ga_ |  git add |  
+| _gaa_ |  git add --all |  
+| _gapa_ |  git add --patch |  
+| _gb_ |  git branch |  
+| _gba_ |  git branch -a |  
+| _gbr_ |  git branch --remote |  
+| _gc_ |  git commit -v |  
+| _gc!_ |  git commit -v --amend |  
+| _gca_ |  git commit -v -a |  
+| _gca!_ |  git commit -v -a --amend |  
+| _gcl_ |  git config --list |  
+| _gclean_ |  git clean -fd |  
+| _gpristine_ |  git reset --hard && git clean -dfx |  
+| _gcm_ |  git checkout master |  
+| _gcmsg_ |  git commit -m |  
+| _gco_ |  git checkout |  
+| _gcount_ |  git shortlog -sn |  
+| _gcp_ |  git cherry-pick |  
+| _gcs_ |  git commit -S |  
+| _gd_ |  git diff |  
+| _gdca_ |  git diff --cached |  
+| _gdt_ |  git diff-tree --no-commit-id --name-only -r |  
+| _gdt_ |  git difftool |  
+| _gfa_ |  git fetch --all --prune |  
+| _gg_ |  git gui citool |  
+| _gga_ |  git gui citool --amend |  
+| _ggpnp_ |  git pull origin $(current_branch) && git push origin $(current_branch) |  
+| _ggpull_ |  git pull origin $(current_branch) |  
+| _ggl_ |  git pull origin $(current_branch) |  
+| _ggpur_ |  git pull --rebase origin $(current_branch) |  
+| _glum_ |  git pull upstream master |  
+| _ggpush_ |  git push origin $(current_branch) |  
+| _ggp_ |  git push origin $(current_branch) |  
+| _ggsup_ |  git branch --set-upstream-to=origin/$(current_branch) |  
+| _gignore_ |  git update-index --assume-unchanged |  
+| _gignored_ |  git ls-files -v | grep "^[[:lower:]]" |  
+| _git-svn-dcommit-push_ |  git svn dcommit && git push github master:svntrunk |  
+| _gk_ |  gitk --all --branches |  
+| _gl_ |  git pull |  
+| _glg_ |  git log --stat --max-count = 10 |  
+| _glgg_ |  git log --graph --max-count = 10 |  
+| _glgga_ |  git log --graph --decorate --all |  
+| _glo_ |  git log --oneline --decorate --color |  
+| _glog_ |  git log --oneline --decorate --color --graph |  
+| _glp_ |  _git_log_prettily (git log --pretty=$1) |  
+| _gm_ |  git merge |  
+| _gmt_ |  git mergetool --no-prompt |  
+| _gp_ |  git push |  
+| _gpoat_ |  git push origin --all && git push origin --tags |  
+| _gr_ |  git remote |  
+| _grba_ |  git rebase --abort |  
+| _grbc_ |  git rebase --continue |  
+| _grbs_ |  git rebase --skip |  
+| _grbi_ |  git rebase -i |  
+| _grh_ |  git reset HEAD |  
+| _grhh_ |  git reset HEAD --hard |  
+| _grmv_ |  git remote rename |  
+| _grrm_ |  git remote remove |  
+| _grset_ |  git remote set-url |  
+| _grt_ |  cd $(git rev-parse --show-toplevel || echo ".") |  
+| _grup_ |  git remote update |  
+| _grv_ |  git remote -v |  
+| _gsd_ |  git svn dcommit |  
+| _gsps_ |  git show --pretty = short --show-signature |  
+| _gsr_ |  git svn rebase |  
+| _gss_ |  git status -s |  
+| _gst_ |  git status |  
+| _gsta_ |  git stash save |  
+| _gstaa_ |  git stash apply |  
+| _gstd_ |  git stash drop |  
+| _gstl_ |  git stash list |  
+| _gstp_ |  git stash pop |  
+| _gsts_ |  git stash show --text |  
+| _gts_ |  git tag -s |  
+| _gunignore_ |  git update-index --no-assume-unchanged |  
+| _gunwip_ |  git log -n 1 | grep -q -c "--wip--" && git reset HEAD~1 |  
+| _gup_ |  git pull --rebase |  
+| _gvt_ |  git verify-tag |  
+| _gwch_ |  git whatchanged -p --abbrev-commit --pretty = medium |  
+| _gwip_ |  git add -A; git ls-files --deleted -z | xargs -r0 git rm; git commit -m "--wip--" |
+
+You also find these commands in Dash as a Cheat-sheet.
+
+##  Editors
+
+| Alias | Command                                                                  |  
+| ----- | ------------------------------------------------------------------------ |  
+| _stt_ | (When using `sublime` plugin) Open current directory in Sublime Text 2/3 |  
+| _v_   | (When using `vi-mode` plugin) Edit current command line in Vim           |  
+
+##  Symfony2
+
+| Alias         | Command                     |  
+| ------------- | --------------------------- |  
+| _sf_          | php ./app/console           |  
+| _sfcl_        | php app/console cache:clear |  
+| _sfcontainer_ | sf debug:container          |  
+| _sfcw_        | sf cache:warmup             |  
+| _sfgb_        | sf generate:bundle          |  
+| _sfroute_     | sf debug:router             |  
+| _sfsr_        | sf server:run -vvv          |  
+
+##  tmux
+
+| Alias  | Command              |  
+| ------ | -------------------- |  
+| _ta_   | tmux attach -t       |  
+| _tad_  | tmux attach -d -t    |  
+| _ts_   | tmux new-session -s  |  
+| _tl_   | tmux list-sessions   |  
+| _tksv_ | tmux kill-server     |  
+| _tkss_ | tmux kill-session -t |  
+
+##  Systemd
+
+###  systemctl
+
+| Command           | Description                              |  
+| ----------------- | ---------------------------------------- |  
+| _sc-status NAME_  | show the status of the NAME process      |  
+| _sc-show NAME_    | show the NAME systemd .service file      |  
+| _sc-start NAME_   | start the NAME process                   |  
+| _sc-stop NAME_    | stop the NAME process                    |  
+| _sc-restart NAME_ | restart the NAME process                 |  
+| _sc-enable NAME_  | enable the NAME process to start at boot |  
+| _sc-disable NAME_ | disable the NAME process at boot         |  
+
+
+
+### Prerequisites
+
+* A Unix-like operating system: macOS, Linux, BSD. On Windows: WSL is preferred, but cygwin or msys also mostly work.
+* [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent). If not pre-installed (run `zsh --version` to confirm), check the following instructions here: [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH)
+* `curl` or `wget` should be installed
+* `git` should be installed (recommended v1.7.2 or higher)
+
+### Basic Installation
+
+Oh My Zsh is installed by running one of the following commands in your terminal. You can install this via the command-line with either `curl` or `wget`.
+
+#### via curl
+
+```shell
+sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
+```
+
+#### via wget
+
+```shell
+sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
+```
+
+#### Manual inspection
+
+It's a good idea to inspect the install script from projects you don't yet know. You can do
+that by downloading the install script first, looking through it so everything looks normal,
+then running it:
+
+```shell
+curl -Lo install.sh https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
+sh install.sh
+```
+
+## Using Oh My Zsh
+
+### Plugins
+
+Oh My Zsh comes with a shitload of plugins to take advantage of. You can take a look in the [plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins) directory and/or the [wiki](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins) to see what's currently available.
+
+#### Enabling Plugins
+
+Once you spot a plugin (or several) that you'd like to use with Oh My Zsh, you'll need to enable them in the `.zshrc` file. You'll find the zshrc file in your `$HOME` directory. Open it with your favorite text editor and you'll see a spot to list all the plugins you want to load.
+
+```shell
+vi ~/.zshrc
+```
+
+For example, this might begin to look like this:
+
+```shell
+plugins=(
+  git
+  bundler
+  dotenv
+  osx
+  rake
+  rbenv
+  ruby
+)
+```
+
+_Note that the plugins are separated by whitespace. **Do not** use commas between them._
+
+#### Using Plugins
+
+Most plugins (should! we're working on this) include a __README__, which documents how to use them.
+
+### Themes
+
+We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one hundred themes now bundled. Most of them have [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki. Check them out!
+
+#### Selecting a Theme
+
+_Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right one (for him)._
+
+Once you find a theme that you'd like to use, you will need to edit the `~/.zshrc` file. You'll see an environment variable (all caps) in there that looks like:
+
+```shell
+ZSH_THEME="robbyrussell"
+```
+
+To use a different theme, simply change the value to match the name of your desired theme. For example:
+
+```shell
+ZSH_THEME="agnoster" # (this is one of the fancy ones)
+# see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster
+```
+
+_Note: many themes require installing the [Powerline Fonts](https://github.com/powerline/fonts) in order to render properly._
+
+Open up a new terminal window and your prompt should look something like this:
+
+![Agnoster theme](https://cloud.githubusercontent.com/assets/2618447/6316862/70f58fb6-ba03-11e4-82c9-c083bf9a6574.png)
+
+In case you did not find a suitable theme for your needs, please have a look at the wiki for [more of them](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes).
+
+If you're feeling feisty, you can let the computer select one randomly for you each time you open a new terminal window.
+
+
+```shell
+ZSH_THEME="random" # (...please let it be pie... please be some pie..)
+```
+
+And if you want to pick random theme from a list of your favorite themes:
+
+```shell
+ZSH_THEME_RANDOM_CANDIDATES=(
+  "robbyrussell"
+  "agnoster"
+)
+```
+
+If you only know which themes you don't like, you can add them similarly to a blacklist:
+
+```shell
+ZSH_THEME_RANDOM_BLACKLIST=(pygmalion tjkirch_mod)
+```
+
+### FAQ
+
+If you have some more questions or issues, you might find a solution in our [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ).
+
+## Advanced Topics
+
+If you're the type that likes to get their hands dirty, these sections might resonate.
+
+### Advanced Installation
+
+Some users may want to manually install Oh My Zsh, or change the default path or other settings that
+the installer accepts (these settings are also documented at the top of the install script).
+
+#### Custom Directory
+
+The default location is `~/.oh-my-zsh` (hidden in your home directory)
+
+If you'd like to change the install directory with the `ZSH` environment variable, either by running
+`export ZSH=/your/path` before installing, or by setting it before the end of the install pipeline
+like this:
+
+```shell
+ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh
+```
+
+#### Unattended install
+
+If you're running the Oh My Zsh install script as part of an automated install, you can pass the
+flag `--unattended` to the `install.sh` script. This will have the effect of not trying to change
+the default shell, and also won't run `zsh` when the installation has finished.
+
+```shell
+sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
+```
+
+#### Installing from a forked repository
+
+The install script also accepts these variables to allow installation of a different repository:
+
+- `REPO` (default: `ohmyzsh/ohmyzsh`): this takes the form of `owner/repository`. If you set
+  this variable, the installer will look for a repository at `https://github.com/{owner}/{repository}`.
+
+- `REMOTE` (default: `https://github.com/${REPO}.git`): this is the full URL of the git repository
+  clone. You can use this setting if you want to install from a fork that is not on GitHub (GitLab,
+  Bitbucket...) or if you want to clone with SSH instead of HTTPS (`git@github.com:user/project.git`).
+
+  _NOTE: it's incompatible with setting the `REPO` variable. This setting will take precedence._
+
+- `BRANCH` (default: `master`): you can use this setting if you want to change the default branch to be
+  checked out when cloning the repository. This might be useful for testing a Pull Request, or if you
+  want to use a branch other than `master`.
+
+For example:
+
+```shell
+REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh
+```
+
+#### Manual Installation
+
+##### 1. Clone the repository:
+
+```shell
+git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
+```
+
+##### 2. *Optionally*, backup your existing `~/.zshrc` file:
+
+```shell
+cp ~/.zshrc ~/.zshrc.orig
+```
+
+##### 3. Create a new zsh configuration file
+
+You can create a new zsh config file by copying the template that we have included for you.
+
+```shell
+cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
+```
+
+##### 4. Change your default shell
+
+```shell
+chsh -s $(which zsh)
+```
+
+You must log out from your user session and log back in to see this change.
+
+##### 5. Initialize your new zsh configuration
+
+Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration.
+
+### Installation Problems
+
+If you have any hiccups installing, here are a few common fixes.
+
+* You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after
+switching to `oh-my-zsh`.
+* If you installed manually or changed the install location, check the `ZSH` environment variable in
+`~/.zshrc`.
+
+### Custom Plugins and Themes
+
+If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/` directory.
+
+If you have many functions that go well together, you can put them as a `XYZ.plugin.zsh` file in the `custom/plugins/` directory and then enable this plugin.
+
+If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`.
+
+## Getting Updates
+
+By default, you will be prompted to check for upgrades every few weeks. If you would like `oh-my-zsh` to automatically upgrade itself without prompting you, set the following in your `~/.zshrc`:
+
+```shell
+DISABLE_UPDATE_PROMPT=true
+```
+
+To disable automatic upgrades, set the following in your `~/.zshrc`:
+
+```shell
+DISABLE_AUTO_UPDATE=true
+```
+
+### Manual Updates
+
+If you'd like to upgrade at any point in time (maybe someone just released a new plugin and you don't want to wait a week?) you just need to run:
+
+```shell
+upgrade_oh_my_zsh
+```
+
+Magic! 🎉
+
+## Uninstalling Oh My Zsh
+
+Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy breakup.
+
+If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove itself and revert your previous `bash` or `zsh` configuration.
+
+## How do I contribute to Oh My Zsh?
+
+Before you participate in our delightful community, please read the code of conduct.
+
+I'm far from being a [Zsh](https://www.zsh.org/) expert and suspect there are many ways to improve – if you have ideas on how to make the configuration easier to maintain (and faster), don't hesitate to fork and send pull requests!
+
+We also need people to test out pull-requests. So take a look through [the open issues](https://github.com/ohmyzsh/ohmyzsh/issues) and help where you can.
+
+See Contributing for more details.
+
+### Do NOT send us themes
+
+We have (more than) enough themes for the time being. Please add your theme to the [external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page.
+
+## Contributors
+
+Oh My Zsh has a vibrant community of happy users and delightful contributors. Without all the time and help from our contributors, it wouldn't be so awesome.

+ 3 - 0
docs/host/Discourse.md

@@ -0,0 +1,3 @@
+
+
+* [https://github.com/discourse/discourse](https://github.com/discourse/discourse)

+ 1 - 0
docs/host/Drupal.md

@@ -0,0 +1 @@
+

+ 100 - 0
docs/host/Gitea.md

@@ -0,0 +1,100 @@
+
+
+[Docs](https://docs.gitea.io/)  
+[Website ](https://gitea.io/en-us/)   
+[Blog ](https://blog.gitea.io/)   
+[Code ](https://code.gitea.io/)   
+[API ](https://try.gitea.io/api/swagger)   
+[Downloads ](https://dl.gitea.io/)   
+[GitHub ](https://github.com/go-gitea/)   
+[Discord Chat ](https://discord.gg/NsatcWJ)  
+[Forum](https://discourse.gitea.io/)
+
+
+Upgrade from Gogs
+=================
+
+Gogs, version 0.9.146 and older, can be easily migrated to Gitea.
+
+There are some basic steps to follow. On a Linux system run as the Gogs user:
+
+*   Create a Gogs backup with `gogs backup`. This creates `gogs-backup-[timestamp].zip` file containing all important Gogs data. You would need it if you wanted to move to the `gogs` back later.
+*   Download the file matching the destination platform from the [downloads page](https://dl.gitea.io/gitea/). It should be `1.0.x` version. Migrating from `gogs` to any other version is impossible.
+*   Put the binary at the desired install location.
+*   Copy `gogs/custom/conf/app.ini` to `gitea/custom/conf/app.ini`.
+*   Copy custom `templates, public` from `gogs/custom/` to `gitea/custom/`.
+*   For any other custom folders, such as `gitignore, label, license, locale, readme` in `gogs/custom/conf`, copy them to `gitea/custom/options`.
+*   Copy `gogs/data/` to `gitea/data/`. It contains issue attachments and avatars.
+*   Verify by starting Gitea with `gitea web`.
+*   Enter Gitea admin panel on the UI, run `Rewrite '.ssh/authorized_keys' file`.
+*   Launch every major version of the binary ( `1.1.4` → `1.2.3` → `1.3.4` → `1.4.2` → etc ) to migrate database.
+*   If custom or config path was changed, run `Rewrite all update hook of repositories`.
+
+Change gogs specific information
+--------------------------------
+
+*   Rename `gogs-repositories/` to `gitea-repositories/`
+*   Rename `gogs-data/` to `gitea-data/`
+*   In `gitea/custom/conf/app.ini` change:
+
+FROM:
+
+[database]
+PATH = /home/:USER/gogs/data/:DATABASE.db
+[attachment]
+PATH = /home/:USER/gogs-data/attachments
+[picture]
+AVATAR_UPLOAD_PATH = /home/:USER/gogs-data/avatars
+[log]
+ROOT_PATH = /home/:USER/gogs/log
+
+
+TO:
+
+[database]
+PATH = /home/:USER/gitea/data/:DATABASE.db
+[attachment]
+PATH = /home/:USER/gitea-data/attachments
+[picture]
+AVATAR_UPLOAD_PATH = /home/:USER/gitea-data/avatars
+[log]
+ROOT_PATH = /home/:USER/gitea/log
+
+
+*   Verify by starting Gitea with `gitea web`
+
+Upgrading to most recent `gitea` version
+----------------------------------------
+
+After successful migration from `gogs` to `gitea 1.0.x`, it is possible to upgrade `gitea` to a modern version in a two steps process.
+
+Upgrade to [`gitea 1.6.4`](https://dl.gitea.io/gitea/1.6.4/) first. Download the file matching the destination platform from the [downloads page](https://dl.gitea.io/gitea/1.6.4/) and replace the binary. Run Gitea at least once and check that everything works as expected.
+
+Then repeat the procedure, but this time using the [lastest release](https://dl.gitea.io/gitea/1.10.2/).
+
+Upgrading from a more recent version of Gogs
+--------------------------------------------
+
+Upgrading from a more recent version of Gogs is also possible, but requires a bit more work. See [#4286](https://github.com/go-gitea/gitea/issues/4286).
+
+Troubleshooting
+---------------
+
+*   If errors are encountered relating to custom templates in the `gitea/custom/templates` folder, try moving the templates causing the errors away one by one. They may not be compatible with Gitea or an update.
+
+Add Gitea to startup on Unix
+----------------------------
+
+Update the appropriate file from [gitea/contrib](https://github.com/go-gitea/gitea/tree/master/contrib) with the right environment variables.
+
+For distros with systemd:
+
+*   Copy the updated script to `/etc/systemd/system/gitea.service`
+*   Add the service to the startup with: `sudo systemctl enable gitea`
+*   Disable old gogs startup script: `sudo systemctl disable gogs`
+
+For distros with SysVinit:
+
+*   Copy the updated script to `/etc/init.d/gitea`
+*   Add the service to the startup with: `sudo rc-update add gitea`
+*   Disable old gogs startup script: `sudo rc-update del gogs`

+ 94 - 0
docs/host/Gogs.md

@@ -0,0 +1,94 @@
+
+####(go git server)
+
+[https://gogs.io/docs](https://gogs.io/docs)
+
+```
+
+sudo apt-get install golang-go
+
+export PATH=$PATH:/usr/bin/go:$GOPATH/bin
+export GOPATH=$HOME/go                                                                           
+export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
+
+wget https://dl.gogs.io/0.11.4/linux_amd64.zip
+unzip https://dl.gogs.io/0.11.4/linux_amd64.zip
+
+sudo vi /etc/supervisor/supervisord.conf
+
+//add 
+[program:gogs]
+directory=/home/david/gogs/
+command=/home/david/gogs/gogs web
+autostart=true
+autorestart=true
+startsecs=10
+stdout_logfile=/var/log/gogs/stdout.log
+stdout_logfile_maxbytes=1MB
+stdout_logfile_backups=10
+stdout_capture_maxbytes=1MB
+stderr_logfile=/var/log/gogs/stderr.log
+stderr_logfile_maxbytes=1MB
+stderr_logfile_backups=10
+stderr_capture_maxbytes=1MB
+environment = HOME="/david/git", USER="david"
+user = david
+
+sudo service supervisor restart
+
+//restart gogs 
+sudo supervisorctl restart gogs
+
+
+sudo vi /etc/apache2/sites-available/code.davidawindham.com.conf
+
+//add
+<VirtualHost *:80>
+  ServerAdmin david@davidawindham.com
+  ServerName  www.code.davidawindham.com
+  ServerAlias code.davidawindham.com
+
+ # DirectoryIndex index.html index.php
+ # DocumentRoot /var/www/code.davidawindham.com/html
+
+
+  ProxyPreserveHost On
+  ProxyRequests Off
+  ProxyPass / http://127.0.0.1:3000/
+  ProxyPassReverse / http://127.0.0.1:3000/
+
+  LogLevel warn
+  ErrorLog  /var/www/code.davidawindham.com/log/error.log
+  CustomLog /var/www/code.davidawindham.com/log/access.log combined
+RewriteEngine on
+RewriteCond %{SERVER_NAME} =code.davidawindham.com [OR]
+RewriteCond %{SERVER_NAME} =www.code.davidawindham.com
+RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent]
+</VirtualHost>
+
+<IfModule mod_ssl.c>
+<VirtualHost *:443>
+  ServerAdmin david@davidawindham.com
+  ServerName  www.code.davidawindham.com
+  ServerAlias code.davidawindham.com
+
+ # DirectoryIndex index.html index.php
+ # DocumentRoot /var/www/code.davidawindham.com/html
+
+  ProxyPreserveHost On
+  ProxyRequests Off
+  ProxyPass / http://127.0.0.1:3000/
+  ProxyPassReverse / http://127.0.0.1:3000/
+
+  LogLevel warn
+  ErrorLog  /var/www/code.davidawindham.com/log/error.log
+  CustomLog /var/www/code.davidawindham.com/log/access.log combined
+SSLCertificateFile /etc/letsencrypt/live/code.davidawindham.com/fullchain.pem
+SSLCertificateKeyFile /etc/letsencrypt/live/code.davidawindham.com/privkey.pem
+Include /etc/letsencrypt/options-ssl-apache.conf
+</VirtualHost>
+</IfModule>
+
+
+
+```

+ 82 - 0
docs/host/Icecast.md

@@ -0,0 +1,82 @@
+
+
+[http://icecast.org/](http://icecast.org/)
+
+---
+
+20/02/21 - The Icecast2 gpg package key expired last month and the one available at Xiph hadn't been updated. I used the one from OpenSuse and installed the new key via:
+```
+wget -qO - https://download.opensuse.org/repositories/multimedia:/xiph/xUbuntu_18.10/Release.key  | sudo apt-key add -
+```
+
+**11/08/18** - I'll need this for later. A server update to Icecast overwrote ( because I was in a rush and didn't pay attention for the first couple of inputs ) some of the xml files I was using to pull data into my broadcast page @ [radio.davidawindham.com](http://radio.davidawindham.com)
+
+
+
+```javascript
+
+Setting up icecast2 (2.4.4-1) ...
+
+Configuration file '/etc/icecast2/web/status.xsl'
+ ==> Modified (by you or by a script) since installation.
+ ==> Package distributor has shipped an updated version.
+   What would you like to do about it ?  Your options are:
+    Y or I  : install the package maintainer's version
+    N or O  : keep your currently-installed version
+      D     : show the differences between the versions
+      Z     : start a shell to examine the situation
+ The default action is to keep your current version.
+*** status.xsl (Y/I/N/O/D/Z) [default=N] ? y
+Installing new version of config file /etc/icecast2/web/status.xsl ...
+Installing new version of config file /etc/icecast2/web/server_version.xsl ...
+Installing new version of config file /etc/icecast2/web/auth.xsl ...
+Installing new version of config file /etc/icecast2/admin/updatemetadata.xsl ...
+
+Configuration file '/etc/icecast2/admin/listclients.xsl'
+ ==> Modified (by you or by a script) since installation.
+ ==> Package distributor has shipped an updated version.
+   What would you like to do about it ?  Your options are:
+    Y or I  : install the package maintainer's version
+    N or O  : keep your currently-installed version
+      D     : show the differences between the versions
+      Z     : start a shell to examine the situation
+ The default action is to keep your current version.
+*** listclients.xsl (Y/I/N/O/D/Z) [default=N] ? n
+Installing new version of config file /etc/icecast2/admin/manageauth.xsl ...
+Installing new version of config file /etc/icecast2/admin/response.xsl ...
+
+Configuration file '/etc/icecast2/admin/listmounts.xsl'
+ ==> Modified (by you or by a script) since installation.
+ ==> Package distributor has shipped an updated version.
+   What would you like to do about it ?  Your options are:
+    Y or I  : install the package maintainer's version
+    N or O  : keep your currently-installed version
+      D     : show the differences between the versions
+      Z     : start a shell to examine the situation
+ The default action is to keep your current version.
+*** listmounts.xsl (Y/I/N/O/D/Z) [default=N] ? y
+Installing new version of config file /etc/icecast2/admin/listmounts.xsl ...
+Installing new version of config file /etc/icecast2/admin/moveclients.xsl ...
+
+Configuration file '/etc/icecast2/admin/stats.xsl'
+ ==> Modified (by you or by a script) since installation.
+ ==> Package distributor has shipped an updated version.
+   What would you like to do about it ?  Your options are:
+    Y or I  : install the package maintainer's version
+    N or O  : keep your currently-installed version
+      D     : show the differences between the versions
+      Z     : start a shell to examine the situation
+ The default action is to keep your current version.
+*** stats.xsl (Y/I/N/O/D/Z) [default=N] ? n
+
+Configuration file '/etc/icecast2/icecast.xml'
+ ==> Modified (by you or by a script) since installation.
+ ==> Package distributor has shipped an updated version.
+   What would you like to do about it ?  Your options are:
+    Y or I  : install the package maintainer's version
+    N or O  : keep your currently-installed version
+      D     : show the differences between the versions
+      Z     : start a shell to examine the situation
+ The default action is to keep your current version.
+*** icecast.xml (Y/I/N/O/D/Z) [default=N] ?  
+```

+ 8 - 0
docs/host/InvoicePlane.md

@@ -0,0 +1,8 @@
+
+
+
+[https://sandbox.davidawindham.com/invoice/](https://sandbox.davidawindham.com/invoice/)  
+[https://code.davidawindham.com/david/InvoicePlane](https://code.davidawindham.com/david/InvoicePlane)
+
+* [https://github.com/InvoicePlane/InvoicePlane](https://github.com/InvoicePlane/InvoicePlane)
+* [https://wiki.invoiceplane.com/en/1.5](https://wiki.invoiceplane.com/en/1.5)

+ 2211 - 0
docs/host/Laravel.md

@@ -0,0 +1,2211 @@
+
+
+#### Build
+* [webpack](https://webpack.js.org/)
+
+#### Front End
+* [Vuejs](https://vuejs.org/v2/guide/)
+
+#### Back
+* [Laravel](https://laravel.com/docs/5.7)  
+  * [Symfony Components](https://symfony.com/projects/laravel)
+  * [Laravel Nova](https://nova.laravel.com)
+  * [Laravel Horizon](https://laravel.com/docs/5.7/horizon)
+  * [Laravel Spark](https://spark.laravel.com/)
+  * [Laravel Telescope](https://github.com/laravel/telescope/)
+  * [Laravel Cashier](https://laravel.com/docs/5.7/billing)
+
+#### Testing
+* [Laravel Dusk](https://laravel.com/docs/5.7/dusk)  
+
+
+#### Code
+* Origin master [https://code.davidawindham.com/david/laravel/](https://code.davidawindham.com/david/laravel/)
+* Code master [https://github.com/windhamdavid/laravel](https://github.com/windhamdavid/laravel)
+* Upstream master [https://github.com/laravel/laravel](https://github.com/laravel/laravel)  
+
+#### Links
+* Laravel Cheatsheet [https://davidawindham.com/til/host/laravel.html](https://davidawindham.com/til/host/laravel.html)
+* Laravel Documentation [https://laravel.com/docs/5.7/](https://laravel.com/docs/5.7/)
+
+#### References
+* [Laravel by the Numbers
+A unique analysis of data from Laravel Shift on over 8,000 Laravel apps.](https://jason.pureconcepts.net/2018/07/laravel-numbers/)
+
+#### Artisan
+```sh
+// shortend 'php artisan' to 'pa' in my .zshrc
+// added tab completion for artisan
+
+_laravel_get_command_list () {
+	php artisan --raw --no-ansi list | sed "s/[[:space:]].*//g"
+}
+
+_laravel () {
+  if [ -f artisan ]; then
+    compadd `_laravel_get_command_list`
+  fi
+}
+
+compdef _laravel artisan
+compdef _laravel pa
+
+#Alias
+alias pa='php artisan'
+alias pacache='php artisan cache:clear'
+alias paroutes='php artisan route:list'
+alias pavendor='php artisan vendor:publish'
+// etc...
+```
+
+###### commonly used:
+```php
+pa help
+pa list
+pa tinker
+pa install
+pa migrate
+pa migrate:status
+pa migrate:install
+pa migrate:reset
+pa migrate:rollback
+pa migrate:refresh
+pa migrate:fresh
+pa db:seed
+pa cache:clear
+pa route:list
+```
+
+#### [Artisan](#artisan)[](http://laravel.com/docs/artisan "Artisan CLI @ Laravel Docs")
+
+```php
+// Added in 5.1.11:http://laravel.com/docs/5.1/authorization#creating-policies
+php artisan make:policy PostPolicy
+// Displays help for a given command
+php artisan --help OR -h
+// Do not output any message
+php artisan --quiet OR -q
+// Display this application version
+php artisan --version OR -V
+// Do not ask any interactive question
+php artisan --no-interaction OR -n
+// Force ANSI output
+php artisan --ansi
+// Disable ANSI output
+php artisan --no-ansi
+// The environment the command should run under
+php artisan --env
+// -v|vv|vvv Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
+php artisan --verbose
+// Remove the compiled class file
+php artisan clear-compiled
+// Display the current framework environment
+php artisan env
+// Displays help for a command
+php artisan help
+// Lists commands
+php artisan list
+// Interact with your application
+php artisan tinker
+// Put the application into maintenance mode
+php artisan down
+// Bring the application out of maintenance mode
+php artisan up
+// Optimize the framework for better performance
+// --force    Force the compiled class file to be written.
+// --psr      Do not optimize Composer dump-autoload.
+php artisan optimize [--force] [--psr]
+// Serve the application on the PHP development server
+php artisan serve
+// Change the default port
+php artisan serve --port 8080
+// Get it to work outside localhost
+php artisan serve --host 0.0.0.0
+// Set the application namespace
+php artisan app:name namespace
+// Flush expired password reset tokens
+php artisan auth:clear-resets
+// Flush the application cache
+php artisan cache:clear
+// Create a migration for the cache database table
+php artisan cache:table
+// Create a cache file for faster configuration loading
+php artisan config:cache
+// Remove the configuration cache file
+php artisan config:clear
+// In program
+$exitCode = Artisan::call('config:cache');
+// Seed the database with records
+// --class      The class name of the root seeder (default: "DatabaseSeeder")
+// --database   The database connection to seed
+// --force      Force the operation to run when in production.
+php artisan db:seed [--class[="..."]] [--database[="..."]] [--force]
+
+// Generate the missing events and handlers based on registration
+php artisan event:generate
+
+// Create a new command handler class
+// --command      The command class the handler handles.
+php artisan handler:command [--command="..."] name
+// Create a new event handler class
+// --event        The event class the handler handles.
+// --queued       Indicates the event handler should be queued.
+php artisan handler:event [--event="..."] [--queued] name
+
+// Set the application key
+php artisan key:generate
+
+// By default, this creates a self-handling command that is not pushed to the queue.
+// Pass this the --handler flag to generate a handler, and the --queued flag to make it queued.
+php artisan make:command [--handler] [--queued] name
+// Create a new Artisan command
+//  --command     The terminal command that should be assigned. (default: "command:name")
+make:console [--command[="..."]] name
+// Create a new resourceful controller
+// --plain      Generate an empty controller class.
+php artisan make:controller [--plain] name
+php artisan make:controller App\\Admin\\Http\\Controllers\\DashboardController
+// Create a new event class
+php artisan make:event name
+// Create a new middleware class
+php artisan make:middleware name
+// Create a new migration file
+// --create     The table to be created.
+// --table      The table to migrate.
+php artisan make:migration [--create[="..."]] [--table[="..."]] name
+// Create a new Eloquent model class
+php artisan make:model name
+// Create a new service provider class
+php artisan make:provider name
+// Create a new form request class
+php artisan make:request name
+// Database migrations
+// --database   The database connection to use.
+// --force      Force the operation to run when in production.
+// --path       The path of migrations files to be executed.
+// --pretend    Dump the SQL queries that would be run.
+// --seed       Indicates if the seed task should be re-run.
+php artisan migrate [--database[="..."]] [--force] [--path[="..."]] [--pretend] [--seed]
+// Create the migration repository
+php artisan migrate:install [--database[="..."]]
+// Create a new migration file
+// --seeder     The class name of the root seeder.
+php artisan migrate:refresh [--database[="..."]] [--force] [--seed] [--seeder[="..."]]
+// Rollback all database migrations
+// --pretend    Dump the SQL queries that would be run.
+php artisan migrate:reset [--database[="..."]] [--force] [--pretend]
+// Rollback the last database migration
+php artisan migrate:rollback [--database[="..."]] [--force] [--pretend]
+// Show a list of migrations up/down
+php artisan migrate:status
+// Create a migration for the queue jobs database table
+php artisan queue:table
+// Listen to a given queue
+// --queue      The queue to listen on
+// --delay      Amount of time to delay failed jobs (default: 0)
+// --memory     The memory limit in megabytes (default: 128)
+// --timeout    Seconds a job may run before timing out (default: 60)
+// --sleep      Seconds to wait before checking queue for jobs (default: 3)
+// --tries      Number of times to attempt a job before logging it failed (default: 0)
+php artisan queue:listen [--queue[="..."]] [--delay[="..."]] [--memory[="..."]] [--timeout[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
+// List all of the failed queue jobs
+php artisan queue:failed
+// Create a migration for the failed queue jobs database table
+php artisan queue:failed-table
+// Flush all of the failed queue jobs
+php artisan queue:flush
+// Delete a failed queue job
+php artisan queue:forget
+// Restart queue worker daemons after their current job
+php artisan queue:restart
+// Retry a failed queue job(id: The ID of the failed job)
+php artisan queue:retry id
+// Subscribe a URL to an Iron.io push queue
+// queue: The name of Iron.io queue.
+// url: The URL to be subscribed.
+// --type       The push type for the queue.
+php artisan queue:subscribe [--type[="..."]] queue url
+// Process the next job on a queue
+// --queue      The queue to listen on
+// --daemon     Run the worker in daemon mode
+// --delay      Amount of time to delay failed jobs (default: 0)
+// --force      Force the worker to run even in maintenance mode
+// --memory     The memory limit in megabytes (default: 128)
+// --sleep      Number of seconds to sleep when no job is available (default: 3)
+// --tries      Number of times to attempt a job before logging it failed (default: 0)
+php artisan queue:work [--queue[="..."]] [--daemon] [--delay[="..."]] [--force] [--memory[="..."]] [--sleep[="..."]] [--tries[="..."]] [connection]
+
+// Create a route cache file for faster route registration
+php artisan route:cache
+// Remove the route cache file
+php artisan route:clear
+// List all registered routes
+php artisan route:list
+
+// Run the scheduled commands
+php artisan schedule:run
+
+// Create a migration for the session database table
+php artisan session:table
+
+// Publish any publishable assets from vendor packages
+// --force        Overwrite any existing files.
+// --provider     The service provider that has assets you want to publish.
+// --tag          The tag that has assets you want to publish.
+php artisan vendor:publish [--force] [--provider[="..."]] [--tag[="..."]]
+php artisan tail [--path[="..."]] [--lines[="..."]] [connection]
+```
+
+#### Composer
+[composer](http://getcomposer.org/)
+
+```php
+
+
+composer create-project laravel/laravel folder_name
+composer install
+composer update
+composer dump-autoload [--optimize]
+composer self-update
+composer require [options] [--] [vendor/packages]...
+              ```
+
+___
+
+#### [Config](#Configuration)[](http://laravel.com/docs/configuration "Configuration Docs")
+
+```php
+
+Config::get('app.timezone');
+//get with Default value
+Config::get('app.timezone', 'UTC');
+//set Configuration
+Config::set('database.default', 'sqlite');
+              ```
+
+___
+
+#### [Route](#routing)[](http://laravel.com/docs/routing "Routing @ Laravel Docs")[](http://laravel.com/docs/helpers#routing "Routing Helpers @ Laravel Docs")
+
+```php
+
+Route::get('foo', function(){});
+Route::get('foo', 'ControllerName@function');
+Route::controller('foo', 'FooController');
+              ```
+
+###### RESTful Controllers[](http://laravel.com/docs/controllers#restful-resource-controllers "RESTful Controllers @ Laravel Docs")
+
+```php
+
+Route::resource('posts','PostsController');
+//Specify a subset of actions to handle on the route
+Route::resource('photo', 'PhotoController',['only' => ['index', 'show']]);
+Route::resource('photo', 'PhotoController',['except' => ['update', 'destroy']]);
+              ```
+
+###### Triggering Errors[](http://laravel.com/docs/routing#throwing-404-errors "throwing-404-errors @ Laravel Docs")
+
+```php
+
+App::abort(404);
+$handler->missing(...) in ErrorServiceProvider::boot();
+throw new NotFoundHttpException;
+              ```
+
+###### Route Parameters[](http://laravel.com/docs/routing#route-parameters "RESTful Controllers @ Laravel Docs")
+
+```php
+
+Route::get('foo/{bar}', function($bar){});
+Route::get('foo/{bar?}', function($bar = 'bar'){});
+              ```
+
+###### HTTP Verbs
+
+```php
+
+Route::any('foo', function(){});
+Route::post('foo', function(){});
+Route::put('foo', function(){});
+Route::patch('foo', function(){});
+Route::delete('foo', function(){});
+// RESTful actions
+Route::resource('foo', 'FooController');
+// Registering A Route For Multiple Verbs
+Route::match(['get', 'post'], '/', function(){});
+              ```
+
+###### Secure Routes(TBD)
+
+```php
+
+Route::get('foo', array('https', function(){}));
+              ```
+
+###### Route Constraints
+
+```php
+
+Route::get('foo/{bar}', function($bar){})
+->where('bar', '[0-9]+');
+Route::get('foo/{bar}/{baz}', function($bar, $baz){})
+->where(array('bar' => '[0-9]+', 'baz' => '[A-Za-z]'))
+              ```
+
+```php
+
+// Set a pattern to be used across routes
+Route::pattern('bar', '[0-9]+')
+              ```
+
+###### HTTP Middleware[](http://laravel.com/docs/middleware "HTTP Middleware @ Laravel Docs")
+
+```php
+
+// Assigning Middleware To Routes
+Route::get('admin/profile', ['middleware' => 'auth', function(){}]);
+Route::get('admin/profile', function(){})->middleware('auth');
+              ```
+
+###### Named Routes
+
+```php
+
+Route::currentRouteName();
+Route::get('foo/bar', array('as' => 'foobar', function(){}));
+Route::get('user/profile', [
+  'as' => 'profile', 'uses' => 'UserController@showProfile'
+]);
+Route::get('user/profile', 'UserController@showProfile')->name('profile');
+$url = route('profile');
+$redirect = redirect()->route('profile');
+              ```
+
+###### Route Prefixing
+
+```php
+
+Route::group(['prefix' => 'admin'], function()
+{
+  Route::get('users', function(){
+      return 'Matches The "/admin/users" URL';
+  });
+});
+              ```
+
+###### Route Namespacing
+
+```php
+
+// This route group will carry the namespace 'Foo\Bar'
+Route::group(array('namespace' => 'Foo\Bar'), function(){})
+              ```
+
+###### Sub-Domain Routing
+
+```php
+
+// {sub} will be passed to the closure
+Route::group(array('domain' => '{sub}.example.com'), function(){});
+              ```
+
+___
+
+#### [Environment](#app)[](http://laravel.com/docs/configuration#environment-configuration "Environment Configuration @ Laravel Docs")
+
+```php
+
+$environment = app()->environment();
+$environment = App::environment();
+$environment = $app->environment();
+// The environment is local
+if ($app->environment('local')){}
+// The environment is either local OR staging...
+if ($app->environment('local', 'staging')){}
+              ```
+
+___
+
+#### [Log](#log)[](http://laravel.com/docs/errors#logging "Log @ Laravel Docs")
+
+```php
+
+// The logger provides the seven logging levels defined in RFC 5424:
+// debug, info, notice, warning, error, critical, and alert.
+Log::info('info');
+Log::info('info',array('context'=>'additional info'));
+Log::error('error');
+Log::warning('warning');
+// get monolog instance
+Log::getMonolog();
+// add listener
+Log::listen(function($level, $message, $context) {});
+              ```
+
+###### Query Logging[](http://laravel.com/docs/database#query-logging "Log @ Laravel Docs")
+
+```php
+
+// enable the log
+DB::connection()->enableQueryLog();
+// get an array of the executed queries
+DB::getQueryLog();
+              ```
+
+___
+
+#### [URL](#urls) [](http://laravel.com/api/5.1/Illuminate/Routing/UrlGenerator.html "UrlGenerator @ Laravel Docs") [](http://laravel.com/docs/helpers#urls "URL helper @ Laravel Docs")
+
+```php
+
+URL::full();
+URL::current();
+URL::previous();
+URL::to('foo/bar', $parameters, $secure);
+URL::action('NewsController@item', ['id'=>123]);
+// need be in appropriate namespace
+URL::action('Auth\AuthController@logout');
+URL::action('FooController@method', $parameters, $absolute);
+URL::route('foo', $parameters, $absolute);
+URL::secure('foo/bar', $parameters);
+URL::asset('css/foo.css', $secure);
+URL::secureAsset('css/foo.css');
+URL::isValidUrl('http://example.com');
+URL::getRequest();
+URL::setRequest($request);
+              ```
+
+___
+
+#### [Event](#events)[](http://laravel.com/docs/events "Events @ Laravel Docs")
+
+```php
+
+Event::fire('foo.bar', array($bar));
+// Register an event listener with the dispatcher.
+// void listen(string|array $events, mixed $listener, int $priority)
+Event::listen('App\Events\UserSignup', function($bar){});
+Event::listen('foo.*', function($bar){});
+Event::listen('foo.bar', 'FooHandler', 10);
+Event::listen('foo.bar', 'BarHandler', 5);
+// Stopping The Propagation Of An Event
+// You may do so by returning false from your handler.
+Event::listen('foor.bar', function($event){ return false; });
+Event::subscribe('UserEventHandler');
+              ```
+
+___
+
+#### [DB](#db)[](http://laravel.com/docs/5.1/database "Basic Database Usage @ Laravel Docs")
+
+###### Basic Database Usage
+
+```php
+
+DB::connection('connection_name');
+// Running A Select Query
+$results = DB::select('select * from users where id = ?', [1]);
+$results = DB::select('select * from users where id = :id', ['id' => 1]);
+// Running A General Statement
+DB::statement('drop table users');
+// Listening For Query Events
+DB::listen(function($sql, $bindings, $time){ code_here; });
+// Database Transactions
+DB::transaction(function()
+{
+  DB::table('users')->update(['votes' => 1]);
+  DB::table('posts')->delete();
+});
+DB::beginTransaction();
+DB::rollBack();
+DB::commit();
+              ```
+
+###### Query Builder[](http://laravel.com/docs/5.1/queries "Query Builder @ Laravel Docs")
+
+```php
+
+// Retrieving All Rows From A Table
+DB::table('name')->get();
+// Chunking Results From A Table
+DB::table('users')->chunk(100, function($users)
+{
+  foreach ($users as $user)
+  {
+      //
+  }
+});
+// Retrieving A Single Row From A Table
+$user = DB::table('users')->where('name', 'John')->first();
+DB::table('name')->first();
+// Retrieving A Single Column From A Row
+$name = DB::table('users')->where('name', 'John')->pluck('name');
+DB::table('name')->pluck('column');
+// Retrieving A List Of Column Values
+$roles = DB::table('roles')->lists('title');
+$roles = DB::table('roles')->lists('title', 'name');
+// Specifying A Select Clause
+$users = DB::table('users')->select('name', 'email')->get();
+$users = DB::table('users')->distinct()->get();
+$users = DB::table('users')->select('name as user_name')->get();
+// Adding A Select Clause To An Existing Query
+$query = DB::table('users')->select('name');
+$users = $query->addSelect('age')->get();
+// Using Where Operators
+$users = DB::table('users')->where('votes', '>', 100)->get();
+$users = DB::table('users')
+              ->where('votes', '>', 100)
+              ->orWhere('name', 'John')
+              ->get();
+$users = DB::table('users')
+              ->whereBetween('votes', [1, 100])->get();
+$users = DB::table('users')
+              ->whereNotBetween('votes', [1, 100])->get();
+$users = DB::table('users')
+              ->whereIn('id', [1, 2, 3])->get();
+$users = DB::table('users')
+              ->whereNotIn('id', [1, 2, 3])->get();
+$users = DB::table('users')
+              ->whereNull('updated_at')->get();
+DB::table('name')->whereNotNull('column')->get();
+// Dynamic Where Clauses
+$admin = DB::table('users')->whereId(1)->first();
+$john = DB::table('users')
+              ->whereIdAndEmail(2, 'john@doe.com')
+              ->first();
+$jane = DB::table('users')
+              ->whereNameOrAge('Jane', 22)
+              ->first();
+// Order By, Group By, And Having
+$users = DB::table('users')
+              ->orderBy('name', 'desc')
+              ->groupBy('count')
+              ->having('count', '>', 100)
+              ->get();
+DB::table('name')->orderBy('column')->get();
+DB::table('name')->orderBy('column','desc')->get();
+DB::table('name')->having('count', '>', 100)->get();
+// Offset & Limit
+$users = DB::table('users')->skip(10)->take(5)->get();
+          ```
+
+###### Joins[](http://laravel.com/docs/5.1/queries#joins "Joins @ Laravel Docs")
+
+```php
+
+// Basic Join Statement
+DB::table('users')
+          ->join('contacts', 'users.id', '=', 'contacts.user_id')
+          ->join('orders', 'users.id', '=', 'orders.user_id')
+          ->select('users.id', 'contacts.phone', 'orders.price')
+          ->get();
+// Left Join Statement
+DB::table('users')
+      ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
+      ->get();
+// select * from users where name = 'John' or (votes > 100 and title <> 'Admin')
+DB::table('users')
+          ->where('name', '=', 'John')
+          ->orWhere(function($query)
+          {
+              $query->where('votes', '>', 100)
+                    ->where('title', '<>', 'Admin');
+          })
+          ->get();
+          ```
+
+###### Aggregates[](http://laravel.com/docs/5.1/queries#aggregates "Aggregates @ Laravel Docs")
+
+```php
+
+$users = DB::table('users')->count();
+$price = DB::table('orders')->max('price');
+$price = DB::table('orders')->min('price');
+$price = DB::table('orders')->avg('price');
+$total = DB::table('users')->sum('votes');
+          ```
+
+###### Raw Expressions[](http://laravel.com/docs/5.1/queries#raw-expressions "Raw Expressions @ Laravel Docs")
+
+```php
+
+$users = DB::table('users')
+                   ->select(DB::raw('count(*) as user_count, status'))
+                   ->where('status', '<>', 1)
+                   ->groupBy('status')
+                   ->get();
+// return rows
+DB::select('select * from users where id = ?', array('value'));
+// return nr affected rows
+DB::insert('insert into foo set bar=2');
+DB::update('update foo set bar=2');
+DB::delete('delete from bar');
+// returns void
+DB::statement('update foo set bar=2');
+// raw expression inside a statement
+DB::table('name')->select(DB::raw('count(*) as count, column2'))->get();
+          ```
+
+###### Inserts / Updates / Deletes / Unions / Pessimistic Locking
+
+```php
+
+// Inserts
+DB::table('users')->insert(
+  ['email' => 'john@example.com', 'votes' => 0]
+);
+$id = DB::table('users')->insertGetId(
+  ['email' => 'john@example.com', 'votes' => 0]
+);
+DB::table('users')->insert([
+  ['email' => 'taylor@example.com', 'votes' => 0],
+  ['email' => 'dayle@example.com', 'votes' => 0]
+]);
+// Updates
+DB::table('users')
+          ->where('id', 1)
+          ->update(['votes' => 1]);
+DB::table('users')->increment('votes');
+DB::table('users')->increment('votes', 5);
+DB::table('users')->decrement('votes');
+DB::table('users')->decrement('votes', 5);
+DB::table('users')->increment('votes', 1, ['name' => 'John']);
+// Deletes
+DB::table('users')->where('votes', '<', 100)->delete();
+DB::table('users')->delete();
+DB::table('users')->truncate();
+// Unions
+// The unionAll() method is also available, and has the same method signature as union.
+$first = DB::table('users')->whereNull('first_name');
+$users = DB::table('users')->whereNull('last_name')->union($first)->get();
+// Pessimistic Locking
+DB::table('users')->where('votes', '>', 100)->sharedLock()->get();
+DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
+              ```
+
+___
+
+#### [Model](#eloquent)[](http://laravel.com/docs/eloquent "Eloquent @ Laravel Docs")
+
+###### Basic Usage[](http://laravel.com/docs/5.1/eloquent#basic-usage "Basic Usage @ Laravel Docs")
+
+```php
+
+// Defining An Eloquent Model
+class User extends Model {}
+// generate Eloquent models
+php artisan make:model User
+// specify a custom table name
+class User extends Model {
+  protected $table = 'my_users';
+}
+          ```
+
+###### More
+
+```php
+
+Model::create(array('key' => 'value'));
+// Find first matching record by attributes or create
+Model::firstOrCreate(array('key' => 'value'));
+// Find first record by attributes or instantiate
+Model::firstOrNew(array('key' => 'value'));
+// Create or update a record matching attibutes, and fill with values
+Model::updateOrCreate(array('search_key' => 'search_value'), array('key' => 'value'));
+// Fill a model with an array of attributes, beware of mass assignment!
+Model::fill($attributes);
+Model::destroy(1);
+Model::all();
+Model::find(1);
+// Find using dual primary key
+Model::find(array('first', 'last'));
+// Throw an exception if the lookup fails
+Model::findOrFail(1);
+// Find using dual primary key and throw exception if the lookup fails
+Model::findOrFail(array('first', 'last'));
+Model::where('foo', '=', 'bar')->get();
+Model::where('foo', '=', 'bar')->first();
+Model::where('foo', '=', 'bar')->exists();
+// dynamic
+Model::whereFoo('bar')->first();
+// Throw an exception if the lookup fails
+Model::where('foo', '=', 'bar')->firstOrFail();
+Model::where('foo', '=', 'bar')->count();
+Model::where('foo', '=', 'bar')->delete();
+//Output raw query
+Model::where('foo', '=', 'bar')->toSql();
+Model::whereRaw('foo = bar and cars = 2', array(20))->get();
+Model::on('connection-name')->find(1);
+Model::with('relation')->get();
+Model::all()->take(10);
+Model::all()->skip(10);
+// Default Eloquent sort is ascendant
+Model::all()->orderBy('column');
+Model::all()->orderBy('column','desc');
+              ```
+
+###### Soft Delete[](http://laravel.com/docs/5.1/eloquent#soft-deleting "Soft Deleting @ Laravel Docs")
+
+```php
+
+Model::withTrashed()->where('cars', 2)->get();
+// Include the soft deleted models in the results
+Model::withTrashed()->where('cars', 2)->restore();
+Model::where('cars', 2)->forceDelete();
+// Force the result set to only included soft deletes
+Model::onlyTrashed()->where('cars', 2)->get();
+              ```
+
+###### Relationships
+
+```php
+
+// One To One - User::phone()
+  return $this->hasOne('App\Phone', 'foreign_key', 'local_key');
+// One To One - Phone::user(), The Inverse Of The Relation
+return $this->belongsTo('App\User', 'foreign_key', 'other_key');
+
+// One To Many - Post::comments()
+return $this->hasMany('App\Comment', 'foreign_key', 'local_key');
+//  One To Many - Comment::post()
+return $this->belongsTo('App\Post', 'foreign_key', 'other_key');
+
+// Many To Many - User::roles();
+return $this->belongsToMany('App\Role', 'user_roles', 'user_id', 'role_id');
+// Many To Many - Role::users();
+return $this->belongsToMany('App\User');
+// Many To Many - Retrieving Intermediate Table Columns
+$role->pivot->created_at;
+// Many To Many - Pivot table with extra attributes
+return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');
+// Many To Many - Automatically maintained created_at and updated_at timestamps
+return $this->belongsToMany('App\Role')->withTimestamps();
+
+// Has Many Through - Country::posts(), A Country model have
+// many Post models through an intermediate User model (User::country_id)
+return $this->hasManyThrough('App\Post', 'App\User', 'country_id', 'user_id');
+
+// Polymorphic Relations - Photo::imageable()
+return $this->morphTo();
+// Polymorphic Relations - Staff::photos()
+return $this->morphMany('App\Photo', 'imageable');
+// Polymorphic Relations - Product::photos()
+return $this->morphMany('App\Photo', 'imageable');
+// Polymorphic Relations - Register the morphMap in your AppServiceProvider
+Relation::morphMap([
+    'Post' => App\Post::class,
+    'Comment' => App\Comment::class,
+]);
+
+// Many To Many Polymorphic Relations - Tables: posts,videos,tags,taggables
+// Post::tags()
+return $this->morphToMany('App\Tag', 'taggable');
+// Video::tags()
+return $this->morphToMany('App\Tag', 'taggable');
+// Tag::posts()
+return $this->morphedByMany('App\Post', 'taggable');
+// Tag::videos()
+return $this->morphedByMany('App\Video', 'taggable');
+
+// Querying Relations
+$user->posts()->where('active', 1)->get();
+// Retrieve all posts that have at least one comment...
+$posts = App\Post::has('comments')->get();
+// Retrieve all posts that have three or more comments...
+$posts = Post::has('comments', '>=', 3)->get();
+// Retrieve all posts that have at least one comment with votes...
+$posts = Post::has('comments.votes')->get();
+// Retrieve all posts with at least one comment containing words like foo%
+$posts = Post::whereHas('comments', function ($query) {
+    $query->where('content', 'like', 'foo%');
+})->get();
+
+// Eager Loading
+$books = App\Book::with('author')->get();
+$books = App\Book::with('author', 'publisher')->get();
+$books = App\Book::with('author.contacts')->get();
+
+// Lazy Eager Loading
+$books->load('author', 'publisher');
+
+// Inserting Related Models
+$comment = new App\Comment(['message' => 'A new comment.']);
+$post->comments()->save($comment);
+// save multiple related models
+$post->comments()->saveMany([
+    new App\Comment(['message' => 'A new comment.']),
+    new App\Comment(['message' => 'Another comment.']),
+]);
+$post->comments()->create(['message' => 'A new comment.']);
+
+// Updating a belongsTo relationship
+$user->account()->associate($account);
+$user->save();
+$user->account()->dissociate();
+$user->save();
+
+// Inserting Related Models - Many To Many Relationships
+$user->roles()->attach($roleId);
+$user->roles()->attach($roleId, ['expires' => $expires]);
+// Detach a single role from the user...
+$user->roles()->detach($roleId);
+// Detach all roles from the user...
+$user->roles()->detach();
+$user->roles()->detach([1, 2, 3]);
+$user->roles()->attach([1 => ['expires' => $expires], 2, 3]);
+
+// Any IDs that are not in the given array will be removed from the intermediate table.
+$user->roles()->sync([1, 2, 3]);
+// You may also pass additional intermediate table values with the IDs:
+$user->roles()->sync([1 => ['expires' => true], 2, 3]);
+
+              ```
+
+###### Events
+
+```php
+
+Model::creating(function($model){});
+Model::created(function($model){});
+Model::updating(function($model){});
+Model::updated(function($model){});
+Model::saving(function($model){});
+Model::saved(function($model){});
+Model::deleting(function($model){});
+Model::deleted(function($model){});
+Model::observe(new FooObserver);
+              ```
+
+###### Eloquent Configuration
+
+```php
+
+// Disables mass assignment exceptions from being thrown from model inserts and updates
+Eloquent::unguard();
+// Renables any ability to throw mass assignment exceptions
+Eloquent::reguard();
+              ```
+
+___
+
+#### [Pagination](#pagination)[](http://laravel.com/docs/pagination "Pagination @ Laravel Docs")
+
+```php
+
+// Auto-Magic Pagination
+Model::paginate(15);
+Model::where('cars', 2)->paginate(15);
+// "Next" and "Previous" only
+Model::where('cars', 2)->simplePaginate(15);
+// Manual Paginator
+Paginator::make($items, $totalItems, $perPage);
+// Print page navigators in view
+$variable->links();
+              ```
+
+___
+
+#### [Lang](#localization)[](http://laravel.com/docs/localization "Localization @ Laravel Docs")
+
+```php
+
+App::setLocale('en');
+Lang::get('messages.welcome');
+Lang::get('messages.welcome', array('foo' => 'Bar'));
+Lang::has('messages.welcome');
+Lang::choice('messages.apples', 10);
+// Lang::get alias
+trans('messages.welcome');
+              ```
+
+___
+
+#### [File](#files)[](http://laravel.com/api/5.1/Illuminate/Filesystem/Filesystem.html "Filesystem @ Laravel Docs")
+
+```php
+
+File::exists('path');
+File::get('path');
+File::getRemote('path');
+// Get a file's contents by requiring it
+File::getRequire('path');
+// Require the given file once
+File::requireOnce('path');
+// Write the contents of a file
+File::put('path', 'contents');
+// Append to a file
+File::append('path', 'data');
+// Delete the file at a given path
+File::delete('path');
+// Move a file to a new location
+File::move('path', 'target');
+// Copy a file to a new location
+File::copy('path', 'target');
+// Extract the file extension from a file path
+File::extension('path');
+// Get the file type of a given file
+File::type('path');
+// Get the file size of a given file
+File::size('path');
+// Get the file's last modification time
+File::lastModified('path');
+// Determine if the given path is a directory
+File::isDirectory('directory');
+// Determine if the given path is writable
+File::isWritable('path');
+// Determine if the given path is a file
+File::isFile('file');
+// Find path names matching a given pattern.
+File::glob($patterns, $flag);
+// Get an array of all files in a directory.
+File::files('directory');
+// Get all of the files from the given directory (recursive).
+File::allFiles('directory');
+// Get all of the directories within a given directory.
+File::directories('directory');
+// Create a directory
+File::makeDirectory('path',  $mode = 0777, $recursive = false);
+// Copy a directory from one location to another
+File::copyDirectory('directory', 'destination', $options = null);
+// Recursively delete a directory
+File::deleteDirectory('directory', $preserve = false);
+// Empty the specified directory of all files and folders
+File::cleanDirectory('directory');
+              ```
+
+___
+
+#### [UnitTest](#unittest)[](http://laravel.com/docs/testing "Unit testing @ Laravel Docs")
+
+###### Install and run
+
+```php
+
+// add to composer and update:
+"phpunit/phpunit": "4.0.*"
+// run tests (from project root)
+./vendor/bin/phpunit
+              ```
+
+###### Asserts
+
+```php
+
+$this->assertTrue(true);
+$this->assertEquals('foo', $bar);
+$this->assertCount(1,$times);
+$this->assertResponseOk();
+$this->assertResponseStatus(403);
+$this->assertRedirectedTo('foo');
+$this->assertRedirectedToRoute('route.name');
+$this->assertRedirectedToAction('Controller@method');
+$this->assertViewHas('name');
+$this->assertViewHas('age', $value);
+$this->assertSessionHasErrors();
+// Asserting the session has errors for a given key...
+$this->assertSessionHasErrors('name');
+// Asserting the session has errors for several keys...
+$this->assertSessionHasErrors(array('name', 'age'));
+$this->assertHasOldInput();
+              ```
+
+###### Calling routes
+
+```php
+
+$response = $this->call($method, $uri, $parameters, $files, $server, $content);
+$response = $this->callSecure('GET', 'foo/bar');
+$this->session(['foo' => 'bar']);
+$this->flushSession();
+$this->seed();
+$this->seed($connection);
+              ```
+
+___
+
+#### [SSH](#SSH)[](http://laravel.com/docs/ssh "SSH @ Laravel Docs")
+
+###### Executing Commands
+
+```php
+
+SSH::run(array $commands);
+SSH::into($remote)->run(array $commands); // specify remote, otherwise assumes default
+SSH::run(array $commands, function($line)
+{
+  echo $line.PHP_EOL;
+});
+              ```
+
+###### Tasks
+
+```php
+
+// define
+SSH::define($taskName, array $commands);
+// execute
+SSH::task($taskName, function($line)
+{
+  echo $line.PHP_EOL;
+});
+              ```
+
+###### SFTP Uploads
+
+```php
+
+SSH::put($localFile, $remotePath);
+SSH::putString($string, $remotePath);
+              ```
+
+___
+
+#### [Schema](#chema)[](http://laravel.com/docs/schema "Schema Builder @ Laravel Docs")
+
+```php
+
+// Indicate that the table needs to be created
+Schema::create('table', function($table)
+{
+  $table->increments('id');
+});
+// Specify a Connection
+Schema::connection('foo')->create('table', function($table){});
+// Rename the table to a given name
+Schema::rename($from, $to);
+// Indicate that the table should be dropped
+Schema::drop('table');
+// Indicate that the table should be dropped if it exists
+Schema::dropIfExists('table');
+// Determine if the given table exists
+Schema::hasTable('table');
+// Determine if the given table has a given column
+Schema::hasColumn('table', 'column');
+// Update an existing table
+Schema::table('table', function($table){});
+// Indicate that the given columns should be renamed
+$table->renameColumn('from', 'to');
+// Indicate that the given columns should be dropped
+$table->dropColumn(string|array);
+// The storage engine that should be used for the table
+$table->engine = 'InnoDB';
+// Only work on MySQL
+$table->string('name')->after('email');
+              ```
+
+###### Indexes
+
+```php
+
+$table->string('column')->unique();
+$table->primary('column');
+// Creates a dual primary key
+$table->primary(array('first', 'last'));
+$table->unique('column');
+$table->unique('column', 'key_name');
+// Creates a dual unique index
+$table->unique(array('first', 'last'));
+$table->unique(array('first', 'last'), 'key_name');
+$table->index('column');
+$table->index('column', 'key_name');
+// Creates a dual index
+$table->index(array('first', 'last'));
+$table->index(array('first', 'last'), 'key_name');
+$table->dropPrimary(array('column'));
+$table->dropPrimary('table_column_primary');
+$table->dropUnique(array('column'));
+$table->dropUnique('table_column_unique');
+$table->dropIndex(array('column'));
+$table->dropIndex('table_column_index');
+              ```
+
+###### Foreign Keys
+
+```php
+
+$table->foreign('user_id')->references('id')->on('users');
+$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'|'restrict'|'set null'|'no action');
+$table->foreign('user_id')->references('id')->on('users')->onUpdate('cascade'|'restrict'|'set null'|'no action');
+$table->dropForeign(array('user_id'));
+$table->dropForeign('posts_user_id_foreign');
+              ```
+
+###### Column Types
+
+```php
+
+// Increments
+$table->increments('id');
+$table->bigIncrements('id');
+
+// Numbers
+$table->integer('votes');
+$table->tinyInteger('votes');
+$table->smallInteger('votes');
+$table->mediumInteger('votes');
+$table->bigInteger('votes');
+$table->float('amount');
+$table->double('column', 15, 8);
+$table->decimal('amount', 5, 2);
+
+//String and Text
+$table->char('name', 4);
+$table->string('email');
+$table->string('name', 100);
+$table->text('description');
+$table->mediumText('description');
+$table->longText('description');
+
+//Date and Time
+$table->date('created_at');
+$table->dateTime('created_at');
+$table->time('sunrise');
+$table->timestamp('added_on');
+// Adds created_at and updated_at columns
+$table->timestamps();
+$table->nullableTimestamps();
+
+// Others
+$table->binary('data');
+$table->boolean('confirmed');
+// Adds deleted_at column for soft deletes
+$table->softDeletes();
+$table->enum('choices', array('foo', 'bar'));
+// Adds remember_token as VARCHAR(100) NULL
+$table->rememberToken();
+// Adds INTEGER parent_id and STRING parent_type
+$table->morphs('parent');
+->nullable()
+->default($value)
+->unsigned()
+              ```
+
+___
+
+#### [Input](#input)[](http://laravel.com/docs/requests "Input @ Laravel Docs")
+
+```php
+
+Input::get('key');
+// Default if the key is missing
+Input::get('key', 'default');
+Input::has('key');
+Input::all();
+// Only retrieve 'foo' and 'bar' when getting input
+Input::only('foo', 'bar');
+// Disregard 'foo' when getting input
+Input::except('foo');
+Input::flush();
+              ```
+
+###### Session Input (flash)
+
+```php
+
+// Flash input to the session
+Input::flash();
+// Flash only some of the input to the session
+Input::flashOnly('foo', 'bar');
+// Flash only some of the input to the session
+Input::flashExcept('foo', 'baz');
+// Retrieve an old input item
+Input::old('key','default_value');
+              ```
+
+###### Files
+
+```php
+
+// Use a file that's been uploaded
+Input::file('filename');
+// Determine if a file was uploaded
+Input::hasFile('filename');
+// Access file properties
+Input::file('name')->getRealPath();
+Input::file('name')->getClientOriginalName();
+Input::file('name')->getClientOriginalExtension();
+Input::file('name')->getSize();
+Input::file('name')->getMimeType();
+// Move an uploaded file
+Input::file('name')->move($destinationPath);
+// Move an uploaded file
+Input::file('name')->move($destinationPath, $fileName);
+              ```
+
+___
+
+#### [Cache](#cache)[](http://laravel.com/docs/cache "Cache @ Laravel Docs")
+
+```php
+
+Cache::put('key', 'value', $minutes);
+Cache::add('key', 'value', $minutes);
+Cache::forever('key', 'value');
+Cache::remember('key', $minutes, function(){ return 'value' });
+Cache::rememberForever('key', function(){ return 'value' });
+Cache::forget('key');
+Cache::has('key');
+Cache::get('key');
+Cache::get('key', 'default');
+Cache::get('key', function(){ return 'default'; });
+Cache::tags('my-tag')->put('key','value', $minutes);
+Cache::tags('my-tag')->has('key');
+Cache::tags('my-tag')->get('key');
+Cache::tags('my-tag')->forget('key');
+Cache::tags('my-tag')->flush();
+Cache::increment('key');
+Cache::increment('key', $amount);
+Cache::decrement('key');
+Cache::decrement('key', $amount);
+Cache::section('group')->put('key', $value);
+Cache::section('group')->get('key');
+Cache::section('group')->flush();
+              ```
+
+___
+
+#### [Cookie](#cookies)[](http://laravel.com/docs/requests#cookies "Cookies @ Laravel Docs")
+
+```php
+
+Cookie::get('key');
+Cookie::get('key', 'default');
+// Create a cookie that lasts for ever
+Cookie::forever('key', 'value');
+// Create a cookie that lasts N minutes
+Cookie::make('key', 'value', 'minutes');
+// Set a cookie before a response has been created
+Cookie::queue('key', 'value', 'minutes');
+// Forget cookie
+Cookie::forget('key');
+// Send a cookie with a response
+$response = Response::make('Hello World');
+// Add a cookie to the response
+$response->withCookie(Cookie::make('name', 'value', $minutes));
+              ```
+
+___
+
+#### [Session](#sessions)[](http://laravel.com/docs/session "Session @ Laravel Docs")
+
+```php
+
+Session::get('key');
+// Returns an item from the session
+Session::get('key', 'default');
+Session::get('key', function(){ return 'default'; });
+// Get the session ID
+Session::getId();
+// Put a key / value pair in the session
+Session::put('key', 'value');
+// Push a value into an array in the session
+Session::push('foo.bar','value');
+// Returns all items from the session
+Session::all();
+// Checks if an item is defined
+Session::has('key');
+// Remove an item from the session
+Session::forget('key');
+// Remove all of the items from the session
+Session::flush();
+// Generate a new session identifier
+Session::regenerate();
+// Flash a key / value pair to the session
+Session::flash('key', 'value');
+// Reflash all of the session flash data
+Session::reflash();
+// Reflash a subset of the current flash data
+Session::keep(array('key1', 'key2'));
+              ```
+
+___
+
+#### [Request](#requests)[](http://laravel.com/docs/requests "Requests @ Laravel Docs")
+
+```php
+
+// url: http://xx.com/aa/bb
+Request::url();
+// path: /aa/bb
+Request::path();
+// getRequestUri: /aa/bb/?c=d
+Request::getRequestUri();
+// Returns user's IP
+Request::ip();
+// getUri: http://xx.com/aa/bb/?c=d
+Request::getUri();
+// getQueryString: c=d
+Request::getQueryString();
+// Get the port scheme of the request (e.g., 80, 443, etc.)
+Request::getPort();
+// Determine if the current request URI matches a pattern
+Request::is('foo/*');
+// Get a segment from the URI (1 based index)
+Request::segment(1);
+// Retrieve a header from the request
+Request::header('Content-Type');
+// Retrieve a server variable from the request
+Request::server('PATH_INFO');
+// Determine if the request is the result of an AJAX call
+Request::ajax();
+// Determine if the request is over HTTPS
+Request::secure();
+// Get the request method
+Request::method();
+// Checks if the request method is of specified type
+Request::isMethod('post');
+// Get raw POST data
+Request::instance()->getContent();
+// Get requested response format
+Request::format();
+// true if HTTP Content-Type header contains */json
+Request::isJson();
+// true if HTTP Accept header is application/json
+Request::wantsJson();
+
+              ```
+
+___
+
+#### [Response](#responses)[](http://laravel.com/docs/responses "Responses @ Laravel Docs")
+
+```php
+
+return Response::make($contents);
+return Response::make($contents, 200);
+return Response::json(array('key' => 'value'));
+return Response::json(array('key' => 'value'))
+->setCallback(Input::get('callback'));
+return Response::download($filepath);
+return Response::download($filepath, $filename, $headers);
+// Create a response and modify a header value
+$response = Response::make($contents, 200);
+$response->header('Content-Type', 'application/json');
+return $response;
+// Attach a cookie to a response
+return Response::make($content)
+->withCookie(Cookie::make('key', 'value'));
+              ```
+
+___
+
+#### [Redirect](#redirects)[](http://laravel.com/docs/responses#redirects "Redirects @ Laravel Docs")
+
+```php
+
+return Redirect::to('foo/bar');
+return Redirect::to('foo/bar')->with('key', 'value');
+return Redirect::to('foo/bar')->withInput(Input::get());
+return Redirect::to('foo/bar')->withInput(Input::except('password'));
+return Redirect::to('foo/bar')->withErrors($validator);
+// Create a new redirect response to the previous location
+return Redirect::back();
+// Create a new redirect response to a named route
+return Redirect::route('foobar');
+return Redirect::route('foobar', array('value'));
+return Redirect::route('foobar', array('key' => 'value'));
+// Create a new redirect response to a controller action
+return Redirect::action('FooController@index');
+return Redirect::action('FooController@baz', array('value'));
+return Redirect::action('FooController@baz', array('key' => 'value'));
+// If intended redirect is not defined, defaults to foo/bar.
+return Redirect::intended('foo/bar');
+              ```
+
+___
+
+#### [Container](#service-container)[](http://laravel.com/docs/container "Service Container @ Laravel Docs")
+
+```php
+
+App::bind('foo', function($app){ return new Foo; });
+App::make('foo');
+// If this class exists, it's returned
+App::make('FooBar');
+// Register a shared binding in the container
+App::singleton('foo', function(){ return new Foo; });
+// Register an existing instance as shared in the container
+App::instance('foo', new Foo);
+// Register a binding with the container
+App::bind('FooRepositoryInterface', 'BarRepository');
+// Register a service provider with the application
+App::register('FooServiceProvider');
+// Listen for object resolution
+App::resolving(function($object){});
+              ```
+
+___
+
+#### [Security](#security)
+
+###### Hashing[](http://laravel.com/docs/hashing "Hashing @ Laravel Docs")
+
+```php
+
+Hash::make('secretpassword');
+Hash::check('secretpassword', $hashedPassword);
+Hash::needsRehash($hashedPassword);
+              ```
+
+###### Encryption
+
+```php
+
+Crypt::encrypt('secretstring');
+Crypt::decrypt($encryptedString);
+Crypt::setMode('ctr');
+Crypt::setCipher($cipher);
+              ```
+
+___
+
+#### [Auth](#auth)
+
+###### Authentication[](http://laravel.com/docs/authentication "Authentication @ Laravel Docs")
+
+```php
+
+// Determine if the current user is authenticated
+Auth::check();
+// Get the currently authenticated user
+Auth::user();
+// Get the ID of the currently authenticated user
+Auth::id();
+// Attempt to authenticate a user using the given credentials
+Auth::attempt(array('email' => $email, 'password' => $password));
+// 'Remember me' by passing true to Auth::attempt()
+Auth::attempt($credentials, true);
+// Log in for a single request
+Auth::once($credentials);
+// Log a user into the application
+Auth::login(User::find(1));
+// Log the given user ID into the application
+Auth::loginUsingId(1);
+// Log the user out of the application
+Auth::logout();
+// Validate a user's credentials
+Auth::validate($credentials);
+// Attempt to authenticate using HTTP Basic Auth
+Auth::basic('username');
+// Perform a stateless HTTP Basic login attempt
+Auth::onceBasic();
+// Send a password reminder to a user
+Password::remind($credentials, function($message, $user){});
+              ```
+
+###### Authorization[](http://laravel.com/docs/5.1/authorization "Authorization @ Laravel Docs")
+
+```php
+
+// Define abilities
+Gate::define('update-post', 'Class@method');
+Gate::define('update-post', function ($user, $post) {...});
+// Passing multiple argument
+Gate::define('delete-comment', function ($user, $post, $comment) {});
+
+// Check abilities
+Gate::denies('update-post', $post);
+Gate::allows('update-post', $post);
+Gate::check('update-post', $post);
+// Specified a user for checking
+Gate::forUser($user)->allows('update-post', $post);
+// Through User model, using Authorizable trait
+User::find(1)->can('update-post', $post);
+User::find(1)->cannot('update-post', $post);
+
+// Intercepting Authorization Checks
+Gate::before(function ($user, $ability) {});
+Gate::after(function ($user, $ability) {});
+
+// Chekcing in Blade template
+@can('update-post', $post)
+@endcan
+// with else
+@can('update-post', $post)
+@else
+@endcan
+
+// Generate a Policy
+php artisan make:policy PostPolicy
+// `policy` helper function
+policy($post)->update($user, $post)
+
+// Controller Authorization
+$this->authorize('update', $post);
+// for $user
+$this->authorizeForUser($user, 'update', $post);
+
+                      ```
+
+___
+
+#### [Mail](#mail)[](http://laravel.com/docs/mail "Mail @ Laravel Docs")
+
+```php
+
+Mail::send('email.view', $data, function($message){});
+Mail::send(array('html.view', 'text.view'), $data, $callback);
+Mail::queue('email.view', $data, function($message){});
+Mail::queueOn('queue-name', 'email.view', $data, $callback);
+Mail::later(5, 'email.view', $data, function($message){});
+// Write all email to logs instead of sending
+Mail::pretend();
+              ```
+
+###### Messages
+
+```php
+
+// These can be used on the $message instance passed into Mail::send() or Mail::queue()
+$message->from('email@example.com', 'Mr. Example');
+$message->sender('email@example.com', 'Mr. Example');
+$message->returnPath('email@example.com');
+$message->to('email@example.com', 'Mr. Example');
+$message->cc('email@example.com', 'Mr. Example');
+$message->bcc('email@example.com', 'Mr. Example');
+$message->replyTo('email@example.com', 'Mr. Example');
+$message->subject('Welcome to the Jungle');
+$message->priority(2);
+$message->attach('foo\bar.txt', $options);
+// This uses in-memory data as attachments
+$message->attachData('bar', 'Data Name', $options);
+// Embed a file in the message and get the CID
+$message->embed('foo\bar.txt');
+$message->embedData('foo', 'Data Name', $options);
+// Get the underlying Swift Message instance
+$message->getSwiftMessage();
+              ```
+
+___
+
+#### [Queue](#queues)[](http://laravel.com/docs/queues "Queues @ Laravel Docs")
+
+```php
+
+Queue::push('SendMail', array('message' => $message));
+Queue::push('SendEmail@send', array('message' => $message));
+Queue::push(function($job) use $id {});
+// Same payload to multiple workers
+Queue::bulk(array('SendEmail', 'NotifyUser'), $payload);
+// Starting the queue listener
+php artisan queue:listen
+php artisan queue:listen connection
+php artisan queue:listen --timeout=60
+// Process only the first job on the queue
+php artisan queue:work
+// Start a queue worker in daemon mode
+php artisan queue:work --daemon
+// Create migration file for failed jobs
+php artisan queue:failed-table
+// Listing failed jobs
+php artisan queue:failed
+// Delete failed job by id
+php artisan queue:forget 5
+// Delete all failed jobs
+php artisan queue:flush
+              ```
+
+___
+
+#### [Validation](#validation)[](http://laravel.com/docs/validation "Validation @ Laravel Docs")
+
+```php
+
+Validator::make(
+array('key' => 'Foo'),
+array('key' => 'required|in:Foo')
+);
+Validator::extend('foo', function($attribute, $value, $params){});
+Validator::extend('foo', 'FooValidator@validate');
+Validator::resolver(function($translator, $data, $rules, $msgs)
+{
+return new FooValidator($translator, $data, $rules, $msgs);
+});
+              ```
+
+###### Rules
+
+```php
+
+accepted
+active_url
+after:YYYY-MM-DD
+before:YYYY-MM-DD
+alpha
+alpha_dash
+alpha_num
+array
+between:1,10
+confirmed
+date
+date_format:YYYY-MM-DD
+different:fieldname
+digits:value
+digits_between:min,max
+boolean
+email
+exists:table,column
+image
+in:foo,bar,...
+not_in:foo,bar,...
+integer
+numeric
+ip
+max:value
+min:value
+mimes:jpeg,png
+regex:[0-9]
+required
+required_if:field,value
+required_with:foo,bar,...
+required_with_all:foo,bar,...
+required_without:foo,bar,...
+required_without_all:foo,bar,...
+same:field
+size:value
+timezone
+unique:table,column,except,idColumn
+url
+
+              ```
+
+___
+
+#### [View](#views)[](http://laravel.com/docs/views "Views @ Laravel Docs")
+
+```php
+
+View::make('path/to/view');
+View::make('foo/bar')->with('key', 'value');
+View::make('foo/bar')->withKey('value');
+View::make('foo/bar', array('key' => 'value'));
+View::exists('foo/bar');
+// Share a value across all views
+View::share('key', 'value');
+// Nesting views
+View::make('foo/bar')->nest('name', 'foo/baz', $data);
+// Register a view composer
+View::composer('viewname', function($view){});
+//Register multiple views to a composer
+View::composer(array('view1', 'view2'), function($view){});
+// Register a composer class
+View::composer('viewname', 'FooComposer');
+View::creator('viewname', function($view){});
+              ```
+
+___
+
+#### [Blade](#blade)[](http://laravel.com/docs/templates#blade-templating "Blade Templating @ Laravel Docs")
+
+```php
+
+
+// Show a section in a template
+@yield('name')
+@extends('layout.name')
+// Begin a section
+@section('name')
+// End a section
+@stop
+// End a section and yield
+@section('sidebar')
+@show
+@parent
+
+@include('view.name')
+@include('view.name', array('key' => 'value'));
+@lang('messages.name')
+@choice('messages.name', 1);
+
+@if
+@else
+@elseif
+@endif
+
+@unless
+@endunless
+
+@for
+@endfor
+
+@foreach
+@endforeach
+
+@while
+@endwhile
+
+//forelse 4.2 feature
+@forelse($users as $user)
+@empty
+@endforelse
+
+// Echo content
+{{ $var }}
+// Echo escaped content
+{{{ $var }}}
+// Echo unescaped content; 5.0 feature
+{!! $var !!}
+{{-- Blade Comment --}}
+// Echoing Data After Checking For Existence
+{{{ $name or 'Default' }}}
+// Displaying Raw Text With Curly Braces
+@{{ This will not be processed by Blade }}
+```
+
+___
+
+#### [Form](#forms)[](https://github.com/illuminate/html/ "Forms & HTML @ GitHub")
+
+```php
+
+
+Form::open(array('url' => 'foo/bar', 'method' => 'PUT'));
+Form::open(array('route' => 'foo.bar'));
+Form::open(array('route' => array('foo.bar', $parameter)));
+Form::open(array('action' => 'FooController@method'));
+Form::open(array('action' => array('FooController@method', $parameter)));
+Form::open(array('url' => 'foo/bar', 'files' => true));
+Form::close();
+Form::token();
+Form::model($foo, array('route' => array('foo.bar', $foo->bar)));
+
+              ```
+
+###### Form Elements
+
+```php
+
+
+Form::label('id', 'Description');
+Form::label('id', 'Description', array('class' => 'foo'));
+Form::text('name');
+Form::text('name', $value);
+Form::text('name', $value, array('class' => 'name'));
+Form::textarea('name');
+Form::textarea('name', $value);
+Form::textarea('name', $value, array('class' => 'name'));
+Form::hidden('foo', $value);
+Form::password('password');
+Form::password('password', array('placeholder' => 'Password'));
+Form::email('name', $value, array());
+Form::file('name', array('class' => 'name'));
+Form::checkbox('name', 'value');
+// Generating a checkbox that is checked
+Form::checkbox('name', 'value', true, array('class' => 'name'));
+Form::radio('name', 'value');
+// Generating a radio input that is selected
+Form::radio('name', 'value', true, array('class' => 'name'));
+Form::select('name', array('key' => 'value'));
+Form::select('name', array('key' => 'value'), 'key', array('class' => 'name'));
+Form::selectRange('range', 1, 10);
+Form::selectYear('year', 2011, 2015);
+Form::selectMonth('month');
+Form::submit('Submit!', array('class' => 'name'));
+Form::button('name', array('class' => 'name'));
+Form::macro('fooField', function()
+{
+return '<input type="custom"/>';
+});
+Form::fooField();
+              ```
+
+___
+
+#### [HTML](#html)
+
+```php
+
+HTML::macro('name', function(){});
+// Convert an HTML string to entities
+HTML::entities($value);
+// Convert entities to HTML characters
+HTML::decode($value);
+// Generate a link to a JavaScript file
+HTML::script($url, $attributes);
+// Generate a link to a CSS file
+HTML::style($url, $attributes);
+// Generate an HTML image element
+HTML::image($url, $alt, $attributes);
+// Generate a HTML link
+HTML::link($url, 'title', $attributes, $secure);
+// Generate a HTTPS HTML link
+HTML::secureLink($url, 'title', $attributes);
+// Generate a HTML link to an asset
+HTML::linkAsset($url, 'title', $attributes, $secure);
+// Generate a HTTPS HTML link to an asset
+HTML::linkSecureAsset($url, 'title', $attributes);
+// Generate a HTML link to a named route
+HTML::linkRoute($name, 'title', $parameters, $attributes);
+// Generate a HTML link to a controller action
+HTML::linkAction($action, 'title', $parameters, $attributes);
+// Generate a HTML link to an email address
+HTML::mailto($email, 'title', $attributes);
+// Obfuscate an e-mail address to prevent spam-bots from sniffing it
+HTML::email($email);
+// Generate an ordered list of items
+HTML::ol($list, $attributes);
+// Generate an un-ordered list of items
+HTML::ul($list, $attributes);
+// Create a listing HTML element
+HTML::listing($type, $list, $attributes);
+// Create the HTML for a listing element
+HTML::listingElement($key, $type, $value);
+// Create the HTML for a nested listing attribute
+HTML::nestedListing($key, $type, $value);
+// Build an HTML attribute string from an array
+HTML::attributes($attributes);
+// Build a single attribute element
+HTML::attributeElement($key, $value);
+// Obfuscate a string to prevent spam-bots from sniffing it
+HTML::obfuscate($value);
+              ```
+
+___
+
+#### [String](#str)[](http://laravel.com/docs/helpers#strings "Strings CLI @ Laravel Docs")
+
+```php
+
+// Transliterate a UTF-8 value to ASCII
+Str::ascii($value)
+Str::camel($value)
+Str::contains($haystack, $needle)
+Str::endsWith($haystack, $needles)
+// Cap a string with a single instance of a given value.
+Str::finish($value, $cap)
+Str::is($pattern, $value)
+Str::length($value)
+Str::limit($value, $limit = 100, $end = '...')
+Str::lower($value)
+Str::words($value, $words = 100, $end = '...')
+Str::plural($value, $count = 2)
+// Generate a more truly "random" alpha-numeric string.
+Str::random($length = 16)
+// Generate a "random" alpha-numeric string.
+Str::quickRandom($length = 16)
+Str::upper($value)
+Str::title($value)
+Str::singular($value)
+Str::slug($title, $separator = '-')
+Str::snake($value, $delimiter = '_')
+Str::startsWith($haystack, $needles)
+// Convert a value to studly caps case.
+Str::studly($value)
+Str::macro($name, $macro)
+              ```
+
+___
+
+#### [Helper](#helpers)[](http://laravel.com/docs/helpers "Helpers @ Laravel Docs")
+
+###### Arrays
+
+```php
+
+// adds a given key / value pair to the array if the
+// given key doesn't already exist in the array
+array_add($array, 'key', 'value');
+// collapse an array of arrays into a single array
+array_collapse($array);
+// Divide an array into two arrays. One with keys and the other with values
+array_divide($array);
+// Flatten a multi-dimensional associative array with dots
+array_dot($array);
+// Get all of the given array except for a specified array of items
+array_except($array, array('key'));
+// Return the first element in an array passing a given truth test
+array_first($array, function($key, $value){}, $default);
+// Strips keys from the array
+array_flatten($array);
+// Remove one or many array items from a given array using "dot" notation
+array_forget($array, 'foo');
+// Dot notation
+array_forget($array, 'foo.bar');
+// Get an item from an array using "dot" notation
+array_get($array, 'foo', 'default');
+array_get($array, 'foo.bar', 'default');
+// Checks that a given item exists in an array using "dot" notation
+array_has($array, 'products.desk');
+// Get a subset of the items from the given array
+array_only($array, array('key'));
+// Return array of key => values
+array_pluck($array, 'key');
+// Return and remove 'key' from array
+array_pull($array, 'key');
+// Set an array item to a given value using "dot" notation
+array_set($array, 'key', 'value');
+// Dot notation
+array_set($array, 'key.subkey', 'value');
+// Sorts the array by the results of the given Closure
+array_sort($array, function(){});
+// Recursively sorts the array using the sort function
+array_sort_recursive();
+// Filters the array using the given Closure
+array_where();
+// First element of an array
+head($array);
+// Last element of an array
+last($array);
+              ```
+
+###### Paths
+
+```php
+
+// Fully qualified path to the app directory
+app_path();
+// Get the path to the public folder
+base_path();
+// Fully qualified path to the application configuration directory
+config_path();
+// Fully qualified path to the application's database directory
+database_path();
+// Gets the path to the versioned Elixir file:
+elixir();
+// Fully qualified path to the public directory
+public_path();
+// Get the path to the storage folder
+storage_path();
+              ```
+
+###### Strings
+
+```php
+
+// Convert a value to camel case
+camel_case($value);
+// Get the class "basename" of the given object / class
+class_basename($class);
+// Escape a string
+e('<html>');
+// Determine if a given string starts with a given substring
+starts_with('Foo bar.', 'Foo');
+// Determine if a given string ends with a given substring
+ends_with('Foo bar.', 'bar.');
+// Convert a string to snake case
+snake_case('fooBar');
+// Limits the number of characters in a string
+str_limit();
+// Determine if a given string contains a given substring
+str_contains('Hello foo bar.', 'foo');
+// Result: foo/bar/
+str_finish('foo/bar', '/');
+str_is('foo*', 'foobar');
+str_plural('car');
+str_random(25);
+str_singular('cars');
+str_slug("Laravel 5 Framework", "-");
+// Result: FooBar
+studly_case('foo_bar');
+trans('foo.bar');
+trans_choice('foo.bar', $count);
+              ```
+
+###### URLs and Links
+
+```php
+
+action('FooController@method', $parameters);
+// HTML Link
+asset('img/photo.jpg', $title, $attributes);
+// HTTPS link
+secure_asset('img/photo.jpg', $title, $attributes);
+route($route, $parameters, $absolute = true);
+url('path', $parameters = array(), $secure = null);
+              ```
+
+###### Miscellaneous
+
+```php
+
+// Authenticator instance (Auth)
+auth()->user();
+// Generates a redirect response to the user's previous location
+back();
+// Hashes the given value using Bcrypt (Hash)
+bcrypt('my-secret-password');
+// Creates a collection instance from the supplied items
+collect(['taylor', 'abigail']);
+// Gets the value of a configuration variable
+config('app.timezone', $default);
+// Generates an HTML hidden input field containing the value of the CSRF token
+{!! csrf_field() !!}
+// Retrieves the value of the current CSRF token
+$token = csrf_token();
+// Dumps the given variable and ends execution of the script
+dd($value);
+// Gets the value of an environment variable or returns a default value
+$env = env('APP_ENV');
+$env = env('APP_ENV', 'production');
+// Dispatches the given event to its listeners:
+event(new UserRegistered($user));
+// Creates a model factory builder for a given class
+$user = factory(App\User::class)->make();
+// Generates an HTML hidden input field containing the spoofed value of the form's HTTP verb
+{!! method_field('delete') !!}
+// Retrieves an old input value flashed into the session
+$value = old('value');
+$value = old('value', 'default');
+// Returns an instance of the redirector to do redirects:
+return redirect('/home');
+// Returns the current request instance or obtains an input item
+$value = request('key', $default = null)
+// Creates a response instance or obtains an instance of the response factory
+return response('Hello World', 200, $headers);
+// Used to get / set a session value
+$value = session('key');
+$value = session()->get('key');
+session()->put('key', $value);
+// Will simply return the value it is given.
+value(function(){ return 'bar'; });
+// Retrieves a view instance
+return view('auth.login');
+// Returns the value it is given
+$value = with(new Foo)->work();
+              ```
+
+___
+
+#### [Collection](#collection)[](https://laravel.com/docs/5.1/collections "Collections CLI @ Laravel Docs")
+
+```php
+
+// Creating Collections
+collect([1, 2, 3]);
+// Simply returns the underlying array represented by the collection:
+$collection->all();
+// Returns the average of all items in the collection:
+$collection->avg();
+// Breaks the collection into multiple, smaller collections of a given size:
+$collection->chunk(4);
+// Collapses a collection of arrays into a flat collection:
+$collection->collapse();
+// Determines whether the collection contains a given item:
+$collection->contains('New York');
+// Returns the total number of items in the collection:
+$collection->count();
+// Iterates over the items in the collection and passes each item to a given callback:
+$collection = $collection->each(function ($item, $key) {
+});
+// Creates a new collection consisting of every n-th element:
+$collection->every(4);
+// Pass offset as the second argument:
+$collection->every(4, 1);
+// Returns all items in the collection except for those with the specified keys:
+$collection->except(['price', 'discount']);
+// Filters the collection by a given callback:
+$filtered = $collection->filter(function ($item) {
+    return $item > 2;
+});
+// Returns the first element in the collection that passes a given truth test:
+collect([1, 2, 3, 4])->first(function ($key, $value) {
+    return $value > 2;
+});
+// Flattens a multi-dimensional collection into a single dimension:
+$flattened = $collection->flatten();
+// Swaps the collection's keys with their corresponding values:
+$flipped = $collection->flip();
+// Removes an item from the collection by its key:
+$collection->forget('name');
+// Returns a new collection containing the items:
+$chunk = $collection->forPage(2, 3);
+// Returns the item at a given key. If the key does not exist, null is returned:
+$value = $collection->get('name');
+// Groups the collection's items by a given key:
+$grouped = $collection->groupBy('account_id');
+// Determines if a given key exists in the collection:
+$collection->has('email');
+// Joins the items in a collection:
+$collection->implode('product', ', ');
+// Removes any values that are not present in the given array or collection:
+$intersect = $collection->intersect(['Desk', 'Chair', 'Bookcase']);
+// Returns true if the collection is empty:
+collect([])->isEmpty();
+// Keys the collection by the given key:
+$keyed = $collection->keyBy('product_id');
+// Pass a callback, which should return the value to key the collection by:
+$keyed = $collection->keyBy(function ($item) {
+    return strtoupper($item['product_id']);
+});
+// Returns all of the collection's keys:
+$keys = $collection->keys();
+// Returns the last element in the collection:
+$collection->last();
+// Iterates through the collection and passes each value to the given callback:
+$multiplied = $collection->map(function ($item, $key) {
+    return $item * 2;
+});
+// Return the maximum value of a given key:
+$max = collect([['foo' => 10], ['foo' => 20]])->max('foo');
+$max = collect([1, 2, 3, 4, 5])->max();
+// Merges the given array into the collection:
+$merged = $collection->merge(['price' => 100, 'discount' => false]);
+// Return the minimum value of a given key:
+$min = collect([['foo' => 10], ['foo' => 20]])->min('foo');
+$min = collect([1, 2, 3, 4, 5])->min();
+// Returns the items in the collection with the specified keys:
+$filtered = $collection->only(['product_id', 'name']);
+// Retrieves all of the collection values for a given key:
+$plucked = $collection->pluck('name');
+// Removes and returns the last item from the collection:
+$collection->pop();
+// Adds an item to the beginning of the collection:
+$collection->prepend(0);
+// Pass a second argument to set the key of the prepended item:
+$collection->prepend(0, 'zero');
+// Removes and returns an item from the collection by its key:
+$collection->pull('name');
+// Appends an item to the end of the collection:
+$collection->push(5);
+// Sets the given key and value in the collection:
+$collection->put('price', 100);
+// Returns a random item from the collection:
+$collection->random();
+// Pass an integer to random. If that integer is more than 1, a collection of items is returned:
+$random = $collection->random(3);
+// Reduces the collection to a single value:
+$total = $collection->reduce(function ($carry, $item) {
+    return $carry + $item;
+});
+// Filters the collection using the given callback:
+$filtered = $collection->reject(function ($item) {
+    return $item > 2;
+});
+// Reverses the order of the collection's items:
+$reversed = $collection->reverse();
+// Searches the collection for the given value and returns its key if found:
+$collection->search(4);
+// Removes and returns the first item from the collection:
+$collection->shift();
+// Randomly shuffles the items in the collection:
+$shuffled = $collection->shuffle();
+// Returns a slice of the collection starting at the given index:
+$slice = $collection->slice(4);
+// Sorts the collection:
+$sorted = $collection->sort();
+// Sorts the collection by the given key:
+$sorted = $collection->sortBy('price');
+// Removes and returns a slice of items starting at the specified index:
+$chunk = $collection->splice(2);
+// Returns the sum of all items in the collection:
+collect([1, 2, 3, 4, 5])->sum();
+// Returns a new collection with the specified number of items:
+$chunk = $collection->take(3);
+// Converts the collection into a plain PHP array:
+$collection->toArray();
+// Converts the collection into JSON:
+$collection->toJson();
+// Iterates over the collection:
+$collection->transform(function ($item, $key) {
+    return $item * 2;
+});
+// Returns all of the unique items in the collection:
+$unique = $collection->unique();
+// Returns a new collection with the keys reset to consecutive integers:
+$values = $collection->values();
+// Filters the collection by a given key / value pair:
+$filtered = $collection->where('price', 100);
+// Merges together the values of the given array with the values of the collection:
+$zipped = $collection->zip([100, 200]);
+                ```

+ 70 - 0
docs/host/Lychee.md

@@ -0,0 +1,70 @@
+
+
+[https://photo.davidawindham.com/](https://photo.davidawindham.com/)  
+[https://code.davidawindham.com/david/lychee](https://code.davidawindham.com/david/lychee)  
+[https://github.com/electerious/Lychee](https://github.com/electerious/Lychee)  
+
+```
+david@macs:~/sites/lychee(dw○) » git remote -v
+code	https://code.davidawindham.com/david/lychee.git (fetch)
+code	https://code.davidawindham.com/david/lychee.git (push)
+origin	https://github.com/windhamdavid/Lychee.git (fetch)
+origin	https://github.com/windhamdavid/Lychee.git (push)
+upstream	https://github.com/electerious/Lychee.git (fetch)
+upstream	https://github.com/electerious/Lychee.git (push)
+david@macs:~/sites/lychee(dw○) » git checkout master
+Switched to branch 'master'
+Your branch is up-to-date with 'origin/master'.
+david@macs:~/sites/lychee(master○) » git fetch upstream
+remote: Counting objects: 35, done.
+remote: Total 35 (delta 22), reused 22 (delta 22), pack-reused 13
+Unpacking objects: 100% (35/35), done.
+From https://github.com/electerious/Lychee
+   cd471be..34d2c74  develop    -> upstream/develop
+   3eaaed7..27f207d  master     -> upstream/master
+ * [new tag]         v3.1.6     -> v3.1.6
+david@macs:~/sites/lychee(master○) » git merge upstream/master
+Updating 3eaaed7..27f207d
+Fast-forward
+ .htaccess             |   7 +++++++
+ LICENSE               |   2 +-
+ README.md             |   2 +-
+ dist/main.js          | Bin 193340 -> 192803 bytes
+ dist/view.js          | Bin 111887 -> 111440 bytes
+ docs/Changelog.md     |   7 +++++++
+ php/Modules/Album.php |   2 --
+ src/package.json      |  20 ++++++++++----------
+ src/scripts/lychee.js |   4 ++--
+ 9 files changed, 28 insertions(+), 16 deletions(-)
+ mode change 100755 => 100644 dist/view.js
+david@macs:~/sites/lychee(master○) » git checkout dw
+Switched to branch 'dw'
+david@macs:~/sites/lychee(dw○) » git merge master
+david@macs:~/sites/lychee/src(dw⚡) » gulp
+[14:03:11] Using gulpfile ~/Sites/Lychee/src/gulpfile.js
+[14:03:11] Starting 'view--svg'...
+[14:03:11] Starting 'view--js'...
+[14:03:11] Starting 'main--svg'...
+[14:03:11] Starting 'main--js'...
+[14:03:11] Starting 'main--styles'...
+[14:03:11] gulp-inject 2 files into view.php.
+[14:03:11] gulp-inject 2 files into index.html.
+[14:03:12] Finished 'main--svg' after 403 ms
+[14:03:12] Finished 'view--svg' after 905 ms
+[14:03:12] Finished 'main--styles' after 1.25 s
+[14:03:12] Finished 'view--js' after 1.71 s
+[14:03:12] Starting 'view--scripts'...
+[14:03:14] Finished 'view--scripts' after 1.74 s
+[14:03:15] Finished 'main--js' after 3.81 s
+[14:03:15] Starting 'main--scripts'...
+[14:03:17] Finished 'main--scripts' after 1.91 s
+[14:03:17] Starting 'default'...
+[14:03:17] Starting 'clean'...
+[14:03:17] Finished 'default' after 15 ms
+[14:03:17] Finished 'clean' after 21 ms
+david@macs:~/sites/lychee/src(dw⚡) » git status
+
+resolve Unmerged paths -> commit & Push
+
+david@woozer:/var/www/photo.davidawindham.com/html(dw○) » git pull origin dw
+```

+ 7 - 0
docs/host/Mailcow.md

@@ -0,0 +1,7 @@
+
+
+- [https://mailcow.email/](https://mailcow.email/)
+- [https://mailcow.github.io/mailcow-dockerized-docs/](https://mailcow.github.io/mailcow-dockerized-docs/)
+- [https://forum.mailcow.email/](https://forum.mailcow.email/)
+- [https://github.com/mailcow](https://github.com/mailcow)
+- [https://github.com/mailcow/mailcow-dockerized](https://github.com/mailcow/mailcow-dockerized)

+ 4 - 0
docs/host/Nodebb.md

@@ -0,0 +1,4 @@
+
+
+- [https://nodebb.org/](https://nodebb.org/)
+- [https://github.com/NodeBB/NodeBB](https://github.com/NodeBB/NodeBB)

+ 6 - 0
docs/host/Phproject.md

@@ -0,0 +1,6 @@
+
+
+[https://sandbox.davidawindham.com/project/](https://sandbox.davidawindham.com/project/)  
+[https://code.davidawindham.com/david/phproject](https://code.davidawindham.com/david/phproject)
+
+[https://www.phproject.org/](https://www.phproject.org/)

+ 7 - 0
docs/host/Piwik.md

@@ -0,0 +1,7 @@
+
+
+[https://davidawindham.com/wik/](https://davidawindham.com/wik/)
+
+
+[https://github.com/piwik/piwik](https://github.com/piwik/piwik)  
+[https://piwik.org/](https://piwik.org/)

+ 520 - 0
docs/host/Siege-sproxy.md

@@ -0,0 +1,520 @@
+
+####[Siege - https://www.joedog.org/siege-home/](https://www.joedog.org/siege-home/)  
+####[Sproxy - https://www.joedog.org/sproxy-home/](https://www.joedog.org/sproxy-home/)  
+
+# How to Benchmark a Website with Firefox, Siege, and Sproxy On Ubuntu 16.04
+[Source](https://www.digitalocean.com/community/tutorials/how-to-benchmark-a-website-with-firefox-siege-and-sproxy-on-ubuntu-16-04 "Permalink to How to Benchmark a Website with Firefox, Siege, and Sproxy On Ubuntu 16.04")
+
+### Introduction
+
+[Siege][1] is a configurable benchmarking and testing tool for websites that tests web servers by making requests for web pages. The number of pages per second that Siege requests can be set to anything from a few pages per second to the maximum number that the website can handle.
+
+This information is extremely useful for discovering performance bottlenecks by highlighting which server resource is exhausted first and at which traffic level. Armed with this information, you can make changes to the server's configuration or upgrade the server's hardware before a live site fails. In addition, common system administration procedures, such as backups, can be tested under a simulated load to determine their effect on website performance.
+
+In this guide, we will install and configure Siege to run in benchmarking and browsing modes. The benchmarking mode makes as many requests as the web server can handle, and the browsing mode simulates a configurable number of visitors to the website.
+
+Because configuring an Internet connection that runs through a proxy server is particularly simple with Firefox, we will use it to connect to the Internet via the [Sproxy][2] proxy server. Sproxy, which was specifically created to work with Siege, records the URL of every request that passes through it to a file. We will use that file to to tell Siege which URLs to test against.
+
+In the first part of this tutorial, we will install Sproxy and configure Firefox to connect to the Internet through it. From there, we will generate a list of URLs to have Siege test against, and, finally, we will examine the test results and identify performance bottlenecks.
+
+**Warning:** Only use Siege to test websites that you either own or have permission to test. Using Siege against unauthorized websites may be considered a crime in some countries.  
+
+## Prerequisites
+
+In order to complete this tutorial, you will need:
+
+* One Ubuntu 16.04 server set up by following [this Ubuntu 16.04 initial server setup tutorial][3], including a sudo non-root user and a firewall. Be sure to open port `8080` in [Step 7][4] of the initial server setup tutorial with the command `sudo ufw allow 8080`. This is the port that Sproxy listens on by default.
+* Firefox installed. If you are using macOS or Windows on your local computer, you should download the installation file from the [official Mozilla website][5]. If you are using Linux, you should use your package manager or follow [Mozilla's official instructions][6] to install Firefox. This tutorial includes instructions for working with Firefox version 56.
+* A website you own or have permission to test that is either publicly available or that you can make accessible from the server you install Siege on.
+
+## Step 1 — Building and Installing Sproxy
+
+Sproxy is not available as a pre-packaged binary, so you will have to download it from its official website and then build it from source.
+
+Because Sproxy's build process relies on tools that are not installed on Ubuntu by default, you will need to install some additional packages.
+
+First, update your package list to make sure you get the latest version of each additional package.
+
+Then, install the packages.
+
+        * sudo apt-get install build-essential libnet-ssleay-perl liburi-perl libwww-perl
+
+
+`build-essential` provides general libraries and tools that are required to build software on Debian-based Linux distributions, while `libnet-ssleay-perl`, `liburi-perl`, and `libwww-perl` are libraries for the [Perl programming language][7] that Sproxy depends on to make connections over SSL, manipulate URI strings, and interface with the World Wide Web.
+
+Now, change to your home directory and download the Sproxy source code archive from its official website.
+
+        * cd ~
+
+    * curl -O http://download.joedog.org/sproxy/sproxy-latest.tar.gz
+
+
+Then, create a directory named `sproxy` to build Sproxy in and unpack the source code archive into the new directory.
+
+        * mkdir sproxy
+
+    * tar -zxf sproxy-latest.tar.gz --strip-components=1 --directory="sproxy"
+
+
+Here, the `-zxf` option tells tar to `gunzip` and extract the contents of the `sproxy-latest.tar.gz` file. The `\--strip-components=1` option strips the first leading component from each file name. This unpacks the archive into the `sproxy` directory — specified by the `\--directory` option — rather than into `sproxy-1.02/sproxy/`.
+
+Now, change to the `sproxy` directory to build and install Sproxy with the `configure` and `make` commands.
+
+        * cd sproxy
+
+    * ./configure
+
+    * make
+
+    * sudo make install
+
+
+The `./configure` command checks that all of the necessary program dependencies and build tools are present on the system. The `make` command then builds the program binaries. Finally, the `make install` command copies the new binaries to their correct locations on the server. Because Sproxy creates a new directory at `/usr/local/lib/sproxy/JoeDog`, you need to run `make install` with root privileges.
+
+Finally, test that Sproxy is working correctly by going back into your home directory to start Sproxy in verbose mode with the `-v` option.
+
+The output tells you the the port that Sproxy is listening on, the location of the file that Sproxy is writing output to, and the number of seconds Sproxy will wait for a reply from a remote host.
+
+
+    Sproxy Output
+
+    SPROXY v1.02 listening on port 9001
+    ...appending HTTP requests to: /user/urls.txt
+    ...default connection timeout: 120 seconds
+
+
+If Sproxy fails to start, review the messages in your terminal for information about what went wrong.
+
+Once you've verified that everything's working, stop Sproxy with `CTRL+C`.
+
+Sproxy is now ready to use, so let's modify Firefox to connect to the Internet through Sproxy in order to make a list of URLs to benchmark with Siege.
+
+## Step 2 — Configuring Firefox to use Sproxy
+
+We will now change Firefox's networking configuration to send all web requests through the Sproxy, generating the list of benchmarking targets we will need for Siege.
+
+Because we want Sproxy to record every URL we visit, we will also clear Firefox's local web cache. The web cache is a local store of images and other static content from websites that Firefox has already visited. By default, Firefox does not re-request website assets that it has already cached.
+
+### Modifying the Network Settings
+
+First, change the **Network Proxy** settings under the **General** tab on Firefox's main **Preferences** screen.
+
+1. Open Firefox. (This tutorial includes instructions for **Firefox version 56**. For other versions, see [Firefox's official support documentation][8].)
+2. Click on the hamburger menu in the upper, right-hand corner of the screen and select **Preferences** to go to the **General** screen.
+3. Scroll to the bottom of the page and locate the **Network Proxy** section.
+4. Click on the **Settings...** button to open the **Connection Settings** panel.
+
+![Image showing the button to select the proxy settings][9]
+
+In this panel, configure Firefox to pass all of its requests through the Sproxy server you installed in [Step 1][10].
+
+1. Select **Manual proxy configuration**.
+2. Enter your Sproxy server's public IP address in the **HTTP Proxy** field.
+3. Set the port number to `8080` in the **Port** field.
+4. Click **OK** to save the changes.
+
+![Image showing Firefox's connection settings panel with populated fields][11]
+
+You have now configured Firefox to use your Sproxy HTTP Proxy server, so you are ready to clear the local cache.
+
+### Clearing the Local Cache
+
+Firefox refers to the local cache as **Offline web content**. It is found in the **Privacy and Security** section of Firefox's **Preferences** screen.
+
+1. Click on the hamburger menu in the upper, right-hand corner of the screen and select **Preferences** to go to the **General** screen.
+2. Click **Privacy & Security** on the left-hand side of the screen.
+3. Scroll to the bottom of the page and locate the **Offline Web Content and User Data** section and press the **Clear Now** button.
+
+![Image showing the clear cache button][12]
+
+Your web cache is now empty, so the address of every HTTP-based website asset that Firefox encounters will be passed to Sproxy until that asset is re-cached.
+
+### Testing the Configuration
+
+Firefox is now configured to route all HTTP-based requests through Sproxy, but you stopped Sproxy with `CTRL+C` at the end of [Step 1][10]. So, you will see an error page if you try to visit a website over an HTTP connection with Firefox right now.
+
+![Image showing a Firefox error message][13]
+
+If you do not see this error message, verify that your Firefox settings match the previous screenshots and double-check that you are not connecting to the website over HTTPS.
+
+When you want to use Firefox normally again, re-trace the previous instructions for [Modifying the Network Settings][14], but, this time, select the **No proxy** option on the **Connection Settings** panel.
+
+Now that we have configured Firefox to connect to the Internet via Sproxy, we can create a list of URLs by starting Sproxy and browsing the target website with Firefox.
+
+## Step 3 — Starting Sproxy and Generating a URL List
+
+In this step, we will start the Sproxy server and use Firefox to browse the target website. Sproxy will record every HTTP-based URL that Firefox requests to a file that we will use later with Siege.
+
+First, change to your home directory and start Sproxy.
+
+        * cd ~
+
+    * sproxy -v -t 180 -p 8080 -o mixed-urls.txt your_server_ip
+
+
+* `-v` prints the URLs being requested to the terminal.
+* `-t` is the number of seconds that Sproxy will wait for a response from a remote host.
+* `-p` is the port that Sproxy will listen on.
+* `-o` is the file that Sproxy will write the URLs to.
+* `your_server_ip` is the IP address that Sproxy will bind to.
+
+The output immediately tells you the version of Sproxy you are running, the port that Sproxy is listening on, the file that Sproxy is writing URLs to, and the amount of time Sproxy will wait for a remote host to respond. Once you start browsing the test website, the output will also include the URLs of the webpages that Sproxy is recording.
+
+
+    Sproxy Output
+
+    SPROXY v1.02 listening on port 8080
+    ...appending HTTP requests to: mixed-urls.txt
+    ...default connection timeout: 180 seconds
+    http://www.example.com/
+    http://www.example.com/index.html
+    http://www.example.com/about.html
+
+
+**Note:** Sproxy [does not support HTTPS connections, so you must browse your test site via HTTP][15] in order to generate the list of URLs. However, Siege does support HTTPS, and, in Step 5, we will explore modifying the HTTP-only URLs list to test your website over both HTTP and HTTPS.  
+
+After you have started Sproxy, return to Firefox and begin browsing the target site. Sproxy will write every URL that Firefox requests to the `mixed-urls.txt` file while simultaneously printing the URLs to the terminal.
+
+Once you have visited all of the webpages you plan to test, stop Sproxy with `CTRL+C`.
+
+You now have a list in the `mixed-urls.txt` file of every HTTP-based URL that Firefox encountered on the test website. The next step is to remove any URLs that do not resolve to your website to make sure that you only use Siege against authorized domains.
+
+## Step 4 — Sanitizing the URLs File
+
+Modern websites often host content in more than one location. This content may be images hosted on a content delivery network (CDN) or fonts hosted on a third-party service like Google. When we run Siege, we want to ensure that we are only benchmarking domains that we have permission to test. Therefore, we must remove any URLs in the `mixed-urls.txt` file that do not point to the target website.
+
+Use [grep][16], a utility for searching plain text input against user-specified [regular expressions][17], to find only those URLs that match your test domain and [redirect the results][18] to a new file named `urls.txt`.
+
+        * grep -a "^http://www.example.com" mixed-urls.txt > urls.txt
+
+
+The `-a` flag tells grep to treat a binary file like a text file. This is necessary because browsers sometimes make POST requests that contain binary data, which Sproxy would then write to `mixed-urls.txt`. If there is binary data in `mixed-urls.txt`, grep would fail without the `-a` flag.
+
+In regular expression terms, the `^` character indicates that strings must start with `http://www.example.com` to be considered a match.
+
+This command will produce no output in the terminal, but it will create a new file called `urls.txt`.
+
+Now, open `urls.txt` to ensure that every line begins with your test website's domain name and delete any lines that do not.
+
+Save your changes and close the file when you are done editing.
+
+Your URLs list now contains only those URLs that you have permission to test, so we are ready to install Siege. If you would also like to benchmark your website via HTTPS, follow the optional instructions in Step 5 to create a second URL file that contains HTTPS versions of your URLs.
+
+## Step 5 — Creating an HTTPS URL File (Optional)
+
+Many websites run over both HTTP and HTTPS or even over HTTPS exclusively, so it is important that you can benchmark your website over HTTPS, too. This is something Siege can do. You only need to give it a list of URLs that start with `https`.
+
+First, use the `cat` command to open `urls.txt` and pass its contents to sed, a utility for parsing and transforming text. sed will replace all instances of `http` with `https` and display the results in the terminal.
+
+        * cat urls.txt | sed 's|http|https|'
+
+
+The output will be the same list of URLs you already have in the `urls.txt` file, except that each of the outputted URLs will begin with `https`.
+
+
+    Example Output
+
+    https://www.example.com/
+    https://www.example.com/index.html
+    https://www.example.com/about.html
+
+
+Once you have verified the output, re-run the command, this time writing the output to a new file called `urls-https.txt`.
+
+        * cat urls.txt | sed 's|http|https|' > urls-https.txt
+
+
+This command will not produce any output to the terminal, since it has all been redirected into `urls-https.txt`.
+
+Now that we have the updated URLs list, we are ready to install Siege and begin testing.
+
+## Step 6 — Benchmarking and Testing with Siege
+
+Before you can begin testing your website, you must first install Siege.
+
+Siege is available from the standard Ubuntu package repositories, so install it with `apt-get`.
+
+        * sudo apt-get install siege
+
+
+Siege has two modes of operation: internet and benchmark. Internet mode simulates visitors browsing the target website, while benchmark mode makes requests as rapidly as the web server can handle. We will first run Siege in internet mode.
+
+Internet mode is good for slowly building up the load on the server by increasing the number of simultaneous visitors over time. This mode can also create a sustained load for a long period, which is useful if you need to find out what happens to your website's performance during operations like creating backups.
+
+Change to your home directory and start Siege in internet mode. If you would like to test against HTTP-only addresses, replace `urls_file` with `urls.txt`. If you followed Step 5 and would like to test against HTTPS addresses, replace `urls_file` with `urls-https.txt`.
+
+        * cd ~
+
+    * siege --internet --concurrent=5 --time=30S --log="siege-internet.log" --file="urls_file"
+
+
+* `\--internet` sets Siege to internet mode.
+* `\--concurrent` is the number of visitors to simulate. In this example, we told Siege to simulate 5 concurrent users to generate some traffic without overwhelming the server. As you get more familiar with your server's capabilities, you can increase this number as needed.
+* `\--time` is how long Siege will run for. This value can be set with `S` for seconds, `M` for minutes, and `H`for hours. In this example, we told Siege to run for 30 seconds, again, to generate some traffic without overwhelming the server. In the future, you can experiment with different lengths of time to see how your server responds to a sustained load of traffic.
+* `\--log` is the path to the location you want Siege to write its test results to. By default, this location is `/var/log/siege.log` and requires sudo privileges.
+* `\--file` is the path to the file containing the URLs that Siege will use for the test.
+
+When you first start Siege, it reports the version number you are using and the number of concurrent users it is simulating. Then, it tells you that the test has begun.
+
+
+    Siege Output at Start of Run
+
+    ** SIEGE 3.0.8
+    ** Preparing 5 concurrent users for battle.
+    The server is now under siege...
+
+
+Once Siege has completed its run or is terminated with `CTRL+C`, it will also display the results of the test along with the location of the results log file.
+
+
+    Siege Output at End of Run
+
+    ...
+    Lifting the server siege...      done.
+
+    Transactions:                    157 hits
+    Availability:                 100.00 %
+    Elapsed time:                  29.72 secs
+    Data transferred:               0.15 MB
+    Response time:                  0.49 secs
+    Transaction rate:               5.28 trans/sec
+    Throughput:                     0.01 MB/sec
+    Concurrency:                    2.59
+    Successful transactions:         161
+    Failed transactions:               0
+    Longest transaction:            0.74
+    Shortest transaction:           0.27
+
+    FILE: siege-internet.log
+    You can disable this annoying message by editing
+    the .siegerc file in your home directory; change
+    the directive 'show-logfile' to false.
+
+
+As the statistics included in the output are complex, we will explore them in-depth in [Step 7][4].
+
+Now, let's run Siege in benchmark mode to discover the maximum number of page requests the site is capable of serving at a time. This is useful information when trying to decide which additional technologies may improve your website's performance. Additionally, benchmark mode can highlight resource bottlenecks, as you will see when we examine this mode more closely in [Step 8][19].
+
+Start Siege again, this time in benchmark mode, by using `\--benchmark` instead of `\--internet`.
+
+        * siege --benchmark --time=30S --log="siege-benchmark.log" --file="urls_file"
+
+
+The output follows the same format as before, except that this time the results are different because the mode was different.
+
+
+    Siege Output
+
+    ** SIEGE 3.0.8
+    ** Preparing 5 concurrent users for battle.
+    The server is now under siege...
+    Lifting the server siege...      done.
+
+    Transactions:                    444 hits
+    Availability:                 100.00 %
+    Elapsed time:                  29.72 secs
+    Data transferred:               18.16 MB
+    Response time:                  0.49 secs
+    Transaction rate:               105.28 trans/sec
+    Throughput:                     4.41 MB/sec
+    Concurrency:                    14.14
+    Successful transactions:         421
+    Failed transactions:               0
+    Longest transaction:            0.74
+    Shortest transaction:           0.27
+
+    FILE: siege-benchmark.log
+    You can disable this annoying message by editing
+    the .siegerc file in your home directory; change
+    the directive 'show-logfile' to false.
+
+
+As with the statistics from internet mode, the statistics from benchmark mode are complex. We will explore them in-depth in [Steps 7][4] and [8][19].
+
+Now that we have tested and benchmarked your site with Siege, we can explore the output in greater detail and make practical use of the statistics.
+
+## Step 7 — Understanding Siege's Results
+
+When it comes to understanding your website's performance, identifying bottlenecks, and deciding where to focus your upgrade efforts, Siege can be a powerful asset. The statistics it provides cover a range of metrics that can give you deep insights into your website's overall health.
+
+As we saw in [Step 6][20], Siege's output generally looks like:
+
+
+    Siege Output at End of Run
+
+    ...
+    Transactions:                    904 hits
+    Availability:                  97.41 %
+    Elapsed time:                   4.59 secs
+    Data transferred:               4.37 MB
+    Response time:                  0.07 secs
+    Transaction rate:             196.95 trans/sec
+    Throughput:                     0.95 MB/sec
+    Concurrency:                   12.86
+    Successful transactions:         904
+    Failed transactions:              24
+    Longest transaction:            1.95
+    Shortest transaction:           0.00
+    ...
+
+
+Specifically, these metrics mean:
+
+* `Transactions` is the total number of requests that Siege made.
+* `Availability` is the percent of the requests that the web server responded to, including [4xx and 5xx-level HTTP error codes][21].
+* `Elapsed time` is how long the test ran.
+* `Data transferred` is the total amount of bandwidth Siege used testing the site.
+* `Response time` is the average amount of time the web server took to respond to a request.
+* `Transaction rate` is the average number of transactions per second that the web server served.
+* `Throughput` is the amount of data per second that the web server served.
+* `Concurrency` is the average number of open simultaneous connections.
+* `Successful transactions` is the total number of transactions that were responded to with an [HTTP status code][22] of less than 400.
+* `Failed transactions` is the total number of transactions that were responded to with HTTP status codes [greater than 400][21].
+* `Longest transaction` is the time that the longest request took to complete.
+* `Shortest transaction` is the time that the shortest request took to complete.
+
+`Transaction rate` and the `Failed transactions` provide the quickest litmus test of your web server's overall health.
+
+The `Transaction rate` represents the speed of your website, as it is the number of pages per second that your web server can serve. The higher this number is, the more visitors your website can handle and the faster the visitors will receive each page. If you are using Siege to improve your website's general responsiveness, this is the number that you want to increase.
+
+The `Failed transactions` value refers to any response from the web server that contains an error code, such as `503 Service Unavailable`. These errors often point to problems like a database that is unable to handle the number of requests it is receiving or a web server that ran out of RAM. If this number is anything other than zero, you should look at your web server's log files to see exactly which errors have occurred and to get direction about how to resolve the problems.
+
+As you make changes to increase your `Transaction rate` and reduce your `Failed transactions` over time, also remember to consult the log file you create with each run of Siege, as it includes all of the same statistics you see in your terminal as well as the date and time of the test. This will help you track the overall trajectory of your efforts.
+
+Now that we've examined Siege's output to determine your web server's speed and robustness, it's time to see how we can use this same information to identify and remove performance bottlenecks.
+
+## Step 8 — Identifying Performance Bottlenecks
+
+In benchmark mode, Siege makes as many requests per second as the web server is capable of serving. When the server hits the maximum number of pages it can serve, it has reached a _resource limit_.
+
+The four most likely resources to be affected are:
+
+1. RAM
+2. CPU
+3. Disk
+4. Network bandwidth
+
+To get the most out of benchmark mode, you need to run a couple of additional tools at the same time as Siege, so that you can monitor what happens across your system as Siege increases its test load.
+
+You can monitor the first three resources — RAM, CPU, and disk usage — with top, a tool that provides a dynamic, real-time view of system resources.
+
+Ubuntu comes with top by default, so you don't need to install it. Simply run the command, `top`.
+
+The information shown in top is split into two sections.
+
+
+    Sample top Output
+
+    top - 21:02:32 up 50 min,  1 user,  load average: 0.07, 0.02, 0.00
+    Tasks: 102 total,   1 running, 101 sleeping,   0 stopped,   0 zombie
+    %Cpu(s):  37.3 us,  7.3 sy,  0.0 ni, 99.3 id,  8.3 wa,  0.0 hi,  0.0 si,  0.0 st
+    KiB Mem :   1015200 total,    63536 free,    431456 used,   520208 buff/cache
+    KiB Swap:        0 total,        0 free,        0 used.   512308 avail Mem
+
+      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                   
+     3249 www-data     20   0   469592   92276   33488 D  24.6  9.1   0:05.01 apache2                                                                                                                      
+     3239 www-data     20   0   442836   75080   41896 S  5.6  7.4   1:31.97 apache2                                                                                                                      
+     3572 www-data     20   0   424372   35272   21164 S  4.0  3.5   0:02.69 apache2                                                                                                                      
+
+
+The upper section, made up of the first five lines of output, shows a summary of the current system usage.
+
+The lower section shows a list of the individual server processes currently running on the system along with each process' identification number, owner, priority, nice value, virtual memory use, physical memory use, shared memory use, status, percent of CPU use, percent of memory use, total time of activity, and name.
+
+While top is a useful tool for [managing processes][23] and [monitoring CPU use][24], in this case, we want to see what it can tell us about our system under the duress of a Siege benchmark test.
+
+The CPU usage reads, `%Cpu(s): 37.3 us, 7.3 sy,`. These values tell us that the user processes are consuming 37.3% of the CPU, and the system processes are consuming 7.3%. If you add these two values together, you will get the total CPU usage.
+
+If your server is running at or near 100% CPU usage, check the top entries in the list of processes to see if one or more are consuming unusually high amounts of CPU. If so, consider reconfiguring or fine-tuning the processes to use less CPU. If that's not possible, you may need to upgrade the CPU on your server.
+
+Now, let's examine memory usage.
+
+
+    Sample top Output
+
+    top - 21:02:32 up 51 min,  1 user,  load average: 0.21, 0.47, 0.80
+    Tasks: 102 total,   1 running, 101 sleeping,   0 stopped,   0 zombie
+    %Cpu(s):  17.4 us,  3.4 sy,  0.0 ni, 79.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
+    MiB Mem :   991.406 total,    223.914 free,    395.621 used,   371.871 buff/cache
+    MiB Swap:        0.000 total,        0.000 free,        0.000 used.   526.156 avail Mem
+
+      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                   
+     3249 www-data     20   0   469592   92276   33488 D  24.6  9.1   0:05.01 apache2                                                                                                                      
+     3239 www-data     20   0   442836   75080   41896 S  5.6  7.4   1:31.97 apache2                                                                                                                      
+     3572 www-data     20   0   424372   35272   21164 S  4.0  3.5   0:02.69 apache2                                                                                                                      
+
+
+By default, RAM usage is displayed in kilobytes on the fourth line. In the preceding example output, we have already pressed `SHIFT+E` once, converting the value to megabytes to make the numbers easier to work with. Press `SHIFT+E` a second time to convert the value to gigabytes, and continue pressing `SHIFT+E` to cycle back to the default kilobytes display.
+
+The `total` value is the total amount of memory available on the server. Keep in mind that the kernel reserves some memory on boot, so a 1024 MB machine will display 991 MB of memory here.
+
+The `avail Mem` shows the amount of remaining memory on the system. This number will get smaller as more RAM is used and will eventually hit zero when there is no remaining memory left on the server.
+
+As with CPU usage, if `avail Mem` is running at or near zero, examine the the list of processes for entries that consume unusually high amounts of memory. If possible, reconfigure or fine-tune those processes to use less memory or upgrade the amount of RAM on your server.
+
+Finally, let's look at disk usage.
+
+
+    Sample top Output
+
+    top - 21:02:32 up 52 min,  1 user,  load average: 0.21, 0.47, 0.80
+    Tasks: 102 total,   1 running, 101 sleeping,   0 stopped,   0 zombie
+    %Cpu(s):  17.4 us,  3.4 sy,  0.0 ni, 79.2 id,  31.6 wa,  0.0 hi,  0.0 si,  0.0 st
+    KiB Mem :   1015200 total,    63536 free,    431456 used,   520208 buff/cache
+    KiB Swap:        0 total,        0 free,        0 used.   512308 avail Mem
+
+      PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                   
+     3249 www-data     20   0   469592   92276   33488 D  24.6  9.1   0:05.01 apache2                                                                                                                      
+     3239 www-data     20   0   442836   75080   41896 S  5.6  7.4   1:31.97 apache2                                                                                                                      
+     3572 www-data     20   0   424372   35272   21164 S  4.0  3.5   0:02.69 apache2                                                                                                                      
+
+
+The disk usage that we are interested in, I/O wait, is not how much disk space is available but how much disk access is slowing down the server. Disk access, especially on a server that uses spinning platter hard disks, is very slow, and whenever the server accesses the disks, the CPU must wait for the information to be retrieved.
+
+Top reports this information as the `wa` value. It indicates the percent of time that the CPU(s) are sitting idle waiting for data from the disk. This number should be as close 0.0 as possible.
+
+In the preceding example, the `wa` value is `31.6`. This means that the CPU is spending a third of its time waiting for data from the disk. This is a large amount of time, and it will severely impact website performance.
+
+I/O wait is often the result of accessing the disk for files or making repeated calls to local databases. If `wa` is much over 0.0, consider moving static resources to a remote location, like a content delivery network (CDN), or investigate ways to reduce the number of trips your applications make to their related local databases.
+
+Press `Q` to exit top.
+
+The final resource that we will look at is network usage. To monitor this, we will use the Bandwidth Monitor New Generation tool.
+
+Install this tool with `apt-get` then run it with the command, `bwm-ng`.
+
+        * sudo apt-get install bwm-ng
+
+    * bwm-ng
+
+
+The top part of the output displays Bandwidth Monitor New Generation's version number, how often the data is being updated (every .5 seconds by default), the input source being used to determine available network interfaces (`/proc/net/dev` by default on Linux), and the statstic being displayed (data usage `rate` by default).
+
+The bottom part of the output includes a table that reports the amount of incoming data (`Rx`), outgoing data (`Tx`), and total data (`Total`) per network interface.
+
+The final row displays the total values across all network interfaces.
+
+
+    Sample bwm-ng Output
+
+      bwm-ng v0.6.1 (probing every 0.500s), press 'h' for help
+      input: /proc/net/dev type: rate
+      -         iface                   Rx                   Tx                Total
+      ==============================================================================
+                   lo:           0.00 KB/s            0.00 KB/s            0.00 KB/s
+                 eth0:          30.99 KB/s          499.11 KB/s          530.11 KB/s
+      ------------------------------------------------------------------------------
+                total:          30.99 KB/s          499.11 KB/s          530.11 KB/s
+
+
+When network bandwidth causes a bottlneck, it is usually because `Tx` has maxed out. To resolve this problem, get the connection speed of your server from your hosting provider, and compare it to the speeds shown by `bwm-ng`. If the speed shown by `bwm-ng` is constantly at, or close to, the maximum bandwidth available to your server, then you will need to consider upgrading your hosting plan or moving to a different provider altogether.
+
+Press `CTRL+C` to exit Bandwidth Monitor New Generation when you are done testing.
+
+## Conclusion
+
+In this guide, we used the Siege benchmarking tool and the Sproxy proxy server to generate a configurable load on a web server and push it to its maximum throughput. These tools are extremely useful for any website deployment, as they help to pinpoint performance issues and plan well-informed upgrades.
+
+For another way to reduce disk I/O and memory bottlenecks, take a look at [Varnish HTTP Cache][25]. Varnish is an easy-to-use reverse proxy that stores static website assets, reducing both RAM usage and disk I/O.
+
+If your website uses PHP, consider installing [PHP-FPM][26] as an alternative to the standard PHP implementation. PHP-FPM reduces the CPU requirements for serving PHP-based web pages, thereby speeding up your entire website.

+ 23 - 0
docs/host/Webmin.md

@@ -0,0 +1,23 @@
+
+
+- [https://github.com/webmin/webmin](https://github.com/webmin/webmin)
+- [http://www.webmin.com/](http://www.webmin.com/)
+
+
+- [https://www.digitalocean.com/community/tutorials/how-to-install-webmin-on-ubuntu-16-04](https://www.digitalocean.com/community/tutorials/how-to-install-webmin-on-ubuntu-16-04)
+- [https://github.com/qooob/authentic-theme](https://github.com/qooob/authentic-theme)
+
+``
+sudo vi /etc/apt/sources.list  
+//add to list  
+deb http://download.webmin.com/download/repository sarge contrib  
+
+$ wget http://www.webmin.com/jcameron-key.asc  
+$ sudo apt-key add jcameron-key.asc  
+$ sudo apt-get update
+$ sudo apt-get install webmin  
+
+// https://ip:10000
+// login with root user
+
+``

+ 362 - 0
docs/host/WordPress.md

@@ -0,0 +1,362 @@
+
+
+* [https://developer.wordpress.com/docs/](https://developer.wordpress.com/docs/)
+* [https://developer.wordpress.org/reference/](https://developer.wordpress.org/reference/)
+* [https://developer.wordpress.org/block-editor/](https://developer.wordpress.org/block-editor/)
+* [https://developer.wordpress.com/docs/api/console/](https://developer.wordpress.com/docs/api/console/)
+* [https://github.com/WordPress/wordpress-develop](https://github.com/WordPress/wordpress-develop)
+* [https://github.com/windhamdavid/wordpress-develop](https://github.com/windhamdavid/wordpress-develop)
+* [https://github.com/windhamdavid/wp](https://github.com/windhamdavid/wp)
+
+```
+### notes ###
+//functions i reuse
+//security reminders
+//
+```
+### functions:
+
+#####
+
+##### Determine the current Taxonomy and list it's children:
+```php
+<?php
+$term = get_term_by( 'slug', get_query_var('term'), get_query_var('taxonomy') );
+$queried_object = get_queried_object();
+$term_id = $queried_object->term_id;
+$taxonomy_name = 'location';
+$term_children = get_term_children( $term_id, $taxonomy_name );
+if ( !empty( $term_children ) && !is_wp_error( $term_children ) ) { ?>
+  <div class="togglecontainer">
+
+    <?php echo '<ul>';
+    foreach ( $term_children as $child ) {
+      $term = get_term_by( 'id', $child, $taxonomy_name );
+      echo '<li><a href="' . get_term_link( $child, $taxonomy_name ) . '">' . $term->name . '</a></li>';
+      echo '<li><a href="' . get_term_link( $child, $taxonomy_name ) . '">' . get_term_meta( $term->term_id, 'address', true ) . '</a></li><br />';
+    }
+    echo '</ul>'; ?>
+
+  </div>
+<?php } ?>
+```
+
+##### cleanup the head:
+```php
+<?php
+remove_action('wp_head', 'index_rel_link' );
+remove_action('wp_head', 'rel_canonical');
+remove_action('wp_head', 'start_post_rel_link', 10, 0 );
+remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
+remove_action('wp_head', 'wp_shortlink_wp_head', 10, 0 );
+remove_action('wp_head', 'parent_post_rel_link', 10, 0 );
+remove_action('wp_head', 'rsd_link');
+remove_action('wp_head', 'wlwmanifest_link');
+remove_action('wp_head', 'wp_generator');
+remove_action('wp_head', 'feed_links_extra', 3 );
+remove_action('wp_head', 'feed_links', 2 );
+remove_action('wp_head', 'wp_oembed_add_discovery_links', 10, 0 );
+remove_action('wp_head', 'wp_oembed_add_host_js', 10, 0 );
+
+function dw_remove_wp_ver_css_js( $src ) {
+    if ( strpos( $src, 'ver=' ) )
+        $src = remove_query_arg( 'ver', $src );
+    return $src;
+}
+add_filter( 'style_loader_src', 'dw_remove_wp_ver_css_js', 9999 );
+add_filter( 'script_loader_src', 'dw_remove_wp_ver_css_js', 9999 );
+
+function disable_emojis() {
+	remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
+	remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
+	remove_action( 'wp_print_styles', 'print_emoji_styles' );
+	remove_action( 'admin_print_styles', 'print_emoji_styles' );
+	remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
+	remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
+	remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
+	add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
+	add_filter( 'emoji_svg_url', '__return_false' );
+}
+add_action( 'init', 'disable_emojis' );
+
+```
+##### add open graph meta to head:
+```php
+<?php
+
+function doctype_opengraph($output) {
+    return $output . '
+    xmlns:og="http://opengraphprotocol.org/schema/"
+    xmlns:fb="http://www.facebook.com/2008/fbml"';
+}
+add_filter('language_attributes', 'doctype_opengraph');
+
+function dw_opengraph() {
+    global $post;
+
+    if(is_single()) {
+        if(has_post_thumbnail($post->ID)) {
+            $img_src = wp_get_attachment_image_src(get_post_thumbnail_id( $post->ID ), 'full');
+			$img_src = $img_src[0];
+        } else {
+            $img_src = get_stylesheet_directory_uri() . '/img/opengraph_image.jpg';
+        }
+        if($excerpt = $post->post_excerpt) {
+            $excerpt = strip_tags($post->post_excerpt);
+            $excerpt = str_replace("", "'", $excerpt);
+        } else {
+            $excerpt = get_bloginfo('description');
+        }
+?>
+    <meta property="og:title" content="<?php echo the_title(); ?>"/>
+    <meta property="og:description" content="<?php echo $excerpt; ?>"/>
+    <meta property="og:type" content="article"/>
+    <meta property="og:url" content="<?php echo the_permalink(); ?>"/>
+    <meta property="og:site_name" content="<?php echo get_bloginfo(); ?>"/>
+    <meta property="og:image" content="<?php echo $img_src; ?>"/>
+	<meta property="fb:app_id" content="203136806559589" />
+	<meta name="twitter:site" content="@windhamdavid">
+	<meta name="twitter:creator" content="@windhamdavid">
+	<meta name="twitter:title" content="<?php echo the_title(); ?>">
+	<meta name="twitter:description" content="<?php echo $excerpt; ?>">
+	<meta name="twitter:image" content="<?php echo $img_src; ?>">
+<?php
+    } else {
+        return;
+    }
+	 $content = do_shortcode( apply_filters( 'the_content', $post->post_content ) );
+	 $media_url = get_post_meta( get_the_ID(), 'media', true );
+	 $media = get_media_embedded_in_content( $content );
+	 if( !empty($media) ) {
+	         $video_url = $media[0];
+	?>
+	<meta property="og:video" content="<?php echo $media_url; ?>" />
+	<meta property="og:video:secure_url" content="<?php echo $media_url; ?>" />
+	<meta property="og:video:width" content="1280" />
+	<meta property="og:video:height" content="720" />
+	<meta property="og:video:type" content="video/mp4" />
+	<meta name="twitter:card" content="player">
+	<meta name="twitter:player" content="<?php echo get_permalink();?>container/" />
+	<meta name="twitter:player:width" content="1280" />
+	<meta name="twitter:player:height" content="720" />
+	<meta name="twitter:player:stream" content="<?php echo $media_url; ?>" />
+	<meta name="twitter:player:stream:content_type" content="video/mp4" />
+<?php
+    } else {
+?>
+	<meta name="twitter:card" content="summary_large_image">
+<?php
+    }
+}
+add_action('wp_head', 'dw_opengraph', 5);
+
+
+function dw_read_container_endpoint(){
+	add_rewrite_endpoint( 'container', EP_PERMALINK);
+}
+add_action( 'init', 'dw_read_container_endpoint' );
+
+function dw_read_container_template( $template = '' ) {
+    global $wp_query;
+    if( ! array_key_exists( 'container', $wp_query->query_vars ) ) return $template;
+    $template = locate_template( 'single-container.php' );
+    return $template;
+}
+add_filter( 'single_template', 'dw_read_container_template' );
+
+function dw_video_embed( $attr, $content='' ) {
+  if ( ! isset( $attr['poster'] ) && has_post_thumbnail() ) {
+	$poster = get_post_meta( get_the_ID(), 'media-poster', true );
+    $attr['poster'] = $poster;
+  }
+  return wp_video_shortcode( $attr, $content );
+}
+add_shortcode( 'video', 'dw_video_embed' );
+```
+
+
+##### security tips:
+* [https://github.com/ethicalhack3r/wordpress_plugin_security_testing_cheat_sheet](https://github.com/ethicalhack3r/wordpress_plugin_security_testing_cheat_sheet)
+
+### WordPress Plugin Security Testing Cheat Sheet
+
+This cheat sheet was compiled by [Dewhurst Security](https://dewhurstsecurity.com "Dewhurst Security") to record the knowledge gained when testing WordPress plugins for security issues for our clients. The security documentation provided by WordPress and found online for plugin security is sparse, outdated or unclear. This cheat sheet is intended for Penetration Testers who audit WordPress plugins or developers who wish to audit their own WordPress plugins.
+
+This is a living document, feedback in the form of Issues or Pull Requests is very much welcomed.
+
+#### Cross-Site Scripting (XSS)
+
+Check if the following global PHP variables are echo'd to pages, or stored in the database and echo'd at a later time without first being sanitised or output encoded.
+
+- ```$_GET```
+- ```$_POST```
+- ```$_REQUEST```
+- ```$_SERVER['REQUEST_URI']```
+- ```$_SERVER['PHP_SELF']```
+- ```$_SERVER['HTTP_REFERER']```
+- ```$_COOKIE```
+
+_(Note: the list of sources above is not extensive nor complete)_
+
+#### Cross-Site Scripting (XSS) Tips
+
+##### Unsafe API functions
+
+The following functions can cause XSS if not secured as they use the PHP_SELF variable:
+
+- ```add_query_arg()```
+- ```remove_query_arg()```
+
+References:
+
+[https://blog.sucuri.net/2015/04/security-advisory-xss-vulnerability-affecting-multiple-wordpress-plugins.html](https://blog.sucuri.net/2015/04/security-advisory-xss-vulnerability-affecting-multiple-wordpress-plugins.html)
+[https://make.wordpress.org/plugins/2015/04/20/fixing-add_query_arg-and-remove_query_arg-usage/](https://make.wordpress.org/plugins/2015/04/20/fixing-add_query_arg-and-remove_query_arg-usage/)
+[https://developer.wordpress.org/reference/functions/add_query_arg/](https://developer.wordpress.org/reference/functions/add_query_arg/)
+[https://developer.wordpress.org/reference/functions/remove_query_arg/](https://developer.wordpress.org/reference/functions/remove_query_arg/)
+
+##### DISALLOW_UNFILTERED_HTML
+
+When doing dynamic testing for XSS the following setting in the wp-config.php file may reduce false positive results as it prevents administrative and editor users from being able to embed/execute JavaScript/HTML, which by default they are permitted to do.
+
+```
+define( 'DISALLOW_UNFILTERED_HTML', true );
+```
+
+### SQL Injection
+
+Unsafe API methods (require sanitising/escaping):
+
+- ```$wpdb->query()```
+- ```$wpdb->get_var()```
+- ```$wpdb->get_row()```
+- ```$wpdb->get_col()```
+- ```$wpdb->get_results()```
+- ```$wpdb->replace()```
+
+Safe API methods (according to WordPress):
+
+- ```$wpdb->insert()```
+- ```$wpdb->update()```
+- ```$wpdb->delete()```
+
+Safe code, prepared statement:
+
+``` <?php $sql = $wpdb->prepare( 'query' , value_parameter[, value_parameter ... ] ); ?> ```
+
+Note: Before WordPress 3.5 ```$wpdb->prepare``` could be used insecurely as you could just pass the query without using placeholders, like in the following example:
+
+```$wpdb->query( $wpdb->prepare( "INSERT INTO table (user, pass) VALUES ('$user', '$pass')" ) );```
+
+#### SQL Injection Tips
+
+Unsafe escaping ('securing') API methods:
+
+- ```esc_sql()``` function does not adequately protect against SQL Injection [https://codex.wordpress.org/Function_Reference/esc_sql](https://codex.wordpress.org/Function_Reference/esc_sql)
+- ```escape()``` same as above
+- ```esc_like()``` same as above
+- ```like_escape()``` same as above
+
+#### Displaying/hiding SQL errors:
+
+```
+<?php $wpdb->show_errors(); ?>
+<?php $wpdb->hide_errors(); ?>
+<?php $wpdb->print_error(); ?>
+```
+
+### File Download
+
+- ```file()```
+- ```readfile()```
+- ```file_get_contents()```
+
+### File Inclusion
+
+- ```include()```
+- ```require()```
+- ```include_once()```
+- ```require_once()```
+- ```fread()```
+
+### File Manipulation
+
+- ```unlink()``` delete arbitrary files
+
+### File Upload
+
+- ```sanitize_file_name()``` can create valid PHP files, turns `test.(php)` into `test.php`
+
+### PHP Object Injection
+
+- ``` unserialize()``` any raw user input passed to this function is probably exploitable, if serialized() first, probably not vulnerable
+
+### PHP Object Injection Tips
+
+Use this [simple Burp Suite extention](https://gist.github.com/ethicalhack3r/7c2618e5fffd564e2734e281c86a2c9b) along with the [PHP Object Injection WordPress Plugin](https://www.pluginvulnerabilities.com/2017/07/24/wordpress-plugin-for-use-in-testing-for-php-object-injection/) created by White Fir Design.
+
+### Command Execution
+
+- ```system()```
+- ```exec()```
+- ```passthru()```
+- ```shell_exec()```
+
+### PHP Code Execution
+
+- ```eval()```
+- ```assert()```
+- ```preg_replace()``` dangerous "e" flag deprecated since PHP >= 5.5.0 and removed in PHP >= 7.0.0.
+
+### Authorization
+
+- ```is_admin()``` does not check if the user is authenticated as administrator, only checks if page displayed is in the admin section, can lead to auth bypass if misused.
+- ```is_user_admin()``` same as above
+- ```current_user_can()``` used for checking authorisation. This is what should be used to check authorisation.
+- ```add_action( 'wp_ajax_nopriv_``` permits non-authenticated users to use the AJAX function (https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_(action)).
+
+### Open Redirect
+
+- ```wp_redirect()``` function can be used to redirect to user supplied URLs. If user input is not sanitised or validated this could lead to Open Redirect vulnerabilities.
+
+### Cross-Site Request Forgery (CSRF)
+
+- ```wp_nonce_field()``` adds CSRF token to forms
+- ```wp_nonce_url()``` adds CSRF token to URL
+- ```wp_verify_nonce()``` checks the CSRF token validity server side
+- ```check_admin_referer()``` checks the CSRF token validity server side and came from admin screen
+
+### SSL/TLS
+
+- ```CURLOPT_SSL_VERIFYHOST``` if set to 0 then does not check name in host certificate
+- ```CURLOPT_SSL_VERIFYPEER``` if set to FALSE then does not check if the certificate (inc chain), is trusted. A Man-in-the-Middle (MitM) attacker could use a self-signed certificate.
+- Check if HTTP is used to communicate with backend servers or APIs. A grep for "http://" should be sufficient.
+
+### Priviledge Escalation
+
+- ```update_option()``` if user input is sent unvalidated, it could allow an attacker to update arbitrary WordPress options.
+- ```do_action()``` if user input is sent unvalidated, it could allow an attacker to update arbitrary WordPress actions.
+
+See: https://www.wordfence.com/blog/2018/11/privilege-escalation-flaw-in-wp-gdpr-compliance-plugin-exploited-in-the-wild/
+
+### Automated Static Code Analysis
+
+- ```WordPress-Coding-Standards``` contains some security rules.
+
+Example:
+
+```
+./vendor/bin/phpcs --standard=WordPress --sniffs=WordPress.CSRF.NonceVerification,WordPress.DB.PreparedSQL,WordPress.DB.PreparedSQLPlaceholders,WordPress.DB.RestrictedClasses,WordPress.DB.RestrictedFunctions,WordPress.Security.NonceVerification,WordPress.Security.PluginMenuSlug,WordPress.Security.SafeRedirect,WordPress.Security.ValidatedSanitizedInput,WordPress.Security.EscapeOutputSniff,WordPress.WP.PreparedSQL,WordPress.XSS.EscapeOutput -p -d memory_limit=256M --colors /path/to/plugin/
+```
+
+See: https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards
+
+##### Further reading/references:
+
+1. [https://developer.wordpress.org/plugins/security/](https://developer.wordpress.org/plugins/security/)
+2. [https://make.wordpress.org/plugins/2013/11/24/how-to-fix-the-intentionally-vulnerable-plugin/](https://make.wordpress.org/plugins/2013/11/24/how-to-fix-the-intentionally-vulnerable-plugin/)
+3. [http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/](http://wordpress.tv/2011/01/29/mark-jaquith-theme-plugin-security/)
+4. [https://www.wordfence.com/learn/](https://www.wordfence.com/learn/)
+5. https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYHOST.html
+6. https://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html
+7. https://www.owasp.org/index.php/OWASP_Wordpress_Security_Implementation_Guideline
+8. http://php.net/manual/en/function.preg-replace.php

+ 5 - 0
docs/host/Zammad.md

@@ -0,0 +1,5 @@
+
+
+- [https://zammad.org](https://zammad.org)
+- [https://docs.zammad.org/en/latest/](https://docs.zammad.org/en/latest/)
+- [https://github.com/zammad](https://github.com/zammad)

+ 103 - 0
docs/index.md

@@ -0,0 +1,103 @@
+---
+title: Docs
+slug: /
+---
+
+I collect docs I find useful as I'm using them. I like to make notes along the way so that I can use these as a reference. I've noticed that I always reference only a couple documents here, so I may trim it down a bit to just focus on the ones I reuse. 
+
+### Databases
+[MongoDB](db/mongodb) | 
+[MySQL](db/mysql) | 
+[PostgreSQL](db/PostgreSQL) | 
+[Redis](db/redis)
+
+### Editors / Shell
+[Custom](editors/custom) | 
+[Atom](editors/atom) | 
+[bash](editors/bash) | 
+[Git](editors/git) | 
+[PHPStorm](editors/phpstorm) | 
+[Sublime](editors/sublime) | 
+[Subversion](editors/subversion) | 
+[Terminal](editors/terminal) | 
+[Textmate](editors/textmate) | 
+[UNIX](editors/unix) | 
+[Vi](editors/vi) | 
+[Zsh](editors/zsh)
+
+### Languages
+[Go](lang/golang) | 
+[GraphQL](lang/graphql) | 
+[JavaScript](lang/JavaScript) | 
+[Php](lang/PHP) | 
+[Python](lang/python) | 
+[Ruby](lang/ruby) | 
+[Rust](lang/rust) | 
+
+### Localhost  
+[Log](localhost/_log) | 
+[Macs](localhost/macs) | 
+[Apple](localhost/apple) | 
+[Chrome](localhost/chrome) | 
+[Homebrew](localhost/brew) | 
+[Adobe](localhost/adobe) | 
+[Sketch](localhost/sketch) | 
+[ngrok](localhost/ngrok) | 
+
+### Projects
+[DW](projects/dw) | 
+[GZET](projects/gzet) | 
+[Juryd](projects/juryd) | 
+[Pants](projects/pants) | 
+[Woozer](projects/woozer) | 
+[Zeke](projects/zeke) | 
+[Zeken Woozer Un-Ltd.](projects/zw) | 
+
+### Sass
+[Amazon](saas/aws) | 
+[Google](saas/google) | 
+[Heroku](saas/heroku) | 
+[Linode](saas/linode) | 
+[Now](saas/now) | 
+[Stripe](saas/stripe) | 
+[Twilio](saas/twilio) | 
+
+### Frameworks
+[Node.js](waf/nodejs) | 
+[npm](waf/npm) | 
+[Rails](waf/rails) | 
+[React](waf/react) | 
+[React Native](waf/react_native) | 
+[Vue.js](waf/vue) | 
+
+### Server
+[Apache](server/apache) | 
+[Docker](server/docker) | 
+[GoAccess](server/goaccess) | 
+[htop](server/htop) | 
+[iptables](server/iptables) | 
+[Kubernetes](server/kubernetes) | 
+[Letsencrypt](server/letsencrypt) | 
+[Lynis](server/lynis) | 
+[Mail](server/mail) | 
+[Monit](server/monit) | 
+[Nginx](server/nginx) | 
+[Ubuntu](server/ubuntu) | 
+[UFW](server/ufw) | 
+
+### Remote
+[Gogs](host/gogs) | 
+[Gitea](host/gitea) | 
+[Icecast](host/icecast) | 
+[Lychee](host/lychee) | 
+[MailCow](host/mailcow) | 
+[PhProject](host/phproject) | 
+[InvoicePlace](host/invoiceplane) | 
+[WordPress](host/WordPress) | 
+[Drupal](host/drupal) | 
+[Webmin](host/webmin) | 
+[Laravel](host/laravel) | 
+[Discourse](host/discourse) | 
+[nodebb](host/nodebb) | 
+[zammad](host/zammad) | 
+[siege-sproxy](host/siege-sproxy) | 

+ 0 - 0
docs/lang/C.md


+ 757 - 0
docs/lang/Golang.md

@@ -0,0 +1,757 @@
+
+
+January 2020:
+```
+david@macs:~ » go version
+go version go1.13.7 darwin/amd64
+```
+
+
+### Go-lang
+[source](https://github.com/a8m/golang-cheat-sheet/blob/master/README.md)
+### Index
+1. [Basic Syntax](#basic-syntax)
+2. [Operators](#operators)
+    * [Arithmetic](#arithmetic)
+    * [Comparison](#comparison)
+    * [Logical](#logical)
+    * [Other](#other)
+3. [Declarations](#declarations)
+4. [Functions](#functions)
+    * [Functions as values and closures](#functions-as-values-and-closures)
+    * [Variadic Functions](#variadic-functions)
+5. [Built-in Types](#built-in-types)
+6. [Type Conversions](#type-conversions)
+7. [Packages](#packages)
+8. [Control structures](#control-structures)
+    * [If](#if)
+    * [Loops](#loops)
+    * [Switch](#switch)
+9. [Arrays, Slices, Ranges](#arrays-slices-ranges)
+    * [Arrays](#arrays)
+    * [Slices](#slices)
+    * [Operations on Arrays and Slices](#operations-on-arrays-and-slices)
+10. [Maps](#maps)
+11. [Structs](#structs)
+12. [Pointers](#pointers)
+13. [Interfaces](#interfaces)
+14. [Embedding](#embedding)
+15. [Errors](#errors)
+16. [Concurrency](#concurrency)
+    * [Goroutines](#goroutines)
+    * [Channels](#channels)
+    * [Channel Axioms](#channel-axioms)
+17. [Printing](#printing)
+18. [Reflection](#reflection)
+    * [Type Switch](#type-switch)
+    * [Examples](https://github.com/a8m/reflect-examples)
+19. [Snippets](#snippets)
+    * [Http-Server](#http-server)
+
+## Credits
+
+Most example code taken from [A Tour of Go](http://tour.golang.org/), which is an excellent introduction to Go.
+If you're new to Go, do that tour. Seriously.
+
+## Go in a Nutshell
+
+* Imperative language
+* Statically typed
+* Syntax tokens similar to C (but less parentheses and no semicolons) and the structure to Oberon-2
+* Compiles to native code (no JVM)
+* No classes, but structs with methods
+* Interfaces
+* No implementation inheritance. There's [type embedding](http://golang.org/doc/effective%5Fgo.html#embedding), though.
+* Functions are first class citizens
+* Functions can return multiple values
+* Has closures
+* Pointers, but not pointer arithmetic
+* Built-in concurrency primitives: Goroutines and Channels
+
+# Basic Syntax
+
+## Hello World
+File `hello.go`:
+```go
+package main
+
+import "fmt"
+
+func main() {
+    fmt.Println("Hello Go")
+}
+```
+`$ go run hello.go`
+
+## Operators
+### Arithmetic
+|Operator|Description|
+|--------|-----------|
+|`+`|addition|
+|`-`|subtraction|
+|`*`|multiplication|
+|`/`|quotient|
+|`%`|remainder|
+|`&`|bitwise and|
+|`\|`|bitwise or|
+|`^`|bitwise xor|
+|`&^`|bit clear (and not)|
+|`<<`|left shift|
+|`>>`|right shift|
+
+### Comparison
+|Operator|Description|
+|--------|-----------|
+|`==`|equal|
+|`!=`|not equal|
+|`<`|less than|
+|`<=`|less than or equal|
+|`>`|greater than|
+|`>=`|greater than or equal|
+
+### Logical
+|Operator|Description|
+|--------|-----------|
+|`&&`|logical and|
+|`\|\|`|logical or|
+|`!`|logical not|
+
+### Other
+|Operator|Description|
+|--------|-----------|
+|`&`|address of / create pointer|
+|`*`|dereference pointer|
+|`<-`|send / receive operator (see 'Channels' below)|
+
+## Declarations
+Type goes after identifier!
+```go
+var foo int // declaration without initialization
+var foo int = 42 // declaration with initialization
+var foo, bar int = 42, 1302 // declare and init multiple vars at once
+var foo = 42 // type omitted, will be inferred
+foo := 42 // shorthand, only in func bodies, omit var keyword, type is always implicit
+const constant = "This is a constant"
+
+// iota can be used for incrementing numbers, starting from 0
+const (
+    _ = iota
+    a
+    b
+    c = 1 << iota
+    d
+)
+    fmt.Println(a, b) // 1 2 (0 is skipped)
+    fmt.Println(c, d) // 8 16 (2^3, 2^4)
+```
+
+## Functions
+```go
+// a simple function
+func functionName() {}
+
+// function with parameters (again, types go after identifiers)
+func functionName(param1 string, param2 int) {}
+
+// multiple parameters of the same type
+func functionName(param1, param2 int) {}
+
+// return type declaration
+func functionName() int {
+    return 42
+}
+
+// Can return multiple values at once
+func returnMulti() (int, string) {
+    return 42, "foobar"
+}
+var x, str = returnMulti()
+
+// Return multiple named results simply by return
+func returnMulti2() (n int, s string) {
+    n = 42
+    s = "foobar"
+    // n and s will be returned
+    return
+}
+var x, str = returnMulti2()
+
+```
+
+### Functions As Values And Closures
+```go
+func main() {
+    // assign a function to a name
+    add := func(a, b int) int {
+        return a + b
+    }
+    // use the name to call the function
+    fmt.Println(add(3, 4))
+}
+
+// Closures, lexically scoped: Functions can access values that were
+// in scope when defining the function
+func scope() func() int{
+    outer_var := 2
+    foo := func() int { return outer_var}
+    return foo
+}
+
+func another_scope() func() int{
+    // won't compile because outer_var and foo not defined in this scope
+    outer_var = 444
+    return foo
+}
+
+
+// Closures
+func outer() (func() int, int) {
+    outer_var := 2
+    inner := func() int {
+        outer_var += 99 // outer_var from outer scope is mutated.
+        return outer_var
+    }
+    inner()
+    return inner, outer_var // return inner func and mutated outer_var 101
+}
+```
+
+### Variadic Functions
+```go
+func main() {
+	fmt.Println(adder(1, 2, 3)) 	// 6
+	fmt.Println(adder(9, 9))	// 18
+
+	nums := []int{10, 20, 30}
+	fmt.Println(adder(nums...))	// 60
+}
+
+// By using ... before the type name of the last parameter you can indicate that it takes zero or more of those parameters.
+// The function is invoked like any other function except we can pass as many arguments as we want.
+func adder(args ...int) int {
+	total := 0
+	for _, v := range args { // Iterates over the arguments whatever the number.
+		total += v
+	}
+	return total
+}
+```
+
+## Built-in Types
+```
+bool
+
+string
+
+int  int8  int16  int32  int64
+uint uint8 uint16 uint32 uint64 uintptr
+
+byte // alias for uint8
+
+rune // alias for int32 ~= a character (Unicode code point) - very Viking
+
+float32 float64
+
+complex64 complex128
+```
+
+## Type Conversions
+```go
+var i int = 42
+var f float64 = float64(i)
+var u uint = uint(f)
+
+// alternative syntax
+i := 42
+f := float64(i)
+u := uint(f)
+```
+
+## Packages
+* Package declaration at top of every source file
+* Executables are in package `main`
+* Convention: package name == last name of import path (import path `math/rand` => package `rand`)
+* Upper case identifier: exported (visible from other packages)
+* Lower case identifier: private (not visible from other packages)
+
+## Control structures
+
+### If
+```go
+func main() {
+	// Basic one
+	if x > 10 {
+		return x
+	} else if x == 10 {
+		return 10
+	} else {
+		return -x
+	}
+
+	// You can put one statement before the condition
+	if a := b + c; a < 42 {
+		return a
+	} else {
+		return a - 42
+	}
+
+	// Type assertion inside if
+	var val interface{}
+	val = "foo"
+	if str, ok := val.(string); ok {
+		fmt.Println(str)
+	}
+}
+```
+
+### Loops
+```go
+    // There's only `for`, no `while`, no `until`
+    for i := 1; i < 10; i++ {
+    }
+    for ; i < 10;  { // while - loop
+    }
+    for i < 10  { // you can omit semicolons if there is only a condition
+    }
+    for { // you can omit the condition ~ while (true)
+    }
+
+    // use break/continue on current loop
+    // use break/continue with label on outer loop
+here:
+    for i := 0; i < 2; i++ {
+        for j := i + 1; j < 3; j++ {
+            if i == 0 {
+                continue here
+            }
+            fmt.Println(j)
+            if j == 2 {
+                break
+            }
+        }
+    }
+
+there:
+    for i := 0; i < 2; i++ {
+        for j := i + 1; j < 3; j++ {
+            if j == 1 {
+                continue
+            }
+            fmt.Println(j)
+            if j == 2 {
+                break there
+            }
+        }
+    }
+```
+
+### Switch
+```go
+    // switch statement
+    switch operatingSystem {
+    case "darwin":
+        fmt.Println("Mac OS Hipster")
+        // cases break automatically, no fallthrough by default
+    case "linux":
+        fmt.Println("Linux Geek")
+    default:
+        // Windows, BSD, ...
+        fmt.Println("Other")
+    }
+
+    // as with for and if, you can have an assignment statement before the switch value
+    switch os := runtime.GOOS; os {
+    case "darwin": ...
+    }
+
+    // you can also make comparisons in switch cases
+    number := 42
+    switch {
+        case number < 42:
+            fmt.Println("Smaller")
+        case number == 42:
+            fmt.Println("Equal")
+        case number > 42:
+            fmt.Println("Greater")
+    }
+
+    // cases can be presented in comma-separated lists
+    var char byte = '?'
+    switch char {
+        case ' ', '?', '&', '=', '#', '+', '%':
+            fmt.Println("Should escape")
+    }
+```
+
+## Arrays, Slices, Ranges
+
+### Arrays
+```go
+var a [10]int // declare an int array with length 10. Array length is part of the type!
+a[3] = 42     // set elements
+i := a[3]     // read elements
+
+// declare and initialize
+var a = [2]int{1, 2}
+a := [2]int{1, 2} //shorthand
+a := [...]int{1, 2} // elipsis -> Compiler figures out array length
+```
+
+### Slices
+```go
+var a []int                              // declare a slice - similar to an array, but length is unspecified
+var a = []int {1, 2, 3, 4}               // declare and initialize a slice (backed by the array given implicitly)
+a := []int{1, 2, 3, 4}                   // shorthand
+chars := []string{0:"a", 2:"c", 1: "b"}  // ["a", "b", "c"]
+
+var b = a[lo:hi]	// creates a slice (view of the array) from index lo to hi-1
+var b = a[1:4]		// slice from index 1 to 3
+var b = a[:3]		// missing low index implies 0
+var b = a[3:]		// missing high index implies len(a)
+a =  append(a,17,3)	// append items to slice a
+c := append(a,b...)	// concatenate slices a and b
+
+// create a slice with make
+a = make([]byte, 5, 5)	// first arg length, second capacity
+a = make([]byte, 5)	// capacity is optional
+
+// create a slice from an array
+x := [3]string{"Лайка", "Белка", "Стрелка"}
+s := x[:] // a slice referencing the storage of x
+```
+
+### Operations on Arrays and Slices
+`len(a)` gives you the length of an array/a slice. It's a built-in function, not a attribute/method on the array.
+
+```go
+// loop over an array/a slice
+for i, e := range a {
+    // i is the index, e the element
+}
+
+// if you only need e:
+for _, e := range a {
+    // e is the element
+}
+
+// ...and if you only need the index
+for i := range a {
+}
+
+// In Go pre-1.4, you'll get a compiler error if you're not using i and e.
+// Go 1.4 introduced a variable-free form, so that you can do this
+for range time.Tick(time.Second) {
+    // do it once a sec
+}
+
+```
+
+## Maps
+
+```go
+var m map[string]int
+m = make(map[string]int)
+m["key"] = 42
+fmt.Println(m["key"])
+
+delete(m, "key")
+
+elem, ok := m["key"] // test if key "key" is present and retrieve it, if so
+
+// map literal
+var m = map[string]Vertex{
+    "Bell Labs": {40.68433, -74.39967},
+    "Google":    {37.42202, -122.08408},
+}
+
+// iterate over map content
+for key, value := range m {
+}
+
+```
+
+## Structs
+
+There are no classes, only structs. Structs can have methods.
+```go
+// A struct is a type. It's also a collection of fields
+
+// Declaration
+type Vertex struct {
+    X, Y int
+}
+
+// Creating
+var v = Vertex{1, 2}
+var v = Vertex{X: 1, Y: 2} // Creates a struct by defining values with keys
+var v = []Vertex{{1,2},{5,2},{5,5}} // Initialize a slice of structs
+
+// Accessing members
+v.X = 4
+
+// You can declare methods on structs. The struct you want to declare the
+// method on (the receiving type) comes between the the func keyword and
+// the method name. The struct is copied on each method call(!)
+func (v Vertex) Abs() float64 {
+    return math.Sqrt(v.X*v.X + v.Y*v.Y)
+}
+
+// Call method
+v.Abs()
+
+// For mutating methods, you need to use a pointer (see below) to the Struct
+// as the type. With this, the struct value is not copied for the method call.
+func (v *Vertex) add(n float64) {
+    v.X += n
+    v.Y += n
+}
+
+```
+**Anonymous structs:**
+Cheaper and safer than using `map[string]interface{}`.
+```go
+point := struct {
+	X, Y int
+}{1, 2}
+```
+
+## Pointers
+```go
+p := Vertex{1, 2}  // p is a Vertex
+q := &p            // q is a pointer to a Vertex
+r := &Vertex{1, 2} // r is also a pointer to a Vertex
+
+// The type of a pointer to a Vertex is *Vertex
+
+var s *Vertex = new(Vertex) // new creates a pointer to a new struct instance
+```
+
+## Interfaces
+```go
+// interface declaration
+type Awesomizer interface {
+    Awesomize() string
+}
+
+// types do *not* declare to implement interfaces
+type Foo struct {}
+
+// instead, types implicitly satisfy an interface if they implement all required methods
+func (foo Foo) Awesomize() string {
+    return "Awesome!"
+}
+```
+
+## Embedding
+
+There is no subclassing in Go. Instead, there is interface and struct embedding.
+
+```go
+// ReadWriter implementations must satisfy both Reader and Writer
+type ReadWriter interface {
+    Reader
+    Writer
+}
+
+// Server exposes all the methods that Logger has
+type Server struct {
+    Host string
+    Port int
+    *log.Logger
+}
+
+// initialize the embedded type the usual way
+server := &Server{"localhost", 80, log.New(...)}
+
+// methods implemented on the embedded struct are passed through
+server.Log(...) // calls server.Logger.Log(...)
+
+// the field name of the embedded type is its type name (in this case Logger)
+var logger *log.Logger = server.Logger
+```
+
+## Errors
+There is no exception handling. Functions that might produce an error just declare an additional return value of type `Error`. This is the `Error` interface:
+```go
+type error interface {
+    Error() string
+}
+```
+
+A function that might return an error:
+```go
+func doStuff() (int, error) {
+}
+
+func main() {
+    result, err := doStuff()
+    if err != nil {
+        // handle error
+    } else {
+        // all is good, use result
+    }
+}
+```
+
+# Concurrency
+
+## Goroutines
+Goroutines are lightweight threads (managed by Go, not OS threads). `go f(a, b)` starts a new goroutine which runs `f` (given `f` is a function).
+
+```go
+// just a function (which can be later started as a goroutine)
+func doStuff(s string) {
+}
+
+func main() {
+    // using a named function in a goroutine
+    go doStuff("foobar")
+
+    // using an anonymous inner function in a goroutine
+    go func (x int) {
+        // function body goes here
+    }(42)
+}
+```
+
+## Channels
+```go
+ch := make(chan int) // create a channel of type int
+ch <- 42             // Send a value to the channel ch.
+v := <-ch            // Receive a value from ch
+
+// Non-buffered channels block. Read blocks when no value is available, write blocks until there is a read.
+
+// Create a buffered channel. Writing to a buffered channels does not block if less than <buffer size> unread values have been written.
+ch := make(chan int, 100)
+
+close(ch) // closes the channel (only sender should close)
+
+// read from channel and test if it has been closed
+v, ok := <-ch
+
+// if ok is false, channel has been closed
+
+// Read from channel until it is closed
+for i := range ch {
+    fmt.Println(i)
+}
+
+// select blocks on multiple channel operations, if one unblocks, the corresponding case is executed
+func doStuff(channelOut, channelIn chan int) {
+    select {
+    case channelOut <- 42:
+        fmt.Println("We could write to channelOut!")
+    case x := <- channelIn:
+        fmt.Println("We could read from channelIn")
+    case <-time.After(time.Second * 1):
+        fmt.Println("timeout")
+    }
+}
+```
+
+### Channel Axioms
+- A send to a nil channel blocks forever
+
+  ```go
+  var c chan string
+  c <- "Hello, World!"
+  // fatal error: all goroutines are asleep - deadlock!
+  ```
+- A receive from a nil channel blocks forever
+
+  ```go
+  var c chan string
+  fmt.Println(<-c)
+  // fatal error: all goroutines are asleep - deadlock!
+  ```
+- A send to a closed channel panics
+
+  ```go
+  var c = make(chan string, 1)
+  c <- "Hello, World!"
+  close(c)
+  c <- "Hello, Panic!"
+  // panic: send on closed channel
+  ```
+- A receive from a closed channel returns the zero value immediately
+
+  ```go
+  var c = make(chan int, 2)
+  c <- 1
+  c <- 2
+  close(c)
+  for i := 0; i < 3; i++ {
+      fmt.Printf("%d ", <-c)
+  }
+  // 1 2 0
+  ```
+
+## Printing
+
+```go
+fmt.Println("Hello, 你好, नमस्ते, Привет, ᎣᏏᏲ") // basic print, plus newline
+p := struct { X, Y int }{ 17, 2 }
+fmt.Println( "My point:", p, "x coord=", p.X ) // print structs, ints, etc
+s := fmt.Sprintln( "My point:", p, "x coord=", p.X ) // print to string variable
+
+fmt.Printf("%d hex:%x bin:%b fp:%f sci:%e",17,17,17,17.0,17.0) // c-ish format
+s2 := fmt.Sprintf( "%d %f", 17, 17.0 ) // formatted print to string variable
+
+hellomsg := `
+ "Hello" in Chinese is 你好 ('Ni Hao')
+ "Hello" in Hindi is नमस्ते ('Namaste')
+` // multi-line string literal, using back-tick at beginning and end
+```
+
+## Reflection
+### Type Switch
+A type switch is like a regular switch statement, but the cases in a type switch specify types (not values), and those values are compared against the type of the value held by the given interface value.
+```go
+func do(i interface{}) {
+	switch v := i.(type) {
+	case int:
+		fmt.Printf("Twice %v is %v\n", v, v*2)
+	case string:
+		fmt.Printf("%q is %v bytes long\n", v, len(v))
+	default:
+		fmt.Printf("I don't know about type %T!\n", v)
+	}
+}
+
+func main() {
+	do(21)
+	do("hello")
+	do(true)
+}
+```
+
+# Snippets
+
+## HTTP Server
+```go
+package main
+
+import (
+    "fmt"
+    "net/http"
+)
+
+// define a type for the response
+type Hello struct{}
+
+// let that type implement the ServeHTTP method (defined in interface http.Handler)
+func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+    fmt.Fprint(w, "Hello!")
+}
+
+func main() {
+    var h Hello
+    http.ListenAndServe("localhost:4000", h)
+}
+
+// Here's the method signature of http.ServeHTTP:
+// type Handler interface {
+//     ServeHTTP(w http.ResponseWriter, r *http.Request)
+// }
+```

+ 839 - 0
docs/lang/GraphQL.md

@@ -0,0 +1,839 @@
+
+
+[http://graphql.org/](http://graphql.org/)
+
+* [https://github.com/graphql/express-graphql](https://github.com/graphql/express-graphql)
+* [https://github.com/chentsulin/awesome-graphql](https://github.com/chentsulin/awesome-graphql`)
+
+
+## Queries
+{: .-three-column}
+
+### Basic query
+
+```js
+{ status }
+```
+
+#### ↓
+
+```js
+{ status: 'available' }
+```
+{: .-setup}
+
+### Nesting
+
+```js
+{ hero { name height } }
+```
+
+#### ↓
+
+```js
+{ hero:
+    { name: "Luke Skywalker",
+      height: 1.74 } }
+```
+{: .-setup}
+
+### Lists
+
+```js
+{ friends { name } }
+```
+
+#### ↓
+
+```js
+{ friends:
+    [ { name: "Luke Skywalker" },
+      { name: "Han Solo" },
+      { name: "R2D2" } ] }
+```
+{: .-setup}
+
+GraphQL queries look the same for both single items or lists of items.
+
+### Lookups
+
+```js
+{
+  hero(id: "1000") { id name }
+}
+```
+
+#### ↓
+
+```js
+{ hero:
+    { id: "1000",
+    { name: "Luke Skywalker" } }
+```
+{: .-setup}
+
+### Aliases
+
+```js
+{
+  luke: hero(id: "1000") { name }
+  han: hero(id: "1001") { name }
+}
+```
+
+#### ↓
+
+```js
+{ luke:
+    { name: "Luke Skywalker" },
+    han:
+    { name: "Han Solo" } }
+```
+{: .-setup}
+
+### Operation names and variables
+
+#### Query
+```js
+query FindHero($id: String!) {
+  hero(id: $id) { name }
+}
+```
+
+Just to make things less ambiguous. Also, to use variables, you need an operation name.
+
+#### Variables
+
+```js
+{ id: '1000' }
+```
+
+### Mutations
+
+#### Query
+
+```js
+{ createReview($review) { id } }
+```
+
+#### Variables
+
+```js
+{ review: { stars: 5 } }
+```
+
+#### ↓
+
+```js
+{ createReview: { id: 5291 } }
+```
+
+Mutations are just fields that do something when queried.
+
+### Multiple types
+
+```js
+{
+  search(q: "john") {
+    id
+    ... on User { name }
+    ... on Comment { body author { name } }
+  }
+}
+```
+
+Great for searching.
+
+
+Over HTTP
+---------
+
+#### GET
+
+```js
+fetch('http://myapi/graphql?query={ me { name } }')
+```
+
+#### POST
+
+```js
+fetch('http://myapi/graphql', {
+  body: JSON.stringify({
+    query: '...',
+    operationName: '...',
+    variables: { ... }
+  })
+})
+```
+
+Schema
+------
+{: .-three-column}
+
+### Basic schemas
+
+```js
+type Query {
+  me: User
+  users(limit: Int): [User]
+}
+
+type User {
+  id: ID!
+  name: String
+}
+```
+
+See: [sogko/graphql-shorthand-notation-cheat-sheet](https://raw.githubusercontent.com/sogko/graphql-shorthand-notation-cheat-sheet/master/graphql-shorthand-notation-cheat-sheet.png)
+
+### Built in types
+
+#### Scalar types
+
+| `Int` | Integer |
+| `Float` | Float |
+| `String` | String |
+| `Boolean` | Boolean |
+| `ID` | ID |
+
+#### Type definitions
+
+| `scalar` | Scalar type |
+| `type` | Object type |
+| `interface` | Interface type |
+| `union` | Union type |
+| `enum` | Enumerable type |
+| `input` | Input object type |
+
+#### Type modifiers
+
+| `String` | Nullable string |
+| `String!` | Required string |
+| `[String]` | List of strings |
+| `[String]!` | Required list of strings |
+| `[String!]!` | Required list of required strings |
+
+### Mutations
+
+```js
+type Mutation {
+  users(params: ListUsersInput) [User]!
+}
+```
+
+### Interfaces
+
+```js
+interface Entity {
+  id: ID!
+}
+
+type User implements Entity {
+  id: ID!
+  name: String
+}
+```
+
+### Enums
+
+```js
+enum DIRECTION {
+  LEFT
+  RIGHT
+}
+
+type Root {
+  direction: DIRECTION!
+}
+```
+{: data-line="1,2,3,4"}
+
+### Unions
+
+```js
+type Artist { ··· }
+type Album { ··· }
+
+union Result = Artist | Album
+
+type Query {
+  search(q: String) [Result]
+}
+```
+{: data-line="4"}
+
+References
+----------
+
+- <http://graphql.org/learn/queries/>
+- <http://graphql.org/learn/serving-over-http/>
+
+# Essential quotes
+* "GraphQL is about asking for specific fields on objects"
+* "The query has exactly the same shape as the result"
+* "Clients can fetch lots of related data in one request, instead of making several roundtrips in a classic REST architecture"
+* "GraphQL queries look the same for both single items or lists of items"
+* "In REST, you can only pass a single set of arguments but in GraphQL, every field and nested object can get its own set of arguments, making GraphQL a complete replacement for making multiple API fetches"
+* "While query fields are executed in parallel, mutation fields run in series, one after the other"
+
+# Glossary
+* Type
+* Field
+* Function for each field on each type
+
+```
+type Query {
+  me: User
+}
+
+type User {
+  id: ID
+  name: String
+}
+
+function Query_me(request) {
+  return request.auth.user;
+}
+
+function User_name(user) {
+  return user.getName();
+}
+```
+
+# Steps involved
+1. Receive GraphQL query
+2. Validate query against the types and field that are defined
+3. Run provided functions to produce the result
+
+Example Query
+```
+{
+  me {
+    name
+  }
+}
+```
+
+JSON result
+```
+{
+  "me": {
+    "name": "Luke Skywalker"
+  }
+}
+```
+
+Example Query
+```
+{
+  hero {
+    name
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "hero": {
+      "name": "R2-D2"
+    }
+  }
+}
+```
+
+# Nested data with arrays
+Query
+```
+{
+  hero {
+    name
+    # Queries can have comments!
+    friends {
+      name
+    }
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "hero": {
+      "name": "R2-D2",
+      "friends": [
+        {
+          "name": "Luke Skywalker"
+        },
+        {
+          "name": "Han Solo"
+        },
+        {
+          "name": "Leia Organa"
+        }
+      ]
+    }
+  }
+}
+```
+
+# Pass arguments to fields
+Query
+```
+{
+  human(id: "1000") {
+    name
+    height
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "human": {
+      "name": "Luke Skywalker",
+      "height": 1.72
+    }
+  }
+}
+```
+
+# Pass arguments into scalar fields to let the server transform it
+Query
+```
+{
+  human(id: "1000") {
+    name
+    height(unit: FOOT) # Enumeration type
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "human": {
+      "name": "Luke Skywalker",
+      "height": 5.6430448
+    }
+  }
+}
+```
+
+# Data types for arguments
+* Enumeration type
+* GraphQL's default set of types
+* The GraphQL server can declare its own custom types (must be serializable)
+
+# Aliases to query the same field with different arguments
+Aliases let you rename the result of a field to anything you want
+
+```
+{
+  empireHero: hero(episode: EMPIRE) {
+    name
+  }
+  jediHero: hero(episode: JEDI) {
+    name
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "empireHero": {
+      "name": "Luke Skywalker"
+    },
+    "jediHero": {
+      "name": "R2-D2"
+    }
+  }
+}
+```
+
+# Fragments to split queries into reusable units
+```
+{
+  leftComparison: hero(episode: EMPIRE) {
+    ...comparisonFields
+  }
+  rightComparison: hero(episode: JEDI) {
+    ...comparisonFields
+  }
+}
+
+fragment comparisonFields on Character {
+  name
+  appearsIn
+  friends {
+    name
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "leftComparison": {
+      "name": "Luke Skywalker",
+      "appearsIn": [
+        "NEWHOPE",
+        "EMPIRE",
+        "JEDI"
+      ],
+      "friends": [
+        {
+          "name": "Han Solo"
+        },
+        {
+          "name": "Leia Organa"
+        },
+        {
+          "name": "C-3PO"
+        },
+        {
+          "name": "R2-D2"
+        }
+      ]
+    },
+    "rightComparison": {
+      "name": "R2-D2",
+      "appearsIn": [
+        "NEWHOPE",
+        "EMPIRE",
+        "JEDI"
+      ],
+      "friends": [
+        {
+          "name": "Luke Skywalker"
+        },
+        {
+          "name": "Han Solo"
+        },
+        {
+          "name": "Leia Organa"
+        }
+      ]
+    }
+  }
+}
+```
+
+# Use variables in fragments
+```
+query HeroComparison($first: Int = 3) {
+  leftComparison: hero(episode: EMPIRE) {
+    ...comparisonFields
+  }
+  rightComparison: hero(episode: JEDI) {
+    ...comparisonFields
+  }
+}
+
+fragment comparisonFields on Character {
+  name
+  friendsConnection(first: $first) {
+    totalCount
+    edges {
+      node {
+        name
+      }
+    }
+  }
+}
+```
+
+Variable
+```
+{"first": 2}
+```
+
+JSON result
+```
+{
+  "data": {
+    "leftComparison": {
+      "name": "Luke Skywalker",
+      "friendsConnection": {
+        "totalCount": 4,
+        "edges": [
+          {
+            "node": {
+              "name": "Han Solo"
+            }
+          },
+          {
+            "node": {
+              "name": "Leia Organa"
+            }
+          }
+        ]
+      }
+    },
+    "rightComparison": {
+      "name": "R2-D2",
+      "friendsConnection": {
+        "totalCount": 3,
+        "edges": [
+          {
+            "node": {
+              "name": "Luke Skywalker"
+            }
+          },
+          {
+            "node": {
+              "name": "Han Solo"
+            }
+          }
+        ]
+      }
+    }
+  }
+}
+```
+
+# Operation types
+* query (can be omitted with "query shorthand syntax" -> no name + no variable definitions)
+* mutation
+* subscription
+
+# Operation name
+* Is only required in multi-operation documents
+* "Name your queries to make the code less ambigous"
+```
+query HeroNameAndFriends {
+  hero {
+    name
+    friends {
+      name
+    }
+  }
+}
+```
+
+# Using variables
+* It's not needed to manipulate the query string at runtime
+* Never do string interpolation to construct queries from user-supplied values
+
+Steps for using variables
+1. Replace the static value with `$variableName`
+2. Declare `$variableName` as an accepted variable
+3. Pass `variableName: value` (usually) as JSON
+
+Query with variable definition
+```
+query HeroNameAndFriends($episode: Episode) {
+  hero(episode: $episode) {
+    name
+    friends {
+      name
+    }
+  }
+}
+```
+
+Variable
+```
+{
+  "episode": "JEDI"
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "hero": {
+      "name": "R2-D2",
+      "friends": [
+        {
+          "name": "Luke Skywalker"
+        },
+        {
+          "name": "Han Solo"
+        },
+        {
+          "name": "Leia Organa"
+        }
+      ]
+    }
+  }
+}
+```
+
+# Variable definitions
+* Like arguments to a query
+* Must be prefixed with a $ sign followed by their type `($episode: Episode)`
+
+# Required variable definitions
+* are suffixed with a ! sign `($episode: Episode!)`
+
+# Default variable values
+* are suffixed with " sign `($episode: Episode = JEDI)`
+```
+query HeroNameAndFriends($episode: Episode = JEDI) {
+  hero(episode: $episode) {
+    name
+    friends {
+      name
+    }
+  }
+}
+```
+
+# Directives to dynamically change the structure using variables
+* Example: UI component that has a summarized and a detailed view
+* Directives can be attached to a filed or fragment incusion
+* Two directives built into the spec:
+  * `include(if: Boolean)` - Includes this field only if the argument is `true`
+  * `skip(if: Boolean)` - Skips this field if the argument is `true`
+
+```
+query Hero($episode: Episode, $withFriends: Boolean!) {
+  hero(episode: $episode) {
+    name
+    friends @include(if: $withFriends) {
+      name
+    }
+  }
+}
+```
+
+**Summarized view**
+
+Variables
+```
+{
+  "episode": "JEDI",
+  "withFriends": false
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "hero": {
+      "name": "R2-D2"
+    }
+  }
+}
+```
+
+**Detailed view**
+
+Variables
+```
+{
+  "episode": "JEDI",
+  "withFriends": true
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "hero": {
+      "name": "R2-D2",
+      "friends": [
+        {
+          "name": "Luke Skywalker"
+        },
+        {
+          "name": "Han Solo"
+        },
+        {
+          "name": "Leia Organa"
+        }
+      ]
+    }
+  }
+}
+```
+
+# Mutations
+* We can mutate and query the new value of a field with one request
+* `createReview` field returns the `stars` and `commentary` fields of the newly created review
+* The `review` variable is not a scalar - It's an *input object type*
+```
+mutation CreateReviewForEpisode($ep: Episode!, $review: ReviewInput!) {
+  createReview(episode: $ep, review: $review) {
+    stars
+    commentary
+  }
+}
+```
+
+Variables
+```
+{
+  "ep": "JEDI",
+  "review": {
+    "stars": 5,
+    "commentary": "This is a great movie!"
+  }
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "createReview": {
+      "stars": 5,
+      "commentary": "This is a great movie!"
+    }
+  }
+}
+```
+
+# Multiple fields in mutations
+* **While query fields are executed in parallel, mutation fields run in series, one after the other**
+* 2 `incrementCredits` mutations in one request mean: the first is guaranteed to finish before the second begins
+
+# Inline Fragments for fields that return an interface or a union type
+* The `hero` field returns the type `Character`, which might be either a `Human` or a `Droid` depending on the `episode` argument
+* `name` exists on both so you can directly ask for that in the query
+* To ask for a field on the concrete type, you need to use an *inline fragment* with a type condition
+
+```
+query HeroForEpisode($ep: Episode!) {
+  hero(episode: $ep) {
+    name
+    ... on Droid {
+      primaryFunction
+    }
+    ... on Human {
+      height
+    }
+  }
+}
+```
+
+Variables
+```
+{
+  "ep": "JEDI"
+}
+```
+
+JSON result
+```
+{
+  "data": {
+    "hero": {
+      "name": "R2-D2",
+      "primaryFunction": "Astromech"
+    }
+  }
+}
+```

+ 1526 - 0
docs/lang/JavaScript.md

@@ -0,0 +1,1526 @@
+
+
+* [Airbnb JavaScript Style Guide](https://github.com/airbnb/javascript/blob/master/README.md)
+* [Awesome JavaScript](https://github.com/sorrycc/awesome-javascript)
+
+#### Resources
+
+* [Learn Javascript(GitbookIO)](https://gitbookio.gitbooks.io/javascript/content/)
+* [Learn JavaScript with Eric Elliott](https://github.com/learn-javascript-courses)
+* [JS The right way](http://jstherightway.org/)
+
+```
+#### notes ####
+////
+
+```
+
+* [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference)
+
+```
+/* *******************************************************************************************
+ * GLOBAL OBJECTS > OBJECT
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object
+ * ******************************************************************************************* */
+
+// Global object: properties
+Object.length                                        // length is a property of a function object, and indicates how many arguments the function expects, i.e. the number of formal parameters. This number does not include the rest parameter. Has a value of 1.
+Object.prototype                                     // Represents the Object prototype object and allows to add new properties and methods to all objects of type Object.
+
+// Methods of the Object constructor
+Object.assign(target, ...sources)                    // Copies the values of all enumerable own properties from one or more source objects to a target object. method is used to copy the values of all enumerable own properties from one or more source objects to a target object. It will return the target object
+Object.create(MyObject)                              // Creates a new object with the specified prototype object and properties. The object which should be the prototype of the newly-created object.
+Object.defineProperty(obj, prop, descriptor)         // Adds the named property described by a given descriptor to an object.
+Object.defineProperties(obj, props)                  // Adds the named properties described by the given descriptors to an object.
+Object.entries(obj)                                  // Returns an array containing all of the [key, value] pairs of a given object's own enumerable string properties.
+Object.freeze(obj)                                   // Freezes an object: other code can't delete or change any properties.
+Object.getOwnPropertyDescriptor(obj, prop)           // Returns a property descriptor for a named property on an object.
+Object.getOwnPropertyDescriptors(obj)                // Returns an object containing all own property descriptors for an object.
+Object.getOwnPropertyNames(obj)                      // Returns an array containing the names of all of the given object's own enumerable and non-enumerable properties.
+Object.getOwnPropertySymbols(obj)                    // Returns an array of all symbol properties found directly upon a given object.
+Object.getPrototypeOf(obj)                           // Returns the prototype of the specified object.
+Object.is(value1, value2);                           // Compares if two values are the same value. Equates all NaN values (which differs from both Abstract Equality Comparison and Strict Equality Comparison).
+Object.isExtensible(obj)                             // Determines if extending of an object is allowed.
+Object.isFrozen(obj)                                 // Determines if an object was frozen.
+Object.isSealed(obj)                                 // Determines if an object is sealed.
+Object.keys(obj)                                     // Returns an array containing the names of all of the given object's own enumerable string properties.
+Object.preventExtensions(obj)                        // Prevents any extensions of an object.
+Object.seal(obj)                                     // Prevents other code from deleting properties of an object.
+Object.setPrototypeOf(obj, prototype)                // Sets the prototype (i.e., the internal [[Prototype]] property).
+Object.values(obj)                                   // Returns an array containing the values that correspond to all of a given object's own enumerable string properties.
+
+// Object instances and Object prototype object (Object.prototype.property or Object.prototype.method())
+// Properties
+obj.constructor                                      // Specifies the function that creates an object's prototype.
+obj.__proto__                                        // Points to the object which was used as prototype when the object was instantiated.
+
+// Methods
+obj.hasOwnProperty(prop)                             // Returns a boolean indicating whether an object contains the specified property as a direct property of that object and not inherited through the prototype chain.
+prototypeObj.isPrototypeOf(object)                   // Returns a boolean indicating whether the object this method is called upon is in the prototype chain of the specified object.
+obj.propertyIsEnumerable(prop)                       // Returns a boolean indicating if the internal ECMAScript [[Enumerable]] attribute is set.
+obj.toLocaleString()                                 // Calls toString().
+obj.toString()                                       // Returns a string representation of the object.
+object.valueOf()                                     // Returns the primitive value of the specified object.
+
+/* *******************************************************************************************
+ * GLOBAL OBJECTS > ARRAY
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array
+ * ******************************************************************************************* */
+
+// Global object: properties
+Array.length                                         // Reflects the number of elements in an array.
+Array.prototype                                      // Represents the prototype for the Array constructor and allows to add new properties and methods to all Array objects.
+
+// Global object: methods
+Array.from(arrayLike[, mapFn[, thisArg]])            // Creates a new Array instance from an array-like or iterable object.
+Array.isArray(obj)                                   // Returns true if a variable is an array, if not false.
+Array.of(element0[, element1[, ...[, elementN]]])    // Creates a new Array instance with a variable number of arguments, regardless of number or type of the arguments.
+
+// Instance: properties
+arr.length                                           // Reflects the number of elements in an array.
+
+// Instance: mutator methods
+arr.copyWithin(target, start, end)                   // Copies a sequence of array elements within the array.
+arr.fill(value, start, end)                          // Fills all the elements of an array from a start index to an end index with a static value.
+arr.pop()                                            // Removes the last element from an array and returns that element.
+arr.push([element1[, ...[, elementN]]])              // Adds one or more elements to the end of an array and returns the new length of the array.
+arr.reverse()                                        // Reverses the order of the elements of an array in place — the first becomes the last, and the last becomes the first.
+arr.shift()                                          // Removes the first element from an array and returns that element.
+arr.sort()                                           // Sorts the elements of an array in place and returns the array.
+array.splice(start, deleteCount, item1, item2, ...)  // Adds and/or removes elements from an array.
+arr.unshift([element1[, ...[, elementN]]])           // Adds one or more elements to the front of an array and returns the new length of the array.
+
+// Instance: accessor methods
+arr.concat(value1[, value2[, ...[, valueN]]])        // Returns a new array comprised of this array joined with other array(s) and/or value(s).
+arr.includes(searchElement, fromIndex)               // Determines whether an array contains a certain element, returning true or false as appropriate.
+arr.indexOf(searchElement[, fromIndex])              // Returns the first (least) index of an element within the array equal to the specified value, or -1 if none is found.
+arr.join(separator)                                  // Joins all elements of an array into a string.
+arr.lastIndexOf(searchElement, fromIndex)            // Returns the last (greatest) index of an element within the array equal to the specified value, or -1 if none is found.
+arr.slice(begin, end)                                // Extracts a section of an array and returns a new array.
+arr.toString()                                       // Returns a string representing the array and its elements. Overrides the Object.prototype.toString() method.
+arr.toLocaleString(locales, options)                 // Returns a localized string representing the array and its elements. Overrides the Object.prototype.toLocaleString() method.
+
+// Instance: iteration methods
+arr.entries()                                        // Returns a new Array Iterator object that contains the key/value pairs for each index in the array.
+arr.every(callback[, thisArg])                       // Returns true if every element in this array satisfies the provided testing function.
+arr.filter(callback[, thisArg])                      // Creates a new array with all of the elements of this array for which the provided filtering function returns true.
+arr.find(callback[, thisArg])                        // Returns the found value in the array, if an element in the array satisfies the provided testing function or undefined if not found.
+arr.findIndex(callback[, thisArg])                   // Returns the found index in the array, if an element in the array satisfies the provided testing function or -1 if not found.
+arr.forEach(callback[, thisArg])                     // Calls a function for each element in the array.
+arr.keys()                                           // Returns a new Array Iterator that contains the keys for each index in the array.
+arr.map(callback[, initialValue])                    // Creates a new array with the results of calling a provided function on every element in this array.
+arr.reduce(callback[, initialValue])                 // Apply a function against an accumulator and each value of the array (from left-to-right) as to reduce it to a single value.
+arr.reduceRight(callback[, initialValue])            // Apply a function against an accumulator and each value of the array (from right-to-left) as to reduce it to a single value.
+arr.some(callback[, initialValue])                   // Returns true if at least one element in this array satisfies the provided testing function.
+arr.values()                                         // Returns a new Array Iterator object that contains the values for each index in the array.
+```
+
+
+
+## REF
+* [source](https://github.com/wilfredinni/javascript-cheatsheet)
+
+### Comments
+
+```javascript
+// This is an in-line comment.
+
+/* This is a
+multi-line comment */
+```
+
+## Data types
+
+JavaScript provides seven different data types:
+
+| Data Types  | Examples                                                              |
+| ----------- | --------------------------------------------------------------------- |
+| `undefined` | A variable that has not been assigned a value is of type `undefined`. |
+| `null`      | no value.                                                             |
+| `string`    | `'a', 'aa', 'aaa', 'Hello!', '11 cats'`                               |
+| `number`    | `12, -1, 0.4`                                                         |
+| `boolean`   | `true, false`                                                         |
+| `object`    | A collection of properties.                                           |
+| `symbol`    | Represents a unique identifier.                                       |
+
+## Variables
+
+```javascript
+// declare a variable
+var ourName;
+
+// store values
+myNumber = 5;
+myString = "myVar";
+
+// declare variables with the assignment operator
+var myNum = 0;
+
+// add, subtract, multiply and divide numbers
+myVar = 5 + 10; // 15
+myVar = 12 - 6; // 6
+myVar = 13 * 13; // 169
+myVar = 16 / 2; // 8
+
+// increment and decrement numbers
+i++; // the equivalent of i = i + 1
+i--; // the equivalent of i = i - 1;
+
+// decimals
+var ourDecimal = 5.7; // float
+```
+
+### ES6 var, let and const
+
+- Unlike `var`, `let` throws an error if you declare the same variable twice.
+- Variables declared with `let` inside a block, statement, or expression, its scope is limited to that block, statement, or expression.
+- Variables declared with `const` are read-only and cannot be reassigned.
+- Objects (including arrays and functions) assigned to a variable using `const` are still mutable and only prevents the reassignment of the variable identifier.
+
+To ensure your data doesn't change, JavaScript provides a function Object.freeze to prevent data mutation.
+
+```javascript
+let obj = {
+  name: "FreeCodeCamp",
+  review: "Awesome"
+};
+
+Object.freeze(obj);
+obj.review = "bad"; //will be ignored. Mutation not allowed
+obj.newProp = "Test"; // will be ignored. Mutation not allowed
+console.log(obj);
+// { name: "FreeCodeCamp", review:"Awesome"}
+```
+
+## Strings
+
+### Basics
+
+```javascript
+// escape literal quotes
+var sampleStr = 'Alan said, "Peter is learning JavaScript".';
+// this prints: Alan said, "Peter is learning JavaScript".
+
+// concatenating strings
+var ourStr = "I come first. " + "I come second.";
+
+// concatenating strings with +=
+var ourStr = "I come first. ";
+ourStr += "I come second.";
+
+// constructing strings with variables
+var ourName = "freeCodeCamp";
+var ourStr = "Hello, our name is " + ourName + ", how are you?";
+
+// appending variables to strings
+var anAdjective = "awesome!";
+var ourStr = "freeCodeCamp is ";
+ourStr += anAdjective;
+```
+
+### Escape sequences
+
+| Code | Output             |
+| ---- | ------------------ |
+| `\'` | single quote (`'`) |
+| `\"` | double quote (`"`) |
+| `\\` | backslash (`\`)    |
+| `\n` | newline            |
+| `\r` | carriage return    |
+| `\t` | tab                |
+| `\b` | backspace          |
+| `\f` | form feed          |
+
+### The length of a string
+
+```javascript
+"Alan Peter".length; // 10
+```
+
+### Split and Join
+
+```javascript
+let str = 'a string';
+let splittedStr = str.split('');
+// ​​​​​[ 'a', ' ', 's', 't', 'r', 'i', 'n', 'g' ]​​​​​
+
+let joinedStr = splittedStr.join('')
+// a string​​​​​
+```
+
+### Index of a String
+
+```javascript
+//first element has an index of 0
+var firstLetterOfFirstName = "";
+var firstName = "Ada";
+firstLetterOfFirstName = firstName[0]; // A
+
+// find the las character of a string
+var firstName = "Ada";
+var lastLetterOfFirstName = firstName[firstName.length - 1]; // a
+```
+
+### ES6 Template Literals
+
+```javascript
+const person = {
+  name: "Zodiac Hasbro",
+  age: 56
+};
+
+// Template literal with multi-line and string interpolation
+const greeting = `Hello, my name is ${person.name}!
+I am ${person.age} years old.`;
+
+console.log(greeting);
+// Hello, my name is Zodiac Hasbro!
+// I am 56 years old.
+```
+
+## Arrays
+
+```javascript
+var sandwich = ["peanut butter", "jelly", "bread"][
+  // nested arrays
+  (["Bulls", 23], ["White Sox", 45])
+];
+```
+
+### Index of an array
+
+```javascript
+var ourArray = [50, 60, 70];
+var ourData = ourArray[0]; // equals 50
+
+// modify an array with indexes
+var ourArray = [50, 40, 30];
+ourArray[0] = 15; // equals [15,40,30]
+
+// access multi-dimensional arrays with indexes
+var arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [[10, 11, 12], 13, 14]];
+arr[3]; // [[10,11,12], 13, 14]
+arr[3][0]; // [10,11,12]
+arr[3][0][1]; // 11
+```
+
+### Manipulate arrays with reverse, push, pop, shift and unshift
+
+```javascript
+// reverse an array
+[1, 'two', 3].reverse() // ​​​​​[ 3, 'two', 1 ]
+
+// push() to append data to the end of an array
+var arr = [1, 2, 3];
+arr.push(4); // arr is now [1,2,3,4]
+
+// pop() to "pop" a value off of the end of an array
+var threeArr = [1, 4, 6];
+var oneDown = threeArr.pop();
+console.log(oneDown); // Returns 6
+console.log(threeArr); // Returns [1, 4]
+
+// shift() removes the first element of an array
+var ourArray = [1, 2, [3]];
+var removedFromOurArray = ourArray.shift();
+// removedFromOurArray now equals 1 and ourArray now equals [2, [3]].
+
+// unshift() adds the element at the beginning of the array
+var ourArray = ["Stimpson", "J", "cat"];
+ourArray.shift(); // ourArray now equals ["J", "cat"]
+ourArray.unshift("Happy"); // ourArray now equals ["Happy", "J", "cat"]
+```
+
+### Remove any element with splice
+
+```javascript
+// first parameter is the index, the second indicates the number of elements to delete.
+let array = ['today', 'was', 'not', 'so', 'great'];
+array.splice(2, 2);
+// remove 2 elements beginning with the 3rd element
+// array now equals ['today', 'was', 'great']
+
+// also returns a new array containing the value of the removed elements
+let array = ['I', 'am', 'feeling', 'really', 'happy'];
+let newArray = array.splice(3, 2);
+// newArray equals ['really', 'happy']
+
+// the third parameter, represents one or more elements, let us add them
+function colorChange(arr, index, newColor) {
+  arr.splice(index, 1, newColor);
+  return arr;
+}
+let colorScheme = ['#878787', '#a08794', '#bb7e8c', '#c9b6be', '#d1becf'];
+colorScheme = colorChange(colorScheme, 2, '#332327');
+// we have removed '#bb7e8c' and added '#332327' in its place
+// colorScheme now equals ['#878787', '#a08794', '#332327', '#c9b6be', '#d1becf']
+```
+
+### Copy an array with slice
+
+```javascript
+// Copies a given number of elements to a new array and leaves the original array untouched
+let weatherConditions = ['rain', 'snow', 'sleet', 'hail', 'clear'];
+let todaysWeather = weatherConditions.slice(1, 3);
+// todaysWeather equals ['snow', 'sleet'];
+// weatherConditions still equals ['rain', 'snow', 'sleet', 'hail', 'clear']
+```
+
+### indexOf
+
+```javascript
+let fruits = ['apples', 'pears', 'oranges', 'peaches', 'pears'];
+fruits.indexOf('dates') // -1
+fruits.indexOf('oranges') // 2
+fruits.indexOf('pears') // 1, the first index at which the element exists
+```
+
+### Accessing Nested Arrays
+
+```javascript
+var ourPets = [
+  {
+    animalType: "cat",
+    names: ["Meowzer", "Fluffy", "Kit-Cat"]
+  },
+  {
+    animalType: "dog",
+    names: ["Spot", "Bowser", "Frankie"]
+  }
+];
+ourPets[0].names[1]; // "Fluffy"
+ourPets[1].names[0]; // "Spot"
+```
+
+### ES6 Includes to Determine if an Array Contains an Element
+
+```javascript
+let fruits = ["Banana", "Orange", "Apple", "Mango"];
+fruits.includes("Mango"); // true
+```
+
+### ES6 The Spread Operator
+
+```javascript
+// The ES5 code below uses apply() to compute the maximum value in an array.
+var arr = [6, 89, 3, 45];
+var maximus = Math.max.apply(null, arr); // 89
+
+// ...arr returns an unpacked array. In other words, it spreads the array.
+const arr = [6, 89, 3, 45];
+const maximus = Math.max(...arr); // 89
+
+// [...new Set(arr)] = unique value array
+const arr = [1,2,2,3,3,4,5,5];
+const uniq = [...new Set(arr)]; // [1,2,3,4,5]
+
+// copy an array
+let thisArray = [true, true, undefined, false, null];
+let thatArray = [...thisArray];
+// thatArray equals [true, true, undefined, false, null]
+// thisArray remains unchanged, and is identical to thatArray
+
+// combine arrays
+let thisArray = ['sage', 'rosemary', 'parsley', 'thyme'];
+let thatArray = ['basil', 'cilantro', ...thisArray, 'coriander'];
+// thatArray now equals ['basil', 'cilantro', 'sage', 'rosemary', 'parsley', 'thyme', 'coriander']
+
+```
+
+### ES6 Destructuring Arrays to Assign Variables
+
+```javascript
+const [a, b] = [1, 2, 3, 4, 5, 6];
+console.log(a, b); // 1, 2
+
+// it can access any value by using commas to reach the desired index
+const [a, b, , , c] = [1, 2, 3, 4, 5, 6];
+console.log(a, b, c); // 1, 2, 5
+
+// to collect the rest of the elements into a separate array.
+const [a, b, ...arr] = [1, 2, 3, 4, 5, 7];
+console.log(a, b); // 1, 2
+console.log(arr); // [3, 4, 5, 7]
+```
+
+## JavaScript Objects
+
+```javascript
+var cat = {
+  name: "Whiskers",
+  legs: 4,
+  tails: 1,
+  enemies: ["Water", "Dogs"]
+};
+```
+
+### Accessing Objects Properties
+
+Accessing with dot (`.`) notation
+
+```javascript
+var myObj = {
+  prop1: "val1",
+  prop2: "val2"
+};
+
+var prop1val = myObj.prop1; // val1
+var prop2val = myObj.prop2; // val2
+```
+
+Accessing with bracket (`[]`) notation
+
+```javascript
+var myObj = {
+  "Space Name": "Kirk",
+  "More Space": "Spock",
+  NoSpace: "USS Enterprise"
+};
+
+myObj["Space Name"]; // Kirk
+myObj["More Space"]; // Spock
+myObj["NoSpace"]; // USS Enterprise
+```
+
+Accessing with variables
+
+```javascript
+var dogs = {
+  Fido: "Mutt",
+  Hunter: "Doberman",
+  Snoopie: "Beagle"
+};
+
+var myDog = "Hunter";
+var myBreed = dogs[myDog];
+console.log(myBreed); // "Doberman"
+```
+
+Accessing and modifying Nested Objects
+
+```javascript
+let userActivity = {
+  id: 23894201352,
+  date: 'January 1, 2017',
+  data: {
+    totalUsers: 51,
+    online: 42
+  }
+};
+
+userActivity.data.online = 45; // or
+userActivity['data'].online = 45; // or
+userActivity['data']['online'] = 45;
+```
+
+Creating an array from the keys of an object
+
+```javascript
+let users = {
+  Alan: {
+    age: 27,
+    online: false
+  },
+  Jeff: {
+    age: 32,
+    online: true
+  },
+  Sarah: {
+    age: 48,
+    online: false
+  },
+  Ryan: {
+    age: 19,
+    online: true
+  }
+};
+
+function getArrayOfUsers(obj) {
+  let arr = [];
+  for (let key in obj) {
+    arr.push(key)
+  }
+  return arr;
+}
+```
+
+### Modifying Objects Properties
+
+```javascript
+// Updating object properties
+var ourDog = {
+  name: "Camper",
+  legs: 4,
+  tails: 1,
+  friends: ["everything!"]
+};
+
+ourDog.name = "Happy Camper"; // or
+ourDog["name"] = "Happy Camper";
+
+// add new properties
+ourDog.bark = "bow-wow"; // or
+ourDog["bark"] = "bow-wow";
+
+// delete properties
+delete ourDog.bark;
+```
+
+### Objects for Lookups
+
+```javascript
+var alpha = {
+  1:"Z",
+  2:"Y",
+  3:"X",
+  4:"W",
+  ...
+  24:"C",
+  25:"B",
+  26:"A"
+};
+alpha[2]; // "Y"
+alpha[24]; // "C"
+
+var value = 2;
+alpha[value]; // "Y"
+```
+
+### Test Object Properties
+
+```javascript
+var myObj = {
+  top: "hat",
+  bottom: "pants"
+};
+
+myObj.hasOwnProperty("top"); // true
+myObj.hasOwnProperty("middle"); // false
+```
+
+### Accessing Nested Objects
+
+```javascript
+var ourStorage = {
+  desk: {
+    drawer: "stapler"
+  },
+  cabinet: {
+    "top drawer": {
+      folder1: "a file",
+      folder2: "secrets"
+    },
+    "bottom drawer": "soda"
+  }
+};
+
+ourStorage.cabinet["top drawer"].folder2; // "secrets"
+ourStorage.desk.drawer; // "stapler"
+```
+
+### ES6 Destructuring Variables from Objects
+
+```javascript
+// Consider the following ES5 code
+var voxel = { x: 3.6, y: 7.4, z: 6.54 };
+var x = voxel.x; // x = 3.6
+var y = voxel.y; // y = 7.4
+var z = voxel.z; // z = 6.54
+
+// the same assignment statement with ES6 destructuring syntax
+const { x, y, z } = voxel; // x = 3.6, y = 7.4, z = 6.54
+
+// to store the values of voxel.x into a, voxel.y into b, and voxel.z into c, you have that freedom as well
+const { x: a, y: b, z: c } = voxel; // a = 3.6, b = 7.4, c = 6.54
+
+// Destructuring Variables from Nested Objects
+const a = {
+  start: { x: 5, y: 6 },
+  end: { x: 6, y: -9 }
+};
+
+const {
+  start: { x: startX, y: startY }
+} = a;
+
+console.log(startX, startY); // 5, 6
+```
+
+### ES6 Destructuring to Pass an Object as a Function's Parameters
+
+```javascript
+// destructure the object in a function argument itself.
+const profileUpdate = profileData => {
+  const { name, age, nationality, location } = profileData;
+  // do something with these variables
+};
+
+// this can also be done in-place:
+const profileUpdate = ({ name, age, nationality, location }) => {
+  /* do something with these fields */
+};
+```
+
+### ES6 Object Literal Declarations Using Simple Fields
+
+```javascript
+const getMousePosition = (x, y) => ({
+  x: x,
+  y: y
+});
+
+// the same function rewritten to use this new syntax:
+const getMousePosition = (x, y) => ({ x, y });
+```
+
+## Booleans
+
+Booleans may only be one of two values: true or false. They are basically little on-off switches,
+where true is "on" and false is "off". These two states are mutually exclusive.
+
+```javascript
+true;
+false;
+```
+
+## If Else Statements
+
+```javascript
+if (condition is true) {
+  statement is executed
+}
+```
+
+### Else Statement
+
+```javascript
+if (num > 10) {
+  return "Bigger than 10";
+} else {
+  return "10 or Less";
+}
+```
+
+### Else if statement
+
+```javascript
+if (num > 15) {
+  return "Bigger than 15";
+} else if (num < 5) {
+  return "Smaller than 5";
+} else {
+  return "Between 5 and 15";
+}
+```
+
+### Conditional (Ternary) Operator
+
+```javascript
+// this if statement...
+function findGreater(a, b) {
+  if (a > b) {
+    return "a is greater";
+  } else {
+    return "b is greater";
+  }
+}
+
+// is equivalent to this ternary operator
+function findGreater(a, b) {
+  return a > b ? "a is greater" : "b is greater";
+}
+```
+
+### Multiple Conditional (Ternary) Operators
+
+```javascript
+// this if statement...
+function findGreaterOrEqual(a, b) {
+  if (a === b) {
+    return "a and b are equal";
+  } else if (a > b) {
+    return "a is greater";
+  } else {
+    return "b is greater";
+  }
+}
+
+// is equivalent to this ternary operator
+function findGreaterOrEqual(a, b) {
+  return a === b
+    ? "a and b are equal"
+    : a > b
+    ? "a is greater"
+    : "b is greater";
+}
+```
+
+## Switch Statement
+
+```javascript
+switch(num) {
+  case value1:
+    statement1;
+    break;
+  case value2:
+    statement2;
+    break;
+...
+  case valueN:
+    statementN;
+    break;
+}
+```
+
+### Default Switch Statement
+
+```javascript
+switch (num) {
+  case value1:
+    statement1;
+    break;
+  case value2:
+    statement2;
+    break;
+...
+  default:
+    defaultStatement;
+    break;
+}
+```
+
+### Multiple Options with Switch Statement
+
+```javascript
+switch (val) {
+  case 1:
+  case 2:
+  case 3:
+    result = "1, 2, or 3";
+    break;
+  case 4:
+    result = "4 alone";
+}
+```
+
+## Comparison Operators
+
+| Operator | Meaning               |
+| -------- | --------------------- |
+| `==`     | Equality              |
+| `===`    | Strict Equality       |
+| `!=`     | Inequality            |
+| `!==`    | Strict Inequality     |
+| `>`      | Greater Than          |
+| `>=`     | Greater or Equal Than |
+| `<`      | Less Than             |
+| `<=`     | Less or Equal Than    |
+| `&&`     | And                   |
+| `||`     | Or                    |
+
+## While Loops
+
+```javascript
+var ourArray = [];
+var i = 0;
+while (i < 5) {
+  ourArray.push(i);
+  i++;
+}
+```
+
+### Do...While Loops
+
+```javascript
+var ourArray = [];
+var i = 0;
+do {
+  ourArray.push(i);
+  i++;
+} while (i < 5);
+```
+
+## For Loops
+
+```javascript
+var ourArray = [];
+var i = 0;
+while (i < 5) {
+  ourArray.push(i);
+  i++;
+}
+
+// Count Backwards With a For Loop
+var ourArray = [];
+for (var i = 10; i > 0; i -= 2) {
+  ourArray.push(i);
+}
+
+// Iterate Through an Array
+var arr = [10, 9, 8, 7, 6];
+for (var i = 0; i < arr.length; i++) {
+  console.log(arr[i]);
+}
+
+// Nested for loops
+var arr = [[1, 2], [3, 4], [5, 6]];
+for (var i = 0; i < arr.length; i++) {
+  for (var j = 0; j < arr[i].length; j++) {
+    console.log(arr[i][j]);
+  }
+}
+```
+
+### ES6 for-of
+
+```javascript
+for (let value of myArray) {
+  console.log(value);
+}
+```
+
+## Functions
+
+```javascript
+function functionName() {
+  console.log("Hello World");
+}
+
+functionName(); // call the function
+```
+
+### Function Arguments
+
+```javascript
+function ourFunctionWithArgs(a, b) {
+  console.log(a - b);
+}
+ourFunctionWithArgs(10, 5); // 5
+```
+
+### Return Statement
+
+```javascript
+function plusThree(num) {
+  return num + 3;
+}
+var answer = plusThree(5); // 8
+```
+
+### Immediately Invoked Function Expression or IIFE
+
+```javascript
+(function () {
+  console.log("A cozy nest is ready");
+})()
+```
+
+### ES6 Arrow Functions
+
+```javascript
+const myFunc = function() {
+  const myVar = "value";
+  return myVar;
+};
+
+// can be rewritten like this
+const myFunc = () => {
+  const myVar = "value";
+  return myVar;
+};
+
+// and if there is no function body, and only a return value
+const myFunc = () => "value";
+
+// to pass parameters to an arrow function
+const doubler = item => item * 2;
+```
+
+### ES6 Higher Order Arrow Functions
+
+```javascript
+FBPosts.filter(function(post) {
+  return post.thumbnail !== null && post.shares > 100 && post.likes > 500;
+});
+
+// the previous function can be rewritten like this
+FBPosts.filter(
+  post => post.thumbnail !== null && post.shares > 100 && post.likes > 500
+);
+```
+
+### ES6 Rest Operator with Function Parameters
+
+With the rest operator, you can create functions that take a variable number of arguments. These arguments are stored in an array that can be accessed later from inside the function.
+
+```javascript
+function howMany(...args) {
+  return "You have passed " + args.length + " arguments.";
+}
+console.log(howMany(0, 1, 2)); // You have passed 3 arguments
+console.log(howMany("string", null, [1, 2, 3], {})); // You have passed 4 arguments.
+```
+
+### ES6 Declarative Functions within Objects
+
+```javascript
+// When defining functions within objects in ES5, we have to use the keyword function
+const person = {
+  name: "Taylor",
+  sayHello: function() {
+    return `Hello! My name is ${this.name}.`;
+  }
+};
+
+// With ES6, You can remove the function keyword and colon
+const person = {
+  name: "Taylor",
+  sayHello() {
+    return `Hello! My name is ${this.name}.`;
+  }
+};
+```
+
+## Regular Expressions
+
+| Character  | Description                                                                                        |
+| ---------- | -------------------------------------------------------------------------------------------------- |
+| `\`        | Escapes a special character.                                                                       |
+| `|`        | Search for multiple patterns. To match "yes" or "no", the regex is `/yes | no/`.                   |
+| `i`        | This flag is used to ignore upper and lowercase. `/ignorecase/i`.                                  |
+| `g`        | Search or extract a pattern more than once.                                                        |
+| `.`        | The wildcard character `.` will match any character except new lines.                              |
+| `[]`       | Allow you to define the characters to match. `/b[au]g/` will match "bag", "bug" but not "bog".     |
+| `[a-z]`    | Match all the characters between a and z.                                                          |
+| `[1-9]`    | Match all the numbers between 1 and 9.                                                             |
+| `[a-z1-9]` | Match all the character between a and z, and the numbers between 1 and 9.                          |
+| `[^]`      | Match the characters not in the set. `[^a-e]` match all other characters except A, B, C, D, and E. |
+| `+`        | Match 1 or more occurrences of the previous character in a row.                                    |
+| `*`        | Match 0 or more occurrences of the previous character.                                             |
+| `?`        | Match 0 or 1 occurrence of the previous character. Useful for Lazy matching.                       |
+| `^`        | Search for patterns at the beginning of strings.                                                   |
+| `$`        | Search for patterns at the end of a string.                                                        |
+| `\w`       | Equal to `[A-Za-z0-9_]`. Matches upper, lowercase, numbers the and underscore character (-).       |
+| `\W`       | Matches any nonword character. Equivalent to `[^a-za-z0-9_]`.                                      |
+| `\d`       | Equal to `[0-9]`. Match one digit.                                                                 |
+| `\D`       | Equal to `[^0-9]`. Match one non digit.                                                            |
+| `\s`       | Match a whitespace.                                                                                |
+| `\S`       | Match everything except whitespace.                                                                |
+| `a{2,5}`   | Match the letter `a` between 3 and 5 times.                                                        |
+| `a{2,}`    | Specify only the lower number of matches.                                                          |
+| `a{5}`     | Specify the exact number of matches.                                                               |
+| `(...)`    | Specify a group that can be acceded with number (from 1)                                           |
+
+### Regex Methods
+
+| Method      | Description                                                 |
+| ----------- | ----------------------------------------------------------- |
+| `test()`    | Returns true or false if the pattern match a string or not. |
+| `match()`   | Extract the actual matches found.                           |
+| `replace()` | Search and replace text in a string .                       |
+
+### Examples
+
+```javascript
+// test method returns true or false if the pattern match a string or not
+let myString = "Hello, World!";
+let myRegex = /Hello/;
+let result = myRegex.test(myString);
+
+// extract the matches of a regex with the match method
+let extractStr = "Extract the word 'coding' from this string.";
+let codingRegex = /coding/;
+let result = extractStr.match(codingRegex);
+
+// Search and replace
+let wrongText = "The sky is silver.";
+let silverRegex = /silver/;
+wrongText.replace(silverRegex, "blue"); // Returns "The sky is blue."
+
+// search for multiple patterns using the alternation or OR operator: |
+let petString = "James has a pet cat.";
+let petRegex = /dog|cat|bird|fish/;
+let result = petRegex.test(petString);
+
+// ignore upper or lowercase
+let myString = "freeCodeCamp";
+let fccRegex = /freeCodeCamp/i; // flag i
+let result = fccRegex.test(myString);
+
+// Search or extract a pattern more than once
+let twinkleStar = "Twinkle, twinkle, little star";
+let starRegex = /Twinkle/gi; // a regex can have multiple flags
+let result = twinkleStar.match(starRegex);
+
+// The wildcard character . will match any character except new lines.
+let exampleStr = "Let's have fun with regular expressions!";
+let unRegex = /.un/;
+let result = unRegex.test(exampleStr);
+
+// define the characters to match, in this example all the vowels in quoteSample
+let quoteSample =
+  "Beware of bugs in the above code; I have only proved it correct, not tried it.";
+let vowelRegex = /[aeiou]/gi;
+let result = quoteSample.match(vowelRegex);
+
+// Match all the characters in quoteSample (between a and z)
+let quoteSample = "The quick brown fox jumps over the lazy dog.";
+let alphabetRegex = /[a-z]/gi;
+let result = quoteSample.match(alphabetRegex);
+
+// Match all the character between two characters and numbers
+let quoteSample = "Blueberry 3.141592653s are delicious.";
+let myRegex = /[h-s2-6]/gi;
+let result = quoteSample.match(myRegex);
+
+// Match all that is not a number or a vowel
+let quoteSample = "3 blind mice.";
+let myRegex = /[^aeiou0-9]/gi;
+let result = quoteSample.match(myRegex);
+
+// Match 1 or more occurrences of the previous character (* for 0 or more)
+let difficultSpelling = "Mississippi";
+let myRegex = /s+/g;
+let result = difficultSpelling.match(myRegex);
+
+// ? Match 0 or 1 occurrence of the previous character. Useful for Lazy matching
+let text = "titanic";
+let myRegex = /t[a-z]*?i/;
+let result = text.match(myRegex);
+
+// Search for patterns at the beginning of strings
+let rickyAndCal = "Cal and Ricky both like racing.";
+let calRegex = /^Cal/;
+let result = calRegex.test(rickyAndCal);
+
+// Search for patterns at the end of a string
+let caboose = "The last car on a train is the caboose";
+let lastRegex = /caboose$/;
+let result = lastRegex.test(caboose);
+
+// \w is equal to [A-Za-z0-9_]
+let quoteSample = "The five boxing wizards jump quickly.";
+let alphabetRegexV2 = /\w/g;
+let result = quoteSample.match(alphabetRegexV2).length;
+
+// Match only 3 to 6 letter h's in the word "Oh no"
+let ohStr = "Ohhh no";
+let ohRegex = /Oh{3,6} no/;
+let result = ohRegex.test(ohStr);
+
+// Match both the American English (favorite) and the British English (favourite) version of the word
+let favWord = "favorite";
+let favRegex = /favou?rite/;
+let result = favRegex.test(favWord);
+
+// Groups () let you reuse patterns
+let repeatNum = "42 42 42";
+let reRegex =  /^(\d+)\s\1\s\1$/; // every 1 represent the group (\d+)
+let result = reRegex.test(repeatNum);
+
+// Remove all the spaces at the beginning an end of a string
+let hello = "   Hello, World!  ";
+let wsRegex = /^\s+(.*\S)\s+$/;
+let result = hello.replace(wsRegex, '$1'); // returns 'Hello, World!'
+```
+
+## Object Oriented Programming
+
+```javascript
+let duck = {
+  name: "Aflac",
+  numLegs: 2,
+  sayName: function() {return "The name of this duck is " + this.name + ".";}
+};
+
+duck.sayName(); // Returns "The name of this duck is Aflac."
+```
+
+### Constructors and New Objects
+
+Constructors follow a few conventions:
+
+- Constructors are defined with a capitalized name to distinguish them from other functions that are not constructors.
+- Constructors use the keyword this to set properties of the object they will create. Inside the constructor, this refers to the new object it will create.
+- Constructors define properties and behaviors instead of returning a value as other functions might.
+
+```javascript
+// constructor
+function Bird(name, color) {
+  this.name = name;
+  this.color = color;
+}
+
+// create a new instance of Bird
+let cardinal = new Bird("Bruce", "red");
+let duck = new Bird("Donald", "blue");
+
+// access and modify blueBird object
+cardinal.name // Bruce
+cardinal.color // red
+cardinal.color = green;
+cardinal.color // green
+
+// check if an object is an instance of a constructor
+cardinal instanceof Bird; // true
+crow instanceof Bird; // false
+
+// check an objects own (name, color, numLegs) properties
+cardinal.hasOwnProperty('color') // true
+cardinal.hasOwnProperty('age') // false
+
+//check an objects properties with the constructor property
+cardinal.constructor === Bird; // true
+
+// use constructor.prototype to add new properties to object constructors
+Bird.prototype.cute = true;
+cardinal.cute // true
+crow.cute // true
+
+// add more than one property and method to a constructor
+Bird.prototype = {
+  constructor: Bird, // specify the constructor
+  numLegs: 2, // new property
+
+  eat: function() { // new method
+    console.log("nom nom nom");
+  },
+
+  describe: function() { // new method
+    console.log("My name is " + this.name);
+  }
+};
+
+let chicken = new Bird("Dinner", "brown");
+chicken.numLegs // 2
+chicken.eat() // nom nom nom
+chicken.describe() // My name is Dinner
+```
+
+### Inheritance
+
+```javascript
+function Animal() { }
+
+Animal.prototype = {
+  constructor: Animal,
+  eat: function() {
+    console.log("nom nom nom");
+  }
+};
+
+function Cat(name) {
+  this.name = name;
+}
+
+// make the Cat constructor inherit the eat function from Animal
+Cat.prototype = Object.create(Animal.prototype);
+
+let myCat = new Cat('charles');
+myCat.eat() // nom nom nom
+```
+
+Add methods after Inheritance and override them
+
+```javascript
+function Animal() { }
+Animal.prototype.eat = function() { console.log("nom nom nom"); };
+
+// Dog constructor
+function Dog() { }
+
+// make the Gog constructor inherit the eat function from Animal
+Dog.prototype = Object.create(Animal.prototype);
+Dog.prototype.constructor = Dog;
+
+Dog.prototype.bark = function() {
+  console.log("wof wof!");
+};
+
+// the new object will have both, the inherited eat() and its own bark() method
+let beagle = new Dog();
+beagle.eat(); // "nom nom nom"
+beagle.bark(); // "Woof!"
+
+// override an inherited method
+Dog.prototype.eat = function() {
+  return "nice meeeeat!";
+};
+
+let doberman = new Dog();
+doberman.eat() // nice meeeeat!
+```
+
+### Mixins
+
+A mixin allows unrelated objects to use a collection of functions.
+
+```javascript
+let bird = {
+    name: "Donald",
+    numLegs: 2
+  };
+
+let boat = {
+    name: "Warrior",
+  type: "race-boat"
+};
+
+// this mixin contain the glide method
+const glideMixin = function(obj) {
+    obj.glide = function() {
+        console.log("gliding...");
+    }
+}
+
+// the object is passed to the mixin and the glide method is assigned
+glideMixin(bird);
+glideMixin(boat);
+
+bird.glide(); // "gliding..."
+boat.glide(); // "gliding..."
+```
+
+### Closures to Protect Properties
+
+In JavaScript, a function always has access to the context in which it was created. This is called closure. Now, the property can only be accessed and changed by methods also within the constructor function. In JavaScript, this is called closure.
+
+```javascript
+function Bird() {
+  // instead of this.hatchedEgg...
+  let hatchedEgg = 10; // private property
+
+  this.getHatchedEggCount = function () { // publicly available method that a bird object can use
+    return hatchedEgg;
+  };
+}
+
+let ducky = new Bird();
+ducky.hatchedEgg = 2; // nothing happens
+ducky.getHatchedEggCount; // 10
+```
+
+### Modules
+
+An immediately invoked function expression (IIFE) is often used to group related functionality into a single object or module.
+
+```javascript
+let funModule = (function () {
+  return {
+    isCuteMixin: function (obj) {
+      obj.isCute = function () {
+        return true;
+      };
+    },
+
+    singMixin: function (obj) {
+      obj.sing = function () {
+        console.log("Singing to an awesome tune");
+      };
+    }
+  }
+})()
+
+function Dog() { }
+let goodBoy = new Dog;
+
+// assign the singMixin method to the goodBoy object
+funModule.singMixin(goodBoy);
+goodBoy.sing() // Singing to an awesome tune
+```
+
+## ES6 Object Oriented Programming
+
+ES6 provides a new syntax to help create objects, the keyword `class`.The class syntax
+is just a syntax, and not a full-fledged class based implementation of object oriented paradigm,
+unlike in languages like Java, or Python, or Ruby etc.
+
+### ES6 Classes
+
+```javascript
+class Book {
+  constructor(title, author, year) {
+    this.title = title;
+    this.author = author;
+    this.year = year;
+  }
+
+  getSummary() {
+    return `${this.title} was written by ${this.author} in ${this.year}`
+  }
+
+  getAge() {
+    const years = new Date().getFullYear() - this.year;
+    return `${this.title} is ${years} years old`
+  }
+}
+
+book = new Book('Book One', 'John Doe', 2016);
+book.getSummary(); // Book One was written by John Doe in 2016 
+book.getAge(); // Book One is 3 years old
+```
+
+### ES6 getters and setters
+
+```javascript
+class Book {
+  constructor(author) {
+    this._author = author;
+  }
+  // getter
+  get writer() {
+    return this._author;
+  }
+  // setter
+  set writer(updatedAuthor) {
+    this._author = updatedAuthor;
+  }
+}
+const lol = new Book("anonymous");
+console.log(lol.writer); // anonymous
+lol.writer = "wut";
+console.log(lol.writer); // wut
+```
+
+### ES6 Statics Methods
+
+Static methods allow using methods without instantiating an object
+
+```javascript
+class Book {
+  constructor(title, author, year) {
+    this.title = title;
+    this.author = author;
+    this.year = year;
+  }
+
+  static sayHi() {
+    return "Hi!"
+  }
+}
+
+Book.sayHi(); // Hi!
+```
+
+### ES6 Inheritance
+
+```javascript
+class Book {
+  constructor(title, author, year) {
+    this.title = title;
+    this.author = author;
+    this.year = year;
+  }
+
+  getSummary() {
+    return `${this.title} was written by ${this.author} in ${this.year}`
+  }
+}
+
+class Magazine extends Book {
+  constructor(title, author, year, month) {
+    super(title, author, year)
+    this.month = month;
+  }
+
+  sayHi() {
+    return "Hi!"
+  }
+}
+
+mag = new Magazine('Mag', 'People', 2019, 'jan');
+mag.getSummary(); // Mag was written by People in 2019 
+mag.sayHi(); // Hi!
+```
+
+## Functional Programming
+
+### Map
+
+```javascript
+var watchList = [{
+    "Title": "Inception",
+    "imdbRating": "8.8",
+    "Type": "movie",
+  },
+  {
+    "Title": "Interstellar",
+    "imdbRating": "8.6",
+    "Type": "movie",
+  },
+  {
+    "Title": "The Dark Knight",
+    "imdbRating": "9.0",
+    "Type": "movie",
+  },
+  {
+    "Title": "Batman Begins",
+    "imdbRating": "7.9",
+    "Type": "movie",
+  }
+];
+
+const rating = watchList.map(function (movie) {
+  return {title: movie.Title, rating: movie.imdbRating}
+});
+/* [ { title: 'Inception', rating: '8.8' }, 
+  { title: 'Interstellar', rating: '8.6' }, 
+  { title: 'The Dark Knight', rating: '9.0' }, 
+  { title: 'Batman Begins', rating: '7.9' } ]  */
+
+// or...
+const rating = watchList.map(movie => ({
+    title: movie.Title,
+    rating: movie.imdbRating
+}));
+/* [ { title: 'Inception', rating: '8.8' }, 
+  { title: 'Interstellar', rating: '8.6' }, 
+  { title: 'The Dark Knight', rating: '9.0' }, 
+  { title: 'Batman Begins', rating: '7.9' } ]  */
+```
+
+## ES6 import and export
+
+> The lessons in this section handle non-browser features. import won't work on a browser directly.
+> However, we can use various tools to create code out of this to make it work in browser.
+
+### import
+
+```javascript
+// we can choose which parts of a module or file to load into a given file.
+import { function } from "file_path"
+// We can also import variables the same way!
+
+// Import Everything from a File
+import * as name_of_your_choice from "file_path"
+
+```
+
+### export
+
+In order for `import` to work, though, we must first `export` the functions or variables we need.
+Like import, export is a non-browser feature.
+
+```javascript
+const capitalizeString = (string) => {
+  return string.charAt(0).toUpperCase() + string.slice(1);
+}
+export { capitalizeString } //How to export functions.
+export const foo = "bar"; //How to export variables.
+
+// Alternatively, if you would like to compact all your export statements into one line, you can take this approach
+const capitalizeString = (string) => {
+  return string.charAt(0).toUpperCase() + string.slice(1);
+}
+const foo = "bar";
+export { capitalizeString, foo }
+
+// use export default if only one value is being exported from a file.
+// It is also used to create a fallback value for a file or module
+export default function add(x,y) {
+  return x + y;
+}
+// and to import
+import add from "math_functions";
+add(5,4); //Will return 9
+```

+ 50 - 0
docs/lang/PHP.md

@@ -0,0 +1,50 @@
+
+
+* [https://www.php.net/manual/en/](https://www.php.net/manual/en/)
+* [https://www.php.net/manual/en/langref.php](https://www.php.net/manual/en/langref.php)
+* [https://www.php.net/manual/en/funcref.php](https://www.php.net/manual/en/funcref.php)
+
+---
+January 2020 Notes:  
+PHP 7.4.2 (cli) (built: Jan 22 2020 06:30:58) ( NTS )  
+[Migrating from PHP 7.3.x to PHP 7.4.x](https://www.php.net/manual/en/migration74.php)  
+[PHP 7.4 Release Notes](https://www.php.net/releases/7_4_0.php)  
+
+[Homebrew moved PHP to core and extensions are now through pecl](https://grrr.tech/posts/installing-homebrew-php-extensions-with-pecl/)  
+```
+david@macs:~ » php --ini  
+Configuration File (php.ini) Path: /usr/local/etc/php/7.4  
+Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini  
+extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/imagick.so  
+extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/mcrypt.so  
+extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/redis.so  
+zend_extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/xdebug.so  
+
+LoadModule deflate_module libexec/apache2/mod_deflate.so  
+LoadModule expires_module libexec/apache2/mod_expires.so  
+LoadModule rewrite_module libexec/apache2/mod_rewrite.so  
+
+david@macs:~ » pecl list  
+imagick 3.4.4   stable  
+mcrypt  1.0.3   stable  
+redis   5.1.1   stable  
+xdebug  2.9.1   stable  
+```
+
+September 2019 Notes - PHP 7.3.9 (cli) (built: Sep 14 2019 18:07:55) ( NTS )   
+[PHP 7.3 Changelog](https://www.php.net/ChangeLog-7.php#7.3.0)  
+[Migrating to 7.3](https://www.php.net/manual/en/migration73.php)  
+Configuration File (php.ini) Path: /usr/local/etc/php/7.3  
+Loaded Configuration File:         /usr/local/etc/php/7.3/php.ini  
+Scan for additional .ini files in: /usr/local/etc/php/7.3/conf.d  
+Additional .ini files parsed:      /usr/local/etc/php/7.3/conf.d/ext-opcache.ini,
+/usr/local/etc/php/7.3/conf.d/imagick.ini,
+/usr/local/etc/php/7.3/conf.d/mcrypt.ini  
+
+[Homebrew](/localhost/brew.md) notes:  
+had to remove PECL symlink in /usr/local/Cellar/php/7.3.9_1  
+had to specify paths of imagick and mcrypt:  
+;imagick extension="/usr/local/Cellar/php/7.3.9_1/pecl/20180731/imagick.so"  
+;mcrypt extension="/usr/local/Cellar/php/7.3.9_1/pecl/20180731/mcrypt.so"  
+
+---

+ 12 - 0
docs/lang/Python.md

@@ -0,0 +1,12 @@
+
+
+* [https://www.python.org/doc/](https://www.python.org/doc/)
+* [https://devguide.python.org/](https://devguide.python.org/)
+
+```
+#### notes ####
+
+///
+```
+
+* [cheatsheet](https://github.com/gto76/python-cheatsheet)

+ 452 - 0
docs/lang/Ruby.md

@@ -0,0 +1,452 @@
+
+
+January 2020:  
+* [Ruby 2.7.0 Release Notes](https://www.ruby-lang.org/en/news/2019/12/25/ruby-2-7-0-released/)  
+
+#### Ruby (cheatsheet)
+ * for Rails see [rails/](/docs/waf/rails)
+
+##### Table of Contents
+
+[Basics](#basics)  
+[Vars, Constants, Arrays, Hashes & Symbols](#vars-constants-arrays-hashes--symbols)  
+[Methods](#methods)
+[Classes](#classes)
+[Modules](#modules)
+[Blocks & Procs](#blocks--procs)  
+[Lambdas](#lambdas)
+[Calculation](#calculation)  
+[Comment](#comment)  
+[Conditions](#conditions)  
+[Printing & Putting](#printing--putting)  
+[User Input](#user-input)  
+[Loops](#loops)
+[Sorting & Comparing](#sorting--comparing)  
+[Usefull Methods](#usefull-methods)
+
+## Basics
+
+- `$ irb`: to write ruby in the terminal
+- don't use `'` in ruby, use `"` instead
+- you can replace most `{}` with `do end` and vice versa –– not true for hashes or `#{}` escapings
+- Best Practice: end names that produce booleans with question mark
+- CRUD: create, read, update, delete
+- `[1,2].map(&:to_i)`
+- `integer`: number without decimal
+- `float`: number with decimal
+- tag your variables:
+- - `$`: global variable
+- - `@`: instance variable
+- - `@@`: class variable
+- `1_000_000`: 1000000 –– just easier to read\*
+
+## Vars, Contants, Arrays, Hashes & Symbols
+
+```Ruby
+my_variable = “Hello”
+my_variable.capitalize! # ! changes the value of the var same as my_name = my_name.capitalize
+my_variable ||= "Hi" # ||= is a conditional assignment only set the variable if it was not set before.
+```
+
+### Constants
+
+```Ruby
+MY_CONSTANT = # something
+```
+
+### Arrays
+
+```Ruby
+my_array = [a,b,c,d,e]
+my_array[1] –– b
+my_array[2..-1] # c , d , e
+multi_d = [[0,1],[0,1]]
+[1, 2, 3] << 4 # [1, 2, 3, 4] same as [1, 2, 3].push(4)
+```
+
+### Hashes
+
+```Ruby
+hash = { "key1" => "value1", "key2" => "value2" } # same as objects in JavaScript
+hash = { key1: "value1", key2: "value2" } # the same hash using symbols instead of strings
+my_hash = Hash.new # same as my_hash = {} – set a new key like so: pets["Stevie"] = "cat"
+pets["key1"] # value1
+pets["Stevie"] # cat
+my_hash = Hash.new("default value")
+hash.select{ |key, value| value > 3 } # selects all keys in hash that have a value greater than 3
+hash.each_key { |k| print k, " " } # ==> key1 key2
+hash.each_value { |v| print v } # ==> value1value2
+
+my_hash.each_value { |v| print v, " " }
+# ==> 1 2 3
+```
+
+### Symbols
+
+```Ruby
+:symbol # symbol is like an ID in html. :Symbols != "Strings"
+# Symbols are often used as Hash keys or referencing method names.
+# They can not be changed once created. They save memory (only one copy at a given time). Faster.
+:test.to_s # converts to "test"
+"test".to_sym # converts to :test
+"test".intern # :test
+# Symbols can be used like this as well:
+my_hash = { key: "value", key2: "value" } # is equal to { :key => "value", :key2 => "value" }
+```
+
+#### Functions to create Arrays
+
+```Ruby
+"bla,bla".split(“,”) # takes sting and returns an array (here  ["bla","bla"])
+```
+
+## Methods
+
+**Methods**
+
+```Ruby
+def greeting(hello, *names) # *name is a splat argument, takes several parameters passed in an array
+  return "#{hello}, #{names}"
+end
+
+start = greeting("Hi", "Justin", "Maria", "Herbert") # call a method by name
+
+def name(variable=default)
+  ### The last line in here get's returned by default
+end
+```
+
+## Classes
+
+_custom objects_
+
+```Ruby
+class ClassName # class names are rather written in PascalCase (It is similar to camelcase, but the first letter is capitalized)
+  @@count = 0
+  attr_reader :name # make it readable
+  attr_writer :name # make it writable
+  attr_accessor :name # makes it readable and writable
+
+  def Methodname(parameter)
+    @classVariable = parameter
+    @@count += 1
+  end
+
+  def self.show_classVariable
+    @classVariable
+  end
+
+  def Person.get_counts # is a class method
+    return @@count
+  end
+
+  private
+
+  def private_method; end # Private methods go here
+end
+
+matz = Person.new("Yukihiro")
+matz.show_name # Yukihiro
+```
+
+### inheritance
+
+```Ruby
+class DerivedClass < BaseClass; end # if you want to end a Ruby statement without going to a new line, you can just type a semicolon.
+
+class DerivedClass < Base
+  def some_method
+    super(optional args) # When you call super from inside a method, that tells Ruby to look in the superclass of the current class and find a method with the same name as the one from which super is called. If it finds it, Ruby will use the superclass' version of the method.
+      # Some stuff
+    end
+  end
+end
+
+# Any given Ruby class can have only one superclass. Use mixins if you want to incorporate data or behavior from several classes into a single class.
+```
+
+## Modules
+
+```Ruby
+module ModuleName # module names are rather written in PascalCase
+  # variables in modules doesn't make much sence since modules do not change. Use constants.
+end
+
+Math::PI # using PI constant from Math module. Double colon = scope resolution operator = tells Ruby where you're looking for a specific bit of code.
+
+require 'date' # to use external modules.
+puts Date.today # 2016-03-18
+
+module Action
+  def jump
+    @distance = rand(4) + 2
+    puts "I jumped forward #{@distance} feet!"
+  end
+end
+
+class Rabbit
+  include Action # Any class that includes a certain module can use those module's methods! This now is called a Mixin.
+  extend Action # extend keyword mixes a module's methods at the class level. This means that class itself can use the methods, as opposed to instances of the class.
+  attr_reader :name
+  def initialize(name)
+    @name = name
+  end
+end
+
+peter = Rabbit.new("Peter")
+peter.jump # include
+Rabbit.jump # extend
+```
+
+## Blocks & Procs
+
+### Code Blocks
+
+_Blocks are not objects_ A block is just a bit of code between do..end or {}. It's not an object on its own, but it can be passed to methods like .each or .select.
+
+```Ruby
+def yield_name(name)
+  yield("Kim") # print "My name is Kim. "
+  yield(name) # print "My name is Eric. "
+end
+
+yield_name("Eric") { |n| print "My name is #{n}. " } # My name is Kim. My name is Eric.
+yield_name("Peter") { |n| print "My name is #{n}. " } # My name is Kim. My name is Eric. My name is Kim. My name is Peter.
+```
+
+### Proc
+
+_saves blocks and are objects_ A proc is a saved block we can use over and over.
+
+```Ruby
+cube = Proc.new { |x| x ** 3 }
+[1, 2, 3].collect!(&cube) # [1, 8, 27] # the & is needed to transform the Proc to a block.
+cube.call # call procs directly
+```
+
+## Lambdas
+
+```Ruby
+lambda { |param| block }
+multiply = lambda { |x| x * 3 }
+y = [1, 2].collect(&multiply) # 3 , 6
+```
+
+Diff between blocs and lambdas:
+
+- a lambda checks the number of arguments passed to it, while a proc does not (This means that a lambda will throw an error if you pass it the wrong number of arguments, whereas a proc will ignore unexpected arguments and assign nil to any that are missing.)
+- when a lambda returns, it passes control back to the calling method; when a proc returns, it does so immediately, without going back to the calling method.
+  So: A lambda is just like a proc, only it cares about the number of arguments it gets and it returns to its calling method rather than returning immediately.
+
+## Calculation
+
+- Addition (+)
+- Subtraction (-)
+- Multiplication (\*)
+- Division (/)
+- Exponentiation (\*\*)
+- Modulo (%)
+- The concatenation operator (<<)
+- you can do 1 += 1 –– which gives you 2 but 1++ and 1-- does not exist in ruby
+- `"A " << "B"` => `"A B"` but `"A " + "B"` would work as well but `"A " + 4 + " B"` not. So rather use string interpolation (`#{4}`)
+- `"A #{4} B"` => `"A 4 B"`
+
+## Comment
+
+```Ruby
+=begin
+Bla
+Multyline comment
+=end
+```
+
+```Ruby
+# single line comment
+```
+
+## Conditions
+
+### IF
+
+```Ruby
+if 1 < 2
+puts “one smaller than two”
+elsif 1 > 2 # *careful not to mistake with else if. In ruby you write elsif*
+puts “elsif”
+else
+puts “false”
+end
+# or
+puts "be printed" if true
+puts 3 > 4 ? "if true" : "else" # else will be putted
+```
+
+### unless
+
+```Ruby
+unless false # unless checks if the statement is false (opposite to if).
+puts “I’m here”
+else
+puts “not here”
+end
+# or
+puts "not printed" unless true
+```
+
+### case
+
+```Ruby
+case my_var
+  when "some value"
+    ###
+  when "some other value"
+    ###
+  else
+    ###
+end
+# or
+case my_var
+  when "some value" then ###
+  when "some other value" then ###
+  else ###
+end
+```
+
+- `&&`: and
+- `||`: or
+- `!`: not
+- `(x && (y || w)) && z`: use parenthesis to combine arguments
+- problem = false
+- print "Good to go!" unless problem –– prints out because problem != true
+
+## Printing & Putting
+
+```Ruby
+print "bla"
+puts "test" # puts the text in a separate line
+```
+
+## String Methods
+
+```Ruby
+"Hello".length # 5
+"Hello".reverse # “olleH”
+"Hello".upcase # “HELLO”
+"Hello".downcase # “hello”
+"hello".capitalize # “Hello”
+"Hello".include? "i" # equals to false because there is no i in Hello
+"Hello".gsub!(/e/, "o") # Hollo
+"1".to_i # transform string to integer –– 1
+"test".to_sym # converts to :test
+"test".intern # :test
+:test.to_s # converts to "test"
+```
+
+## User Input
+
+```Ruby
+gets # is the Ruby equivalent to prompt in javascript (method that gets input from the user)
+gets.chomp # removes extra line created after gets (usually used like this)
+```
+
+## Loops
+
+### While loop:
+
+```Ruby
+i = 1
+while i < 11
+  puts i
+  i = i + 1
+end
+```
+
+### Until loop:
+
+```Ruby
+i = 0
+until i == 6
+  puts i
+  i += 1
+end
+```
+
+### For loop
+
+```Ruby
+for i in 1...10 # ... tells ruby to exclude the last number (here 10 if we .. only then it includes the last num)
+  puts i
+end
+```
+
+### Loop iterator
+
+```Ruby
+i = 0
+loop do
+  i += 1
+  print "I'm currently number #{i}” # a way to have ruby code in a string
+  break if i > 5
+end
+```
+
+### Next
+
+```Ruby
+for i in 1..5
+  next if i % 2 == 0 # If the remainder of i / 2 is zero, we go to the next iteration of the loop.
+  print i
+end
+```
+
+### .each
+
+```Ruby
+things.each do |item| # for each things in things do something while storing that things in the variable item
+  print “#{item}"
+end
+```
+
+on hashes like so:
+
+```Ruby
+hashes.each do |x,y|
+  print "#{x}: #{y}"
+end
+```
+
+### .times
+
+```Ruby
+10.times do
+  print “this text will appear 10 times”
+end
+```
+
+### .upto / .downto
+
+```Ruby
+10.upto(15) { |x| print x, " " } # 10 11 12 13 14 15
+"a".upto("c") { |x| print x, " " } # a b c
+```
+
+## Sorting & Comparing
+
+```Ruby
+array = [5,4,1,3,2]
+array.sort! # = [1,2,3,4,5] – works with text and other as well.
+"b" <=> "a" # = 1 – combined comparison operator. Returns 0 if first = second, 1 if first > second, -1 if first < second
+array.sort! { |a, b| b <=> a } # to sort from Z to A instead of A to Z
+```
+
+## Usefull Methods
+
+```Ruby
+1.is_a? Integer # returns true
+:1.is_a? Symbol # returns true
+"1".is_a? String # returns true
+[1,2,3].collect!() # does something to every element (overwrites original with ! mark)
+.map() # is the same as .collect
+1.2.floor # 1 # rounds a float (a number with a decimal) down to the nearest integer.
+cube.call # implying that cube is a proc, call calls procs directly
+Time.now # displays the actual time

+ 1003 - 0
docs/lang/Rust.md

@@ -0,0 +1,1003 @@
+
+
+* [https://www.rust-lang.org/](https://www.rust-lang.org/)
+* [https://doc.rust-lang.org/book/](https://doc.rust-lang.org/book/)
+
+
+```
+#### notes ####
+
+```
+---
+
+
+* [source](https://github.com/nczhu/rust-recipes-cheatsheet)
+
+### TOC
+- [Important Traits](#Important-Traits)
+- [Important Crates](#Important-Crates)
+- [Important Shorthands](#Important-Shorthands)
+- [Stack vs Heap](#Stack-vs-Heap)
+- [Strings](#Strings)
+- [Vectors](#Vectors)
+- [Return Handling](#Return-Handling)
+- [Iterators](#Iterators)
+- [Generics](#Generics)
+- [Lifetimes](#Lifetimes)
+- [Closures](#Closures)
+- [References](#References)
+- [Threads](#Threads)
+- [Channels](#Channels)
+- [Patterns](#Patterns)
+- [Macros](#Macros)
+- [Futures](#Futures)
+- [Databases](#Databases)
+- [Web Services](#Web-Servers)
+- [CLI](#CLI)
+
+## Important Traits
+
+- `from` and `into`: *Two sides of the same coin, returns the same Type the trait is impl on. `Into` is free after impl `From`*
+
+    let my_string = String::from(my_str);
+    let num: Number = int.into();
+
+- `PartialOrd`: Allows the > , < , = operators in T
+- `std::ops::AddAssign`: Allows arithmetic operations in T
+- `Copy`: Allows copy for primitives, rather than just move
+- `Default`: `.. Default::default()` fills in defaults for a struct/obj;
+
+## Important Crates
+
+- `Failure`: makes custom error creation easier
+- `Itertools`: interleave(), interlace() *for strings* , combines iterators together in woven way
+- `Rayon`: Thread, pool handling by allowing **parallel iterators.** `intoParallelIterator`
+- `Tokio`: Provides multithread Future executor for Streams; handles async well, `tokio::run(a_future)`
+
+## Important Shorthands
+
+- `..`: inclusive range operator,  e.g. `start..=end`
+- `..`: struct update syntax, i.e. remaining fields not explicitly set should have the same value as the fields in the given instance. `..Default::default()` or `..user1`
+
+## Stack vs Heap
+
+- `Stack`: Just the vars that exist only during a function
+- `Heap`: Memory that's generally available. Need to free it before ending program. e.g. `String` , `Box`, `Hashmap`, `Arc`, `Rc`
+    - `Box`: A pointer type for heap allocation. Allocates memory on the heap and then places x/anything into it. When it's **dropped**, the memory it points to will be freed.
+
+## File Structure
+
+Cargo.toml cheatsheet
+
+    // Generic Cargo.toml
+
+    // library
+    [lib] // some library
+    name = "..."
+    path = "..."
+
+    // binaries
+    // access libaries with `extern crate lib_name;`
+    [[bin]]
+    name = "..."
+    path = "..."
+
+    [dependencies]
+    dep_name = "version_num"
+
+    // Alternative to saying dep_name = {version =..., features = ["..."]}
+    [dependencies.dep_name]
+    version = "..."
+    features = ["..."]  // features are conditional compilation flags
+
+## Strings
+
+### Str Types
+
+- `String`: Dynamic string heap type. *Acts as a pointer. Use when I need owned string data (passing to other threads, building at runtime)*
+- `str`: immutable seq of bytes of dynamic/unknown length in memory. Commonly ref by `&str`, e.g. a ptr to a slice of data that can be anywhere. *Use when I only need a view of a string.*
+- `&'static str`: e.g. "foo" string literal, hardcoded into executable, loaded into mem when program runs.
+
+### Usage Conventions
+
+- Trait `AsRef<str>` : if S (generic var) is already a string, then it returns pointer to itself, but if it's already a pointer to str, then it doesn't do anything (no op). Has method `.as_ref()` *Saves me from implementing fns for both strings and slices*
+- `format!("a {}", n)`: returns string, concatenates
+- **Ptr to String → Option String**: `ptr.map(|s| s.to_string())`
+- **String slice into a Result expected type **: `.parse()`
+
+## Vectors
+
+    // Common uses
+    let mut v = Vec::with_capacity(100);
+    v.split_at_mut(index); // splits vec returning mut vecs
+
+## Return Handling
+
+### Result: Ok vs Error
+
+    pub enum Result<T,E> {
+    	Ok(T),
+    	Err(E),
+    }
+
+### ? Shorthand
+
+*? applies to a `Result` value, and if it was an `Ok`, it **unwraps** and gives the inner value (Directly uses the into() method), or it returns the Err type from the current* function.*
+
+    // Unwraps a result, or propagates an error (returns the `into` of an Error)
+    // ? needs the From trait implementation for the error type you are converting
+    Ok(serde_json::from_str(&std::fs::read_to_string(fname)?)?)
+
+### Use custom errors for new structs
+
+*To handle proper error handling*
+
+    use serde_derive::*;
+
+    #[derive(Debug)]
+    pub enum TransactionError {
+        LoadError(std::io::Error),
+        ParseError(serde_json::Error),
+    }
+
+    impl From<std::io::Error> for TransactionError {
+        // we have to impl this required method
+                                    // Self: the type we are working with right now, in this case its TransactionError
+        fn from(e: std::io::Error) -> Self {
+            TransactionError::LoadError(e)
+        }
+    }
+
+    #[derive(Deserialize, Serialize, Debug)]
+    pub struct Transaction { ... }
+
+### Option: Some vs None
+
+    pub enum Option<T> {
+    	Some(T),
+    	None,
+    }
+
+### Result  Option
+
+    // Result into Option
+    let t = get_result.ok()?;
+
+    // Option into Result
+    // ok_or converts None into Error
+    // ? gets it into the Err type we want for our function
+    let t = get_option.ok_or("An Error message if the Option is None")?;
+
+### Refactor error handling
+
+1. Put all error traits & implementations in `error.rs`; Put all functions in `lib.rs`
+2. Create a lib in cargo.toml, point [main.rs](http://main.rs) to library crate  `extern crate lib_name`
+
+    // Allows us to have both a library and an application
+    [lib]     # library name, path, etc
+    [[bin]]   # binary target name, path etc. Can have multiple binaries!
+
+3. Inside `[lib.rs](http://lib.rs)` import error.rs with `mod error`  `use error::...`
+
+**Failure Trait:** *Better failure handling, without having to create my own error type*
+
+[failure](https://rust-lang-nursery.github.io/failure/)
+
+- When using it to write a library: create a new Error type
+- When using it to write an application: have all functions that can fail return failure::Error
+
+## Iterators
+
+Important iterating traits:
+
+- `Iterator`: Requires Item type, `.next()`
+- `IntoIterator`: Key trait that allows for loop to work, for things that doesn't naturally iterate over themselves
+- `a_vec.into_iter()`: turns a vector into an iterator
+
+## Generics & Traits
+
+*Generic Type, Functions & Trait imps*
+
+    // TRAITS
+    pub struct Thing<T> { foo: T, ...}...
+    impl <T> Thing<T> {...}
+    impl <T> TraitA for Thing<T> {...}
+
+    // Limit generics to certain Traits & provide addn traits it needs
+    impl <T:TraitA + TraitB> ...
+    // Or
+    impl <T> ... where T:SomeTrait {...}
+
+    // Trait requirements: if type impl B, it might impl A
+    trait B: A
+
+    // 1. Refactor the multi-traits by creating a new Trait
+    pub trait CombiTrait: TraitA + TraitB {..// any fns ..}
+    // 2. Impl CombiTrait for all T that has traitA/B, otherwise get error
+    impl <T:TraitA + TraitB> CombiTrait for T {}
+
+
+
+    // FUNCTIONS
+    // It makes the type available for the function
+    fn print_c<I:TraitA>(foo:I) {
+
+## Lifetimes
+
+*Think of lifetimes as a constraint, bounding output to the same lifetime as its input(s)*
+
+- By default, lifetimes exist only within the scope of a function
+- Only things relating to references need a lifetime, e.g. struct containing a ref, or strings
+- `'static` ensures a lifetime for the entirety of the program
+
+    ```
+    //FUNCTION output lifetime binds to input variables:
+    // 1. We assign the lifetime 'a' to variables s, t
+    // 2. We constrain the output lifetime to 'a' as well
+    // 3. Meaning the output now has to live as long as the smaller of s or t
+    fn foo<'a>(s: &'a str; t: &'a &str) -> &'a str {...}
+
+    // STRUCTs containing refs, require lifetimes,
+    // To ensure any reference to Foo doesn't outlive reference to x (internal value)
+    struct Foo<'a> {	x: &'a i32, }
+    impl<'a> Foo<'a> { ... }
+
+    // ELISIONS: i.e. inferences & allowed shorthands
+    fn print(s: &str); // elided
+    fn print<'a>(s: &'a str); // expanded
+
+    // If ONE input lifetime, elided or not, that lifetime is assigned to all elided lifetimes in the return values of that function.
+    fn substr(s: &str, until: u32) -> &str; // elided
+    fn substr<'a>(s: &'a str, until: u32) -> &'a str; // expanded
+    // fn frob(s: &str, t: &str) -> &str; // ILLEGAL, two inputs
+
+## Closures
+
+- `FnOnce`: consumes variables it captures. Moves vars into the closure when its defined. FnOnce can only be called once on the same variables
+- `FnMut`: can change env bc it mutably borrows values. *recommended for working with Vecs*
+- `Fn`: borrow values from env immutably
+
+    // FnOnce:
+    pub fn fooF(&mut self, f: F)
+    	where F: FnOnce(&mut String), {...}
+
+    // FnMut: The function itself is going to change over time
+    pub fn edit_allF(&mut self, mut f: F)
+    	where F: FnMut(&mut String), {...}
+
+    // Boxed closure type, usually used in threads,
+    // allowing different fn to be sent to the same channel
+    Box<Fn(&mut String) + TraitB >
+
+## References
+
+    &i32        // a reference
+    &'a i32     // a reference with an explicit lifetime
+    &'a mut i32 // a mutable reference with an explicit lifetime
+
+    Box<T>      // is for single ownership.
+    Rc<T>       // is for multiple ownership.
+    Arc<T>      // is for multiple ownership, but threadsafe.
+    Cell<T>     // is for “interior mutability” for Copy types; that is, when you need to mutate something behind a &T.
+
+### Reference count
+
+*Single thread use only: doesn't impl sync and send*
+
+- `Rc`: generic struct, like a garbage collector.  `(reference count, ptr to data)` When you clone an Rc, it just increments the count without copying the data; when it reaches 0 it drops its internal pointer.
+- `Rc::new(s)`: Turns into reference counted obj, & acts as a reference, usable with `.clone()`. S has to be immutable.
+
+    // Make sure to specific the Rc type when a var is going to be reference counted
+    s: Rc String // a generic type, acts as a reference to String
+
+### RefCell: a mutable borrow
+
+*Single thread use only: doesn't impl sync and send*
+
+- Internally: guards the borrow checker, makes sure changes are correct.
+- Externally: pretends that it doesn't change. To the borrow checker, it mimics immutable obj.
+- `Rc<<RefCell<s>>` , `Rc::new(RefCell::new(s))`, `let ... = s.borrow_mut()` and lastly `drop(s)` to disable the guard.
+
+## Threads
+
+- Main fn can terminate before new threads finish!
+
+    use std::thread::*;
+    use std::time::Duration;
+
+    // Spinning up new thread
+    fn foo() {
+    	// closure for new thread actions
+    	spawn( || { println!("This is the new channel"); });
+    	println!("This is the initial thread");
+    	// allows time for new thread to finish before quitting fn
+    	sleep(Duration::from_millis(1000));
+    }
+
+    // Diff way to wait for threads to complete
+    let mut children = Vec::new();
+    let child = thread::spawn(...);
+    for child in children { child.join().expect("thread panic");
+
+- When you need to move **primitive** variables to be accessible inside threads, thanks to `Copy`:
+
+    spawn( move || { println!("{}", n); });
+
+### Arc, Mutex
+
+If `Copy` is not implemented for the var (e.g. moving a String btw threads), use:
+
+- `arc`: atomic reference count.
+- `mutex`: a guard on mutation, allows mutation when ppl have a `lock` on it
+- `lock()`: acquires the mutex's lock, ensuring its only held by 1 obj, returns Result.
+
+    use std::sync::{Arc, Mutex};
+    fn foo () {
+    	let m = Arc::new(Mutex::new(String::from("xyz")));
+
+    	// Create a new arc mutex by copying original arc mutex
+    	// but really clone just increments the rc count
+    	let m2 = m.clone();
+    	// use m2 in new thread
+    	spawn ( ... let mut s = m2.lock().unwrap(); ... )
+
+    	// use m in original thread
+    	let s = m.lock().unwrap();
+    }
+
+When to use Mutex in Arc?
+
+    // In a multithread game engine, you might want to make an Arc<Player>.
+    // The Mutexes protect the inner fields that are able to change (items).
+    // while still allowing multiple threads to access id concurrently!
+
+    struct Player {
+        id: String,
+        items: Mutex<Items>,
+    }
+
+### Channels
+
+- A function returning: `Sender<T>` and `Receiver<T>` endpoints, where T is type of msg to be transferred, allowing async communications between threads
+- `mpsc`: means Multi Producer Single Consumer. We can clone sender, but not receiver.
+- Drop(channel senders) will close the channel automatically
+- **Fns have to be Boxed** before sending across channel
+
+    //Good pattern
+    std::sync::mpsc::channel;
+
+    fn foo() {
+    	let (ch_s, ch_r) = channel<...>();
+
+    	// channel that sends a done signal, instead of waiting
+    	let (done_s, done_r) = channel<()>();
+
+    	std::thread::spawn (move ||
+    		loop {
+    			match ch_r.recv() {
+    				Ok(_) => {...}
+    				Err(_) => { done_s.send(()).unwrap() }
+    		}
+    	}
+
+      // sending stuff through channels
+    	ch_s.send(...)...
+      let ch_2 = ch_s.clone();
+    	ch_2.send(...)...
+
+    	// Need to manually drop the channels or infinite loop occurs
+    	drop(ch_s);
+      drop(ch_2);
+
+    	done_r.recv().ok();
+    }
+
+### ThreadPools
+
+    pub struct ThreadPool {
+        ch_s: Option<mpsc::Sender<Box<Fn() + Send>>>,
+        n: u32,
+        ch_done: mpsc::Receiver<()>,
+    }
+
+    impl ThreadPool {
+        pub fn new(n: u32) -> Self {
+            let (ch_s, ch_r) = mpsc::channel();
+            let a = Arc::new(Mutex::new(ch_r)); // multi receiver
+            let (ch_done_s, ch_done) = mpsc::channel();
+
+            for _ in 0..n {
+                let a2 = a.clone();
+                let ch_done_2 = ch_done_s.clone();
+                // This thread will loop: waiting on the receiver
+                // for the next job that it is going to do
+                std::thread::spawn(move || loop {
+                    let m = a2.lock().unwrap();
+                    let f: Box<Fn() + Send> = match m.recv() {
+                        Ok(f) => f,
+                        Err(_) => {
+                            ch_done_2.send(()).ok();
+                            return;
+                        }
+                    };
+                    // drop our hold on the mutex before we run f
+                    // otherwise only one fn can run at a time
+                    drop(m);
+                    f();
+                });            
+            }
+
+            ThreadPool{ch_s:Some(ch_s) , n, ch_done}
+        }
+
+        pub fn run<F:Fn() + Send + 'static>(&self, f:F) {
+            if let Some(ref ch_s) = self.ch_s {
+                ch_s.send(Box::new(f)).unwrap();
+            }
+        }
+
+        // consumes self at the end
+        pub fn wait(mut self) {
+            self.ch_s.take();  // drops our sender
+            for _ in 0..self.n {
+                self.ch_done.recv().unwrap(); // waits for n done messages to come back
+            }
+        }
+    }
+
+    fn main() {
+    	let tp = ThreadPool::new(n_of_threads);
+    	for something_i_want_n_times {
+    		tp.run(...)
+    	}
+    	tp.wait();
+    }
+
+## Patterns
+
+### Builder
+
+    pub enum Property {
+        Simple(&'static str, String), // e.g. x=5, y = 11
+        Style(&'static str, String),  // like css styles, e.g. border: ...
+        Transform(String),           
+    }
+
+    pub struct SvgTag {
+        pub kind: &'static str,
+        pub properties: Vec<Property>,
+    }
+
+    impl SvgTag {
+        pub fn new(kind: &'static str) -> Self {
+            SvgTag {
+                kind,
+                properties: Vec::new(),
+            }
+        }
+
+        // Display: formats values, so we can use to_string() method on v
+        // Takes mutable self, takes ownership of self, changes it, then returns self
+        // fn that calls this fn loses access on it
+        pub fn property<V: Display>(mut self, k: &'static str, v:V) -> Self {
+            self.properties.push(Property::Simple(k, v.to_string()));
+            self
+        }
+
+        pub fn style<V: Display>(mut self, k: &'static str, v:V) -> Self {
+            self.properties.push(Property::Style(k, v.to_string()));
+            self
+        }
+
+        // sets the x property
+        pub fn x<V:Display>(self, v: V) -> Self {
+            self.property("x", v)
+        }
+
+        pub fn y<V:Display>(self, v: V) -> Self {
+            self.property("y", v)
+        }
+    }
+
+    // So we can simply do:
+    let a = SvgTag::new("svg").w("60px").h("80px");
+
+### Defaults
+
+    struct Foo {...}
+
+    impl Default for Foo {
+    	fn default() -> Self {
+    		Foo { ..:.., }
+    	}
+    }
+    ...
+    let f = Foo { ..Default:default()}
+
+### Wrappers Traits
+
+If I want to compose structs that contain certain (different?) traits. Create a wrapper struct. *This is usually done with iterators etc.*
+
+    pub struct TraitWrap<A:TraitA, B:TraitB> {
+        a: A,
+        b: B,
+    }
+
+    impl <A: TraitA, B:TraitB> TraitA for TraitWrap<A,B> {
+    		fn ...
+    }
+
+## Macros
+
+### Common Metavariables
+
+- `ident`: identifier, e.g. `x`, `foo`
+- `item`: item, e.g. `fn foo() {}`, `struct Bar`
+- `expr`: expression, e.g. `2+2`, `if x else y`, `f(42)`
+    - May only be followed by one of: `=>`  `,` `;`
+    - Expressions evaluate TO a value
+- `stmt`: single statement, e.g. `let x = 3`
+    - May only be followed by one of: `=>`  `,` `;`
+    - Statements return a value
+- `block`: block of code (stmts), e.g. `{let .. ; let ... return}`
+- `pat`: pattern, e.g. `Some(t)`, `(17, 'a')`, `_`
+- `path`: qualified name, e.g. `T::SpecialA`
+- `ty`: type, e.g. `i32`, `Vec`, `&T`
+- `tt`: single token tree, e.g. `()`, `[]`, or `{}`
+- `meta`: meta item in attrs, e.g. `cfg(attr = "...")`
+
+### Declarative Macros
+
+Macros that work like match statements on your code snippets. It matches on illegal code, to replace them with legal Rust code.
+
+    // This macro should be made avail whenever the crate
+    // where the macro is defined, is brought into scope
+    #[macro_export]
+
+    //macro decl
+    						// name of macro
+    macro_rules! vec {
+    		// similar to a match expression
+    		// if pattern matches, the following code executes
+
+    		//1. a () always encompasses the whole pattern
+    		//2. $(...) contains values that match the pattern within the parens for use within the replacement code
+    		//3. expr, a metavariable, will match any Rust expression
+    		//4. $x is now the name of the matched expression
+    		//5. , indicates that "," could appear after the code that matches the expression.
+    		//6. * means pattern can repeat, i.e. standard regular expression
+    		// So Vec![1,2,3] means 1 and 2 and 3 are respectively the $x
+        ( $( $x:expr ),* ) => {
+            {
+                let mut temp_vec = Vec::new();
+    						// $()* is generated for each part that matches $()
+                $(
+                    temp_vec.push($x);
+                )*
+                temp_vec
+            }
+        };
+    }
+
+
+### Macro refactoring
+
+Calling a macro within a macro is a good way to refactor the macro code
+
+    // SvgTag::new("svg").child(SvgTag::new("rect").x(7).y(7).w(9).h(9));
+    // svg! { svg => {rect x=7, y=7, w=9, h=9} };
+
+    // Step 1: builds the children
+    //  { svg => {rect x=7, y=7, w=9, h=9} }
+    //     $s   $c
+        ($s:ident => $($c:tt)*) => {
+                    //p matches with "rect"
+            SvgTag::new(stringify!($s))
+                $(.child(svg!$c))*   //1. adds the child, recursively calls itself to be able to add children
+                //outer macros make all the changes, and then any inner macros in the result will then be evaluated
+        };
+
+    // Step 2/c: builds the properties of a single child
+    // rect x=7, y=7, w=9, h=9
+        ($s:ident $($p:ident = $v:expr),* ) => {
+            SvgTag::new(stringify!($s))
+                $(.$p($v))*
+        };
+
+### Procedural Macros
+
+Functions that operate on input code, outputs new code
+
+    # This package does procedural macros
+    # and can't be used for anything other than proc macros
+    # this runs before other packages at compile time
+    [lib]
+    proc_macro = true
+
+    // In src/lib.rs
+    use proc_macro;
+
+    #[some_attribute]
+    pub fn some_name(input: TokenStream) -> TokenStream {
+    }
+
+### Derive Macros
+
+**Good convention**: for structs, to create setter helper fn, e.g. `set_field1` `set_field2` .
+
+    // using it
+    #[derive(MyMacro)]
+
+    // defining it
+    #[proc_macro_derive(MyMacro)]
+    pub fn mymacro_derive(input: TokenStream) -> TokenStream {
+    		let mut top = input.into_iter();
+        let mut ttype: TokenTree = top.next().unwrap();
+    		format!(...).parse().unwrap()
+    							// parse ret. Result, which is unrwapped
+    }
+
+    // helper setter fns for struct fields
+    //
+    fn parse_row<I: Iterator<Item=TokenTree>>(i: &mut I) -> Option<Row> {...}
+
+    pub fn mymacro_derive ... {
+    	let mut row_iter = if let Some(TokenTree::Group(g)) = top.next() {
+    		g.stream().into_iter()
+    	} else {
+    		panic!();
+    	};
+
+    	// next step: create `rows` Vec
+    	// next step: parse_row  the rows into `rows`
+
+    	// Create a setter function per struct field
+    	let lines:String = rows.iter().map ( |r| {
+    		format!("fn set_{0}(&mut self, v:{1} {{
+                self.{0} = v;
+    		        }} \n", r.name, r.ttype)
+        }).collect();
+
+    	// Create trait wrapper: "impl name { *lines of code* }"
+    	let res = format!(
+            "impl {} {{
+            {}
+       }}", name, lines);
+
+       eprintln!("Res == {}", res);
+
+       res.parse().unwrap()
+    }
+
+- `cargo expand`: expands macro code to be more readable. Install through `cargo install cargo-expand`
+
+## Futures
+
+A Future: a mechanism (action) for having an obj you know will return a delayed single result, in the future.
+
+Poll: enum with variants `Pending` and `Ready<T>`
+
+Runtime/Exector: Rust doesn't complete promises, you need something to poll the future, i.e. an executor like block_on
+
+Think of futures are cheap threads, when you don't have as many threads. How it works is different though. Threads are run on separate processes. Futures are:
+
+- Obj with a function that will return if there is something it can't do, e.g. waiting on tcp , or file load
+- Hidden in a struct, which some other operator has to call to ask if it needs to do something
+- Like a Javascript promise: Returns something that you can call methods on; Easier to keep things in an asynchronous.
+- Is a Rust Library, not embedded in the language itself.
+- Zero cost abstraction: if you don't use it, it doesn't cost me to include it. (Conversely, green threads in Go do cost)
+- Async / Await (unstable) is here already (Jan 2020)
+
+### Simple Future
+
+    pub struct SimpleFuture {
+        n: i32, // or whatever other return type upon completion
+    }
+
+    impl Future for SimpleFuture {
+        type Output = i32;
+
+        // Req function: attempt to resolve future to final value,
+        // registering the current task for wakeup if value is not yet available
+                    // Pin dereferences to Self, guarantees we can still access ptrs to internal ptrs inside this obj
+                                         // Poll is an enum: ready (result), pending
+        fn poll(self: Pin<&mut Self>, _cx: &mut Context) -> Poll<Self::Output> {
+            Poll::Ready(self.n)
+        }
+    }
+
+    // to run the future, use an executor, e.g.:
+    use futures::executer::block_on(); //block thread til future is complete
+    block_on(SimpleFuture{n:10});
+
+### Future Combinators
+
+Combinators are cheap bc only calling it takes up work, creating combinators are "lazy" operations. Combinators only wrap future in another one, and doesn't do anything until you call it.
+
+Important trait `FutureExt`:
+
+- `map` can change result type of future
+- `then` chains on a closure f for additional computation on top of future
+- `into_stream` turns future into many objects
+- `join` combines two futures into one
+
+    // Oneshot Channel: allows async via two different threads
+    // This si the equivalent of POLL, but multithreaded
+    // f is a Future obj
+
+    let (ch_s, ch_r) = oneshot::channel();
+    block_on(f.map( move |n| ch_s.send(n+5) ));
+    let result = block_on(ch_r).unwrap();
+
+### Async Functions
+
+Async block resolves into an enum. The enum implements Future, and tracks the state of its own variables.
+
+`Await` must always be inside Async block to create a new state on the async enum. It adds state to the resulting future. (it doesn't actually await at the time we write it)
+
+    // Don't have to create Future obj manually
+    // Create a async function instead that auto handles futures
+
+    pub async fn simple_future_fn(p:i32) -> i32 { ... }
+
+    block_on(async move {
+    	let v = simple_future_fn(n).await;
+      ch_s.send(v);
+    });
+
+    block_on(async move {
+    	let r = ch_r.await.unwrap();
+    	...
+    });
+
+### Stream
+
+A Stream (Reader) is a stream of results, like an `Iterator`, with a delay between each value.
+
+Streams look like Futures, but returns a Poll `Option<...>` rather than a enum of Ready(Result). Streams impl the Stream trait.
+
+`Ready(Some(thing))`: means that stream has more to ask for
+
+    pub struct ReadStream { reader: A, buf:[u8;100], }
+    impl<A:AsyncRead + Unpin> Stream for ReadStream<A> {
+    	type Item = String;
+
+    	// Acts like Iterator, to provide a streat of Results
+    	fn poll_next(self: Pin<&mut Self>, cx &mut Context) -> Poll<Option<Self::Item>> {
+    			let up = self.get_mut();
+          let r = Pin::new(&mut up.reader)
+          match r.poll_read(cx, &mut up.buf){
+                Poll::Ready(Ok(len)) => Poll::Ready(Some(String::from_utf8_lossy(&up.buf[..len]).to_string()));
+                Poll::Ready(Err(_e)) => Poll::Ready(None), // kind of hacky but ok
+                Poll::Pending => Poll::Pending,
+          }		
+    	}
+    }
+
+## Databases
+
+Crate: Diesel
+
+Handles databases operations, builder patterns to auto build db functions.
+
+Downloading Diesel: `cargo install diesel_cli --no-default-features --features postgres`
+
+1. Create `.env` file with database url
+2. `diesel setup` creates database, with folder `migrations` with up/down sql files in the initial setup migration.
+3. `psql -d dbname`  then `\d` to see empty db.
+4. `diesel migration generate create_initial_tables`
+5. Create SQL commands in newly migration `up` file, then
+6. `diesel migration run` runs the migrations (db schema changes)
+7. `diesel migration redo` reverts all applied migrations
+
+    // to use schema.rs in a file:
+    #[macro_use]    // use diesel macros across entire crate
+    extern crate diesel;
+    pub mod schema; // how it works https://diesel.rs/
+
+8. `cargo expand` shows us all the functions that are created by diesel macros.
+
+    //Creating a DB connection in lib.rs based on .env setup
+    pub fn create_connection() -> Result<PgConnection, failure::Error> {
+        dotenv::dotenv().ok();
+        Ok(PgConnection::establish(&std::env::var("DATABASE_URL")?)?)
+    }
+
+    // models.rs
+    use crate::schema::*;
+
+    // Model declaration: be really careful with attrs ordering!!
+    #[derive(Queryable, Debug)]
+    pub struct User {
+        pub id: i32,
+        pub name: String,
+        password: String,
+    }
+
+    impl User {
+        pub fn verify_pass(&self, password: &str) -> bool {
+            bcrypt::verify(password, &self.password).unwrap_or(false)
+        }
+    }
+
+    // Helper structure to allow db to auto create userids
+    #[derive(Insertable, Queryable)]
+    #[table_name = "users"]
+    pub struct NewUser<'a> {
+        name: &'a str,
+        password: String, // ok to lose the pointer here
+    }
+
+    pub fn new_user<'a>(name: &'a str, password: &str) -> NewUser<'a> {
+        NewUser {
+            name,
+            password: bcrypt::hash(password, 7).unwrap()
+        }
+    }
+
+    // Adding values to table
+    let added: User = diesel::insert_into(users::table).values(&user).get_result(&conn)?;
+
+    // Reading values from table
+    let res = users::table.limit(10).load::<User/>(&conn)?;
+
+    // DB inner joins
+    let vals = table1::table
+                 .inner_join(table2::table)
+                 .inner_join(table3::table)
+                 .filter(table1::id.eq(id))
+    						 .select((...)) // select
+                 .load::<NewStruct/>(&conn)?;
+
+## Web Servers
+
+**Crate**: Rocket - framework for web services to build websites
+
+`rocket::ignite().launch()`:: creates rocket builder, then starts rocket server
+
+    #![feature(proc_macro_hygiene, decl_macro)]
+    #[macro_use]
+    extern crate rocket;
+    use rocket::response::{Responder, NamedFile};
+
+    #[get("/")]
+    fn root() -> Result<impl Responder<'static>, failure::Error> {
+        NamedFile::open("site/static/index.html").map_err(|e| e.into())
+    }
+
+    // Enabling static file routes
+    #[get("/<path..>")]
+    fn static_file(path: PathBuf) -> Result<impl Responder<'static>, failure::Error> {
+        let path = PathBuf::from("site/static").join(path);     // creates site/static/new_path
+        NamedFile::open(path).map_err(|e| e.into())
+    }
+
+    #[post("/login", data="<dt>")] //syntax: quote + 
+    fn login(dt: Form<LoginData>, db:DPool) -> Result<impl Responder<'static>, DoodleWebErr> {
+        let ldform = dt.into_inner();
+        let vals = users::table::filter(users::name.eq(ldform.name)).load::<User/>(&db.0)?;
+        let user = vals.iter().next().ok_or(DoodleWebErr::UserDoesNotExistError)?;
+        if ! user.verify_pass(&ldform.pass) {
+            return Err(DoodleWebErr::PasswordError)
+        }
+        Ok("Password passed") // fine bc String impl Responder
+    }
+
+    fn main() {
+        rocket::ignite()      //creates rocket builder
+                .mount("/", routes![root, static_file])    // mounts route & fn
+                .launch();    // starts rocket server, returns error on every case
+
+Custom errors & types in Response
+
+    use failure_derive::Fail;
+    // allows custom errors to be returned //response is the actual response being returned
+    // getting response happens after we return it, friendly to be converted to futures.
+    use rocket::response::{Responder, Response};
+    use rocket::Request;
+            // status code, information that passed to client end for handling
+    use rocket::http::{Status, ContentType};
+    use std::io::Cursor; // read seeker for our response
+
+    #[derive(Fail, Debug)]
+    pub enum CustomWebErr {
+        #[fail(display = "IO Error{}", 0)]
+        IOErr(std::io::Error),
+    }
+
+    // makes e.into() possible
+    impl From<std::io::Error> for CustomWebErr {
+        fn from(e:std::io::Error) -> Self {
+            CustomWebErr::IOErr(e)
+        }
+    }
+
+    // implemented responder to be able to respond with custom error
+    impl <'r> Responder<'r> for CustomWebErr {
+        fn respond_to(self, _:&Request) -> rocket::response::Result<'r> {
+            let res = Response::build()
+                        .status(Status::InternalServerError)
+                        .header(ContentType::Plain)
+                        .sized_body(Cursor::new(format!("Error doing loading page: {}", self))).finalize(); //to get this we need to impl seekable
+            Ok(res)
+        }
+    }
+
+Configure Rocket.toml
+
+    [global.databases]
+    doodlebase = {url = "postgres://acct:pw@localhost/dbname"}
+
+### Sessions
+
+    //in session.rs
+    pub struct Session(Arc<Mutex<HashMap<u64,User>>>);
+
+    impl Session {
+        pub fn new() -> Self {
+            Session(Arc::new(Mutex::new(HashMap::new())))
+        }
+
+        pub fn get(&self, k:u64) -> Option<User/> {
+            self.0.lock().unwrap().get(&k).map(|u| u.clone())
+        }
+    }
+
+    // in main.rs
+    // pub main()
+    let sess = session::Session::new();
+        rocket::ignite()
+                .mount("/", routes![...])
+                .attach(DP::fairing())
+                .manage(sess) // attaches session
+                .launch();
+
+    // Putting Session
+    let sess_id = ss.put(user.clone());
+    cookies.add(Cookie::new("login", sess_id.to_string()));
+
+    // Getting Session
+    let login = cookies.get("login").ok_or(DoodleWebErr::NoCookie)?.value();
+    let user = st.get(login.parse().map_err(|_| "DoodleWebErr::NoCookie")?)
+               .ok_or(DoodleWebErr::NoSession)?;
+
+### Static templates
+
+*With Maud: compile time templates*
+
+    // pages that return Result<impl Responder>
+    Ok(
+    	html! {     // a maud macro
+    		(DOCTYPE)
+    		head { meta charset = "utf-8" }
+    		body { ... }
+    	}
+    )
+
+## CLI
+
+**Crate**: clap
+
+    use clap::{clap_app, crate_version};
+
+    // Define the CLI commands
+    let clap = clap_app!(cli_name =>
+                (about:"About this CLi")
+                (version: crate_version!())
+                (author: "Your name here")
+
+    						// CLI with input args
+                (@subcommand cmd_1 =>
+                    (@arg field_1:+required "Field 1 Prompt")
+                    (@arg field_2:-u +takes_value "Field 2 is optional")
+                )
+
+    						// CLI with no args
+                (@subcommand cmd_2 => )
+            ).get_matches(); //reads input from cli, makes everything fit
+
+    // Matching commands
+    if let Some(ref sub) = clap.subcommand_matches("cmd_1") {
+    				// access value:
+    	      sub.value_of("field_1").unwrap()
+    }

+ 180 - 0
docs/localhost/_log.md

@@ -0,0 +1,180 @@
+
+
+
+[January 2020 Updates:(TIL)](/index)
+* upgraded (macs/magic/gg) to [MacOS Catalina 10.15](apple.md)
+* upgraded npm, nvm, and rvm.
+```
+david@macs:~ » nvm ls
+        v6.10.3
+        v6.11.2
+         v7.6.0
+         v8.4.0
+        v8.11.4
+        v8.12.0
+->     v10.16.3
+default -> 10.16 (-> v10.16.3)
+node -> stable (-> v10.16.3) (default)
+stable -> 10.16 (-> v10.16.3) (default)
+iojs -> iojs- (-> system) (default)
+lts/* -> lts/dubnium (-> v10.16.3)
+lts/argon -> v4.9.1 (-> N/A)
+lts/boron -> v6.17.1 (-> N/A)
+lts/carbon -> v8.16.1 (-> N/A)
+lts/dubnium -> v10.16.3
+
+david@macs:~ » rvm ls                                                                                     
+   ruby-2.2.3 [ x86_64 ]
+   ruby-2.3.1 [ x86_64 ]
+   ruby-2.4.0 [ x86_64 ]
+   ruby-2.4.1 [ x86_64 ]
+   ruby-2.4.4 [ x86_64 ]
+   ruby-2.5.1 [ x86_64 ]
+=* ruby-2.7.0 [ x86_64 ]
+
+david@macs:~ » npm -v                                                                                               1 ↵
+6.9.0
+```
+* upgraded [MySQL](/docs/db/mysql) to v.8.0.19  
+* added [DBEngin](https://dbngin.com/) which is a nice UI to stop start anything homebrew installed. Makes it easy to stop/start when testing.
+```sh
+david@macs:~ » brew list --versions
+adns 1.5.1 aom 1.0.0
+apr 1.7.0
+apr-util 1.6.1_3
+argon2 20190702_1
+aspell 0.60.8
+autoconf 2.69
+automake 1.16.1_1
+boost 1.72.0
+brew-cask 0.60.1
+brotli 1.0.7
+c-ares 1.15.0
+cairo 1.16.0_2
+composer 1.9.3
+curl-openssl 7.68.0
+dnsmasq 2.80
+faac 1.29.9.2
+ffmpeg 4.2.2_1
+flac 1.3.3
+fontconfig 2.13.1
+freetds 1.1.24
+freetype 2.10.1
+frei0r 1.7.0
+fribidi 1.0.8
+gdbm 1.18.1
+gettext 0.20.1
+giflib 5.2.1
+gist 5.0.0
+glib 2.62.4
+gmp 6.1.2_2
+gnupg 2.2.19
+gnutls 3.6.12
+graphite2 1.3.13
+harfbuzz 2.6.4
+heroku 7.37.0
+heroku-node 12.13.0
+httpd 2.4.41_1
+httrack 3.49.2_1
+icu4c 64.2
+ilmbase 2.4.0
+imagemagick 7.0.9-21
+jansson 2.12
+jemalloc 5.2.1
+jpeg 9d
+lame 3.100
+leptonica 1.79.0
+libass 0.14.0_1
+libassuan 2.5.3
+libbluray 1.1.2
+libde265 1.0.5
+libev 4.31
+libevent 2.1.11_1
+libffi 3.2.1
+libgcrypt 1.8.5
+libgpg-error 1.36
+libheif 1.6.2
+libidn 1.35
+libidn2 2.3.0
+libksba 1.3.5
+libmetalink 0.1.3
+libogg 1.3.4
+libomp 9.0.1
+libpng 1.6.37
+libpq 12.1_1
+libpqxx 6.4.5_4
+libsamplerate 0.1.9_1
+libsndfile 1.0.28
+libsodium 1.0.18_1
+libsoxr 0.1.3
+libssh2 1.9.0_1
+libtasn1 4.16.0
+libtiff 4.1.0
+libtool 2.4.6_1
+libunistring 0.9.10
+libusb 1.0.23
+libvidstab 1.1.0
+libvorbis 1.3.6
+libvpx 1.8.2
+libxml2 2.9.10
+libyaml 0.2.2
+libzip 1.6.1
+little-cms2 2.9
+lzo 2.10
+makedepend 1.0.6
+mcrypt 2.6.8
+mhash 0.9.9.9
+ncurses 6.1_1
+nettle 3.4.1
+nghttp2 1.40.0
+nginx 1.17.8
+ngrok 1.7.1
+node 13.8.0
+npth 1.6
+nvm 0.35.2
+oniguruma 6.9.4
+opencore-amr 0.1.5
+openexr 2.4.0
+openjpeg 2.3.1
+openldap 2.4.49
+openssl 1.0.2s
+openssl@1.1 1.1.1d
+opus 1.3.1
+p11-kit 0.23.20
+pcre 8.43
+php 7.4.2
+phpunit 8.5.2
+pinentry 1.1.0_1
+pixman 0.38.4
+pkg-config 0.29.2
+postgresql 12.1
+python 3.7.6_1
+python@2 2.7.17_1
+readline 8.0.1
+redis 5.0.7
+rtmpdump 2.4+20151223_1
+rubberband 1.8.2_1
+sdl2 2.0.10
+shared-mime-info 1.15
+snappy 1.1.8
+speex 1.2.0
+sphinx-doc 2.3.1
+sqlite 3.31.1
+tesseract 4.1.1
+texi2html 5.0
+theora 1.1.1
+tidy-html5 5.6.0
+unbound 1.9.6
+unixodbc 2.3.7
+webp 1.1.0
+wp-cli 2.4.0
+x264 r2917_1
+x265 3.2.1
+xvid 1.3.7
+xz 5.2.4
+yarn 1.22.0
+yasm 1.3.0_2
+zlib 1.2.11
+zsh-history-substring-search 1.0.2
+zsh-syntax-highlighting 0.6.0
+```

+ 683 - 0
docs/localhost/adobe.md

@@ -0,0 +1,683 @@
+#Adobe
+
+### Illustrator
+
+* V
+
+Selection Tool
+
+* M
+
+Rectangle Tool
+
+* W
+
+Blend Tool
+
+* L
+
+Ellipse Tool
+
+* I
+
+Eyedropper Tool
+
+* C
+
+Scissors Tool
+
+* B
+
+Paint Brush Tool
+
+* J
+
+Column Graph Tool
+
+* Y
+
+Magic Wand Tool
+
+* S
+
+Scale Tool
+
+* G
+
+Gradient Tool
+
+* E
+
+Free Transform Tool
+
+* O
+
+Reflect Tool
+
+* T
+
+Type Tool
+
+* P
+
+Pen Tool
+
+* U
+
+Mesh Tool
+
+* A
+
+Direct Selection Tool
+
+* H or Hold Space
+
+Hand Tool
+
+* R
+
+Rotate Tool
+
+* Q
+
+Lasso Tool
+
+* D
+
+Default Fill/Stroke
+
+* F
+
+Screen Modes
+
+* K
+
+Live Paint Bucket Tool
+
+* X
+
+Switch Fill/Stroke
+
+* N
+
+Pencil Tool
+
+* ,
+
+Fill/Stroke w/ Colour
+
+* .
+
+Fill/Stroke w/ Gradient
+
+* /
+
+Fill/Strike w/ None
+
+* Line Segment Tool
+* -
+
+Delete Anchor Point
+
+* +
+
+Add Anchor Point
+
+* ⌘ + T
+
+Character Window
+
+* ⌘ + I
+
+Spell Check
+
+* ⌘ + G
+
+Group Object
+
+* ⌘ + ⇧ + G
+
+Ungroup Object
+
+* ⌘ + H
+
+Hide Anchor Points
+
+* ⌘ + B
+
+Fill Black
+
+#### Changing View
+
+* Z
+
+Zoom Tool
+
+* ⌘ + +
+
+Zoom In
+
+* ⌘ + -
+
+Zoom Out
+
+* ⌘ + 0
+
+Fit Screen
+
+* ⌘ + ~
+
+Switch open tabs
+
+* ⌘ + R
+
+Show/Hide Rulers
+
+* ⌘ + ;
+
+Show/Hide Guides
+
+* ⌘ + '
+
+Show/Hide Grid
+
+#### Shift Tool Shortcuts
+
+* ⇧ + Rotate Tool
+
+Constrain rotation angles
+
+* ⇧ + C
+
+Convert anchor point
+
+* ⇧ + B
+
+Blob Brush
+
+* ⇧ + E
+
+Eraser
+
+* ⇧ + S
+
+Symbol Sprayer
+
+* ⇧ + L
+
+Live Paint Selection
+
+* ⇧ + O
+
+Artboard Tool
+
+* ⇧ + K
+
+Slice Tool
+
+* ⇧ + X
+
+Swap Fill and Stroke
+
+#### Selecting & Moving
+
+* ⌥ + Drag Object
+
+Copy object while dragging
+
+* Arrow Keys
+
+Move selection
+
+* ⇧ + Arrow Keys
+
+Move selection by 10pt
+
+* ⇧ + Select Objects
+
+Select multiple objects
+
+* ⌘ + A
+
+Select all
+
+#### Typography
+
+* ⌘ + ⇧ + < or >
+
+Decrease/Increase type size
+
+* ⌥ + ↓ or ↑
+
+Decrease/Increase leading
+
+* ⌥ + ← or →
+
+Decrease/Increase kerning
+
+* ⌘ + ⇧ + L, R or C
+
+Align type left, right or centre
+
+* ⌘ + ⇧ + J
+
+Justify
+
+#### General
+
+* ⌘ + N
+
+New File
+
+* ⌘ + S
+
+Save
+
+* ⌘ + ⇧ + S
+
+Save As
+
+* ⌘ + ⌥ + S
+
+Save a Copy
+
+* ⌘ + ⇧ + ⌥ + S
+
+Save for Web
+
+* ⌘ + O
+
+Open
+
+* ⌘ + Q
+
+Quit
+
+* ⌘ + W
+
+Close
+
+* ⌘ + P
+
+Print
+
+* ⌘ + Z
+
+Undo
+
+* ⌘ + X
+
+Cut
+
+* ⌘ + C
+
+Copy
+
+* ⌘ + V
+
+Paste
+
+* ⌘ + K
+
+Preferences
+
+* ⌘ + M
+
+Minify Tabs
+
+----
+
+### Photoshop
+
+* V
+
+Move Tool
+
+* M
+
+Rectangular Marquee Tool
+
+* W
+
+Magic Wand Tool
+
+* L
+
+Polygonal Lasso Tool
+
+* I
+
+Eyedropper Tool
+
+* C
+
+Crop Tool
+
+* B
+
+Brush Tool
+
+* [
+
+Decrease Brush Size
+
+* ]
+
+Increase Brush Size
+
+* J
+
+Spot Healing Brush Tool
+
+* Y
+
+History Brush Tool
+
+* S
+
+Clone Stamp Tool
+
+* G
+
+Paint Bucket Tool
+
+* E
+
+Eraser Tool
+
+* O
+
+Dodge Tool
+
+* T
+
+Type Tool
+
+* P
+
+Pen Tool
+
+* U
+
+Rectangle Tool
+
+* A
+
+Direct Selection Tool
+
+* H
+
+Hand Tool
+
+* R
+
+Rotate Tool
+
+* Q
+
+Quick Mask
+
+* Toggle Layer Mask
+* D
+
+Default Colours
+
+* ⇧ + [_Tool]_
+
+Switch between tool in groups
+
+#### Changing View
+
+* Z
+
+Zoom Tool
+
+* ⌘ + +
+
+Zoom In
+
+* ⌘ + -
+
+Zoom Out
+
+* ⌘ + 0
+
+Fit Screen
+
+* Tab
+
+Hide all tools and panels
+
+* ⇧ + Tab
+
+Hide all panels except Toolbox & Options
+
+* ⌘ + ⇧ + Page Up/Down
+
+Scroll image left or right in window
+
+* ⌘ + ⇧ + Drag in Navigator
+
+Jump/Zoom to part of image
+
+* ⌘ + ~
+
+Switch open tabs
+
+* ⌘ + R
+
+Show/Hide Rulers
+
+* ⌘ + ;
+
+Show/Hide Guides
+
+* ⌘ + '
+
+Show/Hide Grid
+
+#### Selecting & Moving
+
+* ⇧ + Marquee
+
+Draw Marquee from centre
+
+* ⇧
+
+Add to a selection
+
+* ⌥
+
+Subtract from selection
+
+* ⇧ + ⌥
+
+Intersect with selection
+
+* ⌥ + Drag Selection
+
+Make copy of selection w/ Move Tool
+
+* ⌘ + ⌥ + Drag Selection
+
+Make copy of selection not in Move Tool
+
+* Arrow Keys
+
+Move selection (1 pixel increments)
+
+* ⇧ + Arrow Keys
+
+Move selection (10 pixel increments)
+
+* ⌘ + Click Layer Thumbnail
+
+Select all opaque pixels on layer
+
+* ⌘ + ⇧ + D
+
+Restore last selection
+
+* ⇧ + F6
+
+Feather selection
+
+* Hold Space
+
+Move marquee while drawing selection
+
+#### Images & Layers
+
+* ⌘ + ⌥ + I
+
+Resize Image
+
+* ⌘ + ⌥ + C
+
+Resize Canvas
+
+* ⌘ + N
+
+New Layer
+
+* ⌘ + J
+
+New Layer via Copy
+
+* ⌘ + ⇧ + J
+
+New Layer via Cut
+
+* ⌘ + G
+
+Group Layers
+
+* ⌘ + ⇧ + G
+
+Ungroup Layers
+
+* ⌘ + ⇧ + ]
+
+Bring to Front
+
+* ⌘ + ]
+
+Bring Forward
+
+* ⌘ + [
+
+Send Backward
+
+* ⌘ + ⇧ + [
+
+Send to Back
+
+* ⌘ + E
+
+Merge Layers
+
+* ⌘ + ⇧ + E
+
+Merge Visible
+
+#### Opacity
+
+* 1
+
+10% Opacity
+
+* 2
+
+20% Opacity
+
+* 3
+
+30% Opacity
+
+* 4
+
+40% Opacity
+
+* 5
+
+50% Opacity
+
+* 6
+
+60% Opacity
+
+* 7
+
+70% Opacity
+
+* 8
+
+80% Opacity
+
+* 9
+
+90% Opacity
+
+* 0
+
+100% Opacity
+
+#### General
+
+* ⌘ + N
+
+New File
+
+* ⌘ + S
+
+Save
+
+* ⌘ + ⇧ + S
+
+Save As
+
+* ⌘ + ⇧ + ⌥ + S
+
+Save for Web & Devices
+
+* ⌘ + O
+
+Open
+
+* ⌘ + Q
+
+Quit
+
+* ⌘ + W
+
+Close
+
+* ⌘ + P
+
+Print
+
+* ⌘ + Z
+
+Undo/Redo
+
+* ⌘ + ⇧ + Z
+
+Step Forward
+
+* ⌘ + ⌥ + Z
+
+Step Backward
+
+* ⌘ + X
+
+Cut
+
+* ⌘ + C
+
+Copy
+
+* ⌘ + V
+
+Paste
+
+* ⌘ + K

+ 76 - 0
docs/localhost/apple.md

@@ -0,0 +1,76 @@
+# Apple
+
+
+#### Apple MacOS
+
+##### Cleanup Script
+```
+curl -o cleanup https://code.davidawindham.com/cleaner/cleanup.sh
+chmod +x cleanup
+sudo mv cleanup /usr/local/bin/cleanup
+sh /usr/local/bin/cleanup
+
+```
+
+()
+
+```sh
+
+#!/usr/bin/env bash
+
+bytesToHuman() {
+    b=${1:-0}; d=''; s=0; S=(Bytes {K,M,G,T,E,P,Y,Z}iB)
+    while ((b > 1024)); do
+        d="$(printf ".%02d" $((b % 1024 * 100 / 1024)))"
+        b=$((b / 1024))
+        let s++
+    done
+    echo "$b$d ${S[$s]} of space was cleaned up :3"
+}
+
+if [ "$EUID" -ne 0  ]; then
+	echo "Please run as root"
+	exit
+fi
+
+oldAvailable=$(df / | tail -1 | awk '{print $4}')
+
+echo 'Empty the Trash on all mounted volumes and the main HDD...'
+sudo rm -rfv /Volumes/*/.Trashes &>/dev/null
+sudo rm -rfv ~/.Trash &>/dev/null
+
+echo 'Clear System Log Files...'
+sudo rm -rfv /private/var/log/asl/*.asl &>/dev/null
+sudo rm -rfv /Library/Logs/DiagnosticReports/* &>/dev/null
+sudo rm -rfv /Library/Logs/Adobe/* &>/dev/null
+rm -rfv ~/Library/Containers/com.apple.mail/Data/Library/Logs/Mail/* &>/dev/null
+rm -rfv ~/Library/Logs/CoreSimulator/* &>/dev/null
+
+
+echo 'Clear Adobe Cache Files...'
+sudo rm -rfv ~/Library/Application\ Support/Adobe/Common/Media\ Cache\ Files/* &>/dev/null
+
+echo 'Cleanup XCode Derived Data and Archives...'
+rm -rfv ~/Library/Developer/Xcode/DerivedData/* &>/dev/null
+rm -rfv ~/Library/Developer/Xcode/Archives/* &>/dev/null
+
+echo 'Cleanup Homebrew Cache...'
+brew cleanup --force -s &>/dev/null
+brew cask cleanup &>/dev/null
+rm -rfv /Library/Caches/Homebrew/* &>/dev/null
+brew tap --repair &>/dev/null
+
+echo 'Cleanup any old versions of gems'
+gem cleanup &>/dev/null
+
+echo 'Purge inactive memory...'
+sudo purge
+
+clear && echo 'Success!'
+
+newAvailable=$(df / | tail -1 | awk '{print $4}')
+count=$((newAvailable-oldAvailable))
+count=$(( $count * 512))
+bytesToHuman $count
+
+```

+ 261 - 0
docs/localhost/brew.md

@@ -0,0 +1,261 @@
+# Homebrew
+
+[http://docs.brew.sh/](http://docs.brew.sh/)  
+[https://github.com/Homebrew/brew/](https://github.com/Homebrew/brew/)
+
+```
+//
+
+brew help
+brew update
+brew outdated
+brew upgrade
+brew upgrade <formula>
+
+brew doctor
+
+//stop certain formulae from being updated
+brew pin <formula>
+brew unpin <formula>
+
+//see what's being cleaned up
+brew cleanup -n
+brew cleanup
+brew cleanup <formula>
+
+```
+
+#### kegs
+01/20/20:
+```
+david@macs:~ » brew -v    
+Homebrew 2.2.5
+Homebrew/homebrew-core (git revision a79229; last commit 2020-02-06)
+Homebrew/homebrew-cask (git revision 12439; last commit 2020-02-06)
+
+david@macs:~ » brew list --versions
+adns 1.5.1 aom 1.0.0
+apr 1.7.0
+apr-util 1.6.1_3
+argon2 20190702_1
+aspell 0.60.8
+autoconf 2.69
+automake 1.16.1_1
+boost 1.72.0
+brew-cask 0.60.1
+brotli 1.0.7
+c-ares 1.15.0
+cairo 1.16.0_2
+composer 1.9.3
+curl-openssl 7.68.0
+dnsmasq 2.80
+faac 1.29.9.2
+ffmpeg 4.2.2_1
+flac 1.3.3
+fontconfig 2.13.1
+freetds 1.1.24
+freetype 2.10.1
+frei0r 1.7.0
+fribidi 1.0.8
+gdbm 1.18.1
+gettext 0.20.1
+giflib 5.2.1
+gist 5.0.0
+glib 2.62.4
+gmp 6.1.2_2
+gnupg 2.2.19
+gnutls 3.6.12
+graphite2 1.3.13
+harfbuzz 2.6.4
+heroku 7.37.0
+heroku-node 12.13.0
+httpd 2.4.41_1
+httrack 3.49.2_1
+icu4c 64.2
+ilmbase 2.4.0
+imagemagick 7.0.9-21
+jansson 2.12
+jemalloc 5.2.1
+jpeg 9d
+lame 3.100
+leptonica 1.79.0
+libass 0.14.0_1
+libassuan 2.5.3
+libbluray 1.1.2
+libde265 1.0.5
+libev 4.31
+libevent 2.1.11_1
+libffi 3.2.1
+libgcrypt 1.8.5
+libgpg-error 1.36
+libheif 1.6.2
+libidn 1.35
+libidn2 2.3.0
+libksba 1.3.5
+libmetalink 0.1.3
+libogg 1.3.4
+libomp 9.0.1
+libpng 1.6.37
+libpq 12.1_1
+libpqxx 6.4.5_4
+libsamplerate 0.1.9_1
+libsndfile 1.0.28
+libsodium 1.0.18_1
+libsoxr 0.1.3
+libssh2 1.9.0_1
+libtasn1 4.16.0
+libtiff 4.1.0
+libtool 2.4.6_1
+libunistring 0.9.10
+libusb 1.0.23
+libvidstab 1.1.0
+libvorbis 1.3.6
+libvpx 1.8.2
+libxml2 2.9.10
+libyaml 0.2.2
+libzip 1.6.1
+little-cms2 2.9
+lzo 2.10
+makedepend 1.0.6
+mcrypt 2.6.8
+mhash 0.9.9.9
+ncurses 6.1_1
+nettle 3.4.1
+nghttp2 1.40.0
+nginx 1.17.8
+ngrok 1.7.1
+node 13.8.0
+npth 1.6
+nvm 0.35.2
+oniguruma 6.9.4
+opencore-amr 0.1.5
+openexr 2.4.0
+openjpeg 2.3.1
+openldap 2.4.49
+openssl 1.0.2s
+openssl@1.1 1.1.1d
+opus 1.3.1
+p11-kit 0.23.20
+pcre 8.43
+php 7.4.2
+phpunit 8.5.2
+pinentry 1.1.0_1
+pixman 0.38.4
+pkg-config 0.29.2
+postgresql 12.1
+python 3.7.6_1
+python@2 2.7.17_1
+readline 8.0.1
+redis 5.0.7
+rtmpdump 2.4+20151223_1
+rubberband 1.8.2_1
+sdl2 2.0.10
+shared-mime-info 1.15
+snappy 1.1.8
+speex 1.2.0
+sphinx-doc 2.3.1
+sqlite 3.31.1
+tesseract 4.1.1
+texi2html 5.0
+theora 1.1.1
+tidy-html5 5.6.0
+unbound 1.9.6
+unixodbc 2.3.7
+webp 1.1.0
+wp-cli 2.4.0
+x264 r2917_1
+x265 3.2.1
+xvid 1.3.7
+xz 5.2.4
+yarn 1.22.0
+yasm 1.3.0_2
+zlib 1.2.11
+zsh-history-substring-search 1.0.2
+zsh-syntax-highlighting 0.6.0
+```
+
+```
+david@macs:~ » brew list
+adns		gist		libffi		libxml2		node		pinentry	xz
+autoconf	gmp		libgcrypt	libyaml		npth		pkg-config	yasm
+automake	gnupg		libgpg-error	makedepend	nvm		readline	zlib
+brew-cask	gnutls		libksba		mcrypt		openssl		redis
+dnsmasq		httrack		libpng		mhash		openssl@1.1	texi2html
+faac		icu4c		libtasn1	mongodb		p11-kit		unixodbc
+ffmpeg		jpeg		libtool		nettle		pcre		wp-cli
+freetype	lame		libunistring	nginx		php70		x264
+gettext		libassuan	libusb		ngrok		php70-mcrypt	xvid
+```
+```
+08/17/17
+
+david@macs:~/sites/juryd-2 » brew outdated
+apr (1.5.2_3) < 1.6.2
+apr-util (1.5.4_4) < 1.6.0
+automake (1.15) < 1.15.1
+dnsmasq (2.76) < 2.77_3
+faac (1.28) < 1.29
+ffmpeg (3.3.1) < 3.3.3
+gnupg (2.1.21) < 2.1.23
+gnutls (3.5.12) < 3.5.14
+homebrew/apache/httpd24 (2.4.25) < 2.4.27
+httrack (3.49.1) < 3.49.2
+icu4c (58.2) < 59.1
+jpeg (8d) < 9b
+libgcrypt (1.7.6) < 1.8.0
+libpng (1.6.29) < 1.6.31
+libtasn1 (4.10) < 4.12
+libxml2 (2.9.4_2) < 2.9.4_3
+mongodb (3.4.4) < 3.4.7
+nginx (1.12.0_1) < 1.12.1
+node (7.10.0) < 8.4.0
+npth (1.4) < 1.5
+openssl (1.0.2k) < 1.0.2l
+openssl@1.1 (1.1.0e) < 1.1.0f
+p11-kit (0.23.5) < 0.23.7
+pcre (8.40) < 8.41
+homebrew/php/php70 (7.0.18_10) < 7.0.22_14
+homebrew/php/php70-mcrypt (7.0.18_10) < 7.0.22_14
+homebrew/php/php71 (7.1.5_17) < 7.1.8_20
+redis (3.2.9) < 4.0.1
+homebrew/php/wp-cli (1.1.0) < 1.3.0
+x264 (r2748) < r2795
+yarn (0.24.5) < 0.27.5_1
+yasm (1.3.0) < 1.3.0_1
+david@macs:~/sites/juryd-2 » brew upgrade nginx
+
+```
+
+#### PHP 7.1 Upgrade
+After removing old homebrew php versions, built in apache wouldn't start.
+[https://github.com/Homebrew/homebrew-php/issues/3601](https://github.com/Homebrew/homebrew-php/issues/3601)
+
+```
+david@macs:~ » sudo apachectl configtest
+httpd: Syntax error on line 118 of /private/etc/apache2/httpd.conf: Cannot load /usr/local/opt/php70/libexec/apache2/libphp7.so into server: dlopen(/usr/local/opt/php70/libexec/apache2/libphp7.so, 10): image not found
+
+david@macs:~ » sudo vi /etc/apache2/httpd.conf
+//comment out old php
+//#LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so
+//LoadModule php7_module /usr/local/opt/php71/libexec/apache2/libphp7.so
+
+//update x-code build tools
+david@macs:~ » xcode-select --install
+
+david@macs:~ » brew install php71 --with-httpd24
+
+//load into .zshrc
+export PATH="$(brew --prefix homebrew/php/php71)/bin:$PATH"
+
+david@macs:~ » sudo apachectl restart
+[Mon May 22 10:23:46.853689 2017] [so:warn] [pid 11606] AH01574: module php7_module is already loaded, skipping
+
+david@macs:~ » brew unlink httpd24
+// see issue #3601 above
+
+david@macs:~ » sudo apachectl configtest
+Password:
+Syntax OK
+david@macs:~ » sudo apachectl restart
+
+```

+ 88 - 0
docs/localhost/chrome.md

@@ -0,0 +1,88 @@
+# Chrome
+
+Open --kiosk mode
+```
+/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --kiosk --app=https://www.amazon.com/video&etc
+
+```
+
+Tab and window shortcuts
+
+| ----- |
+| **Action** |  **Shortcut** |  
+| Open a new window |  **⌘ + n** |  
+| Open a new window in Incognito mode |  **⌘ + Shift + n** |  
+| Open a new tab, and jump to it |  **⌘ + t** |  
+| Reopen the last closed tab, and jump to it |  **⌘ + Shift + t** |  
+| Jump to the next open tab |  **⌘ + Option + Right arrow** |  
+| Jump to the previous open tab |  **⌘ + Option + Left arrow** |  
+| Jump to a specific tab |  **⌘ + 1** through **⌘ + 8** |  
+| Jump to the last tab |  **⌘ + 9** |  
+| Open the previous page in your browsing history for the current tab |  **⌘ + [** or **⌘ + Left arrow** |  
+| Open the next page in your browsing history for the current tab |  **⌘ + ]** or **⌘ + Right arrow** |  
+| Closes the current tab or pop-up |  **⌘ + w** |  
+| Closes the current window |  **⌘ + Shift + w** |  
+| Minimize the window |  **⌘ + m** |  
+| Hide Google Chrome |  **⌘ + h** |  
+| Quit Google Chrome |  **⌘ + q** |
+
+Google Chrome feature shortcuts
+
+| ----- |
+| **Action** |  **Shortcut** |  
+| Show or hide the Bookmarks Bar |  **⌘ + Shift + b** |  
+| Open the Bookmark Manager |  **⌘ + Option + b** |  
+| Open the Settings page in a new tab |  **⌘ + ,** |  
+| Open the History page in a new tab |  **⌘ + y** |  
+| Open the Downloads page in a new tab |  **⌘ + Shift + j** |  
+| Open the Find Bar to search the current page |  **⌘ + f** |  
+| Jump to the next match to your Find Bar search |  **⌘ + g** |  
+| Jump to the previous match to your Find Bar search |  **⌘ + Shift + g** |  
+| When Find Bar is open, search for selected text |  **⌘ + e** |  
+| Open Developer Tools |  **⌘ + Option + i** |  
+| Open the Clear Browsing Data options |  **⌘ + Shift + Delete** |  
+| Log in as a different user or browse as a Guest |  **⌘ + Shift + m** |
+
+Address bar shortcuts
+
+Use the following shortcuts in the address bar:
+
+| ----- |
+| **Action** |  **Shortcut** |  
+| Search with your default search engine |  Type a search term **\+ Enter** |  
+| Search using a different search engine |  Type a search engine name **+ Tab** |  
+| Add `www.` and `.com` to a site name, and open it in the current tab |  Type a site name **+ Control + Enter** |  
+| Add `www.` and `.com` to a site name, and open it in a new tab |  Type a site name **+** **Control + Shift + Enter** |  
+| Open the website in a new background tab |  Type a web address **+ ⌘ + Enter** |  
+| Jump to the address bar |  **⌘ + l** |  
+| Remove predictions from your address bar |  **Down arrow** to highlight **+ Shift + fn + Delete** |
+
+Webpage shortcuts
+
+| ----- |
+| **Action** |  **Shortcut** |  
+| Open options to print the current page |  **⌘ + p** |  
+| Open options to save the current page |  **⌘ + s** |  
+| Open the Page Setup dialog |  **⌘ + Option + p** |  
+| Email your current page |  **⌘ + Shift + i** |  
+| Reload your current page |  **⌘ + r** |  
+| Reload your current page, ignoring cached content |  **⌘ + Shift + r** |  
+| Stop the page loading |  **Esc** |  
+| Browse clickable items moving forward |  **Tab** |  
+| Browse clickable items moving backward |  **Shift + Tab** |  
+| Open a file from your computer in Google Chrome |  **⌘ + o +** Select a file |  
+| Display non-editable HTML source code for the current page |  **⌘ + Option + u** |  
+| Open the JavaScript Console |  **⌘ + Option + j** |  
+| Save your current webpage as a bookmark |  **⌘ + d** |  
+| Save all open tabs as bookmarks in a new folder |  **⌘ + Shift + d** |  
+| Turn full-screen mode on or off |  **⌘ + Ctrl + f** |  
+| Make everything on the page bigger |  **⌘ and +** |  
+| Make everything on the page smaller |  **⌘ and -** |  
+| Return everything on the page to the default size |  **⌘ + 0** |  
+| Scroll down a webpage, a screen at a time |  **Space** |  
+| Scroll up a webpage, a screen at a time |  **Shift + Space** |  
+| Search the web |  **⌘ + Option + f** |  
+| Move your cursor to the front of the previous word in a text field |  **Option + Left arrow** |  
+| Move your cursor to the back of the next word in a text field |  **Option + Right arrow** |  
+| Delete the previous word in a text field |  **Option + Delete** |  
+| Open your home page in the current tab |  **⌘ + Shift + h** |

+ 119 - 0
docs/localhost/macs.md

@@ -0,0 +1,119 @@
+# macs
+my main machine
+#### [https://davidawindham.com/anthropomorphizing-machines/](https://davidawindham.com/anthropomorphizing-machines/)
+
+#### notes:
+
+using mkcert
+```sh
+david@macs:/usr/local/etc/httpd/ssl » openssl version                                                                      130 ↵
+OpenSSL 1.1.1d  10 Sep 2019
+brew install mkcert nss
+cd ~
+mkcert daw.macs
+    Run "mkcert -install" to avoid verification errors ‼️
+sudo mv daw.macs.pem /usr/local/etc/httpd/ssl/
+sudo vi /usr/local/httpd/extra/httpd-vhosts.conf httpd-vhosts.conf
+```
+
+while migrating a bunch of websites around I had to be able to switch versions of php easily to test them. hat tip [https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions](https://getgrav.org/blog/macos-catalina-apache-multiple-php-versions)
+
+```sh
+brew install php@7.2
+brew install php@7.4
+curl -L https://gist.githubusercontent.com/rhukster/f4c04f1bf59e0b74e335ee5d186a98e2/raw > /usr/local/bin/sphp
+chmod +x /usr/local/bin/sphp
+sphp 7.2
+sphp 7.4
+
+############### had to redo pecl in 7.4.2 -> 7.4.4 update ######
+### https://davidawindham.com/til/lang/php.html
+
+david@macs:~ » php --ini  
+Configuration File (php.ini) Path: /usr/local/etc/php/7.4  
+Loaded Configuration File:         /usr/local/etc/php/7.4/php.ini  
+extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/imagick.so  
+extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/mcrypt.so  
+extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/redis.so  
+zend_extension=/usr/local/Cellar/php/7.4.2/pecl/20190902/xdebug.so  
+
+LoadModule deflate_module libexec/apache2/mod_deflate.so  
+LoadModule expires_module libexec/apache2/mod_expires.so  
+LoadModule rewrite_module libexec/apache2/mod_rewrite.so  
+
+david@macs:~ » pecl list  
+imagick 3.4.4   stable  
+mcrypt  1.0.3   stable  
+redis   5.1.1   stable  
+xdebug  2.9.1   stable
+
+################ I keep starting the built in Apache ###############
+## stop using this version
+sudo launchctl unload -w /System/Library/LaunchDaemons/org.apache.httpd.plist 2>/dev/null
+
+brew services start httpd
+sudo vi /usr/local/etc/httpd/httpd.conf
+sudo vi /usr/local/etc/httpd/extra/httpd-ssl.conf
+ErrorLog "/usr/local/var/log/httpd/error_log"
+CustomLog "/usr/local/var/log/httpd/access_log" common
+
+sudo apachectl -k restart
+
+```
+* 20/03/29 - brew ls
+
+
+```sh
+brew list
+david@macs:/usr/local/etc/php/7.4 » brew list                                                        127 ↵
+adns				libassuan			openexr
+aom				libbluray			openjpeg
+apr				libde265			openldap
+apr-util			libev				openssl
+argon2				libevent			openssl@1.1
+aspell				libffi				opus
+autoconf			libgcrypt			p11-kit
+automake			libgpg-error			pandoc
+boost				libheif				pcre
+brew-cask			libidn				php
+brotli				libidn2				php@7.2
+c-ares				libksba				phpunit
+cairo				libmetalink			pinentry
+composer			libogg				pixman
+curl-openssl			libomp				pkg-config
+dnsmasq				libpng				postgresql
+faac				libpq				python
+ffmpeg				libpqxx				python@2
+flac				libsamplerate			readline
+fontconfig			libsndfile			redis
+freetds				libsodium			rtmpdump
+freetype			libsoxr				rubberband
+frei0r				libssh2				sdl2
+fribidi				libtasn1			shared-mime-info
+gdbm				libtiff				snappy
+gettext				libtool				speex
+giflib				libunistring			sphinx-doc
+gist				libusb				sqlite
+glib				libvidstab			tesseract
+gmp				libvorbis			texi2html
+gnupg				libvpx				theora
+gnutls				libxml2				tidy-html5
+go				libyaml				tmux
+graphite2			libzip				unbound
+harfbuzz			little-cms2			unixodbc
+heroku				lzo				utf8proc
+heroku-node			makedepend			webp
+httpd				mcrypt				wp-cli
+httpd24				mhash				x264
+httrack				ncurses				x265
+icu4c				nettle				xvid
+ilmbase				nghttp2				xz
+imagemagick			nginx				yarn
+jansson				ngrok				yasm
+jemalloc			node				zlib
+jpeg				npth				zsh-history-substring-search
+lame				nvm				zsh-syntax-highlighting
+leptonica			oniguruma
+libass				opencore-amr
+david@macs:/usr/local/etc/php/7.4 »
+```

+ 3 - 0
docs/localhost/ngrok.md

@@ -0,0 +1,3 @@
+# ngrok  
+
+- [https://ngrok.com/docs](https://ngrok.com/docs)

+ 111 - 0
docs/localhost/sketch.md

@@ -0,0 +1,111 @@
+# Sketch
+
+# Sketch Keyboard Shortcuts
+
+### Application
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>⌘</kbd> <kbd>,</kbd> | Preferences |
+| <kbd>⌘</kbd> <kbd>H</kbd> | Hide Sketch |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>H</kbd> | Hide Others |
+| <kbd>⌘</kbd> <kbd>Q</kbd> | Quit Sketch |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>Q</kbd> | Quit and Close All Windows |
+
+### Layers
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>Tab</kbd> / <kbd>⇧</kbd> <kbd>Tab</kbd> | Cycle Through Layers in the Current Group |
+| <kbd>⌘</kbd> <kbd>R</kbd> | Rename Current Layer/Group |
+| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>H</kbd> | Hide/Show Layer/Group |
+| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>L</kbd> | Lock/Unlock Layer/Group |
+| <kbd>⏎</kbd> | Enter Group |
+| <kbd>Escape</kbd> | Collapse Current Group |
+
+### General
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>Space</kbd> | Hand Tool |
+| <kbd>Z</kbd> | Zoom Tool |
+| <kbd>Escape</kbd> | Exit Current Tool |
+| <kbd>⌘</kbd> <kbd>2</kbd> | Zoom to Selected Layers |
+| <kbd>⌘</kbd> <kbd>3</kbd> | Scroll to Selected Layers |
+
+
+
+### File
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>⌘</kbd> <kbd>N</kbd> | New |
+| <kbd>⌘</kbd> <kbd>O</kbd> | Open |
+| <kbd>⌘</kbd> <kbd>W</kbd> | Close |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>W</kbd> | Close All |
+| <kbd>⌘</kbd> <kbd>S</kbd> | Save |
+| <kbd>⌥</kbd> <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>S</kbd> | Save As |
+| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>S</kbd> | Duplicate |
+| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>E</kbd> | Export |
+| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>P</kbd> | Page Setup |
+
+### Edit
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>⌘</kbd> <kbd>Z</kbd> | Undo |
+| <kbd>⇧</kbd> <kbd>⌘</kbd> <kbd>Z</kbd> | Redo |
+| <kbd>⌘</kbd> <kbd>X</kbd> | Cut |
+| <kbd>⌘</kbd> <kbd>C</kbd> | Copy |
+| <kbd>⌘</kbd> <kbd>V</kbd> | Paste |
+| <kbd>⌘</kbd> <kbd>D</kbd> | Duplicate |
+| <kbd>⌘</kbd> <kbd>A</kbd> | Select All |
+| <kbd>⌘</kbd> <kbd>:</kbd> | Show Spelling and Grammar |
+| <kbd>⏎</kbd> | Edit Currently Selected Layer |
+| <kbd>⌃</kbd> <kbd>C</kbd>  | Clone colour |
+
+### Insert
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>V</kbd> | Vector |
+| <kbd>P</kbd> | Pencil |
+| <kbd>L</kbd> | Line |
+| <kbd>R</kbd> | Rectangle |
+| <kbd>O</kbd> | Oval |
+| <kbd>U</kbd> | Rounded Rectangle |
+| <kbd>T</kbd> | Text |
+
+### Format
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>⌘</kbd> <kbd>B</kbd> | Bold |
+| <kbd>⌘</kbd> <kbd>I</kbd> | Italic |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>=</kbd> | Bigger |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>-</kbd> | Smaller |
+
+### Arrange
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>⌘</kbd> <kbd>F</kbd> | Find Layer |
+
+### View
+
+| Shortcut | Description |
+| -------- | ----------- |
+| <kbd>⌘</kbd> <kbd>+</kbd> | Zoom In |
+| <kbd>⌘</kbd> <kbd>-</kbd> | Zoom Out |
+| <kbd>⌘</kbd> <kbd>0</kbd> | Actual Size |
+| <kbd>⌘</kbd> <kbd>1</kbd> | Center Canvas |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>1</kbd> | Toggle Layers List |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>2</kbd> | Toggle Inspector |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>3</kbd> | Toggle Layers and Inspector |
+| <kbd>⌃</kbd> <kbd>R</kbd> | Toggle Rulers |
+| <kbd>⌃</kbd> <kbd>G</kbd> | Toggle Grid |
+| <kbd>⌃</kbd> <kbd>P</kbd> | Toggle Pixels |
+| <kbd>⌃</kbd> <kbd>L</kbd> | Toggle Layer Guides |
+| <kbd>⌃</kbd> <kbd>H</kbd> | Toggle Selection Handles |
+| <kbd>⌥</kbd> <kbd>⌘</kbd> <kbd>T</kbd> | Toggle Toolbar |
+| <kbd>⌃</kbd> <kbd>⌘</kbd> <kbd>F</kbd> | Enter Full Screen |

+ 1 - 0
docs/projects/dw.md

@@ -0,0 +1 @@
+#### DW

+ 2 - 0
docs/projects/gzet.md

@@ -0,0 +1,2 @@
+# GZET
+* [https://gzet.net](https://gzet.net)

+ 92 - 0
docs/projects/juryd.md

@@ -0,0 +1,92 @@
+# Juryd
+* [https://juryd.com](https://juryd.com)
+* [https://beta.juryd.com](https://beta.juryd.com)
+
+
+#### Build Structure
+
+* [Babel](https://babeljs.io/)
+* [webpack](https://webpack.js.org/)
+
+##### Testing
+
+
+#### Front End
+
+* [React](https://facebook.github.io/react/)
+	* [React Storybooks](https://storybooks.js.org/)
+* [Redux](http://redux.js.org/)
+* [socket.io](https://github.com/socketio/socket.io/)
+* [next.js](https://github.com/zeit/next.js)
+
+#### API
+
+* [Feathers.js](https://docs.feathersjs.com)
+
+#### Mobile/Desktop
+
+
+* [React Native](https://facebook.github.io/react-native/)
+	* [Expo](https://expo.io/)
+	* [Expo Docs](https://docs.expo.io/)
+* [photon](https://github.com/connors/photon)
+* [electron](https://github.com/electron/electron)
+	* [react native desktop](https://github.com/ptmt/react-native-macos)
+
+
+#### Database
+
+* MongoDB
+	* [http://mongoosejs.com/docs/guide.html](http://mongoosejs.com/docs/guide.html)
+
+
+
+#### Payment Processing
+
+* [Node.js library for the Stripe API](https://github.com/stripe/stripe-node)
+* [Stripe - Docs](https://stripe.com/docs)
+	* [Stripe - Saving credit card details for later](https://stripe.com/docs/charges#saving-credit-card-details-for-later)
+	```
+	# get the credit card details submitted by the form or app
+	token = params[:stripeToken]
+
+	# create a Customer
+	customer = Stripe::Customer.create(
+	  card: token,
+	  description: 'description for payinguser@example.com',
+	  email: 'payinguser@example.com'
+	)
+
+	# charge the Customer instead of the card
+	Stripe::Charge.create(
+	    amount: 1000, # in cents
+	    currency: 'usd',
+	    customer: customer.id
+	)
+
+	# save the customer ID in your database so you can use it later
+	save_stripe_customer_id(user, customer.id)
+
+	# later
+	customer_id = get_stripe_customer_id(user)
+
+	Stripe::Charge.create(
+	    amount: 1500, # $15.00 this time
+	    currency: 'usd',
+	    customer: customer_id
+	)
+	```
+
+#### Legal
+
+- [https://stripe.com/atlas](https://stripe.com/atlas)
+
+#### Conceptual
+
+#### Other
+
+[https://en.wikipedia.org/wiki/Pay_to_play](https://en.wikipedia.org/wiki/Pay_to_play)
+
+##### Related Articles
+[Celery Joins Forces With Indiegogo](https://blog.trycelery.com/celery-joins-forces-with-indiegogo/)  
+[Can the web save the press from oblivion?](https://www.theguardian.com/media/2016/apr/17/can-internet-save-printed-press-blendle-lumi)

+ 280 - 0
docs/projects/pants.md

@@ -0,0 +1,280 @@
+# Peoples Pants
+* [https://peoplespants.com](https://peoplespants.com)
+
+#### Build Structure
+
+* [Babel](https://babeljs.io/)
+* [webpack](https://webpack.js.org/)
+
+#### Front End
+* [Vuejs](https://vuejs.org/v2/guide/)
+
+#### Back
+* [Laravel](/docs/host/laravel)  
+
+#### Testing
+* [Laravel Dusk](https://laravel.com/docs/5.7/dusk)  
+#### API
+
+#### Mobile
+* [Weex](https://weex.incubator.apache.org/guide/)
+
+#### Database
+* [MySQL](https://www.mysql.com/)
+
+#### Payment Processing
+* [Stripe - Docs](https://stripe.com/docs)
+
+
+#### Legal
+- [Atlas](https://stripe.com/atlas)
+
+#### Conceptual
+
+#### Other
+
+#### Related
+
+## Pants
+( see projects/[pants.md](/projects/pants.md) )
+
+```sh
+//********* Ubuntu 18.04 ( Pants )****//
+
+74.207.225.78
+2600:3c02::f03c:91ff:fe21:88ca
+root@74.207.225.78
+sudo apt update && sudo apt upgrade
+adduser user
+adduser user sudo
+logout
+user@74.207.225.78
+
+sudo vi /etc/hosts
+IP FQDN hostname
+
+ssh-keygen -b 4096
+scp ~/.ssh/id_rsa.pub user@74.207.225.78:~/.ssh/authorized_keys
+
+/etc/ssh/sshd_config
+PermitRootLogin no
+PasswordAuthentication no
+Port ####
+PubkeyAuthentication yes
+sudo systemctl restart sshd
+
+sudo apt-get install ufw
+sudo ufw enable
+ufw allow OpenSSH
+ufw app list
+ufw status verbose
+sudo ufw allow/deny from IP
+sudo ufw allow :PORT
+
+sudo apt install apache2
+sudo a2dismod mpm_event
+sudo a2enmod mpm_prefork
+sudo vi /etc/apache2/mods-available/mpm_event.comf
+sudo vi /etc/apache2/mods-available/mpm_prefork.conf
+sudo ufw allow 'Apache Full'
+sudo systemctl reload apache2
+
+sudo a2ensite blank.conf
+sudo service apache2 restart
+->add your username to the group adm to access apache logs
+sudo usermod -aG adm
+
+sudo add-apt-repository ppa:certbot/certbot
+sudo apt install python-certbot-apache
+sudo certbot --apache -d example.com
+->backup /etc/letsencrypt
+
+sudo apt install git
+git config --global user.name "Your Name"
+git config --global user.email "youremail@domain.com"
+
+sudo apt-get install zsh
+sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
+sudo vi .zshrc
+
+sudo apt install mysql-server
+sudo mysql_secure_installation
+mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
+mysql> FLUSH PRIVILEGES;
+mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+create user 'testuser'@'localhost' identified by 'password';
+grant all on testdb.* to 'testuser';
+mysql> update mysql.user set user='' where user='root';
+-> list users
+SELECT user,authentication_string,plugin,host FROM mysql.user;
+
+
+curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl
+
+sudo apt install mysqltuner
+mysqltuner
+
+sudo apt install php libapache2-mod-php php-mysql
+--> sudo apt install php-curl php-json php-cgi
+sudo vi /etc/apache2/mods-enabled/dir.conf
+apt search php- | less
+
+sudo apt install php7.2-mbstring
+sudo apt install php-xml
+sudo apt install wget php-cli php-zip unzip
+sudo apt install curl
+
+/etc/php/7.2/apache2/php.ini
+error_reporting = E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_ERROR | E_CORE_ERROR
+max_input_time = 30
+memory_limit - 256M
+error_log = /var/log/php/error.log
+sudo mkdir /var/log/php
+sudo chown www-data /var/log/php
+
+<Directory /var/www/>
+	Options Indexes FollowSymLinks
+	AllowOverride None
+	Require all granted
+</Directory>
+
+sudo systemctl restart apache2
+-> list all apache modules
+sudo apache2ctl -M
+-> apache2/apache2.conf
+<IfModule http2_module>
+    LogLevel http2:info
+</IfModule>
+
+--> Apache 2.4.27, HTTP/2 not supported in prefork
+sudo a2dismod php7.2
+sudo a2dismod mpm_prefork
+sudo a2enmod php7.2
+sudo apt install php7.2-fpm
+sudo vi /etc/php/7.2/fpm/php.ini
+--> memory/uploads/execution_time etc.
+
+sudo apt install mod_proxy_fcgi
+sudo a2enmod actions fastcgi alias proxy_fcgi
+sudo apache2ctl -M
+
+<VirtualHost *:443>
+	Protocols h2 http/1.1
+</VirtualHost>
+<FilesMatch \.php$>
+	SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
+</FilesMatch>
+<Proxy "fcgi://localhost/">
+</Proxy>
+
+ -->Tune Apache fpm https://medium.com/@sbuckpesch/apache2-and-php-fpm-performance-optimization-step-by-step-guide-1bfecf161534
+https://blog.getpolymorph.com/7-tips-for-heavy-load-testing-with-apache-bench-b1127916b7b6
+
+sudo vi /etc/apache2/mods-enabled/mpm_event.conf
+ <IfModule mpm_event_module>
+         StartServers             2
+         MinSpareThreads          25
+         MaxSpareThreads          75
+         ThreadLimit              64
+         ThreadsPerChild          25
+         MaxRequestWorkers        150
+         MaxConnectionsPerChild   100
+ </IfModule>
+/etc/php/7.1/fpm/pool.d/www.conf
+sudo service php7.2-fpm restart
+sudo apachectl restart
+--> apache bench testing
+ab -n 500 -c 100 https://example.com:443/
+ab -n 1000 -c 100 https://example.com:443/
+
+sudo cp /etc/apache2/sites-available/example.com.conf /etc/apache2/sites-available/sh.example.com.conf
+sudo mkdir -p /var/www/sh.example.com/{html,log,backup}
+sudo chown david:www-data -R /var/www/sh.example.com/
+sudo a2ensite sh.example.com
+sudo apachectl restart
+
+sudo certbot --apache -d sh.example.com
+sudo apachectl restart
+
+  <Directory /var/www/example.com/html>
+          Options  FollowSymLinks
+          DirectoryIndex index.html index.php
+          AllowOverride All
+          Allow from all
+          Require all granted
+  </Directory>
+
+<FilesMatch \.php$>
+SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
+</FilesMatch>
+
+ProxyErrorOverride On
+
+ErrorDocument 403 /error/403.html
+ErrorDocument 404 /error/404.html
+ErrorDocument 500 /error/503.html
+ErrorDocument 502 /error/503.html
+ErrorDocument 503 /error/503.html
+ErrorDocument 504 /error/503.html
+
+-->enable mod_headers.c
+sudo a2enmod headers
+sudo a2enmod expires
+--> list all mods
+apache2ctl -M
+
+--> remove news/help from login
+sudo chmod 0644 /etc/update-motd.d/50-motd-news
+sudo chmod 0644 /etc/update-motd.d/10-help-text
+
+--> add pants
+sudo vi /etc/update-motd.d/05-pants
+#!/bin/sh
+printf "\n$(cat /etc/update-motd.d/pants.asc)\n"
+--> pants.asc
+.-.         .        .-.        .   
+|-'.-,.-..-.| .-,.-  |-'.-. .-.-|-.-
+'  `'-`-'|-''-`'--'  '  `-`-' ' '--'
+         '                          
+sudo chmod +x /etc/update-motd.d/20-display-logo
+
+
+sudo apt install redis-server
+sudo vi /etc/redis/redis.conf
+--> add under # supervision tree. Options:
+supervised systemd
+--> make sure it's binding to localhost
+bind 127.0.0.1 ::1
+--> add password
+openssl rand 60 | openssl base64 -A
+--> cp from .evn.production and paste to:
+# requirepass foobared (strong/long password)
+
+sudo systemctl restart redis.service
+sudo systemctl status redis
+
+redis-cli
+> ping
+> get test
+> exit
+
+sudo systemctl restart redis
+sudo netstat -lnp | grep redis
+redis-cli
+>auth your_redis_password
+>set key1 10
+>quit
+
+sudo vi /etc/redis/redis.conf
+--> diable dangerous redis commands
+rename-command FLUSHDB ""
+rename-command FLUSHALL ""
+rename-command DEBUG ""
+rename-command CONFIG ""
+
+sudo systemctl restart redis.service
+redis-cli
+> auth your_redis_password
+> exit
+
+```

+ 380 - 0
docs/projects/woozer.md

@@ -0,0 +1,380 @@
+
+
+
+21/03/17 - Migrated data centers on Woozer and had an issue with php7.2-fpm overriding the php7.4-fpm config. Looks like the auto php config defaulted it back and lost the sock. Had to replace the sock/pid for 7.4 monit and disable the 7.2-fpm.conf.
+```bash
+@woozer:/run/php » ls
+php7.2-fpm.pid  php7.2-fpm.sock  php7.4-fpm.pid  php7.4-fpm.sock  php8.0-fpm.pid  php8.0-fpm.sock  php-fpm.sock
+
+@woozer:/etc/apache2/conf-enabled » dpkg -l | grep libapache2-mod-php
+libapache2-mod-php                2:8.0
+libapache2-mod-php5               5.5.9
+libapache2-mod-php7.2             7.2.34
+libapache2-mod-php7.4             7.4.15
+libapache2-mod-php8.0             8.0.3-1
+
+sudo a2disconf php7.2-fpm.conf
+
+sudo update-alternatives --config php
+Selection    Path                  Priority   Status
+------------------------------------------------------------
+0            /usr/bin/php.default   100       auto mode
+1            /usr/bin/php.default   100       manual mode
+2            /usr/bin/php7.2        72        manual mode
+* 3          /usr/bin/php7.4        74        manual mode
+4            /usr/bin/php8.0        80        manual mode
+------------------------------------------------------------
+sudo apachectl configtest
+sudo systemctl reload apache2
+
+dev/monit:
+Process	Status	Uptime	CPU Total	Memory Total
+php7.4-fpm	OK	1h 34m	0.0%	4.2% [164.5 MB]
+php7-fpm	OK	10m	    0.0%	2.6% [102.2 MB]
+nginx	    OK	2h 7m	0.0%	0.2% [8.1 MB]
+mysql	    OK	2h 7m	0.0%	5.9% [229.2 MB]
+apache2	    OK	15m	    0.0%	1.5% [57.8 MB]
+
+```
+
+#### Ubuntu 20.04.01
+20/10/08 - Waited until the first point release to avoid bugs. Clean install:
+Deploy new Linode / Secure the server / Install packages / cp files and data / swap IP address / reboot
+
+```bash
+sudo apt-get update && sudo apt-get upgrade
+#### sudo apt-get dist-upgrade
+#### more cautious approach to packages held back from dependencies
+sudo apt-get --with-new-pkgs upgrade
+```
+
+20/03/28 - New crontab for recurring invoices and email notifications   
+
+```bash
+# create a cron for recurring invoices that runs everday at 9am
+crontab -e
+0 9 * * * wget -O - https://sandbox.davidawindham.com/invoice/invoices/cron/recur/'CRON-KEY' >/dev/null 2>&1
+```
+
+
+20/03/11 - had a DDOS issue and did some quick reconfigurations: Just making notes here wrote a post about it at [https:davidawindham.com/shall-we-play-a-game/](https:davidawindham.com/shall-we-play-a-game/):
+
+
+```bash  
+# mod_evasive
+sudo vi /etc/apache2/mods-enabled/evasive.conf
+rm these later - sudo apt remove / sudo apt purge
+bsd-mailx libapache2-mod-evasive postfix
+sudo a2dismod evasive
+sudo a2dismod evasive
+perl /usr/share/doc/libapache2-mod-evasive/examples/.pl
+
+# /etc/apache2/code.davidawindham.com-le-ssl.conf
+
+RewriteEngine on
+RewriteCond %{REQUEST_METHOD} ^(CONNECT|GET|HEAD|OPTIONS|POST|PROFIND|PUT) [NC]
+#RewriteRule ^(.*)$ http://%{REMOTE_ADDR}/ [R=301,L]
+RewriteRule (.*) http://chess.davidawindham.com$1 [R=301, L]
+<Proxy *>
+   Order deny,allow
+   Deny from all
+   Allow from (ip)
+</Proxy>
+~ or ~
+<Proxy *>
+   Require all granted
+</Proxy>
+<Location />
+   SetEnvIfNoCase User-Agent "SemrushBot" bad_bot
+   Deny from env=bad_bot
+   <RequireAll>
+      Require all granted
+      Include /etc/apache2/ipblacklist.conf
+   </RequireAll>
+</Location>
+
+# Monit dev/monit
+sudo iptables -A INPUT 14 -p tcp --dport 2812 -j ACCEPT
+sudo monit stop/start all/reload/check -t
+
+# Apache mod_status dev/server-status
+apachectl status
+sudo vi /etc/httpd/conf.d/server-status.conf
+
+sudo systemctl status apache2
+
+# UFW (Universal Firewall)
+sudo ufw enable/disable
+sudo ufw status numbered
+sudo ufw delete 2
+sudo ufw status verbose
+sudo ufw deny from (ip)
+
+# clear error logs
+sudo bash -c 'echo > error.log'
+
+# Remove the ufw chains in iptables
+for ufw in `sudo iptables -L |grep ufw|awk '{ print $2 }'`; do sudo iptables -F $ufw; done
+for ufw in `sudo iptables -L |grep ufw|awk '{ print $2 }'`; do sudo iptables -X $ufw; done
+
+for i in `sudo iptables -L INPUT --line-numbers |grep '[0-9].*ufw' | cut -f 1 -d ' ' | sort -r `; do sudo iptables -D INPUT $i ; done
+for i in `sudo iptables -L FORWARD --line-numbers |grep '[0-9].*ufw' | cut -f 1 -d ' ' | sort -r `; do sudo iptables -D FORWARD $i ; done
+for i in `sudo iptables -L OUTPUT --line-numbers |grep '[0-9].*ufw' | cut -f 1 -d ' ' | sort -r `; do sudo iptables -D OUTPUT $i ; done
+for i in `sudo iptables -L | grep 'Chain .*ufw' | cut -d ' ' -f 2`; do sudo iptables -X $i ; done
+
+# add nginx port back.
+sudo iptables -I INPUT 14 -p tcp --dport 8282 -j ACCEPT
+
+# block a bunch of bots - https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker
+sudo mkdir /etc/apache2/custom.d
+sudo vi /etc/apache2/apache2.conf
+	<Location "/">
+      AuthMerging And
+		Include custom.d/globalblacklist.conf
+	</Location>
+# ~ or e.g.~
+sudo vi /etc/apache2/sites-available/default.conf
+   <VirtualHost *:80>
+      <Directory "/var/www/html">
+         Include custom.d/globalblacklist.conf
+      </Directory>
+   </VirtualHost>
+
+# test it
+curl -A "googlebot" https://davidawindham.com/
+curl -A "SemrushBot" https://code.davidawindham.com/
+curl -A "masscan" https://code.davidawindham.com/
+curl -I https://davidawindham.com/ -e http://100dollars-seo.com
+curl -I https://davidawindham.com/ -e http://zx6.ru
+
+## don't log longview
+/etc/apache2/conf-available/other-vhosts-access-log.conf
+SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
+CustomLog ${APACHE_LOG_DIR}/other_vhosts_access.log vhost_combined env=!dontlog
+
+SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
+SetEnvIf Remote_Addr "::1" dontlog
+
+```
+
+- php version updates:  
+
+```bash
+sudo apt-get install php7.4-cli php7.4-fpm php7.4-bcmath php7.4-curl php7.4-gd php7.4-imagick php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-recode php7.4-tidy php7.4-xml php7.4-xmlrpc php7.4-zip
+sudo apt-get install php7.3-cli php7.3-fpm php7.3-bcmath php7.3-curl php7.3-gd php7.3-imagick php7.3-intl php7.3-json php7.3-mbstring php7.3-mysql php7.3-opcache php7.3-recode php7.3-tidy php7.3-xml php7.3-xmlrpc php7.3-zip
+sudo apt-get install php7.2-cli php7.2-fpm php7.2-bcmath php7.2-curl php7.2-gd php7.2-imagick php7.2-intl php7.2-json php7.2-mbstring php7.2-mysql php7.2-opcache php7.2-recode php7.2-tidy php7.2-xml php7.2-xmlrpc php7.2-zip
+sudo apt install php7.2-fpm
+sudo vi /etc/php/7.2/fpm/php.ini
+--> memory/uploads/execution_time etc.
+
+sudo apt install mod_proxy_fcgi
+sudo a2enmod actions fastcgi alias proxy_fcgi
+
+<VirtualHost *:443>
+    Protocols h2 http/1.1
+</VirtualHost>
+<FilesMatch \.php$>
+    SetHandler "proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost/"
+</FilesMatch>
+<Proxy "fcgi://localhost/">
+</Proxy>
+
+```
+- switch to mpm_event_module to support http/2  
+
+```bash
+# vi /etc/apache2/apache2.config
+
+Protocols h2 h2c http/1.1
+
+<IfModule http2_module>
+    LogLevel http2:info
+</IfModule>
+
+```
+
+20.2.21: System upgrade from 16.04 LTS to 18.04.4 LTS ( This machine has had three major version upgrades ).   
+
+
+```bash
+sudo apt-get update && sudo apt-get autoclean && sudo apt-get clean && sudo apt-get autoremove
+```
+
+```bash
+Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.4.10-x86_64-linode132 x86_64)
+
+	     .     . .              .       .  .
+	. . ...-..-| |-. .-. .-.-..-| .-.. ...-|
+	 ` ` '' '`-'-' '-`-`-' ' '`-'-`-`-` '`-'-
+
+0 packages can be updated.   
+0 updates are security updates.   
+
+david@woozer:~ » lsb_release -d   
+Description:	Ubuntu 18.04.4 LTS   
+david@woozer:~ sudo dpkg --list   
+
+# local version of this on macs                  
+```   
+
+### init (setup)
+
+```bash
+
+//* ******** Ubuntu 16.04 ( Woozer )** **//
+
+45.79.219.165
+2600:3c02::f03c:91ff:fe67:cbec
+
+http://45.79.219.165/
+
+sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get dist-upgrade
+
+sudo apt-get update && sudo apt-get upgrade
+
+adduser user
+usermod -a -G sudo user
+echo "hostname" > /etc/hostname
+sudo vi /etc/sshd_config - disable root and password logins
+cp ~.ssh/rsa_pub(local) to .ssh/known_hosts(remote) - add keys
+sudo service ssh restart
+
+sudo apt-get install zsh
+sudo apt-get install git
+git config --global user.email "email"
+git config user.name "user"
+ssh-keygen -t rsa -b 4096 -C ""
+
+sudo apt-get install zsh
+sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
+sudo vi .zshrc
+mkdir ~/.vim/colors ~/.vim/etc
+sudo vi .vimrc
+source .zshrc .vimrc
+
+
+sudo iptables -A INPUT -p tcp --dport 'ssh port' -j ACCEPT
+sudo iptables -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
+sudo iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
+sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
+sudo iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 81 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 4791 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 8181 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 8282 -j ACCEPT
+sudo iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
+sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
+sudo iptables -A INPUT -j REJECT
+sudo iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7
+sudo iptables -A FORWARD -j REJECT
+sudo iptables -A INPUT -s longview.linode.com -m state --state NEW -j ACCEPT
+sudo iptables -L
+
+sudo iptables -L --line-numbers
+sudo iptables -I INPUT 20 -p tcp --dport 8882 -j ACCEPT
+sudo iptables -I INPUT 17 -p tcp --dport 8881 -j ACCEPT
+
+8881 - radio
+8181 - chess
+8008 - icecast
+8888 - show
+8080 - chat
+8282 - nginx
+
+sudo apt-get install iptables-persistent
+sudo iptables-restore < /tmp/v4
+sudo ip6tables-restore < /tmp/v6
+iptables-save
+
+sudo apt-get install fail2ban
+sudo cp jail.conf jail.local > adjust settings
+
+sudo apt-get install apache2
+sudo apt-get install apache2-utils
+
+
+sudo a2ensite blank.conf
+sudo a2dismod mpm_event
+sudo a2enmod mpm_prefork
+sudo vi /etc/apache2/mods-available/mpm_event.comf
+sudo vi /etc/apache2/mods-available/mpm_prefork.conf
+sudo service apache2 restart
+
+sudo apt-get install mysql-server
+sudo mysql_secure_installation
+sudo /etc/mysql/my.cnf
+mysql> CREATE USER 'user'@'localhost' INDENTIFIED BY 'password';
+sudo service mysql restart
+
+sudo apt-get install php5 php-pear php5-mcrypt php5-dev libssh2-1-dev libssh2-php
+sudo php5enmod mcrypt
+
+sudo chown david:www-data -R /var/www/example.example.com
+sudo chown david:www-data -R /var/www/cc.example.com
+sudo chmod 0755 -R /var/www/example.example.com
+sudo chmod g+s -R /var/www/example.example.com
+## change all directories to 755
+sudo find /var/www -type d -exec chmod 755 {} \;
+## change all files to 644
+sudo find /var/www -type f -exec chmod 644 {} \;
+
+sudo vi /etc/apache2.conf/sites-available/blank.conf
+sudo mkdir -p /var/www/blank/html
+sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
+sudo a2ensite blank.conf
+sudo service apache2 restart
+
+sudo certbot --apache -d example.example.com
+
+-- https://github.com/certbot/certbot/issues/5405 --
+sudo certbot --authenticator standalone --installer apache -d example.example.com --pre-hook "apache2ctl stop" --post-hook "apache2ctl start"
+
+sudo openssl req -new -newkey rsa:2048 -nodes -keyout windhambrothers.com.key -out windhambrothers.com.csr
+
+wget https://raw.githubusercontent.com/xn/apachebuddy.pl/master/apachebuddy.pl
+sudo perl apachebuddy.pl
+
+mkdir /home/user/backups  /home/user/scripts
+touch /home/user/scripts/mysql-cron.sh
+chmod +x mysql-cron.sh
+mysqldump david --user=****** --password='*********' > /home/david/backups/$(date + "%Y%m%d").david.sql
+mysqlcheck -o david --user=***** --password='*********'
+
+vi /etc/rsyslog.d > uncomment crontab
+crontab -e
+0 0 * * 0 /home/david/scripts/mysql-cron.sh
+
+sudo apt-get update
+sudo apt-get upgrade
+sudo apt-get dist-upgrade
+
+curl -sL https://deb.nodesource.com/setup_4.x | sudo -E bash -
+sudo apt-get install nodejs
+
+sudo touch /etc/init/node.conf
+sudo vi /etc/init/node.conf
+
+*nope* sudo apt-get install postfix mailutils
+sudo vi /etc/aliases
+
+sudo apt-get install monit
+sudo vi /etc/monit/monitrc
+
+
+sudo sh -c "echo deb http://download.opensuse.org/repositories/multimedia:/xiph/xUbuntu_14.04/ ./ >>/etc/apt/sources.list.d/icecast.list"
+https://wiki.xiph.org/Icecast_Server/Installing_latest_version_(official_Xiph_repositories)
+sudo apt-get install icecast2
+http://stream.example.com:8008/admin/
+admin / admin
+make status2.xsl file.
+sudo ln -s /etc/icecast2/web/status2.xsl /usr/share/icecast2/web/status2.xsl
+
+
+sudo add-apt-repository ppa:chris-lea/redis-server
+sudo apt-get install redis-server
+```

+ 636 - 0
docs/projects/zeke.md

@@ -0,0 +1,636 @@
+
+20/10/08
+#### Ubuntu 20.04.01
+Waited until the first point release to avoid bugs. Clean install:
+Deploy new Linode / Secure the server / Install packages / cp files and data / swap IP address / reboot
+
+```sh
+sudo apt-get update && sudo apt-get upgrade
+#### sudo apt-get dist-upgrade
+#### more cautious approach to packages held back from dependencies
+sudo apt-get --with-new-pkgs upgrade
+```
+
+20/03/26  
+#### Bench testing
+
+```bash  
+david@macs:~/sites/til(master⚡) » ab -n 1000 -c 100 https://dev.davidwindham.com:443/
+This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
+Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
+Licensed to The Apache Software Foundation, http://www.apache.org/
+
+Benchmarking dev.davidwindham.com (be patient)
+Completed 100 requests
+Completed 200 requests
+Completed 300 requests
+Completed 400 requests
+Completed 500 requests
+Completed 600 requests
+Completed 700 requests
+Completed 800 requests
+Completed 900 requests
+Completed 1000 requests
+Finished 1000 requests
+
+
+Server Software:        Apache/2.4.29
+Server Hostname:        dev.davidwindham.com
+Server Port:            443
+SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-CHACHA20-POLY1305,2048,256
+Server Temp Key:        X25519 253 bits
+TLS Server Name:        dev.davidwindham.com
+
+Document Path:          /
+Document Length:        18577 bytes
+
+Concurrency Level:      100
+Time taken for tests:   2.261 seconds
+Complete requests:      1000
+Failed requests:        0
+Total transferred:      18877000 bytes
+HTML transferred:       18577000 bytes
+Requests per second:    442.28 [#/sec] (mean)
+Time per request:       226.100 [ms] (mean)
+Time per request:       2.261 [ms] (mean, across all concurrent requests)
+Transfer rate:          8153.30 [Kbytes/sec] received
+
+Connection Times (ms)
+              min  mean[+/-sd] median   max
+Connect:       53  149  29.5    147     593
+Processing:    31   61   9.8     59     113
+Waiting:       14   20   5.6     18      52
+Total:         88  210  31.6    206     674
+
+Percentage of the requests served within a certain time (ms)
+  50%    206
+  66%    210
+  75%    215
+  80%    218
+  90%    245
+  95%    253
+  98%    260
+  99%    275
+ 100%    674 (longest request)
+david@macs:~/sites/til(master⚡) »
+
+```  
+
+### init
+```bash  
+
+//************** Ubuntu 18.04 ( Zeke ) ***************//
+
+45.79.193.63
+2600:3c02::f03c:92ff:fed5:bb67
+
+DNS Resolvers (IPv4): 173.230.129.5
+DNS Resolvers (IPv6): 2600:3c02::5
+173.230.129.5 - *******@173.230.129.5 / *************
+
+sudo apt update && sudo apt upgrade
+adduser user
+adduser user sudo
+logout
+
+sudo vi /etc/hosts
+  127.0.0.1 localhost zeke
+  45.79.193.63 dev.davidwindham.com
+
+ssh-keygen -b 4096
+(from local machine) scp ~/.ssh/id_rsa.pub *****@45.79.193.63:~/.ssh/authorized_keys
+
+/etc/ssh/sshd_config
+PermitRootLogin no
+#PasswordAuthentication no
+Port ####
+PubkeyAuthentication yes
+sudo systemctl restart sshd
+ssh -p **** ******@45.79.193.63
+
+--> remove news/help from login / add asci logo
+sudo chmod 0644 /etc/update-motd.d/50-motd-news
+sudo chmod 0644 /etc/update-motd.d/10-help-text
+sudo chmod +x /etc/update-motd.d/05-windhamdavid
+
+sudo apt-get install zsh
+sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
+sudo vi .zshrc
+
+Linode Longview
+curl -s https://lv.linode.com/464AB0EC-097A-4D7C-BC23DB5CAD79C43A | sudo bash
+sudo systemctl status longview
+sudo systemctl start longview
+
+##################### IPTABLES ########################
+sudo iptables -L -nv --line-numbers
+sudo iptables -A INPUT -i lo -j ACCEPT
+
+# ICMPtypes 3,8,11 - Echo, Ping, TTL
+sudo iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
+sudo iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
+sudo iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
+
+# Allow inbound traffic from established connections including ICMP error returns.
+sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+
+# Log what was incoming but denied / Log any traffic that was sent to you for forwarding
+sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
+sudo iptables -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7
+
+# Ports
+sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT (http)
+sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT (https)
+sudo iptables -A INPUT -p tcp --dport #### -j ACCEPT (monit)
+sudo iptables -A INPUT -p tcp --dport #### -j ACCEPT (ssh)
+
+# Linode Longview / Loadbalancer
+sudo iptables -A INPUT -s 96.126.119.66 -m state --state NEW -j ACCEPT
+sudo iptables -A INPUT -s 192.168.255.0/24 -m state --state NEW -j ACCEPT
+
+## /tmp/v4,v6
+sudo iptables-restore < /tmp/v4
+sudo ip6tables-restore < /tmp/v6
+apt-get install iptables-persistent
+sudo ls /etc/iptables
+sudo iptables -L
+/etc/iptables/rules.v4
+/etc/iptables/rules.v6
+sudo dpkg-reconfigure iptables-persistent   
+
+```
+
+#### LAMP
+```sh
+
+##################### LAMP ########################
+##################### APACHE #####################
+sudo apt install apache2
+sudo vi /etc/apache2/apache2.conf
+  KeepAlive On
+  MaxKeepAliveRequests 50
+  KeepAliveTimeout 5
+  ServerName localhost
+
+sudo a2dismod mpm_prefork
+sudo a2enmod mpm_event
+sudo vi /etc/apache2/mods-available/mpm_event.conf
+<IfModule mpm_event_module>
+  StartServers            5
+  MinSpareServers         5
+  MaxSpareServers         50
+  MaxRequestWorkers       250
+  MaxConnectionsPerChild  100000
+</IfModule>
+
+sudo a2enmod headers
+sudo a2enmod expires
+sudo a2enmod http2
+
+sudo systemctl restart apache2
+sudo apachectl -M | grep mpm
+
+sudo mkdir -p /var/www/dev.davidwindham.com/{html,log,backup}
+sudo chown david:www-data -R /var/www/dev.davidwindham.com/
+sudo chmod -R 755 /var/www/dev.davidwindham.com/html
+sudo vi /etc/apache2/sites-available/dev.davidwindham.com.conf
+sudo a2ensite dev.davidwindham.com.conf
+
+sudo add-apt-repository ppa:certbot/certbot
+sudo apt install python-certbot-apache
+sudo certbot --apache -d dev.davidwindham.com
+
+# Apache buddy
+  curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | perl
+  sudo perl apache2buddy.pl
+
+
+##################### MYSQL #####################
+sudo apt install mysql-server
+sudo mysql_secure_installation
+
+# switch from auth_socket to native_password and change username for root user.
+  sudo mysql
+  mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
+  mysql> rename user 'root'@'localhost' to '********'@'localhost';
+  mysql> FLUSH PRIVILEGES;
+# create new user
+  mysql> create user 'user'@'localhost' identified by 'pass';
+  mysql> SELECT user,authentication_string,plugin,host FROM mysql.user;
+  mysql> GRANT ALL PRIVILEGES ON *.* TO '*****'@'localhost' WITH GRANT OPTION;
+  mysql> exit
+
+# check version  
+  sudo systemctl status mysql.service
+  sudo mysqladmin -p -u root version
+
+# extra security
+  sudo vi /etc/mysql/my.cnf
+    bind-address = 127.0.0.1
+    local-infile=0
+
+sudo apt install mysqltuner
+sudo mysqltuner
+
+# tune extra
+  sudo vi /etc/mysql/my.cnf
+
+    [client]
+    default-character-set=utf8
+    [mysql]
+    default-character-set=utf8
+    [mysqld]
+    default_storage_engine = InnoDB
+    collation-server = utf8_unicode_ci
+
+    init-connect='SET NAMES utf8'
+    character-set-server = utf8
+    max_allowed_packet = 64M
+    max_connections    = 100
+    thread_stack       = 128K
+    table_open_cache   = 32M
+    key_buffer_size    = 32M
+    slow_query_log     = 0
+    long_query_time    = 5
+    log_queries_not_using_indexes   = 1
+
+sudo systemctl restart mysql
+
+
+
+##################### PHP ############################
+sudo add-apt-repository ppa:ondrej/php
+sudo apt update
+sudo apt-get install php7.4
+sudo apt-get install php7.4-cli php7.4-fpm php7.4-bcmath php7.4-curl php7.4-gd php7.4-imagick php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-tidy php7.4-xml php7.4-xmlrpc php7.4-zip
+
+sudo vi /etc/php/7.4/apache2/php.ini
+
+  max_execution_time = 180
+  max_input_time =300
+  memory_limit = 512M
+  post_max_size = 128M
+  upload_max_filesize = 256M
+
+  error_log = /var/log/php/error.log
+  sudo mkdir /var/log/php
+  sudo chown www-data /var/log/php
+
+# enable PHP 7.4 FPM
+sudo a2enmod proxy_fcgi setenvif
+sudo a2enmod actions fastcgi alias proxy_fcgi
+sudo a2enconf php7.4-fpm
+sudo a2dismod mpm_prefork
+sudo a2enmod mpm_event
+
+# verify status
+sudo service php7.4-fpm status
+sudo vi /etc/php/7.4/fmp/php.ini
+sudo systemctl reload php7.4-fpm
+sudo systemctl restart php7.4-fpm
+
+<VirtualHost *:443>
+	Protocols h2 http/1.1
+</VirtualHost>
+<FilesMatch \.php$>
+	SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://localhost/"
+</FilesMatch>
+<Proxy "fcgi://localhost/">
+</Proxy>
+
+## isolate fpm processes to new user
+sudo vi /etc/php/7.4/fpm/pool.d/user123.conf
+  [user123]
+  user = user1
+  group = group1
+  listen = /run/php/php7.4-fpm-user1.sock
+  listen.owner = www-data
+  listen.group = www-data
+  pm = dynamic
+  pm.max_children = 5
+  pm.start_servers = 2
+  pm.min_spare_servers = 1
+  pm.max_spare_servers = 3
+
+  <FilesMatch ".php$">
+     SetHandler "proxy:unix:/var/run/php/php7.4-fpm-user123.sock|fcgi://localhost/"          
+  </FilesMatch>
+
+# test config & restart
+sudo php-fpm7.4 -t
+sudo service php7.4-fpm restart
+
+```
+
+
+#### bad bot blocker
+* [https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker](https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker)
+
+```sh
+##################### BAD BOTS ############################
+# https://github.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/tree/master/Apache_2.4
+
+sudo mkdir /etc/apache2/custom.d
+
+sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/globalblacklist.conf -O /etc/apache2/custom.d/globalblacklist.conf
+sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/whitelist-domains.conf -O /etc/apache2/custom.d/whitelist-domains.conf
+sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/blacklist-ips.conf -O /etc/apache2/custom.d/blacklist-ips.conf
+sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/bad-referrer-words.conf -O /etc/apache2/custom.d/bad-referrer-words.conf
+sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/blacklist-user-agents.conf -O /etc/apache2/custom.d/blacklist-user-agents.conf
+
+sudo vi /etc/apache2/apache2.conf
+    <Location "/">
+      AuthMerging And
+      Include custom.d/globalblacklist.conf
+    </Location>
+# ~ or e.g.~
+sudo vi /etc/apache2/sites-available/default.conf
+   <VirtualHost *:80>
+      <Directory "/var/www/html">
+         Include custom.d/globalblacklist.conf
+      </Directory>
+   </VirtualHost>
+
+# whitelist all domains / IPs on Server
+sudo vi /etc/apache2/custom.d/whitelist-domains.conf  
+sudo vi /etc/apache2/custom.d/whitelist-ips.conf  
+
+sudo apache2ctl configtest
+sudo service apache2 reload
+
+# update lists  
+sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/globalblacklist.conf -O /etc/apache2/custom.d/globalblacklist.conf
+# let's git it to sync it - https://code.davidawindham.com/custom.d
+git filter-branch -f --prune-empty --subdirectory-filter Apache_2.4/custom.d master
+git fetch upstream
+git merge upstream/master   
+
+# test it
+curl -A "googlebot" https://dev.davidwindham.com/
+# 200 OK
+curl -A "SemrushBot" https://dev.davidwindham.com/
+curl -A "masscan" https://dev.davidwindham.com/
+curl -I https://dev.davidwindham.com/ -e http://100dollars-seo.com
+curl -I https://dev.davidwindham.com/ -e http://zx6.ru
+# 403 Forbidden
+
+```
+#### monitor  
+```bash 
+//************** goAccess ( Zeke ) ***************//
+# https://goaccess.io/man / https://github.com/allinurl/goaccess
+sudo apt-get install goaccess
+
+sudo /etc/goaccess.conf
+(time,date,log format)
+
+goaccess --help
+goaccess /var/log/apache2/access.log
+goaccess /var/www/dev.davidwindham.com/log/access.log
+
+#filter by start date
+sed '/28\/Mar\/2020/,$ p' /var/log/apache2/access.log | goaccess -a
+#filter to date
+grep '28/Mar/2020' /var/log/apache2/access.log | goaccess -a
+## tail bots
+tail -F -n +0 access.log | grep -i --line-buffered 'bot' | goaccess -
+
+# genrate html page
+sudo goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/dev.davidwindham.com/html/monitor/server/index.html
+sudo goaccess /var/www/dev.davidwindham.com/log/access.log --log-format=COMBINED -o /var/www/dev.davidwindham.com/html/monitor/index.html
+
+# genrate live html page
+sudo goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/dev.davidwindham.com/html/monitor/index.html --real-time-html --addr=127.0.0.1 --ws-url=wss://dev.davidwindham.com:7890
+
+# cron run at 1:11am daily
+sudo vi ~/scripts/monitor.sh
+  goaccess /var/log/apache2/access.log --log-format=COMBINED -o /var/www/dev.davidwindham.com/html/monitor/server/index.html
+  goaccess /var/www/dev.davidwindham.com/log/access.log --log-format=COMBINED -o /var/www/dev.davidwindham.com/html/monitor/index.html
+  goaccess /var/www/davidwindham.com/log/access.log --log-format=COMBINED -o /var/www/davidwindham.com/html/monitor/index.html
+
+crontab -e
+11 1 * * * sudo /home/david/scripts/monitor.sh
+
+# error logs
+sudo vi /etc/apache2/apache2.conf
+  ErrorLogFormat "[%t] [%l] [%P] %F: %E: [%a] %M"
+goaccess /var/www/dev.davidwindham.com/log/error.log --log-format='[%T] [%l] [%P] %F: %E: [%a] %M'
+
+
+```
+
+#### tune / audit  
+```sh
+
+##################### TUNE ############################
+# mysql tuner - https://github.com/major/MySQLTuner-perl
+[mysqld]
+performance_schema = on
+perl mysqltuner.pl --host 127.0.0.1
+perl mysqltuner.pl --outputfile /tmp/result_mysqltuner.txt
+# apache2buddy
+curl -sL https://raw.githubusercontent.com/richardforth/apache2buddy/master/apache2buddy.pl | sudo perl
+#Apache mod_status
+
+##################### CRON ############################
+# mysql-cron.sh
+
+#!/bin/sh
+mysqldump db_name --user=db_user --password='db_pass' > /home/david/backups/$(date +"%Y%m%d").db_name.sql
+mysqlcheck -o db_name --user=db_user --password='db_pass'
+
+# run every Sunday at 1:11am
+sudo crontab -e
+11 1 * * 0 /home/david/scripts/mysql-cron.sh
+
+##################### MONIT / SERVER-STATUS ############################
+sudo apt-get install monit
+#sudo iptables -A INPUT 14 -p tcp --dport 2812 -j ACCEPT
+
+sudo vi /etc/monit/monitrc
+  set daemon 600            #10 min intervals
+    with start delay 240    #delay start 4min
+
+  set alert email@email.com
+  set mailserver smtp.gmail.com port 587
+    username "email@email.com" password "application_specific"
+    using tls
+  set httpd port #### and
+    use address localhost
+    allow localhost
+    allow user:pass
+
+sudo vi /etc/monit/conf.d/apache2.conf etc}
+  php7-fpm with pidfile /run/php/php7.4-fpm.pid
+    start program = "/usr/sbin/service php7.4-fpm start" with timeout 60 seconds
+    stop program = "/usr/sbin/service php7.4-fpm stop"
+    if failed unixsocket /var/run/php/php7.4-fpm.sock restart
+  check process mysql with pidfile /var/run/mysqld/mysqld.pid
+    start program = "/usr/sbin/service mysql start" with timeout 60 seconds
+    stop program = "/usr/sbin/service mysql stop"
+    if failed unixsocket /var/run/mysqld/mysqld.sock then restart
+  check process apache2 with pidfile /var/run/apache2/apache2.pid
+    start program = "/bin/systemctl start apache2" with timeout 60 seconds
+    start program = "/bin/systemctl stop apache2"
+    restart program = "/bin/systemctl restart apache2" with timeout 120 seconds
+    if children > 255 for 5 cycles then alert
+    if cpu usage > 95% for 5 cycles then alert
+    if failed port 80 protocol http then restart
+sudo monit reload
+
+sudo vi /etc/apache2/sites-available/dev.davidwindham.com-le-ssl.conf
+  ProxyPreservehost On
+  ProxyPass /monit/ http://127.0.0.1:2812/ connectiontimeout=300 timeout=3-- Keepalive=On
+  ProxyPassReverse /monit/ http://127.0.0.1:2812/
+  <Location /monit/>
+    Order deny,allow
+    Allow from all
+    ProxyPassReverseCookiePath / /monit/
+  </Location>
+  <Location /server-status>
+    SetHandler server-status
+    Order allow,deny
+    Deny from all
+  </Location>
+
+sudo service monit stop/start/restart/status all/check -t
+
+# clear error logs
+sudo bash -c 'echo > error.log'
+
+## don't log longview/server-status/status
+sudo vi /etc/apache2/conf-available/other-vhosts-access-log.conf
+  CustomLog ${APACHE_LOG_DIR}/other_vhosts_access.log vhost_combined env=!dontlog
+  SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
+  SetEnvIf Remote_Addr "::1" dontlog
+sudo vi /etc/apache2/sites-available/dev.dw.conf
+  SetEnvIf Request_URI "^/server-status*$" dontlog
+  SetEnvIf Request_URI "^/monit/$" dontlog
+
+
+##################### LYNIS ############################
+git clone https://github.com/CISOfy/lynis
+cd lynis
+./lynis audit system
+```
+
+#### certbot letsencrypt
+```sh
+//************** Certbot SSLs ( Zeke ) ***************//
+## install
+sudo certbot --apache -d dev.davidwindham.com
+
+## remove
+sudo certbot delete --cert-name dev.davidwindham.com
+
+## moving from another server   
+sudo ls -l /etc/letsencrypt/live/davidwindham.com
+  lrwxrwxrwx 1 root root 46 Mar 25 13:23 cert.pem -> /etc/letsencrypt/archive/davidwindham.com/cert2.pem
+  lrwxrwxrwx 1 root root 47 Mar 25 13:24 chain.pem -> /etc/letsencrypt/archive/davidwindham.com/chain2.pem
+  lrwxrwxrwx 1 root root 51 Mar 25 13:24 fullchain.pem -> /etc/letsencrypt/archive/davidwindham.com/fullchain2.pem
+  lrwxrwxrwx 1 root root 49 Mar 25 13:24 privkey.pem -> /etc/letsencrypt/archive/davidwindham.com/privkey2.pem
+
+cd ~
+sudo tar -chvzf dw_certs.tar.gz /etc/letsencrypt/archive/davidwindham.com /etc/letsencrypt/renewal/davidwindham.com.conf
+# move the .tar.gz to the root directory new server via ftp then login
+
+#on destination server in root / directory
+sudo tar -xvf dw_certs.tar.gz
+
+#create symbolic links
+sudo mkdir /etc/letsencrypt/live/davidwindham.com
+sudo ln -s /etc/letsencrypt/archive/davidwindham.com/cert2.pem /etc/letsencrypt/live/davidwindham.com/cert.pem
+sudo ln -s /etc/letsencrypt/archive/davidwindham.com/chain2.pem /etc/letsencrypt/live/davidwindham.com/chain.pem
+sudo ln -s /etc/letsencrypt/archive/davidwindham.com/fullchain2.pem /etc/letsencrypt/live/davidwindham.com/fullchain.pem
+sudo ln -s /etc/letsencrypt/archive/davidwindham.com/privkey2.pem /etc/letsencrypt/live/davidwindham.com/privkey.pem
+
+# davidwindham.com.conf file
+<VirtualHost *:80>
+  ServerAdmin web@davidwindham.com
+  ServerName davidwindham.com
+  ServerAlias www.davidwindham.com
+
+  DirectoryIndex index.html index.php
+  Documentroot /var/www/davidwindham.com/html
+
+  <Directory /var/www/davidwindham.com/html>
+    Options FollowSymLinks
+    DirectoryIndex index.html index.php
+    AllowOverride All
+    Order allow,deny
+    Allow from all
+    Require all granted
+  </Directory>
+
+  LogLevel wan
+  ErrorLog /var/www/davidwindham.com/log/error.log
+  CustomLog /var/www/davidwindham.com/log/access.log combined
+
+  php_flag log_errors on
+  php_flag display_errors off
+  php_value error_reporting 32767
+  php_value error_log /var/www/davidwindham.com/log/php.error.log
+
+  RewriteEngine on
+  RewriteCond %{SERVER_NAME} =davidwindham.com [OR]
+  RewriteCond %{SERVER_NAME} =www.davidwindham.com
+  RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
+</VirtualHost>
+
+<IfModule mod_ssl.c>
+<VirtualHost *:443>
+  ServerAdmin web@davidwindham.com
+  ServerName davidwindham.com
+  ServerAlias www.davidwindham.com
+
+  DirectoryIndex index.html index.php
+  Documentroot /var/www/davidwindham.com/html
+
+  <Directory /var/www/davidwindham.com/html>
+    Options FollowSymLinks
+    DirectoryIndex index.html index.php
+    AllowOverride All
+    Order allow,deny
+    Allow from all
+    Require all granted
+  </Directory>
+
+  LogLevel warn
+  ErrorLog /var/www/davidwindham.com/log/error.log
+  CustomLog /var/www/davidwindham.com/log/access.log combined
+
+  php_flag log_errors on
+  php_flag display_errors off
+  php_value error_reporting 32767
+  php_value error_log /var/www/davidwindham.com/log/php.error.log
+
+  Include /etc/letsencrypt/options-ssl-apache.conf
+  SSLCertificateFile /etc/letsencrypt/live/davidwindham.com/fullchain.pem
+  SSLCertificateKeyFile /etc/letsencrypt/live/davidwindham.com/privkey.pem
+</VirtualHost>
+</IfModule>
+
+## TEST ##
+sudo letsencrypt renew --dry-run
+## Crontab ##
+sudo crontab -e
+11 1 * * 1 certbot renew --quiet --noninteractive
+# runs on mondays at 1:11am
+
+```
+####packages:
+```sh
+//************** Packages ( Zeke ) ***************//
+dpkg –list
+# pkg log
+sudo vi /var/log/dpkg.log
+sudo vi /var/log/apt/history.log
+# installed?
+dpkg -L packagename
+sudo apt-get clean && sudo apt-get autoremove
+# ck for dep issues
+dpkg –configure -a
+# rm a pkg
+apt-get remove packagename
+apt-get –-purge remove packagename
+```

+ 53 - 0
docs/projects/zw.md

@@ -0,0 +1,53 @@
+# Zeken Woozer Un-Ltd LLC
+
+https://zekenwoozer.com
+
+
+
+##### LLC
+
+If a single-member LLC does not elect to be treated as a corporation, the LLC is a "disregarded entity," and the LLC's activities should be reflected on its owner's federal tax return. If the owner is an individual, the activities of the LLC will generally be reflected on:
+
+
+###### Forms
+
+- [Form 1040 Schedule C, Profit or Loss from Business (Sole Proprietorship)](https://www.irs.gov/pub/irs-pdf/f1040sc.pdf)
+- [Schedule K-1 (Form 1065), Partner's Share of Income, Deductions, Credits, etc.](https://www.irs.gov/uac/about-schedule-k1-form-1065)
+- [https://www.irs.gov/pub/irs-pdf/f1040se.pdf](https://www.irs.gov/pub/irs-pdf/f1040se.pdf)
+
+
+- [https://www.irs.gov/businesses/election-for-married-couples-unincorporated-businesses](https://www.irs.gov/businesses/small-businesses-self-employed/election-for-married-couples-unincorporated-businesses)
+- [https://www.irs.gov/pub/irs-drop/rp-02-69.pdf](https://www.irs.gov/pub/irs-drop/rp-02-69.pdf)  
+
+    -  An unincorporated business jointly owned by a married couple is generally classified as a partnership for Federal tax purposes. For tax years beginning after December 31, 2006, the Small Business and Work Opportunity Tax Act of 2007 (Public Law 110-28) provides that a "qualified joint venture," whose only members are a married couple filing a joint return, can elect not to be treated as a partnership for Federal tax purposes.
+    - Rev. Proc. 2002-69 addressed the issue of classification for an entity that is solely owned by husband and wife as community property under laws of a state, a foreign country or possession of the United States.
+    If there is a qualified entity owned by a husband and wife as community property owners, and they treat the entity as a:
+    Disregarded entity for federal tax purposes, the Internal Revenue Service will accept the position that the entity is disregarded for federal tax purposes.
+    Partnership for federal tax purposes, the Internal Revenue Service will accept the position that the entity is partnership for federal tax purposes.
+    A change in the reporting position will be treated for federal tax purposes as a conversion of the entity.
+    A business entity is a qualified entity if
+    The business entity is wholly owned by a husband and wife as community property under the laws of a state, a foreign country, or possession of the United States;
+    No person other than one or both spouses would be considered an owner for federal tax purposes; and
+    The business entity is not treated as a corporation under IRC §310.7701-2.
+- [http://www.sos.sc.gov/Business_Filings_FAQs](http://www.sos.sc.gov/Business_Filings_FAQs)
+  - [https://businessfilings.sc.gov/](https://businessfilings.sc.gov/)
+
+
+
+
+
+##### Financial
+
+- [https://www.firstcitizens.com/business/](https://www.firstcitizens.com/business/)
+  - [https://en.wikipedia.org/wiki/FCBSA](https://en.wikipedia.org/wiki/First_Citizens_Bank_of_South_Carolina)
+  - [https://en.wikipedia.org/wiki/First_Citizens_BancShares](https://en.wikipedia.org/wiki/First_Citizens_BancShares)
+  - [https://dailyreckoning.com/secretive-family-solid-investment/](https://dailyreckoning.com/secretive-family-solid-investment/)
+  - [https://www.bloomberg.com/research/person](https://www.bloomberg.com/research/stocks/private/person.asp?personId=1148439&privcapId=343779)
+  - [https://vimeo.com/39721749](https://vimeo.com/39721749)
+
+
+  - Depositing a check made payable to you, rather than the LLC, into the LLC's account can be accomplished in one of two ways. One way is to write "For Deposit Only" as the endorsement on the back of the check, along with the LLC's bank account number. This is called a restrictive endorsement that requires the check to go through the LLC's account. A second way is to write the endorsement as "Pay to..." and then insert the LLC's name. This is called a special endorsement, under which you endorse the check as you normally do for deposit into the LLC's account.
+
+
+
+##### Record Keeping

+ 4 - 0
docs/saas/aws.md

@@ -0,0 +1,4 @@
+# Amazon Web Services
+
+* [AWS Lamda](https://aws.amazon.com/lambda/)
+* 

+ 959 - 0
docs/saas/google.md

@@ -0,0 +1,959 @@
+## Google Cloud Platform
+
+* [https://cloud.google.com/](https://cloud.google.com/)
+* [https://cloud.google.com/docs](https://cloud.google.com/docs)
+* [https://cloud.google.com/sdk/docs](https://cloud.google.com/sdk/docs)
+* [https://cloud.google.com/sdk/gcloud/reference](https://cloud.google.com/sdk/gcloud/reference)
+
+
+
+```
+#### notes ####
+
+```
+
+| Machine Learning |   | Free Tier |
+|---|---|---|
+| [Cloud Machine Learning Engine](https://cloud.google.com/ml-engine/) | Managed Machine Learning (TensorFlow) | - |
+| [Cloud Job Discovery](https://cloud.google.com/job-discovery/) | ML Job Search/Discovery | - |
+| [Cloud Natural Language](https://cloud.google.com/natural-language/) | Text Parsing and Analysis | 5000 text operations per month |
+| [Cloud Speech](https://cloud.google.com/speech/) | Convert Speech to Text | 60 minutes of audio per month |
+| [Cloud Translation](https://cloud.google.com/translate/) | Language Detection and Translation | - |
+| [Cloud Vision](https://cloud.google.com/vision/) | Image Recognition and Classification | 1000 image operations per month |
+| [Cloud Video Intelligence](https://cloud.google.com/video-intelligence/) | Scene-level Video Annotation | First 1000 minutes of video free |
+
+
+| Internet of Things |   | Free Tier  |
+|---|---|---|
+| [Cloud IoT Core](https://cloud.google.com/iot-core/) | Data Ingestion/Device Management | 250MB network traffic |
+
+
+| Big Data |   | Free Tier  |
+|---|---|---|
+| [BigQuery](https://cloud.google.com/bigquery/) | Data Warehouse/Analytics | 1TB queries/month; 10GB storage |
+| [Cloud Dataflow](https://cloud.google.com/dataflow/) | Stream/batch data processing | - |
+| [Cloud Dataproc](https://cloud.google.com/dataproc/) | Managed Spark and Hadoop | - |
+| [Cloud Datalab](https://cloud.google.com/datalab/) | Visualize and Explore Data | - |
+| [Cloud Dataprep](https://cloud.google.com/dataprep/) | Transform/Clean Raw Data | - |
+| [Cloud Pub/Sub](https://cloud.google.com/pubsub/) | Global Real-time Messaging | 10GB messages/month |
+| [Genomics](https://cloud.google.com/genomics/) | Managed Genomics Platform | - |
+| [Data Studio](https://cloud.google.com/data-studio/) | Collaborative Dashboards | - |
+
+
+| Databases |   | Free Tier  |
+|---|---|---|
+| [Cloud SQL](https://cloud.google.com/sql/) | Managed MySQL and PostgreSQL | - |
+| [Cloud Bigtable](https://cloud.google.com/bigtable/) | HBase compatible nonrelational | - |
+| [Cloud Datastore](https://cloud.google.com/datastore/) | Horizontally scalable nonrelational | 1GB Storage |
+| [Cloud Spanner](https://cloud.google.com/spanner/) | Horizontally scalable relational | - |
+
+
+| Storage |   | Free Tier  |
+|---|---|---|
+| [Cloud Storage](https://cloud.google.com/storage/) | Object Storage and Serving | 5GB Regional storage |
+| [Nearline](https://cloud.google.com/storage/archival/) | Archival Storage | 5GB Regional storage |
+| [Coldline](https://cloud.google.com/storage/archival/) | Archival Cold Storage | 5GB Regional storage |
+| [Persistent Disk](https://cloud.google.com/persistent-disk/) | VM-attached disks | - |
+|  |  |  |
+
+
+| Data Transfer |   | Free Tier  |
+|---|---|---|
+| [Google Transfer Appliance](https://cloud.google.com/transfer-appliance/) | Hardware for Data Migration | - |
+| [Cloud Storage Transfer Service](https://cloud.google.com/storage/transfer/) | Cloud to Cloud Transfers | - |
+| [BigQuery Data Transfer Service](https://cloud.google.com/bigquery/transfer/) | Bulk Import Analytics Data | - |
+|  |  |  |
+
+
+| Compute |   | Free Tier |
+|---|---|---|
+| [Compute Engine](https://cloud.google.com/products/) | Virtual Machines, Disks, Network | 1 f1-micro instance; 30GB HDD |
+| [App Engine](https://cloud.google.com/appengine/) | Managed App Platform | 28 instance hrs per day; 5GB Storage |
+| [Kubernetes Engine](https://cloud.google.com/container-engine/) | Managed Kubernetes/Containers | Unlimited nodes free |
+| [Cloud Functions](https://cloud.google.com/functions/) | Event-driven serverless applications | 2 million invocations per month |
+
+
+| Networking |   | Free Tier  |
+|---|---|---|
+| [Virtual Private Cloud](https://cloud.google.com/vpc/) | Software Defined Networking | - |
+| [Cloud Load Balancing](https://cloud.google.com/load-balancing/) | Multi-region Load Distribution | - |
+| [Cloud CDN](https://cloud.google.com/cdn/) | Content Delivery Network | - |
+| [Cloud DNS](https://cloud.google.com/dns/) | Programmable DNS Serving | - |
+| [Dedicated Interconnect](https://cloud.google.com/interconnect/) | Dedicated private network connection | - |
+| [IPsec VPN](https://cloud.google.com/compute/docs/vpn/overview) | Virtual private network connection | - |
+| [Direct Peering](https://cloud.google.com/interconnect/docs/how-to/direct-peering) | Peer with GCP | - |
+| [Carrier Peering](https://cloud.google.com/interconnect/docs/how-to/carrier-peering) | Peer with a carrier | - |
+|   |  |  |
+
+
+| API Platform and Ecosystems |   | Free Tier  |
+|---|---|---|
+| [Apigee API Platform](https://cloud.google.com/apigee-api-management/) | Develop, secure, monitor APIs | - |
+| [Apigee Sense](https://cloud.google.com/apigee-sense/) | API protection from attacks | - |
+| [API Monetization](https://cloud.google.com/api-monetization/) | Monetize APIs | - |
+| [API Analytics](https://cloud.google.com/api-analytics/) | API Metrics | - |
+| [Cloud Endpoints](https://cloud.google.com/endpoints/) | Cloud API Gateway | - |
+
+
+| Identity and Security |   | Free Tier  |
+|---|---|---|
+| [Cloud IAM](https://cloud.google.com/iam/) | Resource Access Control | - |
+| [Cloud Identity-Aware Proxy](https://cloud.google.com/iap/) | Identity-based App Signin | - |
+| [Cloud Data Loss Prevention API](https://cloud.google.com/dlp/) | Classify, Redact Sensitive Data | - |
+| [Cloud Key Management Service](https://cloud.google.com/kms/) | Hosted Key Management Service | - |
+| [Cloud Resource Manager](https://cloud.google.com/resource-manager/) | Cloud Project Metadata Management | - |
+| [Cloud Security Scanner](https://cloud.google.com/security-scanner/) | App Engine Security Scanner | - |
+| [Security Key Enforcement](https://cloud.google.com/security-key/) | Two-step Key Verification | - |
+|  |  |  |
+
+
+| Management Tools |   | Free Tier |
+|---|---|---|
+| [Stackdriver Monitoring](https://cloud.google.com/monitoring/) | Infrastructure and Application Monitoring | Free for GCP |
+| [Stackdriver Logging](https://cloud.google.com/logging/) | Centralized Logging | 5GB per project per month; 7 day retention |
+| [Stackdriver Error Reporting](https://cloud.google.com/error-reporting/) | App Error Reporting | Free for App Engine or if using logging |
+| [Stackdriver Trace](https://cloud.google.com/trace/) | App Performance Insights | Free |
+| [Stackdriver Debugger](https://cloud.google.com/debugger/) | Live Production Debugging | Free |
+| [Cloud Deployment Manager](https://cloud.google.com/deployment-manager/) | Templated Infrastructure Deployment | - |
+| [Cloud Console](https://cloud.google.com/cloud-console/) | Web-based Management Console | - |
+| [Cloud Shell](https://cloud.google.com/shell/) | Browser-based Terminal/CLI | Free |
+| [Cloud Mobile App](https://cloud.google.com/console-app/) | iOS/Android GCP Manager App | - |
+| [Cloud Billing API](https://cloud.google.com/billing/docs/) | Programmatically Manage GCP Billing | - |
+| [Cloud APIs](https://cloud.google.com/apis/) | APIs for Cloud Services | - |
+|  |  |  |
+
+
+| Developer Tools |   | Free Tier  |
+|---|---|---|
+| [Cloud SDK](https://cloud.google.com/sdk/) | CLI for GCP | - |
+| [Container Registry](https://cloud.google.com/container-registry/) | Private Container Registry/Storage | - |
+| [Container Builder](https://cloud.google.com/container-builder/) | Build/Package Container Artifacts | 120 build mins/day |
+| [Cloud Source Repositories](https://cloud.google.com/source-repositories/) | Hosted Private Git Repos | 1GB private hosting |
+| [Cloud Tools for Android Studio](https://cloud.google.com/tools/android-studio/docs/) | Android Studio GCP Tools | - |
+| [Cloud Tools for IntelliJ](https://cloud.google.com/intellij/) | IntelliJ GCP Tools | - |
+| [Cloud Tools for PowerShell](https://cloud.google.com/powershell/) | PowerShell GCP Tools | - |
+| [Cloud Tools for Visual Studio](https://cloud.google.com/visual-studio/) | Visual Studio GCP Tools | - |
+| [Cloud Tools for Eclipse](https://cloud.google.com/eclipse/docs/) | Eclipse GCP Tools | - |
+| [Gradle App Engine Plugin](https://github.com/GoogleCloudPlatform/app-gradle-plugin) | Gradle App Engine Plugin | - |
+| [Maven App Engine Plugin](https://github.com/GoogleCloudPlatform/app-maven-plugin) | Maven App Engine Plugin | - |
+|  |  |  |
+
+
+| Mobile (Firebase) |   | Free Tier  |
+|---|---|---|
+| Realtime Database | Real-time Data Synchronization | 100 Connections 1GB Stored |
+| Cloud Firestore | Document Store and Sync | 1GB Stored |
+| Cloud Storage | File Storage and Serving | 5GB Stored |
+| Hosting | Web Hosting with CDN/SSL | 1GB Store / 10GB per Month Transfer |
+| Authentication | Drop-in Authentication | Free |
+| Cloud Functions | Event-driven Serverless Applications | 125K Invocations/Month |
+| Test Lab for Android | Mobile Device Testing Service | 5/10 Physical/Virtual Device Tests per day |
+| Performance Monitoring | App Performance Monitoring | Free |
+| [Crashlytics](https://fabric.io/kits/android/crashlytics/summary) | Crash Reporting and Analytics | Free |
+| Cloud Messaging | Send Messages to Devices | Free |
+
+
+##### Commands
+
+Table of Contents
+=================
+* [References](#references)
+* [Other cheatsheets](#other-cheatsheets)
+* [multiple gcloud config configurations](#multiple-gcloud-config-configurations)
+    * [switch gcloud context with gcloud config](#switch-gcloud-context-with-gcloud-config)
+* [auth](#auth)
+* [info](#info)
+* [projects](#projects)
+* [zones](#zones)
+* [organization](#organization)
+* [billing](#billing)
+* [IAM list permission and roles for a given resource](#iam-list-permission-and-roles-for-a-given-resource)
+* [IAM service account](#iam-service-account)
+    * [GCS bucket level](#gcs-bucket-level)
+    * [Custom Roles](#custom-roles)
+* [app engine](#app-engine)
+* [cloud build](#cloud-build)
+    * [Cloud build trigger GCE rolling replace/start](#cloud-build-trigger-gce-rolling-replacestart)
+* [kms](#kms)
+* [compute engine](#compute-engine)
+    * [gcloud command for creating an instance?](#gcloud-command-for-creating-an-instance)
+    * [list compute images](#list-compute-images)
+    * [list an instance](#list-an-instance)
+    * [move instance](#move-instance)
+    * [ssh &amp; scp](#ssh--scp)
+    * [SSH via IAP](#ssh-via-iap)
+    * [ssh port forwarding for elasticsearch](#ssh-port-forwarding-for-elasticsearch)
+    * [ssh reverse port forwarding](#ssh-reverse-port-forwarding)
+    * [generate ssh config](#generate-ssh-config)
+    * [debugging](#debugging)
+    * [instance level metadata](#instance-level-metadata)
+    * [project level metadata](#project-level-metadata)
+    * [instances, template, target-pool and instance group](#instances-template-target-pool-and-instance-group)
+    * [MIG with startup and shutdown scripts](#mig-with-startup-and-shutdown-scripts)
+    * [disk snapshot](#disk-snapshot)
+    * [regional disk](#regional-disk)
+* [Secret Manager](#secret-manager)
+* [Networking](#networking)
+    * [network and subnets](#network-and-subnets)
+    * [route](#route)
+    * [firewall rules](#firewall-rules)
+    * [layer 4 network lb](#layer-4-network-lb)
+    * [layer 7 http lb](#layer-7-http-lb)
+    * [forwarding-rules](#forwarding-rules)
+    * [address](#address)
+* [GCP managed ssl certificate](#gcp-managed-ssl-certificate)
+* [StackDriver logging](#stackdriver-logging)
+* [Service](#service)
+    * [list service available](#list-service-available)
+    * [Enable Service](#enable-service)
+* [Client libraries you can use to connect to Google APIs](#client-libraries-you-can-use-to-connect-to-google-apis)
+* [chaining gcloud commands](#chaining-gcloud-commands)
+* [one liner to purge GCR images given a date](#one-liner-to-purge-gcr-images-given-a-date)
+* [GKE](#gke)
+* [Cloud Run](#cloud-run)
+* [Machine Learning](#machine-learning)
+* [Deployment Manager](#deployment-manager)
+
+## References
+* [have fun with them](https://cloudplatform.googleblog.com/2016/06/filtering-and-formatting-fun-with.html)
+* [projections](https://cloud.google.com/sdk/gcloud/reference/topic/projections)
+* [filters](https://cloud.google.com/sdk/gcloud/reference/topic/filters)
+* [resource-keys](https://cloud.google.com/sdk/gcloud/reference/topic/resource-keys)
+* [scripting-gcloud](https://cloud.google.com/sdk/docs/scripting-gcloud)
+* [gcloud alpha interactive](http://cloudplatform.googleblog.com/2018/03/introducing-GCPs-new-interactive-CLI.html)
+* https://medium.com/@Joachim8675309/getting-started-with-gcloud-sdk-part-1-114924737
+* https://medium.com/@Joachim8675309/getting-started-with-gcloud-sdk-part-2-4d049a656f1a
+* https://gist.github.com/bborysenko/97749fe0514b819a5a87611e6aea3db8
+
+## Other cheatsheets
+* https://github.com/dennyzhang/cheatsheet-gcp-A4
+
+## multiple gcloud config configurations
+* https://www.jhanley.com/google-cloud-understanding-gcloud-configurations/
+* https://medium.com/infrastructure-adventures/working-with-multiple-environment-in-gcloud-cli-93b2d4e8cf1e
+
+```
+gcloud config configurations create pythonrocks
+gcloud config configurations list
+gcloud config configurations activate pythonrocks
+gcloud config set core/account pythonrocks@gmail.com
+gcloud projects list
+gcloud config set project mygcp-demo
+```
+
+### switch gcloud context with gcloud config
+```
+gcloud config list
+gcloud config set account pythonrocks@gmail.com
+gcloud config set project mygcp-demo
+gcloud config set compute/region us-west1
+gcloud config set compute/zone us-west1-a
+alias demo='gcloud config set account pythonrocks@gmail.com && gcloud config set project mygcp-demo && gcloud config set compute/region us-west1 && gcloud config set compute/zone us-west1-a'
+
+
+cluster=$(gcloud config get-value container/cluster 2> /dev/null)
+zone=$(gcloud config get-value compute/zone 2> /dev/null)
+project=$(gcloud config get-value core/project 2> /dev/null)
+
+# switch project based on the name
+gcloud config set project $(gcloud projects list --filter='name:wordpress-dev' --format='value(project_id)')
+
+```
+
+```
+command -v gcloud >/dev/null 2>&1 || { \
+ echo >&2 "I require gcloud but it's not installed.  Aborting."; exit 1; }
+
+REGION=$(gcloud config get-value compute/region)
+if [[ -z "${REGION}" ]]; then
+    echo "https://cloud.google.com/compute/docs/regions-zones/changing-default-zone-region" 1>&2
+    echo "gcloud cli must be configured with a default region." 1>&2
+    echo "run 'gcloud config set compute/region REGION'." 1>&2
+    echo "replace 'REGION' with the region name like us-west1." 1>&2
+    exit 1;
+fi
+
+```
+
+## auth
+* https://stackoverflow.com/questions/53306131/difference-between-gcloud-auth-application-default-login-and-gcloud-auth-logi/53307505
+* https://medium.com/google-cloud/local-remote-authentication-with-google-cloud-platform-afe3aa017b95
+
+```
+gcloud auth list
+# to authenticate with a user identity (via web flow) which then authorizes gcloud and other SDK tools to access Google Cloud Platform.
+gcloud auth login
+# Service Account: to authenticate with a user identity (via a web flow) but using the credentials as a proxy for a service account.
+gcloud auth application-default login
+gcloud auth activate-service-account --key-file=sa_key.json
+# use GOOGLE_APPLICATION_CREDENTIALS pointing to JSON key
+```
+
+kubectl uses OAuth token generated by
+* `gcloud config config-helper --format json`
+* `gcloud config config-helper --format='value(credential.access_token)'`
+* `gcloud auth print-access-token` generates new token
+
+
+## info
+```
+gcloud info --format flattened
+export PROJECT=$(gcloud info --format='value(config.project)')
+```
+
+## projects
+
+```
+# various way to get project_id
+PROJECT_ID=$(gcloud config get-value core/project 2>/dev/null)
+PROJECT_ID=$(gcloud config list project --format='value(core.project)')
+PROJECT_ID=$(gcloud info --format='value(config.project)')
+
+# get project_number given project_id or name
+gcloud projects list --filter="project_id:${PROJECT_ID}"  --format='value(project_number)'
+gcloud projects list --filter="name:${project_name}"  --format='value(project_number)'
+```
+
+## zones & regions
+To return a list of zones given a region
+```
+gcloud compute zones list --filter=region:us-central1
+```
+```
+# list regions
+gcloud compute regions list
+```
+
+## organization
+```
+ORG_ID=$(gcloud organizations list --format 'value(ID)')
+# list top level folders
+gcloud resource-manager folders list --organization=$ORG_ID
+# list sub folders given upper level folder id
+gcloud resource-manager folders list --organization=$FOLDER_ID
+
+# grant roles to a user
+ORGANIZATION_ADMIN_ADDRESS='user:developer1@example.com'
+gcloud resource-manager folders add-iam-policy-binding ${folder_id} \
+  --member=${ORGANIZATION_ADMIN_ADDRESS} \
+  --role=roles/resourcemanager.folderAdmin
+gcloud resource-manager folders add-iam-policy-binding ${folder_id} \
+  --member=${ORGANIZATION_ADMIN_ADDRESS} \
+  --role=roles/storage.admin
+gcloud resource-manager folders add-iam-policy-binding ${folder_id} \
+  --member=${ORGANIZATION_ADMIN_ADDRESS} \
+  --role=roles/billing.projectManager
+```
+
+## billing
+```
+gcloud organizations list
+gcloud beta billing accounts list
+# link a billing account with a project, assuming the user or svc account has "Billing Account User" role.
+gcloud beta billing projects link ${project_id} \
+            --billing-account ${ORGANIZATION_BILLING_ACCOUNT}
+```
+
+## IAM list permission and roles for a given resource
+```
+gcloud iam list-testable-permissions <uri>
+e.g gcloud iam list-testable-permissions //cloudresourcemanager.googleapis.com/projects/$PROJECT_ID
+
+gcloud iam list-grantable-roles <uri>
+e.g.
+gcloud iam list-grantable-roles //cloudresourcemanager.googleapis.com/projects/$PROJECT_ID
+gcloud iam list-grantable-roles https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/zones/us-central1-a/instances/iowa1
+
+# get uri e.g.
+gcloud projects list --uri
+```
+
+## IAM service account
+
+```
+export SA_EMAIL=$(gcloud iam service-accounts list \
+    --filter="displayName:jenkins" --format='value(email)')
+export PROJECT=$(gcloud info --format='value(config.project)')
+
+# creaate and list sa
+gcloud iam service-accounts create jenkins --display-name jenkins
+gcloud iam service-accounts list
+gcloud iam service-accounts list   --filter='email ~ [0-9]*-compute@.*'   --format='table(email)'
+
+# create & list sa key  
+gcloud iam service-accounts keys create jenkins-sa.json --iam-account $SA_EMAIL    
+gcloud iam service-accounts keys list --iam-account=vault-admin@<project_id>.iam.gserviceaccount.com
+
+## project level: get a list of roles assigned to a given sa such as terraform
+ gcloud projects get-iam-policy ${PROJECT_ID} --flatten="bindings[].members" --filter="bindings.members:serviceAccount:terraform@${PROJECT_ID}.iam.gserviceaccount.com"
+
+# project level: grant roles to a given sa
+gcloud projects get-iam-policy $PROJECT
+gcloud projects add-iam-policy-binding $PROJECT  --role roles/storage.admin \
+    --member serviceAccount:$SA_EMAIL
+gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.instanceAdmin.v1 \
+    --member serviceAccount:$SA_EMAIL
+gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.networkAdmin \
+    --member serviceAccount:$SA_EMAIL
+gcloud projects add-iam-policy-binding $PROJECT --role roles/compute.securityAdmin \
+    --member serviceAccount:$SA_EMAIL
+gcloud projects add-iam-policy-binding $PROJECT --role roles/iam.serviceAccountActor \
+    --member serviceAccount:$SA_EMAIL
+```
+* [When granting IAM roles, you can treat a service account either as a resource or as an identity](https://cloud.google.com/iam/docs/granting-roles-to-service-accounts)
+
+```
+# service account level: add role to service account
+gcloud iam service-accounts get-iam-policy <sa_email>
+gcloud iam service-accounts add-iam-policy-binding infrastructure@retviews-154908.iam.gserviceaccount.com --member='serviceAccount:infrastructure@retviews-154908.iam.gserviceaccount.com' --role='roles/iam.serviceAccountActor'
+```
+* https://cloud.google.com/iam/docs/creating-short-lived-service-account-credentials
+* https://medium.com/@tanujbolisetty/gcp-impersonate-service-accounts-36eaa247f87c
+* https://medium.com/wescale/how-to-generate-and-use-temporary-credentials-on-google-cloud-platform-b425ef95a00d
+* https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/generateAccessToken shows the lifetime of the OAuth token of 3600 seconds by default
+
+```
+# user:godevopsrocks@gmail.com impersonate as a svc account terraform@${PROJECT_ID}.iam.gserviceaccount.com
+gcloud iam service-accounts add-iam-policy-binding  terraform@${PROJECT_ID}.iam.gserviceaccount.com --member=user:godevopsrocks@gmail.com --role roles/iam.serviceAccountTokenCreator
+gcloud container clusters list --impersonate-service-account=terraform@${PROJECT_ID}.iam.gserviceaccount.com
+```
+
+### GCS bucket level
+```
+COMPUTE_ENGINE_SA_EMAIL=$(gcloud iam service-accounts list --filter="name:Compute Engine default service account" --format "value(email)")
+gsutil iam ch serviceAccount:${COMPUTE_ENGINE_SA_EMAIL}:objectViewer gs://bucket-name
+```
+
+### Custom Roles
+```
+# list predefined roles
+gcloud iam roles list
+# list custom roles
+gcloud iam roles list --project $PROJECT_ID
+
+# create custom role in the following 2 ways, either on project level (--project [PROJECT_ID]) or org level (--organization [ORGANIZATION_ID])
+1. gcloud iam roles create editor --project $PROJECT_ID --file role-definition.yaml
+2. gcloud iam roles create viewer --project $PROJECT_ID --title "Role Viewer" --description "Custom role description." --permissions compute.instances.get,compu
+te.instances.list --stage ALPHA
+```
+
+## app engine
+* https://medium.com/google-cloud/app-engine-project-cleanup-9647296e796a
+
+## cloud build
+
+```
+# user defined
+gcloud builds submit --config=cloudbuild.yaml --substitutions=_BRANCH_NAME=foo,_BUILD_NUMBER=1 .
+
+# override built in TAG_NAME
+gcloud builds submit --config=cloudbuild.yaml --substitutions=TAG_NAME=v1.0.1
+```
+
+### Cloud build trigger GCE rolling replace/start
+* https://medium.com/google-cloud/continuous-delivery-in-google-cloud-platform-cloud-build-with-compute-engine-a95bf4fd1821
+* https://cloud.google.com/compute/docs/instance-groups/updating-managed-instance-groups#performing_a_rolling_replace_or_restart
+
+```
+steps:
+- name: 'gcr.io/cloud-builders/docker'
+  args: [ 'build', '-t', 'gcr.io/$PROJECT_ID/gcp-cloudbuild-gce-angular', '.' ]
+- name: 'gcr.io/cloud-builders/gcloud'
+  args: [ 'beta', 'compute', 'instance-groups', 'managed', 'rolling-action', 'restart', 'gce-angular-instance-group', '--zone=us-east1-b' ]
+images:
+- 'gcr.io/$PROJECT_ID/gcp-cloudbuild-gce-angular'
+
+```
+
+## kms
+* [cloud-encrypt-with-kms](https://codelabs.developers.google.com/codelabs/cloud-encrypt-with-kms/#0)
+* [Integrated with cloud build](https://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-secrets-credentials)
+
+```
+# list all keyrings
+gcloud kms keyrings list --location global
+# list all keys in my_key_ring
+gcloud kms keys list --keyring my_key_ring --location global
+
+# grant KMS IAM permission to a sv account $USER_EMAIL
+gcloud kms keyrings add-iam-policy-binding $KEYRING_NAME \
+    --location global \
+    --member user:$USER_EMAIL \
+    --role roles/cloudkms.admin
+gcloud kms keyrings add-iam-policy-binding $KEYRING_NAME \
+    --location global \
+    --member user:$USER_EMAIL \
+    --role roles/cloudkms.cryptoKeyEncrypterDecrypter
+
+# Encrypt and Decrypt in REST API
+curl -v "https://cloudkms.googleapis.com/v1/projects/$DEVSHELL_PROJECT_ID/locations/global/keyRings/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_NAME:encrypt" \
+  -d "{\"plaintext\":\"$PLAINTEXT\"}" \
+  -H "Authorization:Bearer $(gcloud auth application-default print-access-token)"\
+  -H "Content-Type:application/json" \
+| jq .ciphertext -r > 1.encrypted
+
+curl -v "https://cloudkms.googleapis.com/v1/projects/$DEVSHELL_PROJECT_ID/locations/global/keyRings/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_NAME:decrypt" \
+  -d "{\"ciphertext\":\"$(cat 1.encrypted)\"}" \
+  -H "Authorization:Bearer $(gcloud auth application-default print-access-token)"\
+  -H "Content-Type:application/json" \
+| jq .plaintext -r | base64 -d    
+```
+
+## secret manager
+* https://blog.scalesec.com/gcp-secret-manager-first-look-eaa9b0620da1
+
+```
+# create a secret
+gcloud beta secrets create SECRET_NAME --replication-policy="automatic"
+#create a secret version
+gcloud beta secrets versions add "SECRET_NAME" --data-file="/path/to/file.txt"
+# list
+gcloud beta secrets list
+# read
+gcloud beta secrets versions access latest --secret=my_ssh_private_key
+#update the labels (metadata) of a secret
+gcloud beta secrets update SECRET_NAME --update-labels=KEY=VALUE
+```
+
+## compute engine
+
+### gcloud command for creating an instance?
+from web console
+```
+gcloud compute instances create [INSTANCE_NAME] \
+  --image-family [IMAGE_FAMILY] \
+  --image-project [IMAGE_PROJECT] \
+  --create-disk image=[DISK_IMAGE],image-project=[DISK_IMAGE_PROJECT],size=[SIZE_GB],type=[DISK_TYPE]
+
+gcloud compute instances create micro1 --zone=us-west1-a --machine-type=f1-micro --subnet=default --network-tier=PREMIUM --maintenance-policy=MIGRATE --service-account=398028291895-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append --min-cpu-platform=Automatic --image=debian-9-stretch-v20180510 --image-project=debian-cloud --boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=micro1
+```
+
+### list compute images
+```
+gcloud compute images list --filter=name:debian --uri
+https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-8-jessie-v20180109
+https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/debian-9-stretch-v20180105
+
+# Use the following command to see available non-Shielded VM Windows Server images
+gcloud compute images list --project windows-cloud --no-standard-images
+# Use the following command to see a list of available Shielded VM images, including Windows images
+gcloud compute images list --project gce-uefi-images --no-standard-images
+```
+
+### list an instance
+* [filters](https://cloud.google.com/sdk/gcloud/reference/topic/filters)
+* [resource-keys](https://cloud.google.com/sdk/gcloud/reference/topic/resource-keys)
+
+```
+gcloud compute instances list --filter="zone:us-central1-a"
+gcloud compute instances list --project=dev --filter="name~^es"
+gcloud compute instances list --project=dev --filter=name:kafka --format="value(name,INTERNAL_IP)"
+gcloud compute instances list --filter=tags:kafka-node
+gcloud compute instances list --filter='machineType:g1-small'
+```
+
+### move instance
+`gcloud compute instances move <instance_wanna_move> --destination-zone=us-central1-a --zone=us-central1-c`
+
+### ssh & scp
+```
+#--verbosity=debug is great for debugging, showing the SSH command
+# the following is a real word example for running a bastion server that talks to a GKE cluster (master authorized network)
+gcloud compute ssh --verbosity=debug <instance_name> --command "kubectl get nodes"
+
+gcloud compute scp  --recurse ../manifest <instance_name>:
+```
+
+### SSH via IAP
+* https://cloud.google.com/iap/docs/using-tcp-forwarding
+
+```
+# find out access-config-name's name
+gcloud compute instances describe oregon1
+# remove the external IP
+gcloud compute instances delete-access-config  oregon1 --access-config-name "External NAT"
+# connect via IAP, assuming the IAP is granted to the account used for login.
+gcloud beta compute ssh oregon1 --tunnel-through-iap
+```
+### ssh port forwarding for elasticsearch
+```
+gcloud compute --project "foo" ssh --zone "us-central1-c" "elasticsearch-1"  --ssh-flag="-L localhost:9200:localhost:9200"
+```
+The 2nd `localhost` is relative to  elasticsearch-1`
+
+### ssh reverse port forwarding
+for example, how to connect to home server's flask server (tcp port 5000) for a demo or a local game server in development
+```
+GOOGLE_CLOUD_PROJECT=$(gcloud config get-value project)
+gcloud compute --project "${GOOGLE_CLOUD_PROJECT}" ssh --zone "us-west1-c" --ssh-flag="-v -N -R :5000:localhost:5000" "google_cloud_bastion_server"
+```
+
+### generate ssh config
+```
+gcloud compute config-ssh
+```
+
+### Windows RDP reset windows password
+returns the IP and password for creating the RDP connection.
+```
+gcloud compute reset-windows-password qa-iceberg-instance --user=jdoe
+
+ip_address: 104.199.119.166
+password:   Ks(;_gx7Bf2d.NP
+username:   jode
+```
+
+
+
+### debugging
+gcloud debugging: `gcloud  compute instances list --log-http`
+[serial port debug](https://cloud.google.com/compute/docs/instances/interacting-with-serial-console)
+
+
+### instance level metadata
+```
+curl -s "http://metadata.google.internal/computeMetadata/v1/instance/?recursive=true&alt=text" -H "Metadata-Flavor: Google"
+leader=$(curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/leader" -H "Metadata-Flavor: Google")
+```
+
+### project level metadata
+```
+gcloud compute project-info describe
+gcloud compute project-info describe --flatten="commonInstanceMetadata[]"
+```
+
+### instances, template, target-pool and instance group
+```
+cat << EOF > startup.sh
+#! /bin/bash
+apt-get update
+apt-get install -y nginx
+service nginx start
+sed -i -- 's/nginx/Google Cloud Platform - '"\$HOSTNAME"'/' /var/www/html/index.nginx-debian.html
+EOF
+
+gcloud compute instance-templates create nginx-template  --metadata-from-file startup-script=startup.sh
+gcloud compute target-pools create nginx-pool
+gcloud compute instance-groups managed create nginx-group \
+         --base-instance-name nginx \
+         --size 2 \
+         --template nginx-template \
+         --target-pool nginx-pool
+```
+
+### MIG with startup and shutdown scripts
+https://cloud.google.com/vpc/docs/special-configurations#multiple-natgateways
+
+```
+gsutil cp gs://nat-gw-template/startup.sh .
+
+gcloud compute instance-templates create nat-1 \
+    --machine-type n1-standard-2 --can-ip-forward --tags natgw \
+    --metadata-from-file=startup-script=startup.sh --address $nat_1_ip
+
+gcloud compute instance-templates create nat-2 \
+    --machine-type n1-standard-2 --can-ip-forward --tags natgw \
+    --metadata-from-file=startup-script=startup.sh  --address $nat_2_ip
+```
+### disk snapshot
+```
+gcloud compute disks snapshot kafka-data1-1 --async --snapshot-names=kafka-data-1 --project project_a --zone us-west1-a
+Use [gcloud compute operations describe URI] command to check the status of the operation(s).
+```
+
+### regional disk
+```
+ gcloud beta compute instance attach-disk micro1 --disk pd-west1 --disk-scope regional
+```
+
+
+
+## Networking
+
+### network and subnets
+```
+ gcloud compute networks create privatenet --subnet-mode=custom
+ gcloud compute networks subnets create privatesubnet-us --network=privatenet --region=us-central1 --range=172.16.0.0/24
+ gcloud compute networks subnets create privatesubnet-eu --network=privatenet --region=europe-west1 --range=172.20.0.0/20
+ gcloud compute networks subnets list --sort-by=NETWORK
+```
+
+### route
+tag the instances with `no-ips`
+
+```
+gcloud compute instances add-tags existing-instance --tags no-ip
+gcloud compute routes create no-ip-internet-route \
+    --network custom-network1 \
+    --destination-range 0.0.0.0/0 \
+    --next-hop-instance nat-gateway \
+    --next-hop-instance-zone us-central1-a \
+    --tags no-ip --priority 800
+```
+### firewall rules
+* https://medium.com/@swongra/protect-your-google-cloud-instances-with-firewall-rules-69cce960fba
+
+```
+# allow SSH, RDP and ICMP for the given network
+gcloud compute firewall-rules create managementnet-allow-icmp-ssh-rdp --direction=INGRESS --priority=1000 --network=managementnet --action=ALLOW --rules=tcp:22,3389,icmp --source-ranges=0.0.0.0/0
+# allow internal from given source range
+gcloud compute firewall-rules create mynetwork-allow-internal --network \
+mynetwork --action ALLOW --direction INGRESS --rules all \
+--source-ranges 10.128.0.0/9
+gcloud compute firewall-rules list --filter="network:mynetwork"
+
+## DENY
+gcloud compute firewall-rules create mynetwork-deny-icmp \
+--network mynetwork --action DENY --direction EGRESS --rules icmp \
+--destination-ranges 10.132.0.2 --priority 500
+gcloud compute firewall-rules list \
+--filter="network:mynetwork AND name=mynetwork-deny-icmp"
+
+# sort-by
+gcloud compute firewall-rules list --sort-by=NETWORK
+
+```
+
+### layer 4 network lb
+```
+gcloud compute firewall-rules create www-firewall --allow tcp:80
+gcloud compute forwarding-rules create nginx-lb \
+         --region us-central1 \
+         --ports=80 \
+         --target-pool nginx-pool
+
+gcloud compute firewall-rules list --sort-by=NETWORK
+
+```
+
+### layer 7 http lb
+* https://cloud.google.com/solutions/scalable-and-resilient-apps
+
+```
+gcloud compute http-health-checks create http-basic-check
+gcloud compute instance-groups managed \
+       set-named-ports nginx-group \
+       --named-ports http:80
+
+gcloud compute backend-services create nginx-backend \
+      --protocol HTTP --http-health-checks http-basic-check --global
+
+gcloud compute backend-services add-backend nginx-backend \
+    --instance-group nginx-group \
+    --instance-group-zone us-central1-a \
+    --global  
+
+gcloud compute url-maps create web-map \
+    --default-service nginx-backend
+
+gcloud compute target-http-proxies create http-lb-proxy \
+    --url-map web-map
+
+gcloud compute forwarding-rules create http-content-rule \
+        --global \
+        --target-http-proxy http-lb-proxy \
+        --ports 80
+gcloud compute forwarding-rules list
+
+```
+
+### forwarding-rules
+```
+gcloud compute forwarding-rules list --filter=$(dig +short <dns_name>)
+gcloud compute forwarding-rules describe my-forwardingrule --region us-central1
+gcloud compute forwarding-rules describe my-http-forwardingrule --global
+```
+
+### address
+```
+# get the external IP address of the instance
+gcloud compute instances describe single-node \
+     --format='value(networkInterfaces.accessConfigs[0].natIP)
+
+gcloud compute addresses describe https-lb --global --format json
+
+# list all IP addresses
+gcloud projects list --format='value(project_id)' | xargs -I {} gcloud compute addresses list --format='value(address)' --project {}  2>/dev/null | sort | uniq -c
+```
+
+## interconnect
+
+```
+# list Google Compute Engine interconnect locations
+gcloud compute interconnects locations list
+```
+
+## GCP managed ssl certificate
+```
+gcloud beta compute ssl-certificates create example-mydomain --domains example.mydomain.com
+gcloud beta compute ssl-certificates list
+gcloud beta compute ssl-certificates describe example-mydomain
+# It takes 30mins+ to provision the TLS, one of conditions is the target-https-proxies needs to be associated with the cert.
+gcloud beta compute target-https-proxies list
+```
+
+
+## StackDriver logging
+```
+gcloud logging read "timestamp >= \"2018-04-19T00:30:00Z\"  and logName=projects/${project_id}/logs/requests and resource.type=http_load_balancer" --format="csv(httpRequest.remoteIp,httpRequest.requestUrl,timestamp)" --project=${project_id}
+```
+
+## Service
+
+### list service available
+
+`gcloud services list --available`
+
+### Enable Service
+
+```
+# chain
+gcloud services enable cloudapis.googleapis.com && \
+cloudresourcemanager.googleapis.com && \
+compute.googleapis.com
+
+# or not chain
+gcloud services enable container.googleapis.com
+gcloud services enable containerregistry.googleapis.com
+gcloud services enable cloudbuild.googleapis.com
+gcloud services enable iam.googleapis.com
+gcloud services enable logging.googleapis.com
+gcloud services enable monitoring.googleapis.com
+gcloud services enable storage-api.googleapis.com
+gcloud services enable storage-component.googleapis.com
+gcloud services enable sourcerepo.googleapis.com
+```
+
+```
+function enable-service() {
+  SERVICE=$1
+  if [[ $(gcloud services list --format="value(serviceConfig.name)" \
+                                --filter="serviceConfig.name:$SERVICE" 2>&1) != \
+                                "$SERVICE" ]]; then
+    echo "Enabling $SERVICE"
+    gcloud services enable $SERVICE
+  else
+    echo "$SERVICE is already enabled"
+  fi
+}
+
+enable-service container.googleapis.com
+```
+
+## Client libraries you can use to connect to Google APIs
+* https://medium.com/google-cloud/simple-google-api-auth-samples-for-service-accounts-installed-application-and-appengine-da30ee4648
+
+
+## chaining gcloud commands
+```
+gcloud compute forwarding-rules list --format 'value(NAME)' \
+| xargs -I {}  gcloud compute forwarding-rules delete {}  --region us-west1 -q
+
+gcloud projects list --format='value(project_id)' \
+| xargs -I {} gcloud compute addresses list --format='value(address)' --project {}  2>/dev/null | sort | uniq -c
+
+gcloud compute instances list --filter=elasticsearch --format='value(NAME)' \
+| xargs -I {} -p gcloud compute instances stop {}
+gcloud compute instances list --filter=elasticsearch --format='value(INTERNAL_IP)' \
+| xargs -I {} ssh {} "sudo chef-client"
+
+# delete non default routes
+gcloud compute routes list --filter="NOT network=default" --format='value(NAME)' \
+| xargs -I {} gcloud compute routes delete -q {}
+```
+
+## one liner to purge GCR images given a date
+```
+DATE=2018-10-01
+IMAGE=<project_id>/<image_name>
+gcloud container images list-tags gcr.io/$IMAGE --limit=unlimited --sort-by=TIMESTAMP   \
+--filter="NOT tags:* AND timestamp.datetime < '${DATE}'" --format='get(digest)' | \
+while read digest;do gcloud container images delete -q --force-delete-tags gcr.io/$IMAGE@$digest ;done
+```
+## GKE
+```
+# create a private cluster
+gcloud beta container clusters create private-cluster \
+    --private-cluster \
+    --master-ipv4-cidr 172.16.0.16/28 \
+    --enable-ip-alias \
+    --create-subnetwork ""
+
+
+gcloud compute networks subnets create my-subnet \
+    --network default \
+    --range 10.0.4.0/22 \
+    --enable-private-ip-google-access \
+    --region us-central1 \
+    --secondary-range my-svc-range=10.0.32.0/20,my-pod-range=10.4.0.0/14
+
+gcloud beta container clusters create private-cluster2 \
+    --private-cluster \
+    --enable-ip-alias \
+    --master-ipv4-cidr 172.16.0.32/28 \
+    --subnetwork my-subnet \
+    --services-secondary-range-name my-svc-range \
+    --cluster-secondary-range-name my-pod-range
+
+ gcloud container clusters update private-cluster2 \
+    --enable-master-authorized-networks \
+    --master-authorized-networks <external_ip_of_kubectl_instance>
+```
+
+```
+# create a GKE cluster with CloudRun,Istio, HPA enabled
+gcloud beta container clusters create run-gke \
+  --addons HorizontalPodAutoscaling,HttpLoadBalancing,Istio,CloudRun \
+  --scopes cloud-platform \
+  --zone us-central1-a \
+  --machine-type n1-standard-4 \
+  --enable-stackdriver-kubernetes \
+  --no-enable-ip-alias
+```
+
+
+```
+# create a VPC native cluster
+gcloud container clusters create k1 \
+--network custom-ip-vpc --subnetwork subnet-alias \
+--enable-ip-alias --cluster-ipv4-cidr=/16   --services-ipv4-cidr=/22
+```
+
+```
+# get the GKE endpoint
+gcloud container clusters describe mycluster --format='get(endpoint)'
+```
+
+```
+# generate a ~/.kube/config for private cluster with private endpoint
+gcloud container clusters get-credentials private-cluster --zone us-central1-a --internal-ip
+```
+
+### create a GKE cluster with label and query it later
+
+```
+gcloud container clusters create example-cluster --labels env=dev
+gcloud container clusters list --filter resourceLabels.env=dev
+```
+
+
+## Cloud Run
+```
+# deploy a service on Cloud Run in us-central1 and allow unauthenticated user
+gcloud beta run deploy --image gcr.io/${PROJECT-ID}/helloworld --platform managed --region us-central1 --allow-unauthenticated
+
+# list services
+gcloud beta run services list
+# get endpoint url for a service
+gcloud beta run services describe <service_name> --format="get(status.url)"
+```
+
+
+## Machine Learning
+```
+brew install bat
+gcloud ml language analyze-entities --content="Michelangelo Caravaggio, Italian painter, is known for 'The Calling of Saint Matthew'." | bat  -l json
+```
+
+## Deployment Manager
+* https://cloud.google.com/sdk/gcloud/reference/deployment-manager/deployments/

+ 1 - 0
docs/saas/heroku.md

@@ -0,0 +1 @@
+# Heroku  

+ 11 - 0
docs/saas/linode.md

@@ -0,0 +1,11 @@
+# Linode  
+
+- [https://manager.linode.com](https://manager.linode.com)
+- [https://www.linode.com/docs/security/securing-your-server](https://www.linode.com/docs/security/securing-your-server)
+- [https://www.linode.com/docs/networking/dns/using-your-systems-hosts-file/](https://www.linode.com/docs/networking/dns/using-your-systems-hosts-file/)
+- [https://www.linode.com/docs/security/advanced-ssh-server-security/](https://www.linode.com/docs/security/advanced-ssh-server-security/)
+- [https://www.linode.com/docs/security/firewalls/control-network-traffic-with-iptables/](https://www.linode.com/docs/security/firewalls/control-network-traffic-with-iptables/)
+
+##### updates
+- [https://www.linode.com/docs/run-a-distribution-supplied-kernel-with-kvm](https://www.linode.com/docs/tools-reference/custom-kernels-distros/run-a-distribution-supplied-kernel-with-kvm)
+  - As of February, 2017, you can boot your Linode using your choice of Linode's own kernel or the upstream kernel provided by a distribution's maintainers. Booting with Linode's kernel is enabled by default, but changing to the distro-supplied kernel is easy. This is useful if you'd like to enable specific kernel features, or if you'd prefer to handle kernel upgrades yourself.

+ 8 - 0
docs/saas/now.md

@@ -0,0 +1,8 @@
+#Now
+
+[https://zeit.co/now](https://zeit.co/now)
+[https://github.com/zeit/now-cli](https://github.com/zeit/now-cli)
+
+
+##### deployments
+* [https://atom-remote-pair-server-ycrghxzwxb.now.sh/](https://atom-remote-pair-server-ycrghxzwxb.now.sh/)

+ 5 - 0
docs/saas/stripe.md

@@ -0,0 +1,5 @@
+# Stripe
+
+* [Docs](https://stripe.com/docs)
+* [API Docs](https://stripe.com/docs/api)
+* [Stripe - Node.js](https://github.com/stripe/stripe-node)

+ 3 - 0
docs/saas/twilio.md

@@ -0,0 +1,3 @@
+# Twilio
+
+- [https://www.twilio.com/](https://www.twilio.com/)

+ 4 - 0
docs/server/apache.md

@@ -0,0 +1,4 @@
+
+
+#### mod_evasive  
+[https://www.linode.com/docs/web-servers/apache-tips-and-tricks/modevasive-on-apache](https://www.linode.com/docs/web-servers/apache-tips-and-tricks/modevasive-on-apache)

+ 532 - 0
docs/server/docker.md

@@ -0,0 +1,532 @@
+
+
+- [https://www.docker.com/](https://www.docker.com/)
+- [https://cloud.docker.com/app/windhamdavid](https://cloud.docker.com/app/windhamdavid)
+- [https://cloud.docker.com/swarm/windhamdavid/](https://cloud.docker.com/swarm/windhamdavid/)
+- [https://hub.docker.com/u/windhamdavid/](https://hub.docker.com/u/windhamdavid/)
+- [https://docs.docker.com/](https://docs.docker.com/)
+- [https://hub.docker.com/](https://hub.docker.com/)
+
+
+
+
+
+/// Because the image that Linode provides for Ubuntu 16.04 LTS has a custom Linux Kernel Installed in it. So we can’t install linux-image-extra package normally see
+- [https://github.com/linode/docs/issues/480#issuecomment-231653920](https://github.com/linode/docs/issues/480#issuecomment-231653920)
+- [https://github.com/linode/docs/pull/575/files](https://github.com/linode/docs/pull/575/files)
+```
+apt-get install -y dmsetup
+dmsetup mknodes
+
+```
+##Cheat Sheet
+[sorce](https://github.com/eon01/DockerCheatSheet)
+## Installation
+
+### Linux
+
+```
+curl -sSL https://get.docker.com/ | sh
+```
+
+### Mac
+
+Use this link to download the dmg.
+
+```
+https://download.docker.com/mac/stable/Docker.dmg
+```
+
+###  Windows
+
+Use the msi installer:
+
+```
+https://download.docker.com/win/stable/InstallDocker.msi
+```
+
+## Docker Registries & Repositories
+
+### Login to a Registry
+
+```
+docker login
+```
+
+```
+docker login localhost:8080
+```
+
+### Logout from a Registry.
+
+```
+docker logout
+```
+
+```
+docker logout localhost:8080
+```
+
+### Searching an Image
+
+```
+docker search nginx
+```
+
+```
+docker search nginx --stars=3 --no-trunc busybox
+```
+
+### Pulling an Image
+
+```
+docker pull nginx
+```
+
+```
+docker pull eon01/nginx localhost:5000/myadmin/nginx
+```
+
+### Pushing an Image
+
+```
+docker push eon01/nginx
+```
+
+```
+docker push eon01/nginx localhost:5000/myadmin/nginx
+```
+
+## Running Containers
+
+### Creating a Container
+
+```
+docker create -t -i eon01/infinite --name infinite
+```
+
+### Running a Container
+
+```
+docker run -it --name infinite -d eon01/infinite
+```
+
+### Renaming a Container
+
+```
+docker rename infinite infinity
+```
+
+### Removing a Container
+
+```
+docker rm infinite
+```
+
+### Updating a Container
+
+```
+docker update --cpu-shares 512 -m 300M infinite
+```
+
+## Starting & Stopping Containers
+
+### Starting
+
+```
+docker start nginx
+```
+
+### Stopping
+```
+docker stop nginx
+```
+
+### Restarting
+```
+docker restart nginx
+```
+
+### Pausing
+```
+docker pause nginx
+
+```
+
+### Unpausing
+
+```
+docker unpause nginx
+```
+
+### Blocking a Container
+
+```
+docker wait nginx
+```
+
+### Sending a SIGKILL
+
+```
+docker kill nginx
+```
+
+### Connecting to an Existing Container
+
+```
+docker attach nginx
+```
+
+
+## Getting Information about Containers
+
+### Running Containers
+
+```
+docker ps
+```
+
+```
+docker ps -a
+```
+
+### Container Logs
+
+```
+docker logs infinite
+```
+
+### Inspecting Containers
+
+```
+docker inspect infinite
+```
+
+### Containers Events
+
+```
+docker events infinite
+```
+
+### Public Ports
+
+```
+docker port infinite
+```
+
+### Running Processes
+
+```
+docker top infinite
+```
+
+### Container Resource Usage
+
+```
+docker stats infinite
+```
+
+### Inspecting changes to files or directories on a container’s filesystem
+
+```
+docker diff infinite
+```
+
+
+### Manipulating Images
+
+### Listing Images
+
+```
+docker images
+```
+
+### Building Images
+
+```
+docker build .
+```
+
+```
+docker build github.com/creack/docker-firefox
+```
+
+```
+docker build - < Dockerfile
+```
+
+```
+docker build - < context.tar.gz
+```
+
+```
+docker build -t eon/infinite .
+```
+
+```
+docker build -f myOtherDockerfile .
+```
+
+```
+curl example.com/remote/Dockerfile | docker build -f - .
+```
+
+
+
+### Removing an Image
+
+```
+docker rmi nginx
+```
+
+### Loading a Tarred Repository from a File or the Standard Input Stream
+
+```
+docker load < ubuntu.tar.gz
+```
+
+```
+docker load --input ubuntu.tar
+```
+
+### Save an Image to a Tar Archive
+
+```
+docker save busybox > ubuntu.tar
+```
+
+### Showing the History of an Image
+
+```
+docker history
+```
+
+### Creating an Image From a Container
+
+```
+docker commit nginx
+```
+
+### Tagging an Image
+
+```
+docker tag nginx eon01/nginx
+```
+
+### Pushing an Image
+
+```
+docker push eon01/nginx
+```
+
+
+## Networking
+
+### Creating Networks
+
+```
+docker network create -d overlay MyOverlayNetwork
+```
+
+```
+docker network create -d bridge MyBridgeNetwork
+```
+
+```
+docker network create -d overlay \
+  --subnet=192.168.0.0/16 \
+  --subnet=192.170.0.0/16 \
+  --gateway=192.168.0.100 \
+  --gateway=192.170.0.100 \
+  --ip-range=192.168.1.0/24 \
+  --aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
+  --aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
+  MyOverlayNetwork
+```
+
+### Removing a Network
+
+```
+docker network rm MyOverlayNetwork
+```
+
+### Listing Networks
+
+```
+docker network ls
+```
+
+### Getting Information About a Network
+
+```
+docker network inspect MyOverlayNetwork
+```
+
+### Connecting a Running Container to a Network
+
+```
+docker network connect MyOverlayNetwork nginx
+```
+
+### Connecting a Container to a Network When it Starts
+
+```
+docker run -it -d --network=MyOverlayNetwork nginx
+```
+
+### Disconnecting a Container from a Network
+
+```
+docker network disconnect MyOverlayNetwork nginx
+```
+
+
+## Cleaning Docker
+
+### Removing a Running Container
+
+```
+docker rm nginx
+```
+
+### Removing a Container and its Volume
+
+```
+docker rm -v nginx
+```
+
+### Removing all Exited Containers
+
+```
+docker rm $(docker ps -a -f status=exited -q)
+```
+
+
+### Removing All Stopped Containers
+
+```
+docker rm `docker ps -a -q`
+```
+
+### Removing a Docker Image
+
+```
+docker rmi nginx
+```
+
+### Removing Dangling Images
+
+```
+docker rmi $(docker images -f dangling=true -q)
+```
+
+### Removing all Images
+
+```
+docker rmi $(docker images -a -q)
+```
+
+### Stopping & Removing all Containers
+
+```
+docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)
+```
+
+### Removing Dangling Volumes
+
+```
+docker volume rm $(docker volume ls -f dangling=true -q)
+```
+
+## Docker Swarm
+
+### Installing Docker Swarm
+
+```
+curl -ssl https://get.docker.com | bash
+```
+
+
+### Initializing the Swarm
+
+```
+docker swarm init --advertise-addr 192.168.10.1
+```
+
+
+### Getting a Worker to Join the Swarm
+
+```
+docker swarm join-token worker
+```
+
+
+### Getting a Manager to Join the Swarm
+
+```
+docker swarm join-token manager
+```
+
+
+
+### Listing Services
+
+```
+docker service ls
+```
+
+
+### Listing nodes
+
+```
+docker node ls
+```
+
+
+### Creating a Service
+
+```
+docker service create --name vote -p 8080:80 instavote/vote
+```
+
+
+### Listing Swarm Tasks
+
+```
+docker service ps
+```
+
+
+### Scaling a Service
+
+
+```
+docker service scale vote=3
+```
+
+
+### Updating a Service
+
+```
+docker service update --image instavote/vote:movies vote
+```
+
+```
+docker service update --force --update-parallelism 1 --update-delay 30s nginx
+```
+
+```
+docker service update --update-parallelism 5--update-delay 2s --image instavote/vote:indent vote
+```
+
+```
+docker service update --limit-cpu 2 nginx
+```
+
+```
+docker service update --replicas=5 nginx
+```
+
+## Notes
+
+This work was first published in [Painless Docker Course](http://painlessdocker.com)

+ 13 - 0
docs/server/goaccess.md

@@ -0,0 +1,13 @@
+
+
+- [https://goaccess.io/](https://goaccess.io/)
+- [https://github.com/allinurl/goaccess](https://github.com/allinurl/goaccess)
+- [https://goaccess.io/man](https://goaccess.io/man)
+
+```
+    $ echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
+    $ wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
+    $ sudo apt-get update
+    $ sudo apt-get install goaccess
+
+```

+ 374 - 0
docs/server/htop.md

@@ -0,0 +1,374 @@
+
+
+#### **NAME**
+
+       htop - interactive process viewer
+
+#### **SYNOPSIS**
+
+       **htop** **\[**\-dChusv\]
+
+#### **DESCRIPTION**
+
+       Htop is a free (GPL) ncurses-based process viewer for Linux.
+
+       It is similar to top, but allows you to scroll vertically and horizontally, so you can see
+       all the processes running on the system, along with their full command lines, as  well  as
+       viewing  them  as  a  process tree, selecting multiple processes and acting on them all at
+       once.
+
+       Tasks related to processes (killing, renicing) can be done without entering their PIDs.
+
+#### **COMMAND-LINE** **OPTIONS**
+
+       Mandatory arguments to long options are mandatory for short options too.
+
+       **\-d** **\--delay=DELAY**
+              Delay between updates, in tenths of seconds
+
+       **\-C** **\--no-color** **\--no-colour**
+              Start htop in monochrome mode
+
+       **\-h** **\--help**
+              Display a help message and exit
+
+       **\-p** **\--pid=PID,PID...**
+              Show only the given PIDs
+
+       **\-s** **\--sort-key** **COLUMN**
+              Sort by this column (use --sort-key help for a column list)
+
+       **\-u** **\--user=USERNAME**
+              Show only the processes of a given user
+
+       **\-v** **\--version**
+              Output version information and exit
+
+#### **INTERACTIVE** **COMMANDS**
+
+       The following commands are supported while in htop:
+
+       **Up,** **Alt-k**
+            Select (highlight) the previous process in the  process  list.  Scroll  the  list  if
+            necessary.
+
+       **Down,** **Alt-j**
+            Select  (highlight)  the  next  process  in  the  process  list.  Scroll  the list if
+            necessary.
+
+       **Left,** **Alt-h**
+            Scroll the process list left.
+
+       **Right,** **Alt-l**
+            Scroll the process list right.
+
+       **PgUp,** **PgDn**
+            Scroll the process list up or down one window.
+
+       **Home** Scroll to the top of the process list and select the first process.
+
+       **End**  Scroll to the bottom of the process list and select the last process.
+
+       **Ctrl-A,** **^**
+            Scroll left to the beginning of the process entry (i.e. beginning of line).
+
+       **Ctrl-E,** **$**
+            Scroll right to the end of the process entry (i.e. end of line).
+
+       **Space**
+            Tag or untag a process. Commands that can operate on multiple processes, like "kill",
+            will  then  apply  over  the  list  of  tagged  processes,  instead  of the currently
+            highlighted one.
+
+       **U**    Untag all processes (remove all tags added with the Space key).
+
+       **s**    Trace process system calls: if [strace](../man1/strace.1.html)(1) is installed, pressing this key will  attach
+            it to the currently selected process, presenting a live update of system calls issued
+            by the process.
+
+       **l**    Display open files for a process: if [lsof](../man1/lsof.1.html)(1) is installed,  pressing  this  key  will
+            display the list of file descriptors opened by the process.
+
+       **F1,** **h,** **?**
+            Go to the help screen
+
+       **F2,** **S**
+            Go  to  the  setup screen, where you can configure the meters displayed at the top of
+            the screen, set various display options, choose among color schemes, and select which
+            columns are displayed, in which order.
+
+       **F3,** **/**
+            Incrementally  search the command lines of all the displayed processes. The currently
+            selected (highlighted) command will  update  as  you  type.  While  in  search  mode,
+            pressing F3 will cycle through matching occurrences.
+
+       **F4,** **\\**
+            Incremental  process  filtering:  type  in  part  of  a process command line and only
+            processes whose names match will be shown. To  cancel  filtering,  enter  the  Filter
+            option again and press Esc.
+
+       **F5,** **t**
+            Tree view: organize processes by parenthood, and layout the relations between them as
+            a tree. Toggling the key will switch between tree and your previously  selected  sort
+            view. Selecting a sort view will exit tree view.
+
+       **F6**   On  sorted  view,  select  a field for sorting, also accessible through < and >.  The
+            current sort field is indicated by a highlight in the header.  On tree  view,  expand
+            or  collapse  the current subtree. A "+" indicator in the tree node indicates that it
+            is collapsed.
+
+       **F7,** **\]**
+            Increase the selected process's priority (subtract from 'nice' value).  This can only
+            be done by the superuser.
+
+       **F8,** **\[**
+            Decrease the selected process's priority (add to 'nice' value)
+
+       **F9,** **k**
+            "Kill"  process:  sends  a  signal  which is selected in a menu, to one or a group of
+            processes. If processes were tagged, sends the signal to all  tagged  processes.   If
+            none is tagged, sends to the currently selected process.
+
+       **F10,** **q**
+            Quit
+
+       **I**    Invert  the  sort order: if sort order is increasing, switch to decreasing, and vice-
+            versa.
+
+       **+,** **\-** When in tree view mode, expand or collapse subtree. When a subtree is collapsed a "+"
+            sign shows to the left of the process name.
+
+       **a** **(on** **multiprocessor** **machines)**
+            Set CPU affinity: mark which CPUs a process is allowed to use.
+
+       **u**    Show only processes owned by a specified user.
+
+       **M**    Sort by memory usage (top compatibility key).
+
+       **P**    Sort by processor usage (top compatibility key).
+
+       **T**    Sort by time (top compatibility key).
+
+       **F**    "Follow"  process: if the sort order causes the currently selected process to move in
+            the list, make the selection bar follow it. This is useful for monitoring a  process:
+            this  way,  you  can  keep a process always visible on screen. When a movement key is
+            used, "follow" loses effect.
+
+       **K**    Hide kernel threads: prevent the threads belonging the kernel to be displayed in  the
+            process list. (This is a toggle key.)
+
+       **H**    Hide user threads: on systems that represent them differently than ordinary processes
+            (such as recent NPTL-based systems), this can hide threads from  userspace  processes
+            in the process list. (This is a toggle key.)
+
+       **p**    Show full paths to running programs, where applicable. (This is a toggle key.)
+
+       **Ctrl-L**
+            Refresh: redraw screen and recalculate values.
+
+       **Numbers**
+            PID search: type in process ID and the selection highlight will be moved to it.
+
+#### **COLUMNS**
+
+       The  following columns can display data about each process. A value of '-' in all the rows
+       indicates that a column is unsupported on your system, or currently unimplemented in htop.
+       The  names below are the ones used in the "Available Columns" section of the setup screen.
+       If a different name is shown in htop's main screen, it is shown below in parenthesis.
+
+       **Command**
+            The full command line of the process (i.e. program name and arguments).
+
+       **PID**  The process ID.
+
+       **STATE** **(S)**
+            The state of the process:
+               **S** for sleeping (idle)
+               **R** for running
+               **D** for disk sleep (uninterruptible)
+               **Z** for zombie (waiting for parent to read its exit status)
+               **T** for traced or suspended (e.g by SIGTSTP)
+               **W** for paging
+
+       **PPID** The parent process ID.
+
+       **PGRP** The process's group ID.
+
+       **SESSION** **(SID)**
+            The process's session ID.
+
+       **TTY\_NR** **(TTY)**
+            The controlling terminal of the process.
+
+       **TPGID**
+            The process ID of the foreground process group of the controlling terminal.
+
+       **MINFLT**
+            The number of page faults happening in the main memory.
+
+       **CMINFLT**
+            The number of minor faults for the process's waited-for children (see MINFLT above).
+
+       **MAJFLT**
+            The number of page faults happening out of the main memory.
+
+       **CMAJFLT**
+            The number of major faults for the process's waited-for children (see MAJFLT above).
+
+       **UTIME** **(UTIME+)**
+            The user CPU time, which is the amount of time the process has spent executing on the
+            CPU in user mode (i.e. everything but system calls), measured in clock ticks.
+
+       **STIME** **(STIME+)**
+            The  system  CPU  time,  which  is  the amount of time the kernel has spent executing
+            system calls on behalf of the process, measured in clock ticks.
+
+       **CUTIME** **(CUTIME+)**
+            The children's user CPU time, which is the amount of time  the  process's  waited-for
+            children have spent executing in user mode (see UTIME above).
+
+       **CSTIME** **(CSTIME+)**
+            The  children's  system  CPU  time,  which is the amount of time the kernel has spent
+            executing system calls on behalf of all the process's waited-for children (see  STIME
+            above).
+
+       **PRIORITY** **(PRI)**
+            The  kernel's  internal  priority  for  the process, usually just its nice value plus
+            twenty. Different for real-time processes.
+
+       **NICE** **(NI)**
+            The nice value of a process, from 19 (low priority) to -20 (high  priority).  A  high
+            value  means  the  process  is  being  nice,  letting  others  have a higher relative
+            priority. The usual OS permission restrictions for adjusting priority apply.
+
+       **STARTTIME** **(START)**
+            The time the process was started.
+
+       **PROCESSOR** **(CPU)**
+            The ID of the CPU the process last executed on.
+
+       **M\_SIZE** **(VIRT)**
+            The size of the virtual memory of the process.
+
+       **M\_RESIDENT** **(RES)**
+            The resident set size (text + data + stack) of the process  (i.e.  the  size  of  the
+            process's used physical memory).
+
+       **M\_SHARE** **(SHR)**
+            The size of the process's shared pages.
+
+       **M\_TRS** **(CODE)**
+            The  text resident set size of the process (i.e. the size of the process's executable
+            instructions).
+
+       **M\_DRS** **(DATA)**
+            The data resident set size (data + stack) of the process (i.e. the size  of  anything
+            except the process's executable instructions).
+
+       **M\_LRS** **(LIB)**
+            The library size of the process.
+
+       **M\_DT** **(DIRTY)**
+            The size of the dirty pages of the process.
+
+       **ST\_UID** **(UID)**
+            The user ID of the process owner.
+
+       **PERCENT\_CPU** **(CPU%)**
+            The percentage of the CPU time that the process is currently using.
+
+       **PERCENT\_MEM** **(MEM%)**
+            The  percentage  of  memory  the  process  is currently using (based on the process's
+            resident memory size, see M\_RESIDENT above).
+
+       **USER** The username of the process owner, or the user ID if the name can't be determined.
+
+       **TIME** **(TIME+)**
+            The time, measured in clock ticks that the process has spent in user and system  time
+            (see UTIME, STIME above).
+
+       **NLWP** The number of threads in the process.
+
+       **TGID** The thread group ID.
+
+       **CTID** OpenVZ container ID, a.k.a virtual environment ID.
+
+       **VPID** OpenVZ process ID.
+
+       **VXID** VServer process ID.
+
+       **RCHAR** **(RD\_CHAR)**
+            The number of bytes the process has read.
+
+       **WCHAR** **(WR\_CHAR)**
+            The number of bytes the process has written.
+
+       **SYSCR** **(RD\_SYSC)**
+            The number of [read](../man2/read.2.html)(2) syscalls for the process.
+
+       **SYSCW** **(WR\_SYSC)**
+            The number of [write](../man2/write.2.html)(2) syscalls for the process.
+
+       **RBYTES** **(IO\_RBYTES)**
+            Bytes of [read](../man2/read.2.html)(2) I/O for the process.
+
+       **WBYTES** **(IO\_WBYTES)**
+            Bytes of [write](../man2/write.2.html)(2) I/O for the process.
+
+       **CNCLWB** **(IO\_CANCEL)**
+            Bytes of cancelled [write](../man2/write.2.html)(2) I/O.
+
+       **IO\_READ\_RATE** **(DISK** **READ)**
+            The I/O rate of [read](../man2/read.2.html)(2) in bytes per second, for the process.
+
+       **IO\_WRITE\_RATE** **(DISK** **WRITE)**
+            The I/O rate of [write](../man2/write.2.html)(2) in bytes per second, for the process.
+
+       **IO\_RATE** **(DISK** **R/W)**
+            The I/O rate, IO\_READ\_RATE + IO\_WRITE\_RATE (see above).
+
+       **CGROUP**
+            Which cgroup the process is in.
+
+       **OOM**  OOM killer score.
+
+       **IO\_PRIORITY** **(IO)**
+            The I/O scheduling class followed by the priority if the class supports it:
+               **R** for Realtime
+               **B** for Best-effort
+               **id** for Idle
+
+       **PERCENT\_CPU\_DELAY** **(CPUD%)**
+            The   percentage  of  time  spent  waiting  for  a  CPU  (while  runnable).  Requires
+            CAP\_NET\_ADMIN.
+
+       **PERCENT\_IO\_DELAY** **(IOD%)**
+            The percentage of time spent waiting for the completion  of  synchronous  block  I/O.
+            Requires CAP\_NET\_ADMIN.
+
+       **PERCENT\_SWAP\_DELAY** **(SWAPD%)**
+            The percentage of time spent swapping in pages. Requires CAP\_NET\_ADMIN.
+
+       **All** **other** **flags**
+            Currently unsupported (always displays '-').
+
+#### **CONFIG** **FILE**
+
+       By  default htop reads its configuration from the XDG-compliant path [~/.config/htop/htoprc](file:~/.config/htop/htoprc)
+       -- the configuration file is overwritten by htop's in-program Setup configuration,  so  it
+       should  not be hand-edited. If no user configuration exists htop tries to read the system-
+       wide configuration from /etc/htoprc and as a last resort, falls back  to  its  hard  coded
+       defaults.
+
+       You  may  override  the  location  of the configuration file using the $HTOPRC environment
+       variable (so you can have multiple configurations for different machines  that  share  the
+       same home directory, for example).
+
+#### **MEMORY** **SIZES**
+
+       Memory  sizes  in htop are displayed as they are in tools from the GNU Coreutils (when ran
+       with the --human-readable option). This means that sizes are printed in  powers  of  1024.
+       (e.g., 1023M = 1072693248 Bytes)
+
+       The  decision  to  use this convention was made in order to conserve screen space and make
+       memory size representations consistent throughout htop.

+ 1329 - 0
docs/server/iptables.md

@@ -0,0 +1,1329 @@
+
+
+```
+@woozer:/etc/nginx/sites-available » sudo iptables -L -nv --line-numbers
+Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
+num   pkts bytes target     prot opt in     out     source               destination         
+1     730K  360M ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
+2        0     0 REJECT     all  --  !lo    *       127.0.0.0/8          0.0.0.0/0            reject-with icmp-port-unreachable
+3     3515  351K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 3
+4      856 45500 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8
+5      336 25775 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 11
+6     6308  268K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
+7     226K   23M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
+8     976K  534M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
+9    12568 1520K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3000
+10    332K  238M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:4791
+11   14312 1043K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8080
+12    3988  316K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8888
+13    4051  300K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8181
+14    7476 4796K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8008
+15     432 45268 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8282
+16       0     0 ACCEPT     all  --  *      *       96.126.119.66        0.0.0.0/0            state NEW
+17   69460  114M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
+18   98440 6129K LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables_INPUT_denied: "
+19    103K 6474K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
+
+Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
+num   pkts bytes target     prot opt in     out     source               destination         
+1        0     0 LOG        all  --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables_FORWARD_denied: "
+2        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
+
+Chain OUTPUT (policy ACCEPT 301K packets, 271M bytes)
+num   pkts bytes target     prot opt in     out     source               destination         
+
+@woozer:/etc/nginx/sites-available » 
+```
+
+
+
+[Source](https://www.linode.com/docs/security/firewalls/control-network-traffic-with-iptables "Permalink to Control Network Traffic with iptables")
+
+# Control Network Traffic with iptables
+
+Updated Wednesday, February 28, 2017 by Linode
+
+Use promo code **DOCS10** for $10 credit on a new account. 
+
+**iptables** is an application that allows users to configure specific rules that will be enforced by the kernel's `netfilter` framework. It acts as a packet filter and firewall that examines and directs traffic based on port, protocol and other criteria. This guide will focus on the configuration and application of iptables rulesets and will provide examples of ways they are commonly used.
+
+![Control Network Traffic with iptables][1]
+
+By default, the iptables tool is included with your Linode-supplied distribution. In order to use iptables, you will need root (`sudo`) privileges.
+
+## Use Linux iptables to Manage IPv4 Traffic
+
+### The iptables Command
+
+Many options can be used with the iptables command. As stated above, iptables sets the rules that control network traffic. You can define different tables to handle these rules through chains, lists of rules that match a subset of packets. The table contains a variety of built-in chains, but you can add your own.
+
+### Basic iptables Parameters and Syntax
+
+Before we begin creating rules, let's review the syntax of an iptables rule.
+
+For example, the following command adds a rule to the beginning of the chain that will drop all packets from the address `198.51.100.0`:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    iptables -I INPUT -s 198.51.100.0 -j DROP
+    
+
+ | 
+
+The sample command above:
+
+1. Calls the `iptables` program
+2. Uses the `-I` option for _insertion_. Using a rule with the insertion option will add it to the beginning of a chain and will be applied first. To indicate a specific placement in the chain, you may also use a number with the `-I` option.
+3. The `-s` parameter, along with the IP address (198.51.100.0), indicates the _source_.
+4. Finally, the `-j` parameter stands for _jump_. It specifies the target of the rule and what action will be performed if the packet is a match.
+
+| Parameter             | Description                                                                                 |  
+| --------------------- | ------------------------------------------------------------------------------------------- |  
+| `-p, --protocol`      | The protocol, such as TCP, UDP, etc.                                                        |  
+| `-s, --source`        | Can be an address, network name, hostname, etc.                                             |  
+| `-d, --destination`   | An address, hostname, network name, etc.                                                    |  
+| `-j, --jump`          | Specifies the target of the rule; i.e. what to do if the packet matches.                    |  
+| `-g, --goto chain`    | Specifies that the processing will continue in a user-specified chain.                      |  
+| `-i, --in-interface`  | Names the interface from where packets are received.                                        |  
+| `-o, --out-interface` | Name of the interface by which a packet is being sent.                                      |  
+| `-f, --fragment`      | The rule will only be applied to the second and subsequent fragments of fragmented packets. |  
+| `-c, --set-counters`  | Enables the admin to initialize the packet and byte counters of a rule.                     |  
+
+### Default Tables
+
+Tables are made up of built-in chains and may also contain user-defined chains. The built-in tables will depend on the kernel configuration and the installed modules.
+
+The default tables are as follows:
+
+* **Filter** \- This is the default table. Its built-in chains are: 
+    * Input: packets going to local sockets
+    * Forward: packets routed through the server
+    * Output: locally generated packets
+* **Nat** \- When a packet creates a new connection, this table is used. Its built-in chains are: 
+    * Prerouting: designating packets when they come in
+    * Output: locally generated packets before routing takes place
+    * Postrouting: altering packets on the way out
+* **Mangle** \- Used for special altering of packets. Its chains are: 
+    * Prerouting: incoming packets
+    * Postrouting: outgoing packets
+    * Output: locally generated packets that are being altered
+    * Input: packets coming directly into the server
+    * Forward: packets being routed through the server
+* **Raw** \- Primarily used for configuring exemptions from connection tracking. The built-in chains are: 
+    * Prerouting: packets that arrive by the network interface
+    * Output: processes that are locally generated
+* **Security** \- Used for Mandatory Access Control (MAC) rules. After the filter table, the security table is accessed next. The built-in chains are: 
+    * Input: packets entering the server
+    * Output: locally generated packets
+    * Forward: packets passing through the server
+
+### Basic iptables Options
+
+There are many options that may be used with the `iptables` command:
+
+| Option                     | Description                                                                |  
+| -------------------------- | -------------------------------------------------------------------------- |  
+| `-A --append`              | Add one or more rules to the end of the selected chain.                    |  
+| `-C --check`               | Check for a rule matching the specifications in the selected chain.        |  
+| `-D --delete`              | Delete one or more rules from the selected chain.                          |  
+| `-F --flush`               | Delete _all_ the rules one-by-one.                                         |  
+| `-I --insert`              | Insert one or more rules into the selected chain as the given rule number. |  
+| `-L --list`                | Display the rules in the selected chain.                                   |  
+| `-n --numeric`             | Display the IP address or hostname and post number in numeric format.      |  
+| `-N --new-chain `    | Create a new user-defined chain.                                           |  
+| `-v --verbose`             | Provide more information when used with the list option.                   |  
+| `-X --delete-chain ` | Delete the user-defined chain.                                             |  
+
+### Insert, Replace or Delete iptables Rules
+
+iptables rules are enforced top down, so the first rule in the ruleset is applied to traffic in the chain, then the second, third and so on. This means that rules cannot necessarily be added to a ruleset with `iptables -A` or `ip6tables -A`. Instead, rules must be _inserted_ with `iptables -I` or `ip6tables -I`.
+
+**Insert**
+
+Inserted rules need to be placed in the correct order with respect to other rules in the chain. To get a numerical list of your iptables rules:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    sudo iptables -L -nv --line-numbers
+    
+
+ | 
+
+For example, let's say you want to insert a rule into the [basic ruleset][2] provided in this guide, that will accept incoming connections to port 8080 over the TCP protocol. We'll add it as rule 7 to the INPUT chain, following the web traffic rules:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    sudo iptables -I INPUT 7 -p tcp --dport 8080 -m state --state NEW -j ACCEPT
+    
+
+ | 
+
+If you now run `sudo iptables -L -nv` again, you'll see the new rule in the output.
+
+**Replace**
+
+Replacing a rule is similar to inserting, but instead uses `iptables -R`. For example, let's say you want to reduce the logging of denied entries to only 3 per minute, down from 5 in the original ruleset. The LOG rule is ninth in the INPUT chain:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    sudo iptables -R INPUT 9 -m limit --limit 3/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
+    
+
+ | 
+
+**Delete**
+
+Deleting a rule is also done using the rule number. For example, to delete the rule we just inserted for port 8080:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    sudo iptables -D INPUT 7
+    
+
+ | 
+
+> Editing rules does not automatically save them. See our section on [deploying rulesets][3] for the specific instructions for your distribution.
+
+### View Your Current iptables Rules
+
+IPv4:
+
+IPv6:
+
+On most distributions, iptables has no default rules for either IPv4 and IPv6. As a result, on a newly created Linode you will likely see what is shown below - three empty chains without any firewall rules. This means that all incoming, forwarded and outgoing traffic is _allowed_. It's important to limit inbound and forwarded traffic to only what's necessary.
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+
+ | 
+    
+    
+    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+    
+    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+    
+    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+    
+
+ | 
+
+## Configure iptables
+
+iptables can be configured and used in a variety of ways. The following sections will outline how to configure rules by port and IP, as well as how to blacklist (block) or whitelist (allow) addresses.
+
+### Block Traffic by Port
+
+You may use a port to block all traffic coming in on a specific interface. For example:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    iptables -A INPUT -j DROP -p tcp --destination-port 110 -i eth0
+    
+
+ | 
+
+Let's examine what each part of this command does:
+
+* `-A` will add or append the rule to the end of the chain.
+* `INPUT` will add the rule to the table.
+* `DROP` means the packets are discarded.
+* `-p tcp` means the rule will only drop TCP packets.
+* `\--destination-port 110` filters packets targeted to port 110.
+* `-i eth0` means this rule will impact only packets arriving on the _eth0_ interface.
+
+It is important to understand that iptables do _not_ recognize aliases on the network interface. Therefore, if you have several virtual IP interfaces, you will have to specify the destination address to filter the traffic. A sample command is provided below:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    iptables -A INPUT -j DROP -p tcp --destination-port 110 -i eth0 -d 198.51.100.0
+    
+
+ | 
+
+You may also use `-D` or `\--delete` to remove rules. For example, these commands are equivalent:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+
+ | 
+    
+    
+    iptables --delete INPUT -j DROP -p tcp --destination-port 110 -i eth0 -d 198.51.100.0
+    iptables -D INPUT -j DROP -p tcp --destination-port 110 -i eth0 -d 198.51.100.0
+    
+
+ | 
+
+### Drop Traffic from an IP
+
+In order to drop all incoming traffic from a specific IP address, use the iptables command with the following options:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    iptables -I INPUT -s 198.51.100.0 -j DROP
+    
+
+ | 
+
+To remove these rules, use the `\--delete` or `-D` option:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+
+ | 
+    
+    
+    iptables --delete INPUT -s 198.51.100.0 -j DROP
+    iptables -D INPUT -s 198.51.100.0 -j DROP
+    
+
+ | 
+
+### Block or Allow Traffic by Port Number to Create an iptables Firewall
+
+One way to create a firewall is to block all traffic to the system and then allow traffic on certain ports. Below is a sample sequence of commands to illustrate the process:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+
+ | 
+    
+    
+    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+    iptables -A INPUT -i lo -m comment --comment "Allow loopback connections" -j ACCEPT
+    iptables -A INPUT -p icmp -m comment --comment "Allow Ping to work as expected" -j ACCEPT
+    iptables -A INPUT -p tcp -m multiport --destination-ports 22,25,53,80,443,465,5222,5269,5280,8999:9003 -j ACCEPT
+    iptables -A INPUT -p udp -m multiport --destination-ports 53 -j ACCEPT
+    iptables -P INPUT DROP
+    iptables -P FORWARD DROP
+    
+
+ | 
+
+Let's break down the example above. The first two commands add or append rules to the `INPUT` chain in order to allow access on specific ports. The `-p tcp` and `-p udp` options specify either UDP or TCP packet types. The `-m multiport` function matches packets on the basis of their source or destination ports, and can accept the specification of up to 15 ports. Multiport also accepts ranges such as `8999:9003` which counts as 2 of the 15 possible ports, but matches ports `8999`, `9000`, `9001`, `9002`, and `9003`. The next command allows all incoming and outgoing packets that are associated with existing connections so that they will not be inadvertently blocked by the firewall. The final two commands use the `-P` option to describe the _default policy_ for these chains. As a result, all packets processed by `INPUT` and `FORWARD` will be dropped by default.
+
+Note that the rules described above only control incoming packets, and do not limit outgoing connections.
+
+### Whitelist/Blacklist Traffic by Address
+
+You can use iptables to block all traffic and then only allow traffic from certain IP addresses. These firewall rules limit access to specific resources at the network layer. Below is an example sequence of commands:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+
+ | 
+    
+    
+    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+    iptables -A INPUT -i lo -m comment --comment "Allow loopback connections" -j ACCEPT
+    iptables -A INPUT -p icmp -m comment --comment "Allow Ping to work as expected" -j ACCEPT
+    iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
+    iptables -A INPUT -s 198.51.100.0 -j ACCEPT
+    iptables -P INPUT DROP
+    iptables -P FORWARD DROP
+    
+
+ | 
+
+In the first command, the `-s 192.168.1.0/24` statement specifies that all source IPs (`-s`) in the address space of `192.168.1` are allowed. You may specify an IP address range using CIDR (Classless Inter-Domain Routing) notation, or individual IP addresses, as in the second command. The third command allows all incoming and outgoing packets that are associated with existing connections. The final two commands set the default policy for all `INPUT` and `FORWARD` chains to drop all packets.
+
+## Use ip6tables to Manage IPv6 Traffic
+
+When you're working with IPv6, remember that the `iptables` command is not compatible. Instead, there is an `ip6tables` command. The options such as append, check, etc. are the same. The tables used by ip6tables are _raw_, _security_, _mangle_ and _filter_. The parameters such as protocol, source, etc. are the same. The syntax is essentially the same as IPv4. Sample syntax is below:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    ip6tables [-t table] -N chain
+    
+
+ | 
+
+To view what rules are configured for IPv6, use the command:
+
+### Configure Rules for IPv6
+
+ip6tables works by using ports, specific addresses for blacklisting, protocols and so forth. The primary difference is that ip6tables can use extended packet matching modules with the `-m` or `match` options, followed by the module name. Below are some of the extended modules:
+
+* **addrtype** \- Matches packets based on their address type. Some of the address types are: 
+    * Local
+    * Unicast
+    * Broadcast
+    * Multicast
+* **ah** \- Matches the parameters in the authentication header of IPsec packets.
+* **cluster** \- You can deploy gateway and backend load-sharing clusters without a load balancer.
+* **comment** \- Allows you to add a comment to any rule.
+* **connbytes** \- Matches by how many bytes or packets a connection has transferred, or average bytes per packet.
+
+This is not intended to be a complete or comprehensive list. You may review the full list of extended modules by using the `man` page:
+
+Below is a sample rule used in ip6tables:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+
+ | 
+    
+    
+    # limit the number of parallel HTTP requests to 16 for the link local network
+    ip6tables -A INPUT -p tcp --syn --dport 80 -s fe80::/64 -m connlimit --connlimit-above 16 --connlimit-mask 64 -j REJECT
+    ip6tables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
+    
+
+ | 
+
+This rule breaks down as follows:
+
+* The first line is a comment.
+* `-A` is for append.
+* `INPUT` is to add the rule to the table.
+* `-p` is for protocol, which is TCP.
+* `\--syn` only matches TCP packets with the SYN bit set and the ACK, RST, and FIN bits cleared.
+* `\--dport` is the destination port, which is 80.
+* `-s` is the source, which is the local address range fe80::/64.
+* `-m` is for match.
+* `connlimit` is the extended packet module name, which is connection limit.
+* `\--connlimit-above 16` means if the number of connections exceeds 16, only the first 16 will be used.
+* `\--connlimit-mask 64` means the group hosts are using a prefix length of 64.
+* `-j` is for jump, it tells the target of the rule what to do if the packet is a match.
+* `REJECT` means the packet is dropped.
+
+### Required Rules for Non-Static IPv6 Allocations
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+
+ | 
+    
+    
+    # Below are the rules which are required for your IPv6 address to be properly allocated
+    ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -m hl --hl-eq 255 -j ACCEPT
+    ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -m hl --hl-eq 255 -j ACCEPT
+    ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -m hl --hl-eq 255 -j ACCEPT
+    ip6tables -A INPUT -p icmpv6 --icmpv6-type redirect -m hl --hl-eq 255 -j ACCEPT
+    
+
+ | 
+
+## Basic iptables Rulesets for IPv4 and IPv6
+
+Appropriate firewall rules depend on the services being run. Below are iptables rulesets to secure your Linode if you're running a web server.
+
+> **These rules are given only as an example.** A real production web server may require more or less configuration, and these rules would not be appropriate for a database, Minecraft or VPN server. Iptables rules can always be modified or reset later, but these basic rulesets serve as a demonstration.
+
+**IPv4**
+
+/tmp/v4
+: 
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+    10
+    11
+    12
+    13
+    14
+    15
+    16
+    17
+    18
+    19
+    20
+    21
+    22
+    23
+    24
+    25
+    26
+    27
+    28
+    29
+    30
+    31
+    32
+    33
+    34
+    35
+    36
+
+ | 
+    
+    
+    *filter
+    
+    # Allow all loopback (lo0) traffic and reject traffic
+    # to localhost that does not originate from lo0.
+    -A INPUT -i lo -j ACCEPT
+    -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
+    
+    # Allow ping.
+    -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
+    
+    # Allow SSH connections.
+    -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
+    
+    # Allow HTTP and HTTPS connections from anywhere
+    # (the normal ports for web servers).
+    -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
+    -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
+    
+    # Allow inbound traffic from established connections.
+    # This includes ICMP error returns.
+    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+    
+    # Log what was incoming but denied (optional but useful).
+    -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7
+    
+    # Reject all other inbound.
+    -A INPUT -j REJECT
+    
+    # Log any traffic that was sent to you
+    # for forwarding (optional but useful).
+    -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7
+    
+    # Reject all traffic forwarding.
+    -A FORWARD -j REJECT
+    
+    COMMIT
+    
+
+ | 
+
+**Optional:** If you plan to use [Linode Longview][4] or [Linode's NodeBalancers][5], add the respective rule after the section for allowing HTTP and HTTPS connections:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+
+ | 
+    
+    
+    # Allow incoming Longview connections from longview.linode.com
+    -A INPUT -s 96.126.119.66 -m state --state NEW -j ACCEPT
+    
+
+ | 
+
+| ----- |
+| 
+    
+    
+    1
+    2
+
+ | 
+    
+    
+    # Allow incoming NodeBalancer connections
+    -A INPUT -s 192.168.255.0/24 -m state --state NEW -j ACCEPT
+    
+
+ | 
+
+**IPv6**
+
+If you would like to supplement your web server's IPv4 rules with IPv6 as well, this ruleset will allow HTTP/S access and all ICMP functions.
+
+/tmp/v6
+: 
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+    10
+    11
+    12
+    13
+    14
+    15
+    16
+    17
+    18
+    19
+    20
+    21
+    22
+    23
+    24
+    25
+    26
+    27
+    28
+    29
+    30
+    31
+    32
+
+ | 
+    
+    
+    *filter
+    
+    # Allow all loopback (lo0) traffic and reject traffic
+    # to localhost that does not originate from lo0.
+    -A INPUT -i lo -j ACCEPT
+    -A INPUT ! -i lo -s ::1/128 -j REJECT
+    
+    # Allow ICMP
+    -A INPUT -p icmpv6 -j ACCEPT
+    
+    # Allow HTTP and HTTPS connections from anywhere
+    # (the normal ports for web servers).
+    -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
+    -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
+    
+    # Allow inbound traffic from established connections.
+    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
+    
+    # Log what was incoming but denied (optional but useful).
+    -A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7
+    
+    # Reject all other inbound.
+    -A INPUT -j REJECT
+    
+    # Log any traffic that was sent to you
+    # for forwarding (optional but useful).
+    -A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7
+    
+    # Reject all traffic forwarding.
+    -A FORWARD -j REJECT
+    
+    COMMIT
+    
+
+ | 
+
+> [APT][6] attempts to resolve mirror domains to IPv6 as a result of `apt-get update`. If you choose to entirely disable and deny IPv6, this will slow down the update process for Debian and Ubuntu because APT waits for each resolution to time out before moving on.
+> 
+> To remedy this, uncomment the line `precedence ::ffff:0:0/96 100` in `/etc/gai.conf`.
+
+## Deploy Your iptables Rulesets
+
+The process for deploying iptables rulesets varies depending on which Linux distribution you're using:
+
+### Debian / Ubuntu
+
+UFW is the iptables controller included with Ubuntu, but it is also available in Debian's repositories. If you prefer to use UFW instead of iptables, see our guide: [How to Configure a Firewall with UFW][7].
+
+1. Create the files `/tmp/v4` and `/tmp/v6`. Paste the [above rulesets][2] into their respective files.
+
+2. Import the rulesets into immediate use:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo iptables-restore < /tmp/v4
+    sudo ip6tables-restore < /tmp/v6
+    
+
+ | 
+
+3. To apply your iptables rules automatically on boot, see our section on configuring [iptables-persistent][8].
+
+### CentOS / Fedora
+
+**CentOS 7 or Fedora 20 and above**
+
+In these distros, FirewallD is used to implement firewall rules instead of using the iptables command. If you prefer to use it over iptables, see our guide: [Introduction to FirewallD on CentOS][9].
+
+1. If you prefer to use iptables, FirewallD must first be stopped and disabled.
+
+| ----- |
+| 
+    
+        1
+
+ | 
+    
+        sudo systemctl stop firewalld.service && sudo systemctl disable firewalld.service
+    
+
+ | 
+
+2. Install `iptables-services` and enable iptables and ip6tables:
+
+| ----- |
+| 
+    
+        1
+    2
+    3
+
+ | 
+    
+        sudo yum install iptables-services
+    sudo systemctl enable iptables && sudo systemctl enable ip6tables
+    sudo systemctl start iptables && sudo systemctl start ip6tables
+    
+
+ | 
+
+3. Create the files `/tmp/v4` and `/tmp/v6`. Paste the [rulesets above][2] into their respective files.
+
+4. Import the rulesets into immediate use:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo iptables-restore < /tmp/v4
+    sudo ip6tables-restore < /tmp/v6
+    
+
+ | 
+
+5. Save each ruleset:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo service iptables save
+    sudo service ip6tables save
+    
+
+ | 
+
+6. Remove the temporary rule files:
+
+**CentOS 6**
+
+1. Create the files `/tmp/v4` and `/tmp/v6`. Paste the [rulesets above][2] into their respective files.
+
+2. Import the rules from the temporary files:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo iptables-restore < /tmp/v4
+    sudo ip6tables-restore < /tmp/v6
+    
+
+ | 
+
+3. Save the rules:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo service iptables save
+    sudo service ip6tables save
+    
+
+ | 
+
+> Firewall rules are saved to `/etc/sysconfig/iptables` and `/etc/sysconfig/ip6tables`.
+
+4. Remove the temporary rule files:
+
+### Arch Linux
+
+1. Create the files `/etc/iptables/iptables.rules` and `/etc/iptables/ip6tables.rules`. Paste the [rulesets above][2] into their respective files.
+
+2. Import the rulesets into immediate use:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo iptables-restore < /etc/iptables/iptables.rules
+    sudo ip6tables-restore < /etc/iptables/ip6tables.rules
+    
+
+ | 
+
+3. iptables does not run by default in Arch. Enable and start the systemd units:
+
+| ----- |
+| 
+    
+        1
+    2
+
+ | 
+    
+        sudo systemctl start iptables && sudo systemctl start ip6tables
+    sudo systemctl enable iptables && sudo systemctl enable ip6tables
+    
+
+ | 
+
+For more info on using iptables in Arch, see its Wiki entries for [iptables][10] and a [simple stateful firewall][11].
+
+### Verify iptables Rulesets
+
+Check your Linode's firewall rules with the `v` option for a verbose output:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+
+ | 
+    
+    
+    sudo iptables -vL
+    sudo ip6tables -vL
+    
+
+ | 
+
+The output for IPv4 rules should show:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+    10
+    11
+    12
+    13
+    14
+    15
+    16
+    17
+    18
+    19
+    20
+    21
+
+ | 
+    
+    
+    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+        0     0 ACCEPT     all  --  lo     any     anywhere             anywhere
+        0     0 REJECT     all  --  !lo    any     loopback/8           anywhere             reject-with icmp-port-unreachable
+        0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp destination-unreachable
+        0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp echo-request
+        0     0 ACCEPT     icmp --  any    any     anywhere             anywhere             icmp time-exceeded
+        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh state NEW
+        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http state NEW
+        0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:https state NEW
+        0     0 ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
+        0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_INPUT_denied: "
+        0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
+    
+    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+        0     0 LOG        all  --  any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_FORWARD_denied: "
+        0     0 REJECT     all  --  any    any     anywhere             anywhere             reject-with icmp-port-unreachable
+    
+    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+    
+
+ | 
+
+Output for IPv6 rules will look like this:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+    10
+    11
+    12
+    13
+    14
+    15
+    16
+    17
+    18
+
+ | 
+    
+    
+    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+        0     0 ACCEPT     all      lo     any     anywhere             anywhere
+        0     0 REJECT     all      !lo    any     localhost            anywhere             reject-with icmp6-port-unreachable
+        0     0 ACCEPT     ipv6-icmp    any    any     anywhere             anywhere
+        0     0 ACCEPT     tcp      any    any     anywhere             anywhere             tcp dpt:http state NEW
+        0     0 ACCEPT     tcp      any    any     anywhere             anywhere             tcp dpt:https state NEW
+        0     0 ACCEPT     all      any    any     anywhere             anywhere             state RELATED,ESTABLISHED
+        0     0 LOG        all      any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_INPUT_denied: "
+        0     0 REJECT     all      any    any     anywhere             anywhere             reject-with icmp6-port-unreachable
+    
+    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+        0     0 LOG        all      any    any     anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_FORWARD_denied: "
+        0     0 REJECT     all      any    any     anywhere             anywhere             reject-with icmp6-port-unreachable
+    
+    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
+     pkts bytes target     prot opt in     out     source               destination
+    
+
+ | 
+
+Your firewall rules are now in place and protecting your Linode. Remember, you may need to edit these rules later if you install other packages that require network access.
+
+## Introduction to iptables-persistent
+
+Ubuntu and Debian have a package called **iptables-persistent** that makes it easy to reapply your firewall rules at boot time. After installation, you can save all your rules in two files (one for IPv4 and one for IPv6). If you've already configured and applied iptables rules, iptables-persistent will detect them automatically and allow you to add them to the appropriate configuration file.
+
+### Install iptables-persistent
+
+On Debian or Ubuntu use the following command to check whether `iptables-persistent` is already installed:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    dpkg -l iptables-persistent
+    
+
+ | 
+
+If `dpkg` returns that there are no matching packages, you will need to install the `iptables-persistent` package:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    apt-get install iptables-persistent
+    
+
+ | 
+
+During the installation, you will be prompted twice. The first prompt is asking if you would like to save your current IPv4 rules.
+
+![Save IPv4 rules prompt.][12]
+
+The second prompt is to save the rules configured for IPv6.
+
+![Save IPv6 rules prompt.][13]
+
+After the install is complete, you should see the iptables's subdirectory. Run the `ls /etc/iptables` command again to verify that your output resembles the following:
+
+### Use iptables-persistent
+
+To view what rules are already configured on your server:
+
+You should see output similar to:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+    8
+    9
+
+ | 
+    
+    
+    Chain INPUT (policy ACCEPT)
+    target      prot opt source         destination
+    DROP        all  --  198.51.100.0    anywhere
+    
+    Chain FORWARD (policy ACCEPT)
+    target      prot opt source         destination
+    
+    CHAIN OUTPUT (policy ACCEPT)
+    target      prot opt source         destination
+    
+
+ | 
+
+The rules above allow anyone anywhere access to everything. If your output resembles this, you'll need to set rules that prevent unauthorized access.
+
+### iptables-persistent Rules
+
+Use the `rules.v4` or `rules.v6` files to add, delete or edit the rules for your server. These files can be edited using a text editor to function as a proxy, NAT or firewall. The configuration depends on the requirements of your server and what functions are needed. Below is a file excerpt from both the `rules.v4` and `rules.v6` files:
+
+/etc/iptables/rules.v4
+: 
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+
+ | 
+    
+    
+    # Generated by iptables-save v1.4.14 on Wed Apr  2 13:24:27 2014
+    *security
+    :INPUT ACCEPT [18483:1240117]
+    :FORWARD ACCEPT [0:0]
+    :OUTPUT ACCEPT [17288:2887358]
+    COMMIT
+    
+
+ | 
+
+/etc/iptables/rules.v6
+: 
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+    4
+    5
+    6
+    7
+
+ | 
+    
+    
+    # Generated by ip6tables-save v1.4.14 on Wed Apr  2 13:24:27 2014
+    *nat
+    :PREROUTING ACCEPT [0:0]
+    :INPUT ACCEPT [0:0]
+    :OUTPUT ACCEPT [27:2576]
+    :POSTROUTING ACCEPT [27:2576]
+    COMMIT
+    
+
+ | 
+
+While some rules are configured in these files already, either file can be edited at any time. The syntax for altering table rules is the same as in the sections [Configure iptables][14] and [Configuring Rules for IPv6][15].
+
+### Save iptables-persistent Rules Through Reboot
+
+By default, iptables-persistent rules save on reboot for IPv4 only. Therefore, if you are running both IPv4 and IPv6 together you will need to manually edit both the `rules.v4` and `rules.v6` files. On older systems, `iptables-save` was used to write the changes to the `rules` file. Now that `iptables-persistent` is an option, do not use the `iptables-save > /etc/iptables/rules.v4` or `iptables-save > /etc/iptables/rules.v6` commands as any IPv6 changes will be overwritten by the IPv4 rules.
+
+To enforce the iptables rules and ensure that they persist after reboot run `dpkg-reconfigure` and respond **Yes** when prompted. (If you ever edit your saved rules in the future, use this same command to save them again.)
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    dpkg-reconfigure iptables-persistent
+    
+
+ | 
+
+To verify the rules are applied and available after the system reboot use the commands:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+
+ | 
+    
+    
+    iptables -L
+    ip6tables -L
+    
+
+ | 
+
+## Network Lock-out
+
+When you're applying network rules, especially with both IPv4 and IPv6 and multiple interfaces, it is easy to lock yourself out. In the event you apply the rule and are unable to access your server, you may gain access through [Lish][16] in the Linode Manager. The following steps will guide you through using the GUI interface of your Linode to gain access to your server:
+
+1. Connect to your Linode Manager.
+2. Click on the Remote Access tab.
+3. Under the section entitled "Console Access," click on the **Launch Lish Ajax Console** link.
+4. Login with your root or sudo user name and password.
+5. [Remove any rules][14] causing the connectivity issues.
+6. Log out of the Lish window.
+7. Attempt login via a regular SSH session.
+
+This Lish console will function similarly to a regular SSH terminal session.
+
+## Troubleshooting: netfilter-persistent doesn't come back up on reboot.
+
+If you have upgraded to Debian 8 from an earlier version, you may see a situation where netfilter-persistent fails to start during boot when using the Linode kernel. The console output will show similar to:
+
+| ----- |
+| 
+    
+    
+    1
+    2
+    3
+
+ | 
+    
+    
+    [FAILED] Failed to start Load Kernel Modules.
+    See 'systemctl status systemd-modules-load.service' for details.
+    [DEPEND] Dependency failed for netfilter persistent configuration
+    
+
+ | 
+
+You can also use `journalctl -xn` to see that systemd can not load the `loop` module:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    systemd-modules-load[3452]: Failed to lookup alias 'loop': Function not implemented
+    
+
+ | 
+
+To fix this, comment out the line `loop` in `/etc/modules`:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    sed -i 's/loop/#loop/g' /etc/apt/sources.list
+    
+
+ | 
+
+Then restart netfilter-persistent:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    systemctl restart netfilter-persistent
+    
+
+ | 
+
+It should then be running fine. Confirm with:
+
+| ----- |
+| 
+    
+    
+    1
+
+ | 
+    
+    
+    systemctl status netfilter-persistent
+    
+
+ | 

+ 280 - 0
docs/server/kubernetes.md

@@ -0,0 +1,280 @@
+
+
+* [https://kubernetes.io/](https://kubernetes.io/)
+* [https://kubernetes.io/docs/home/](https://kubernetes.io/docs/home/)
+
+
+```
+### notes ###
+```
+----
+sheet source - [https://github.com/dennyzhang/cheatsheet-kubernetes-A4](https://github.com/dennyzhang/cheatsheet-kubernetes-A4)
+## Common Commands
+
+| Name                                                                              | Command                                                                                                                                                                                                                                         |
+| --------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Run curl test temporarily                                                         | `kubectl run --rm mytest --image=yauritux/busybox-curl -it`                                                                                                                                                                                     |
+| Run wget test temporarily                                                         | `kubectl run --rm mytest --image=busybox -it`                                                                                                                                                                                                   |
+| Run nginx deployment with 2 replicas                                              | `kubectl run my-nginx --image=nginx --replicas=2 --port=80`                                                                                                                                                                                     |
+| Run nginx pod and expose it                                                       | `kubectl run my-nginx --restart=Never --image=nginx --port=80 --expose`                                                                                                                                                                         |
+| Run nginx deployment and expose it                                                | `kubectl run my-nginx --image=nginx --port=80 --expose`                                                                                                                                                                                         |
+| Set namespace preference                                                          | `kubectl config set-context <context_name> --namespace=<ns_name>`                                                                                                                                                                               |
+| List pods with nodes info                                                         | `kubectl get pod -o wide`                                                                                                                                                                                                                       |
+| List everything                                                                   | `kubectl get all --all-namespaces`                                                                                                                                                                                                              |
+| Get all services                                                                  | `kubectl get service --all-namespaces`                                                                                                                                                                                                          |
+| Get all deployments                                                               | `kubectl get deployments --all-namespaces`                                                                                                                                                                                                      |
+| Show nodes with labels                                                            | `kubectl get nodes --show-labels`                                                                                                                                                                                                               |
+| Get resources with json output                                                    | `kubectl get pods --all-namespaces -o json`                                                                                                                                                                                                     |
+| Validate yaml file with dry run                                                   | `kubectl create --dry-run --validate -f pod-dummy.yaml`                                                                                                                                                                                         |
+| Start a temporary pod for testing                                                 | `kubectl run --rm -i -t --image=alpine test-$RANDOM -- sh`                                                                                                                                                                                      |
+| kubectl run shell command                                                         | `kubectl exec -it mytest -- ls -l /etc/hosts`                                                                                                                                                                                                   |
+| Get system conf via configmap                                                     | `kubectl -n kube-system get cm kubeadm-config -o yaml`                                                                                                                                                                                          |
+| Get deployment yaml                                                               | `kubectl -n denny-websites get deployment mysql -o yaml`                                                                                                                                                                                        |
+| Explain resource                                                                  | `kubectl explain pods`, `kubectl explain svc`                                                                                                                                                                                                   |
+| Watch pods                                                                        | `kubectl get pods  -n wordpress --watch`                                                                                                                                                                                                        |
+| Query healthcheck endpoint                                                        | `curl -L http://127.0.0.1:10250/healthz`                                                                                                                                                                                                        |
+| Open a bash terminal in a pod                                                     | `kubectl exec -it storage sh`                                                                                                                                                                                                                   |
+| Check pod environment variables                                                   | `kubectl exec redis-master-ft9ex env`                                                                                                                                                                                                           |
+| Enable kubectl shell autocompletion                                               | `echo "source <(kubectl completion bash)" >>~/.bashrc`, and reload                                                                                                                                                                              |
+| Use minikube dockerd in your laptop                                               | `eval $(minikube docker-env)`, No need to push docker hub any more                                                                                                                                                                              |
+| Kubectl apply a folder of yaml files                                              | `kubectl apply -R -f .`                                                                                                                                                                                                                         |
+| Get services sorted by name                                                       | kubectl get services –sort-by=.metadata.name                                                                                                                                                                                                    |
+| Get pods sorted by restart count                                                  | kubectl get pods –sort-by='.status.containerStatuses\[0\].restartCount'                                                                                                                                                                         |
+| List pods and images                                                              | kubectl get pods -o='custom-columns=PODS:.metadata.name,Images:.spec.containers\[\*\].image'                                                                                                                                                    |
+| List all container images                                                         | [list-all-images.sh](https://github.com/dennyzhang/cheatsheet-kubernetes-A4/blob/master/list-all-images.sh#L14-L17)                                                                                                                             |
+| kubeconfig skip tls verification                                                  | [skip-tls-verify.md](https://github.com/dennyzhang/cheatsheet-kubernetes-A4/blob/master/skip-tls-verify.md)                                                                                                                                     |
+| [Ubuntu install kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) | `"deb https://apt.kubernetes.io/ kubernetes-xenial main"`                                                                                                                                                                                       |
+| Reference                                                                         | [GitHub: kubernetes releases](https://github.com/kubernetes/kubernetes/tags)                                                                                                                                                                    |
+| Reference                                                                         | [minikube cheatsheet](https://cheatsheet.dennyzhang.com/cheatsheet-minikube-A4), [docker cheatsheet](https://cheatsheet.dennyzhang.com/cheatsheet-docker-A4), [OpenShift CheatSheet](https://cheatsheet.dennyzhang.com/cheatsheet-openshift-A4) |
+
+## Check Performance
+
+| Name                                         | Command                                              |
+| -------------------------------------------- | ---------------------------------------------------- |
+| Get node resource usage                      | `kubectl top node`                                   |
+| Get pod resource usage                       | `kubectl top pod`                                    |
+| Get resource usage for a given pod           | `kubectl top <podname> --containers`                 |
+| List resource utilization for all containers | `kubectl top pod --all-namespaces --containers=true` |
+
+## Resources Deletion
+
+| Name                                    | Command                                                  |
+| --------------------------------------- | -------------------------------------------------------- |
+| Delete pod                              | `kubectl delete pod/<pod-name> -n <my-namespace>`        |
+| Delete pod by force                     | `kubectl delete pod/<pod-name> --grace-period=0 --force` |
+| Delete pods by labels                   | `kubectl delete pod -l env=test`                         |
+| Delete deployments by labels            | `kubectl delete deployment -l app=wordpress`             |
+| Delete all resources filtered by labels | `kubectl delete pods,services -l name=myLabel`           |
+| Delete resources under a namespace      | `kubectl -n my-ns delete po,svc --all`                   |
+| Delete persist volumes by labels        | `kubectl delete pvc -l app=wordpress`                    |
+| Delete state fulset only (not pods)     | `kubectl delete sts/<stateful_set_name> --cascade=false` |
+
+
+
+## Log & Conf Files
+
+| Name                      | Comment                                                                   |
+| ------------------------- | ------------------------------------------------------------------------- |
+| Config folder             | `/etc/kubernetes/`                                                        |
+| Certificate files         | `/etc/kubernetes/pki/`                                                    |
+| Credentials to API server | `/etc/kubernetes/kubelet.conf`                                            |
+| Superuser credentials     | `/etc/kubernetes/admin.conf`                                              |
+| kubectl config file       | `~/.kube/config`                                                          |
+| Kubernets working dir     | `/var/lib/kubelet/`                                                       |
+| Docker working dir        | `/var/lib/docker/`, `/var/log/containers/`                                |
+| Etcd working dir          | `/var/lib/etcd/`                                                          |
+| Network cni               | `/etc/cni/net.d/`                                                         |
+| Log files                 | `/var/log/pods/`                                                          |
+| log in worker node        | `/var/log/kubelet.log`, `/var/log/kube-proxy.log`                         |
+| log in master node        | `kube-apiserver.log`, `kube-scheduler.log`, `kube-controller-manager.log` |
+| Env                       | `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf`                   |
+| Env                       | export KUBECONFIG=/etc/kubernetes/admin.conf                              |
+
+## Pod
+
+| Name                                                                             | Command                                                                                        |
+| -------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
+| List all pods                                                                    | `kubectl get pods`                                                                             |
+| List pods for all namespace                                                      | `kubectl get pods -all-namespaces`                                                             |
+| List all critical pods                                                           | `kubectl get -n kube-system pods -a`                                                           |
+| List pods with more info                                                         | `kubectl get pod -o wide`, `kubectl get pod/<pod-name> -o yaml`                                |
+| Get pod info                                                                     | `kubectl describe pod/srv-mysql-server`                                                        |
+| List all pods with labels                                                        | `kubectl get pods --show-labels`                                                               |
+| [List all unhealthy pods](https://github.com/kubernetes/kubernetes/issues/49387) | kubectl get pods –field-selector=status.phase\!=Running –all-namespaces                        |
+| List running pods                                                                | kubectl get pods –field-selector=status.phase=Running                                          |
+| kubectl run command                                                              | kubectl exec -it -n "$ns" "$podname" – sh -c "echo $msg \>\>/dev/err.log"                      |
+| Watch pods                                                                       | `kubectl get pods  -n wordpress --watch`                                                       |
+| Get pod by selector                                                              | kubectl get pods –selector="app=syslog" -o jsonpath='{.items\[\*\].metadata.name}'             |
+| List pods and images                                                             | kubectl get pods -o='custom-columns=PODS:.metadata.name,Images:.spec.containers\[\*\].image'   |
+| List pods and containers                                                         | \-o='custom-columns=PODS:.metadata.name,CONTAINERS:.spec.containers\[\*\].name'                |
+| Reference                                                                        | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates) |
+
+## Label & Annontation
+
+| Name                             | Command                                                           |
+| -------------------------------- | ----------------------------------------------------------------- |
+| Filter pods by label             | `kubectl get pods -l owner=denny`                                 |
+| Manually add label to a pod      | `kubectl label pods dummy-input owner=denny`                      |
+| Remove label                     | `kubectl label pods dummy-input owner-`                           |
+| Manually add annonation to a pod | `kubectl annotate pods dummy-input my-url=https://dennyzhang.com` |
+
+## Deployment & Scale
+
+| Name                         | Command                                                                                                                                                                                                                                            |
+| ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Scale out                    | `kubectl scale --replicas=3 deployment/nginx-app`                                                                                                                                                                                                  |
+| online rolling upgrade       | `kubectl rollout app-v1 app-v2 --image=img:v2`                                                                                                                                                                                                     |
+| Roll backup                  | `kubectl rollout app-v1 app-v2 --rollback`                                                                                                                                                                                                         |
+| List rollout                 | `kubectl get rs`                                                                                                                                                                                                                                   |
+| Check update status          | `kubectl rollout status deployment/nginx-app`                                                                                                                                                                                                      |
+| Check update history         | `kubectl rollout history deployment/nginx-app`                                                                                                                                                                                                     |
+| Pause/Resume                 | `kubectl rollout pause deployment/nginx-deployment`, `resume`                                                                                                                                                                                      |
+| Rollback to previous version | `kubectl rollout undo deployment/nginx-deployment`                                                                                                                                                                                                 |
+| Reference                    | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates), [Link: Pausing and Resuming a Deployment](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#pausing-and-resuming-a-deployment) |
+
+
+
+## Quota & Limits & Resource
+
+| Name                          | Command                                                                                        |
+| ----------------------------- | ---------------------------------------------------------------------------------------------- |
+| List Resource Quota           | `kubectl get resourcequota`                                                                    |
+| List Limit Range              | `kubectl get limitrange`                                                                       |
+| Customize resource definition | `kubectl set resources deployment nginx -c=nginx --limits=cpu=200m`                            |
+| Customize resource definition | `kubectl set resources deployment nginx -c=nginx --limits=memory=512Mi`                        |
+| Reference                     | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates) |
+
+## Service
+
+| Name                            | Command                                                                                        |
+| ------------------------------- | ---------------------------------------------------------------------------------------------- |
+| List all services               | `kubectl get services`                                                                         |
+| List service endpoints          | `kubectl get endpoints`                                                                        |
+| Get service detail              | `kubectl get service nginx-service -o yaml`                                                    |
+| Expose deployment as lb service | `kubectl expose deployment/my-app --type=LoadBalancer --name=my-service`                       |
+| Expose service as lb service    | `kubectl expose service/wordpress-1-svc --type=LoadBalancer --name=ns1`                        |
+| Reference                       | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates) |
+
+## Secrets
+
+| Name                             | Command                                                                                                                                                                    |
+| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| List secrets                     | `kubectl get secrets --all-namespaces`                                                                                                                                     |
+| Generate secret                  | `echo -n 'mypasswd'`, then redirect to `base64 --decode`                                                                                                                   |
+| Get secret                       | `kubectl get secret denny-cluster-kubeconfig`                                                                                                                              |
+| Get a specific field of a secret | kubectl get secret denny-cluster-kubeconfig -o jsonpath="{.data.value}"                                                                                                    |
+| Create secret from cfg file      | kubectl create secret generic db-user-pass –from-file=./username.txt                                                                                                       |
+| Reference                        | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates), [Link: Secrets](https://kubernetes.io/docs/concepts/configuration/secret/) |
+
+## StatefulSet
+
+| Name                               | Command                                                                                        |
+| ---------------------------------- | ---------------------------------------------------------------------------------------------- |
+| List statefulset                   | `kubectl get sts`                                                                              |
+| Delete statefulset only (not pods) | `kubectl delete sts/<stateful_set_name> --cascade=false`                                       |
+| Scale statefulset                  | `kubectl scale sts/<stateful_set_name> --replicas=5`                                           |
+| Reference                          | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates) |
+
+## Volumes & Volume Claims
+
+| Name                      | Command                                                                                        |
+| ------------------------- | ---------------------------------------------------------------------------------------------- |
+| List storage class        | `kubectl get storageclass`                                                                     |
+| Check the mounted volumes | `kubectl exec storage ls /data`                                                                |
+| Check persist volume      | `kubectl describe pv/pv0001`                                                                   |
+| Copy local file to pod    | `kubectl cp /tmp/my <some-namespace>/<some-pod>:/tmp/server`                                   |
+| Copy pod file to local    | `kubectl cp <some-namespace>/<some-pod>:/tmp/server /tmp/my`                                   |
+| Reference                 | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates) |
+
+## Events & Metrics
+
+| Name                            | Command                                                 |
+| ------------------------------- | ------------------------------------------------------- |
+| View all events                 | `kubectl get events --all-namespaces`                   |
+| List Events sorted by timestamp | kubectl get events –sort-by=.metadata.creationTimestamp |
+
+## Node Maintenance
+
+| Name                                      | Command                       |
+| ----------------------------------------- | ----------------------------- |
+| Mark node as unschedulable                | `kubectl cordon $NDOE_NAME`   |
+| Mark node as schedulable                  | `kubectl uncordon $NDOE_NAME` |
+| Drain node in preparation for maintenance | `kubectl drain $NODE_NAME`    |
+
+## Namespace & Security
+
+| Name                                                                                    | Command                                                                                            |
+| --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| List authenticated contexts                                                             | `kubectl config get-contexts`, `~/.kube/config`                                                    |
+| Set namespace preference                                                                | `kubectl config set-context <context_name> --namespace=<ns_name>`                                  |
+| Load context from config file                                                           | `kubectl get cs --kubeconfig kube_config.yml`                                                      |
+| Switch context                                                                          | `kubectl config use-context <cluster-name>`                                                        |
+| Delete the specified context                                                            | `kubectl config delete-context <cluster-name>`                                                     |
+| List all namespaces defined                                                             | `kubectl get namespaces`                                                                           |
+| List certificates                                                                       | `kubectl get csr`                                                                                  |
+| [Check user privilege](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) | kubectl –as=system:serviceaccount:ns-denny:test-privileged-sa -n ns-denny auth can-i use pods/list |
+| [Check user privilege](https://kubernetes.io/docs/concepts/policy/pod-security-policy/) | `kubectl auth can-i use pods/list`                                                                 |
+| Reference                                                                               | [Link: kubernetes yaml templates](https://cheatsheet.dennyzhang.com/kubernetes-yaml-templates)     |
+
+## Network
+
+| Name                              | Command                                                  |
+| --------------------------------- | -------------------------------------------------------- |
+| Temporarily add a port-forwarding | `kubectl port-forward redis-134 6379:6379`               |
+| Add port-forwaring for deployment | `kubectl port-forward deployment/redis-master 6379:6379` |
+| Add port-forwaring for replicaset | `kubectl port-forward rs/redis-master 6379:6379`         |
+| Add port-forwaring for service    | `kubectl port-forward svc/redis-master 6379:6379`        |
+| Get network policy                | `kubectl get NetworkPolicy`                              |
+
+## Patch
+
+| Name                          | Summary                                                               |
+| ----------------------------- | --------------------------------------------------------------------- |
+| Patch service to loadbalancer | `kubectl patch svc $svc_name -p '{"spec": {"type": "LoadBalancer"}}'` |
+
+## Extenstions
+
+| Name                                    | Summary                    |
+| --------------------------------------- | -------------------------- |
+| Enumerates the resource types available | `kubectl api-resources`    |
+| List api group                          | `kubectl api-versions`     |
+| List all CRD                            | `kubectl get crd`          |
+| List storageclass                       | `kubectl get storageclass` |
+
+
+## Components & Services
+
+### Services on Master Nodes
+
+| Name                                                                                                        | Summary                                                                                                |
+| ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
+| [kube-apiserver](https://github.com/kubernetes/kubernetes/tree/master/cmd/kube-apiserver)                   | exposes the Kubernetes API from master nodes                                                           |
+| [etcd](https://coreos.com/etcd/)                                                                            | reliable data store for all k8s cluster data                                                           |
+| [kube-scheduler](https://github.com/kubernetes/kubernetes/tree/master/cmd/kube-scheduler)                   | schedule pods to run on selected nodes                                                                 |
+| [kube-controller-manager](https://github.com/kubernetes/kubernetes/tree/master/cmd/kube-controller-manager) | node controller, replication controller, endpoints controller, and service account & token controllers |
+
+### Services on Worker Nodes
+
+| Name                                                                              | Summary                                                                                                                                     |
+| --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
+| [kubelet](https://github.com/kubernetes/kubernetes/tree/master/cmd/kubelet)       | makes sure that containers are running in a pod                                                                                             |
+| [kube-proxy](https://github.com/kubernetes/kubernetes/tree/master/cmd/kube-proxy) | perform connection forwarding                                                                                                               |
+| [Container Runtime](https://github.com/docker/engine)                             | Kubernetes supported runtimes: Docker, rkt, runc and any [OCI runtime-spec](https://github.com/opencontainers/runtime-spec) implementation. |
+
+### Addons: pods and services that implement cluster features
+
+| Name                          | Summary                                                                   |
+| ----------------------------- | ------------------------------------------------------------------------- |
+| DNS                           | serves DNS records for Kubernetes services                                |
+| Web UI                        | a general purpose, web-based UI for Kubernetes clusters                   |
+| Container Resource Monitoring | collect, store and serve container metrics                                |
+| Cluster-level Logging         | save container logs to a central log store with search/browsing interface |
+
+### Tools
+
+| Name                                                                         | Summary                                                                                 |
+| ---------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |
+| [kubectl](https://github.com/kubernetes/kubernetes/tree/master/cmd/kubectl)  | the command line util to talk to k8s cluster                                            |
+| [kubeadm](https://github.com/kubernetes/kubernetes/tree/master/cmd/kubeadm)  | the command to bootstrap the cluster                                                    |
+| [kubefed](https://kubernetes.io/docs/reference/setup-tools/kubefed/kubefed/) | the command line to control a Kubernetes Cluster Federation                             |
+| Kubernetes Components                                                        | [Link: Kubernetes Components](https://kubernetes.io/docs/concepts/overview/components/) |

+ 522 - 0
docs/server/letsencrypt.md

@@ -0,0 +1,522 @@
+### LetsEncrypt Certbot TLS-SNI-01 deprecated
+January 2019 -
+Your Let’s Encrypt client used ACME TLS-SNI-01 domain validation to issue a certificate in the past 60 days. TLS-SNI-01 validation is reaching end-of-life and will stop working on **February 13th, 2019.**
+
+Need to recertify the unauthorized domains validated with the earlier protocal:
+
+```
+sudo certbot certonly --cert-name domain.com
+// for domains validated with TLS-SNI-01
+sudo certbot renew --dry-run
+// should produce NO errors
+```
+
+## Secure Apache with Let's Encrypt on Ubuntu 16.04
+[Source](https://www.digitalocean.com/community/tutorials/how-to-secure-apache-with-let-s-encrypt-on-ubuntu-16-04 "Permalink to How To Secure Apache with Let's Encrypt on Ubuntu 16.04")
+
+### Introduction
+
+This tutorial will show you how to set up a TLS/SSL certificate from [Let's Encrypt][1] on an Ubuntu 16.04 server running Apache as a web server. We will also cover how to automate the certificate renewal process.
+
+SSL certificates are used within web servers to encrypt the traffic between the server and client, providing extra security for users accessing your application. Let's Encrypt provides an easy way to obtain and install trusted certificates for free.
+
+## Prerequisites
+
+In order to complete this guide, you will need:
+
+* An Ubuntu 16.04 server with a non-root sudo-enabled user, which you can set up by following our [Initial Server Setup][2] guide
+* The Apache web server installed with [one or more domain names][3] properly configured through Virtual Hosts that specify `ServerName`.
+
+When you are ready to move on, log into your server using your sudo-enabled account.
+
+## Step 1 — Install the Let's Encrypt Client
+
+Let's Encrypt certificates are fetched via client software running on your server. The official client is called Certbot, and its developers maintain their own Ubuntu software repository with up-to-date versions. Because Certbot is in such active development it's worth using this repository to install a newer version than Ubuntu provides by default.
+
+First, add the repository:
+
+        * sudo add-apt-repository ppa:certbot/certbot
+
+
+You'll need to press `ENTER` to accept. Afterwards, update the package list to pick up the new repository's package information:
+
+And finally, install Certbot from the new repository with `apt-get`:
+
+        * sudo apt-get install python-certbot-apache
+
+
+The `certbot` Let's Encrypt client is now ready to use.
+
+## Step 2 — Set Up the SSL Certificate
+
+Generating the SSL certificate for Apache using Certbot is quite straightforward. The client will automatically obtain and install a new SSL certificate that is valid for the domains provided as parameters.
+
+To execute the interactive installation and obtain a certificate that covers only a single domain, run the `certbot` command like so, where example.com is your domain:
+
+        * sudo certbot --apache -d example.com
+
+
+If you want to install a single certificate that is valid for multiple domains or subdomains, you can pass them as additional parameters to the command. The first domain name in the list of parameters will be the **base** domain used by Let's Encrypt to create the certificate, and for that reason we recommend that you pass the bare top-level domain name as first in the list, followed by any additional subdomains or aliases:
+
+        * sudo certbot --apache -d example.com -d www.example.com
+
+
+For this example, the **base** domain will be `example.com`.
+
+After the dependencies are installed, you will be presented with a step-by-step guide to customize your certificate options. You will be asked to provide an email address for lost key recovery and notices, and you will be able to choose between enabling both `http` and `https` access or forcing all requests to redirect to `https`. It is usually safest to require `https`, unless you have a specific need for unencrypted `http` traffic.
+
+When the installation is finished, you should be able to find the generated certificate files at `/etc/letsencrypt/live`. You can verify the status of your SSL certificate with the following link (don't forget to replace example.com with your **base** domain):
+
+
+    https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
+
+
+You should now be able to access your website using a `https` prefix.
+
+## Step 3 — Set Up Auto Renewal
+
+Let's Encrypt's certificates are only valid for ninety days. This is to encourage users to automate their certificate renewal process. We'll need to set up a regularly run command to check for expiring certificates and renew them automatically.
+
+To run the renewal check daily, we will use `cron`, a standard system service for running periodic jobs. We tell `cron` what to do by opening and editing a file called a `crontab`.
+
+Your text editor will open the default crontab which is a text file with some help text in it. Paste in the following line at the end of the file, then save and close it:
+
+crontab
+
+
+    . . .
+    15 3 * * * /usr/bin/certbot renew --quiet
+
+
+The `15 3 * * *` part of this line means "run the following command at 3:15 am, every day". You may choose any time.
+
+The `renew` command for Certbot will check all certificates installed on the system and update any that are set to expire in less than thirty days. `\--quiet` tells Certbot not to output information nor wait for user input.
+
+`cron` will now run this command daily. Because we installed our certificates using the `\--apache` plugin, Apache will also be reloaded to ensure the new certificates are used.
+
+
+
+
+
+
+# How To Secure Nginx with Let's Encrypt on Ubuntu 16.04
+[Source](https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-16-04 "Permalink to How To Secure Nginx with Let's Encrypt on Ubuntu 16.04")
+
+### Introduction
+
+Let's Encrypt is a new Certificate Authority (CA) that provides an easy way to obtain and install free TLS/SSL certificates, thereby enabling encrypted HTTPS on web servers. It simplifies the process by providing a software client, `certbot`, that attempts to automate most (if not all) of the required steps. Currently, the entire process of obtaining and installing a certificate is fully automated only on Apache web servers. However, Let's Encrypt can be used to easily obtain a free SSL certificate, which can be installed manually, regardless of your choice of web server software.
+
+In this tutorial, we will show you how to use Certbot to obtain a free SSL certificate and use it with Nginx on Ubuntu 16.04. We will also show you how to automatically renew your SSL certificate. If you're running a different web server, simply follow your web server's documentation to learn how to use the certificate with your setup.
+
+![Nginx with Let's Encrypt TLS/SSL Certificate and Auto-renewal][1]
+
+## Prerequisites
+
+Before following this tutorial, you'll need a few things.
+
+You should have an Ubuntu 16.04 server with a non-root user who has `sudo` privileges. You can learn how to set up such a user account by following our [initial server setup for Ubuntu 16.04 tutorial][2].
+
+You must own or control the registered domain name that you wish to use the certificate with. If you do not already have a registered domain name, you may register one with one of the many domain name registrars out there (e.g. Namecheap, GoDaddy, etc.).
+
+If you haven't already, be sure to create an **A Record** that points your domain to the public IP address of your server. This is required because of how Let's Encrypt validates that you own the domain it is issuing a certificate for. For example, if you want to obtain a certificate for `example.com`, that domain must resolve to your server for the validation process to work. Our setup will use `example.com` and `www.example.com` as the domain names, so **both DNS records are required**.
+
+Once you have all of the prerequisites out of the way, let's move on to installing Certbot, the Let's Encrypt client software.
+
+## Step 1: Install Certbot
+
+The first step to using Let's Encrypt to obtain an SSL certificate is to install the `certbot` software on your server. The Certbot developers maintain their own Ubuntu software repository with up-to-date versions of the software. Because Certbot is in such active development it's worth using this repository to install a newer Certbot than provided by Ubuntu.
+
+First, add the repository:
+
+        * sudo add-apt-repository ppa:certbot/certbot
+
+
+You'll need to press `ENTER` to accept. Afterwards, update the package list to pick up the new repository's package information:
+
+And finally, install Certbot with `apt-get`:
+
+        * sudo apt-get install certbot
+
+
+The `certbot` Let's Encrypt client is now ready to use.
+
+## Step 2: Obtain an SSL Certificate
+
+Certbot provides a variety of ways to obtain SSL certificates, through various plugins. Unlike the Apache plugin, which is covered in [a different tutorial][3], most of the plugins will only help you with obtaining a certificate which you must manually configure your web server to use. Plugins that only obtain certificates, and don't install them, are referred to as "authenticators" because they are used to authenticate whether a server should be issued a certificate.
+
+We'll show you how to use the **Webroot** plugin to obtain an SSL certificate.
+
+### How To Use the Webroot Plugin
+
+The Webroot plugin works by placing a special file in the `/.well-known` directory within your document root, which can be opened (through your web server) by the Let's Encrypt service for validation. Depending on your configuration, you may need to explicitly allow access to the `/.well-known` directory.
+
+If you haven't installed Nginx yet, do so by following [this tutorial][4]. Continue below when you are finished.
+
+To ensure that the directory is accessible to Let's Encrypt for validation, let's make a quick change to our Nginx configuration. By default, it's located at `/etc/nginx/sites-available/default`. We'll use `nano` to edit it:
+
+        * sudo nano /etc/nginx/sites-available/default
+
+
+Inside the server block, add this location block:
+
+Add to SSL server block
+
+
+            location ~ /.well-known {
+                    allow all;
+            }
+
+
+You will also want look up what your document root is set to by searching for the `root` directive, as the path is required to use the Webroot plugin. If you're using the default configuration file, the root will be `/var/www/html`.
+
+Save and exit.
+
+Check your configuration for syntax errors:
+
+If no errors are found, restart Nginx with this command:
+
+        * sudo systemctl restart nginx
+
+
+Now that we know our `webroot-path`, we can use the Webroot plugin to request an SSL certificate with these commands. Here, we are also specifying our domain names with the `-d` option. If you want a single cert to work with multiple domain names (e.g. `example.com` and `www.example.com`), be sure to include all of them. Also, make sure that you replace the highlighted parts with the appropriate webroot path and domain name(s):
+
+        * sudo certbot certonly --webroot --webroot-path=/var/www/html -d example.com -d www.example.com
+
+
+If this is your first time running `certbot`, you will be prompted to enter an email address and agree to the terms of service. After doing so, you should see a message telling you the process was successful and where your certificates are stored:
+
+
+    Output
+
+    IMPORTANT NOTES:
+     - Congratulations! Your certificate and chain have been saved at
+       /etc/letsencrypt/live/example.com/fullchain.pem. Your cert
+       will expire on 2017-07-26. To obtain a new or tweaked version of
+       this certificate in the future, simply run certbot again. To
+       non-interactively renew *all* of your certificates, run "certbot
+       renew"
+     - If you lose your account credentials, you can recover through
+       e-mails sent to sammy@example.com.
+     - Your account credentials have been saved in your Certbot
+       configuration directory at /etc/letsencrypt. You should make a
+       secure backup of this folder now. This configuration directory will
+       also contain certificates and private keys obtained by Certbot so
+       making regular backups of this folder is ideal.
+     - If you like Certbot, please consider supporting our work by:
+
+       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
+       Donating to EFF:                    https://eff.org/donate-le
+
+
+You will want to note the path and expiration date of your certificate, highlighted in the example above.
+
+**Firewall Note:** If you receive an error like `Failed to connect to host for DVSNI challenge`, your server's firewall may need to be configured to allow TCP traffic on port `80` and `443`.
+
+**Note:** If your domain is routing through a DNS service like CloudFlare, you will need to temporarily disable it until you have obtained the certificate.  
+
+### Certificate Files
+
+After obtaining the cert, you will have the following PEM-encoded files:
+
+* **cert.pem:** Your domain's certificate
+* **chain.pem:** The Let's Encrypt chain certificate
+* **fullchain.pem:** `cert.pem` and `chain.pem` combined
+* **privkey.pem:** Your certificate's private key
+
+It's important that you are aware of the location of the certificate files that were just created, so you can use them in your web server configuration. The files themselves are placed in a subdirectory in `/etc/letsencrypt/archive`. However, Certbot creates symbolic links to the most recent certificate files in the `/etc/letsencrypt/live/your_domain_name` directory. Because the links will always point to the most recent certificate files, this is the path that you should use to refer to your certificate files.
+
+You can check that the files exist by running this command (substituting in your domain name):
+
+        * sudo ls -l /etc/letsencrypt/live/your_domain_name
+
+
+The output should be the four previously mentioned certificate files. In a moment, you will configure your web server to use `fullchain.pem` as the certificate file, and `privkey.pem` as the certificate key file.
+
+### Generate Strong Diffie-Hellman Group
+
+To further increase security, you should also generate a strong Diffie-Hellman group. To generate a 2048-bit group, use this command:
+
+        * sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
+
+
+This may take a few minutes but when it's done you will have a strong DH group at `/etc/ssl/certs/dhparam.pem`.
+
+## Step 3: Configure TLS/SSL on Web Server (Nginx)
+
+Now that you have an SSL certificate, you need to configure your Nginx web server to use it.
+
+We will make a few adjustments to our configuration:
+
+1. We will create a configuration snippet containing our SSL key and certificate file locations.
+2. We will create a configuration snippet containing strong SSL settings that can be used with any certificates in the future.
+3. We will adjust the Nginx server blocks to handle SSL requests and use the two snippets above.
+
+This method of configuring Nginx will allow us to keep clean server blocks and put common configuration segments into reusable modules.
+
+### Create a Configuration Snippet Pointing to the SSL Key and Certificate
+
+First, let's create a new Nginx configuration snippet in the `/etc/nginx/snippets` directory.
+
+To properly distinguish the purpose of this file, we will name it `ssl-` followed by our domain name, followed by `.conf` on the end:
+
+        * sudo nano /etc/nginx/snippets/ssl-example.com.conf
+
+
+Within this file, we just need to set the `ssl_certificate` directive to our certificate file and the `ssl_certificate_key` to the associated key. In our case, this will look like this:
+
+/etc/nginx/snippets/ssl-example.com.conf
+
+
+    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
+    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
+
+
+When you've added those lines, save and close the file.
+
+### Create a Configuration Snippet with Strong Encryption Settings
+
+Next, we will create another snippet that will define some SSL settings. This will set Nginx up with a strong SSL cipher suite and enable some advanced features that will help keep our server secure.
+
+The parameters we will set can be reused in future Nginx configurations, so we will give the file a generic name:
+
+        * sudo nano /etc/nginx/snippets/ssl-params.conf
+
+
+To set up Nginx SSL securely, we will be using the recommendations by [Remy van Elst][5] on the [Cipherli.st][6] site. This site is designed to provide easy-to-consume encryption settings for popular software. You can read more about his decisions regarding the Nginx choices [here][7].
+
+**Note:** The default suggested settings on [Cipherli.st][6] offer strong security. Sometimes, this comes at the cost of greater client compatibility. If you need to support older clients, there is an alternative list that can be accessed by clicking the link on the link labeled "Yes, give me a ciphersuite that works with legacy / old software."
+
+The compatibility list can be used instead of the default suggestions in the configuration below. The choice of which config you use will depend largely on what you need to support.
+
+For our purposes, we can copy the provided settings in their entirety. We just need to make a few small modifications.
+
+First, we will add our preferred DNS resolver for upstream requests. We will use Google's for this guide. We will also go ahead and set the `ssl_dhparam` setting to point to the Diffie-Hellman file we generated earlier.
+
+Finally, you should take take a moment to read up on [HTTP Strict Transport Security, or HSTS][8]. HSTS provides increased security, but can have far reaching consequences if accidentally enabled or enabled incorrectly. In this guide, we will disable the header by default, but you can modify that if you are sure you understand the implications:
+
+/etc/nginx/snippets/ssl-params.conf
+
+
+    # from https://cipherli.st/
+    # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
+
+    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
+    ssl_prefer_server_ciphers on;
+    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
+    ssl_ecdh_curve secp384r1;
+    ssl_session_cache shared:SSL:10m;
+    ssl_session_tickets off;
+    ssl_stapling on;
+    ssl_stapling_verify on;
+    resolver 8.8.8.8 8.8.4.4 valid=300s;
+    resolver_timeout 5s;
+    # disable HSTS header for now
+    #add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
+    add_header X-Frame-Options DENY;
+    add_header X-Content-Type-Options nosniff;
+
+    ssl_dhparam /etc/ssl/certs/dhparam.pem;
+
+
+Save and close the file when you are finished.
+
+### Adjust the Nginx Configuration to Use SSL
+
+Now that we have our snippets, we can adjust our Nginx configuration to enable SSL.
+
+We will assume in this guide that you are using the `default` server block file in the `/etc/nginx/sites-available` directory. If you are using a different server block file, substitute it's name in the below commands.
+
+Before we go any further, let's back up our current server block file:
+
+        * sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
+
+
+Now, open the server block file to make adjustments:
+
+        * sudo nano /etc/nginx/sites-available/default
+
+
+Inside, your server block probably begins like this:
+
+/etc/nginx/sites-available/default
+
+
+    server {
+        listen 80 default_server;
+        listen [::]:80 default_server;
+
+        # SSL configuration
+
+        # listen 443 ssl default_server;
+        # listen [::]:443 ssl default_server;
+
+        . . .
+
+
+We will be modifying this configuration so that unencrypted HTTP requests are automatically redirected to encrypted HTTPS. This offers the best security for our sites. If you want to allow both HTTP and HTTPS traffic, use the alternative configuration that follows.
+
+We will be splitting the configuration into two separate blocks. After the two first `listen` directives, we will add a `server_name` directive, set to your server's domain name. We will then set up a redirect to the second server block we will be creating. Afterwards, we will close this short block:
+
+/etc/nginx/sites-available/default
+
+
+    server {
+        listen 80 default_server;
+        listen [::]:80 default_server;
+        server_name example.com www.example.com;
+        return 301 https://$server_name$request_uri;
+    }
+
+        # SSL configuration
+
+        # listen 443 ssl default_server;
+        # listen [::]:443 ssl default_server;
+
+        . . .
+
+
+Next, we need to start a new server block directly below to contain the remaining configuration. We can uncomment the two `listen` directives that use port 443. We can add `http2` to these lines in order to enable HTTP/2 within this block. Afterwards, we just need to include the two snippet files we set up:
+
+**Note:** You may only have **one** `listen` directive that includes the `default_server` modifier for each IP version and port combination. If you have other server blocks enabled for these ports that have `default_server` set, you must remove the modifier from one of the blocks.  
+
+/etc/nginx/sites-available/default
+
+
+    server {
+        listen 80 default_server;
+        listen [::]:80 default_server;
+        server_name example.com www.example.com;
+        return 301 https://$server_name$request_uri;
+    }
+
+    server {
+
+        # SSL configuration
+
+        listen 443 ssl http2 default_server;
+        listen [::]:443 ssl http2 default_server;
+        include snippets/ssl-example.com.conf;
+        include snippets/ssl-params.conf;
+
+        . . .
+
+
+Save and close the file when you are finished.
+
+### (Alternative Configuration) Allow Both HTTP and HTTPS Traffic
+
+If you want or need to allow both encrypted and unencrypted content, you will have to configure Nginx a bit differently. This is generally not recommended if it can be avoided, but in some situations it may be necessary. Basically, we just compress the two separate server blocks into one block and remove the redirect:
+
+/etc/nginx/sites-available/default
+
+
+    server {
+        listen 80 default_server;
+        listen [::]:80 default_server;
+        listen 443 ssl http2 default_server;
+        listen [::]:443 ssl http2 default_server;
+
+        server_name example.com www.example.com;
+        include snippets/ssl-example.com.conf;
+        include snippets/ssl-params.conf;
+
+        . . .
+
+
+Save and close the file when you are finished.
+
+## Step 4: Adjust the Firewall
+
+If you have the `ufw` firewall enabled, as recommended by the prerequisite guides, you'll need to adjust the settings to allow for SSL traffic. Luckily, Nginx registers a few profiles with `ufw` upon installation.
+
+You can see the current setting by typing:
+
+It will probably look like this, meaning that only HTTP traffic is allowed to the web server:
+
+
+    Output
+
+    Status: active
+
+    To                         Action      From
+    --                         ------      ----
+    OpenSSH                    ALLOW       Anywhere
+    Nginx HTTP                 ALLOW       Anywhere
+    OpenSSH (v6)               ALLOW       Anywhere (v6)
+    Nginx HTTP (v6)            ALLOW       Anywhere (v6)
+
+
+To additionally let in HTTPS traffic, we can allow the "Nginx Full" profile and then delete the redundant "Nginx HTTP" profile allowance:
+
+        * sudo ufw allow 'Nginx Full'
+
+    * sudo ufw delete allow 'Nginx HTTP'
+
+
+Your status should look like this now:
+
+
+    Output
+
+    Status: active
+
+    To                         Action      From
+    --                         ------      ----
+    OpenSSH                    ALLOW       Anywhere
+    Nginx Full                 ALLOW       Anywhere
+    OpenSSH (v6)               ALLOW       Anywhere (v6)
+    Nginx Full (v6)            ALLOW       Anywhere (v6)
+
+
+## Step 5: Enabling the Changes in Nginx
+
+Now that we've made our changes and adjusted our firewall, we can restart Nginx to implement our new changes.
+
+First, we should check to make sure that there are no syntax errors in our files. We can do this by typing:
+
+If everything is successful, you will get a result that looks like this:
+
+
+    Output
+
+    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
+    nginx: configuration file /etc/nginx/nginx.conf test is successful
+
+
+If your output matches the above, your configuration file has no syntax errors. We can safely restart Nginx to implement our changes:
+
+        * sudo systemctl restart nginx
+
+
+The Let's Encrypt TLS/SSL certificate is now in place and the firewall now allows traffic to port 80 and 443. At this point, you should test that the TLS/SSL certificate works by visiting your domain via HTTPS in a web browser.
+
+You can use the Qualys SSL Labs Report to see how your server configuration scores:
+
+
+    In a web browser:
+
+    https://www.ssllabs.com/ssltest/analyze.html?d=example.com
+
+
+This SSL setup should report an **A+** rating.
+
+## Step 6: Set Up Auto Renewal
+
+Let's Encrypt's certificates are only valid for ninety days. This is to encourage users to automate their certificate renewal process. We'll need to set up a regularly run command to check for expiring certificates and renew them automatically.
+
+To run the renewal check daily, we will use `cron`, a standard system service for running periodic jobs. We tell `cron` what to do by opening and editing a file called a `crontab`.
+
+Your text editor will open the default crontab which is a text file with some help text in it. Paste in the following line at the end of the file, then save and close it:
+
+crontab
+
+
+    . . .
+    15 3 * * * /usr/bin/certbot renew --quiet --renew-hook "/bin/systemctl reload nginx"
+
+
+The `15 3 * * *` part of this line means "run the following command at 3:15 am, every day". You may choose any time.
+
+The `renew` command for Certbot will check all certificates installed on the system and update any that are set to expire in less than thirty days. `\--quiet` tells Certbot not to output information nor wait for user input. `\--renew-hook "/bin/systemctl reload nginx"` will reload Nginx to pick up the new certificate files, but only if a renewal has actually happened.
+
+`cron` will now run this command daily. All installed certificates will be automatically renewed and reloaded when they have thirty days or less before they expire.

+ 753 - 0
docs/server/lynis.md

@@ -0,0 +1,753 @@
+
+
+- [https://cisofy.com/lynis/](https://cisofy.com/lynis/)
+- [https://github.com/CISOfy/Lynis](https://github.com/CISOfy/Lynis)
+
+
+```
+$ git clone https://github.com/CISOfy/lynis
+$ cd lynis
+$ ./lynis lynis audit system -Q
+```
+
+```sh
+david@woozer:~/scripts/lynis(master○) » ./lynis audit system
+
+[ Lynis 3.0.0 ]
+
+################################################################################
+  Lynis comes with ABSOLUTELY NO WARRANTY. This is free software, and you are
+  welcome to redistribute it under the terms of the GNU General Public License.
+  See the LICENSE file for details about using this software.
+
+  2007-2019, CISOfy - https://cisofy.com/lynis/
+  Enterprise support available (compliance, plugins, interface and tools)
+################################################################################
+
+
+[+] Initializing program
+------------------------------------
+
+  ###################################################################
+  #                                                                 #
+  #   NON-PRIVILEGED SCAN MODE                                      #
+  #                                                                 #
+  ###################################################################
+
+  NOTES:
+  --------------
+  * Some tests will be skipped (as they require root permissions)
+  * Some tests might fail silently or give different results
+
+  - Detecting OS...                                           [ DONE ]
+  - Checking profiles...                                      [ DONE ]
+
+  ---------------------------------------------------
+  Program version:           3.0.0
+  Operating system:          Linux
+  Operating system name:     Ubuntu
+  Operating system version:  18.04
+  Kernel version:            5.4.10
+  Hardware platform:         x86_64
+  Hostname:                  woozer
+  ---------------------------------------------------
+  Profiles:                  /home/david/scripts/lynis/default.prf
+  Log file:                  /tmp/lynis.log
+  Report file:               /tmp/lynis-report.dat
+  Report version:            1.0
+  Plugin directory:          ./plugins
+  ---------------------------------------------------
+  Auditor:                   [Not Specified]
+  Language:                  en
+  Test category:             all
+  Test group:                all
+  ---------------------------------------------------
+  - Program update status...                                  [ NO UPDATE ]
+
+[+] System Tools
+------------------------------------
+  - Scanning available tools...
+  - Checking system binaries...
+
+[+] Plugins (phase 1)
+------------------------------------
+ Note: plugins have more extensive tests and may take several minutes to complete
+
+  - Plugin: pam
+    [..]
+  - Plugin: systemd
+    [................]
+
+[+] Boot and services
+------------------------------------
+  - Service Manager                                           [ systemd ]
+    - Boot loader                                             [ NONE FOUND ]
+  - Check running services (systemctl)                        [ DONE ]
+        Result: found 24 running services
+  - Check enabled services at boot (systemctl)                [ DONE ]
+        Result: found 35 enabled services
+  - Check startup files (permissions)                         [ OK ]
+
+[+] Kernel
+------------------------------------
+  - Checking default run level                                [ RUNLEVEL 5 ]
+  - Checking CPU support (NX/PAE)
+    CPU support: PAE and/or NoeXecute supported               [ FOUND ]
+  - Checking kernel version and release                       [ DONE ]
+  - Checking kernel type                                      [ DONE ]
+  - Checking loaded kernel modules                            [ DONE ]
+  - Checking Linux kernel configuration file                  [ FOUND ]
+  - Checking for available kernel update                      [ UNKNOWN ]
+  - Checking core dumps configuration
+    - configuration in systemd conf files                     [ DEFAULT ]
+    - configuration in etc/profile                            [ DEFAULT ]
+    - 'hard' configuration in security/limits.conf            [ DEFAULT ]
+    - 'soft' configuration in security/limits.conf            [ DEFAULT ]
+    - Checking setuid core dumps configuration                [ DISABLED ]
+  - Check if reboot is needed                                 [ UNKNOWN ]
+
+[+] Memory and Processes
+------------------------------------
+  - Checking /proc/meminfo                                    [ FOUND ]
+  - Searching for dead/zombie processes                       [ NOT FOUND ]
+  - Searching for IO waiting processes                        [ NOT FOUND ]
+  - Search prelink tooling                                    [ NOT FOUND ]
+
+[+] Users, Groups and Authentication
+------------------------------------
+  - Administrator accounts                                    [ OK ]
+  - Unique UIDs                                               [ OK ]
+  - Unique group IDs                                          [ OK ]
+  - Unique group names                                        [ OK ]
+  - Password file consistency                                 [ SUGGESTION ]
+  - Query system users (non daemons)                          [ DONE ]
+  - NIS+ authentication support                               [ NOT ENABLED ]
+  - NIS authentication support                                [ NOT ENABLED ]
+  - Sudoers file(s)                                           [ FOUND ]
+  - PAM password strength tools                               [ SUGGESTION ]
+  - PAM configuration files (pam.conf)                        [ FOUND ]
+  - PAM configuration files (pam.d)                           [ FOUND ]
+  - PAM modules                                               [ FOUND ]
+  - LDAP module in PAM                                        [ NOT FOUND ]
+  - Accounts without expire date                              [ OK ]
+  - Accounts without password                                 [ OK ]
+  - Checking user password aging (minimum)                    [ DISABLED ]
+  - User password aging (maximum)                             [ DISABLED ]
+  - Checking Linux single user mode authentication            [ OK ]
+  - Determining default umask
+    - umask (/etc/profile)                                    [ NOT FOUND ]
+    - umask (/etc/login.defs)                                 [ SUGGESTION ]
+  - LDAP authentication support                               [ NOT ENABLED ]
+  - Logging failed login attempts                             [ ENABLED ]
+
+[+] Shells
+------------------------------------
+  - Checking shells from /etc/shells
+    Result: found 8 shells (valid shells: 8).
+    - Session timeout settings/tools                          [ NONE ]
+  - Checking default umask values
+    - Checking default umask in /etc/bash.bashrc              [ NONE ]
+    - Checking default umask in /etc/profile                  [ NONE ]
+
+[+] File systems
+------------------------------------
+  - Checking mount points
+    - Checking /home mount point                              [ SUGGESTION ]
+    - Checking /tmp mount point                               [ SUGGESTION ]
+    - Checking /var mount point                               [ SUGGESTION ]
+  - Query swap partitions (fstab)                             [ OK ]
+  - Testing swap partitions                                   [ OK ]
+  - Testing /proc mount (hidepid)                             [ SUGGESTION ]
+  - Checking for old files in /tmp                            [ OK ]
+  - Checking /tmp sticky bit                                  [ OK ]
+  - Checking /var/tmp sticky bit                              [ OK ]
+  - Mount options of /                                        [ NON DEFAULT ]
+  - Checking Locate database                                  [ FOUND ]
+  - Disable kernel support of some filesystems
+
+[+] USB Devices
+------------------------------------
+  - Checking usb-storage driver (modprobe config)             [ NOT DISABLED ]
+  - Checking USB devices authorization                        [ DISABLED ]
+  - Checking USBGuard                                         [ NOT FOUND ]
+
+[+] Storage
+------------------------------------
+  - Checking firewire ohci driver (modprobe config)           [ DISABLED ]
+
+[+] NFS
+------------------------------------
+  - Check running NFS daemon                                  [ NOT FOUND ]
+
+[+] Name services
+------------------------------------
+  - Checking default DNS search domain                        [ FOUND ]
+  - Checking search domains                                   [ FOUND ]
+  - Checking /etc/resolv.conf options                         [ FOUND ]
+  - Searching DNS domain name                                 [ FOUND ]
+      Domain name: members.linode.com
+  - Checking /etc/hosts
+    - Duplicate entries in hosts file                         [ NONE ]
+    - Presence of configured hostname in /etc/hosts           [ FOUND ]
+    - Hostname mapped to localhost                            [ NOT FOUND ]
+    - Localhost mapping to IP address                         [ OK ]
+
+[+] Ports and packages
+------------------------------------
+  - Searching package managers
+    - Searching dpkg package manager                          [ FOUND ]
+      - Querying package manager
+    - Query unpurged packages                                 [ FOUND ]
+  - Checking security repository in sources.list file         [ OK ]
+  - Checking upgradeable packages                             [ SKIPPED ]
+  - Checking package audit tool                               [ NONE ]
+
+=================================================================
+
+  Exception found!
+
+  Function/test:  [KRNL-5840:1]
+  Message:        Could not find any kernel packages via package manager
+
+  Help improving the Lynis community with your feedback!
+
+  Steps:
+  - Ensure you are running the latest version (./lynis update check)
+  - If so, create a GitHub issue at https://github.com/CISOfy/lynis
+  - Include relevant parts of the log file or configuration file
+
+  Thanks!
+
+=================================================================
+
+  - Toolkit for automatic upgrades (unattended-upgrade)       [ FOUND ]
+
+[+] Networking
+------------------------------------
+  - Checking IPv6 configuration                               [ ENABLED ]
+      Configuration method                                    [ AUTO ]
+      IPv6 only                                               [ NO ]
+  - Checking configured nameservers
+    - Testing nameservers
+        Nameserver: 173.230.129.5                             [ OK ]
+        Nameserver: 173.230.136.5                             [ OK ]
+        Nameserver: 173.230.140.5                             [ OK ]
+        Nameserver: 66.228.59.5                               [ OK ]
+        Nameserver: 66.228.62.5                               [ OK ]
+        Nameserver: 50.116.35.5                               [ OK ]
+        Nameserver: 50.116.41.5                               [ OK ]
+        Nameserver: 23.239.18.5                               [ OK ]
+        Nameserver: 75.127.97.6                               [ OK ]
+        Nameserver: 75.127.97.7                               [ OK ]
+    - Minimal of 2 responsive nameservers                     [ OK ]
+  - Checking default gateway                                  [ DONE ]
+  - Getting listening ports (TCP/UDP)                         [ DONE ]
+  - Checking promiscuous interfaces                           [ OK ]
+  - Checking waiting connections                              [ OK ]
+  - Checking status DHCP client                               [ NOT ACTIVE ]
+  - Checking for ARP monitoring software                      [ NOT FOUND ]
+  - Uncommon network protocols                                [ NOT FOUND ]
+
+[+] Printers and Spools
+------------------------------------
+  - Checking cups daemon                                      [ NOT FOUND ]
+  - Checking lp daemon                                        [ NOT RUNNING ]
+
+[+] Software: e-mail and messaging
+------------------------------------
+
+[+] Software: firewalls
+------------------------------------
+  - Checking iptables support                                 [ FOUND ]
+  - Checking host based firewall                              [ ACTIVE ]
+
+[+] Software: webserver
+------------------------------------
+  - Checking Apache (binary /usr/sbin/apache2)                [ FOUND ]
+      Info: Configuration file found (/etc/apache2/apache2.conf)
+      Info: Found 157 virtual hosts
+    * Loadable modules                                        [ FOUND (114) ]
+        - Found 114 loadable modules
+          mod_evasive: anti-DoS/brute force                   [ NOT FOUND ]
+          mod_reqtimeout/mod_qos                              [ FOUND ]
+          ModSecurity: web application firewall               [ NOT FOUND ]
+  - Checking nginx                                            [ FOUND ]
+    - Searching nginx configuration file                      [ FOUND ]
+      - Found nginx includes                                  [ 2 FOUND ]
+    - Parsing configuration options
+        - /etc/nginx/nginx.conf
+ls: cannot access '/etc/nginx//etc/nginx/conf.d/*.conf': No such file or directory
+        - /etc/nginx/sites-enabled/default
+      - SSL configured                                        [ NO ]
+      - Checking log file configuration
+        - Missing log files (access_log)                      [ NO ]
+        - Disabled access logging                             [ NO ]
+        - Missing log files (error_log)                       [ NO ]
+        - Debugging mode on error_log                         [ NO ]
+
+[+] SSH Support
+------------------------------------
+  - Checking running SSH daemon                               [ FOUND ]
+    - Searching SSH configuration                             [ FOUND ]
+    - OpenSSH option: AllowTcpForwarding                      [ SUGGESTION ]
+    - OpenSSH option: ClientAliveCountMax                     [ SUGGESTION ]
+    - OpenSSH option: ClientAliveInterval                     [ OK ]
+    - OpenSSH option: Compression                             [ SUGGESTION ]
+    - OpenSSH option: FingerprintHash                         [ OK ]
+    - OpenSSH option: GatewayPorts                            [ OK ]
+    - OpenSSH option: IgnoreRhosts                            [ OK ]
+    - OpenSSH option: LoginGraceTime                          [ OK ]
+    - OpenSSH option: LogLevel                                [ SUGGESTION ]
+    - OpenSSH option: MaxAuthTries                            [ SUGGESTION ]
+    - OpenSSH option: MaxSessions                             [ SUGGESTION ]
+    - OpenSSH option: PermitRootLogin                         [ OK ]
+    - OpenSSH option: PermitUserEnvironment                   [ OK ]
+    - OpenSSH option: PermitTunnel                            [ OK ]
+    - OpenSSH option: Port                                    [ OK ]
+    - OpenSSH option: PrintLastLog                            [ OK ]
+    - OpenSSH option: StrictModes                             [ OK ]
+    - OpenSSH option: TCPKeepAlive                            [ SUGGESTION ]
+    - OpenSSH option: UseDNS                                  [ OK ]
+    - OpenSSH option: VerifyReverseMapping                    [ NOT FOUND ]
+    - OpenSSH option: X11Forwarding                           [ SUGGESTION ]
+    - OpenSSH option: AllowAgentForwarding                    [ SUGGESTION ]
+    - OpenSSH option: AllowUsers                              [ NOT FOUND ]
+    - OpenSSH option: AllowGroups                             [ NOT FOUND ]
+
+[+] SNMP Support
+------------------------------------
+  - Checking running SNMP daemon                              [ NOT FOUND ]
+
+[+] Databases
+------------------------------------
+  - MySQL process status                                      [ FOUND ]
+  - Redis (server) status                                     [ FOUND ]
+
+=================================================================
+
+  Exception found!
+
+  Function/test:  [DBS-1882]
+  Message:        Found Redis, but no configuration file. Report this if you know where it is located on your system.
+
+  Help improving the Lynis community with your feedback!
+
+  Steps:
+  - Ensure you are running the latest version (./lynis update check)
+  - If so, create a GitHub issue at https://github.com/CISOfy/lynis
+  - Include relevant parts of the log file or configuration file
+
+  Thanks!
+
+=================================================================
+
+
+[+] LDAP Services
+------------------------------------
+  - Checking OpenLDAP instance                                [ NOT FOUND ]
+
+[+] PHP
+------------------------------------
+  - Checking PHP                                              [ FOUND ]
+    - Checking PHP disabled functions                         [ FOUND ]
+    - Checking expose_php option                              [ ON ]
+    - Checking enable_dl option                               [ OFF ]
+    - Checking allow_url_fopen option                         [ ON ]
+    - Checking allow_url_include option                       [ OFF ]
+
+[+] Squid Support
+------------------------------------
+  - Checking running Squid daemon                             [ NOT FOUND ]
+
+[+] Logging and files
+------------------------------------
+  - Checking for a running log daemon                         [ OK ]
+    - Checking Syslog-NG status                               [ NOT FOUND ]
+    - Checking systemd journal status                         [ FOUND ]
+    - Checking Metalog status                                 [ NOT FOUND ]
+    - Checking RSyslog status                                 [ FOUND ]
+    - Checking RFC 3195 daemon status                         [ NOT FOUND ]
+    - Checking minilogd instances                             [ NOT FOUND ]
+  - Checking logrotate presence                               [ OK ]
+  - Checking remote logging                                   [ NOT ENABLED ]
+  - Checking log directories (static list)                    [ DONE ]
+  - Checking open log files                                   [ DONE ]
+  - Checking deleted files in use                             [ FILES FOUND ]
+
+[+] Insecure services
+------------------------------------
+  - Installed inetd package                                   [ NOT FOUND ]
+  - Installed xinetd package                                  [ OK ]
+    - xinetd status                                           [ NOT ACTIVE ]
+  - Installed rsh client package                              [ OK ]
+  - Installed rsh server package                              [ OK ]
+  - Installed telnet client package                           [ OK ]
+  - Installed telnet server package                           [ NOT FOUND ]
+  - Checking NIS client installation                          [ OK ]
+  - Checking NIS server installation                          [ OK ]
+  - Checking TFTP client installation                         [ OK ]
+  - Checking TFTP server installation                         [ OK ]
+
+[+] Banners and identification
+------------------------------------
+  - /etc/issue                                                [ FOUND ]
+    - /etc/issue contents                                     [ WEAK ]
+  - /etc/issue.net                                            [ FOUND ]
+    - /etc/issue.net contents                                 [ WEAK ]
+
+[+] Scheduled tasks
+------------------------------------
+  - Checking crontab and cronjob files                        [ DONE ]
+  - Checking atd status                                       [ RUNNING ]
+    - Checking at users                                       [ DONE ]
+    - Checking at jobs                                        [ NONE ]
+
+[+] Accounting
+------------------------------------
+  - Checking accounting information                           [ NOT FOUND ]
+  - Checking sysstat accounting data                          [ DISABLED ]
+  - Checking auditd                                           [ NOT FOUND ]
+
+[+] Time and Synchronization
+------------------------------------
+  - NTP daemon found: systemd (timesyncd)                     [ FOUND ]
+  - Checking event based ntpdate (if-up)                      [ FOUND ]
+  - Checking for a running NTP daemon or client               [ OK ]
+
+[+] Cryptography
+------------------------------------
+  - Checking for expired SSL certificates [12/377]            [ FOUND ]
+
+  [WARNING]: Test CRYP-7902 had a long execution: 27.347473 seconds
+
+  - Kernel entropy is sufficient                              [ YES ]
+  - HW RNG & rngd                                             [ NO ]
+
+[+] Virtualization
+------------------------------------
+
+[+] Containers
+------------------------------------
+
+[+] Security frameworks
+------------------------------------
+  - Checking presence AppArmor                                [ NOT FOUND ]
+  - Checking presence SELinux                                 [ NOT FOUND ]
+  - Checking presence TOMOYO Linux                            [ NOT FOUND ]
+  - Checking presence grsecurity                              [ NOT FOUND ]
+  - Checking for implemented MAC framework                    [ NONE ]
+
+[+] Software: file integrity
+------------------------------------
+  - Checking file integrity tools
+  - Checking presence integrity tool                          [ NOT FOUND ]
+
+[+] Software: System tooling
+------------------------------------
+  - Checking automation tooling
+  - Automation tooling                                        [ NOT FOUND ]
+  - Checking for IDS/IPS tooling                              [ NONE ]
+
+[+] Software: Malware
+------------------------------------
+
+[+] File Permissions
+------------------------------------
+  - Starting file permissions check
+    File: /etc/at.deny                                        [ SUGGESTION ]
+    File: /etc/crontab                                        [ SUGGESTION ]
+    File: /etc/group                                          [ OK ]
+    File: /etc/group-                                         [ OK ]
+    File: /etc/hosts.allow                                    [ OK ]
+    File: /etc/hosts.deny                                     [ OK ]
+    File: /etc/issue                                          [ OK ]
+    File: /etc/issue.net                                      [ OK ]
+    File: /etc/passwd                                         [ OK ]
+    File: /etc/passwd-                                        [ OK ]
+    File: /etc/ssh/sshd_config                                [ SUGGESTION ]
+    Directory: /etc/cron.d                                    [ SUGGESTION ]
+    Directory: /etc/cron.daily                                [ SUGGESTION ]
+    Directory: /etc/cron.hourly                               [ SUGGESTION ]
+    Directory: /etc/cron.weekly                               [ SUGGESTION ]
+    Directory: /etc/cron.monthly                              [ SUGGESTION ]
+
+[+] Home directories
+------------------------------------
+  - Permissions of home directories                           [ WARNING ]
+  - Ownership of home directories                             [ OK ]
+  - Checking shell history files                              [ OK ]
+
+[+] Kernel Hardening
+------------------------------------
+  - Comparing sysctl key pairs with scan profile
+    - fs.suid_dumpable (exp: 0)                               [ OK ]
+    - kernel.core_uses_pid (exp: 1)                           [ DIFFERENT ]
+    - kernel.ctrl-alt-del (exp: 0)                            [ OK ]
+    - kernel.dmesg_restrict (exp: 1)                          [ DIFFERENT ]
+    - kernel.kptr_restrict (exp: 2)                           [ DIFFERENT ]
+    - kernel.randomize_va_space (exp: 2)                      [ OK ]
+    - kernel.sysrq (exp: 0)                                   [ DIFFERENT ]
+    - kernel.yama.ptrace_scope (exp: 1 2 3)                   [ OK ]
+    - net.ipv4.conf.all.accept_redirects (exp: 0)             [ DIFFERENT ]
+    - net.ipv4.conf.all.accept_source_route (exp: 0)          [ OK ]
+    - net.ipv4.conf.all.bootp_relay (exp: 0)                  [ OK ]
+    - net.ipv4.conf.all.forwarding (exp: 0)                   [ OK ]
+    - net.ipv4.conf.all.log_martians (exp: 1)                 [ DIFFERENT ]
+    - net.ipv4.conf.all.mc_forwarding (exp: 0)                [ OK ]
+    - net.ipv4.conf.all.proxy_arp (exp: 0)                    [ OK ]
+    - net.ipv4.conf.all.rp_filter (exp: 1)                    [ OK ]
+    - net.ipv4.conf.all.send_redirects (exp: 0)               [ DIFFERENT ]
+    - net.ipv4.conf.default.accept_redirects (exp: 0)         [ DIFFERENT ]
+    - net.ipv4.conf.default.accept_source_route (exp: 0)      [ DIFFERENT ]
+    - net.ipv4.conf.default.log_martians (exp: 1)             [ DIFFERENT ]
+    - net.ipv4.icmp_echo_ignore_broadcasts (exp: 1)           [ OK ]
+    - net.ipv4.icmp_ignore_bogus_error_responses (exp: 1)     [ OK ]
+    - net.ipv4.tcp_syncookies (exp: 1)                        [ OK ]
+    - net.ipv4.tcp_timestamps (exp: 0 1)                      [ OK ]
+    - net.ipv6.conf.all.accept_redirects (exp: 0)             [ DIFFERENT ]
+    - net.ipv6.conf.all.accept_source_route (exp: 0)          [ OK ]
+    - net.ipv6.conf.default.accept_redirects (exp: 0)         [ DIFFERENT ]
+    - net.ipv6.conf.default.accept_source_route (exp: 0)      [ OK ]
+
+[+] Hardening
+------------------------------------
+    - Installed compiler(s)                                   [ FOUND ]
+    - Installed malware scanner                               [ NOT FOUND ]
+
+[+] Custom tests
+------------------------------------
+  - Running custom tests...                                   [ NONE ]
+
+[+] Plugins (phase 2)
+------------------------------------
+  - Plugins (phase 2)                                         [ DONE ]
+
+================================================================================
+
+  -[ Lynis 3.0.0 Results ]-
+
+  Great, no warnings
+
+  Suggestions (44):
+  ----------------------------
+  * Determine why /vmlinuz or /boot/vmlinuz is missing on this Debian/Ubuntu system. [KRNL-5788]
+    - Details  : /vmlinuz or /boot/vmlinuz
+      https://cisofy.com/lynis/controls/KRNL-5788/
+
+  * If not required, consider explicit disabling of core dump in /etc/security/limits.conf file [KRNL-5820]
+      https://cisofy.com/lynis/controls/KRNL-5820/
+
+  * Run pwck manually and correct any errors in the password file [AUTH-9228]
+      https://cisofy.com/lynis/controls/AUTH-9228/
+
+  * Install a PAM module for password strength testing like pam_cracklib or pam_passwdqc [AUTH-9262]
+      https://cisofy.com/lynis/controls/AUTH-9262/
+
+  * Configure minimum password age in /etc/login.defs [AUTH-9286]
+      https://cisofy.com/lynis/controls/AUTH-9286/
+
+  * Configure maximum password age in /etc/login.defs [AUTH-9286]
+      https://cisofy.com/lynis/controls/AUTH-9286/
+
+  * Default umask in /etc/login.defs could be more strict like 027 [AUTH-9328]
+      https://cisofy.com/lynis/controls/AUTH-9328/
+
+  * To decrease the impact of a full /home file system, place /home on a separate partition [FILE-6310]
+      https://cisofy.com/lynis/controls/FILE-6310/
+
+  * To decrease the impact of a full /tmp file system, place /tmp on a separate partition [FILE-6310]
+      https://cisofy.com/lynis/controls/FILE-6310/
+
+  * To decrease the impact of a full /var file system, place /var on a separate partition [FILE-6310]
+      https://cisofy.com/lynis/controls/FILE-6310/
+
+  * Disable drivers like USB storage when not used, to prevent unauthorized storage or data theft [USB-1000]
+      https://cisofy.com/lynis/controls/USB-1000/
+
+  * Purge old/removed packages (60 found) with aptitude purge or dpkg --purge command. This will cleanup old configuration files, cron jobs and startup scripts. [PKGS-7346]
+      https://cisofy.com/lynis/controls/PKGS-7346/
+
+  * Install debsums utility for the verification of packages with known good database. [PKGS-7370]
+      https://cisofy.com/lynis/controls/PKGS-7370/
+
+  * Install package apt-show-versions for patch management purposes [PKGS-7394]
+      https://cisofy.com/lynis/controls/PKGS-7394/
+
+  * Install a package audit tool to determine vulnerable packages [PKGS-7398]
+      https://cisofy.com/lynis/controls/PKGS-7398/
+
+  * Install Apache mod_evasive to guard webserver against DoS/brute force attempts [HTTP-6640]
+      https://cisofy.com/lynis/controls/HTTP-6640/
+
+  * Install Apache modsecurity to guard webserver against web application attacks [HTTP-6643]
+      https://cisofy.com/lynis/controls/HTTP-6643/
+
+  * Add HTTPS to nginx virtual hosts for enhanced protection of sensitive data and privacy [HTTP-6710]
+      https://cisofy.com/lynis/controls/HTTP-6710/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : AllowTcpForwarding (set YES to NO)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : ClientAliveCountMax (set 3 to 2)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : Compression (set YES to NO)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : LogLevel (set INFO to VERBOSE)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : MaxAuthTries (set 6 to 3)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : MaxSessions (set 10 to 2)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : TCPKeepAlive (set YES to NO)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : X11Forwarding (set YES to NO)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Consider hardening SSH configuration [SSH-7408]
+    - Details  : AllowAgentForwarding (set YES to NO)
+      https://cisofy.com/lynis/controls/SSH-7408/
+
+  * Turn off PHP information exposure [PHP-2372]
+    - Details  : expose_php = Off
+      https://cisofy.com/lynis/controls/PHP-2372/
+
+  * Change the allow_url_fopen line to: allow_url_fopen = Off, to disable downloads via PHP [PHP-2376]
+      https://cisofy.com/lynis/controls/PHP-2376/
+
+  * Enable logging to an external logging host for archiving purposes and additional protection [LOGG-2154]
+      https://cisofy.com/lynis/controls/LOGG-2154/
+
+  * Check what deleted files are still in use and why. [LOGG-2190]
+      https://cisofy.com/lynis/controls/LOGG-2190/
+
+  * Add a legal banner to /etc/issue, to warn unauthorized users [BANN-7126]
+      https://cisofy.com/lynis/controls/BANN-7126/
+
+  * Add legal banner to /etc/issue.net, to warn unauthorized users [BANN-7130]
+      https://cisofy.com/lynis/controls/BANN-7130/
+
+  * Enable process accounting [ACCT-9622]
+      https://cisofy.com/lynis/controls/ACCT-9622/
+
+  * Enable sysstat to collect accounting (disabled) [ACCT-9626]
+      https://cisofy.com/lynis/controls/ACCT-9626/
+
+  * Enable auditd to collect audit information [ACCT-9628]
+      https://cisofy.com/lynis/controls/ACCT-9628/
+
+  * Check available certificates for expiration [CRYP-7902]
+      https://cisofy.com/lynis/controls/CRYP-7902/
+
+  * Install a file integrity tool to monitor changes to critical and sensitive files [FINT-4350]
+      https://cisofy.com/lynis/controls/FINT-4350/
+
+  * Determine if automation tools are present for system management [TOOL-5002]
+      https://cisofy.com/lynis/controls/TOOL-5002/
+
+  * Consider restricting file permissions [FILE-7524]
+    - Details  : See screen output or log file
+    - Solution : Use chmod to change file permissions
+      https://cisofy.com/lynis/controls/FILE-7524/
+
+  * Double check the permissions of home directories as some might be not strict enough. [HOME-9304]
+      https://cisofy.com/lynis/controls/HOME-9304/
+
+  * One or more sysctl values differ from the scan profile and could be tweaked [KRNL-6000]
+    - Solution : Change sysctl value or disable test (skip-test=KRNL-6000:<sysctl-key>)
+      https://cisofy.com/lynis/controls/KRNL-6000/
+
+  * Harden compilers like restricting access to root user only [HRDN-7222]
+      https://cisofy.com/lynis/controls/HRDN-7222/
+
+  * Harden the system by installing at least one malware scanner, to perform periodic file system scans [HRDN-7230]
+    - Solution : Install a tool like rkhunter, chkrootkit, OSSEC
+      https://cisofy.com/lynis/controls/HRDN-7230/
+
+  Follow-up:
+  ----------------------------
+  - Show details of a test (lynis show details TEST-ID)
+  - Check the logfile for all details (less /tmp/lynis.log)
+  - Read security controls texts (https://cisofy.com)
+  - Use --upload to upload data to central system (Lynis Enterprise users)
+
+================================================================================
+
+  Lynis security scan details:
+
+  Hardening index : 65 [#############       ]
+  Tests performed : 254
+  Plugins enabled : 2
+
+  Components:
+  - Firewall               [V]
+  - Malware scanner        [X]
+
+  Scan mode:
+  Normal [ ]  Forensics [ ]  Integration [ ]  Pentest [V] (running non-privileged)
+
+  Lynis modules:
+  - Compliance status      [?]
+  - Security audit         [V]
+  - Vulnerability scan     [V]
+
+  Files:
+  - Test and debug information      : /tmp/lynis.log
+  - Report data                     : /tmp/lynis-report.dat
+
+================================================================================
+
+  Exceptions found
+  Some exceptional events or information was found!
+
+  What to do:
+  You can help by providing your log file (/tmp/lynis.log).
+  Go to https://cisofy.com/contact/ and send your file to the e-mail address listed
+
+================================================================================
+
+  Skipped tests due to non-privileged mode
+    BOOT-5108 - Check Syslinux as bootloader
+    BOOT-5116 - Check if system is booted in UEFI mode
+    AUTH-9216 - Check group and shadow group files
+    AUTH-9252 - Check ownership and permissions for sudo configuration files
+    AUTH-9288 - Checking for expired passwords
+    FILE-6368 - Checking ACL support on root file system
+    PKGS-7390 - Check Ubuntu database consistency
+    PKGS-7392 - Check for Debian/Ubuntu security updates
+    FIRE-4508 - Check used policies of iptables chains
+    FIRE-4512 - Check iptables for empty ruleset
+    FIRE-4513 - Check iptables for unused rules
+    FIRE-4586 - Check firewall logging
+    CRYP-7930 - Determine if system uses LUKS block device encryption
+
+================================================================================
+
+  Lynis 3.0.0
+
+  Auditing, system hardening, and compliance for UNIX-based systems
+  (Linux, macOS, BSD, and others)
+
+  2007-2019, CISOfy - https://cisofy.com/lynis/
+  Enterprise support available (compliance, plugins, interface and tools)
+
+================================================================================
+
+  [TIP]: Enhance Lynis audits by adding your settings to custom.prf (see /home/david/scripts/lynis/default.prf for all settings)
+
+  david@woozer:~/scripts/lynis(master○) » 
+
+```

+ 928 - 0
docs/server/mail.md

@@ -0,0 +1,928 @@
+
+
+[Source](https://www.linode.com/docs/email/postfix/email-with-postfix-dovecot-and-mysql "Permalink to Email with Postfix, Dovecot, and MySQL")
+
+### Email with Postfix, Dovecot, and MySQL
+
+
+For a different Linux distribution or different mail server, review our [email tutorials][2].
+
+### Before You Begin
+
+Ensure that the iptables firewall is not blocking any of the standard mail ports (`25`, `465`, `587`, `110`, `995`, `143`, and `993`). If using a different form of firewall, confirm that it is not blocking any of the needed ports either.
+
+### Configure DNS
+
+When ready to update the DNS and to start sending mail to the server, edit the domain's MX record so that it points to the Linode's domain or IP address, similar to the example below:
+
+    example.com         MX      10      example.com
+    example.com         MX      10      12.34.56.78
+    mail.example.com    MX      10      12.34.56.78
+
+Ensure that the MX record is changed for all domains and subdomains that might receive email. If setting up a brand new domain, these steps can be performed prior to configuring the mail server. When using Linode's DNS Manager, create an MX record that points to the desired domain or subdomain, and then create an A record for that domain or subdomain, which points to the correct IP address.
+
+### Installing an SSL Certificate
+
+Dovecot offers a default self-signed certificate for free. This certificate encrypts the mail connections similar to a purchased certificate. However, the email users receive warnings about the certificate when they attempt to set up their email accounts. Optionally, you can purchase and configure a commercial SSL certificate to avoid the warnings. For information about SSL certificates, see Linode's SSL Certificate guides.
+
+{: .note}
+>
+> As of version 2.2.13-7, Dovecot no longer provides a default SSL certificate. This affects Debian 8 users, and means that if you wish to use SSL encryption (recommended), you must generate your own self-signed certificate or use a trusted certificate from a Certificate Authority.
+>
+> Many email service providers such as Gmail will only accept commercial SSL certificates for secure IMAP/POP3 connections. To communicate with these providers, follow our guide for obtaining a commercial SSL certificate for Debian and Ubuntu or CentOS and Fedora.
+
+## Installing Packages
+
+The next steps are to install the required packages on the Linode.
+
+1.  Log in as the root user via SSH. Replace `example` with your domain name or IP address:
+
+        ssh root@example
+
+2.  Install the required packages:
+
+        apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql mysql-server
+
+    Follow the prompt to type in a secure MySQL password and to select the type of mail server you wish to configure. Select **Internet Site**. The *System Mail Name* should be the FQDN.
+
+
+## MySQL
+
+1.  Create a new database:
+
+        mysqladmin -p create mailserver
+
+2.  Enter the MySQL root password.
+
+3.  Log in to MySQL:
+
+        mysql -p mailserver
+
+4.  Create the MySQL user and grant the new user permissions over the database. Replace `mailuserpass` with a secure password:
+
+        GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass';
+
+5.  Flush the MySQL privileges to apply the change:
+
+        FLUSH PRIVILEGES;
+
+6.  Create a table for the domains that will receive mail on the Linode:
+
+        CREATE TABLE `virtual_domains` (
+          `id` int(11) NOT NULL auto_increment,
+          `name` varchar(50) NOT NULL,
+          PRIMARY KEY (`id`)
+        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+7.  Create a table for all of the email addresses and passwords:
+
+        CREATE TABLE `virtual_users` (
+          `id` int(11) NOT NULL auto_increment,
+          `domain_id` int(11) NOT NULL,
+          `password` varchar(106) NOT NULL,
+          `email` varchar(100) NOT NULL,
+          PRIMARY KEY (`id`),
+          UNIQUE KEY `email` (`email`),
+          FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
+        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+8.  Create a table for the email aliases:
+
+        CREATE TABLE `virtual_aliases` (
+          `id` int(11) NOT NULL auto_increment,
+          `domain_id` int(11) NOT NULL,
+          `source` varchar(100) NOT NULL,
+          `destination` varchar(100) NOT NULL,
+          PRIMARY KEY (`id`),
+          FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
+        ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
+
+### Adding Data
+
+Now that the database and tables have been created, add some data to MySQL.
+
+1.  Add the domains to the `virtual_domains` table. Replace the values for `example.com` and `hostname` with your own settings.
+
+        INSERT INTO `mailserver`.`virtual_domains`
+          (`id` ,`name`)
+        VALUES
+          ('1', 'example.com'),
+          ('2', 'hostname.example.com'),
+          ('3', 'hostname'),
+          ('4', 'localhost.example.com');
+
+    {: .note }
+    >
+    > Note which `id` goes with which domain, the `id` is necessary for the next two steps.
+
+2.  Add email addresses to the `virtual_users` table. Replace the email address values with the addresses that you wish to configure on the mailserver. Replace the `password` values with strong passwords.
+
+        INSERT INTO `mailserver`.`virtual_users`
+          (`id`, `domain_id`, `password` , `email`)
+        VALUES
+          ('1', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email1@example.com'),
+          ('2', '1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'email2@example.com');
+
+3.  To set up an email alias, add it to the `virtual_aliases` table.
+
+        INSERT INTO `mailserver`.`virtual_aliases`
+          (`id`, `domain_id`, `source`, `destination`)
+        VALUES
+          ('1', '1', 'alias@example.com', 'email1@example.com');
+
+That's it! Now you're ready to verify that the data was successfully added to MySQL.
+
+### Testing
+
+Since all of the information has been entered into MySQL, check that the data is there.
+
+1.  Check the contents of the `virtual_domains` table:
+
+        SELECT * FROM mailserver.virtual_domains;
+
+2.  Verify that you see the following output:
+
+        +----+-----------------------+
+        | id | name                  |
+        +----+-----------------------+
+        |  1 | example.com           |
+        |  2 | hostname.example.com  |
+        |  3 | hostname              |
+        |  4 | localhost.example.com |
+        +----+-----------------------+
+        4 rows in set (0.00 sec)
+
+3.  Check the `virtual_users` table:
+
+        SELECT * FROM mailserver.virtual_users;
+
+4.  Verify the following output, the hashed passwords are longer than they appear below:
+
+        +----+-----------+-------------------------------------+--------------------+
+        | id | domain_id | password                            | email              |
+        +----+-----------+-------------------------------------+--------------------+
+        |  1 |         1 | $6$574ef443973a5529c20616ab7c6828f7 | email1@example.com |
+        |  2 |         1 | $6$030fa94bcfc6554023a9aad90a8c9ca1 | email2@example.com |
+        +----+-----------+-------------------------------------+--------------------+
+        2 rows in set (0.01 sec)
+
+5.  Check the `virtual_aliases` table:
+
+        SELECT * FROM mailserver.virtual_aliases;
+
+6.  Verify the following output:
+
+        +----+-----------+-------------------+--------------------+
+        | id | domain_id | source            | destination        |
+        +----+-----------+-------------------+--------------------+
+        |  1 |         1 | alias@example.com | email1@example.com |
+        +----+-----------+-------------------+--------------------+
+        1 row in set (0.00 sec)
+
+7.  If everything outputs correctly, you're done with MySQL! Exit MySQL:
+
+        exit
+
+## Postfix
+
+Next, set up Postfix so the server can accept incoming messages for the domains.
+
+1.  Before making any changes, make a copy of the default Postfix configuration file in case you need to revert to the default configuration:
+
+        cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
+
+2.  Edit the `/etc/postfix/main.cf` file to match the following. Ensure that occurrences of `example.com` are replaced with the domain name. Also, replace `hostname` with the system's hostname on line 44.
+
+    {:.file }
+    /etc/postfix/main.cf
+
+        # See /usr/share/postfix/main.cf.dist for a commented, more complete version
+
+        # Debian specific:  Specifying a file name will cause the first
+        # line of that file to be used as the name.  The Debian default
+        # is /etc/mailname.
+        #myorigin = /etc/mailname
+
+        smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
+        biff = no
+
+        # appending .domain is the MUA's job.
+        append_dot_mydomain = no
+
+        # Uncomment the next line to generate "delayed mail" warnings
+        #delay_warning_time = 4h
+
+        readme_directory = no
+
+        # TLS parameters
+        #smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
+        #smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
+        #smtpd_use_tls=yes
+        #smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
+        #smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
+
+        smtpd_tls_cert_file=/etc/dovecot/dovecot.pem
+        smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem
+        smtpd_use_tls=yes
+        smtpd_tls_auth_only = yes
+
+        #Enabling SMTP for authenticated users, and handing off authentication to Dovecot
+        smtpd_sasl_type = dovecot
+        smtpd_sasl_path = private/auth
+        smtpd_sasl_auth_enable = yes
+
+        smtpd_recipient_restrictions =
+                permit_sasl_authenticated,
+                permit_mynetworks,
+                reject_unauth_destination
+
+        # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
+        # information on enabling SSL in the smtp client.
+
+        myhostname = hostname.example.com
+        alias_maps = hash:/etc/aliases
+        alias_database = hash:/etc/aliases
+        myorigin = /etc/mailname
+        #mydestination = example.com, hostname.example.com, localhost.example.com, localhost
+        mydestination = localhost
+        relayhost =
+        mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
+        mailbox_size_limit = 0
+        recipient_delimiter = +
+        inet_interfaces = all
+
+        #Handing off local delivery to Dovecot's LMTP, and telling it where to store mail
+        virtual_transport = lmtp:unix:private/dovecot-lmtp
+
+        #Virtual domains, users, and aliases
+        virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
+        virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
+        virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf,
+                mysql:/etc/postfix/mysql-virtual-email2email.cf
+
+
+3.  Create the file for virtual domains. Ensure that you change the password for the `mailuser` account. If you used a different user, database name, or table name, change those settings as well.
+
+    {: .file }
+    /etc/postfix/mysql-virtual-mailbox-domains.cf
+
+        user = mailuser
+        password = mailuserpass
+        hosts = 127.0.0.1
+        dbname = mailserver
+        query = SELECT 1 FROM virtual_domains WHERE name='%s'
+
+
+4.  Create the `/etc/postfix/mysql-virtual-mailbox-maps.cf` file, and enter the following values. Make sure you use the `mailuser`'s password and make any other changes as needed.
+
+    {: .file }
+    /etc/postfix/mysql-virtual-mailbox-maps.cf
+
+        user = mailuser
+        password = mailuserpass
+        hosts = 127.0.0.1
+        dbname = mailserver
+        query = SELECT 1 FROM virtual_users WHERE email='%s'
+
+
+5.  Create the `/etc/postfix/mysql-virtual-alias-maps.cf` file and enter the following values. Again, make sure you use the mailuser's password, and make any other changes as necessary.
+
+    {: .file }
+    /etc/postfix/mysql-virtual-alias-maps.cf
+
+        user = mailuser
+        password = mailuserpass
+        hosts = 127.0.0.1
+        dbname = mailserver
+        query = SELECT destination FROM virtual_aliases WHERE source='%s'
+
+
+6.  Create the `/etc/postfix/mysql-virtual-email2email.cf` file and enter the following values. Again, make sure you use the mailuser's password, and make any other changes as necessary.
+
+    {: .file }
+    /etc/postfix/mysql-virtual-email2email.cf
+
+        user = mailuser
+        password = mailuserpass
+        hosts = 127.0.0.1
+        dbname = mailserver
+        query = SELECT email FROM virtual_users WHERE email='%s'
+
+
+7.  Save the changes you've made to the `/etc/postfix/mysql-virtual-email2email.cf` file, and restart Postfix:
+
+        sudo service postfix restart
+
+8.  Enter the following command to ensure that Postfix can find the first domain. Be sure to replace `example.com` with the first virtual domain. The command should return `1` if it is successful.
+
+        postmap -q example.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
+
+9.  Test Postfix to verify that it can find the first email address in the MySQL table. Enter the following command, replacing `email1@example.com` with the first email address in the MySQL table. You should again receive `1` as the output:
+
+        postmap -q email1@example.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
+
+10. Test Postfix to verify that it can find the aliases by entering the following command. Be sure to replace `alias@example.com` with the actual alias you entered:
+
+        postmap -q alias@example.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
+
+    This should return the email address to which the alias forwards, which is `email1@example.com` in this example.
+
+11. Make a copy of the `/etc/postfix/master.cf` file:
+
+        cp /etc/postfix/master.cf /etc/postfix/master.cf.orig
+
+12. Open the configuration file for editing and uncomment the two lines starting with `submission` and `smtps` and the block of lines starting with `-o` after each. The first section of the `/etc/postfix/master.cf` file should resemble the following:
+
+    {: .file-excerpt }
+	  /etc/postfix/master.cf
+
+  	    #
+  	    # Postfix master process configuration file.  For details on the format
+  	    # of the file, see the master(5) manual page (command: "man 5 master").
+  	    #
+  	    # Do not forget to execute "postfix reload" after editing this file.
+  	    #
+  	    # ==========================================================================
+  	    # service type  private unpriv  chroot  wakeup  maxproc command + args
+  	    #               (yes)   (yes)   (yes)   (never) (100)
+  	    # ==========================================================================
+  	    smtp      inet  n       -       -       -       -       smtpd
+  	    #smtp      inet  n       -       -       -       1       postscreen
+  	    #smtpd     pass  -       -       -       -       -       smtpd
+  	    #dnsblog   unix  -       -       -       -       0       dnsblog
+  	    #tlsproxy  unix  -       -       -       -       0       tlsproxy
+  	    submission inet n       -       -       -       -       smtpd
+  	      -o syslog_name=postfix/submission
+  	      -o smtpd_tls_security_level=encrypt
+  	      -o smtpd_sasl_auth_enable=yes
+  	      -o smtpd_client_restrictions=permit_sasl_authenticated,reject
+  	      -o milter_macro_daemon_name=ORIGINATING
+  	    smtps     inet  n       -       -       -       -       smtpd
+  	      -o syslog_name=postfix/smtps
+  	      -o smtpd_tls_wrappermode=yes
+  	      -o smtpd_sasl_auth_enable=yes
+  	      -o smtpd_client_restrictions=permit_sasl_authenticated,reject
+  	      -o milter_macro_daemon_name=ORIGINATING
+
+
+13. Change the permissions on the `/etc/postfix` directory to restrict permissions to allow only its owner and the corresponding group:
+
+        chmod -R o-rwx /etc/postfix
+
+14. Restart Postfix:
+
+        service postfix restart
+
+Congratulations! You have successfully configured Postfix.
+
+## Dovecot
+
+Dovecot allows users to log in and check their email using POP3 and IMAP. In this section, configure Dovecot to force users to use SSL when they connect so that their passwords are never sent to the server in plain text.
+
+1.  Copy all of the configuration files so that you can easily revert back to them if needed:
+
+        cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
+        cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
+        cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
+        cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig
+        cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
+        cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig
+
+2.  Open the main configuration file and edit the contents to match the following. Specifically, add the line beginning with `protocols` under the section beginning with "Enable installed protocols."
+
+    {:.file }
+    /etc/dovecot/dovecot.conf
+
+        ## Dovecot configuration file
+
+        # If you're in a hurry, see http://wiki2.dovecot.org/QuickConfiguration
+
+        # "doveconf -n" command gives a clean output of the changed settings. Use it
+        # instead of copy&pasting files when posting to the Dovecot mailing list.
+
+        # '#' character and everything after it is treated as comments. Extra spaces
+        # and tabs are ignored. If you want to use either of these explicitly, put the
+        # value inside quotes, eg.: key = "# char and trailing whitespace  "
+
+        # Default values are shown for each setting, it's not required to uncomment
+        # those. These are exceptions to this though: No sections (e.g. namespace {})
+        # or plugin settings are added by default, they're listed only as examples.
+        # Paths are also just examples with the real defaults being based on configure
+        # options. The paths listed here are for configure --prefix=/usr
+        # --sysconfdir=/etc --localstatedir=/var
+
+        # Enable installed protocols
+        !include_try /usr/share/dovecot/protocols.d/*.protocol
+        protocols = imap pop3 lmtp
+
+        # A comma separated list of IPs or hosts where to listen in for connections.
+        # "*" listens in all IPv4 interfaces, "::" listens in all IPv6 interfaces.
+        # If you want to specify non-default ports or anything more complex,
+        # edit conf.d/master.conf.
+        #listen = *, ::
+
+        # Base directory where to store runtime data.
+        #base_dir = /var/run/dovecot/
+
+        # Name of this instance. Used to prefix all Dovecot processes in ps output.
+        #instance_name = dovecot
+
+        # Greeting message for clients.
+        #login_greeting = Dovecot ready.
+
+        # Space separated list of trusted network ranges. Connections from these
+        # IPs are allowed to override their IP addresses and ports (for logging and
+        # for authentication checks). disable_plaintext_auth is also ignored for
+        # these networks. Typically you'd specify the IMAP proxy servers here.
+        #login_trusted_networks =
+
+        # Sepace separated list of login access check sockets (e.g. tcpwrap)
+        #login_access_sockets =
+
+        # Show more verbose process titles (in ps). Currently shows user name and
+        # IP address. Useful for seeing who are actually using the IMAP processes
+        # (eg. shared mailboxes or if same uid is used for multiple accounts).
+        #verbose_proctitle = no
+
+        # Should all processes be killed when Dovecot master process shuts down.
+        # Setting this to "no" means that Dovecot can be upgraded without
+        # forcing existing client connections to close (although that could also be
+        # a problem if the upgrade is e.g. because of a security fix).
+        #shutdown_clients = yes
+
+        # If non-zero, run mail commands via this many connections to doveadm server,
+        # instead of running them directly in the same process.
+        #doveadm_worker_count = 0
+        # UNIX socket or host:port used for connecting to doveadm server
+        #doveadm_socket_path = doveadm-server
+
+        # Space separated list of environment variables that are preserved on Dovecot
+        # startup and passed down to all of its child processes. You can also give
+        # key=value pairs to always set specific settings.
+        #import_environment = TZ
+
+        ##
+        ## Dictionary server settings
+        ##
+
+        # Dictionary can be used to store key=value lists. This is used by several
+        # plugins. The dictionary can be accessed either directly or though a
+        # dictionary server. The following dict block maps dictionary names to URIs
+        # when the server is used. These can then be referenced using URIs in format
+        # "proxy::<name>".
+
+        dict {
+          #quota = mysql:/etc/dovecot/dovecot-dict-sql.conf.ext
+          #expire = sqlite:/etc/dovecot/dovecot-dict-sql.conf.ext
+        }
+
+        # Most of the actual configuration gets included below. The filenames are
+        # first sorted by their ASCII value and parsed in that order. The 00-prefixes
+        # in filenames are intended to make it easier to understand the ordering.
+        !include conf.d/*.conf
+
+        # A config file can also tried to be included without giving an error if
+        # it's not found:
+        !include_try local.conf
+
+
+3.  Save the changes to the `/etc/dovecot/dovecot.conf` file.
+
+4.  Open the `/etc/dovecot/conf.d/10-mail.conf` file. This file controls how Dovecot interacts with the server's file system to store and retrieve messages.
+
+    {:.note}
+    >
+    > Click to see the final, complete version of `10-mail.conf` example file. This is a long file, so you may need to use your text editor's search feature to find the values you need to edit.
+
+    Modify the following variables within the configuration file:
+
+    {: .file-excerpt }
+    /etc/dovecot/conf.d/10-mail.conf
+
+        mail_location = maildir:/var/mail/vhosts/%d/%n
+        ...
+        mail_privileged_group = mail
+
+
+    Save your changes and exit.
+
+5.  Enter the following command to verify the permissions for `/var/mail`:
+
+        ls -ld /var/mail
+
+6.  Verify that the permissions for `/var/mail` are as follows. The date and time will likely be different in your output:
+
+        drwxrwsr-x 2 root mail 4096 Mar  6 15:08 /var/mail
+
+    If your permissions do not match the above, go back and ensure you've completed the above steps correctly.
+
+7.  Create the `/var/mail/vhosts/` directory and a subdirectory for your domain, replacing `example.com`:
+
+        mkdir -p /var/mail/vhosts/example.com
+
+    This directory will serve as storage for mail sent to your domain.
+
+8.  Create the `vmail` user with a user and group id of 5000 by entering the following commands, one by one. This user will be in charge of reading mail from the server.
+
+        groupadd -g 5000 vmail
+        useradd -g vmail -u 5000 vmail -d /var/mail
+
+9.  Change the owner of the `/var/mail/` folder and its contents to belong to `vmail`:
+
+        chown -R vmail:vmail /var/mail
+
+10. Open the user authentication file, located in `/etc/dovecot/conf.d/10-auth.conf` and disable plain-text authentication by uncommenting this line:
+
+
+    /etc/dovecot/conf.d/10-auth.conf
+
+    disable_plaintext_auth = yes
+
+
+  Set the `auth_mechanisms` by modifying the following line:
+
+	/etc/dovecot/conf.d/10-auth.conf
+
+	   auth_mechanisms = plain login
+
+
+  Comment out the system user login line:
+
+    {: .file-excerpt }
+	/etc/dovecot/conf.d/10-auth.conf
+	: ~~~
+	  #!include auth-system.conf.ext
+	  ~~~
+
+  Enable MySQL authentication by uncommenting the `auth-sql.conf.ext` line:
+
+
+	/etc/dovecot/conf.d/10-auth.conf
+	  #!include auth-system.conf.ext
+	  !include auth-sql.conf.ext
+	  #!include auth-ldap.conf.ext
+	  #!include auth-passwdfile.conf.ext
+	  #!include auth-checkpassword.conf.ext
+	  #!include auth-vpopmail.conf.ext
+	  #!include auth-static.conf.ext
+
+
+
+
+  Save the changes to the `/etc/dovecot/conf.d/10-auth.conf` file.
+
+11. Edit the `/etc/dovecot/conf.d/auth-sql.conf.ext` file with the authentication information. Ensure your file contains the following lines and that they are uncommented:
+
+    {: .file-excerpt }
+	  /etc/dovecot/conf.d/auth-sql.conf.ext
+
+	    passdb {
+	      driver = sql
+	      args = /etc/dovecot/dovecot-sql.conf.ext
+	    }
+	    userdb {
+	      driver = static
+	      args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
+	   }
+
+
+  Save the changes to the `/etc/dovecot/conf.d/auth-sql.conf.ext` file.
+
+12. Update the `/etc/dovecot/dovecot-sql.conf.ext` file with our custom MySQL connection information.
+
+    Uncomment and set the `driver` line as shown below:
+
+    {: .file-excerpt }
+    /etc/dovecot/dovecot-sql.conf.ext
+
+	      driver = mysql
+
+
+    Uncomment the `connect` line and set the MySQL connection information. Use the `mailuser`'s password and any other custom settings:
+
+    {: .file-excerpt }
+	  /etc/dovecot/dovecot-sql.conf.ext
+
+	      connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass
+
+
+    Uncomment the `default_pass_scheme` line and set it to `SHA512-CRYPT`:
+
+    {: .file-excerpt }
+	  /etc/dovecot/dovecot-sql.conf.ext
+
+	    default_pass_scheme = SHA512-CRYPT
+
+
+    Uncomment the `password_query` line and set it to the following:
+
+    {: .file-excerpt }
+	  /etc/dovecot/dovecot-sql.conf.ext
+
+	    password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';
+
+
+	{:.note}
+    >
+    > This password query lets you use an email address listed in the `virtual_users` table as the username credential for an email account. If you want to be able to use the alias as the username instead (listed in the `virtual_aliases` table), first add every primary email address to the `virtual_aliases` table (directing to themselves) and then use the following line in `/etc/dovecot/dovecot-sql.conf.ext` instead:
+    >
+    >     password_query = SELECT email as user, password FROM virtual_users WHERE email=(SELECT destination FROM virtual_aliases WHERE source = '%u');
+
+
+  Save the changes to the `/etc/dovecot/dovecot-sql.conf.ext` file.
+
+13. Change the owner and group of the `/etc/dovecot/` directory to `vmail` and `dovecot`:
+
+        chown -R vmail:dovecot /etc/dovecot
+
+14. Change the permissions on the `/etc/dovecot/` directory:
+
+        chmod -R o-rwx /etc/dovecot
+
+15. Open the sockets configuration file, located at `/etc/dovecot/conf.d/10-master.conf`
+
+    {:.note}
+    >
+    > Click this link to see the final version of . There are many nested blocks of code in this file, so please pay close attention to the brackets. It's probably better if you edit line by line, rather than copying large chunks of code. If there's a syntax error, Dovecot will crash silently, but you can check `/var/log/upstart/dovecot.log` to help you find the error.
+
+16. Disable unencrypted IMAP and POP3 by setting the protocols' ports to 0, as shown below. Ensure that the entries for port and ssl below the IMAPS and pop3s entries are uncommented:
+
+    {: .file-excerpt }
+	  /etc/dovecot/conf.d/10-master.conf
+
+      service imap-login {
+        inet_listener imap {
+          port = 0
+        }
+      inet_listener imaps {
+        port = 993
+        ssl = yes
+        }
+	  	...
+		  service pop3-login {
+	  	  inet_listener pop3 {
+		      port = 0
+  		  }
+        inet_listener pop3s {
+          port = 995
+          ssl = yes
+        }
+		  ...
+		  }
+
+
+
+  Leave the secure versions unedited, specifically the `imaps` and `pop3s`, so that their ports still work. The default settings for `imaps` and `pop3s` are fine. Optionally, leave the `port` lines commented out, as the default ports are the standard 993 and 995.
+
+  Find the `service lmtp` section and use the configuration shown below:
+
+    {: .file-excerpt }
+	  /etc/dovecot/conf.d/10-master.conf
+
+      service lmtp {
+          unix_listener /var/spool/postfix/private/dovecot-lmtp {
+            mode = 0600
+            user = postfix
+            group = postfix
+          }
+		    # Create inet listener only if you can't use the above UNIX socket
+		    #inet_listener lmtp {
+		      # Avoid making LMTP visible for the entire internet
+		      #address =
+		      #port =
+		    #}
+		  }
+
+
+  Locate the `service auth` section and configure it as shown below:
+
+    {: .file-excerpt }
+	  /etc/dovecot/conf.d/10-master.conf
+	  : ~~~
+	    service auth {
+	      # auth_socket_path points to this userdb socket by default. It's typically
+	      # used by dovecot-lda, doveadm, possibly imap process, etc. Its default
+	      # permissions make it readable only by root, but you may need to relax these
+	      # permissions. Users that have access to this socket are able to get a list
+	      # of all usernames and get results of everyone's userdb lookups.
+	      unix_listener /var/spool/postfix/private/auth {
+	        mode = 0666
+	        user = postfix
+	        group = postfix
+	      }
+
+	      unix_listener auth-userdb {
+	        mode = 0600
+	        user = vmail
+	        #group =
+	      }
+
+	      # Postfix smtp-auth
+	      #unix_listener /var/spool/postfix/private/auth {
+	      #  mode = 0666
+	      #}
+
+	      # Auth process is run as this user.
+	      user = dovecot
+	    }
+
+
+  In the `service auth-worker` section, uncomment the `user` line and set it to `vmail` as shown below:
+
+    {: .file-excerpt }
+	  /etc/dovecot/conf.d/10-master.conf
+	  :   ~~~
+	      service auth-worker {
+	        # Auth worker process is run as root by default, so that it can access
+	        # /etc/shadow. If this isn't necessary, the user should be changed to
+	        # $default_internal_user.
+	        user = vmail
+	      }
+	      ~~~
+
+    Save the changes to the `/etc/dovecot/conf.d/10-master.conf` file.
+
+17. Verify that the default Dovecot SSL certificate and key exist:
+
+        ls /etc/dovecot/dovecot.pem
+        ls /etc/dovecot/private/dovecot.pem
+
+    {:.note}
+    >
+    > As noted above, these files are not provided in Dovecot 2.2.13-7 and above, and will not be present on Debian 8 and other newer systems, as well as some older ones.
+    >
+    > If using a different SSL certificate, upload the certificate to the server and make a note of its location and the key's location.
+
+18. Open `/etc/dovecot/conf.d/10-ssl.conf`.
+
+
+
+19. Verify that the `ssl_cert` setting has the correct path to the certificate, and that the `ssl_key` setting has the correct path to the key. The default setting displayed uses Dovecot's built-in certificate, so you can leave this as-is if using the Dovecot certificate. Update the paths accordingly if you are using a different certificate and key.
+
+    {: .file-excerpt }
+	  /etc/dovecot/conf.d/10-ssl.conf
+
+  	    ssl_cert = </etc/dovecot/dovecot.pem
+  	    ssl_key = </etc/dovecot/private/dovecot.pem
+
+
+    Force the clients to use SSL encryption by uncommenting the `ssl` line and setting it to `required`:
+
+    {: .file-excerpt }
+    /etc/dovecot/conf.d/10-ssl.conf
+
+        ssl = required
+
+
+    Save the changes to the `/etc/dovecot/conf.d/10-ssl.conf` file.
+
+20. Finally, restart Dovecot:
+
+        service dovecot restart
+
+
+## Test Email
+
+1.  Set up a test account in an email client to ensure that everything is working. Many clients detect server settings automatically. However, manual configuration requires the following parameters:
+
+    -   the full email address, including the `@example.com` part, is the username.
+    -   the password should be the one you added to the MySQL table for this email address.
+    -   The incoming and outgoing server names must be a domain that resolves to the Linode.
+    -   Both the incoming and outgoing servers require authentication and SSL encryption.
+    -   You should use Port 993 for secure IMAP, Port 995 for secure POP3, and Port 587 with SSL for SMTP.
+
+2.  Try sending an email to this account from an outside email account and then reply to it. Check the mail log file in */var/log/mail.log* for the following output (the first block is for an incoming message, and the second block for an outgoing message):
+
+    {: .file-excerpt }
+	  /var/log/mail.log
+
+	    Mar 22 18:18:15 host postfix/smtpd[22574]: connect from mail1.linode.com[96.126.108.55]
+	    Mar 22 18:18:15 host postfix/smtpd[22574]: 2BD192839B: client=mail1.linode.com[96.126.108.55]
+	    Mar 22 18:18:15 host postfix/cleanup[22583]: 2BD192839B: message-id=<D4887A5E-DEAC-45CE-BDDF-3C89DEA84236@example.com>
+	    Mar 22 18:18:15 host postfix/qmgr[15878]: 2BD192839B: from=<support@linode.com>, size=1156, nrcpt=1 (queue active)
+	    Mar 22 18:18:15 host postfix/smtpd[22574]: disconnect from mail1.linode.com[96.126.108.55]
+	    Mar 22 18:18:15 host dovecot: lmtp(22587): Connect from local
+	    Mar 22 18:18:15 host dovecot: lmtp(22587, email1@example.com): 5GjrDafYTFE7WAAABf1gKA: msgid=<D4887A5E-DEAC-45CE-BDDF-3C89DEA84236@linode.com>: saved mail to INBOX
+	    Mar 22 18:18:15 host dovecot: lmtp(22587): Disconnect from local: Client quit (in reset)
+	    Mar 22 18:18:15 host postfix/lmtp[22586]: 2BD192839B: to=<email1@example.com>, relay=host.example.com[private/dovecot-lmtp], delay=0.09, delays=0.03/0.02/0.03/0.01, dsn=2.0.0, status=sent (250 2.0.0 <email1@example.com> 5GjrDafYTFE7WAAABf1gKA Saved)
+	    Mar 22 18:18:15 host postfix/qmgr[15878]: 2BD192839B: removed
+
+
+    {: .file-excerpt }
+	  /var/log/mail.log
+
+	    Mar 22 18:20:29 host postfix/smtpd[22590]: connect from 173-161-199-49-Philadelphia.hfc.comcastbusiness.net[173.161.199.49]
+	    Mar 22 18:20:29 host dovecot: auth-worker: mysql(127.0.0.1): Connected to database mailserver
+	    Mar 22 18:20:29 host postfix/smtpd[22590]: AA10A2839B: client=173-161-199-49-Philadelphia.hfc.comcastbusiness.net[173.161.199.49], sasl_method=PLAIN, sasl_username=email1@example.com
+	    Mar 22 18:20:29 host postfix/cleanup[22599]: AA10A2839B: message-id=<FB6213FA-6F13-49A8-A5DD-F324A4FCF9E9@example.com>
+	    Mar 22 18:20:29 host postfix/qmgr[15878]: AA10A2839B: from=<email1@example.com>, size=920, nrcpt=1 (queue active)
+	    Mar 22 18:20:29 host postfix/smtp[22601]: AA10A2839B: to=<support@linode.com>, relay=mail1.linode.com[96.126.108.55]:25, delay=0.14, delays=0.08/0.01/0.05/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as C4232266C9)
+	    Mar 22 18:20:29 host postfix/qmgr[15878]: AA10A2839B: removed
+
+
+You now have a functioning mail server that can securely send and receive email. If things are not working smoothly, try consulting the Troubleshooting Problems with Postfix, Dovecot, and MySQL guide. At this point, consider adding spam and virus filtering and a webmail client. If DNS records have not been created for the mail server yet, do so now. Once the DNS records have propagated, email will be delivered via the new mail server.
+
+{: .note }
+>If errors are encountered in the /var/log/syslog stating "Invalid settings: postmaster_address setting not given", you may need to append the following line to the /etc/dovecot/dovecot.conf file, replacing domain with the domain name.
+>
+>     postmaster_address=postmaster at DOMAIN
+
+## Adding New Domains, Email Addresses, and Aliases
+
+Although the mail server is up and running, eventually you'll probably need to add new domains, email addresses, and aliases for the users. To do this, simply add a new line to the appropriate MySQL table. These instructions are for command-line MySQL, but you can also use [phpMyAdmin](http://www.phpmyadmin.net/) to add new entries to the tables.
+
+### Domains
+
+1.  To add a new domain, open a terminal window and log in to the Linode via SSH.
+
+2.  Log in to the MySQL server with an appropriately privileged user. For this example, use the `root` user:
+
+        mysql -u root -p mailserver
+
+3.  Enter the root MySQL password when prompted.
+4.  Always view the contents of the table before adding new entries. Enter the following command to view the current contents of any table, replacing `virtual_domains` with the table:
+
+        SELECT * FROM mailserver.virtual_domains;
+
+5.  The output should resemble the following:
+
+        +----+-----------------------+
+        | id | name                  |
+        +----+-----------------------+
+        |  1 | example.com           |
+        |  2 | hostname.example.com  |
+        |  3 | hostname              |
+        |  4 | localhost.example.com |
+        +----+-----------------------+
+
+6.  To add another domain, enter the following command, replacing `newdomain.com` with the domain name:
+
+        INSERT INTO `mailserver`.`virtual_domains`
+          (`name`)
+        VALUES
+          ('newdomain.com');
+
+7.  Verify that the new domain has been added. The output should display the new domain name.
+
+        SELECT * FROM mailserver.virtual_domains;
+
+8.  Exit MySQL:
+
+        quit
+
+You have successfully added the new domain to the Postfix and Dovecot setup.
+
+### Email Addresses
+
+1.  To add a new email address, enter the following command in MySQL, replacing `newpassword` with the user's password, and `email3@newdomain.com` with the user's email address:
+
+        INSERT INTO `mailserver`.`virtual_users`
+          (`domain_id`, `password` , `email`)
+        VALUES
+          ('5', ENCRYPT('newpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) , 'email3@newdomain.com');
+
+    {: .note }
+    >
+    > Be sure to use the correct number for the `domain_id`. In this case, we are using `5`, because we want to make an email address for `newdomain.com`, and `newdomain.com` has an `id` of `5` in the `virtual_domains` table.
+
+2.  Verify that the new email address has been added.  The new email address should be displayed in the output.
+
+        SELECT * FROM mailserver.virtual_users;
+
+3.  Exit MySQL:
+
+        quit
+
+You have successfully added the new email address to the Postfix and Dovecot setup.
+
+### Aliases
+
+1.  To add a new alias, enter the following command in MySQL, replacing `alias@newdomain.com` with the address from which you want to forward email, and `myemail@gmail.com` with the address that you want to forward the mail to. The `alias@newdomain.com` needs to be an email address that already exists on the server.
+
+        INSERT INTO `mailserver`.`virtual_aliases`
+          (`domain_id`, `source`, `destination`)
+        VALUES
+          ('5', 'alias@newdomain.com', 'myemail@gmail.com');
+
+    {: .note }
+    >
+    > Ensure that the correct number is entered for the `domain_id` value. Use the `id` of the domain for this email address. For an explanation of `id` us, see the email users section above.
+
+    You can also add a "catch-all" alias which will forward all emails sent to a domain which do not have matching aliases or users by specifying `@newdomain.com` as the source of the alias.
+
+        INSERT INTO `mailserver`.`virtual_aliases`
+          (`domain_id`, `source`, `destination`)
+        VALUES
+          ('5', '@newdomain.com', 'myemail@gmail.com');
+
+2.  Verify that the new alias has been added. The new alias will be displayed in the output.
+
+        SELECT * FROM mailserver.virtual_aliases;
+
+3.  Exit MySQL:
+
+        quit
+
+You have now successfully added the new alias to the Postfix and Dovecot setup.
+
+This guide is published under a [CC BY-ND 4.0][21] license.

+ 207 - 0
docs/server/monit.md

@@ -0,0 +1,207 @@
+
+
+- [https://mmonit.com/monit/](https://mmonit.com/monit/)
+- [https://mmonit.com/monit/documentation/monit.html](https://mmonit.com/monit/documentation/monit.html)
+
+
+###Installing Monit
+
+[Source](https://www.linode.com/docs/uptime/monitoring/monitoring-servers-with-monit)  
+Update your system and install Monit. Some distros require that Monit be manually enabled and started.
+
+### Arch
+
+    sudo pacman -Syu && sudo pacman -S monit
+    sudo systemctl enable monit && sudo systemctl start monit
+
+### CentOS
+
+Monit is available in the [EPEL repository](https://fedoraproject.org/wiki/EPEL).
+
+    sudo yum update && sudo yum install epel-release
+    sudo yum update && sudo yum install monit
+
+To enable and start the daemon in CentOS 7:
+
+    sudo systemctl enable monit && sudo systemctl start monit
+
+To enable and start the daemon in CentOS 6:
+
+    sudo chkconfig monit on && sudo service start monit
+
+### Debian / Ubuntu
+
+Debian and Ubuntu automatically start and enable Monit after installation.
+
+    sudo apt-get update && sudo apt-get upgrade
+    sudo apt-get install monit
+
+### Fedora
+
+    sudo dnf update && sudo dnf install monit
+    sudo systemctl enable monit && sudo systemctl start monit
+
+### Restarting Monit
+
+ If you're using a Linux distro with systemd (CentOS 7, Debian 8, Fedora 22):
+
+    sudo systemctl restart monit
+
+If your distro has System V (CentOS 6, Debian 7) or Upstart (Ubuntu 14.04):
+
+    sudo service monit restart
+
+##Configure the Monit Daemon
+
+Monit's configuration is in the file `/etc/monit/monitrc`. Open this file now in your favorite text editor. We'll start by setting up the monit process itself.
+
+### Polling Frequency
+
+    set daemon 300
+
+This is the interval (in seconds) at which Monit runs its tests. The value you choose will depend on how many tests you define, how quickly you need Monit to act on events, and how much load the tests themselves add to your server. Begin by running Monit at the default setting of two minutes and evaluate its performance. If you change this value, you will need to [restart Monit](#restarting-monit).
+
+Consider setting the testing interval at up to 5 minutes if minimizing a load on your server is more important than instant alerts and responses.
+
+To have Monit delay starting on system boot, include the delay line:
+
+    set daemon 300
+        with start delay 240
+
+Other processes may take some time to complete their own startup. Including the delay line will prevent Monit from sending alerts that all services are down every time you boot the server.
+
+###Alerting
+
+Monit can optionally alert you by email when it triggers on an event. It can use a Mail Transfer Agent (MTA) on the local host if you have one configured, or an outside mail server that will accept incoming SMTP traffic from your host. See Linux System Administration Basics - Sending Email From Your Server for help with configuring this.
+
+Specify what server you will send mail through on this line:
+
+    set mailserver mail.example.com
+
+If you need to specify a port other than the default for SMTP (25), add it following the server name:
+
+    set mailserver mail.example.com port 2025
+
+You can also specify multiple mail servers by entering more than one server name, separated by comma:
+
+    set mailserver mail.example.com, backupmail.example.com
+
+Monit will try each server in turn until one succeeds. It will **not** _retry_ if no servers succeed, unless you also configure the event queue. To do this, you specify a directory to store the undelivered messages and how many messages you want to allow to queue up. The config file defaults normally suffice:
+
+    set eventqueue
+        basedir /var/lib/monit/events
+        slots 100
+
+Enter the email address to which Monit should deliver its alerts:
+
+    set alert your.email@example.com
+
+If you prefer to receive alerts as text messages, use your cell provider's email-to-text gateway if one is provided. You can find a list of providers at Wikipedia, here: [Email-to-SMS gateways](https://en.wikipedia.org/wiki/SMS_gateway#Use_with_email_clients).
+
+###Web service
+
+Finally, as far as configuring Monit itself, you can enable the embedded web server to display all your system tests as a web page:
+
+    set httpd port 2812
+
+If there is no other web server running on your host, Monit can run on port 80 if you specify `port 80` in the config file.
+
+You can optionally restrict web interface access to just your IP address.
+
+    set httpd port 2812
+        allow 10.0.0.1 (your ip address)
+
+{: .note}
+>
+>If you choose to implement the web interface, be sure the port Monit uses (default 2812) is exposed to the devices on which you'll be viewing it. You may need to configure your firewall package or iptables if you have a default deny policy. See Securing Your Server - Configuring a Firewall.
+
+##Configure Monit's Checking Actions
+
+###System Values
+
+Monit can monitor server resource utilization and alert you when your server is under unusual load:
+
+    check system mail
+        if loadavg (5min) > 2.0 then alert
+        if memory usage > 85% then alert
+        if cpu usage (user) > 60% then alert
+
+Here, Monit has been instructed to alert when the load average, total system memory use or CPU usage exceeds the specified limits. You should set these limits based on your server's normal operating values.
+
+A good way to determine the alert thresholds is to set them low (you will receive frequent alerts) and then adjust them higher if alerts are more frequent than the situation requires. The actual tested values which triggered the alert will be included in the alert message, and you can use these to gauge what is a good threshold limit for your server.
+
+###Processes
+
+Most servers are running a set of critical services that are their reason for existing. If those services are not running and reachable, the server is down for all practical purposes. Monit can check on running processes and stop, start or restart them as needed.
+
+    check process apache-server with pidfile /run/apache2.pid
+        if cpu > 95% for 3 cycles then alert
+
+For the `check process` statement, Monit requires an associated .pid file. Many common Linux server programs put a `.pid` file within the `/run` directory (`/var/run` on earlier Debian versions.) You can look for the location of the `.pid` file in your program's documentation, man page, or init script. In this example, the `apache2` process uses a file named `apache2.pid` in the `/run` directory. The result of this command sequence is that Monit will alert if this Apache process starts to use too much CPU for a minimum of three cycles. With `set daemon 300` defined in the global configuration, if Apache uses more than 95% CPU for 3 x 300 seconds, or 15 minutes, then Monit will trigger.
+
+You can test more than one parameter in a single check statement. The Apache program spawns children as needed to serve requests. If a large number of requests come in and continue unabated for 25 minutes, the test added here will alert on it.
+
+    check process apache-server with pidfile /run/apache2.pid
+        if children > 255 for 5 cycles then alert
+        if cpu usage > 95% for 3 cycles then alert
+
+Monit can do more than simply check the resource utilization of a process. It supports a number of protocols for testing the actual connectivity of a service. Among them are DNS, HTTP, IMAP, SMTP, LDAP, and SSH. So, we can ask our Apache server for a response and then act on the result:
+
+    check process apache-server with pidfile /run/apache2.pid
+        start program = "systemctl start apache2" with timeout 40 seconds
+        stop program  = "systemctl stop apache2"
+        if children > 255 for 5 cycles then alert
+        if cpu usage > 95% for 3 cycles then alert
+        if failed port 80 protocol http then restart
+
+Plenty is happening in the newly added lines of this check statement, including the best feature of Monit: automated process management. In lines 2 and 3, Monit has been programmed on how to start and stop the process being checked. In line 6, Monit has been programmed to use HTTP on port 80 to send a GET request to this running instance of Apache. By default it will send a normal `GET "/"` request. If Apache returns an HTTP status code of 400 or greater, Monit will alert _and_ restart the process using the commands given.
+
+The commands shown above are systemd compatible for a distribution using systemd (for example, Debian 8). If your server instead uses SysV or Upstart (ex. Debian 7 or Ubuntu 14.04), use these instead:
+
+        start program = "service apache2 start" with timeout 40 seconds
+        stop program  = "service apache2 stop"
+
+###Filesystem
+
+Monit can check filesystem properties such as whether a file exists, if its size is larger or smaller than specified, and what permissions are assigned. Another useful application is to test the timestamp of log files that should be updating.
+
+    check file mail.log with path /var/log/mail.log
+        if timestamp > 10 minutes then alert
+
+This mail server is normally busy around the clock. If the mail.log file has not been touched for ten minutes, something is probably wrong and you should be alerted.
+
+You can also use the filesystem monitor to confirm that cron jobs have completed correctly. Add a line in your job script (that will only be reached upon success) to `touch <filename>`, then have Monit check the file's timestamp age. If it's an hourly job, use a value `> 65 minutes`. If it's an overnight job, use `> 25 hours`. The extra margin allows for some variability in job time-to-complete.
+
+So for example, consider a nightly backup script that cron can run in the wee hours. In that script should be a line that only executes after a successful backup:
+
+    touch /tmp/backup-ok
+
+Then, in `/etc/monit/monitrc` you'd have:
+
+    check file nightly-backup with path /tmp/backup-ok
+        if timestamp > 25 hours then alert
+
+If the backup does not complete, then the next morning an alert message will be waiting, and the server's Monit web page will show nightly-backup with a red status of "Timestamp failed."
+
+###Remote Hosts
+
+Perhaps you are not a system admin at all; you are a web designer who works with many client sites on different hosts. Wouldn't it be nice to proactively respond to site outages even before a client calls? It is! You can configure Monit to check all your client sites' statuses and alert you immediately if they are down:
+
+    check host web-server with address www.example.com
+        if failed port 80 protocol http with timeout 30 seconds then alert
+
+Monit can test many protocols, not just HTTP:
+
+    check host mail-server with address mail.example.com
+        if failed port 143 protocol IMAP with timeout 30 seconds then alert
+        if failed port 587 protocol SMTP with timeout 30 seconds then alert
+        if failed port 22 protocol ssh with timeout 20 seconds then alert
+
+If you have more than one server, it's a good idea to have each one monitor another. If you only run Monit on one host, and that host goes completely off-line, Monit will be unable to notify you about the problem. By running a second instance of Monit on another server, you can set up each one to alert if the other one goes off-line.
+
+Note that it is possible to change the alert recipient from the globally-defined address in the `set alert` statement to another recipient using the `noalert` keyword.
+
+    check host web-server with address www.example.com
+        if failed port 80 protocol http with timeout 30 seconds then alert
+        alert someone.else@example.com
+        noalert your.email@example.com

+ 183 - 0
docs/server/nginx.md

@@ -0,0 +1,183 @@
+[Source](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04 "Permalink to How To Install Nginx on Ubuntu 16.04")
+
+### How To Install Nginx on Ubuntu 16.04
+
+### Introduction
+
+Nginx is one of the most popular web servers in the world and is responsible for hosting some of the largest and highest-traffic sites on the internet. It is more resource-friendly than Apache in most cases and can be used as a web server or a reverse proxy.
+
+In this guide, we'll discuss how to get Nginx installed on your Ubuntu 16.04 server.
+
+## Prerequisites
+
+Before you begin this guide, you should have a regular, non-root user with `sudo` privileges configured on your server. You can learn how to configure a regular user account by following our [initial server setup guide for Ubuntu 16.04][1].
+
+When you have an account available, log in as your non-root user to begin.
+
+## Step 1: Install Nginx
+
+Nginx is available in Ubuntu's default repositories, so the installation is rather straight forward.
+
+Since this is our first interaction with the `apt` packaging system in this session, we will update our local package index so that we have access to the most recent package listings. Afterwards, we can install `nginx`:
+    
+        * sudo apt-get update
+    
+    * sudo apt-get install nginx
+    
+
+After accepting the procedure, `apt-get` will install Nginx and any required dependencies to your server.
+
+## Step 2: Adjust the Firewall
+
+Before we can test Nginx, we need to reconfigure our firewall software to allow access to the service. Nginx registers itself as a service with `ufw`, our firewall, upon installation. This makes it rather easy to allow Nginx access.
+
+We can list the applications configurations that `ufw` knows how to work with by typing:
+
+You should get a listing of the application profiles:
+    
+    
+    Output
+    
+    Available applications:
+      Nginx Full
+      Nginx HTTP
+      Nginx HTTPS
+      OpenSSH
+    
+
+As you can see, there are three profiles available for Nginx:
+
+* **Nginx Full**: This profile opens both port 80 (normal, unencrypted web traffic) and port 443 (TLS/SSL encrypted traffic)
+* **Nginx HTTP**: This profile opens only port 80 (normal, unencrypted web traffic)
+* **Nginx HTTPS**: This profile opens only port 443 (TLS/SSL encrypted traffic)
+
+It is recommended that you enable the most restrictive profile that will still allow the traffic you've configured. Since we haven't configured SSL for our server yet, in this guide, we will only need to allow traffic on port 80.
+
+You can enable this by typing:
+    
+        * sudo ufw allow 'Nginx HTTP'
+    
+
+You can verify the change by typing:
+
+You should see HTTP traffic allowed in the displayed output:
+    
+    
+    Output
+    
+    Status: active
+    
+    To                         Action      From
+    --                         ------      ----
+    OpenSSH                    ALLOW       Anywhere                  
+    Nginx HTTP                 ALLOW       Anywhere                  
+    OpenSSH (v6)               ALLOW       Anywhere (v6)             
+    Nginx HTTP (v6)            ALLOW       Anywhere (v6)
+    
+
+## Step 3: Check your Web Server
+
+At the end of the installation process, Ubuntu 16.04 starts Nginx. The web server should already be up and running.
+
+We can check with the `systemd` init system to make sure the service is running by typing:
+    
+    
+    Output
+    
+    ● nginx.service - A high performance web server and a reverse proxy server
+       Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
+       Active: active (running) since Mon 2016-04-18 16:14:00 EDT; 4min 2s ago
+     Main PID: 12857 (nginx)
+       CGroup: /system.slice/nginx.service
+               ├─12857 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
+               └─12858 nginx: worker process
+    
+
+As you can see above, the service appears to have started successfully. However, the best way to test this is to actually request a page from Nginx.
+
+You can access the default Nginx landing page to confirm that the software is running properly. You can access this through your server's domain name or IP address.
+
+If you do not have a domain name set up for your server, you can learn [how to set up a domain with DigitalOcean][2] here.
+
+If you do not want to set up a domain name for your server, you can use your server's public IP address. If you do not know your server's IP address, you can get it a few different ways from the command line.
+
+Try typing this at your server's command prompt:
+    
+        * ip addr show eth0 | grep inet | awk '{ print $2; }' | sed 's//.*$//'
+    
+
+You will get back a few lines. You can try each in your web browser to see if they work.
+
+An alternative is typing this, which should give you your public IP address as seen from another location on the internet:
+    
+        * sudo apt-get install curl
+    
+    * curl -4 icanhazip.com
+    
+
+When you have your server's IP address or domain, enter it into your browser's address bar:
+    
+    
+    http://server_domain_or_IP
+    
+
+You should see the default Nginx landing page, which should look something like this:
+
+![Nginx default page][3]
+
+This page is simply included with Nginx to show you that the server is running correctly.
+
+## Step 4: Manage the Nginx Process
+
+Now that you have your web server up and running, we can go over some basic management commands.
+
+To stop your web server, you can type:
+    
+        * sudo systemctl stop nginx
+    
+
+To start the web server when it is stopped, type:
+    
+        * sudo systemctl start nginx
+    
+
+To stop and then start the service again, type:
+    
+        * sudo systemctl restart nginx
+    
+
+If you are simply making configuration changes, Nginx can often reload without dropping connections. To do this, this command can be used:
+    
+        * sudo systemctl reload nginx
+    
+
+By default, Nginx is configured to start automatically when the server boots. If this is not what you want, you can disable this behavior by typing:
+    
+        * sudo systemctl disable nginx
+    
+
+To re-enable the service to start up at boot, you can type:
+    
+        * sudo systemctl enable nginx
+    
+
+## Step 5: Get Familiar with Important Nginx Files and Directories
+
+Now that you know how to manage the service itself, you should take a few minutes to familiarize yourself with a few important directories and files.
+
+### Content
+
+* `/var/www/html`: The actual web content, which by default only consists of the default Nginx page you saw earlier, is served out of the `/var/www/html` directory. This can be changed by altering Nginx configuration files.
+
+### Server Configuration
+
+* `/etc/nginx`: The nginx configuration directory. All of the Nginx configuration files reside here.
+* `/etc/nginx/nginx.conf`: The main Nginx configuration file. This can be modified to make changes to the Nginx global configuraiton.
+* `/etc/nginx/sites-available`: The directory where per-site "server blocks" can be stored. Nginx will not use the configuration files found in this directory unless they are linked to the `sites-enabled` directory (see below). Typically, all server block configuration is done in this directory, and then enabled by linking to the other directory.
+* `/etc/nginx/sites-enabled/`: The directory where enabled per-site "server blocks" are stored. Typically, these are created by linking to configuration files found in the `sites-available` directory.
+* `/etc/nginx/snippets`: This directory contains configuration fragments that can be included elsewhere in the Nginx configuration. Potentially repeatable configuration segments are good candidates for refactoring into snippets.
+
+### Server Logs
+
+* `/var/log/nginx/access.log`: Every request to your web server is recorded in this log file unless Nginx is configured to do otherwise.
+* `/var/log/nginx/error.log`: Any Nginx errors will be recorded in this log.

+ 1417 - 0
docs/server/ubuntu.md

@@ -0,0 +1,1417 @@
+
+
+
+
+
+
+
+
+## Basics
+***
+[(Back to Top)](#table-of-contents)
+```
+:x                  (Anytime you are in VIM, MAN page, LESS, etc, this is how you exit)
+
+whereis bash        (find absolute location of bash, or any file)
+whatis ls           (tells you about the command)
+man ls              (manual to give you a list of all command arguments for any command)
+locate crontab      (I like mlocate more)
+which python        (location of a program)
+clear               (dlears the terminal)
+date                (current datetime)
+echo                (output to terminal)
+env                 (See environment variables)
+hostname            (See your hostname)
+```
+
+## Apt
+***
+[(Back to Top)](#table-of-contents)
+Apt (Or Aptitude) is the package manager for Ubuntu to manage packages and remove them.
+
+> Tip: You can use the `-y` flag in any apt command to skip the `[Y/n]` dialog.
+
+### Apt Install
+You need super user permissions, or `sudo` before the command.
+To install packages, let's use an example such as ruby which should have a list of items.
+```
+sudo apt-get install rub<TAB>  ; Press the tab key to see a list, type :q to exit the list
+sudo apt-get install ruby2.3
+```
+
+### Apt Update
+This updates the sources list located in `/etc/apt/sources.list.d/` which is where the OS knows where to download files from. You will do this time to time if it's been a while.
+
+```
+sudo apt-get update
+```
+
+### Apt Upgrade
+This will upgrade packages that have newer versions.
+
+```
+sudo apt-get upgrade
+```
+
+### Apt Remove
+Removing a package is quite simple. However, this will not remove configuration files, so if you were to re-install it they would be preserved. You would use `apt-get purge ruby2.3*` to purge all files.
+```
+sudo apt-get remove ruby2.3
+```
+
+### Apt Lock Error
+If you get an error such as `Unable to lock the administration directory (/var/lib/dpkg/) is another process`, follow these steps:
+- Make sure you are not logged in as another user running apt
+- Delete the lock and archive file files:
+  - `sudo rm /var/lib/apt/lists/lock`
+  - `sudo rm /var/cache/apt/archives/lock`
+  - `sudo dpkg --configure -a`
+- If nothing works, attempt rebooting the server
+
+# Listing and Navigating
+***
+[(Back to Top)](#table-of-contents)
+
+```
+; Navigating
+ls                  (list files)
+ls -la              (list all files, permissions, and hidden too)
+pwd                 (print working directory)
+cd ..               (go down a directory)
+cd /                (go to lowest level)
+cd ~                (go to logged in user's home)
+cd /var/www         (go to absolute path)
+
+; Manage Files and Folders
+mkdir <dir>         (create a directory)
+rmdir <dir>         (remove an empty directory)
+rm -rf <dir>        (remove a directory with contents)
+touch <file>        (create an empty file)
+mv <file> <loc>     (move file from location to new location)
+cp <file> <loc>     (copy file from location to new location)
+mv <dir> <loc>      (move directory from location to new location)
+cp -R <dir> <loc>   (copy directory from location to new location)
+
+; Reading Files
+cat <file>          (read entire file)
+head <file>         (read top of a file)
+head <file> -n 20   (read top of file 20 lines)
+tail <file>         (read bottom of a file)
+tail <file> -n 20   (read bottom of file 20 lines)
+tail <file> -f      (stream file as it's updated, eg: an error log)
+```
+
+
+# Users
+***
+[(Back to Top)](#table-of-contents)
+
+```
+su - username       (switch users)
+sudo su             (switch to root)
+
+passwd              (change logged in users password)
+passwd username     (change another users password)
+
+useradd -m -s /bin/bash username
+usermod -a -G existing_group existing_user
+
+who                 (show all logged in users)
+whoami              (show which user you are)
+```
+
+# Groups
+***
+[(Back to Top)](#table-of-contents)
+
+Do not delete groups you don't know what they are used for, that's dangerous!
+```
+groups                      (see what groups current user belongs to)
+groupadd name               (create a group)
+groupadd -g 900 name        (create a group with custom GroupID aka gid)
+
+groupdel name               (delete a group)
+useradd <group>             (add current user to a group)
+usermod -aG <group> <user>  (append any user to an additional group)
+
+cat /etc/group              (list all groups)
+cut -d: -f1 /etc/group      (list all groups, cleaner)
+```
+
+# Permissions
+***
+[(Back to Top)](#table-of-contents)
+
+There are two ways to manage permissions, one is by text the other is by an octal value.
+
+### Easy Permissions
+```
+; Change Mode
+; Options: (O)wner (U)sers (G)roup or (A)ll
+; File:    Owner: rwx, Group: rwx, User: rwx
+; Misc:    Besides rwx there is: 
+;          s = setuid of owner for old/new files
+
+; Single File read/write permissions
+chmod g+rw file
+chmod og+rw file.txt
+
+; Change Ownership
+chown user:group files_or_folder
+chgrp group files_or_folder
+
+; Recursively:
+chown -R user:group files_or_folder
+chgrp -R group files_or_folder
+chmod -R og+rw files_or_folder
+chmod -R g+s files_or_folder
+```
+
+### Preserve Group Permissions
+A fantastic way to structure your users is within groups. A common example would be your `www-data` group.
+If I have a user `jesse`, I can add him with `sudo usermod -aG www-data jesse`. 
+
+After adding any users I would like, I want to have a folder where all the members of the `www-data` group
+can read/write a folder. If they are using git, I also want the permissions to stay the same, meaning if they
+pull the permissions will not change. 
+
+To accomplish this, here is an example:
+```
+sudo chown -R deploy:www-data /var/www
+sudo chmod -R g+rws /var/www
+```
+
+The `g+s` sets the file(s)/folder(s) a gid (`setgid`) so that new files will inherit the original group!
+
+### Octal Permissions
+You may have seen this a lot, you can use octal or decimal (begins with a 0) to do the same thing.
+```
+Permissions:
+0 = None
+1 = Execute (e)
+2 = Write (w)
+4 = Read (r)
+```
+
+- There are 3 Permission types (Read, Write, Execute), or 4 if you count "None".
+- There are 3 Sets: Owner/User/Group (In that order)
+- So if you did `chmod 700 file.txt` it would allow the user to Read, Write and Execute
+  - Because `7` is the total of `4 + 2 + 1`
+
+### Octal Examples
+```
+chmod 600 file.txt – Owner Read, Write
+chmod 660 file.txt – Owner Read, Write; User Read, Write
+chmod 770 file.txt – Owner Read, Write, Execute
+chmod 770 file.txt – Owner Read, Write, Execute; User Read, Write, Execute
+chmod 666 file.txt – All Read, Write
+chmod 777 file.txt – All Read, Write, Execute
+```
+
+# OS Details
+***
+[(Back to Top)](#table-of-contents)
+
+Get fundamental information about your OS with the following commands, you may have to run them as `sudo`, eg: `sudo lsb_release -a`.
+
+##  Operating System
+
+```
+lsb_release
+lsb_release -a
+lsb_release -as     # Short Information
+lsb_release --help
+```
+
+### CPU Info
+
+```
+nproc               # How many Processing Units
+cpuid               # Must install cpuid from terminal
+cat /proc/cpuinfo   # Lots of info
+```
+
+### Usage Info
+
+```
+free -h             # Human readable, or do --help for options
+vmstat -s
+cat /proc/meminfo   # Lots of info
+```
+
+### Disk Space
+
+```
+df
+df -B MB    (In Megabtyes, KB for Kilobytes, GB for Gigabytes)
+```
+
+### System Processes
+
+```
+top
+htop  # If you installed it
+```
+
+### IP Address
+Your IP is after `inet addr`. If you are connect via ethernet it's under `eth0 (Ethernet)` otherwise, wirelessly it is likely under `wlan0 (Wireless LAN)`.
+
+```
+ifconfig
+ip
+ip addr show
+ip addr show wlan
+ip addr show eth0
+```
+
+### GUI Processes
+
+```
+gnome-system-monitor
+```
+
+### CLI Processes
+```
+top
+htop     (My favorite, sudo apt-get install htop)
+nmon
+```
+
+# List all Keybindings
+***
+[(Back to Top)](#table-of-contents)
+
+```
+gsettings list-recursively  org.gnome.desktop.wm.keybindings | sort | more
+```
+
+### See Keypressed
+[(Back to Top)](#table-of-contents)
+
+```
+xev
+
+; Or for a lot of details:
+
+xev | grep KeyPress
+```
+
+# Kernal
+***
+[(Back to Top)](#table-of-contents)
+
+The Kernal is the lowest level item that ties everything together from hardware to software.
+Without a kernal you cannot do anything on linux.
+
+### Remove Old Kernals
+
+See What version you are currently using 
+```
+sudo uname -a
+```
+
+See all the Kernals on the OS
+```
+sudo dpkg --get-selections | grep linux  
+```
+
+The BYOBU is quite nice
+```
+sudo apt install byobu 
+sudo purge-old-kernels
+```
+
+# OS Shutdown
+***
+[(Back to Top)](#table-of-contents)
+```
+shutdown
+reboot
+shutdown -h now
+shutdown -h +10     (shutdown 10 mins)
+shutdown -r now     (reboot now)
+```
+
+# Crontab
+***
+[(Back to Top)](#table-of-contents)
+```
+crontab -e              (edit crontab for current user)
+crontab -l              (list crontab for other user)
+crontab -u jesse -l     (see crontabs for specific user)
+```
+
+# Services
+***
+[(Back to Top)](#table-of-contents)
+
+## Service Commands
+Use the service command *(Requires sudo)*
+```
+service ssh status      (service status)
+service --status-all    (all services status)
+```
+
+
+Almost every service has the following commands, some may have more like apache `graceful-restart`:
+```
+service servicename start
+service servicename stop
+service servicename restart
+service servicename status
+service servicename force-reload
+```
+
+## Autostart
+
+Add Service links:
+```
+sudo update-rc.d servicename defaults
+```
+
+Whether you get a warning if they already exist or not, enable it now:
+```
+sudo update-rc.d servicename enable
+```
+
+## Remove Autostart
+Pass the Force flag
+```
+sudo update-rc.d -f servicename remove
+```
+
+
+## Autostart Daemons
+
+There is are several startup popular daemons: 
+- CentOS uses SystemV 
+- Ubuntu 14 uses Upstart
+- Ubuntu 14.10+ uses SystemD (15, 16, 17..)
+
+Focus on **SystemD**. 
+
+## SystemD Commands
+This would only apply to Ubuntu 14.10+, otherwise you would use Upstart.
+
+```
+systemctl     <-- You'll use this more often 
+journalctl    <-- You'll use this more often
+update-rc.d   <-- You'll use this more often
+                  --------------------------
+                  Installs/Removes System-V style init script links
+                  Note: System-V Style, but it's really SystemD. (Confusing huh?)
+
+                  "NNname" is the runlevel, lower means startup sooner
+                  ----------------------------------------------------
+                  The Location is: /etc/rcrunlevel.d/NNname  
+                  The Target is:   /etc/init.d/name.
+notify 
+analyze 
+cgis 
+cgtop 
+loginctl 
+nspawn
+```
+
+# System State
+***
+[(Back to Top)](#table-of-contents)
+```
+uname -a (get linux info)
+
+top (See running processes/system status, I suggest installing `htop`)
+top -u www-data
+htop -u www-data
+
+df          (display disk space in bytes, default)
+df -h       (display disk space human readable)
+df -Th      (display disk space with partitions)
+
+free (see memory used)
+free -g (in gigabytes)
+```
+
+# Processes
+***
+[(Back to Top)](#table-of-contents)
+```
+ps -ef | more       (current running processes)
+ps -efH | more      (current running processes in a tree)
+
+ps -ef | grep vim   (find vim process id)
+kill -9 <id>        (no brackets)
+```
+
+# Bash
+***
+[(Back to Top)](#table-of-contents)
+
+Bash is my shell of choice, which is why I have a `.bashrc` file.
+
+### Bash Paths
+
+Executables and commands are automatically in the path, see your path with:
+```
+echo $PATH
+```
+
+### Add to Path
+
+```
+# I suggest editing your ~/.profile
+
+vim ~/.profile
+if [ -d "/path/to/your/bin" ] ; then
+  PATH="$PATH:/path/to/your/bin"
+fi
+```
+
+*Note: Order of Linux Reading files: ~/.bash_profile, ~/.bash_login, and ~/.profile, so don't try to use a ~/.profile variable within ~/.bash_profile*
+
+### Bash Completions
+
+The locations for bash completio0ns can be found at:
+```
+cd /usr/share/bash-completion/completions.d/
+cd /etc/bash_completions.d/
+```
+
+### Fix Broken Bash Completions
+
+```
+sudo apt-get install --reinstall bash-completion
+```
+
+### Log Script from Bash
+At the top of your file, find the executable you are using one of these, eg:
+```
+which bash     # /usr/bin/bash
+which python   # /usr/bin/python
+which php      # /usr/bin/php
+```
+
+At the top of your [shebang](https://en.wikipedia.org/wiki/Shebang_(Unix)) for the executable file add:
+
+```
+#!/bin/bash
+#!/usr/bin/php
+#!/usr/bin/python
+```
+
+make sure to `+x` it:
+```
+chmod +x app.sh
+chmod +x app.php
+chmod +x app.py
+```
+
+You can then run the script via Bash:
+```
+/scripts/app.sh >> /scripts/output.log 2>&1
+/scripts/app.php >> /scripts/output.log 2>&1
+/scripts/app.py >> /scripts/output.log 2>&1
+```
+
+You could even crontab it the same way:
+```
+*/10 * * * * app.php >> /output.log 2>&1
+*/10 * * * * app.py >> /output.log 2>&1
+```
+
+# Finding Files
+***
+[(Back to Top)](#table-of-contents)
+
+Generally the following arguments are as follows:
+- `-type f` file
+- `-type d` directory
+- `-iname` case insensistive (book.txt would the same as BOOK.TXT)
+- `*` is a wildcard to find anything, usually you put it at the start or end of a filename.
+```
+find . -name tecmint.txt
+find /home -name tecmint.txt
+find /home -iname tecmint.txt                        (case ignore)
+find / -type d -name Tecmint                         (directory)
+find . -type f -perm 0777 -print (with perms)
+find / -type f ! -perm 777 (find without)
+find . -type f -name "tecmint.txt" -exec rm -f {} \; (find and remove a file)
+find . -type f -name "*.txt" -exec rm -f {} \;       (find and remove multiple)
+find /tmp -type f -empty                             (Find empty files)
+find /tmp -type d -empty                             (find empty directories)
+find / -size +50M -size -100M (findby swize)
+```
+
+# Find in Files (GREP)
+***
+[(Back to Top)](#table-of-contents)
+
+GREP means: Global Regular Expression Pattern (or Parser)
+
+Some common GREP flags:
+- `-r` is Recursive
+- `-n` is Line Number
+- `-w` Match the whole word
+- `-l` is lowercase only
+- `-c` supresses normal output and counts number of matching lines
+
+```
+grep -rn /path - "pattern_or_string"
+
+; Output results to File
+grep -rnw /path - "pattern_or_string" > output.txt
+```
+
+Look only in certain filetypes
+```
+; notice I used a regex ^ starts with, you can use a string or regex
+grep --include=*.sh '^mysql' ./
+```
+
+More Examples:
+```
+grep "hello" file.txt (if in file)
+grep "hello" files*  (if in many files)
+grep -i "hello"  file.txt  (case insesitive)
+grep -iw "is" file.txt (get full words, case insensitive)
+grep "regex" file.txt
+```
+
+### Pipe Grep
+```
+php -i | grep ini
+```
+
+# Reading Files
+***
+[(Back to Top)](#table-of-contents)
+
+Without having to open a file you can simply read a part of it without `nano`, `pico, `vi`, or `vim`:
+```
+cat file.txt            (view file contents)
+tail file.txt           (view end of file contents)
+tail -n20 file.txt      (view top 20 lines)
+tail -f filetxt         (follow a filename keep updating)
+head file.txt           (view top of file contents)
+head -n20 file.txt      (view top 20 lines)
+```
+
+# Downloading Files
+***
+[(Back to Top)](#table-of-contents)
+
+### Using Wget
+```
+wget http://file.com/something.txt                (Download a file locally)
+wget -O newname.txt http://file.com/something.txt (Download file locally w/new name)
+```
+
+You can also use `SCP`, yet the above are easier for non-SSH connections.
+
+### Using cURL
+```
+curl -O http://file.com/something.txt               (Download a file locally)
+curl -o newname.txt http://file.com/something.txt   (Download file locally w/new name)
+curl -O http://url_1 -O http://url_2                (Download multiple files)
+```
+
+# Compressing and Uncompressing Files
+***
+[(Back to Top)](#table-of-contents)
+
+To Compress a file you can use a variety of tools. You can type `man gzip` to see the full manual and line of commands, and use `esc` + `:x` and `ENTER` to exit from the Manual (It usually uses the Vi editor).
+
+Most often in the Linux word you use and create `*.tar.gz` files, it has the most options. Whatever you prefer is up to you.
+
+What the flags often stand for:
+- `-c` is create
+- `-f` is file
+- `-k` is for Keep
+    - `gzip` & `bzip2` will remove the original file once compressed
+    -  Or they will remove the `.gz` when decompressing is done
+- `-r` is recursive (for gzip and zip)
+- `-v` is verbose (show details of what's happening)
+- `-z` is for tar to gzip as well
+- `--exclude='file'` is for tar (+gz if needed) to exclude certain files)
+
+###  Compressing Files
+Note: You can compress more than one file at a time eg: `bzip2 file1.txt file2.txt file3.txt`
+
+```
+gzip -vk file.txt                   (Creates file.txt.gz)
+bzip2 file.txt                      (Creates  file.txt.bz2)
+tar -cvf file.tar file.txt          (Creates tar)
+tar -czvf file.tar.gz file.txt      (Creates tar.gz)
+zip filename.zip file.txt           (Creates filename.zip)
+zip -r folder.zip path/to/folder    (Creates  folder.txt.bz2)
+```
+
+Include/Exclude a few files:
+```
+; Exclude certain files
+tar -czvf file.tar.gz <directory>/ --exclude='*.jpg' --exclude='bigfile.sql'
+
+; Include one file type
+tar -czvf file.tar.gz <directory>/*.sh
+
+; Include multiple files types
+tar -czvf file.tar.gz `find <directory> | grep '.sh\|.py'`
+```
+
+### Decompressing Files
+To Uncompress we use similar commands for most of them
+```
+gunzip -dvk file.txt.gz
+gzip -dvk file.txt.gz       (Same as above)
+bzip2 -d file.txt.bz2
+tar -xvf file.tar
+tar -zxvf file.tar.gz
+unzip test.zip
+```
+
+# SCP
+***
+[(Back to Top)](#table-of-contents)
+
+### Download from server to local
+```
+scp root@server.com:/path/to/file.txt file.txt
+```
+
+### Upload from local to server
+```
+scp file.txt root@server.com:/path/to/file.txt
+```
+
+# SSH
+***
+[(Back to Top)](#table-of-contents)
+
+### Connecting to a server
+```
+ssh name@server.com  (default port is 22)
+ssh name@server.com -p 8000 (connect to specific port)
+ssh name@server.com -i ~/.ssh/rsa_key.pub (connect with ssh key)
+```
+
+### .SSH Permissions
+
+These are safe permissions to use for SSH
+```
+chmod 700 ~/.ssh
+chmod 644 ~/.ssh/id_rsa.pub
+chmod 600 ~/.ssh/id_rsa
+
+# Put your pubkeys (one per line) for SSH login
+chmod 600 ~/.ssh/authorized_keys
+```
+
+
+### Using the Config
+You can also create a `~/.ssh/config` file and store entries such as:
+```
+Host aws
+Hostname ec2-50-50-130-50.compute-1.amazonaws.com
+Port 22
+Identityfile ~/.ssh/id_rsa
+User myusername
+
+Host my-vps
+Hostname 50.50.130.50
+Port 22
+User root
+```
+
+You can then simply type:
+```
+ssh aws
+ssh my-vps
+```
+
+# Firewall
+***
+[(Back to Top)](#table-of-contents)
+
+A firewall prevents unauthorized access to your machine, you should use `UFW` (Uncomplicated Firewall). You must always run this with `sudo`. If you don't have UFW installed, run:
+
+```
+sudo apt-get install ufw
+```
+
+### UFW Status
+To see the Firewall Status run one of these:
+```
+sudo ufw status
+sudo ufw status verbose
+```
+
+### UFW Enable/Disable
+```
+sudo ufw enable
+sudo ufw disable
+```
+
+### UFW Example Customization
+Please do not do this unless you know what you are doing.
+
+You could start out with blocking all incoming connections.
+```
+sudo ufw default deny incoming
+sudo ufw default allow outgoing
+```
+
+Then we allow only what we want
+```
+sudo ufw allow ssh
+sudo ufw allow http
+sudo ufw allow https
+sudo ufw allow ftp
+```
+
+These are the same as:
+```
+sudo ufw allow 22   # same as ssh
+sudo ufw allow 80   # same as http
+sudo ufw allow 443  # same as https
+```
+
+### UFW More Options
+
+If SSH was on port `3333` rather than the default `22` you would do:
+```
+sudo ufw allow 3333/tcp
+```
+
+Some more options:
+
+```
+sudo ufw allow 25 # SMTP
+sudo ufw allow 110 # POP3
+sudo ufw allow 995 # POP3S
+sudo ufw allow 143 # IMAP
+sudo ufw allow 993 # IMAPS
+sudo ufw allow 3306 # MySQL
+sudo ufw allow 5432 # Postgres
+sudo ufw allow from 192.168.255.255 # Custom IP Address
+```
+
+### UFW Deleting Rules
+Easily delete named rules
+```
+sudo ufw delete allow ssh
+```
+
+Delete rules that are numbered
+```
+sudo ufw status numbered
+sudo ufw delete [number]
+```
+
+### UFW Reset Rules
+```
+sudo ufw reset
+```
+
+# Regex
+***
+[(Back to Top)](#table-of-contents)
+
+Regex stands for Regular Expression. It's used for locating or replacing files or
+strings of text. It is used all the time. These can be used in Linux itself and programming
+languages.
+
+```
+; Symbolism
+; ------------------
+()          (captures groups)
+[]          (set)
+{}          (quantifier)
+?           (optional, matches 0 or 1 character)
+*           (matches 0 or more characters)
+.           (match any character)
++           (match one or more character)
+\           (escape character)
+!           (false, is not)
+^           (starts with)
+$           (ends with)
+|           (or statement, eg: (jesse|dan|jenkins) )
+
+; Basic Primer
+; ------------------
+\w          (word)
+\W          (non-word)
+\s          (whitespace)
+\S          (non-whitespace)
+\d          (digit)
+\D          (non-digit)
+[ab]        (character set)
+[^ab]       (negated set)
+[a-m]       (range)
+(hello)     (group)
+(hello)+    (group, more than once)
+
+; Groups
+; ------------------
+(hi)        (gets all "hi" occurances)
+(^hi)       (gets all text starting with "hi")
+(es$)       (gets all text ending with "es")
+(hi)\1      (gets the first occurance of "hi")
+
+; Flags
+; ------------------
+/i          (case insensitive)
+/g          (global)
+/m          (multiline)
+
+; Escaped Characters
+; ------------------
+; Since characters such as ".", "+", etc are actual Regex pattern makers, if you
+; need to check your content for the literal item you must escape them.
+\.          (matches . character)
+\+          (matches + character)
+\?          (matches ? character)
+\*          (matches * character)
+\^          (matches ^ character)
+\$          (matches $ character)
+\[          (matches [ character)
+\(          (matches ( character)
+
+\t          (matches tab character)
+\n          (matches newline)
+\r          (matches return carriage)
+\0          (matches NULL character)
+\\          (matches \ character)
+\/          (matches / character)
+```
+
+### Regex Examples
+```
+Put Examples here, like phones, names, etc..
+
+```
+
+# MySQL
+***
+[(Back to Top)](#table-of-contents)
+
+- `-u` is for User (default: root)
+- `-p` is for Password 
+- `-p password` is for password which skips the prompt (not recommended)
+- `-h` is for host (default: localhost)
+- `-port or -P` is for a port, default is 3306
+- `-f` will force SQL import and skips errors
+- `-v` will display verbose output
+- In the `mysql>` terminal you can get clean data by doing `\g`:
+    - `mysql> SELECT * FROM users LIMIT 10\g";`
+
+### Connecting
+```
+mysql -u root -p (username, password prompt)
+mysql -u root -p -h localhost (username, password prompt, host)
+mysql -u root -p password -h localhost -P 3306
+
+; AWS Example (AWS Defaults to 3306 as most MySQL connections do)
+mysql -u username -p password -h myinstance.123456789012.us-east-1.rds.amazonaws.com
+```
+
+### Exporting Database to SQL
+You can dump a single database easily:
+```
+mysqldump -u root -p DATABASE_NAME > file.sql
+```
+
+Or Dump all databases on your MySQL server with the `--all-databases` flag:
+```
+mysqldump -u root -p --all-databases > file.sql
+```
+
+### Importing SQL Files
+You can do this through the shell only, or MySQL, first is the shell:
+```
+mysql -u root DATABASE_NAME < path/to/file.sql
+```
+
+To continue when there are MySQL Errors use -f or --force below:
+```
+mysql -u root DATABASE_NAME < path/to/file.sql --force
+```
+
+To use a password, just pass in the -p flag and type it in after running:
+```
+mysql -u root -p DATABASE_NAME < path/to/file.sql --force
+```
+
+Second, you can do it through MySQL once you connect:
+```
+mysql> use DATABASE_NAME;
+mysql> source path/to/file.sql;
+```
+
+### Exporting Compressed Database
+This will save a lot of space in this one liner:
+```
+mysqldump -u root -p DATABASE_NAME | tar -cvzf > output.sql.tar.gz
+mysqldump -u root -p DATABASE_NAME | gzip -v > output.sql.gz
+```
+
+### Importing Compressed Database
+Here is how you can import with the one liner:
+```
+mysql -u root -p DATABASE_NAME | tar -xzOf output.sql.tar.gz
+mysql -u root -p DATABASE_NAME | gunzip < output.sql.gz
+```
+ 
+### Get Database Encoding
+```
+USE DATABASE_NAME;
+SELECT @@collation_database;
+```
+### Get Table Encoding
+```
+SELECT default_character_set_name FROM information_schema.SCHEMATA 
+WHERE schema_name = "TABLE_NAME";
+```
+
+### Get Column Encoding
+Look at the collation table. Numeric fields won't have a collation.
+```
+SHOW FULL COLUMNS FROM TABLE_NAME
+```
+
+### Fix Broken Characters
+
+First, try this query without affecting anything to see:
+```
+SELECT CONVERT(BINARY CONVERT('We’re Here!' using latin1) using utf8);
+```
+That should fix the encoding problem.
+
+To update a column:
+```
+UPDATE TABLE_NAME SET COLUMN_NAME = CONVERT(BINARY CONVERT(COLUMN_NAME using latin1) USING utf8);
+```
+
+# Git
+***
+[(Back to Top)](#table-of-contents)
+
+### Populate a Repository
+You have to first create a repostory, through BitBucket, GitHub, GitLab, etc.
+```
+git init
+touch README.md
+git remote add origin git@github.com/username/yourrepo.git
+git add .
+git commit -m "Starting with one file"
+git push origin master
+```
+### Add or Remove Files
+```
+git add file.txt
+git rm file.txt
+```
+
+### Ignoring files
+Create a `.gitignore` file, and place something like this in it:
+```
+.tmp
+.py[co]
+.cache
+.DS_Store
+```
+
+### Create a Branch
+Branches are used like when you don't want to ruin a main branch with working code.
+
+```
+git checkout -b develop
+git push origin develop
+```
+
+### Switch Branches
+```
+git checkout master
+git checkout develop
+```
+
+### Pull One File From Another Branch
+If you were on your `master` branch and only wanted to pull a single file from `develop` branch, you can do this:
+```
+; Make sure you're on the branch you want to pull into
+git checkout master
+
+; Pull a single file into master from develop
+git checkout develop -- relative/path.txt
+
+; Continue by comitting and pushing to master
+```
+
+### Create a Tag
+Tags create a snapshots of current code, you may name it as a version such as `1.0.1` and it produces a `tar.gz` and `zip` format for downloads.
+```
+git tag -a 1.0
+git tag -a 1.0 -m "Optional Message"
+git push --tags
+```
+
+### Remove a Tag
+This will remove a tag from the Git host.
+```
+git tag -d 1.0
+git push origin :refs/tags/1.0
+```
+
+### Clone a Respository
+```
+git clone git@github.com/username:your_repo.git
+```
+
+Clone into current directory
+```
+git clone git@github.com/username:your_repo.git .
+```
+### Current Status
+```
+git status
+```
+
+### Commit Log and Show
+To see log data and more details use the short or long commit ID.
+```
+git log
+git show eb7c86a5fbdc6c64df608f4c143c2718a100983b
+```
+
+### Reset Hard
+This will reset your repository to the last revision and undo everything, use with caution.
+```
+git reset --hard HEAD
+```
+
+### Prune
+Removes cached items no longer read by git
+```
+git prune
+```
+
+# Docker
+***
+[(Back to Top)](#table-of-contents)
+
+To install visit [https://docs.docker.com/engine/installation/linux/ubuntulinux/](https://docs.docker.com/engine/installation/linux/ubuntulinux/)
+- **Images**: (Blueprints of an application)
+    - **Image BASE**: No parent Image (An OS)
+    - **Image CHILD**: Builds on a Base Image (Eg: Webserver, MySQL)
+- **Containers**: Created from an IMAGE and run an application.
+- **Docker Daemon**: Background service that builds, runs, and does everything.
+- **Docker Client**: Allows us to interact with the Docker Daemon.
+- **Docker Hub**: A registry of images (Like: npmjs, pip, packagist, bower)
+
+### Docker Compose
+This is a great utility that makes managing docker easier from a `docker-compose.yml` file, you should install this after playing around with the below options. See: [https://docs.docker.com/engine/installation/linux/ubuntulinux/](https://docs.docker.com/engine/installation/linux/ubuntulinux/)
+```
+docker-compose up
+open http://localhost:3000
+```
+
+### Test Box Run
+This is a sample box to test once you installed docker
+```
+dock pull busybox
+docker images
+docker run busybox "Hi from the box"
+```
+
+### See Running Containers
+```
+docker ps (running containers)
+docker ps -a (see all containers that ran)
+```
+
+### Run Container Interactively
+This allows you to get inside the container
+```
+docker run -it busybox sh (interactive)
+```
+
+
+### Remove Container
+Removes a CONTAINER, not an IMAGE
+
+```
+docker ps -a
+docker rm <CONTAINER ID>
+```
+
+### Bulk Remove Containers
+You can remove containers based on their status in bulk, eg:
+```
+docker rm $(docker ps -a -q -f status=exited)
+docker rm $(docker ps -a -q -f status=created)
+```
+
+### Webserver Test Image
+This will download the IMAGE and run it if it doesn't exist
+```
+docker run prakhar1989/static-site
+```
+
+This doesn't expose ports for us to use, so we do the following:
+```
+docker run -d -P --name static-site prakhar1989/static-site
+```
+
+- `-d` detaches terminal so we can run commands in our terminal
+- `-P` publishes all exposed ports to random ports
+
+By doing the above command we are given random ports, eg:
+```
+  443/tcp -> 0.0.0.0:32768
+  80/tcp -> 0.0.0.0:32769
+```
+
+Your ports may be different, you can use specific ports with a lowercase `-p`:
+```
+docker run -p 8888:80 prakhar1989/static-site
+```
+
+### Stop Container
+```
+docker stop static-site
+```
+
+### Get New Docker Image
+This would be a docker BASE IMAGE
+```
+docker pull ubuntu:14.04
+```
+
+### Create Docker Image
+This is a flask Example using a Python-3 Base IMAGE
+
+- Create `requirements.txt` and just put `flask`
+- Create an `app.py`
+- Use the following sample code in `app.py`:
+
+```
+from flask import Flask
+app = Flask(__name__)
+
+@app.route('/')
+def hello_world():
+    return 'Hello, World!'
+```
+
+- Create a docker file, title it `Dockerfile`
+- Enter the following
+
+```
+FROM python:3-onbuild
+EXPOSE 5000
+CMD ["python", "./app.py"]
+```
+
+Now build the image
+
+```
+docker build -t boyus .
+docker images
+```
+
+### Remove Docker Image
+Get a list of images, then just delete by image id with `rmi` aka `remove image`:
+```
+docker images
+docker rmi <IMAGE ID>
+```
+
+
+### Pushing Images
+You need a repository at docker.io to push this, or probably some private hosting.
+```
+docker push boyus
+```
+
+
+# Installing GUI's
+***
+[(Back to Top)](#table-of-contents)
+
+Linux has a lot of GUI's and you are not limited to what you get. I'll list a few popular ones with the installation instructions in Ubuntu. You can have as many GUI options as you like, just change the default at the login screen.
+
+> Tip: After you install, logout and in the login menu or the top right you can select what GUI you want to login with. Whenever you install a new GUI you can select a Display Manager, I recommend using `lightdm`. 
+
+--
+
+### Unity
+
+[**Unity Website**](https://unity.ubuntu.com/)
+
+```
+Installed in Ubuntu 12+ by Default (`ubuntu-desktop`)
+```
+
+### XUbuntu
+
+[**XUbuntu Website**](https://xubuntu.org/)
+
+```
+; Install:
+sudo apt-get install xubuntu-desktop
+
+; Remove: 
+sudo apt-get remove xubuntu-desktop
+```
+
+### Cinnamon (Linux Mint)
+
+[**Linux Mint Website**](https://www.linuxmint.com/)
+
+```
+; Install:
+sudo add-apt-repository ppa:moorkai/cinnamon
+sudo apt-get update && sudo apt-get install cinnamon
+    
+; Remove
+sudo ppa-purge ppa:moorkai/cinnamon
+```
+
+
+### GNOME
+
+[**GNOME Website**](https://www.gnome.org)
+
+This has been one of the all time most popular GUI's for Linux ever made, in particular the `gnome-classic`.
+
+```
+; Install:
+sudo apt-get install ubuntu-gnome-desktop    (For legacy gnome use you can use gnome-shell, this install both)
+
+; Remove: 
+sudo apt-get remove ubuntu-gnome-desktop     (Removes gnome-shell as well)
+```
+
+> Gnome3 has been my favorite GUI due to how I can customize it. However, for unknown reasons I have issues running only Gnome3 in VMWare Workstation 11. It works fine as a complete install. 
+ 
+Noteworthy: Visit [Gnome Shell Extensions](https://extensions.gnome.org/) to customize anything you want. Make sure to use Firefox.
+
+
+### KDE
+
+[**KDE Website**](https://www.kde.org/)
+
+This is a very popular GUI for people that are used to Windows Desktops.
+
+```
+; Install:
+sudo add-apt-repository ppa:kubuntu-ppa/backports
+sudo apt-get update && sudo apt-get dist-upgrade
+sudo apt-get install kubuntu-desktop
+    
+; Remove: 
+sudo apt-get remove kubuntu-desktop
+```
+
+### LXQT
+
+[**LXQT Website**](http://lxqt.org/)
+
+```
+; Install:
+sudo apt-get install lxqt
+; Remove: 
+sudo apt-get remove lxqt
+```
+
+### Pantheon (ElementaryOS)
+
+[**Elementary OS Website**](https://elementary.io/) 
+
+For the best stability I use Elementary OS which is based off of Ubuntu.
+
+```
+; Install:
+sudo add-apt-repository ppa:elementary-os/stable
+sudo apt-get update
+sudo apt-get install elementary-desktop
+
+; Remove: 
+sudo apt-get remove elementary-desktop
+```
+
+### XFCE
+
+[**XFCE Website**](http://www.xfce.org/)
+
+```
+; Install:
+sudo apt-get install xfce4
+
+; Remove: 
+sudo apt-get remove xfce4
+```
+
+# Troubleshooting
+***
+[(Back to Top)](#table-of-contents)
+
+Sometimes the system has problems, seldmoly but I'll list things that helped me fix rare occasions.
+
+### Ubuntu Infinite Login
+When you try to login to Ubuntu and it relogs you back into the login screen, this is an infinite loop. The only way I was able to fix it depsite all the guides was combining a few of these together for Ubuntu 16.04. 
+
+If you are using Gnome as I do, I would jump down to the **Apt Auto Remove Problem** in the list.
+
+The first step is to login to a terminal.
+
+```
+CTRL + ALT + F1  (Or F3)
+```
+
+Next, Login as your user who must be able to run `sudo`.
+
+- **Temp Folder Permissions**
+  - `ls -ld /tmp` should have these permission exactly as: `drwxrwxrwt`
+  - The user:group must be `root:root` on `/tmp`.
+  - To Fix: `sudo chmod a+wt /tmp`
+- **Xauthority Ownership**
+  - `ls -lta | grep .Xa` should be owned by your user, for example `jesse jesse`
+   - If it is `root root` or anything than your user/group it's wrong.
+   - To Fix: `sudo chown jesse:jesse .Xauthority`
+- **Xsession Errors**
+  - This is just to make sure there are no syntax errors for your reference:
+    - To Check: `cat ~/.xsession-errors`
+    - You don't need to do anything if there are syntax errors, we will move the file.
+- **Try Moving XAuthority**
+  - Sometimes it's as easy to moving Xauthority so a new is generated at login.
+  - To Fix: `sudo ~/.Xauthority ~/.Xauthority.bkup`
+- **Try Reconfiguring LightDM**
+  - Fix: `dpkg-reconfigure lightdm`, then select lightdm in the menu
+  - Lastly restart lightdm: `sudo service lightdm restart`
+- **Apt Auto Remove Problem**
+  - I read that it's possible `apt-autoremove` may accidentally remove `xubuntu-desktop`, `ubuntu-desktop` and LightDM reports no errors.
+    - The `ubuntu-desktop` will load the Unity interface
+    - The `xubuntu-desktop` will load a different interface I'm not familiar with.
+    - To Fix: `sudo apt-get install xubuntu-desktop ubuntu-desktop`
+  - **If you are using Gnome**, try following the post at [OMGUbuntu](http://www.omgubuntu.co.uk/2016/05/install-gnome-3-20-ubuntu-16-04-lts)
+    - After the Above Try: `sudo apt-get autoremove gnome-software && sudo apt-get install gnome-software`
+    - I was able to get Gnome-Classic working but not Gnome.
+- **How to Ensure it Works**
+  - You might be able to login after one of the steps above if you don't reboot. However, to be certain, you want to reboot to ensure it is fixed, otherwise you'll be doing this over and over.    
+    
+# Linux Facts
+***
+[(Back to Top)](#table-of-contents)
+
+- **Linux Versions** refers to The Kernel which ties the OS together.
+- **Linux Distributions** are the named Linux "Flavors" below.
+  - **Debian**
+    - **Linux Mint** (LMDE) forked from Debian
+    - **Ubuntu** forked from Debian
+      - **Elementary OS** forked from Ubuntu
+      - **Linux Mint** forked from Ubuntu
+      - **Kubuntu** forked from Ubuntu
+  - **Fedora**
+    - **Red Hat Enterprise Linux** (RHEL) forked from Fedora
+      - **CentOS** forked from RHEL (Community Edition of RHEL)
+  - **Gentoo**
+- ..And many others. Debian -> Ubuntu has been the most popular.

+ 16 - 0
docs/server/ufw.md

@@ -0,0 +1,16 @@
+
+
+#### Install
+
+      sudo apt-get install ufw
+
+      //commands
+      sudo ufw allow 22
+      sudo ufw deny 111
+
+      sudo ufw allow from 123.45.67.89
+      sudo ufw allow from 123.45.67.89 to any port 22 proto tcp
+
+      sudo ufw delete allow 80
+
+      sudo ufw enable

+ 64 - 0
docs/waf/nodejs.md

@@ -0,0 +1,64 @@
+
+
+* [https://nodejs.org](https://nodejs.org)
+* [https://github.com/sindresorhus/awesome-nodejs/blob/master/readme.md](https://github.com/sindresorhus/awesome-nodejs/blob/master/readme.md)
+
+* [npm](/docs/waf/npm)
+* [awesome-nodejs](https://github.com/sindresorhus/awesome-nodejs)
+* [https://github.com/nodesource/distributions](https://github.com/nodesource/distributions)
+* [https://github.com/creationix/nvm](https://github.com/creationix/nvm)
+* [https://github.com/nodesource](https://github.com/nodesource)
+
+
+
+
+##### setup
+
+```
+///nvm localhost
+nvm ls
+nvm ls-remote
+nvm use v6.10.3
+nvm run node --version
+nvm uninstall v0.1.0
+
+alias               deactivate          install             ls                  run                 unload
+clear-cache         exec                list                ls-remote           unalias             use
+current             help                list-remote         reinstall-packages  uninstall           version
+
+///package remote
+curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
+sudo apt-get install -y nodejs
+
+
+```
+
+
+##### Calling `nvm use` automatically in a directory with a `.nvmrc` file
+
+Put this into your `$HOME/.zshrc` to call `nvm use` automatically whenever you enter a directory that contains an
+`.nvmrc` file with a string telling nvm which node to `use`:
+
+```zsh
+# place this after nvm initialization!
+autoload -U add-zsh-hook
+load-nvmrc() {
+  local node_version="$(nvm version)"
+  local nvmrc_path="$(nvm_find_nvmrc)"
+
+  if [ -n "$nvmrc_path" ]; then
+    local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")")
+
+    if [ "$nvmrc_node_version" = "N/A" ]; then
+      nvm install
+    elif [ "$nvmrc_node_version" != "$node_version" ]; then
+      nvm use
+    fi
+  elif [ "$node_version" != "$(nvm version default)" ]; then
+    echo "Reverting to nvm default version"
+    nvm use default
+  fi
+}
+add-zsh-hook chpwd load-nvmrc
+load-nvmrc
+```

+ 3511 - 0
docs/waf/npm.md

@@ -0,0 +1,3511 @@
+# npm
+
+- [https://www.npmjs.com/~windhamdavid](https://www.npmjs.com/~windhamdavid)
+- [https://www.npmjs.com/](https://www.npmjs.com/)
+- [https://docs.npmjs.com/](https://docs.npmjs.com/)
+
+
+##### update
+
+
+
+```
+//update to latest
+npm install npm@latest -g
+
+//Listing globally installed NPM packages and version
+npm list -g --depth=0
+
+//find outdated packages
+npm outdated
+
+//use npm-check
+npm-check
+
+```
+
+January 2020:
+```sh
+david@macs:~/sites/til(master⚡) » npm list -g
+/Users/david/.nvm/versions/node/v10.16.3/lib
+├─┬ gitbook-cli@2.3.2
+│ ├── bash-color@0.0.4
+│ ├── commander@2.11.0
+│ ├─┬ fs-extra@3.0.1
+│ │ ├── graceful-fs@4.2.3
+│ │ ├─┬ jsonfile@3.0.1
+│ │ │ └── graceful-fs@4.2.3 deduped
+│ │ └── universalify@0.1.2
+│ ├── lodash@4.17.4
+│ ├─┬ npm@5.1.0
+│ │ ├── abbrev@1.1.0
+│ │ ├── ansi-regex@3.0.0
+│ │ ├── ansicolors@0.3.2
+│ │ ├── ansistyles@0.1.3
+│ │ ├── aproba@1.1.2
+│ │ ├── archy@1.0.0
+│ │ ├── bluebird@3.5.0
+│ │ ├─┬ cacache@9.2.9
+│ │ │ ├── bluebird@3.5.0 deduped
+│ │ │ ├── chownr@1.0.1 deduped
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├─┬ lru-cache@4.1.1
+│ │ │ │ ├── pseudomap@1.0.2
+│ │ │ │ └── yallist@2.1.2
+│ │ │ ├── mississippi@1.3.0 deduped
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├── move-concurrently@1.0.1 deduped
+│ │ │ ├── promise-inflight@1.0.1 deduped
+│ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ ├── ssri@4.1.6 deduped
+│ │ │ ├── unique-filename@1.1.0 deduped
+│ │ │ └── y18n@3.2.1
+│ │ ├── call-limit@1.1.0
+│ │ ├── chownr@1.0.1
+│ │ ├─┬ cmd-shim@2.0.2
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ └── mkdirp@0.5.1 deduped
+│ │ ├─┬ columnify@1.5.4
+│ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ └── ansi-regex@2.1.1
+│ │ │ └─┬ wcwidth@1.0.1
+│ │ │   └─┬ defaults@1.0.3
+│ │ │     └── clone@1.0.2
+│ │ ├─┬ config-chain@1.1.11
+│ │ │ ├── ini@1.3.4 deduped
+│ │ │ └── proto-list@1.2.4
+│ │ ├── debuglog@1.0.1
+│ │ ├── detect-indent@5.0.0
+│ │ ├─┬ dezalgo@1.0.3
+│ │ │ ├── asap@2.0.5
+│ │ │ └── wrappy@1.0.2 deduped
+│ │ ├── editor@1.0.0
+│ │ ├─┬ fs-vacuum@1.2.10
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── path-is-inside@1.0.2 deduped
+│ │ │ └── rimraf@2.6.1 deduped
+│ │ ├─┬ fs-write-stream-atomic@1.0.10
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── iferr@0.1.5 deduped
+│ │ │ ├── imurmurhash@0.1.4 deduped
+│ │ │ └── readable-stream@2.3.2 deduped
+│ │ ├─┬ fstream@1.0.11
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── inherits@2.0.3 deduped
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ └── rimraf@2.6.1 deduped
+│ │ ├─┬ fstream-npm@1.2.1
+│ │ │ ├─┬ fstream-ignore@1.0.5
+│ │ │ │ ├── fstream@1.0.11 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └─┬ minimatch@3.0.4
+│ │ │ │   └─┬ brace-expansion@1.1.8
+│ │ │ │     ├── balanced-match@1.0.0
+│ │ │ │     └── concat-map@0.0.1
+│ │ │ └── inherits@2.0.3 deduped
+│ │ ├─┬ glob@7.1.2
+│ │ │ ├── fs.realpath@1.0.0
+│ │ │ ├── inflight@1.0.6 deduped
+│ │ │ ├── inherits@2.0.3 deduped
+│ │ │ ├─┬ minimatch@3.0.4
+│ │ │ │ └─┬ brace-expansion@1.1.8
+│ │ │ │   ├── balanced-match@1.0.0
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ └── path-is-absolute@1.0.1
+│ │ ├── graceful-fs@4.1.11
+│ │ ├── has-unicode@2.0.1
+│ │ ├── hosted-git-info@2.5.0
+│ │ ├── iferr@0.1.5
+│ │ ├── imurmurhash@0.1.4
+│ │ ├─┬ inflight@1.0.6
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ └── wrappy@1.0.2 deduped
+│ │ ├── inherits@2.0.3
+│ │ ├── ini@1.3.4
+│ │ ├─┬ init-package-json@1.10.1
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ ├─┬ promzard@0.3.0
+│ │ │ │ └── read@1.0.7 deduped
+│ │ │ ├── read@1.0.7 deduped
+│ │ │ ├── read-package-json@2.0.9 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── validate-npm-package-license@3.0.1 deduped
+│ │ │ └── validate-npm-package-name@3.0.0 deduped
+│ │ ├─┬ JSONStream@1.3.1
+│ │ │ ├── jsonparse@1.3.1
+│ │ │ └── through@2.3.8
+│ │ ├── lazy-property@1.0.0
+│ │ ├── lockfile@1.0.3
+│ │ ├── lodash._baseindexof@3.1.0
+│ │ ├─┬ lodash._baseuniq@4.6.0
+│ │ │ ├── lodash._createset@4.0.3
+│ │ │ └── lodash._root@3.0.1
+│ │ ├── lodash._bindcallback@3.0.1
+│ │ ├── lodash._cacheindexof@3.0.2
+│ │ ├─┬ lodash._createcache@3.1.2
+│ │ │ └── lodash._getnative@3.9.1 deduped
+│ │ ├── lodash._getnative@3.9.1
+│ │ ├── lodash.clonedeep@4.5.0
+│ │ ├── lodash.restparam@3.6.1
+│ │ ├── lodash.union@4.6.0
+│ │ ├── lodash.uniq@4.5.0
+│ │ ├── lodash.without@4.4.0
+│ │ ├─┬ lru-cache@4.1.1
+│ │ │ ├── pseudomap@1.0.2
+│ │ │ └── yallist@2.1.2
+│ │ ├─┬ mississippi@1.3.0
+│ │ │ ├─┬ concat-stream@1.6.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── typedarray@0.0.6
+│ │ │ ├─┬ duplexify@3.5.0
+│ │ │ │ ├─┬ end-of-stream@1.0.0
+│ │ │ │ │ └─┬ once@1.3.3
+│ │ │ │ │   └── wrappy@1.0.2 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── stream-shift@1.0.0
+│ │ │ ├─┬ end-of-stream@1.4.0
+│ │ │ │ └── once@1.4.0 deduped
+│ │ │ ├─┬ flush-write-stream@1.0.2
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├─┬ from2@2.3.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├─┬ parallel-transform@1.1.0
+│ │ │ │ ├── cyclist@0.2.2
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├─┬ pump@1.0.2
+│ │ │ │ ├── end-of-stream@1.4.0 deduped
+│ │ │ │ └── once@1.4.0 deduped
+│ │ │ ├─┬ pumpify@1.3.5
+│ │ │ │ ├── duplexify@3.5.0 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── pump@1.0.2 deduped
+│ │ │ ├─┬ stream-each@1.2.0
+│ │ │ │ ├── end-of-stream@1.4.0 deduped
+│ │ │ │ └── stream-shift@1.0.0
+│ │ │ └─┬ through2@2.0.3
+│ │ │   ├── readable-stream@2.3.2 deduped
+│ │ │   └── xtend@4.0.1
+│ │ ├─┬ mkdirp@0.5.1
+│ │ │ └── minimist@0.0.8
+│ │ ├─┬ move-concurrently@1.0.1
+│ │ │ ├── aproba@1.1.2 deduped
+│ │ │ ├─┬ copy-concurrently@1.0.3
+│ │ │ │ ├── aproba@1.1.2 deduped
+│ │ │ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ │ │ ├── iferr@0.1.5 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ │ └── run-queue@1.0.3 deduped
+│ │ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ └─┬ run-queue@1.0.3
+│ │ │   └── aproba@1.1.2 deduped
+│ │ ├─┬ node-gyp@3.6.2
+│ │ │ ├── fstream@1.0.11 deduped
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├─┬ minimatch@3.0.4
+│ │ │ │ └─┬ brace-expansion@1.1.8
+│ │ │ │   ├── balanced-match@1.0.0
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├─┬ nopt@3.0.6
+│ │ │ │ └── abbrev@1.1.0 deduped
+│ │ │ ├── npmlog@4.1.2 deduped
+│ │ │ ├── osenv@0.1.4 deduped
+│ │ │ ├── request@2.81.0 deduped
+│ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── tar@2.2.1 deduped
+│ │ │ └── which@1.2.14 deduped
+│ │ ├─┬ nopt@4.0.1
+│ │ │ ├── abbrev@1.1.0 deduped
+│ │ │ └── osenv@0.1.4 deduped
+│ │ ├─┬ normalize-package-data@2.4.0
+│ │ │ ├── hosted-git-info@2.5.0 deduped
+│ │ │ ├─┬ is-builtin-module@1.0.0
+│ │ │ │ └── builtin-modules@1.1.1
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ └── validate-npm-package-license@3.0.1 deduped
+│ │ ├── npm-cache-filename@1.0.2
+│ │ ├─┬ npm-install-checks@3.0.0
+│ │ │ └── semver@5.3.0 deduped
+│ │ ├─┬ npm-package-arg@5.1.2
+│ │ │ ├── hosted-git-info@2.5.0 deduped
+│ │ │ ├── osenv@0.1.4 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ └── validate-npm-package-name@3.0.0 deduped
+│ │ ├─┬ npm-registry-client@8.4.0
+│ │ │ ├─┬ concat-stream@1.6.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── typedarray@0.0.6
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── normalize-package-data@2.4.0 deduped
+│ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ ├── npmlog@4.1.2 deduped
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ ├── request@2.81.0 deduped
+│ │ │ ├── retry@0.10.1 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── slide@1.1.6 deduped
+│ │ │ └── ssri@4.1.6 deduped
+│ │ ├── npm-user-validate@1.0.0
+│ │ ├─┬ npmlog@4.1.2
+│ │ │ ├─┬ are-we-there-yet@1.1.4
+│ │ │ │ ├── delegates@1.0.0
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├── console-control-strings@1.1.0
+│ │ │ ├─┬ gauge@2.7.4
+│ │ │ │ ├── aproba@1.1.2 deduped
+│ │ │ │ ├── console-control-strings@1.1.0 deduped
+│ │ │ │ ├── has-unicode@2.0.1 deduped
+│ │ │ │ ├── object-assign@4.1.1
+│ │ │ │ ├── signal-exit@3.0.2
+│ │ │ │ ├─┬ string-width@1.0.2
+│ │ │ │ │ ├── code-point-at@1.1.0
+│ │ │ │ │ ├─┬ is-fullwidth-code-point@1.0.0
+│ │ │ │ │ │ └── number-is-nan@1.0.1
+│ │ │ │ │ └── strip-ansi@3.0.1 deduped
+│ │ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ │ └── ansi-regex@2.1.1
+│ │ │ │ └─┬ wide-align@1.1.2
+│ │ │ │   └── string-width@1.0.2 deduped
+│ │ │ └── set-blocking@2.0.0
+│ │ ├─┬ once@1.4.0
+│ │ │ └── wrappy@1.0.2 deduped
+│ │ ├── opener@1.4.3
+│ │ ├─┬ osenv@0.1.4
+│ │ │ ├── os-homedir@1.0.2
+│ │ │ └── os-tmpdir@1.0.2
+│ │ ├─┬ pacote@2.7.38
+│ │ │ ├── bluebird@3.5.0 deduped
+│ │ │ ├── cacache@9.2.9 deduped
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── lru-cache@4.1.1 deduped
+│ │ │ ├─┬ make-fetch-happen@2.4.13
+│ │ │ │ ├─┬ agentkeepalive@3.3.0
+│ │ │ │ │ └─┬ humanize-ms@1.2.1
+│ │ │ │ │   └── ms@2.0.0
+│ │ │ │ ├── cacache@9.2.9 deduped
+│ │ │ │ ├── http-cache-semantics@3.7.3
+│ │ │ │ ├─┬ http-proxy-agent@2.0.0
+│ │ │ │ │ ├─┬ agent-base@4.1.0
+│ │ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │ │   └── es6-promise@4.1.1
+│ │ │ │ │ └─┬ debug@2.6.8
+│ │ │ │ │   └── ms@2.0.0
+│ │ │ │ ├─┬ https-proxy-agent@2.0.0
+│ │ │ │ │ ├─┬ agent-base@4.1.0
+│ │ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │ │   └── es6-promise@4.1.1
+│ │ │ │ │ └─┬ debug@2.6.8
+│ │ │ │ │   └── ms@2.0.0
+│ │ │ │ ├── lru-cache@4.1.1 deduped
+│ │ │ │ ├── mississippi@1.3.0 deduped
+│ │ │ │ ├─┬ node-fetch-npm@2.0.1
+│ │ │ │ │ ├─┬ encoding@0.1.12
+│ │ │ │ │ │ └── iconv-lite@0.4.18
+│ │ │ │ │ ├─┬ json-parse-helpfulerror@1.0.3
+│ │ │ │ │ │ └── jju@1.3.0
+│ │ │ │ │ └── safe-buffer@5.1.1 deduped
+│ │ │ │ ├── promise-retry@1.1.1 deduped
+│ │ │ │ ├─┬ socks-proxy-agent@3.0.0
+│ │ │ │ │ ├─┬ agent-base@4.1.0
+│ │ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │ │   └── es6-promise@4.1.1
+│ │ │ │ │ └─┬ socks@1.1.10
+│ │ │ │ │   ├── ip@1.1.5
+│ │ │ │ │   └── smart-buffer@1.1.15
+│ │ │ │ └── ssri@4.1.6 deduped
+│ │ │ ├─┬ minimatch@3.0.4
+│ │ │ │ └─┬ brace-expansion@1.1.8
+│ │ │ │   ├── balanced-match@1.0.0
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├── mississippi@1.3.0 deduped
+│ │ │ ├── normalize-package-data@2.4.0 deduped
+│ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ ├─┬ npm-pick-manifest@1.0.4
+│ │ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ │ └── semver@5.3.0 deduped
+│ │ │ ├── osenv@0.1.4 deduped
+│ │ │ ├── promise-inflight@1.0.1 deduped
+│ │ │ ├─┬ promise-retry@1.1.1
+│ │ │ │ ├── err-code@1.1.2
+│ │ │ │ └── retry@0.10.1 deduped
+│ │ │ ├─┬ protoduck@4.0.0
+│ │ │ │ └── genfun@4.0.1
+│ │ │ ├── safe-buffer@5.1.1 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── ssri@4.1.6 deduped
+│ │ │ ├─┬ tar-fs@1.15.3
+│ │ │ │ ├── chownr@1.0.1 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ ├─┬ pump@1.0.2
+│ │ │ │ │ ├─┬ end-of-stream@1.4.0
+│ │ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ └── tar-stream@1.5.4 deduped
+│ │ │ ├─┬ tar-stream@1.5.4
+│ │ │ │ ├─┬ bl@1.2.1
+│ │ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ │ ├─┬ end-of-stream@1.4.0
+│ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── xtend@4.0.1
+│ │ │ ├── unique-filename@1.1.0 deduped
+│ │ │ └── which@1.2.14 deduped
+│ │ ├── path-is-inside@1.0.2
+│ │ ├── promise-inflight@1.0.1
+│ │ ├─┬ read@1.0.7
+│ │ │ └── mute-stream@0.0.7
+│ │ ├─┬ read-cmd-shim@1.0.1
+│ │ │ └── graceful-fs@4.1.11 deduped
+│ │ ├─┬ read-installed@4.0.3
+│ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── read-package-json@2.0.9 deduped
+│ │ │ ├── readdir-scoped-modules@1.0.2 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── slide@1.1.6 deduped
+│ │ │ └── util-extend@1.0.3
+│ │ ├─┬ read-package-json@2.0.9
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├─┬ json-parse-helpfulerror@1.0.3
+│ │ │ │ └── jju@1.3.0
+│ │ │ └── normalize-package-data@2.4.0 deduped
+│ │ ├─┬ read-package-tree@5.1.6
+│ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ ├── read-package-json@2.0.9 deduped
+│ │ │ └── readdir-scoped-modules@1.0.2 deduped
+│ │ ├─┬ readable-stream@2.3.2
+│ │ │ ├── core-util-is@1.0.2
+│ │ │ ├── inherits@2.0.3 deduped
+│ │ │ ├── isarray@1.0.0
+│ │ │ ├── process-nextick-args@1.0.7
+│ │ │ ├── safe-buffer@5.1.1 deduped
+│ │ │ ├─┬ string_decoder@1.0.3
+│ │ │ │ └── safe-buffer@5.1.1 deduped
+│ │ │ └── util-deprecate@1.0.2
+│ │ ├─┬ readdir-scoped-modules@1.0.2
+│ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ └── once@1.4.0 deduped
+│ │ ├─┬ request@2.81.0
+│ │ │ ├── aws-sign2@0.6.0
+│ │ │ ├── aws4@1.6.0
+│ │ │ ├── caseless@0.12.0
+│ │ │ ├─┬ combined-stream@1.0.5
+│ │ │ │ └── delayed-stream@1.0.0
+│ │ │ ├── extend@3.0.1
+│ │ │ ├── forever-agent@0.6.1
+│ │ │ ├─┬ form-data@2.1.4
+│ │ │ │ ├── asynckit@0.4.0
+│ │ │ │ ├── combined-stream@1.0.5 deduped
+│ │ │ │ └── mime-types@2.1.15 deduped
+│ │ │ ├─┬ har-validator@4.2.1
+│ │ │ │ ├─┬ ajv@4.11.8
+│ │ │ │ │ ├── co@4.6.0
+│ │ │ │ │ └─┬ json-stable-stringify@1.0.1
+│ │ │ │ │   └── jsonify@0.0.0
+│ │ │ │ └── har-schema@1.0.5
+│ │ │ ├─┬ hawk@3.1.3
+│ │ │ │ ├─┬ boom@2.10.1
+│ │ │ │ │ └── hoek@2.16.3 deduped
+│ │ │ │ ├─┬ cryptiles@2.0.5
+│ │ │ │ │ └── boom@2.10.1 deduped
+│ │ │ │ ├── hoek@2.16.3
+│ │ │ │ └─┬ sntp@1.0.9
+│ │ │ │   └── hoek@2.16.3 deduped
+│ │ │ ├─┬ http-signature@1.1.1
+│ │ │ │ ├── assert-plus@0.2.0
+│ │ │ │ ├─┬ jsprim@1.4.0
+│ │ │ │ │ ├── assert-plus@1.0.0
+│ │ │ │ │ ├── extsprintf@1.0.2
+│ │ │ │ │ ├── json-schema@0.2.3
+│ │ │ │ │ └─┬ verror@1.3.6
+│ │ │ │ │   └── extsprintf@1.0.2 deduped
+│ │ │ │ └─┬ sshpk@1.13.1
+│ │ │ │   ├── asn1@0.2.3
+│ │ │ │   ├── assert-plus@1.0.0
+│ │ │ │   ├─┬ bcrypt-pbkdf@1.0.1
+│ │ │ │   │ └── tweetnacl@0.14.5 deduped
+│ │ │ │   ├─┬ dashdash@1.14.1
+│ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │   ├─┬ ecc-jsbn@0.1.1
+│ │ │ │   │ └── jsbn@0.1.1 deduped
+│ │ │ │   ├─┬ getpass@0.1.7
+│ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │   ├── jsbn@0.1.1
+│ │ │ │   └── tweetnacl@0.14.5
+│ │ │ ├── is-typedarray@1.0.0
+│ │ │ ├── isstream@0.1.2
+│ │ │ ├── json-stringify-safe@5.0.1
+│ │ │ ├─┬ mime-types@2.1.15
+│ │ │ │ └── mime-db@1.27.0
+│ │ │ ├── oauth-sign@0.8.2
+│ │ │ ├── performance-now@0.2.0
+│ │ │ ├── qs@6.4.0
+│ │ │ ├── safe-buffer@5.1.1 deduped
+│ │ │ ├── stringstream@0.0.5
+│ │ │ ├─┬ tough-cookie@2.3.2
+│ │ │ │ └── punycode@1.4.1
+│ │ │ ├─┬ tunnel-agent@0.6.0
+│ │ │ │ └── safe-buffer@5.1.1 deduped
+│ │ │ └── uuid@3.1.0 deduped
+│ │ ├── retry@0.10.1
+│ │ ├─┬ rimraf@2.6.1
+│ │ │ └── glob@7.1.2 deduped
+│ │ ├── safe-buffer@5.1.1
+│ │ ├── semver@5.3.0
+│ │ ├─┬ sha@2.0.1
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ └── readable-stream@2.3.2 deduped
+│ │ ├── slide@1.1.6
+│ │ ├── sorted-object@2.0.1
+│ │ ├─┬ sorted-union-stream@2.1.3
+│ │ │ ├─┬ from2@1.3.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └─┬ readable-stream@1.1.14
+│ │ │ │   ├── core-util-is@1.0.2
+│ │ │ │   ├── inherits@2.0.3 deduped
+│ │ │ │   ├── isarray@0.0.1
+│ │ │ │   └── string_decoder@0.10.31
+│ │ │ └─┬ stream-iterate@1.2.0
+│ │ │   ├── readable-stream@2.3.2 deduped
+│ │ │   └── stream-shift@1.0.0
+│ │ ├─┬ ssri@4.1.6
+│ │ │ └── safe-buffer@5.1.1 deduped
+│ │ ├─┬ strip-ansi@4.0.0
+│ │ │ └── ansi-regex@3.0.0
+│ │ ├─┬ tar@2.2.1
+│ │ │ ├─┬ block-stream@0.0.9
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── fstream@1.0.11 deduped
+│ │ │ └── inherits@2.0.3 deduped
+│ │ ├── text-table@0.2.0
+│ │ ├── uid-number@0.0.6
+│ │ ├── umask@1.1.0
+│ │ ├─┬ unique-filename@1.1.0
+│ │ │ └─┬ unique-slug@2.0.0
+│ │ │   └── imurmurhash@0.1.4 deduped
+│ │ ├── unpipe@1.0.0
+│ │ ├─┬ update-notifier@2.2.0
+│ │ │ ├─┬ boxen@1.1.0
+│ │ │ │ ├─┬ ansi-align@2.0.0
+│ │ │ │ │ └── string-width@2.1.0 deduped
+│ │ │ │ ├── camelcase@4.1.0
+│ │ │ │ ├── chalk@1.1.3 deduped
+│ │ │ │ ├── cli-boxes@1.0.0
+│ │ │ │ ├─┬ string-width@2.1.0
+│ │ │ │ │ ├── is-fullwidth-code-point@2.0.0
+│ │ │ │ │ └─┬ strip-ansi@4.0.0
+│ │ │ │ │   └── ansi-regex@3.0.0 deduped
+│ │ │ │ ├─┬ term-size@0.1.1
+│ │ │ │ │ └─┬ execa@0.4.0
+│ │ │ │ │   ├─┬ cross-spawn-async@2.2.5
+│ │ │ │ │   │ ├── lru-cache@4.1.1 deduped
+│ │ │ │ │   │ └── which@1.2.14 deduped
+│ │ │ │ │   ├── is-stream@1.1.0
+│ │ │ │ │   ├─┬ npm-run-path@1.0.0
+│ │ │ │ │   │ └── path-key@1.0.0 deduped
+│ │ │ │ │   ├── object-assign@4.1.1
+│ │ │ │ │   ├── path-key@1.0.0
+│ │ │ │ │   └── strip-eof@1.0.0
+│ │ │ │ └─┬ widest-line@1.0.0
+│ │ │ │   └─┬ string-width@1.0.2
+│ │ │ │     ├── code-point-at@1.1.0
+│ │ │ │     ├─┬ is-fullwidth-code-point@1.0.0
+│ │ │ │     │ └── number-is-nan@1.0.1
+│ │ │ │     └─┬ strip-ansi@3.0.1
+│ │ │ │       └── ansi-regex@2.1.1
+│ │ │ ├─┬ chalk@1.1.3
+│ │ │ │ ├── ansi-styles@2.2.1
+│ │ │ │ ├── escape-string-regexp@1.0.5
+│ │ │ │ ├─┬ has-ansi@2.0.0
+│ │ │ │ │ └── ansi-regex@2.1.1
+│ │ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ │ └── ansi-regex@2.1.1
+│ │ │ │ └── supports-color@2.0.0
+│ │ │ ├─┬ configstore@3.1.0
+│ │ │ │ ├─┬ dot-prop@4.1.1
+│ │ │ │ │ └── is-obj@1.0.1
+│ │ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ │ ├─┬ make-dir@1.0.0
+│ │ │ │ │ └── pify@2.3.0
+│ │ │ │ ├─┬ unique-string@1.0.0
+│ │ │ │ │ └── crypto-random-string@1.0.0
+│ │ │ │ ├── write-file-atomic@2.1.0 deduped
+│ │ │ │ └── xdg-basedir@3.0.0 deduped
+│ │ │ ├── import-lazy@2.1.0
+│ │ │ ├── is-npm@1.0.0
+│ │ │ ├─┬ latest-version@3.1.0
+│ │ │ │ └─┬ package-json@4.0.1
+│ │ │ │   ├─┬ got@6.7.1
+│ │ │ │   │ ├─┬ create-error-class@3.0.2
+│ │ │ │   │ │ └── capture-stack-trace@1.0.0
+│ │ │ │   │ ├── duplexer3@0.1.4
+│ │ │ │   │ ├── get-stream@3.0.0
+│ │ │ │   │ ├── is-redirect@1.0.0
+│ │ │ │   │ ├── is-retry-allowed@1.1.0
+│ │ │ │   │ ├── is-stream@1.1.0
+│ │ │ │   │ ├── lowercase-keys@1.0.0
+│ │ │ │   │ ├── safe-buffer@5.1.1 deduped
+│ │ │ │   │ ├── timed-out@4.0.1
+│ │ │ │   │ ├── unzip-response@2.0.1
+│ │ │ │   │ └─┬ url-parse-lax@1.0.0
+│ │ │ │   │   └── prepend-http@1.0.4
+│ │ │ │   ├─┬ registry-auth-token@3.3.1
+│ │ │ │   │ ├─┬ rc@1.2.1
+│ │ │ │   │ │ ├── deep-extend@0.4.2
+│ │ │ │   │ │ ├── ini@1.3.4 deduped
+│ │ │ │   │ │ ├── minimist@1.2.0
+│ │ │ │   │ │ └── strip-json-comments@2.0.1
+│ │ │ │   │ └── safe-buffer@5.1.1 deduped
+│ │ │ │   ├─┬ registry-url@3.1.0
+│ │ │ │   │ └─┬ rc@1.2.1
+│ │ │ │   │   ├── deep-extend@0.4.2
+│ │ │ │   │   ├── ini@1.3.4 deduped
+│ │ │ │   │   ├── minimist@1.2.0
+│ │ │ │   │   └── strip-json-comments@2.0.1
+│ │ │ │   └── semver@5.3.0 deduped
+│ │ │ ├─┬ semver-diff@2.1.0
+│ │ │ │ └── semver@5.3.0 deduped
+│ │ │ └── xdg-basedir@3.0.0
+│ │ ├── uuid@3.1.0
+│ │ ├─┬ validate-npm-package-license@3.0.1
+│ │ │ ├─┬ spdx-correct@1.0.2
+│ │ │ │ └── spdx-license-ids@1.2.2
+│ │ │ └── spdx-expression-parse@1.0.4
+│ │ ├─┬ validate-npm-package-name@3.0.0
+│ │ │ └── builtins@1.0.3
+│ │ ├─┬ which@1.2.14
+│ │ │ └── isexe@2.0.0
+│ │ ├─┬ worker-farm@1.3.1
+│ │ │ ├─┬ errno@0.1.4
+│ │ │ │ └── prr@0.0.0
+│ │ │ └── xtend@4.0.1
+│ │ ├── wrappy@1.0.2
+│ │ └─┬ write-file-atomic@2.1.0
+│ │   ├── graceful-fs@4.1.11 deduped
+│ │   ├── imurmurhash@0.1.4 deduped
+│ │   └── slide@1.1.6 deduped
+│ ├─┬ npmi@1.0.1
+│ │ ├─┬ npm@2.15.12
+│ │ │ ├── abbrev@1.0.9
+│ │ │ ├── ansi@0.3.1
+│ │ │ ├── ansi-regex@2.0.0
+│ │ │ ├── ansicolors@0.3.2
+│ │ │ ├── ansistyles@0.1.3
+│ │ │ ├── archy@1.0.0
+│ │ │ ├─┬ async-some@1.0.2
+│ │ │ │ └── dezalgo@1.0.3 deduped
+│ │ │ ├─┬ block-stream@0.0.9
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── char-spinner@1.0.1
+│ │ │ ├── chmodr@1.0.2
+│ │ │ ├── chownr@1.0.1
+│ │ │ ├─┬ cmd-shim@2.0.2
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ └── mkdirp@0.5.1 deduped
+│ │ │ ├─┬ columnify@1.5.4
+│ │ │ │ ├── strip-ansi@3.0.1 deduped
+│ │ │ │ └─┬ wcwidth@1.0.0
+│ │ │ │   └─┬ defaults@1.0.3
+│ │ │ │     └── clone@1.0.2
+│ │ │ ├─┬ config-chain@1.1.10
+│ │ │ │ ├── ini@1.3.4 deduped
+│ │ │ │ └── proto-list@1.2.4
+│ │ │ ├─┬ dezalgo@1.0.3
+│ │ │ │ ├── asap@2.0.3
+│ │ │ │ └── wrappy@1.0.2 deduped
+│ │ │ ├── editor@1.0.0
+│ │ │ ├─┬ fs-vacuum@1.2.9
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── path-is-inside@1.0.1 deduped
+│ │ │ │ └── rimraf@2.5.4 deduped
+│ │ │ ├─┬ fs-write-stream-atomic@1.0.8
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── iferr@0.1.5
+│ │ │ │ ├── imurmurhash@0.1.4 deduped
+│ │ │ │ └── readable-stream@2.1.5 deduped
+│ │ │ ├─┬ fstream@1.0.10
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ └── rimraf@2.5.4 deduped
+│ │ │ ├─┬ fstream-npm@1.1.1
+│ │ │ │ ├─┬ fstream-ignore@1.0.5
+│ │ │ │ │ ├── fstream@1.0.10 deduped
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ └── minimatch@3.0.3 deduped
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── github-url-from-git@1.4.0
+│ │ │ ├── github-url-from-username-repo@1.0.2
+│ │ │ ├─┬ glob@7.0.6
+│ │ │ │ ├── fs.realpath@1.0.0
+│ │ │ │ ├── inflight@1.0.5 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ └── path-is-absolute@1.0.0
+│ │ │ ├── graceful-fs@4.1.6
+│ │ │ ├── hosted-git-info@2.1.5
+│ │ │ ├── imurmurhash@0.1.4
+│ │ │ ├─┬ inflight@1.0.5
+│ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ └── wrappy@1.0.2 deduped
+│ │ │ ├── inherits@2.0.3
+│ │ │ ├── ini@1.3.4
+│ │ │ ├─┬ init-package-json@1.9.4
+│ │ │ │ ├─┬ glob@6.0.4
+│ │ │ │ │ ├── inflight@1.0.5 deduped
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ │ └── path-is-absolute@1.0.0
+│ │ │ │ ├── npm-package-arg@4.1.0 deduped
+│ │ │ │ ├─┬ promzard@0.3.0
+│ │ │ │ │ └── read@1.0.7 deduped
+│ │ │ │ ├── read@1.0.7 deduped
+│ │ │ │ ├── read-package-json@2.0.4 deduped
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ ├── validate-npm-package-license@3.0.1 deduped
+│ │ │ │ └── validate-npm-package-name@2.2.2 deduped
+│ │ │ ├── lockfile@1.0.1
+│ │ │ ├─┬ lru-cache@4.0.1
+│ │ │ │ ├── pseudomap@1.0.2
+│ │ │ │ └── yallist@2.0.0
+│ │ │ ├─┬ minimatch@3.0.3
+│ │ │ │ └─┬ brace-expansion@1.1.6
+│ │ │ │   ├── balanced-match@0.4.2
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├─┬ mkdirp@0.5.1
+│ │ │ │ └── minimist@0.0.8
+│ │ │ ├─┬ node-gyp@3.6.0
+│ │ │ │ ├── fstream@1.0.10 deduped
+│ │ │ │ ├── glob@7.0.6 deduped
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ ├── nopt@3.0.6 deduped
+│ │ │ │ ├── npmlog@2.0.4 deduped
+│ │ │ │ ├── osenv@0.1.3 deduped
+│ │ │ │ ├── request@2.74.0 deduped
+│ │ │ │ ├── rimraf@2.5.4 deduped
+│ │ │ │ ├── semver@5.3.0
+│ │ │ │ ├── tar@2.2.1 deduped
+│ │ │ │ └── which@1.2.11 deduped
+│ │ │ ├─┬ nopt@3.0.6
+│ │ │ │ └── abbrev@1.0.9 deduped
+│ │ │ ├── normalize-git-url@3.0.2
+│ │ │ ├─┬ normalize-package-data@2.3.5
+│ │ │ │ ├── hosted-git-info@2.1.5 deduped
+│ │ │ │ ├─┬ is-builtin-module@1.0.0
+│ │ │ │ │ └── builtin-modules@1.1.0
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ └── validate-npm-package-license@3.0.1 deduped
+│ │ │ ├── npm-cache-filename@1.0.2
+│ │ │ ├─┬ npm-install-checks@1.0.7
+│ │ │ │ ├── npmlog@2.0.4 deduped
+│ │ │ │ └── semver@5.1.0 deduped
+│ │ │ ├─┬ npm-package-arg@4.1.0
+│ │ │ │ ├── hosted-git-info@2.1.5 deduped
+│ │ │ │ └── semver@5.1.0 deduped
+│ │ │ ├─┬ npm-registry-client@7.2.1
+│ │ │ │ ├─┬ concat-stream@1.5.2
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ ├─┬ readable-stream@2.0.6
+│ │ │ │ │ │ ├── core-util-is@1.0.2
+│ │ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ │ ├── isarray@1.0.0
+│ │ │ │ │ │ ├── process-nextick-args@1.0.7
+│ │ │ │ │ │ ├── string_decoder@0.10.31
+│ │ │ │ │ │ └── util-deprecate@1.0.2
+│ │ │ │ │ └── typedarray@0.0.6
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── normalize-package-data@2.3.5 deduped
+│ │ │ │ ├── npm-package-arg@4.1.0 deduped
+│ │ │ │ ├── npmlog@2.0.4 deduped
+│ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ ├── request@2.74.0 deduped
+│ │ │ │ ├── retry@0.10.0
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ └── slide@1.1.6 deduped
+│ │ │ ├── npm-user-validate@0.1.5
+│ │ │ ├─┬ npmlog@2.0.4
+│ │ │ │ ├── ansi@0.3.1 deduped
+│ │ │ │ ├─┬ are-we-there-yet@1.1.2
+│ │ │ │ │ ├── delegates@1.0.0
+│ │ │ │ │ └── readable-stream@2.1.5 deduped
+│ │ │ │ └─┬ gauge@1.2.7
+│ │ │ │   ├── ansi@0.3.1 deduped
+│ │ │ │   ├── has-unicode@2.0.0
+│ │ │ │   ├─┬ lodash.pad@4.4.0
+│ │ │ │   │ ├── lodash._baseslice@4.0.0
+│ │ │ │   │ ├── lodash._basetostring@4.12.0
+│ │ │ │   │ └── lodash.tostring@4.1.4
+│ │ │ │   ├─┬ lodash.padend@4.5.0
+│ │ │ │   │ ├── lodash._baseslice@4.0.0 deduped
+│ │ │ │   │ ├── lodash._basetostring@4.12.0 deduped
+│ │ │ │   │ └── lodash.tostring@4.1.4 deduped
+│ │ │ │   └─┬ lodash.padstart@4.5.0
+│ │ │ │     ├── lodash._baseslice@4.0.0 deduped
+│ │ │ │     ├── lodash._basetostring@4.12.0 deduped
+│ │ │ │     └── lodash.tostring@4.1.4 deduped
+│ │ │ ├─┬ once@1.4.0
+│ │ │ │ └── wrappy@1.0.2 deduped
+│ │ │ ├── opener@1.4.1
+│ │ │ ├─┬ osenv@0.1.3
+│ │ │ │ ├── os-homedir@1.0.0
+│ │ │ │ └── os-tmpdir@1.0.1
+│ │ │ ├── path-is-inside@1.0.1
+│ │ │ ├─┬ read@1.0.7
+│ │ │ │ └── mute-stream@0.0.5
+│ │ │ ├─┬ read-installed@4.0.3
+│ │ │ │ ├── debuglog@1.0.1
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── read-package-json@2.0.4 deduped
+│ │ │ │ ├─┬ readdir-scoped-modules@1.0.2
+│ │ │ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ ├── slide@1.1.6 deduped
+│ │ │ │ └── util-extend@1.0.1
+│ │ │ ├─┬ read-package-json@2.0.4
+│ │ │ │ ├─┬ glob@6.0.4
+│ │ │ │ │ ├── inflight@1.0.5 deduped
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ │ └── path-is-absolute@1.0.0
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├─┬ json-parse-helpfulerror@1.0.3
+│ │ │ │ │ └── jju@1.3.0
+│ │ │ │ └── normalize-package-data@2.3.5 deduped
+│ │ │ ├─┬ readable-stream@2.1.5
+│ │ │ │ ├── buffer-shims@1.0.0
+│ │ │ │ ├── core-util-is@1.0.2
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── isarray@1.0.0
+│ │ │ │ ├── process-nextick-args@1.0.7
+│ │ │ │ ├── string_decoder@0.10.31
+│ │ │ │ └── util-deprecate@1.0.2
+│ │ │ ├─┬ realize-package-specifier@3.0.1
+│ │ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ │ └── npm-package-arg@4.1.0 deduped
+│ │ │ ├─┬ request@2.74.0
+│ │ │ │ ├── aws-sign2@0.6.0
+│ │ │ │ ├── aws4@1.4.1
+│ │ │ │ ├─┬ bl@1.1.2
+│ │ │ │ │ └─┬ readable-stream@2.0.6
+│ │ │ │ │   ├── core-util-is@1.0.2
+│ │ │ │ │   ├── inherits@2.0.3 deduped
+│ │ │ │ │   ├── isarray@1.0.0
+│ │ │ │ │   ├── process-nextick-args@1.0.7
+│ │ │ │ │   ├── string_decoder@0.10.31
+│ │ │ │ │   └── util-deprecate@1.0.2
+│ │ │ │ ├── caseless@0.11.0
+│ │ │ │ ├─┬ combined-stream@1.0.5
+│ │ │ │ │ └── delayed-stream@1.0.0
+│ │ │ │ ├── extend@3.0.0
+│ │ │ │ ├── forever-agent@0.6.1
+│ │ │ │ ├─┬ form-data@1.0.0-rc4
+│ │ │ │ │ ├── async@1.5.2
+│ │ │ │ │ ├── combined-stream@1.0.5 deduped
+│ │ │ │ │ └── mime-types@2.1.11 deduped
+│ │ │ │ ├─┬ har-validator@2.0.6
+│ │ │ │ │ ├─┬ chalk@1.1.3
+│ │ │ │ │ │ ├── ansi-styles@2.2.1
+│ │ │ │ │ │ ├── escape-string-regexp@1.0.5
+│ │ │ │ │ │ ├─┬ has-ansi@2.0.0
+│ │ │ │ │ │ │ └── ansi-regex@2.0.0 deduped
+│ │ │ │ │ │ ├── strip-ansi@3.0.1 deduped
+│ │ │ │ │ │ └── supports-color@2.0.0
+│ │ │ │ │ ├─┬ commander@2.9.0
+│ │ │ │ │ │ └── graceful-readlink@1.0.1
+│ │ │ │ │ ├─┬ is-my-json-valid@2.13.1
+│ │ │ │ │ │ ├── generate-function@2.0.0
+│ │ │ │ │ │ ├─┬ generate-object-property@1.2.0
+│ │ │ │ │ │ │ └── is-property@1.0.2
+│ │ │ │ │ │ ├── jsonpointer@2.0.0
+│ │ │ │ │ │ └── xtend@4.0.1
+│ │ │ │ │ └─┬ pinkie-promise@2.0.1
+│ │ │ │ │   └── pinkie@2.0.4
+│ │ │ │ ├─┬ hawk@3.1.3
+│ │ │ │ │ ├─┬ boom@2.10.1
+│ │ │ │ │ │ └── hoek@2.16.3 deduped
+│ │ │ │ │ ├─┬ cryptiles@2.0.5
+│ │ │ │ │ │ └── boom@2.10.1 deduped
+│ │ │ │ │ ├── hoek@2.16.3
+│ │ │ │ │ └─┬ sntp@1.0.9
+│ │ │ │ │   └── hoek@2.16.3 deduped
+│ │ │ │ ├─┬ http-signature@1.1.1
+│ │ │ │ │ ├── assert-plus@0.2.0
+│ │ │ │ │ ├─┬ jsprim@1.3.0
+│ │ │ │ │ │ ├── extsprintf@1.0.2
+│ │ │ │ │ │ ├── json-schema@0.2.2
+│ │ │ │ │ │ └─┬ verror@1.3.6
+│ │ │ │ │ │   └── extsprintf@1.0.2 deduped
+│ │ │ │ │ └─┬ sshpk@1.9.2
+│ │ │ │ │   ├── asn1@0.2.3
+│ │ │ │ │   ├── assert-plus@1.0.0
+│ │ │ │ │   ├─┬ dashdash@1.14.0
+│ │ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │ │   ├─┬ ecc-jsbn@0.1.1
+│ │ │ │ │   │ └── jsbn@0.1.0 deduped
+│ │ │ │ │   ├─┬ getpass@0.1.6
+│ │ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │ │   ├─┬ jodid25519@1.0.2
+│ │ │ │ │   │ └── jsbn@0.1.0 deduped
+│ │ │ │ │   ├── jsbn@0.1.0
+│ │ │ │ │   └── tweetnacl@0.13.3
+│ │ │ │ ├── is-typedarray@1.0.0
+│ │ │ │ ├── isstream@0.1.2
+│ │ │ │ ├── json-stringify-safe@5.0.1
+│ │ │ │ ├─┬ mime-types@2.1.11
+│ │ │ │ │ └── mime-db@1.23.0
+│ │ │ │ ├── node-uuid@1.4.7
+│ │ │ │ ├── oauth-sign@0.8.2
+│ │ │ │ ├── qs@6.2.1
+│ │ │ │ ├── stringstream@0.0.5
+│ │ │ │ ├── tough-cookie@2.3.1
+│ │ │ │ └── tunnel-agent@0.4.3
+│ │ │ ├── retry@0.10.0
+│ │ │ ├─┬ rimraf@2.5.4
+│ │ │ │ └── glob@7.0.6 deduped
+│ │ │ ├── semver@5.1.0
+│ │ │ ├─┬ sha@2.0.1
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ └─┬ readable-stream@2.0.2
+│ │ │ │   ├── core-util-is@1.0.1
+│ │ │ │   ├── inherits@2.0.3 deduped
+│ │ │ │   ├── isarray@0.0.1
+│ │ │ │   ├── process-nextick-args@1.0.3
+│ │ │ │   ├── string_decoder@0.10.31
+│ │ │ │   └── util-deprecate@1.0.1
+│ │ │ ├── slide@1.1.6
+│ │ │ ├── sorted-object@2.0.0
+│ │ │ ├── spdx-license-ids@1.2.2
+│ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ └── ansi-regex@2.0.0 deduped
+│ │ │ ├─┬ tar@2.2.1
+│ │ │ │ ├── block-stream@0.0.9 deduped
+│ │ │ │ ├── fstream@1.0.10 deduped
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── text-table@0.2.0
+│ │ │ ├── uid-number@0.0.6
+│ │ │ ├── umask@1.1.0
+│ │ │ ├─┬ validate-npm-package-license@3.0.1
+│ │ │ │ ├─┬ spdx-correct@1.0.2
+│ │ │ │ │ └── spdx-license-ids@1.2.2 deduped
+│ │ │ │ └─┬ spdx-expression-parse@1.0.2
+│ │ │ │   ├── spdx-exceptions@1.0.4
+│ │ │ │   └── spdx-license-ids@1.2.2 deduped
+│ │ │ ├─┬ validate-npm-package-name@2.2.2
+│ │ │ │ └── builtins@0.0.7
+│ │ │ ├─┬ which@1.2.11
+│ │ │ │ └── isexe@1.1.2
+│ │ │ ├── wrappy@1.0.2
+│ │ │ └─┬ write-file-atomic@1.1.4
+│ │ │   ├── graceful-fs@4.1.6 deduped
+│ │ │   ├── imurmurhash@0.1.4 deduped
+│ │ │   └── slide@1.1.6 deduped
+│ │ └── semver@4.3.6
+│ ├─┬ optimist@0.6.1
+│ │ ├── minimist@0.0.10
+│ │ └── wordwrap@0.0.3
+│ ├── q@1.5.0
+│ ├── semver@5.3.0
+│ ├─┬ tmp@0.0.31
+│ │ └── os-tmpdir@1.0.2
+│ └─┬ user-home@2.0.0
+│   └── os-homedir@1.0.2
+├─┬ npm@6.13.7
+│ ├── abbrev@1.1.1
+│ ├── ansicolors@0.3.2
+│ ├── ansistyles@0.1.3
+│ ├── aproba@2.0.0
+│ ├── archy@1.0.0
+│ ├─┬ bin-links@1.1.7
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── cmd-shim@3.0.3 deduped
+│ │ ├── gentle-fs@2.3.0 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── npm-normalize-package-bin@1.0.1
+│ │ └── write-file-atomic@2.4.3 deduped
+│ ├── bluebird@3.5.5
+│ ├── byte-size@5.0.1
+│ ├─┬ cacache@12.0.3
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── infer-owner@1.0.4 deduped
+│ │ ├── lru-cache@5.1.1 deduped
+│ │ ├── mississippi@3.0.0 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── move-concurrently@1.0.1 deduped
+│ │ ├── promise-inflight@1.0.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── ssri@6.0.1 deduped
+│ │ ├── unique-filename@1.1.1 deduped
+│ │ └── y18n@4.0.0
+│ ├── call-limit@1.1.1
+│ ├── chownr@1.1.3
+│ ├── ci-info@2.0.0
+│ ├─┬ cli-columns@3.1.2
+│ │ ├─┬ string-width@2.1.1
+│ │ │ ├── is-fullwidth-code-point@2.0.0
+│ │ │ └─┬ strip-ansi@4.0.0
+│ │ │   └── ansi-regex@3.0.0
+│ │ └─┬ strip-ansi@3.0.1
+│ │   └── ansi-regex@2.1.1
+│ ├─┬ cli-table3@0.5.1
+│ │ ├── colors@1.3.3
+│ │ ├── object-assign@4.1.1
+│ │ └── string-width@2.1.1 deduped
+│ ├─┬ cmd-shim@3.0.3
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ └── mkdirp@0.5.1 deduped
+│ ├─┬ columnify@1.5.4
+│ │ ├── strip-ansi@3.0.1 deduped
+│ │ └─┬ wcwidth@1.0.1
+│ │   └─┬ defaults@1.0.3
+│ │     └── clone@1.0.4
+│ ├─┬ config-chain@1.1.12
+│ │ ├── ini@1.3.5 deduped
+│ │ └── proto-list@1.2.4
+│ ├── debuglog@1.0.1
+│ ├── detect-indent@5.0.0
+│ ├── detect-newline@2.1.0
+│ ├─┬ dezalgo@1.0.3
+│ │ ├── asap@2.0.6
+│ │ └── wrappy@1.0.2
+│ ├── editor@1.0.0
+│ ├── figgy-pudding@3.5.1
+│ ├── find-npm-prefix@1.0.2
+│ ├─┬ fs-vacuum@1.2.10
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── path-is-inside@1.0.2 deduped
+│ │ └── rimraf@2.6.3 deduped
+│ ├─┬ fs-write-stream-atomic@1.0.10
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── iferr@0.1.5
+│ │ ├── imurmurhash@0.1.4 deduped
+│ │ └─┬ readable-stream@2.3.6
+│ │   ├── core-util-is@1.0.2
+│ │   ├── inherits@2.0.4 deduped
+│ │   ├── isarray@1.0.0
+│ │   ├── process-nextick-args@2.0.0
+│ │   ├── safe-buffer@5.1.2 deduped
+│ │   ├─┬ string_decoder@1.1.1
+│ │   │ └── safe-buffer@5.1.2 deduped
+│ │   └── util-deprecate@1.0.2 deduped
+│ ├─┬ gentle-fs@2.3.0
+│ │ ├── aproba@1.2.0
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├── cmd-shim@3.0.3 deduped
+│ │ ├── fs-vacuum@1.2.10 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── iferr@0.1.5
+│ │ ├── infer-owner@1.0.4 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── path-is-inside@1.0.2 deduped
+│ │ ├── read-cmd-shim@1.0.5 deduped
+│ │ └── slide@1.1.6 deduped
+│ ├─┬ glob@7.1.4
+│ │ ├── fs.realpath@1.0.0
+│ │ ├── inflight@1.0.6 deduped
+│ │ ├── inherits@2.0.4 deduped
+│ │ ├─┬ minimatch@3.0.4
+│ │ │ └─┬ brace-expansion@1.1.11
+│ │ │   ├── balanced-match@1.0.0
+│ │ │   └── concat-map@0.0.1
+│ │ ├── once@1.4.0 deduped
+│ │ └── path-is-absolute@1.0.1
+│ ├── graceful-fs@4.2.3
+│ ├── has-unicode@2.0.1
+│ ├── hosted-git-info@2.8.5
+│ ├── iferr@1.0.2
+│ ├── imurmurhash@0.1.4
+│ ├── infer-owner@1.0.4
+│ ├─┬ inflight@1.0.6
+│ │ ├── once@1.4.0 deduped
+│ │ └── wrappy@1.0.2 deduped
+│ ├── inherits@2.0.4
+│ ├── ini@1.3.5
+│ ├─┬ init-package-json@1.10.3
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├─┬ promzard@0.3.0
+│ │ │ └── read@1.0.7 deduped
+│ │ ├── read@1.0.7 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── validate-npm-package-license@3.0.4 deduped
+│ │ └── validate-npm-package-name@3.0.0 deduped
+│ ├─┬ is-cidr@3.0.0
+│ │ └─┬ cidr-regex@2.0.10
+│ │   └── ip-regex@2.1.0
+│ ├── json-parse-better-errors@1.0.2
+│ ├─┬ JSONStream@1.3.5
+│ │ ├── jsonparse@1.3.1
+│ │ └── through@2.3.8
+│ ├── lazy-property@1.0.0
+│ ├─┬ libcipm@4.0.7
+│ │ ├── bin-links@1.1.7 deduped
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── find-npm-prefix@1.0.2 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── ini@1.3.5 deduped
+│ │ ├── lock-verify@2.1.0 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── npm-lifecycle@3.1.4 deduped
+│ │ ├── npm-logical-tree@1.2.1
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── pacote@9.5.12 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ └── worker-farm@1.7.0 deduped
+│ ├─┬ libnpm@3.0.1
+│ │ ├── bin-links@1.1.7 deduped
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── find-npm-prefix@1.0.2 deduped
+│ │ ├── libnpmaccess@3.0.2 deduped
+│ │ ├─┬ libnpmconfig@1.2.1
+│ │ │ ├── figgy-pudding@3.5.1 deduped
+│ │ │ ├─┬ find-up@3.0.0
+│ │ │ │ └─┬ locate-path@3.0.0
+│ │ │ │   ├─┬ p-locate@3.0.0
+│ │ │ │   │ └─┬ p-limit@2.2.0
+│ │ │ │   │   └── p-try@2.2.0
+│ │ │ │   └── path-exists@3.0.0
+│ │ │ └── ini@1.3.5 deduped
+│ │ ├── libnpmhook@5.0.3 deduped
+│ │ ├── libnpmorg@1.0.1 deduped
+│ │ ├─┬ libnpmpublish@1.1.2
+│ │ │ ├── aproba@2.0.0 deduped
+│ │ │ ├── figgy-pudding@3.5.1 deduped
+│ │ │ ├── get-stream@4.1.0 deduped
+│ │ │ ├── lodash.clonedeep@4.5.0 deduped
+│ │ │ ├── normalize-package-data@2.5.0 deduped
+│ │ │ ├── npm-package-arg@6.1.1 deduped
+│ │ │ ├── npm-registry-fetch@4.0.2 deduped
+│ │ │ ├── semver@5.7.1 deduped
+│ │ │ └── ssri@6.0.1 deduped
+│ │ ├── libnpmsearch@2.0.2 deduped
+│ │ ├── libnpmteam@1.0.2 deduped
+│ │ ├── lock-verify@2.1.0 deduped
+│ │ ├── npm-lifecycle@3.1.4 deduped
+│ │ ├── npm-logical-tree@1.2.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── npm-profile@4.0.2 deduped
+│ │ ├── npm-registry-fetch@4.0.2 deduped
+│ │ ├── npmlog@4.1.2 deduped
+│ │ ├── pacote@9.5.12 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ └── stringify-package@1.0.1 deduped
+│ ├─┬ libnpmaccess@3.0.2
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├─┬ get-stream@4.1.0
+│ │ │ └── pump@3.0.0 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmhook@5.0.3
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmorg@1.0.1
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmsearch@2.0.2
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmteam@1.0.2
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpx@10.2.2
+│ │ ├── dotenv@5.0.1
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ ├── update-notifier@2.5.0 deduped
+│ │ ├── which@1.3.1 deduped
+│ │ ├── y18n@4.0.0 deduped
+│ │ └─┬ yargs@11.1.1
+│ │   ├─┬ cliui@4.1.0
+│ │   │ ├── string-width@2.1.1 deduped
+│ │   │ ├─┬ strip-ansi@4.0.0
+│ │   │ │ └── ansi-regex@3.0.0
+│ │   │ └─┬ wrap-ansi@2.1.0
+│ │   │   ├─┬ string-width@1.0.2
+│ │   │   │ ├── code-point-at@1.1.0 deduped
+│ │   │   │ ├── is-fullwidth-code-point@1.0.0 deduped
+│ │   │   │ └── strip-ansi@3.0.1 deduped
+│ │   │   └── strip-ansi@3.0.1 deduped
+│ │   ├── decamelize@1.2.0
+│ │   ├─┬ find-up@2.1.0
+│ │   │ └─┬ locate-path@2.0.0
+│ │   │   ├─┬ p-locate@2.0.0
+│ │   │   │ └─┬ p-limit@1.2.0
+│ │   │   │   └── p-try@1.0.0
+│ │   │   └── path-exists@3.0.0 deduped
+│ │   ├── get-caller-file@1.0.3
+│ │   ├─┬ os-locale@3.1.0
+│ │   │ ├─┬ execa@1.0.0
+│ │   │ │ ├─┬ cross-spawn@6.0.5
+│ │   │ │ │ ├── nice-try@1.0.5
+│ │   │ │ │ ├── path-key@2.0.1 deduped
+│ │   │ │ │ ├── semver@5.7.1 deduped
+│ │   │ │ │ ├─┬ shebang-command@1.2.0
+│ │   │ │ │ │ └── shebang-regex@1.0.0
+│ │   │ │ │ └── which@1.3.1 deduped
+│ │   │ │ ├── get-stream@4.1.0 deduped
+│ │   │ │ ├── is-stream@1.1.0
+│ │   │ │ ├─┬ npm-run-path@2.0.2
+│ │   │ │ │ └── path-key@2.0.1
+│ │   │ │ ├── p-finally@1.0.0
+│ │   │ │ ├── signal-exit@3.0.2 deduped
+│ │   │ │ └── strip-eof@1.0.0
+│ │   │ ├─┬ lcid@2.0.0
+│ │   │ │ └── invert-kv@2.0.0
+│ │   │ └─┬ mem@4.3.0
+│ │   │   ├─┬ map-age-cleaner@0.1.3
+│ │   │   │ └── p-defer@1.0.0
+│ │   │   ├── mimic-fn@2.1.0
+│ │   │   └── p-is-promise@2.1.0
+│ │   ├── require-directory@2.1.1
+│ │   ├── require-main-filename@1.0.1
+│ │   ├── set-blocking@2.0.0 deduped
+│ │   ├── string-width@2.1.1 deduped
+│ │   ├── which-module@2.0.0
+│ │   ├── y18n@3.2.1
+│ │   └─┬ yargs-parser@9.0.2
+│ │     └── camelcase@4.1.0 deduped
+│ ├─┬ lock-verify@2.1.0
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── semver@5.7.1 deduped
+│ ├─┬ lockfile@1.0.4
+│ │ └── signal-exit@3.0.2
+│ ├── lodash._baseindexof@3.1.0
+│ ├─┬ lodash._baseuniq@4.6.0
+│ │ ├── lodash._createset@4.0.3
+│ │ └── lodash._root@3.0.1
+│ ├── lodash._bindcallback@3.0.1
+│ ├── lodash._cacheindexof@3.0.2
+│ ├─┬ lodash._createcache@3.1.2
+│ │ └── lodash._getnative@3.9.1 deduped
+│ ├── lodash._getnative@3.9.1
+│ ├── lodash.clonedeep@4.5.0
+│ ├── lodash.restparam@3.6.1
+│ ├── lodash.union@4.6.0
+│ ├── lodash.uniq@4.5.0
+│ ├── lodash.without@4.4.0
+│ ├─┬ lru-cache@5.1.1
+│ │ └── yallist@3.0.3
+│ ├── meant@1.0.1
+│ ├─┬ mississippi@3.0.0
+│ │ ├─┬ concat-stream@1.6.2
+│ │ │ ├── buffer-from@1.0.0
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ ├─┬ readable-stream@2.3.6
+│ │ │ │ ├── core-util-is@1.0.2 deduped
+│ │ │ │ ├── inherits@2.0.4 deduped
+│ │ │ │ ├── isarray@1.0.0 deduped
+│ │ │ │ ├── process-nextick-args@2.0.0 deduped
+│ │ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ │ ├─┬ string_decoder@1.1.1
+│ │ │ │ │ └── safe-buffer@5.1.2 deduped
+│ │ │ │ └── util-deprecate@1.0.2 deduped
+│ │ │ └── typedarray@0.0.6
+│ │ ├─┬ duplexify@3.6.0
+│ │ │ ├── end-of-stream@1.4.1 deduped
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ ├─┬ readable-stream@2.3.6
+│ │ │ │ ├── core-util-is@1.0.2 deduped
+│ │ │ │ ├── inherits@2.0.4 deduped
+│ │ │ │ ├── isarray@1.0.0 deduped
+│ │ │ │ ├── process-nextick-args@2.0.0 deduped
+│ │ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ │ ├─┬ string_decoder@1.1.1
+│ │ │ │ │ └── safe-buffer@5.1.2 deduped
+│ │ │ │ └── util-deprecate@1.0.2 deduped
+│ │ │ └── stream-shift@1.0.0
+│ │ ├─┬ end-of-stream@1.4.1
+│ │ │ └── once@1.4.0 deduped
+│ │ ├─┬ flush-write-stream@1.0.3
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├─┬ from2@2.3.0
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├─┬ parallel-transform@1.1.0
+│ │ │ ├── cyclist@0.2.2
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├─┬ pump@3.0.0
+│ │ │ ├── end-of-stream@1.4.1 deduped
+│ │ │ └── once@1.4.0 deduped
+│ │ ├─┬ pumpify@1.5.1
+│ │ │ ├── duplexify@3.6.0 deduped
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ pump@2.0.1
+│ │ │   ├── end-of-stream@1.4.1 deduped
+│ │ │   └── once@1.4.0 deduped
+│ │ ├─┬ stream-each@1.2.2
+│ │ │ ├── end-of-stream@1.4.1 deduped
+│ │ │ └── stream-shift@1.0.0 deduped
+│ │ └─┬ through2@2.0.3
+│ │   ├─┬ readable-stream@2.3.6
+│ │   │ ├── core-util-is@1.0.2 deduped
+│ │   │ ├── inherits@2.0.4 deduped
+│ │   │ ├── isarray@1.0.0 deduped
+│ │   │ ├── process-nextick-args@2.0.0 deduped
+│ │   │ ├── safe-buffer@5.1.2 deduped
+│ │   │ ├─┬ string_decoder@1.1.1
+│ │   │ │ └── safe-buffer@5.1.2 deduped
+│ │   │ └── util-deprecate@1.0.2 deduped
+│ │   └── xtend@4.0.1
+│ ├─┬ mkdirp@0.5.1
+│ │ └── minimist@0.0.8
+│ ├─┬ move-concurrently@1.0.1
+│ │ ├── aproba@1.2.0
+│ │ ├─┬ copy-concurrently@1.0.5
+│ │ │ ├── aproba@1.2.0
+│ │ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ │ ├── iferr@0.1.5
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├── rimraf@2.6.3 deduped
+│ │ │ └── run-queue@1.0.3 deduped
+│ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ └─┬ run-queue@1.0.3
+│ │   └── aproba@1.2.0
+│ ├─┬ node-gyp@5.0.7
+│ │ ├── env-paths@2.2.0
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── nopt@4.0.1 deduped
+│ │ ├── npmlog@4.1.2 deduped
+│ │ ├── request@2.88.0 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── tar@4.4.13 deduped
+│ │ └── which@1.3.1 deduped
+│ ├─┬ nopt@4.0.1
+│ │ ├── abbrev@1.1.1 deduped
+│ │ └── osenv@0.1.5 deduped
+│ ├─┬ normalize-package-data@2.5.0
+│ │ ├── hosted-git-info@2.8.5 deduped
+│ │ ├─┬ resolve@1.10.0
+│ │ │ └── path-parse@1.0.6
+│ │ ├── semver@5.7.1 deduped
+│ │ └── validate-npm-package-license@3.0.4 deduped
+│ ├─┬ npm-audit-report@1.3.2
+│ │ ├── cli-table3@0.5.1 deduped
+│ │ └── console-control-strings@1.1.0
+│ ├── npm-cache-filename@1.0.2
+│ ├─┬ npm-install-checks@3.0.2
+│ │ └── semver@5.7.1 deduped
+│ ├─┬ npm-lifecycle@3.1.4
+│ │ ├── byline@5.0.0
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── node-gyp@5.0.7 deduped
+│ │ ├── resolve-from@4.0.0
+│ │ ├── slide@1.1.6 deduped
+│ │ ├── uid-number@0.0.6 deduped
+│ │ ├── umask@1.1.0 deduped
+│ │ └── which@1.3.1 deduped
+│ ├─┬ npm-package-arg@6.1.1
+│ │ ├── hosted-git-info@2.8.5 deduped
+│ │ ├── osenv@0.1.5 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ └── validate-npm-package-name@3.0.0 deduped
+│ ├─┬ npm-packlist@1.4.7
+│ │ ├─┬ ignore-walk@3.0.3
+│ │ │ └── minimatch@3.0.4 deduped
+│ │ └─┬ npm-bundled@1.1.1
+│ │   └── npm-normalize-package-bin@1.0.1 deduped
+│ ├─┬ npm-pick-manifest@3.0.2
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── semver@5.7.1 deduped
+│ ├─┬ npm-profile@4.0.2
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ npm-registry-fetch@4.0.2
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── JSONStream@1.3.5 deduped
+│ │ ├── lru-cache@5.1.1 deduped
+│ │ ├─┬ make-fetch-happen@5.0.2
+│ │ │ ├─┬ agentkeepalive@3.5.2
+│ │ │ │ └─┬ humanize-ms@1.2.1
+│ │ │ │   └── ms@2.1.1
+│ │ │ ├── cacache@12.0.3 deduped
+│ │ │ ├── http-cache-semantics@3.8.1
+│ │ │ ├─┬ http-proxy-agent@2.1.0
+│ │ │ │ ├─┬ agent-base@4.3.0
+│ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │   └── es6-promise@4.2.8
+│ │ │ │ └─┬ debug@3.1.0
+│ │ │ │   └── ms@2.0.0
+│ │ │ ├─┬ https-proxy-agent@2.2.4
+│ │ │ │ ├── agent-base@4.3.0 deduped
+│ │ │ │ └── debug@3.1.0 deduped
+│ │ │ ├── lru-cache@5.1.1 deduped
+│ │ │ ├── mississippi@3.0.0 deduped
+│ │ │ ├─┬ node-fetch-npm@2.0.2
+│ │ │ │ ├─┬ encoding@0.1.12
+│ │ │ │ │ └─┬ iconv-lite@0.4.23
+│ │ │ │ │   └── safer-buffer@2.1.2 deduped
+│ │ │ │ ├── json-parse-better-errors@1.0.2 deduped
+│ │ │ │ └── safe-buffer@5.1.2 deduped
+│ │ │ ├── promise-retry@1.1.1 deduped
+│ │ │ ├─┬ socks-proxy-agent@4.0.2
+│ │ │ │ ├─┬ agent-base@4.2.1
+│ │ │ │ │ └── es6-promisify@5.0.0 deduped
+│ │ │ │ └─┬ socks@2.3.3
+│ │ │ │   ├── ip@1.1.5
+│ │ │ │   └── smart-buffer@4.1.0
+│ │ │ └── ssri@6.0.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── safe-buffer@5.2.0
+│ ├── npm-user-validate@1.0.0
+│ ├─┬ npmlog@4.1.2
+│ │ ├─┬ are-we-there-yet@1.1.4
+│ │ │ ├── delegates@1.0.0
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├── console-control-strings@1.1.0 deduped
+│ │ ├─┬ gauge@2.7.4
+│ │ │ ├── aproba@1.2.0
+│ │ │ ├── console-control-strings@1.1.0 deduped
+│ │ │ ├── has-unicode@2.0.1 deduped
+│ │ │ ├── object-assign@4.1.1 deduped
+│ │ │ ├── signal-exit@3.0.2 deduped
+│ │ │ ├─┬ string-width@1.0.2
+│ │ │ │ ├── code-point-at@1.1.0
+│ │ │ │ ├─┬ is-fullwidth-code-point@1.0.0
+│ │ │ │ │ └── number-is-nan@1.0.1
+│ │ │ │ └── strip-ansi@3.0.1 deduped
+│ │ │ ├── strip-ansi@3.0.1 deduped
+│ │ │ └─┬ wide-align@1.1.2
+│ │ │   └─┬ string-width@1.0.2
+│ │ │     ├── code-point-at@1.1.0 deduped
+│ │ │     ├── is-fullwidth-code-point@1.0.0 deduped
+│ │ │     └── strip-ansi@3.0.1 deduped
+│ │ └── set-blocking@2.0.0
+│ ├─┬ once@1.4.0
+│ │ └── wrappy@1.0.2 deduped
+│ ├── opener@1.5.1
+│ ├─┬ osenv@0.1.5
+│ │ ├── os-homedir@1.0.2
+│ │ └── os-tmpdir@1.0.2
+│ ├─┬ pacote@9.5.12
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── cacache@12.0.3 deduped
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── infer-owner@1.0.4 deduped
+│ │ ├── lru-cache@5.1.1 deduped
+│ │ ├── make-fetch-happen@5.0.2 deduped
+│ │ ├── minimatch@3.0.4 deduped
+│ │ ├─┬ minipass@2.9.0
+│ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ └── yallist@3.0.3 deduped
+│ │ ├── mississippi@3.0.0 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── normalize-package-data@2.5.0 deduped
+│ │ ├── npm-normalize-package-bin@1.0.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── npm-packlist@1.4.7 deduped
+│ │ ├── npm-pick-manifest@3.0.2 deduped
+│ │ ├── npm-registry-fetch@4.0.2 deduped
+│ │ ├── osenv@0.1.5 deduped
+│ │ ├── promise-inflight@1.0.1 deduped
+│ │ ├─┬ promise-retry@1.1.1
+│ │ │ ├── err-code@1.1.2
+│ │ │ └── retry@0.10.1
+│ │ ├─┬ protoduck@5.0.1
+│ │ │ └── genfun@5.0.0
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── ssri@6.0.1 deduped
+│ │ ├── tar@4.4.13 deduped
+│ │ ├── unique-filename@1.1.1 deduped
+│ │ └── which@1.3.1 deduped
+│ ├── path-is-inside@1.0.2
+│ ├── promise-inflight@1.0.1
+│ ├── qrcode-terminal@0.12.0
+│ ├─┬ query-string@6.8.2
+│ │ ├── decode-uri-component@0.2.0
+│ │ ├── split-on-first@1.1.0
+│ │ └── strict-uri-encode@2.0.0
+│ ├── qw@1.0.1
+│ ├─┬ read@1.0.7
+│ │ └── mute-stream@0.0.7
+│ ├─┬ read-cmd-shim@1.0.5
+│ │ └── graceful-fs@4.2.3 deduped
+│ ├─┬ read-installed@4.0.3
+│ │ ├── debuglog@1.0.1 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── readdir-scoped-modules@1.1.0 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── slide@1.1.6 deduped
+│ │ └── util-extend@1.0.3
+│ ├─┬ read-package-json@2.1.1
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── json-parse-better-errors@1.0.2 deduped
+│ │ ├── normalize-package-data@2.5.0 deduped
+│ │ └── npm-normalize-package-bin@1.0.1 deduped
+│ ├─┬ read-package-tree@5.3.1
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── readdir-scoped-modules@1.1.0 deduped
+│ │ └─┬ util-promisify@2.1.0
+│ │   └─┬ object.getownpropertydescriptors@2.0.3
+│ │     ├─┬ define-properties@1.1.3
+│ │     │ └── object-keys@1.0.12
+│ │     └─┬ es-abstract@1.12.0
+│ │       ├─┬ es-to-primitive@1.2.0
+│ │       │ ├── is-callable@1.1.4 deduped
+│ │       │ ├── is-date-object@1.0.1
+│ │       │ └─┬ is-symbol@1.0.2
+│ │       │   └── has-symbols@1.0.0
+│ │       ├── function-bind@1.1.1
+│ │       ├─┬ has@1.0.3
+│ │       │ └── function-bind@1.1.1 deduped
+│ │       ├── is-callable@1.1.4
+│ │       └─┬ is-regex@1.0.4
+│ │         └── has@1.0.3 deduped
+│ ├─┬ readable-stream@3.4.0
+│ │ ├── inherits@2.0.4 deduped
+│ │ ├─┬ string_decoder@1.2.0
+│ │ │ └── safe-buffer@5.1.2 deduped
+│ │ └── util-deprecate@1.0.2
+│ ├─┬ readdir-scoped-modules@1.1.0
+│ │ ├── debuglog@1.0.1 deduped
+│ │ ├── dezalgo@1.0.3 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ └── once@1.4.0 deduped
+│ ├─┬ request@2.88.0
+│ │ ├── aws-sign2@0.7.0
+│ │ ├── aws4@1.8.0
+│ │ ├── caseless@0.12.0
+│ │ ├─┬ combined-stream@1.0.6
+│ │ │ └── delayed-stream@1.0.0
+│ │ ├── extend@3.0.2
+│ │ ├── forever-agent@0.6.1
+│ │ ├─┬ form-data@2.3.2
+│ │ │ ├── asynckit@0.4.0
+│ │ │ ├── combined-stream@1.0.6 deduped
+│ │ │ └── mime-types@2.1.19 deduped
+│ │ ├─┬ har-validator@5.1.0
+│ │ │ ├─┬ ajv@5.5.2
+│ │ │ │ ├── co@4.6.0
+│ │ │ │ ├── fast-deep-equal@1.1.0
+│ │ │ │ ├── fast-json-stable-stringify@2.0.0
+│ │ │ │ └── json-schema-traverse@0.3.1
+│ │ │ └── har-schema@2.0.0
+│ │ ├─┬ http-signature@1.2.0
+│ │ │ ├── assert-plus@1.0.0
+│ │ │ ├─┬ jsprim@1.4.1
+│ │ │ │ ├── assert-plus@1.0.0 deduped
+│ │ │ │ ├── extsprintf@1.3.0
+│ │ │ │ ├── json-schema@0.2.3
+│ │ │ │ └─┬ verror@1.10.0
+│ │ │ │   ├── assert-plus@1.0.0 deduped
+│ │ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │ │   └── extsprintf@1.3.0 deduped
+│ │ │ └─┬ sshpk@1.14.2
+│ │ │   ├─┬ asn1@0.2.4
+│ │ │   │ └── safer-buffer@2.1.2 deduped
+│ │ │   ├── assert-plus@1.0.0 deduped
+│ │ │   ├─┬ bcrypt-pbkdf@1.0.2
+│ │ │   │ └── tweetnacl@0.14.5 deduped
+│ │ │   ├─┬ dashdash@1.14.1
+│ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │   ├─┬ ecc-jsbn@0.1.2
+│ │ │   │ ├── jsbn@0.1.1 deduped
+│ │ │   │ └── safer-buffer@2.1.2 deduped
+│ │ │   ├─┬ getpass@0.1.7
+│ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │   ├── jsbn@0.1.1
+│ │ │   ├── safer-buffer@2.1.2
+│ │ │   └── tweetnacl@0.14.5
+│ │ ├── is-typedarray@1.0.0
+│ │ ├── isstream@0.1.2
+│ │ ├── json-stringify-safe@5.0.1
+│ │ ├─┬ mime-types@2.1.19
+│ │ │ └── mime-db@1.35.0
+│ │ ├── oauth-sign@0.9.0
+│ │ ├── performance-now@2.1.0
+│ │ ├── qs@6.5.2
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ ├─┬ tough-cookie@2.4.3
+│ │ │ ├── psl@1.1.29
+│ │ │ └── punycode@1.4.1
+│ │ ├─┬ tunnel-agent@0.6.0
+│ │ │ └── safe-buffer@5.1.2 deduped
+│ │ └── uuid@3.3.3 deduped
+│ ├── retry@0.12.0
+│ ├─┬ rimraf@2.6.3
+│ │ └── glob@7.1.4 deduped
+│ ├── safe-buffer@5.1.2
+│ ├── semver@5.7.1
+│ ├─┬ sha@3.0.0
+│ │ └── graceful-fs@4.2.3 deduped
+│ ├── slide@1.1.6
+│ ├── sorted-object@2.0.1
+│ ├─┬ sorted-union-stream@2.1.3
+│ │ ├─┬ from2@1.3.0
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@1.1.14
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@0.0.1
+│ │ │   └── string_decoder@0.10.31
+│ │ └─┬ stream-iterate@1.2.0
+│ │   ├─┬ readable-stream@2.3.6
+│ │   │ ├── core-util-is@1.0.2 deduped
+│ │   │ ├── inherits@2.0.4 deduped
+│ │   │ ├── isarray@1.0.0 deduped
+│ │   │ ├── process-nextick-args@2.0.0 deduped
+│ │   │ ├── safe-buffer@5.1.2 deduped
+│ │   │ ├─┬ string_decoder@1.1.1
+│ │   │ │ └── safe-buffer@5.1.2 deduped
+│ │   │ └── util-deprecate@1.0.2 deduped
+│ │   └── stream-shift@1.0.0 deduped
+│ ├─┬ ssri@6.0.1
+│ │ └── figgy-pudding@3.5.1 deduped
+│ ├── stringify-package@1.0.1
+│ ├─┬ tar@4.4.13
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├─┬ fs-minipass@1.2.7
+│ │ │ └─┬ minipass@2.9.0
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   └── yallist@3.0.3 deduped
+│ │ ├─┬ minipass@2.9.0
+│ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ └── yallist@3.0.3 deduped
+│ │ ├─┬ minizlib@1.3.3
+│ │ │ └─┬ minipass@2.9.0
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   └── yallist@3.0.3 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ └── yallist@3.0.3 deduped
+│ ├── text-table@0.2.0
+│ ├── tiny-relative-date@1.3.0
+│ ├── uid-number@0.0.6
+│ ├── umask@1.1.0
+│ ├─┬ unique-filename@1.1.1
+│ │ └─┬ unique-slug@2.0.0
+│ │   └── imurmurhash@0.1.4 deduped
+│ ├── unpipe@1.0.0
+│ ├─┬ update-notifier@2.5.0
+│ │ ├─┬ boxen@1.3.0
+│ │ │ ├─┬ ansi-align@2.0.0
+│ │ │ │ └── string-width@2.1.1 deduped
+│ │ │ ├── camelcase@4.1.0
+│ │ │ ├── chalk@2.4.1 deduped
+│ │ │ ├── cli-boxes@1.0.0
+│ │ │ ├── string-width@2.1.1 deduped
+│ │ │ ├─┬ term-size@1.2.0
+│ │ │ │ └─┬ execa@0.7.0
+│ │ │ │   ├─┬ cross-spawn@5.1.0
+│ │ │ │   │ ├─┬ lru-cache@4.1.5
+│ │ │ │   │ │ ├── pseudomap@1.0.2
+│ │ │ │   │ │ └── yallist@2.1.2
+│ │ │ │   │ ├── shebang-command@1.2.0 deduped
+│ │ │ │   │ └── which@1.3.1 deduped
+│ │ │ │   ├── get-stream@3.0.0
+│ │ │ │   ├── is-stream@1.1.0 deduped
+│ │ │ │   ├── npm-run-path@2.0.2 deduped
+│ │ │ │   ├── p-finally@1.0.0 deduped
+│ │ │ │   ├── signal-exit@3.0.2 deduped
+│ │ │ │   └── strip-eof@1.0.0 deduped
+│ │ │ └─┬ widest-line@2.0.0
+│ │ │   └── string-width@2.1.1 deduped
+│ │ ├─┬ chalk@2.4.1
+│ │ │ ├─┬ ansi-styles@3.2.1
+│ │ │ │ └─┬ color-convert@1.9.1
+│ │ │ │   └── color-name@1.1.3
+│ │ │ ├── escape-string-regexp@1.0.5
+│ │ │ └─┬ supports-color@5.4.0
+│ │ │   └── has-flag@3.0.0
+│ │ ├─┬ configstore@3.1.2
+│ │ │ ├─┬ dot-prop@4.2.0
+│ │ │ │ └── is-obj@1.0.1
+│ │ │ ├── graceful-fs@4.2.3 deduped
+│ │ │ ├─┬ make-dir@1.3.0
+│ │ │ │ └── pify@3.0.0
+│ │ │ ├─┬ unique-string@1.0.0
+│ │ │ │ └── crypto-random-string@1.0.0
+│ │ │ ├── write-file-atomic@2.4.3 deduped
+│ │ │ └── xdg-basedir@3.0.0 deduped
+│ │ ├── import-lazy@2.1.0
+│ │ ├─┬ is-ci@1.1.0
+│ │ │ └── ci-info@1.6.0
+│ │ ├─┬ is-installed-globally@0.1.0
+│ │ │ ├─┬ global-dirs@0.1.1
+│ │ │ │ └── ini@1.3.5 deduped
+│ │ │ └─┬ is-path-inside@1.0.1
+│ │ │   └── path-is-inside@1.0.2 deduped
+│ │ ├── is-npm@1.0.0
+│ │ ├─┬ latest-version@3.1.0
+│ │ │ └─┬ package-json@4.0.1
+│ │ │   ├─┬ got@6.7.1
+│ │ │   │ ├─┬ create-error-class@3.0.2
+│ │ │   │ │ └── capture-stack-trace@1.0.0
+│ │ │   │ ├── duplexer3@0.1.4
+│ │ │   │ ├── get-stream@3.0.0
+│ │ │   │ ├── is-redirect@1.0.0
+│ │ │   │ ├── is-retry-allowed@1.1.0
+│ │ │   │ ├── is-stream@1.1.0 deduped
+│ │ │   │ ├── lowercase-keys@1.0.1
+│ │ │   │ ├── safe-buffer@5.1.2 deduped
+│ │ │   │ ├── timed-out@4.0.1
+│ │ │   │ ├── unzip-response@2.0.1
+│ │ │   │ └─┬ url-parse-lax@1.0.0
+│ │ │   │   └── prepend-http@1.0.4
+│ │ │   ├─┬ registry-auth-token@3.3.2
+│ │ │   │ ├─┬ rc@1.2.7
+│ │ │   │ │ ├── deep-extend@0.5.1
+│ │ │   │ │ ├── ini@1.3.5 deduped
+│ │ │   │ │ ├── minimist@1.2.0
+│ │ │   │ │ └── strip-json-comments@2.0.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ registry-url@3.1.0
+│ │ │   │ └── rc@1.2.7 deduped
+│ │ │   └── semver@5.7.1 deduped
+│ │ ├─┬ semver-diff@2.1.0
+│ │ │ └── semver@5.7.1 deduped
+│ │ └── xdg-basedir@3.0.0
+│ ├── uuid@3.3.3
+│ ├─┬ validate-npm-package-license@3.0.4
+│ │ ├─┬ spdx-correct@3.0.0
+│ │ │ ├── spdx-expression-parse@3.0.0 deduped
+│ │ │ └── spdx-license-ids@3.0.3
+│ │ └─┬ spdx-expression-parse@3.0.0
+│ │   ├── spdx-exceptions@2.1.0
+│ │   └── spdx-license-ids@3.0.3 deduped
+│ ├─┬ validate-npm-package-name@3.0.0
+│ │ └── builtins@1.0.3
+│ ├─┬ which@1.3.1
+│ │ └── isexe@2.0.0
+│ ├─┬ worker-farm@1.7.0
+│ │ └─┬ errno@0.1.7
+│ │   └── prr@1.0.1
+│ └─┬ write-file-atomic@2.4.3
+│   ├── graceful-fs@4.2.3 deduped
+│   ├── imurmurhash@0.1.4 deduped
+│   └── signal-exit@3.0.2 deduped
+└── yarn@1.22.0
+
+david@macs:~/sites/til(master⚡) » npm update -g
+david@macs:~/sites/til(master⚡) » npm list -g
+/Users/david/.nvm/versions/node/v10.16.3/lib
+├─┬ gitbook-cli@2.3.2
+│ ├── bash-color@0.0.4
+│ ├── commander@2.11.0
+│ ├─┬ fs-extra@3.0.1
+│ │ ├── graceful-fs@4.2.3
+│ │ ├─┬ jsonfile@3.0.1
+│ │ │ └── graceful-fs@4.2.3 deduped
+│ │ └── universalify@0.1.2
+│ ├── lodash@4.17.4
+│ ├─┬ npm@5.1.0
+│ │ ├── abbrev@1.1.0
+│ │ ├── ansi-regex@3.0.0
+│ │ ├── ansicolors@0.3.2
+│ │ ├── ansistyles@0.1.3
+│ │ ├── aproba@1.1.2
+│ │ ├── archy@1.0.0
+│ │ ├── bluebird@3.5.0
+│ │ ├─┬ cacache@9.2.9
+│ │ │ ├── bluebird@3.5.0 deduped
+│ │ │ ├── chownr@1.0.1 deduped
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├─┬ lru-cache@4.1.1
+│ │ │ │ ├── pseudomap@1.0.2
+│ │ │ │ └── yallist@2.1.2
+│ │ │ ├── mississippi@1.3.0 deduped
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├── move-concurrently@1.0.1 deduped
+│ │ │ ├── promise-inflight@1.0.1 deduped
+│ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ ├── ssri@4.1.6 deduped
+│ │ │ ├── unique-filename@1.1.0 deduped
+│ │ │ └── y18n@3.2.1
+│ │ ├── call-limit@1.1.0
+│ │ ├── chownr@1.0.1
+│ │ ├─┬ cmd-shim@2.0.2
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ └── mkdirp@0.5.1 deduped
+│ │ ├─┬ columnify@1.5.4
+│ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ └── ansi-regex@2.1.1
+│ │ │ └─┬ wcwidth@1.0.1
+│ │ │   └─┬ defaults@1.0.3
+│ │ │     └── clone@1.0.2
+│ │ ├─┬ config-chain@1.1.11
+│ │ │ ├── ini@1.3.4 deduped
+│ │ │ └── proto-list@1.2.4
+│ │ ├── debuglog@1.0.1
+│ │ ├── detect-indent@5.0.0
+│ │ ├─┬ dezalgo@1.0.3
+│ │ │ ├── asap@2.0.5
+│ │ │ └── wrappy@1.0.2 deduped
+│ │ ├── editor@1.0.0
+│ │ ├─┬ fs-vacuum@1.2.10
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── path-is-inside@1.0.2 deduped
+│ │ │ └── rimraf@2.6.1 deduped
+│ │ ├─┬ fs-write-stream-atomic@1.0.10
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── iferr@0.1.5 deduped
+│ │ │ ├── imurmurhash@0.1.4 deduped
+│ │ │ └── readable-stream@2.3.2 deduped
+│ │ ├─┬ fstream@1.0.11
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── inherits@2.0.3 deduped
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ └── rimraf@2.6.1 deduped
+│ │ ├─┬ fstream-npm@1.2.1
+│ │ │ ├─┬ fstream-ignore@1.0.5
+│ │ │ │ ├── fstream@1.0.11 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └─┬ minimatch@3.0.4
+│ │ │ │   └─┬ brace-expansion@1.1.8
+│ │ │ │     ├── balanced-match@1.0.0
+│ │ │ │     └── concat-map@0.0.1
+│ │ │ └── inherits@2.0.3 deduped
+│ │ ├─┬ glob@7.1.2
+│ │ │ ├── fs.realpath@1.0.0
+│ │ │ ├── inflight@1.0.6 deduped
+│ │ │ ├── inherits@2.0.3 deduped
+│ │ │ ├─┬ minimatch@3.0.4
+│ │ │ │ └─┬ brace-expansion@1.1.8
+│ │ │ │   ├── balanced-match@1.0.0
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ └── path-is-absolute@1.0.1
+│ │ ├── graceful-fs@4.1.11
+│ │ ├── has-unicode@2.0.1
+│ │ ├── hosted-git-info@2.5.0
+│ │ ├── iferr@0.1.5
+│ │ ├── imurmurhash@0.1.4
+│ │ ├─┬ inflight@1.0.6
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ └── wrappy@1.0.2 deduped
+│ │ ├── inherits@2.0.3
+│ │ ├── ini@1.3.4
+│ │ ├─┬ init-package-json@1.10.1
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ ├─┬ promzard@0.3.0
+│ │ │ │ └── read@1.0.7 deduped
+│ │ │ ├── read@1.0.7 deduped
+│ │ │ ├── read-package-json@2.0.9 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── validate-npm-package-license@3.0.1 deduped
+│ │ │ └── validate-npm-package-name@3.0.0 deduped
+│ │ ├─┬ JSONStream@1.3.1
+│ │ │ ├── jsonparse@1.3.1
+│ │ │ └── through@2.3.8
+│ │ ├── lazy-property@1.0.0
+│ │ ├── lockfile@1.0.3
+│ │ ├── lodash._baseindexof@3.1.0
+│ │ ├─┬ lodash._baseuniq@4.6.0
+│ │ │ ├── lodash._createset@4.0.3
+│ │ │ └── lodash._root@3.0.1
+│ │ ├── lodash._bindcallback@3.0.1
+│ │ ├── lodash._cacheindexof@3.0.2
+│ │ ├─┬ lodash._createcache@3.1.2
+│ │ │ └── lodash._getnative@3.9.1 deduped
+│ │ ├── lodash._getnative@3.9.1
+│ │ ├── lodash.clonedeep@4.5.0
+│ │ ├── lodash.restparam@3.6.1
+│ │ ├── lodash.union@4.6.0
+│ │ ├── lodash.uniq@4.5.0
+│ │ ├── lodash.without@4.4.0
+│ │ ├─┬ lru-cache@4.1.1
+│ │ │ ├── pseudomap@1.0.2
+│ │ │ └── yallist@2.1.2
+│ │ ├─┬ mississippi@1.3.0
+│ │ │ ├─┬ concat-stream@1.6.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── typedarray@0.0.6
+│ │ │ ├─┬ duplexify@3.5.0
+│ │ │ │ ├─┬ end-of-stream@1.0.0
+│ │ │ │ │ └─┬ once@1.3.3
+│ │ │ │ │   └── wrappy@1.0.2 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── stream-shift@1.0.0
+│ │ │ ├─┬ end-of-stream@1.4.0
+│ │ │ │ └── once@1.4.0 deduped
+│ │ │ ├─┬ flush-write-stream@1.0.2
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├─┬ from2@2.3.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├─┬ parallel-transform@1.1.0
+│ │ │ │ ├── cyclist@0.2.2
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├─┬ pump@1.0.2
+│ │ │ │ ├── end-of-stream@1.4.0 deduped
+│ │ │ │ └── once@1.4.0 deduped
+│ │ │ ├─┬ pumpify@1.3.5
+│ │ │ │ ├── duplexify@3.5.0 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └── pump@1.0.2 deduped
+│ │ │ ├─┬ stream-each@1.2.0
+│ │ │ │ ├── end-of-stream@1.4.0 deduped
+│ │ │ │ └── stream-shift@1.0.0
+│ │ │ └─┬ through2@2.0.3
+│ │ │   ├── readable-stream@2.3.2 deduped
+│ │ │   └── xtend@4.0.1
+│ │ ├─┬ mkdirp@0.5.1
+│ │ │ └── minimist@0.0.8
+│ │ ├─┬ move-concurrently@1.0.1
+│ │ │ ├── aproba@1.1.2 deduped
+│ │ │ ├─┬ copy-concurrently@1.0.3
+│ │ │ │ ├── aproba@1.1.2 deduped
+│ │ │ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ │ │ ├── iferr@0.1.5 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ │ └── run-queue@1.0.3 deduped
+│ │ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ └─┬ run-queue@1.0.3
+│ │ │   └── aproba@1.1.2 deduped
+│ │ ├─┬ node-gyp@3.6.2
+│ │ │ ├── fstream@1.0.11 deduped
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├─┬ minimatch@3.0.4
+│ │ │ │ └─┬ brace-expansion@1.1.8
+│ │ │ │   ├── balanced-match@1.0.0
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├─┬ nopt@3.0.6
+│ │ │ │ └── abbrev@1.1.0 deduped
+│ │ │ ├── npmlog@4.1.2 deduped
+│ │ │ ├── osenv@0.1.4 deduped
+│ │ │ ├── request@2.81.0 deduped
+│ │ │ ├── rimraf@2.6.1 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── tar@2.2.1 deduped
+│ │ │ └── which@1.2.14 deduped
+│ │ ├─┬ nopt@4.0.1
+│ │ │ ├── abbrev@1.1.0 deduped
+│ │ │ └── osenv@0.1.4 deduped
+│ │ ├─┬ normalize-package-data@2.4.0
+│ │ │ ├── hosted-git-info@2.5.0 deduped
+│ │ │ ├─┬ is-builtin-module@1.0.0
+│ │ │ │ └── builtin-modules@1.1.1
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ └── validate-npm-package-license@3.0.1 deduped
+│ │ ├── npm-cache-filename@1.0.2
+│ │ ├─┬ npm-install-checks@3.0.0
+│ │ │ └── semver@5.3.0 deduped
+│ │ ├─┬ npm-package-arg@5.1.2
+│ │ │ ├── hosted-git-info@2.5.0 deduped
+│ │ │ ├── osenv@0.1.4 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ └── validate-npm-package-name@3.0.0 deduped
+│ │ ├─┬ npm-registry-client@8.4.0
+│ │ │ ├─┬ concat-stream@1.6.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── typedarray@0.0.6
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── normalize-package-data@2.4.0 deduped
+│ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ ├── npmlog@4.1.2 deduped
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ ├── request@2.81.0 deduped
+│ │ │ ├── retry@0.10.1 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── slide@1.1.6 deduped
+│ │ │ └── ssri@4.1.6 deduped
+│ │ ├── npm-user-validate@1.0.0
+│ │ ├─┬ npmlog@4.1.2
+│ │ │ ├─┬ are-we-there-yet@1.1.4
+│ │ │ │ ├── delegates@1.0.0
+│ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ ├── console-control-strings@1.1.0
+│ │ │ ├─┬ gauge@2.7.4
+│ │ │ │ ├── aproba@1.1.2 deduped
+│ │ │ │ ├── console-control-strings@1.1.0 deduped
+│ │ │ │ ├── has-unicode@2.0.1 deduped
+│ │ │ │ ├── object-assign@4.1.1
+│ │ │ │ ├── signal-exit@3.0.2
+│ │ │ │ ├─┬ string-width@1.0.2
+│ │ │ │ │ ├── code-point-at@1.1.0
+│ │ │ │ │ ├─┬ is-fullwidth-code-point@1.0.0
+│ │ │ │ │ │ └── number-is-nan@1.0.1
+│ │ │ │ │ └── strip-ansi@3.0.1 deduped
+│ │ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ │ └── ansi-regex@2.1.1
+│ │ │ │ └─┬ wide-align@1.1.2
+│ │ │ │   └── string-width@1.0.2 deduped
+│ │ │ └── set-blocking@2.0.0
+│ │ ├─┬ once@1.4.0
+│ │ │ └── wrappy@1.0.2 deduped
+│ │ ├── opener@1.4.3
+│ │ ├─┬ osenv@0.1.4
+│ │ │ ├── os-homedir@1.0.2
+│ │ │ └── os-tmpdir@1.0.2
+│ │ ├─┬ pacote@2.7.38
+│ │ │ ├── bluebird@3.5.0 deduped
+│ │ │ ├── cacache@9.2.9 deduped
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── lru-cache@4.1.1 deduped
+│ │ │ ├─┬ make-fetch-happen@2.4.13
+│ │ │ │ ├─┬ agentkeepalive@3.3.0
+│ │ │ │ │ └─┬ humanize-ms@1.2.1
+│ │ │ │ │   └── ms@2.0.0
+│ │ │ │ ├── cacache@9.2.9 deduped
+│ │ │ │ ├── http-cache-semantics@3.7.3
+│ │ │ │ ├─┬ http-proxy-agent@2.0.0
+│ │ │ │ │ ├─┬ agent-base@4.1.0
+│ │ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │ │   └── es6-promise@4.1.1
+│ │ │ │ │ └─┬ debug@2.6.8
+│ │ │ │ │   └── ms@2.0.0
+│ │ │ │ ├─┬ https-proxy-agent@2.0.0
+│ │ │ │ │ ├─┬ agent-base@4.1.0
+│ │ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │ │   └── es6-promise@4.1.1
+│ │ │ │ │ └─┬ debug@2.6.8
+│ │ │ │ │   └── ms@2.0.0
+│ │ │ │ ├── lru-cache@4.1.1 deduped
+│ │ │ │ ├── mississippi@1.3.0 deduped
+│ │ │ │ ├─┬ node-fetch-npm@2.0.1
+│ │ │ │ │ ├─┬ encoding@0.1.12
+│ │ │ │ │ │ └── iconv-lite@0.4.18
+│ │ │ │ │ ├─┬ json-parse-helpfulerror@1.0.3
+│ │ │ │ │ │ └── jju@1.3.0
+│ │ │ │ │ └── safe-buffer@5.1.1 deduped
+│ │ │ │ ├── promise-retry@1.1.1 deduped
+│ │ │ │ ├─┬ socks-proxy-agent@3.0.0
+│ │ │ │ │ ├─┬ agent-base@4.1.0
+│ │ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │ │   └── es6-promise@4.1.1
+│ │ │ │ │ └─┬ socks@1.1.10
+│ │ │ │ │   ├── ip@1.1.5
+│ │ │ │ │   └── smart-buffer@1.1.15
+│ │ │ │ └── ssri@4.1.6 deduped
+│ │ │ ├─┬ minimatch@3.0.4
+│ │ │ │ └─┬ brace-expansion@1.1.8
+│ │ │ │   ├── balanced-match@1.0.0
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├── mississippi@1.3.0 deduped
+│ │ │ ├── normalize-package-data@2.4.0 deduped
+│ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ ├─┬ npm-pick-manifest@1.0.4
+│ │ │ │ ├── npm-package-arg@5.1.2 deduped
+│ │ │ │ └── semver@5.3.0 deduped
+│ │ │ ├── osenv@0.1.4 deduped
+│ │ │ ├── promise-inflight@1.0.1 deduped
+│ │ │ ├─┬ promise-retry@1.1.1
+│ │ │ │ ├── err-code@1.1.2
+│ │ │ │ └── retry@0.10.1 deduped
+│ │ │ ├─┬ protoduck@4.0.0
+│ │ │ │ └── genfun@4.0.1
+│ │ │ ├── safe-buffer@5.1.1 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── ssri@4.1.6 deduped
+│ │ │ ├─┬ tar-fs@1.15.3
+│ │ │ │ ├── chownr@1.0.1 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ ├─┬ pump@1.0.2
+│ │ │ │ │ ├─┬ end-of-stream@1.4.0
+│ │ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ └── tar-stream@1.5.4 deduped
+│ │ │ ├─┬ tar-stream@1.5.4
+│ │ │ │ ├─┬ bl@1.2.1
+│ │ │ │ │ └── readable-stream@2.3.2 deduped
+│ │ │ │ ├─┬ end-of-stream@1.4.0
+│ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ ├── readable-stream@2.3.2 deduped
+│ │ │ │ └── xtend@4.0.1
+│ │ │ ├── unique-filename@1.1.0 deduped
+│ │ │ └── which@1.2.14 deduped
+│ │ ├── path-is-inside@1.0.2
+│ │ ├── promise-inflight@1.0.1
+│ │ ├─┬ read@1.0.7
+│ │ │ └── mute-stream@0.0.7
+│ │ ├─┬ read-cmd-shim@1.0.1
+│ │ │ └── graceful-fs@4.1.11 deduped
+│ │ ├─┬ read-installed@4.0.3
+│ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├── read-package-json@2.0.9 deduped
+│ │ │ ├── readdir-scoped-modules@1.0.2 deduped
+│ │ │ ├── semver@5.3.0 deduped
+│ │ │ ├── slide@1.1.6 deduped
+│ │ │ └── util-extend@1.0.3
+│ │ ├─┬ read-package-json@2.0.9
+│ │ │ ├── glob@7.1.2 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ ├─┬ json-parse-helpfulerror@1.0.3
+│ │ │ │ └── jju@1.3.0
+│ │ │ └── normalize-package-data@2.4.0 deduped
+│ │ ├─┬ read-package-tree@5.1.6
+│ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ ├── once@1.4.0 deduped
+│ │ │ ├── read-package-json@2.0.9 deduped
+│ │ │ └── readdir-scoped-modules@1.0.2 deduped
+│ │ ├─┬ readable-stream@2.3.2
+│ │ │ ├── core-util-is@1.0.2
+│ │ │ ├── inherits@2.0.3 deduped
+│ │ │ ├── isarray@1.0.0
+│ │ │ ├── process-nextick-args@1.0.7
+│ │ │ ├── safe-buffer@5.1.1 deduped
+│ │ │ ├─┬ string_decoder@1.0.3
+│ │ │ │ └── safe-buffer@5.1.1 deduped
+│ │ │ └── util-deprecate@1.0.2
+│ │ ├─┬ readdir-scoped-modules@1.0.2
+│ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ └── once@1.4.0 deduped
+│ │ ├─┬ request@2.81.0
+│ │ │ ├── aws-sign2@0.6.0
+│ │ │ ├── aws4@1.6.0
+│ │ │ ├── caseless@0.12.0
+│ │ │ ├─┬ combined-stream@1.0.5
+│ │ │ │ └── delayed-stream@1.0.0
+│ │ │ ├── extend@3.0.1
+│ │ │ ├── forever-agent@0.6.1
+│ │ │ ├─┬ form-data@2.1.4
+│ │ │ │ ├── asynckit@0.4.0
+│ │ │ │ ├── combined-stream@1.0.5 deduped
+│ │ │ │ └── mime-types@2.1.15 deduped
+│ │ │ ├─┬ har-validator@4.2.1
+│ │ │ │ ├─┬ ajv@4.11.8
+│ │ │ │ │ ├── co@4.6.0
+│ │ │ │ │ └─┬ json-stable-stringify@1.0.1
+│ │ │ │ │   └── jsonify@0.0.0
+│ │ │ │ └── har-schema@1.0.5
+│ │ │ ├─┬ hawk@3.1.3
+│ │ │ │ ├─┬ boom@2.10.1
+│ │ │ │ │ └── hoek@2.16.3 deduped
+│ │ │ │ ├─┬ cryptiles@2.0.5
+│ │ │ │ │ └── boom@2.10.1 deduped
+│ │ │ │ ├── hoek@2.16.3
+│ │ │ │ └─┬ sntp@1.0.9
+│ │ │ │   └── hoek@2.16.3 deduped
+│ │ │ ├─┬ http-signature@1.1.1
+│ │ │ │ ├── assert-plus@0.2.0
+│ │ │ │ ├─┬ jsprim@1.4.0
+│ │ │ │ │ ├── assert-plus@1.0.0
+│ │ │ │ │ ├── extsprintf@1.0.2
+│ │ │ │ │ ├── json-schema@0.2.3
+│ │ │ │ │ └─┬ verror@1.3.6
+│ │ │ │ │   └── extsprintf@1.0.2 deduped
+│ │ │ │ └─┬ sshpk@1.13.1
+│ │ │ │   ├── asn1@0.2.3
+│ │ │ │   ├── assert-plus@1.0.0
+│ │ │ │   ├─┬ bcrypt-pbkdf@1.0.1
+│ │ │ │   │ └── tweetnacl@0.14.5 deduped
+│ │ │ │   ├─┬ dashdash@1.14.1
+│ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │   ├─┬ ecc-jsbn@0.1.1
+│ │ │ │   │ └── jsbn@0.1.1 deduped
+│ │ │ │   ├─┬ getpass@0.1.7
+│ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │   ├── jsbn@0.1.1
+│ │ │ │   └── tweetnacl@0.14.5
+│ │ │ ├── is-typedarray@1.0.0
+│ │ │ ├── isstream@0.1.2
+│ │ │ ├── json-stringify-safe@5.0.1
+│ │ │ ├─┬ mime-types@2.1.15
+│ │ │ │ └── mime-db@1.27.0
+│ │ │ ├── oauth-sign@0.8.2
+│ │ │ ├── performance-now@0.2.0
+│ │ │ ├── qs@6.4.0
+│ │ │ ├── safe-buffer@5.1.1 deduped
+│ │ │ ├── stringstream@0.0.5
+│ │ │ ├─┬ tough-cookie@2.3.2
+│ │ │ │ └── punycode@1.4.1
+│ │ │ ├─┬ tunnel-agent@0.6.0
+│ │ │ │ └── safe-buffer@5.1.1 deduped
+│ │ │ └── uuid@3.1.0 deduped
+│ │ ├── retry@0.10.1
+│ │ ├─┬ rimraf@2.6.1
+│ │ │ └── glob@7.1.2 deduped
+│ │ ├── safe-buffer@5.1.1
+│ │ ├── semver@5.3.0
+│ │ ├─┬ sha@2.0.1
+│ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ └── readable-stream@2.3.2 deduped
+│ │ ├── slide@1.1.6
+│ │ ├── sorted-object@2.0.1
+│ │ ├─┬ sorted-union-stream@2.1.3
+│ │ │ ├─┬ from2@1.3.0
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ └─┬ readable-stream@1.1.14
+│ │ │ │   ├── core-util-is@1.0.2
+│ │ │ │   ├── inherits@2.0.3 deduped
+│ │ │ │   ├── isarray@0.0.1
+│ │ │ │   └── string_decoder@0.10.31
+│ │ │ └─┬ stream-iterate@1.2.0
+│ │ │   ├── readable-stream@2.3.2 deduped
+│ │ │   └── stream-shift@1.0.0
+│ │ ├─┬ ssri@4.1.6
+│ │ │ └── safe-buffer@5.1.1 deduped
+│ │ ├─┬ strip-ansi@4.0.0
+│ │ │ └── ansi-regex@3.0.0
+│ │ ├─┬ tar@2.2.1
+│ │ │ ├─┬ block-stream@0.0.9
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── fstream@1.0.11 deduped
+│ │ │ └── inherits@2.0.3 deduped
+│ │ ├── text-table@0.2.0
+│ │ ├── uid-number@0.0.6
+│ │ ├── umask@1.1.0
+│ │ ├─┬ unique-filename@1.1.0
+│ │ │ └─┬ unique-slug@2.0.0
+│ │ │   └── imurmurhash@0.1.4 deduped
+│ │ ├── unpipe@1.0.0
+│ │ ├─┬ update-notifier@2.2.0
+│ │ │ ├─┬ boxen@1.1.0
+│ │ │ │ ├─┬ ansi-align@2.0.0
+│ │ │ │ │ └── string-width@2.1.0 deduped
+│ │ │ │ ├── camelcase@4.1.0
+│ │ │ │ ├── chalk@1.1.3 deduped
+│ │ │ │ ├── cli-boxes@1.0.0
+│ │ │ │ ├─┬ string-width@2.1.0
+│ │ │ │ │ ├── is-fullwidth-code-point@2.0.0
+│ │ │ │ │ └─┬ strip-ansi@4.0.0
+│ │ │ │ │   └── ansi-regex@3.0.0 deduped
+│ │ │ │ ├─┬ term-size@0.1.1
+│ │ │ │ │ └─┬ execa@0.4.0
+│ │ │ │ │   ├─┬ cross-spawn-async@2.2.5
+│ │ │ │ │   │ ├── lru-cache@4.1.1 deduped
+│ │ │ │ │   │ └── which@1.2.14 deduped
+│ │ │ │ │   ├── is-stream@1.1.0
+│ │ │ │ │   ├─┬ npm-run-path@1.0.0
+│ │ │ │ │   │ └── path-key@1.0.0 deduped
+│ │ │ │ │   ├── object-assign@4.1.1
+│ │ │ │ │   ├── path-key@1.0.0
+│ │ │ │ │   └── strip-eof@1.0.0
+│ │ │ │ └─┬ widest-line@1.0.0
+│ │ │ │   └─┬ string-width@1.0.2
+│ │ │ │     ├── code-point-at@1.1.0
+│ │ │ │     ├─┬ is-fullwidth-code-point@1.0.0
+│ │ │ │     │ └── number-is-nan@1.0.1
+│ │ │ │     └─┬ strip-ansi@3.0.1
+│ │ │ │       └── ansi-regex@2.1.1
+│ │ │ ├─┬ chalk@1.1.3
+│ │ │ │ ├── ansi-styles@2.2.1
+│ │ │ │ ├── escape-string-regexp@1.0.5
+│ │ │ │ ├─┬ has-ansi@2.0.0
+│ │ │ │ │ └── ansi-regex@2.1.1
+│ │ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ │ └── ansi-regex@2.1.1
+│ │ │ │ └── supports-color@2.0.0
+│ │ │ ├─┬ configstore@3.1.0
+│ │ │ │ ├─┬ dot-prop@4.1.1
+│ │ │ │ │ └── is-obj@1.0.1
+│ │ │ │ ├── graceful-fs@4.1.11 deduped
+│ │ │ │ ├─┬ make-dir@1.0.0
+│ │ │ │ │ └── pify@2.3.0
+│ │ │ │ ├─┬ unique-string@1.0.0
+│ │ │ │ │ └── crypto-random-string@1.0.0
+│ │ │ │ ├── write-file-atomic@2.1.0 deduped
+│ │ │ │ └── xdg-basedir@3.0.0 deduped
+│ │ │ ├── import-lazy@2.1.0
+│ │ │ ├── is-npm@1.0.0
+│ │ │ ├─┬ latest-version@3.1.0
+│ │ │ │ └─┬ package-json@4.0.1
+│ │ │ │   ├─┬ got@6.7.1
+│ │ │ │   │ ├─┬ create-error-class@3.0.2
+│ │ │ │   │ │ └── capture-stack-trace@1.0.0
+│ │ │ │   │ ├── duplexer3@0.1.4
+│ │ │ │   │ ├── get-stream@3.0.0
+│ │ │ │   │ ├── is-redirect@1.0.0
+│ │ │ │   │ ├── is-retry-allowed@1.1.0
+│ │ │ │   │ ├── is-stream@1.1.0
+│ │ │ │   │ ├── lowercase-keys@1.0.0
+│ │ │ │   │ ├── safe-buffer@5.1.1 deduped
+│ │ │ │   │ ├── timed-out@4.0.1
+│ │ │ │   │ ├── unzip-response@2.0.1
+│ │ │ │   │ └─┬ url-parse-lax@1.0.0
+│ │ │ │   │   └── prepend-http@1.0.4
+│ │ │ │   ├─┬ registry-auth-token@3.3.1
+│ │ │ │   │ ├─┬ rc@1.2.1
+│ │ │ │   │ │ ├── deep-extend@0.4.2
+│ │ │ │   │ │ ├── ini@1.3.4 deduped
+│ │ │ │   │ │ ├── minimist@1.2.0
+│ │ │ │   │ │ └── strip-json-comments@2.0.1
+│ │ │ │   │ └── safe-buffer@5.1.1 deduped
+│ │ │ │   ├─┬ registry-url@3.1.0
+│ │ │ │   │ └─┬ rc@1.2.1
+│ │ │ │   │   ├── deep-extend@0.4.2
+│ │ │ │   │   ├── ini@1.3.4 deduped
+│ │ │ │   │   ├── minimist@1.2.0
+│ │ │ │   │   └── strip-json-comments@2.0.1
+│ │ │ │   └── semver@5.3.0 deduped
+│ │ │ ├─┬ semver-diff@2.1.0
+│ │ │ │ └── semver@5.3.0 deduped
+│ │ │ └── xdg-basedir@3.0.0
+│ │ ├── uuid@3.1.0
+│ │ ├─┬ validate-npm-package-license@3.0.1
+│ │ │ ├─┬ spdx-correct@1.0.2
+│ │ │ │ └── spdx-license-ids@1.2.2
+│ │ │ └── spdx-expression-parse@1.0.4
+│ │ ├─┬ validate-npm-package-name@3.0.0
+│ │ │ └── builtins@1.0.3
+│ │ ├─┬ which@1.2.14
+│ │ │ └── isexe@2.0.0
+│ │ ├─┬ worker-farm@1.3.1
+│ │ │ ├─┬ errno@0.1.4
+│ │ │ │ └── prr@0.0.0
+│ │ │ └── xtend@4.0.1
+│ │ ├── wrappy@1.0.2
+│ │ └─┬ write-file-atomic@2.1.0
+│ │   ├── graceful-fs@4.1.11 deduped
+│ │   ├── imurmurhash@0.1.4 deduped
+│ │   └── slide@1.1.6 deduped
+│ ├─┬ npmi@1.0.1
+│ │ ├─┬ npm@2.15.12
+│ │ │ ├── abbrev@1.0.9
+│ │ │ ├── ansi@0.3.1
+│ │ │ ├── ansi-regex@2.0.0
+│ │ │ ├── ansicolors@0.3.2
+│ │ │ ├── ansistyles@0.1.3
+│ │ │ ├── archy@1.0.0
+│ │ │ ├─┬ async-some@1.0.2
+│ │ │ │ └── dezalgo@1.0.3 deduped
+│ │ │ ├─┬ block-stream@0.0.9
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── char-spinner@1.0.1
+│ │ │ ├── chmodr@1.0.2
+│ │ │ ├── chownr@1.0.1
+│ │ │ ├─┬ cmd-shim@2.0.2
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ └── mkdirp@0.5.1 deduped
+│ │ │ ├─┬ columnify@1.5.4
+│ │ │ │ ├── strip-ansi@3.0.1 deduped
+│ │ │ │ └─┬ wcwidth@1.0.0
+│ │ │ │   └─┬ defaults@1.0.3
+│ │ │ │     └── clone@1.0.2
+│ │ │ ├─┬ config-chain@1.1.10
+│ │ │ │ ├── ini@1.3.4 deduped
+│ │ │ │ └── proto-list@1.2.4
+│ │ │ ├─┬ dezalgo@1.0.3
+│ │ │ │ ├── asap@2.0.3
+│ │ │ │ └── wrappy@1.0.2 deduped
+│ │ │ ├── editor@1.0.0
+│ │ │ ├─┬ fs-vacuum@1.2.9
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── path-is-inside@1.0.1 deduped
+│ │ │ │ └── rimraf@2.5.4 deduped
+│ │ │ ├─┬ fs-write-stream-atomic@1.0.8
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── iferr@0.1.5
+│ │ │ │ ├── imurmurhash@0.1.4 deduped
+│ │ │ │ └── readable-stream@2.1.5 deduped
+│ │ │ ├─┬ fstream@1.0.10
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ └── rimraf@2.5.4 deduped
+│ │ │ ├─┬ fstream-npm@1.1.1
+│ │ │ │ ├─┬ fstream-ignore@1.0.5
+│ │ │ │ │ ├── fstream@1.0.10 deduped
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ └── minimatch@3.0.3 deduped
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── github-url-from-git@1.4.0
+│ │ │ ├── github-url-from-username-repo@1.0.2
+│ │ │ ├─┬ glob@7.0.6
+│ │ │ │ ├── fs.realpath@1.0.0
+│ │ │ │ ├── inflight@1.0.5 deduped
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ └── path-is-absolute@1.0.0
+│ │ │ ├── graceful-fs@4.1.6
+│ │ │ ├── hosted-git-info@2.1.5
+│ │ │ ├── imurmurhash@0.1.4
+│ │ │ ├─┬ inflight@1.0.5
+│ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ └── wrappy@1.0.2 deduped
+│ │ │ ├── inherits@2.0.3
+│ │ │ ├── ini@1.3.4
+│ │ │ ├─┬ init-package-json@1.9.4
+│ │ │ │ ├─┬ glob@6.0.4
+│ │ │ │ │ ├── inflight@1.0.5 deduped
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ │ └── path-is-absolute@1.0.0
+│ │ │ │ ├── npm-package-arg@4.1.0 deduped
+│ │ │ │ ├─┬ promzard@0.3.0
+│ │ │ │ │ └── read@1.0.7 deduped
+│ │ │ │ ├── read@1.0.7 deduped
+│ │ │ │ ├── read-package-json@2.0.4 deduped
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ ├── validate-npm-package-license@3.0.1 deduped
+│ │ │ │ └── validate-npm-package-name@2.2.2 deduped
+│ │ │ ├── lockfile@1.0.1
+│ │ │ ├─┬ lru-cache@4.0.1
+│ │ │ │ ├── pseudomap@1.0.2
+│ │ │ │ └── yallist@2.0.0
+│ │ │ ├─┬ minimatch@3.0.3
+│ │ │ │ └─┬ brace-expansion@1.1.6
+│ │ │ │   ├── balanced-match@0.4.2
+│ │ │ │   └── concat-map@0.0.1
+│ │ │ ├─┬ mkdirp@0.5.1
+│ │ │ │ └── minimist@0.0.8
+│ │ │ ├─┬ node-gyp@3.6.0
+│ │ │ │ ├── fstream@1.0.10 deduped
+│ │ │ │ ├── glob@7.0.6 deduped
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ │ ├── nopt@3.0.6 deduped
+│ │ │ │ ├── npmlog@2.0.4 deduped
+│ │ │ │ ├── osenv@0.1.3 deduped
+│ │ │ │ ├── request@2.74.0 deduped
+│ │ │ │ ├── rimraf@2.5.4 deduped
+│ │ │ │ ├── semver@5.3.0
+│ │ │ │ ├── tar@2.2.1 deduped
+│ │ │ │ └── which@1.2.11 deduped
+│ │ │ ├─┬ nopt@3.0.6
+│ │ │ │ └── abbrev@1.0.9 deduped
+│ │ │ ├── normalize-git-url@3.0.2
+│ │ │ ├─┬ normalize-package-data@2.3.5
+│ │ │ │ ├── hosted-git-info@2.1.5 deduped
+│ │ │ │ ├─┬ is-builtin-module@1.0.0
+│ │ │ │ │ └── builtin-modules@1.1.0
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ └── validate-npm-package-license@3.0.1 deduped
+│ │ │ ├── npm-cache-filename@1.0.2
+│ │ │ ├─┬ npm-install-checks@1.0.7
+│ │ │ │ ├── npmlog@2.0.4 deduped
+│ │ │ │ └── semver@5.1.0 deduped
+│ │ │ ├─┬ npm-package-arg@4.1.0
+│ │ │ │ ├── hosted-git-info@2.1.5 deduped
+│ │ │ │ └── semver@5.1.0 deduped
+│ │ │ ├─┬ npm-registry-client@7.2.1
+│ │ │ │ ├─┬ concat-stream@1.5.2
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ ├─┬ readable-stream@2.0.6
+│ │ │ │ │ │ ├── core-util-is@1.0.2
+│ │ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ │ ├── isarray@1.0.0
+│ │ │ │ │ │ ├── process-nextick-args@1.0.7
+│ │ │ │ │ │ ├── string_decoder@0.10.31
+│ │ │ │ │ │ └── util-deprecate@1.0.2
+│ │ │ │ │ └── typedarray@0.0.6
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── normalize-package-data@2.3.5 deduped
+│ │ │ │ ├── npm-package-arg@4.1.0 deduped
+│ │ │ │ ├── npmlog@2.0.4 deduped
+│ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ ├── request@2.74.0 deduped
+│ │ │ │ ├── retry@0.10.0
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ └── slide@1.1.6 deduped
+│ │ │ ├── npm-user-validate@0.1.5
+│ │ │ ├─┬ npmlog@2.0.4
+│ │ │ │ ├── ansi@0.3.1 deduped
+│ │ │ │ ├─┬ are-we-there-yet@1.1.2
+│ │ │ │ │ ├── delegates@1.0.0
+│ │ │ │ │ └── readable-stream@2.1.5 deduped
+│ │ │ │ └─┬ gauge@1.2.7
+│ │ │ │   ├── ansi@0.3.1 deduped
+│ │ │ │   ├── has-unicode@2.0.0
+│ │ │ │   ├─┬ lodash.pad@4.4.0
+│ │ │ │   │ ├── lodash._baseslice@4.0.0
+│ │ │ │   │ ├── lodash._basetostring@4.12.0
+│ │ │ │   │ └── lodash.tostring@4.1.4
+│ │ │ │   ├─┬ lodash.padend@4.5.0
+│ │ │ │   │ ├── lodash._baseslice@4.0.0 deduped
+│ │ │ │   │ ├── lodash._basetostring@4.12.0 deduped
+│ │ │ │   │ └── lodash.tostring@4.1.4 deduped
+│ │ │ │   └─┬ lodash.padstart@4.5.0
+│ │ │ │     ├── lodash._baseslice@4.0.0 deduped
+│ │ │ │     ├── lodash._basetostring@4.12.0 deduped
+│ │ │ │     └── lodash.tostring@4.1.4 deduped
+│ │ │ ├─┬ once@1.4.0
+│ │ │ │ └── wrappy@1.0.2 deduped
+│ │ │ ├── opener@1.4.1
+│ │ │ ├─┬ osenv@0.1.3
+│ │ │ │ ├── os-homedir@1.0.0
+│ │ │ │ └── os-tmpdir@1.0.1
+│ │ │ ├── path-is-inside@1.0.1
+│ │ │ ├─┬ read@1.0.7
+│ │ │ │ └── mute-stream@0.0.5
+│ │ │ ├─┬ read-installed@4.0.3
+│ │ │ │ ├── debuglog@1.0.1
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├── read-package-json@2.0.4 deduped
+│ │ │ │ ├─┬ readdir-scoped-modules@1.0.2
+│ │ │ │ │ ├── debuglog@1.0.1 deduped
+│ │ │ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ │ └── once@1.4.0 deduped
+│ │ │ │ ├── semver@5.1.0 deduped
+│ │ │ │ ├── slide@1.1.6 deduped
+│ │ │ │ └── util-extend@1.0.1
+│ │ │ ├─┬ read-package-json@2.0.4
+│ │ │ │ ├─┬ glob@6.0.4
+│ │ │ │ │ ├── inflight@1.0.5 deduped
+│ │ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ │ ├── minimatch@3.0.3 deduped
+│ │ │ │ │ ├── once@1.4.0 deduped
+│ │ │ │ │ └── path-is-absolute@1.0.0
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ ├─┬ json-parse-helpfulerror@1.0.3
+│ │ │ │ │ └── jju@1.3.0
+│ │ │ │ └── normalize-package-data@2.3.5 deduped
+│ │ │ ├─┬ readable-stream@2.1.5
+│ │ │ │ ├── buffer-shims@1.0.0
+│ │ │ │ ├── core-util-is@1.0.2
+│ │ │ │ ├── inherits@2.0.3 deduped
+│ │ │ │ ├── isarray@1.0.0
+│ │ │ │ ├── process-nextick-args@1.0.7
+│ │ │ │ ├── string_decoder@0.10.31
+│ │ │ │ └── util-deprecate@1.0.2
+│ │ │ ├─┬ realize-package-specifier@3.0.1
+│ │ │ │ ├── dezalgo@1.0.3 deduped
+│ │ │ │ └── npm-package-arg@4.1.0 deduped
+│ │ │ ├─┬ request@2.74.0
+│ │ │ │ ├── aws-sign2@0.6.0
+│ │ │ │ ├── aws4@1.4.1
+│ │ │ │ ├─┬ bl@1.1.2
+│ │ │ │ │ └─┬ readable-stream@2.0.6
+│ │ │ │ │   ├── core-util-is@1.0.2
+│ │ │ │ │   ├── inherits@2.0.3 deduped
+│ │ │ │ │   ├── isarray@1.0.0
+│ │ │ │ │   ├── process-nextick-args@1.0.7
+│ │ │ │ │   ├── string_decoder@0.10.31
+│ │ │ │ │   └── util-deprecate@1.0.2
+│ │ │ │ ├── caseless@0.11.0
+│ │ │ │ ├─┬ combined-stream@1.0.5
+│ │ │ │ │ └── delayed-stream@1.0.0
+│ │ │ │ ├── extend@3.0.0
+│ │ │ │ ├── forever-agent@0.6.1
+│ │ │ │ ├─┬ form-data@1.0.0-rc4
+│ │ │ │ │ ├── async@1.5.2
+│ │ │ │ │ ├── combined-stream@1.0.5 deduped
+│ │ │ │ │ └── mime-types@2.1.11 deduped
+│ │ │ │ ├─┬ har-validator@2.0.6
+│ │ │ │ │ ├─┬ chalk@1.1.3
+│ │ │ │ │ │ ├── ansi-styles@2.2.1
+│ │ │ │ │ │ ├── escape-string-regexp@1.0.5
+│ │ │ │ │ │ ├─┬ has-ansi@2.0.0
+│ │ │ │ │ │ │ └── ansi-regex@2.0.0 deduped
+│ │ │ │ │ │ ├── strip-ansi@3.0.1 deduped
+│ │ │ │ │ │ └── supports-color@2.0.0
+│ │ │ │ │ ├─┬ commander@2.9.0
+│ │ │ │ │ │ └── graceful-readlink@1.0.1
+│ │ │ │ │ ├─┬ is-my-json-valid@2.13.1
+│ │ │ │ │ │ ├── generate-function@2.0.0
+│ │ │ │ │ │ ├─┬ generate-object-property@1.2.0
+│ │ │ │ │ │ │ └── is-property@1.0.2
+│ │ │ │ │ │ ├── jsonpointer@2.0.0
+│ │ │ │ │ │ └── xtend@4.0.1
+│ │ │ │ │ └─┬ pinkie-promise@2.0.1
+│ │ │ │ │   └── pinkie@2.0.4
+│ │ │ │ ├─┬ hawk@3.1.3
+│ │ │ │ │ ├─┬ boom@2.10.1
+│ │ │ │ │ │ └── hoek@2.16.3 deduped
+│ │ │ │ │ ├─┬ cryptiles@2.0.5
+│ │ │ │ │ │ └── boom@2.10.1 deduped
+│ │ │ │ │ ├── hoek@2.16.3
+│ │ │ │ │ └─┬ sntp@1.0.9
+│ │ │ │ │   └── hoek@2.16.3 deduped
+│ │ │ │ ├─┬ http-signature@1.1.1
+│ │ │ │ │ ├── assert-plus@0.2.0
+│ │ │ │ │ ├─┬ jsprim@1.3.0
+│ │ │ │ │ │ ├── extsprintf@1.0.2
+│ │ │ │ │ │ ├── json-schema@0.2.2
+│ │ │ │ │ │ └─┬ verror@1.3.6
+│ │ │ │ │ │   └── extsprintf@1.0.2 deduped
+│ │ │ │ │ └─┬ sshpk@1.9.2
+│ │ │ │ │   ├── asn1@0.2.3
+│ │ │ │ │   ├── assert-plus@1.0.0
+│ │ │ │ │   ├─┬ dashdash@1.14.0
+│ │ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │ │   ├─┬ ecc-jsbn@0.1.1
+│ │ │ │ │   │ └── jsbn@0.1.0 deduped
+│ │ │ │ │   ├─┬ getpass@0.1.6
+│ │ │ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │ │ │   ├─┬ jodid25519@1.0.2
+│ │ │ │ │   │ └── jsbn@0.1.0 deduped
+│ │ │ │ │   ├── jsbn@0.1.0
+│ │ │ │ │   └── tweetnacl@0.13.3
+│ │ │ │ ├── is-typedarray@1.0.0
+│ │ │ │ ├── isstream@0.1.2
+│ │ │ │ ├── json-stringify-safe@5.0.1
+│ │ │ │ ├─┬ mime-types@2.1.11
+│ │ │ │ │ └── mime-db@1.23.0
+│ │ │ │ ├── node-uuid@1.4.7
+│ │ │ │ ├── oauth-sign@0.8.2
+│ │ │ │ ├── qs@6.2.1
+│ │ │ │ ├── stringstream@0.0.5
+│ │ │ │ ├── tough-cookie@2.3.1
+│ │ │ │ └── tunnel-agent@0.4.3
+│ │ │ ├── retry@0.10.0
+│ │ │ ├─┬ rimraf@2.5.4
+│ │ │ │ └── glob@7.0.6 deduped
+│ │ │ ├── semver@5.1.0
+│ │ │ ├─┬ sha@2.0.1
+│ │ │ │ ├── graceful-fs@4.1.6 deduped
+│ │ │ │ └─┬ readable-stream@2.0.2
+│ │ │ │   ├── core-util-is@1.0.1
+│ │ │ │   ├── inherits@2.0.3 deduped
+│ │ │ │   ├── isarray@0.0.1
+│ │ │ │   ├── process-nextick-args@1.0.3
+│ │ │ │   ├── string_decoder@0.10.31
+│ │ │ │   └── util-deprecate@1.0.1
+│ │ │ ├── slide@1.1.6
+│ │ │ ├── sorted-object@2.0.0
+│ │ │ ├── spdx-license-ids@1.2.2
+│ │ │ ├─┬ strip-ansi@3.0.1
+│ │ │ │ └── ansi-regex@2.0.0 deduped
+│ │ │ ├─┬ tar@2.2.1
+│ │ │ │ ├── block-stream@0.0.9 deduped
+│ │ │ │ ├── fstream@1.0.10 deduped
+│ │ │ │ └── inherits@2.0.3 deduped
+│ │ │ ├── text-table@0.2.0
+│ │ │ ├── uid-number@0.0.6
+│ │ │ ├── umask@1.1.0
+│ │ │ ├─┬ validate-npm-package-license@3.0.1
+│ │ │ │ ├─┬ spdx-correct@1.0.2
+│ │ │ │ │ └── spdx-license-ids@1.2.2 deduped
+│ │ │ │ └─┬ spdx-expression-parse@1.0.2
+│ │ │ │   ├── spdx-exceptions@1.0.4
+│ │ │ │   └── spdx-license-ids@1.2.2 deduped
+│ │ │ ├─┬ validate-npm-package-name@2.2.2
+│ │ │ │ └── builtins@0.0.7
+│ │ │ ├─┬ which@1.2.11
+│ │ │ │ └── isexe@1.1.2
+│ │ │ ├── wrappy@1.0.2
+│ │ │ └─┬ write-file-atomic@1.1.4
+│ │ │   ├── graceful-fs@4.1.6 deduped
+│ │ │   ├── imurmurhash@0.1.4 deduped
+│ │ │   └── slide@1.1.6 deduped
+│ │ └── semver@4.3.6
+│ ├─┬ optimist@0.6.1
+│ │ ├── minimist@0.0.10
+│ │ └── wordwrap@0.0.3
+│ ├── q@1.5.0
+│ ├── semver@5.3.0
+│ ├─┬ tmp@0.0.31
+│ │ └── os-tmpdir@1.0.2
+│ └─┬ user-home@2.0.0
+│   └── os-homedir@1.0.2
+├─┬ npm@6.13.7
+│ ├── abbrev@1.1.1
+│ ├── ansicolors@0.3.2
+│ ├── ansistyles@0.1.3
+│ ├── aproba@2.0.0
+│ ├── archy@1.0.0
+│ ├─┬ bin-links@1.1.7
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── cmd-shim@3.0.3 deduped
+│ │ ├── gentle-fs@2.3.0 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── npm-normalize-package-bin@1.0.1
+│ │ └── write-file-atomic@2.4.3 deduped
+│ ├── bluebird@3.5.5
+│ ├── byte-size@5.0.1
+│ ├─┬ cacache@12.0.3
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── infer-owner@1.0.4 deduped
+│ │ ├── lru-cache@5.1.1 deduped
+│ │ ├── mississippi@3.0.0 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── move-concurrently@1.0.1 deduped
+│ │ ├── promise-inflight@1.0.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── ssri@6.0.1 deduped
+│ │ ├── unique-filename@1.1.1 deduped
+│ │ └── y18n@4.0.0
+│ ├── call-limit@1.1.1
+│ ├── chownr@1.1.3
+│ ├── ci-info@2.0.0
+│ ├─┬ cli-columns@3.1.2
+│ │ ├─┬ string-width@2.1.1
+│ │ │ ├── is-fullwidth-code-point@2.0.0
+│ │ │ └─┬ strip-ansi@4.0.0
+│ │ │   └── ansi-regex@3.0.0
+│ │ └─┬ strip-ansi@3.0.1
+│ │   └── ansi-regex@2.1.1
+│ ├─┬ cli-table3@0.5.1
+│ │ ├── colors@1.3.3
+│ │ ├── object-assign@4.1.1
+│ │ └── string-width@2.1.1 deduped
+│ ├─┬ cmd-shim@3.0.3
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ └── mkdirp@0.5.1 deduped
+│ ├─┬ columnify@1.5.4
+│ │ ├── strip-ansi@3.0.1 deduped
+│ │ └─┬ wcwidth@1.0.1
+│ │   └─┬ defaults@1.0.3
+│ │     └── clone@1.0.4
+│ ├─┬ config-chain@1.1.12
+│ │ ├── ini@1.3.5 deduped
+│ │ └── proto-list@1.2.4
+│ ├── debuglog@1.0.1
+│ ├── detect-indent@5.0.0
+│ ├── detect-newline@2.1.0
+│ ├─┬ dezalgo@1.0.3
+│ │ ├── asap@2.0.6
+│ │ └── wrappy@1.0.2
+│ ├── editor@1.0.0
+│ ├── figgy-pudding@3.5.1
+│ ├── find-npm-prefix@1.0.2
+│ ├─┬ fs-vacuum@1.2.10
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── path-is-inside@1.0.2 deduped
+│ │ └── rimraf@2.6.3 deduped
+│ ├─┬ fs-write-stream-atomic@1.0.10
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── iferr@0.1.5
+│ │ ├── imurmurhash@0.1.4 deduped
+│ │ └─┬ readable-stream@2.3.6
+│ │   ├── core-util-is@1.0.2
+│ │   ├── inherits@2.0.4 deduped
+│ │   ├── isarray@1.0.0
+│ │   ├── process-nextick-args@2.0.0
+│ │   ├── safe-buffer@5.1.2 deduped
+│ │   ├─┬ string_decoder@1.1.1
+│ │   │ └── safe-buffer@5.1.2 deduped
+│ │   └── util-deprecate@1.0.2 deduped
+│ ├─┬ gentle-fs@2.3.0
+│ │ ├── aproba@1.2.0
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├── cmd-shim@3.0.3 deduped
+│ │ ├── fs-vacuum@1.2.10 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── iferr@0.1.5
+│ │ ├── infer-owner@1.0.4 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── path-is-inside@1.0.2 deduped
+│ │ ├── read-cmd-shim@1.0.5 deduped
+│ │ └── slide@1.1.6 deduped
+│ ├─┬ glob@7.1.4
+│ │ ├── fs.realpath@1.0.0
+│ │ ├── inflight@1.0.6 deduped
+│ │ ├── inherits@2.0.4 deduped
+│ │ ├─┬ minimatch@3.0.4
+│ │ │ └─┬ brace-expansion@1.1.11
+│ │ │   ├── balanced-match@1.0.0
+│ │ │   └── concat-map@0.0.1
+│ │ ├── once@1.4.0 deduped
+│ │ └── path-is-absolute@1.0.1
+│ ├── graceful-fs@4.2.3
+│ ├── has-unicode@2.0.1
+│ ├── hosted-git-info@2.8.5
+│ ├── iferr@1.0.2
+│ ├── imurmurhash@0.1.4
+│ ├── infer-owner@1.0.4
+│ ├─┬ inflight@1.0.6
+│ │ ├── once@1.4.0 deduped
+│ │ └── wrappy@1.0.2 deduped
+│ ├── inherits@2.0.4
+│ ├── ini@1.3.5
+│ ├─┬ init-package-json@1.10.3
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├─┬ promzard@0.3.0
+│ │ │ └── read@1.0.7 deduped
+│ │ ├── read@1.0.7 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── validate-npm-package-license@3.0.4 deduped
+│ │ └── validate-npm-package-name@3.0.0 deduped
+│ ├─┬ is-cidr@3.0.0
+│ │ └─┬ cidr-regex@2.0.10
+│ │   └── ip-regex@2.1.0
+│ ├── json-parse-better-errors@1.0.2
+│ ├─┬ JSONStream@1.3.5
+│ │ ├── jsonparse@1.3.1
+│ │ └── through@2.3.8
+│ ├── lazy-property@1.0.0
+│ ├─┬ libcipm@4.0.7
+│ │ ├── bin-links@1.1.7 deduped
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── find-npm-prefix@1.0.2 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── ini@1.3.5 deduped
+│ │ ├── lock-verify@2.1.0 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── npm-lifecycle@3.1.4 deduped
+│ │ ├── npm-logical-tree@1.2.1
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── pacote@9.5.12 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ └── worker-farm@1.7.0 deduped
+│ ├─┬ libnpm@3.0.1
+│ │ ├── bin-links@1.1.7 deduped
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── find-npm-prefix@1.0.2 deduped
+│ │ ├── libnpmaccess@3.0.2 deduped
+│ │ ├─┬ libnpmconfig@1.2.1
+│ │ │ ├── figgy-pudding@3.5.1 deduped
+│ │ │ ├─┬ find-up@3.0.0
+│ │ │ │ └─┬ locate-path@3.0.0
+│ │ │ │   ├─┬ p-locate@3.0.0
+│ │ │ │   │ └─┬ p-limit@2.2.0
+│ │ │ │   │   └── p-try@2.2.0
+│ │ │ │   └── path-exists@3.0.0
+│ │ │ └── ini@1.3.5 deduped
+│ │ ├── libnpmhook@5.0.3 deduped
+│ │ ├── libnpmorg@1.0.1 deduped
+│ │ ├─┬ libnpmpublish@1.1.2
+│ │ │ ├── aproba@2.0.0 deduped
+│ │ │ ├── figgy-pudding@3.5.1 deduped
+│ │ │ ├── get-stream@4.1.0 deduped
+│ │ │ ├── lodash.clonedeep@4.5.0 deduped
+│ │ │ ├── normalize-package-data@2.5.0 deduped
+│ │ │ ├── npm-package-arg@6.1.1 deduped
+│ │ │ ├── npm-registry-fetch@4.0.2 deduped
+│ │ │ ├── semver@5.7.1 deduped
+│ │ │ └── ssri@6.0.1 deduped
+│ │ ├── libnpmsearch@2.0.2 deduped
+│ │ ├── libnpmteam@1.0.2 deduped
+│ │ ├── lock-verify@2.1.0 deduped
+│ │ ├── npm-lifecycle@3.1.4 deduped
+│ │ ├── npm-logical-tree@1.2.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── npm-profile@4.0.2 deduped
+│ │ ├── npm-registry-fetch@4.0.2 deduped
+│ │ ├── npmlog@4.1.2 deduped
+│ │ ├── pacote@9.5.12 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ └── stringify-package@1.0.1 deduped
+│ ├─┬ libnpmaccess@3.0.2
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├─┬ get-stream@4.1.0
+│ │ │ └── pump@3.0.0 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmhook@5.0.3
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmorg@1.0.1
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmsearch@2.0.2
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpmteam@1.0.2
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ libnpx@10.2.2
+│ │ ├── dotenv@5.0.1
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ ├── update-notifier@2.5.0 deduped
+│ │ ├── which@1.3.1 deduped
+│ │ ├── y18n@4.0.0 deduped
+│ │ └─┬ yargs@11.1.1
+│ │   ├─┬ cliui@4.1.0
+│ │   │ ├── string-width@2.1.1 deduped
+│ │   │ ├─┬ strip-ansi@4.0.0
+│ │   │ │ └── ansi-regex@3.0.0
+│ │   │ └─┬ wrap-ansi@2.1.0
+│ │   │   ├─┬ string-width@1.0.2
+│ │   │   │ ├── code-point-at@1.1.0 deduped
+│ │   │   │ ├── is-fullwidth-code-point@1.0.0 deduped
+│ │   │   │ └── strip-ansi@3.0.1 deduped
+│ │   │   └── strip-ansi@3.0.1 deduped
+│ │   ├── decamelize@1.2.0
+│ │   ├─┬ find-up@2.1.0
+│ │   │ └─┬ locate-path@2.0.0
+│ │   │   ├─┬ p-locate@2.0.0
+│ │   │   │ └─┬ p-limit@1.2.0
+│ │   │   │   └── p-try@1.0.0
+│ │   │   └── path-exists@3.0.0 deduped
+│ │   ├── get-caller-file@1.0.3
+│ │   ├─┬ os-locale@3.1.0
+│ │   │ ├─┬ execa@1.0.0
+│ │   │ │ ├─┬ cross-spawn@6.0.5
+│ │   │ │ │ ├── nice-try@1.0.5
+│ │   │ │ │ ├── path-key@2.0.1 deduped
+│ │   │ │ │ ├── semver@5.7.1 deduped
+│ │   │ │ │ ├─┬ shebang-command@1.2.0
+│ │   │ │ │ │ └── shebang-regex@1.0.0
+│ │   │ │ │ └── which@1.3.1 deduped
+│ │   │ │ ├── get-stream@4.1.0 deduped
+│ │   │ │ ├── is-stream@1.1.0
+│ │   │ │ ├─┬ npm-run-path@2.0.2
+│ │   │ │ │ └── path-key@2.0.1
+│ │   │ │ ├── p-finally@1.0.0
+│ │   │ │ ├── signal-exit@3.0.2 deduped
+│ │   │ │ └── strip-eof@1.0.0
+│ │   │ ├─┬ lcid@2.0.0
+│ │   │ │ └── invert-kv@2.0.0
+│ │   │ └─┬ mem@4.3.0
+│ │   │   ├─┬ map-age-cleaner@0.1.3
+│ │   │   │ └── p-defer@1.0.0
+│ │   │   ├── mimic-fn@2.1.0
+│ │   │   └── p-is-promise@2.1.0
+│ │   ├── require-directory@2.1.1
+│ │   ├── require-main-filename@1.0.1
+│ │   ├── set-blocking@2.0.0 deduped
+│ │   ├── string-width@2.1.1 deduped
+│ │   ├── which-module@2.0.0
+│ │   ├── y18n@3.2.1
+│ │   └─┬ yargs-parser@9.0.2
+│ │     └── camelcase@4.1.0 deduped
+│ ├─┬ lock-verify@2.1.0
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── semver@5.7.1 deduped
+│ ├─┬ lockfile@1.0.4
+│ │ └── signal-exit@3.0.2
+│ ├── lodash._baseindexof@3.1.0
+│ ├─┬ lodash._baseuniq@4.6.0
+│ │ ├── lodash._createset@4.0.3
+│ │ └── lodash._root@3.0.1
+│ ├── lodash._bindcallback@3.0.1
+│ ├── lodash._cacheindexof@3.0.2
+│ ├─┬ lodash._createcache@3.1.2
+│ │ └── lodash._getnative@3.9.1 deduped
+│ ├── lodash._getnative@3.9.1
+│ ├── lodash.clonedeep@4.5.0
+│ ├── lodash.restparam@3.6.1
+│ ├── lodash.union@4.6.0
+│ ├── lodash.uniq@4.5.0
+│ ├── lodash.without@4.4.0
+│ ├─┬ lru-cache@5.1.1
+│ │ └── yallist@3.0.3
+│ ├── meant@1.0.1
+│ ├─┬ mississippi@3.0.0
+│ │ ├─┬ concat-stream@1.6.2
+│ │ │ ├── buffer-from@1.0.0
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ ├─┬ readable-stream@2.3.6
+│ │ │ │ ├── core-util-is@1.0.2 deduped
+│ │ │ │ ├── inherits@2.0.4 deduped
+│ │ │ │ ├── isarray@1.0.0 deduped
+│ │ │ │ ├── process-nextick-args@2.0.0 deduped
+│ │ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ │ ├─┬ string_decoder@1.1.1
+│ │ │ │ │ └── safe-buffer@5.1.2 deduped
+│ │ │ │ └── util-deprecate@1.0.2 deduped
+│ │ │ └── typedarray@0.0.6
+│ │ ├─┬ duplexify@3.6.0
+│ │ │ ├── end-of-stream@1.4.1 deduped
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ ├─┬ readable-stream@2.3.6
+│ │ │ │ ├── core-util-is@1.0.2 deduped
+│ │ │ │ ├── inherits@2.0.4 deduped
+│ │ │ │ ├── isarray@1.0.0 deduped
+│ │ │ │ ├── process-nextick-args@2.0.0 deduped
+│ │ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ │ ├─┬ string_decoder@1.1.1
+│ │ │ │ │ └── safe-buffer@5.1.2 deduped
+│ │ │ │ └── util-deprecate@1.0.2 deduped
+│ │ │ └── stream-shift@1.0.0
+│ │ ├─┬ end-of-stream@1.4.1
+│ │ │ └── once@1.4.0 deduped
+│ │ ├─┬ flush-write-stream@1.0.3
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├─┬ from2@2.3.0
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├─┬ parallel-transform@1.1.0
+│ │ │ ├── cyclist@0.2.2
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├─┬ pump@3.0.0
+│ │ │ ├── end-of-stream@1.4.1 deduped
+│ │ │ └── once@1.4.0 deduped
+│ │ ├─┬ pumpify@1.5.1
+│ │ │ ├── duplexify@3.6.0 deduped
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ pump@2.0.1
+│ │ │   ├── end-of-stream@1.4.1 deduped
+│ │ │   └── once@1.4.0 deduped
+│ │ ├─┬ stream-each@1.2.2
+│ │ │ ├── end-of-stream@1.4.1 deduped
+│ │ │ └── stream-shift@1.0.0 deduped
+│ │ └─┬ through2@2.0.3
+│ │   ├─┬ readable-stream@2.3.6
+│ │   │ ├── core-util-is@1.0.2 deduped
+│ │   │ ├── inherits@2.0.4 deduped
+│ │   │ ├── isarray@1.0.0 deduped
+│ │   │ ├── process-nextick-args@2.0.0 deduped
+│ │   │ ├── safe-buffer@5.1.2 deduped
+│ │   │ ├─┬ string_decoder@1.1.1
+│ │   │ │ └── safe-buffer@5.1.2 deduped
+│ │   │ └── util-deprecate@1.0.2 deduped
+│ │   └── xtend@4.0.1
+│ ├─┬ mkdirp@0.5.1
+│ │ └── minimist@0.0.8
+│ ├─┬ move-concurrently@1.0.1
+│ │ ├── aproba@1.2.0
+│ │ ├─┬ copy-concurrently@1.0.5
+│ │ │ ├── aproba@1.2.0
+│ │ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ │ ├── iferr@0.1.5
+│ │ │ ├── mkdirp@0.5.1 deduped
+│ │ │ ├── rimraf@2.6.3 deduped
+│ │ │ └── run-queue@1.0.3 deduped
+│ │ ├── fs-write-stream-atomic@1.0.10 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ └─┬ run-queue@1.0.3
+│ │   └── aproba@1.2.0
+│ ├─┬ node-gyp@5.0.7
+│ │ ├── env-paths@2.2.0
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── nopt@4.0.1 deduped
+│ │ ├── npmlog@4.1.2 deduped
+│ │ ├── request@2.88.0 deduped
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── tar@4.4.13 deduped
+│ │ └── which@1.3.1 deduped
+│ ├─┬ nopt@4.0.1
+│ │ ├── abbrev@1.1.1 deduped
+│ │ └── osenv@0.1.5 deduped
+│ ├─┬ normalize-package-data@2.5.0
+│ │ ├── hosted-git-info@2.8.5 deduped
+│ │ ├─┬ resolve@1.10.0
+│ │ │ └── path-parse@1.0.6
+│ │ ├── semver@5.7.1 deduped
+│ │ └── validate-npm-package-license@3.0.4 deduped
+│ ├─┬ npm-audit-report@1.3.2
+│ │ ├── cli-table3@0.5.1 deduped
+│ │ └── console-control-strings@1.1.0
+│ ├── npm-cache-filename@1.0.2
+│ ├─┬ npm-install-checks@3.0.2
+│ │ └── semver@5.7.1 deduped
+│ ├─┬ npm-lifecycle@3.1.4
+│ │ ├── byline@5.0.0
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── node-gyp@5.0.7 deduped
+│ │ ├── resolve-from@4.0.0
+│ │ ├── slide@1.1.6 deduped
+│ │ ├── uid-number@0.0.6 deduped
+│ │ ├── umask@1.1.0 deduped
+│ │ └── which@1.3.1 deduped
+│ ├─┬ npm-package-arg@6.1.1
+│ │ ├── hosted-git-info@2.8.5 deduped
+│ │ ├── osenv@0.1.5 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ └── validate-npm-package-name@3.0.0 deduped
+│ ├─┬ npm-packlist@1.4.7
+│ │ ├─┬ ignore-walk@3.0.3
+│ │ │ └── minimatch@3.0.4 deduped
+│ │ └─┬ npm-bundled@1.1.1
+│ │   └── npm-normalize-package-bin@1.0.1 deduped
+│ ├─┬ npm-pick-manifest@3.0.2
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── semver@5.7.1 deduped
+│ ├─┬ npm-profile@4.0.2
+│ │ ├── aproba@2.0.0 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ └── npm-registry-fetch@4.0.2 deduped
+│ ├─┬ npm-registry-fetch@4.0.2
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── JSONStream@1.3.5 deduped
+│ │ ├── lru-cache@5.1.1 deduped
+│ │ ├─┬ make-fetch-happen@5.0.2
+│ │ │ ├─┬ agentkeepalive@3.5.2
+│ │ │ │ └─┬ humanize-ms@1.2.1
+│ │ │ │   └── ms@2.1.1
+│ │ │ ├── cacache@12.0.3 deduped
+│ │ │ ├── http-cache-semantics@3.8.1
+│ │ │ ├─┬ http-proxy-agent@2.1.0
+│ │ │ │ ├─┬ agent-base@4.3.0
+│ │ │ │ │ └─┬ es6-promisify@5.0.0
+│ │ │ │ │   └── es6-promise@4.2.8
+│ │ │ │ └─┬ debug@3.1.0
+│ │ │ │   └── ms@2.0.0
+│ │ │ ├─┬ https-proxy-agent@2.2.4
+│ │ │ │ ├── agent-base@4.3.0 deduped
+│ │ │ │ └── debug@3.1.0 deduped
+│ │ │ ├── lru-cache@5.1.1 deduped
+│ │ │ ├── mississippi@3.0.0 deduped
+│ │ │ ├─┬ node-fetch-npm@2.0.2
+│ │ │ │ ├─┬ encoding@0.1.12
+│ │ │ │ │ └─┬ iconv-lite@0.4.23
+│ │ │ │ │   └── safer-buffer@2.1.2 deduped
+│ │ │ │ ├── json-parse-better-errors@1.0.2 deduped
+│ │ │ │ └── safe-buffer@5.1.2 deduped
+│ │ │ ├── promise-retry@1.1.1 deduped
+│ │ │ ├─┬ socks-proxy-agent@4.0.2
+│ │ │ │ ├─┬ agent-base@4.2.1
+│ │ │ │ │ └── es6-promisify@5.0.0 deduped
+│ │ │ │ └─┬ socks@2.3.3
+│ │ │ │   ├── ip@1.1.5
+│ │ │ │   └── smart-buffer@4.1.0
+│ │ │ └── ssri@6.0.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ └── safe-buffer@5.2.0
+│ ├── npm-user-validate@1.0.0
+│ ├─┬ npmlog@4.1.2
+│ │ ├─┬ are-we-there-yet@1.1.4
+│ │ │ ├── delegates@1.0.0
+│ │ │ └─┬ readable-stream@2.3.6
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@1.0.0 deduped
+│ │ │   ├── process-nextick-args@2.0.0 deduped
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ string_decoder@1.1.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   └── util-deprecate@1.0.2 deduped
+│ │ ├── console-control-strings@1.1.0 deduped
+│ │ ├─┬ gauge@2.7.4
+│ │ │ ├── aproba@1.2.0
+│ │ │ ├── console-control-strings@1.1.0 deduped
+│ │ │ ├── has-unicode@2.0.1 deduped
+│ │ │ ├── object-assign@4.1.1 deduped
+│ │ │ ├── signal-exit@3.0.2 deduped
+│ │ │ ├─┬ string-width@1.0.2
+│ │ │ │ ├── code-point-at@1.1.0
+│ │ │ │ ├─┬ is-fullwidth-code-point@1.0.0
+│ │ │ │ │ └── number-is-nan@1.0.1
+│ │ │ │ └── strip-ansi@3.0.1 deduped
+│ │ │ ├── strip-ansi@3.0.1 deduped
+│ │ │ └─┬ wide-align@1.1.2
+│ │ │   └─┬ string-width@1.0.2
+│ │ │     ├── code-point-at@1.1.0 deduped
+│ │ │     ├── is-fullwidth-code-point@1.0.0 deduped
+│ │ │     └── strip-ansi@3.0.1 deduped
+│ │ └── set-blocking@2.0.0
+│ ├─┬ once@1.4.0
+│ │ └── wrappy@1.0.2 deduped
+│ ├── opener@1.5.1
+│ ├─┬ osenv@0.1.5
+│ │ ├── os-homedir@1.0.2
+│ │ └── os-tmpdir@1.0.2
+│ ├─┬ pacote@9.5.12
+│ │ ├── bluebird@3.5.5 deduped
+│ │ ├── cacache@12.0.3 deduped
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├── figgy-pudding@3.5.1 deduped
+│ │ ├── get-stream@4.1.0 deduped
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── infer-owner@1.0.4 deduped
+│ │ ├── lru-cache@5.1.1 deduped
+│ │ ├── make-fetch-happen@5.0.2 deduped
+│ │ ├── minimatch@3.0.4 deduped
+│ │ ├─┬ minipass@2.9.0
+│ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ └── yallist@3.0.3 deduped
+│ │ ├── mississippi@3.0.0 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── normalize-package-data@2.5.0 deduped
+│ │ ├── npm-normalize-package-bin@1.0.1 deduped
+│ │ ├── npm-package-arg@6.1.1 deduped
+│ │ ├── npm-packlist@1.4.7 deduped
+│ │ ├── npm-pick-manifest@3.0.2 deduped
+│ │ ├── npm-registry-fetch@4.0.2 deduped
+│ │ ├── osenv@0.1.5 deduped
+│ │ ├── promise-inflight@1.0.1 deduped
+│ │ ├─┬ promise-retry@1.1.1
+│ │ │ ├── err-code@1.1.2
+│ │ │ └── retry@0.10.1
+│ │ ├─┬ protoduck@5.0.1
+│ │ │ └── genfun@5.0.0
+│ │ ├── rimraf@2.6.3 deduped
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── ssri@6.0.1 deduped
+│ │ ├── tar@4.4.13 deduped
+│ │ ├── unique-filename@1.1.1 deduped
+│ │ └── which@1.3.1 deduped
+│ ├── path-is-inside@1.0.2
+│ ├── promise-inflight@1.0.1
+│ ├── qrcode-terminal@0.12.0
+│ ├─┬ query-string@6.8.2
+│ │ ├── decode-uri-component@0.2.0
+│ │ ├── split-on-first@1.1.0
+│ │ └── strict-uri-encode@2.0.0
+│ ├── qw@1.0.1
+│ ├─┬ read@1.0.7
+│ │ └── mute-stream@0.0.7
+│ ├─┬ read-cmd-shim@1.0.5
+│ │ └── graceful-fs@4.2.3 deduped
+│ ├─┬ read-installed@4.0.3
+│ │ ├── debuglog@1.0.1 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── readdir-scoped-modules@1.1.0 deduped
+│ │ ├── semver@5.7.1 deduped
+│ │ ├── slide@1.1.6 deduped
+│ │ └── util-extend@1.0.3
+│ ├─┬ read-package-json@2.1.1
+│ │ ├── glob@7.1.4 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ ├── json-parse-better-errors@1.0.2 deduped
+│ │ ├── normalize-package-data@2.5.0 deduped
+│ │ └── npm-normalize-package-bin@1.0.1 deduped
+│ ├─┬ read-package-tree@5.3.1
+│ │ ├── read-package-json@2.1.1 deduped
+│ │ ├── readdir-scoped-modules@1.1.0 deduped
+│ │ └─┬ util-promisify@2.1.0
+│ │   └─┬ object.getownpropertydescriptors@2.0.3
+│ │     ├─┬ define-properties@1.1.3
+│ │     │ └── object-keys@1.0.12
+│ │     └─┬ es-abstract@1.12.0
+│ │       ├─┬ es-to-primitive@1.2.0
+│ │       │ ├── is-callable@1.1.4 deduped
+│ │       │ ├── is-date-object@1.0.1
+│ │       │ └─┬ is-symbol@1.0.2
+│ │       │   └── has-symbols@1.0.0
+│ │       ├── function-bind@1.1.1
+│ │       ├─┬ has@1.0.3
+│ │       │ └── function-bind@1.1.1 deduped
+│ │       ├── is-callable@1.1.4
+│ │       └─┬ is-regex@1.0.4
+│ │         └── has@1.0.3 deduped
+│ ├─┬ readable-stream@3.4.0
+│ │ ├── inherits@2.0.4 deduped
+│ │ ├─┬ string_decoder@1.2.0
+│ │ │ └── safe-buffer@5.1.2 deduped
+│ │ └── util-deprecate@1.0.2
+│ ├─┬ readdir-scoped-modules@1.1.0
+│ │ ├── debuglog@1.0.1 deduped
+│ │ ├── dezalgo@1.0.3 deduped
+│ │ ├── graceful-fs@4.2.3 deduped
+│ │ └── once@1.4.0 deduped
+│ ├─┬ request@2.88.0
+│ │ ├── aws-sign2@0.7.0
+│ │ ├── aws4@1.8.0
+│ │ ├── caseless@0.12.0
+│ │ ├─┬ combined-stream@1.0.6
+│ │ │ └── delayed-stream@1.0.0
+│ │ ├── extend@3.0.2
+│ │ ├── forever-agent@0.6.1
+│ │ ├─┬ form-data@2.3.2
+│ │ │ ├── asynckit@0.4.0
+│ │ │ ├── combined-stream@1.0.6 deduped
+│ │ │ └── mime-types@2.1.19 deduped
+│ │ ├─┬ har-validator@5.1.0
+│ │ │ ├─┬ ajv@5.5.2
+│ │ │ │ ├── co@4.6.0
+│ │ │ │ ├── fast-deep-equal@1.1.0
+│ │ │ │ ├── fast-json-stable-stringify@2.0.0
+│ │ │ │ └── json-schema-traverse@0.3.1
+│ │ │ └── har-schema@2.0.0
+│ │ ├─┬ http-signature@1.2.0
+│ │ │ ├── assert-plus@1.0.0
+│ │ │ ├─┬ jsprim@1.4.1
+│ │ │ │ ├── assert-plus@1.0.0 deduped
+│ │ │ │ ├── extsprintf@1.3.0
+│ │ │ │ ├── json-schema@0.2.3
+│ │ │ │ └─┬ verror@1.10.0
+│ │ │ │   ├── assert-plus@1.0.0 deduped
+│ │ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │ │   └── extsprintf@1.3.0 deduped
+│ │ │ └─┬ sshpk@1.14.2
+│ │ │   ├─┬ asn1@0.2.4
+│ │ │   │ └── safer-buffer@2.1.2 deduped
+│ │ │   ├── assert-plus@1.0.0 deduped
+│ │ │   ├─┬ bcrypt-pbkdf@1.0.2
+│ │ │   │ └── tweetnacl@0.14.5 deduped
+│ │ │   ├─┬ dashdash@1.14.1
+│ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │   ├─┬ ecc-jsbn@0.1.2
+│ │ │   │ ├── jsbn@0.1.1 deduped
+│ │ │   │ └── safer-buffer@2.1.2 deduped
+│ │ │   ├─┬ getpass@0.1.7
+│ │ │   │ └── assert-plus@1.0.0 deduped
+│ │ │   ├── jsbn@0.1.1
+│ │ │   ├── safer-buffer@2.1.2
+│ │ │   └── tweetnacl@0.14.5
+│ │ ├── is-typedarray@1.0.0
+│ │ ├── isstream@0.1.2
+│ │ ├── json-stringify-safe@5.0.1
+│ │ ├─┬ mime-types@2.1.19
+│ │ │ └── mime-db@1.35.0
+│ │ ├── oauth-sign@0.9.0
+│ │ ├── performance-now@2.1.0
+│ │ ├── qs@6.5.2
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ ├─┬ tough-cookie@2.4.3
+│ │ │ ├── psl@1.1.29
+│ │ │ └── punycode@1.4.1
+│ │ ├─┬ tunnel-agent@0.6.0
+│ │ │ └── safe-buffer@5.1.2 deduped
+│ │ └── uuid@3.3.3 deduped
+│ ├── retry@0.12.0
+│ ├─┬ rimraf@2.6.3
+│ │ └── glob@7.1.4 deduped
+│ ├── safe-buffer@5.1.2
+│ ├── semver@5.7.1
+│ ├─┬ sha@3.0.0
+│ │ └── graceful-fs@4.2.3 deduped
+│ ├── slide@1.1.6
+│ ├── sorted-object@2.0.1
+│ ├─┬ sorted-union-stream@2.1.3
+│ │ ├─┬ from2@1.3.0
+│ │ │ ├── inherits@2.0.4 deduped
+│ │ │ └─┬ readable-stream@1.1.14
+│ │ │   ├── core-util-is@1.0.2 deduped
+│ │ │   ├── inherits@2.0.4 deduped
+│ │ │   ├── isarray@0.0.1
+│ │ │   └── string_decoder@0.10.31
+│ │ └─┬ stream-iterate@1.2.0
+│ │   ├─┬ readable-stream@2.3.6
+│ │   │ ├── core-util-is@1.0.2 deduped
+│ │   │ ├── inherits@2.0.4 deduped
+│ │   │ ├── isarray@1.0.0 deduped
+│ │   │ ├── process-nextick-args@2.0.0 deduped
+│ │   │ ├── safe-buffer@5.1.2 deduped
+│ │   │ ├─┬ string_decoder@1.1.1
+│ │   │ │ └── safe-buffer@5.1.2 deduped
+│ │   │ └── util-deprecate@1.0.2 deduped
+│ │   └── stream-shift@1.0.0 deduped
+│ ├─┬ ssri@6.0.1
+│ │ └── figgy-pudding@3.5.1 deduped
+│ ├── stringify-package@1.0.1
+│ ├─┬ tar@4.4.13
+│ │ ├── chownr@1.1.3 deduped
+│ │ ├─┬ fs-minipass@1.2.7
+│ │ │ └─┬ minipass@2.9.0
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   └── yallist@3.0.3 deduped
+│ │ ├─┬ minipass@2.9.0
+│ │ │ ├── safe-buffer@5.1.2 deduped
+│ │ │ └── yallist@3.0.3 deduped
+│ │ ├─┬ minizlib@1.3.3
+│ │ │ └─┬ minipass@2.9.0
+│ │ │   ├── safe-buffer@5.1.2 deduped
+│ │ │   └── yallist@3.0.3 deduped
+│ │ ├── mkdirp@0.5.1 deduped
+│ │ ├── safe-buffer@5.1.2 deduped
+│ │ └── yallist@3.0.3 deduped
+│ ├── text-table@0.2.0
+│ ├── tiny-relative-date@1.3.0
+│ ├── uid-number@0.0.6
+│ ├── umask@1.1.0
+│ ├─┬ unique-filename@1.1.1
+│ │ └─┬ unique-slug@2.0.0
+│ │   └── imurmurhash@0.1.4 deduped
+│ ├── unpipe@1.0.0
+│ ├─┬ update-notifier@2.5.0
+│ │ ├─┬ boxen@1.3.0
+│ │ │ ├─┬ ansi-align@2.0.0
+│ │ │ │ └── string-width@2.1.1 deduped
+│ │ │ ├── camelcase@4.1.0
+│ │ │ ├── chalk@2.4.1 deduped
+│ │ │ ├── cli-boxes@1.0.0
+│ │ │ ├── string-width@2.1.1 deduped
+│ │ │ ├─┬ term-size@1.2.0
+│ │ │ │ └─┬ execa@0.7.0
+│ │ │ │   ├─┬ cross-spawn@5.1.0
+│ │ │ │   │ ├─┬ lru-cache@4.1.5
+│ │ │ │   │ │ ├── pseudomap@1.0.2
+│ │ │ │   │ │ └── yallist@2.1.2
+│ │ │ │   │ ├── shebang-command@1.2.0 deduped
+│ │ │ │   │ └── which@1.3.1 deduped
+│ │ │ │   ├── get-stream@3.0.0
+│ │ │ │   ├── is-stream@1.1.0 deduped
+│ │ │ │   ├── npm-run-path@2.0.2 deduped
+│ │ │ │   ├── p-finally@1.0.0 deduped
+│ │ │ │   ├── signal-exit@3.0.2 deduped
+│ │ │ │   └── strip-eof@1.0.0 deduped
+│ │ │ └─┬ widest-line@2.0.0
+│ │ │   └── string-width@2.1.1 deduped
+│ │ ├─┬ chalk@2.4.1
+│ │ │ ├─┬ ansi-styles@3.2.1
+│ │ │ │ └─┬ color-convert@1.9.1
+│ │ │ │   └── color-name@1.1.3
+│ │ │ ├── escape-string-regexp@1.0.5
+│ │ │ └─┬ supports-color@5.4.0
+│ │ │   └── has-flag@3.0.0
+│ │ ├─┬ configstore@3.1.2
+│ │ │ ├─┬ dot-prop@4.2.0
+│ │ │ │ └── is-obj@1.0.1
+│ │ │ ├── graceful-fs@4.2.3 deduped
+│ │ │ ├─┬ make-dir@1.3.0
+│ │ │ │ └── pify@3.0.0
+│ │ │ ├─┬ unique-string@1.0.0
+│ │ │ │ └── crypto-random-string@1.0.0
+│ │ │ ├── write-file-atomic@2.4.3 deduped
+│ │ │ └── xdg-basedir@3.0.0 deduped
+│ │ ├── import-lazy@2.1.0
+│ │ ├─┬ is-ci@1.1.0
+│ │ │ └── ci-info@1.6.0
+│ │ ├─┬ is-installed-globally@0.1.0
+│ │ │ ├─┬ global-dirs@0.1.1
+│ │ │ │ └── ini@1.3.5 deduped
+│ │ │ └─┬ is-path-inside@1.0.1
+│ │ │   └── path-is-inside@1.0.2 deduped
+│ │ ├── is-npm@1.0.0
+│ │ ├─┬ latest-version@3.1.0
+│ │ │ └─┬ package-json@4.0.1
+│ │ │   ├─┬ got@6.7.1
+│ │ │   │ ├─┬ create-error-class@3.0.2
+│ │ │   │ │ └── capture-stack-trace@1.0.0
+│ │ │   │ ├── duplexer3@0.1.4
+│ │ │   │ ├── get-stream@3.0.0
+│ │ │   │ ├── is-redirect@1.0.0
+│ │ │   │ ├── is-retry-allowed@1.1.0
+│ │ │   │ ├── is-stream@1.1.0 deduped
+│ │ │   │ ├── lowercase-keys@1.0.1
+│ │ │   │ ├── safe-buffer@5.1.2 deduped
+│ │ │   │ ├── timed-out@4.0.1
+│ │ │   │ ├── unzip-response@2.0.1
+│ │ │   │ └─┬ url-parse-lax@1.0.0
+│ │ │   │   └── prepend-http@1.0.4
+│ │ │   ├─┬ registry-auth-token@3.3.2
+│ │ │   │ ├─┬ rc@1.2.7
+│ │ │   │ │ ├── deep-extend@0.5.1
+│ │ │   │ │ ├── ini@1.3.5 deduped
+│ │ │   │ │ ├── minimist@1.2.0
+│ │ │   │ │ └── strip-json-comments@2.0.1
+│ │ │   │ └── safe-buffer@5.1.2 deduped
+│ │ │   ├─┬ registry-url@3.1.0
+│ │ │   │ └── rc@1.2.7 deduped
+│ │ │   └── semver@5.7.1 deduped
+│ │ ├─┬ semver-diff@2.1.0
+│ │ │ └── semver@5.7.1 deduped
+│ │ └── xdg-basedir@3.0.0
+│ ├── uuid@3.3.3
+│ ├─┬ validate-npm-package-license@3.0.4
+│ │ ├─┬ spdx-correct@3.0.0
+│ │ │ ├── spdx-expression-parse@3.0.0 deduped
+│ │ │ └── spdx-license-ids@3.0.3
+│ │ └─┬ spdx-expression-parse@3.0.0
+│ │   ├── spdx-exceptions@2.1.0
+│ │   └── spdx-license-ids@3.0.3 deduped
+│ ├─┬ validate-npm-package-name@3.0.0
+│ │ └── builtins@1.0.3
+│ ├─┬ which@1.3.1
+│ │ └── isexe@2.0.0
+│ ├─┬ worker-farm@1.7.0
+│ │ └─┬ errno@0.1.7
+│ │   └── prr@1.0.1
+│ └─┬ write-file-atomic@2.4.3
+│   ├── graceful-fs@4.2.3 deduped
+│   ├── imurmurhash@0.1.4 deduped
+│   └── signal-exit@3.0.2 deduped
+└── yarn@1.22.0
+
+david@macs:~/sites/til(master⚡) » 
+```

+ 14 - 0
docs/waf/rails.md

@@ -0,0 +1,14 @@
+# Rails  
+
+- [http://rubyonrails.org/](http://rubyonrails.org/)
+- [https://github.com/rails/rails](https://github.com/rails/rails)
+
+January 2020:
+[5.2.4 Release Notes](https://github.com/rails/rails/releases/tag/v5.2.4.1)
+
+
+August 2017:
+```
+/// fix issue with mysql2 adapter
+sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib /usr/local/lib/libmysqlclient.18.dylib
+```

+ 557 - 0
docs/waf/react.md

@@ -0,0 +1,557 @@
+# ReactJS
+
+* [https://reactjs.org/docs/](https://reactjs.org/docs/)
+* [https://github.com/facebook/react/](https://github.com/facebook/react/)
+* [https://github.com/facebook/react](https://github.com/facebook/react)
+* [http://facebook.github.io/react-native/docs/](http://facebook.github.io/react-native/docs/)
+* [https://github.com/reactjs/redux](https://github.com/reactjs/redux)
+* [https://github.com/reactjs/react-redux](https://github.com/reactjs/react-redux)
+* [https://github.com/facebook/react/tree/master/packages/react-dom](https://github.com/facebook/react/tree/master/packages/react-dom)
+* [https://github.com/ReactTraining/react-router](https://github.com/ReactTraining/react-router)
+
+
+##### Boilerplates
+* [https://github.com/mikechabot/react-boilerplate](https://github.com/mikechabot/react-boilerplate)
+* [https://github.com/kriasoft/react-starter-kit](https://github.com/kriasoft/react-starter-kit)
+* [https://github.com/react-boilerplate/react-boilerplate](https://github.com/react-boilerplate/react-boilerplate)
+
+```
+#### notes ####
+///
+///
+//
+```
+
+---
+
+* source - [https://github.com/simoneas02/react-cheatsheet](https://github.com/simoneas02/react-cheatsheet)
+## 🌈 React Cheat Sheet
+
+> A simple cheat sheet for facilitate the process in the workshops and event about React. Let me know if you see any problem, I'll love a pull request for improve this document.
+
+### Table of contents
+
+- [x] [Installation](#installation)
+- [x] [No configuration](#no-configuration)
+- [x] [ReactDOM](#reactdom)
+- [x] [Functional Stateless Component](#functional-stateless-component)
+- [x] [Class Component](#class-component)
+- [x] [Composition](#composition)
+- [x] [Module component](#module-component)
+- [x] [Hot Module Replacement](#hot-module-replacement)
+- [x] [Props](#props)
+- [x] [State](#state)
+- [x] [Methods and Events](#methods-and-events)
+- [x] [State manipulation](#state-manipulation)
+- [x] [Bindings](#bindings)
+- [ ] [Refs](#refs)
+- [ ] [Keys](#keys)
+- [ ] [Component Lifecycle](#component-lifecycle)
+- [ ] [Inline Styles](#inline-styles)
+- [ ] [React Router](#react-router)
+- [ ] [Storybook](#storybook)
+- [ ] [Tests](#tests)
+- [ ] [a11y](#a11y)
+- [ ] [API comunication](#api-comunication)
+- [ ] [Flux](#flux)
+- [ ] [Redux](#redux)
+- [ ] [MobX](#mobx)
+- [ ] [Best Practices](#best-practices)
+- [ ] [Concepts](#Concepts)
+    - [ ] [Immutable](#immutable)
+    - [ ] [Functionnal programing](#functionnal-programing)
+    - [ ] [Virtual Dom](#virtual-dom)
+- [x] [ES6](#es6)
+    - [x] [Arrow Functions](#arrow-functions)
+        - [x] [Syntax](#syntax)
+        - [x] [Advanced Syntax](#advanced-syntax)
+    - [x] [Spread Operations](#spread-operations)
+        - [x] [Spread in array literals](#spread-in-array-literals)
+        - [x] [Spread in object literals](#spread-in-object-literals)
+
+---
+
+## Installation
+
+* Add the tags in your HTML
+    ```
+    <script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
+    <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
+    ```
+* Run this scripts in your terminal
+    ```
+    $ npm install react react-dom
+    ```
+
+ **[⬆ back to top](#table-of-contents)**
+---
+
+## No configuration
+
+Just start with React no configuration (run the scripts bellow in your terminal)
+* Install the React
+    ```
+    $ npm install -g create-react-app
+    ```
+* Create your application (change `myApp` to your application name)
+    ```
+    $ create-react-app myApp
+    ```
+* Go to the application folder and install the dependencies
+    ```
+    $ cd myApp
+    $ npm install
+    ```
+* Start your application
+    ```
+    $ npm start
+    ```
+* Go to the browser by `URL` bellow and see your beautiful application   
+    - [localhost:8080](http://localhost:8080)
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## ReactDOM
+
+```js
+import React, { Component } from 'react';
+import ReactDOM from 'react-dom';
+
+ReactDOM.render( <h1>Hello React Ladies</h1>, document.getElementById('root') );
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## Functional Stateless Component
+
+```js
+import React from 'react';
+
+const Button = () =>
+    <button> Apply</button>
+
+export default Button;
+```
+
+```js
+import React from 'react';
+
+const Button = ({ onClick, className = 'button', children  }) =>
+    <button
+        onClick={ onClick }
+        className={ className }
+        type='button'
+    >
+        { children }
+    </button>
+
+export default Button;
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## Class Component
+
+```js
+import React, { Component } from 'react';
+
+class MyComponent extends Component {
+    render() {
+        return (
+            <div className="main">
+                <h1>Helo Devas</h1>
+            </div>
+        );
+    }
+}
+
+export default MyComponent;
+```
+
+```js
+import React, { Component } from 'react';
+
+class MyComponent () extends Compnent {
+    constructor ( props ) {
+    super(props);
+    this.state = { message: 'Helo Devas' }
+    };
+
+    render() {
+        return (
+            <div className="main">
+                <h1>{ this.state.message }</h1>
+            </div>
+        );
+    }
+}
+
+export default MyComponent;
+
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## Composition
+
+```js
+import React, { Component } from 'react';
+import ReactDOM from 'react-dom';
+
+class Love extends Component {
+    render() {
+        return (
+            <div clssName="love">
+                <h1>My love</h1>
+            </div>
+        );
+    }
+}
+
+class LoveList extends Component {
+    render() {
+        return (
+            <div>
+                <Love />
+                <Love />
+                <Love />
+                <Love />
+            </>
+        );
+    }
+}
+
+ReactDOM.render(
+    <Love />,
+    document.getElementById(´root´)
+);
+
+**[⬆ back to top](#table-of-contents)**
+```
+
+## Module component
+
+```js
+//App.js
+import React, { Component } from 'react';
+
+class App extends Component {
+    render() {
+        return (
+            <div className="app">
+                <p>My App</p>
+            </div>
+        );
+    }
+}
+
+export default App
+```
+
+```js
+//Index.js
+import React, { Component } from 'react';
+import ReactDOM from 'react-dom';
+import App from './App.js';
+
+class Index extends Component {
+    render() {
+        return (
+            <div className="app">
+                <App />
+            </div>
+        );
+    }
+}
+
+
+ReactDOM.render (
+    <Index />,
+    document.getElementById('root')
+);
+
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## Hot Module Replacement
+* Retain application state which is lost during a full reload.
+* Save valuable development time by only updating what's changed.
+* Tweak styling faster -- almost comparable to changing styles in the browser's debugger.
+
+```js
+import React, { Component } from 'react';
+import ReactDOM from 'react-dom';
+import MyComponent from './MyComponent';
+
+ReactDOM.render( <MyComponent />, document.getElementById('root') );
+
+if (module.hot) {
+    module.hot.accept();
+}
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## Props
+
+```js
+import React, { Component } from 'react';
+
+class App extends Component {
+    render() {
+        return (
+            <div className="app">
+                <p>My App {this.props.name}</p>
+            </div>
+        );
+    }
+}
+
+class Index extends Component {
+    render() {
+        return (
+            <div className="app">
+                <App name="Simone"/>
+            </div>
+        );
+    }
+}
+
+export default Index;
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## State
+
+```js
+import React, { Component } from 'react';
+
+class App extends Component {
+    constructor(props) {
+        super(props);
+        this.state = {messages: 0};
+    }
+
+    render() {
+        return (
+            <div className="app">
+                <p>My messages: {this.state.messages}</p>
+            </div>
+        );
+    }
+}
+
+export default App;
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## Methods and Events
+
+```js
+import React, { Component } from 'react';
+
+class App extends Component {
+
+    escreve() {
+      console.log("Eu te amo");
+    }
+
+    render() {
+        return (
+            <div className="app">
+                <button onClick={this.escreve}>save</button>
+            </div>
+        );
+    }
+}
+
+export default App;
+```
+
+**[⬆ back to top](#table-of-contents)**
+---
+
+## State manipulation
+
+```js
+import React, { Component } from 'react';
+
+class App extends Component {
+    constructor() {
+        super();
+        this.state = { like: 0 };
+    }
+
+    isLiked = () => {
+      this.setState({ like: this.state.like + 1});
+    }
+
+    render() {
+        return (
+            <div className="app">
+                <button onClick={ this.isLiked }>{ this.state.like }</button>
+            </div>
+        );
+    }
+}
+
+export default App;
+```
+
+```js
+import React, { Component } from 'react';
+
+class App extends Component {
+    constructor() {
+        super();
+        this.state = { messages: ['JS', 'React'] };
+    }
+
+    addMessages = () => {
+        const updateMessages = [...this.state.messages, 'Polymer']
+        this.setState({ messages: [...updateMessages] })
+    }
+
+    render() {
+        return (
+            <div className="app">
+                <button onClick={this.addMessages}>add</button>
+                {console.log(this.state.messages) /* ['JS', 'React', 'Polymer'] */}
+            </div>
+        );
+    }
+}
+
+export default App;
+```
+
+
+**[⬆ back to top](#table-of-contents)**
+---
+d
+## Bindings
+
+```js
+import React, { Component } from 'react';
+
+class MyComponent extends Component {
+    constructor () {
+    super();
+
+    this.state = { list: list };
+
+    this.doSomethingElse = this.doSomethingElse.bind(this);
+    };
+
+    doSomething = () => {
+        // do something
+        /* if don't have a parameter, you can use arrow function
+           and don't need to use bind */
+    }
+
+    doSomethingElse ( itemId ) {
+        // do something else
+    }
+
+    render() {
+        return (
+            <div className="main">
+                {this.state.list.map( item =>
+                ...
+                    <button
+                        onClick={ this.doSomething }
+                        type="button"
+                    >
+                        Some Thing
+                    </button>
+
+                    <button
+                        onClick={ () => this.doSomethingElse( item.objectID ) }
+                        type="button"
+                    >
+                        Some Thing Else
+                    </button>
+                ...
+                )}
+            </div>
+        );
+    }
+}
+
+export default MyComponent;
+```
+
+---
+
+# ES6
+
+## Arrow Functions
+
+### Syntax
+
+  #### Basic syntax
+    ```js
+    ( param1, param2, ..., paramN ) => { statements }
+
+    ( param1, param2, ..., paramN ) =>  expression
+
+    ( singleParam ) => { statements }
+
+    singleParam => { statements }
+
+    () => { statements }
+    ```
+  #### Advanced Syntax
+    ```js
+    params => ({ foo: bar }) /* return an object literal expression */
+
+    ( param1, param2, ...ladies ) =>  { statements } /* rest parameters */
+
+    ( language = JS, ladies, ..., framework = React ) => { statements } /* default parameters */
+
+    const sum = ( [num1, num2] = [1, 2], { x: num3 } = { x : num1 + num2 } ) => num1 + num2 + num3  /*  destructuring within the parameter list */
+    sum() /* 6 */
+    ```
+
+---
+
+## Spread Operations
+
+### Spread in array literals
+```js
+const basics = [ 'JS', 'HTML', 'CSS' ];
+const frameworks = [ 'React', 'Vue' ];
+const web = [ ...basics, ...frameworks ];
+console.log(web); /* ['JS', 'HTML', 'CSS', 'React', 'Vue'] */
+
+const addWeb = [ ...web, 'al11' ];
+console.log(addWeb); /* ['JS', 'HTML', 'CSS', 'React', 'Vue', 'al11'] */
+```
+
+### Spread in object literals
+```js
+const basics = { behavior: 'JS', markup: 'HTML' };
+const style = 'CSS';
+const web = { ...basics, style };
+console.log(web); /* { behavior: "JS", markup: "HTML", style: "CSS" } */
+
+const devFront = { framework: 'react', event: 'React Conf' };
+const devBack = { framework: 'django', state: 'cool' };
+
+const cloneDev = { ...devFront };
+console.log(cloneDev); /* { framework: 'react', event: 'React Conf' } */
+
+const merged = { ...devFront, ...devBack };
+console.log(cloneDev); /* { framework: 'django', event: 'React Conf', state: 'cool' } */
+```

+ 9 - 0
docs/waf/react_native.md

@@ -0,0 +1,9 @@
+# React Native
+
+[https://github.com/facebook/react-native](https://github.com/facebook/react-native)
+[https://facebook.github.io/react/docs/](https://facebook.github.io/react/docs/)
+
+
+* [React Native Animation Book](http://browniefed.com/react-native-animation-book/)
+	* [https://github.com/browniefed/react-native-animation-book](https://github.com/browniefed/react-native-animation-book)
+* [React Natve Audio Streaming](https://github.com/tlenclos/react-native-audio-streaming)

+ 1 - 0
docs/waf/vue.md

@@ -0,0 +1 @@
+# Vue.js

+ 70 - 0
docusaurus.config.js

@@ -0,0 +1,70 @@
+/** @type {import('@docusaurus/types').DocusaurusConfig} */
+module.exports = {
+  title: 'David Windham TIL',
+  tagline: 'Because Today I Learned',
+  url: 'https://davidawindham.com/til',
+  baseUrl: '/til/',
+  onBrokenLinks: 'throw',
+  onBrokenMarkdownLinks: 'warn',
+  favicon: 'img/favicon.ico',
+  organizationName: 'windhamdavid',
+  projectName: 'til',
+  plugins: [
+    require.resolve('docusaurus-lunr-search')
+  ],
+  themeConfig: {
+    hideableSidebar: true,
+    prism: {
+      additionalLanguages: ['shell-session'],
+    },
+    colorMode: {
+      defaultMode: 'dark',
+      disableSwitch: false,
+      respectPrefersColorScheme: false,
+      switchConfig: {
+        darkIcon: '\u2800',
+        darkIconStyle: {
+          marginLeft: '1px',
+        },
+        lightIcon: '\u2800',
+        lightIconStyle: {
+          marginLeft: '1px',
+        },
+      },
+    },
+    navbar: {
+      title: 'TIL',
+      logo: {
+        alt: 'windhamdavid',
+        src: 'img/zw.png',
+      },
+      items: [
+        {to: 'docs/',activeBasePath: 'docs',label: 'Docs',position: 'left'},
+        {to: 'about/',activeBasePath: 'til',label: 'About',position: 'left'},
+        {to: 'help', label: 'Help', position: 'left'},
+        {
+          search: true,
+        },
+      ],
+    },
+  },
+  presets: [
+    [
+      '@docusaurus/preset-classic',
+      {
+        docs: {
+          sidebarPath: require.resolve('./sidebars.js'),
+          editUrl:'https://code.davidawindham.com/david/til/',
+        },
+        theme: {
+          customCss: require.resolve('./src/css/custom.css'),
+        },
+        blog: {
+          feedOptions: {
+            type: null,
+          },
+        },
+      },
+    ],
+  ],
+};

+ 30583 - 0
package-lock.json

@@ -0,0 +1,30583 @@
+{
+  "name": "daw-til-2",
+  "version": "0.0.0",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "daw-til-2",
+      "version": "0.0.0",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/preset-classic": "2.0.0-alpha.72",
+        "@mdx-js/react": "^1.6.21",
+        "clsx": "^1.1.1",
+        "docusaurus-lunr-search": "^2.1.10",
+        "react": "^17.0.1",
+        "react-dom": "^17.0.1"
+      }
+    },
+    "node_modules/@algolia/autocomplete-core": {
+      "version": "1.0.0-alpha.44",
+      "resolved": "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.0.0-alpha.44.tgz",
+      "integrity": "sha512-2iMXthldMIDXtlbg9omRKLgg1bLo2ZzINAEqwhNjUeyj1ceEyL1ck6FY0VnJpf2LsjmNthHCz2BuFk+nYUeDNA==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/autocomplete-shared": "1.0.0-alpha.44"
+      }
+    },
+    "node_modules/@algolia/autocomplete-preset-algolia": {
+      "version": "1.0.0-alpha.44",
+      "resolved": "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.0.0-alpha.44.tgz",
+      "integrity": "sha512-DCHwo5ovzg9k2ejUolGNTLFnIA7GpsrkbNJTy1sFbMnYfBmeK8egZPZnEl7lBTr27OaZu7IkWpTepLVSztZyng==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/autocomplete-shared": "1.0.0-alpha.44"
+      },
+      "peerDependencies": {
+        "@algolia/client-search": "^4.5.1",
+        "algoliasearch": "^4.5.1"
+      }
+    },
+    "node_modules/@algolia/autocomplete-shared": {
+      "version": "1.0.0-alpha.44",
+      "resolved": "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.0.0-alpha.44.tgz",
+      "integrity": "sha512-2oQZPERYV+yNx/yoVWYjZZdOqsitJ5dfxXJjL18yczOXH6ujnsq+DTczSrX+RjzjQdVeJ1UAG053EJQF/FOiMg==",
+      "license": "MIT"
+    },
+    "node_modules/@algolia/cache-browser-local-storage": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.6.tgz",
+      "integrity": "sha512-Bam7otzjIEgrRXWmk0Amm1+B3ROI5dQnUfJEBjIy0YPM0kMahEoJXCw6160tGKxJLl1g6icoC953nGshQKO7cA==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/cache-common": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/cache-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.8.6.tgz",
+      "integrity": "sha512-eGQlsXU5G7n4RvV/K6qe6lRAeL6EKAYPT3yZDBjCW4pAh7JWta+77a7BwUQkTqXN1MEQWZXjex3E4z/vFpzNrg==",
+      "license": "MIT"
+    },
+    "node_modules/@algolia/cache-in-memory": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.8.6.tgz",
+      "integrity": "sha512-kbJrvCFANxL/l5Pq1NFyHLRphKDwmqcD/OJga0IbNKEulRGDPkt1+pC7/q8d2ikP12adBjLLg2CVias9RJpIaw==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/cache-common": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/client-account": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.8.6.tgz",
+      "integrity": "sha512-FQVJE/BgCb78jtG7V0r30sMl9P5JKsrsOacGtGF2YebqI0YF25y8Z1nO39lbdjahxUS3QkDw2d0P2EVMj65g2Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/client-search": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/client-analytics": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.8.6.tgz",
+      "integrity": "sha512-ZBYFUlzNaWDFtt0rYHI7xbfVX0lPWU9lcEEXI/BlnkRgEkm247H503tNatPQFA1YGkob52EU18sV1eJ+OFRBLA==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/client-search": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/client-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.8.6.tgz",
+      "integrity": "sha512-8dI+K3Nvbes2YRZm2LY7bdCUD05e60BhacrMLxFuKxnBGuNehME1wbxq/QxcG1iNFJlxLIze5TxIcNN3+pn76g==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/client-recommendation": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.8.6.tgz",
+      "integrity": "sha512-Kg8DpjwvaWWujNx6sAUrSL+NTHxFe/UNaliCcSKaMhd3+FiPXN+CrSkO0KWR7I+oK2qGBTG/2Y0BhFOJ5/B/RA==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/client-search": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.8.6.tgz",
+      "integrity": "sha512-vXLS6umL/9G3bwqc6pkrS9K5/s8coq55mpfRARL+bs0NsToOf77WSTdwzlxv/KdbVF7dHjXgUpBvJ6RyR4ZdAw==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/logger-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.8.6.tgz",
+      "integrity": "sha512-FMRxZGdDxSzd0/Mv0R1021FvUt0CcbsQLYeyckvSWX8w+Uk4o0lcV6UtZdERVR5XZsGOqoXLMIYDbR2vkbGbVw==",
+      "license": "MIT"
+    },
+    "node_modules/@algolia/logger-console": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.8.6.tgz",
+      "integrity": "sha512-TYw9lwUCjvApC6Z0zn36T6gkCl7hbfJmnU+Z/D8pFJ3Yp7lz06S3oWGjbdrULrYP1w1VOhjd0X7/yGNsMhzutQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/logger-common": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/requester-browser-xhr": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.6.tgz",
+      "integrity": "sha512-omh6uJ3CJXOmcrU9M3/KfGg8XkUuGJGIMkqEbkFvIebpBJxfs6TVs0ziNeMFAcAfhi8/CGgpLbDSgJtWdGQa6w==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/requester-common": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/requester-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.8.6.tgz",
+      "integrity": "sha512-r5xJqq/D9KACkI5DgRbrysVL5DUUagikpciH0k0zjBbm+cXiYfpmdflo/h6JnY6kmvWgjr/4DoeTjKYb/0deAQ==",
+      "license": "MIT"
+    },
+    "node_modules/@algolia/requester-node-http": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.8.6.tgz",
+      "integrity": "sha512-TB36OqTVOKyHCOtdxhn/IJyI/NXi/BWy8IEbsiWwwZWlL79NWHbetj49jXWFolEYEuu8PgDjjZGpRhypSuO9XQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/requester-common": "4.8.6"
+      }
+    },
+    "node_modules/@algolia/transporter": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.8.6.tgz",
+      "integrity": "sha512-NRb31J0TP7EPoVMpXZ4yAtr61d26R8KGaf6qdULknvq5sOVHuuH4PwmF08386ERfIsgnM/OBhl+uzwACdCIjSg==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/cache-common": "4.8.6",
+        "@algolia/logger-common": "4.8.6",
+        "@algolia/requester-common": "4.8.6"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz",
+      "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/highlight": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.13.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.11.tgz",
+      "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/core": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.13.10.tgz",
+      "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.12.13",
+        "@babel/generator": "^7.13.9",
+        "@babel/helper-compilation-targets": "^7.13.10",
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helpers": "^7.13.10",
+        "@babel/parser": "^7.13.10",
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "semver": "^6.3.0",
+        "source-map": "^0.5.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/core/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@babel/core/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/core/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.13.9",
+      "resolved": "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz",
+      "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.13.0",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      }
+    },
+    "node_modules/@babel/generator/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@babel/helper-annotate-as-pure": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz",
+      "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz",
+      "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-explode-assignable-expression": "^7.12.13",
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz",
+      "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-validator-option": "^7.12.17",
+        "browserslist": "^4.14.5",
+        "semver": "^6.3.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-class-features-plugin": {
+      "version": "7.13.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz",
+      "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-member-expression-to-functions": "^7.13.0",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.13.0",
+        "@babel/helper-split-export-declaration": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-create-regexp-features-plugin": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz",
+      "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "regexpu-core": "^4.7.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider": {
+      "version": "0.1.5",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz",
+      "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-compilation-targets": "^7.13.0",
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/traverse": "^7.13.0",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2",
+        "semver": "^6.1.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.4.0-0"
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@babel/helper-define-polyfill-provider/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/helper-explode-assignable-expression": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz",
+      "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
+      "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-get-function-arity": "^7.12.13",
+        "@babel/template": "^7.12.13",
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-get-function-arity": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
+      "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz",
+      "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/helper-member-expression-to-functions": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz",
+      "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz",
+      "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz",
+      "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.13.0",
+        "@babel/helper-simple-access": "^7.12.13",
+        "@babel/helper-split-export-declaration": "^7.12.13",
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "node_modules/@babel/helper-optimise-call-expression": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
+      "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-plugin-utils": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
+      "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/helper-remap-async-to-generator": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz",
+      "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "@babel/helper-wrap-function": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/helper-replace-supers": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz",
+      "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-member-expression-to-functions": "^7.13.0",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz",
+      "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+      "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.1"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
+      "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.12.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+      "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
+      "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/helper-wrap-function": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz",
+      "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz",
+      "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz",
+      "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
+    "node_modules/@babel/highlight/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.13.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.11.tgz",
+      "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q==",
+      "license": "MIT",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz",
+      "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-remap-async-to-generator": "^7.13.0",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-class-properties": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz",
+      "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-dynamic-import": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz",
+      "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz",
+      "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-json-strings": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz",
+      "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz",
+      "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz",
+      "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-numeric-separator": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz",
+      "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz",
+      "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-compilation-targets": "^7.13.8",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz",
+      "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-optional-chaining": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz",
+      "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-private-methods": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz",
+      "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz",
+      "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "engines": {
+        "node": ">=4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz",
+      "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx/node_modules/@babel/core": {
+      "version": "7.12.9",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.12.5",
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helpers": "^7.12.5",
+        "@babel/parser": "^7.12.7",
+        "@babel/template": "^7.12.7",
+        "@babel/traverse": "^7.12.9",
+        "@babel/types": "^7.12.7",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "peer": true,
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT",
+      "peer": true
+    },
+    "node_modules/@babel/plugin-syntax-jsx/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "license": "ISC",
+      "peer": true,
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-jsx/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "license": "BSD-3-Clause",
+      "peer": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-top-level-await": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz",
+      "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-syntax-typescript": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz",
+      "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-arrow-functions": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz",
+      "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-async-to-generator": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz",
+      "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-remap-async-to-generator": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz",
+      "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-block-scoping": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz",
+      "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-classes": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz",
+      "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-replace-supers": "^7.13.0",
+        "@babel/helper-split-export-declaration": "^7.12.13",
+        "globals": "^11.1.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-computed-properties": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz",
+      "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-destructuring": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz",
+      "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-dotall-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz",
+      "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-duplicate-keys": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz",
+      "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz",
+      "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-for-of": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz",
+      "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-function-name": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz",
+      "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-literals": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz",
+      "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-member-expression-literals": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz",
+      "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-amd": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz",
+      "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-commonjs": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz",
+      "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-simple-access": "^7.12.13",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-systemjs": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz",
+      "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-hoist-variables": "^7.13.0",
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-modules-umd": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz",
+      "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz",
+      "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-new-target": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz",
+      "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-object-super": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz",
+      "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-parameters": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz",
+      "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-property-literals": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz",
+      "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-constant-elements": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.10.tgz",
+      "integrity": "sha512-E+aCW9j7mLq01tOuGV08YzLBt+vSyr4bOPT75B6WrAlrUfmOYOZ/yWk847EH0dv0xXiCihWLEmlX//O30YhpIw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-display-name": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz",
+      "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz",
+      "integrity": "sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-syntax-jsx": "^7.12.13",
+        "@babel/types": "^7.12.17"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx-development": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz",
+      "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/plugin-transform-react-jsx": "^7.12.17"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/plugin-syntax-jsx": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz",
+      "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-react-pure-annotations": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz",
+      "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-regenerator": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz",
+      "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==",
+      "license": "MIT",
+      "dependencies": {
+        "regenerator-transform": "^0.14.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-reserved-words": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz",
+      "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-runtime": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz",
+      "integrity": "sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "babel-plugin-polyfill-corejs2": "^0.1.4",
+        "babel-plugin-polyfill-corejs3": "^0.1.3",
+        "babel-plugin-polyfill-regenerator": "^0.1.2",
+        "semver": "^6.3.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-shorthand-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz",
+      "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-spread": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz",
+      "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-sticky-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz",
+      "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-template-literals": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz",
+      "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typeof-symbol": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz",
+      "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-typescript": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz",
+      "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-typescript": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-escapes": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz",
+      "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/plugin-transform-unicode-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz",
+      "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-env": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.10.tgz",
+      "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-compilation-targets": "^7.13.10",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-option": "^7.12.17",
+        "@babel/plugin-proposal-async-generator-functions": "^7.13.8",
+        "@babel/plugin-proposal-class-properties": "^7.13.0",
+        "@babel/plugin-proposal-dynamic-import": "^7.13.8",
+        "@babel/plugin-proposal-export-namespace-from": "^7.12.13",
+        "@babel/plugin-proposal-json-strings": "^7.13.8",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
+        "@babel/plugin-proposal-numeric-separator": "^7.12.13",
+        "@babel/plugin-proposal-object-rest-spread": "^7.13.8",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
+        "@babel/plugin-proposal-optional-chaining": "^7.13.8",
+        "@babel/plugin-proposal-private-methods": "^7.13.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.12.13",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-top-level-await": "^7.12.13",
+        "@babel/plugin-transform-arrow-functions": "^7.13.0",
+        "@babel/plugin-transform-async-to-generator": "^7.13.0",
+        "@babel/plugin-transform-block-scoped-functions": "^7.12.13",
+        "@babel/plugin-transform-block-scoping": "^7.12.13",
+        "@babel/plugin-transform-classes": "^7.13.0",
+        "@babel/plugin-transform-computed-properties": "^7.13.0",
+        "@babel/plugin-transform-destructuring": "^7.13.0",
+        "@babel/plugin-transform-dotall-regex": "^7.12.13",
+        "@babel/plugin-transform-duplicate-keys": "^7.12.13",
+        "@babel/plugin-transform-exponentiation-operator": "^7.12.13",
+        "@babel/plugin-transform-for-of": "^7.13.0",
+        "@babel/plugin-transform-function-name": "^7.12.13",
+        "@babel/plugin-transform-literals": "^7.12.13",
+        "@babel/plugin-transform-member-expression-literals": "^7.12.13",
+        "@babel/plugin-transform-modules-amd": "^7.13.0",
+        "@babel/plugin-transform-modules-commonjs": "^7.13.8",
+        "@babel/plugin-transform-modules-systemjs": "^7.13.8",
+        "@babel/plugin-transform-modules-umd": "^7.13.0",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13",
+        "@babel/plugin-transform-new-target": "^7.12.13",
+        "@babel/plugin-transform-object-super": "^7.12.13",
+        "@babel/plugin-transform-parameters": "^7.13.0",
+        "@babel/plugin-transform-property-literals": "^7.12.13",
+        "@babel/plugin-transform-regenerator": "^7.12.13",
+        "@babel/plugin-transform-reserved-words": "^7.12.13",
+        "@babel/plugin-transform-shorthand-properties": "^7.12.13",
+        "@babel/plugin-transform-spread": "^7.13.0",
+        "@babel/plugin-transform-sticky-regex": "^7.12.13",
+        "@babel/plugin-transform-template-literals": "^7.13.0",
+        "@babel/plugin-transform-typeof-symbol": "^7.12.13",
+        "@babel/plugin-transform-unicode-escapes": "^7.12.13",
+        "@babel/plugin-transform-unicode-regex": "^7.12.13",
+        "@babel/preset-modules": "^0.1.4",
+        "@babel/types": "^7.13.0",
+        "babel-plugin-polyfill-corejs2": "^0.1.4",
+        "babel-plugin-polyfill-corejs3": "^0.1.3",
+        "babel-plugin-polyfill-regenerator": "^0.1.2",
+        "core-js-compat": "^3.9.0",
+        "semver": "^6.3.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-modules": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+      "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-react": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz",
+      "integrity": "sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-transform-react-display-name": "^7.12.13",
+        "@babel/plugin-transform-react-jsx": "^7.12.13",
+        "@babel/plugin-transform-react-jsx-development": "^7.12.12",
+        "@babel/plugin-transform-react-pure-annotations": "^7.12.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/preset-typescript": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz",
+      "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-option": "^7.12.17",
+        "@babel/plugin-transform-typescript": "^7.13.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/runtime": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz",
+      "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==",
+      "license": "MIT",
+      "dependencies": {
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "node_modules/@babel/runtime-corejs3": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz",
+      "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==",
+      "license": "MIT",
+      "dependencies": {
+        "core-js-pure": "^3.0.0",
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz",
+      "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.12.13",
+        "@babel/parser": "^7.12.13",
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz",
+      "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.12.13",
+        "@babel/generator": "^7.13.0",
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-split-export-declaration": "^7.12.13",
+        "@babel/parser": "^7.13.0",
+        "@babel/types": "^7.13.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@babel/traverse/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/@babel/types": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz",
+      "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "lodash": "^4.17.19",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "node_modules/@choojs/findup": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz",
+      "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==",
+      "license": "MIT",
+      "dependencies": {
+        "commander": "^2.15.1"
+      },
+      "bin": {
+        "findup": "bin/findup.js"
+      }
+    },
+    "node_modules/@csstools/convert-colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
+      "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==",
+      "license": "CC0-1.0",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/@docsearch/css": {
+      "version": "3.0.0-alpha.34",
+      "resolved": "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.34.tgz",
+      "integrity": "sha512-ZUbmxbN9gQp3vuBo9GDnm+ywB9aZQSh0ogjt6865PmeRUvyCCvgSwyZktliLPvAztoGX56qewQjxNcso3RrSow==",
+      "license": "MIT"
+    },
+    "node_modules/@docsearch/react": {
+      "version": "3.0.0-alpha.34",
+      "resolved": "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0-alpha.34.tgz",
+      "integrity": "sha512-BBVxu2qY1fyhxJfrGZvknFL6j1fJ3wLZvf2DsmVfmihu/RhYYnf8/C1gbc7RWX2fSoSzbQCcSuNbn4RvjuUJ+A==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/autocomplete-core": "1.0.0-alpha.44",
+        "@algolia/autocomplete-preset-algolia": "1.0.0-alpha.44",
+        "@docsearch/css": "3.0.0-alpha.34",
+        "algoliasearch": "^4.0.0"
+      },
+      "peerDependencies": {
+        "@types/react": ">= 16.8.0 < 18.0.0",
+        "react": ">= 16.8.0 < 18.0.0",
+        "react-dom": ">= 16.8.0 < 18.0.0"
+      }
+    },
+    "node_modules/@docusaurus/core": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-PV0rlvVRvVEdqs1I4PktwZBJkhFg4O4bVeqseaTYuA1u/poQSiiZ+rhrZRJ+/OcTHZ8VlYZw7tCHaRH4RLbP2g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.12.16",
+        "@babel/generator": "^7.12.15",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13",
+        "@babel/plugin-proposal-optional-chaining": "^7.12.16",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-transform-runtime": "^7.12.15",
+        "@babel/preset-env": "^7.12.16",
+        "@babel/preset-react": "^7.12.13",
+        "@babel/preset-typescript": "^7.12.16",
+        "@babel/runtime": "^7.12.5",
+        "@babel/runtime-corejs3": "^7.12.13",
+        "@babel/traverse": "^7.12.13",
+        "@docusaurus/cssnano-preset": "2.0.0-alpha.72",
+        "@docusaurus/react-loadable": "5.5.0",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "@endiliey/static-site-generator-webpack-plugin": "^4.0.0",
+        "@svgr/webpack": "^5.5.0",
+        "autoprefixer": "^10.2.5",
+        "babel-loader": "^8.2.2",
+        "babel-plugin-dynamic-import-node": "2.3.0",
+        "boxen": "^5.0.0",
+        "cache-loader": "^4.1.0",
+        "chalk": "^4.1.0",
+        "chokidar": "^3.5.1",
+        "clean-css": "^5.1.1",
+        "commander": "^5.1.0",
+        "copy-webpack-plugin": "^6.4.1",
+        "core-js": "^3.9.1",
+        "css-loader": "^5.1.1",
+        "del": "^6.0.0",
+        "detect-port": "^1.3.0",
+        "eta": "^1.12.1",
+        "express": "^4.17.1",
+        "file-loader": "^6.2.0",
+        "fs-extra": "^9.1.0",
+        "github-slugger": "^1.3.0",
+        "globby": "^11.0.2",
+        "html-minifier-terser": "^5.1.1",
+        "html-tags": "^3.1.0",
+        "html-webpack-plugin": "^4.5.0",
+        "import-fresh": "^3.3.0",
+        "is-root": "^2.1.0",
+        "joi": "^17.4.0",
+        "leven": "^3.1.0",
+        "lodash": "^4.17.20",
+        "mini-css-extract-plugin": "^0.8.0",
+        "module-alias": "^2.2.2",
+        "nprogress": "^0.2.0",
+        "null-loader": "^4.0.0",
+        "optimize-css-assets-webpack-plugin": "^5.0.4",
+        "pnp-webpack-plugin": "^1.6.4",
+        "postcss": "^8.2.7",
+        "postcss-loader": "^4.1.0",
+        "postcss-preset-env": "^6.7.0",
+        "prompts": "^2.4.0",
+        "react-dev-utils": "^11.0.1",
+        "react-helmet": "^6.1.0",
+        "react-loadable": "^5.5.0",
+        "react-loadable-ssr-addon": "^0.3.0",
+        "react-router": "^5.2.0",
+        "react-router-config": "^5.1.1",
+        "react-router-dom": "^5.2.0",
+        "resolve-pathname": "^3.0.0",
+        "semver": "^7.3.4",
+        "serve-handler": "^6.1.3",
+        "shelljs": "^0.8.4",
+        "std-env": "^2.2.1",
+        "terser-webpack-plugin": "^4.1.0",
+        "update-notifier": "^5.1.0",
+        "url-loader": "^4.1.1",
+        "wait-on": "^5.2.1",
+        "webpack": "^4.44.1",
+        "webpack-bundle-analyzer": "^4.4.0",
+        "webpack-dev-server": "^3.11.2",
+        "webpack-merge": "^4.2.2",
+        "webpackbar": "^5.0.0-3"
+      },
+      "bin": {
+        "docusaurus": "bin/docusaurus.js"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/anymatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+      "license": "ISC",
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/autoprefixer": {
+      "version": "10.2.5",
+      "resolved": "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.2.5.tgz",
+      "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.16.3",
+        "caniuse-lite": "^1.0.30001196",
+        "colorette": "^1.2.2",
+        "fraction.js": "^4.0.13",
+        "normalize-range": "^0.1.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/babel-plugin-dynamic-import-node": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
+      "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+      "license": "MIT",
+      "dependencies": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/chokidar": {
+      "version": "3.5.1",
+      "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz",
+      "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.1",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.5.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.1"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/commander": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz",
+      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/postcss": {
+      "version": "8.2.8",
+      "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-8.2.8.tgz",
+      "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+      "license": "MIT",
+      "dependencies": {
+        "colorette": "^1.2.2",
+        "nanoid": "^3.1.20",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/postcss-loader": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.2.0.tgz",
+      "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==",
+      "license": "MIT",
+      "dependencies": {
+        "cosmiconfig": "^7.0.0",
+        "klona": "^2.0.4",
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0",
+        "semver": "^7.3.4"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "postcss": "^7.0.0 || ^8.0.1",
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "license": "MIT"
+    },
+    "node_modules/@docusaurus/core/node_modules/readdirp": {
+      "version": "3.5.0",
+      "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz",
+      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+      "license": "MIT",
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/semver": {
+      "version": "7.3.4",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz",
+      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+      "license": "ISC",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@docusaurus/core/node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/@docusaurus/cssnano-preset": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-7W/dlemTaipVd/zrd9Fjq/xp6IX/qn2z/GDaPbJ2SPklHbts5nWuRAt++wkG8Ue+Qxc9Q5uOBjW0ihVb4478+A==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-preset-advanced": "^4.0.7",
+        "postcss": "^7.0.2",
+        "postcss-sort-media-queries": "^1.7.26"
+      }
+    },
+    "node_modules/@docusaurus/mdx-loader": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-tG8EZc3w4xt7IKJIniPFChfVY1/adpn6w6vsXVxE96Y/1PmqKjIp6mtVKdzTShaf6MCnKrAOtEUSQR0eCRHOjQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/parser": "^7.12.16",
+        "@babel/traverse": "^7.12.13",
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@mdx-js/mdx": "^1.6.21",
+        "@mdx-js/react": "^1.6.21",
+        "escape-html": "^1.0.3",
+        "file-loader": "^6.2.0",
+        "fs-extra": "^9.1.0",
+        "github-slugger": "^1.3.0",
+        "gray-matter": "^4.0.2",
+        "loader-utils": "^2.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "remark-emoji": "^2.1.0",
+        "stringify-object": "^3.3.0",
+        "unist-util-visit": "^2.0.2",
+        "url-loader": "^4.1.1",
+        "webpack": "^4.44.1"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-blog": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-q1noOyULAQ5CkSNciUZDf1v0ly234jX3Ts6ckAy/XK5B3F340Ou8UuEFNbVap2fkRC1hOXe7RnEmFwW1PxmqmA==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/mdx-loader": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "chalk": "^4.1.0",
+        "feed": "^4.2.2",
+        "fs-extra": "^9.1.0",
+        "globby": "^11.0.2",
+        "joi": "^17.4.0",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "reading-time": "^1.3.0",
+        "remark-admonitions": "^1.2.1",
+        "webpack": "^4.44.1"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-blog/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-blog/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-docs": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-EpMt0z/Z7SsOuQFIZlo31XsndxJ0blp7n0bVNcIlcFiNHYoBVVPbYb4VKP2W+1Sfw5K1XouUxoXRM30FyDrjhw==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/mdx-loader": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "chalk": "^4.1.0",
+        "execa": "^5.0.0",
+        "fs-extra": "^9.1.0",
+        "globby": "^11.0.2",
+        "import-fresh": "^3.2.2",
+        "joi": "^17.4.0",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "remark-admonitions": "^1.2.1",
+        "shelljs": "^0.8.4",
+        "utility-types": "^3.10.0",
+        "webpack": "^4.44.1"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-docs/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-docs/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-pages": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-ETBx+3+U+1sj0C/E8C3huQj5lGcSlmj0ZHBrBb3qP3zHS8+gWHAyUiXst3bvFs5mJX7JHkxfaHZc2hLxXLpaJg==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/mdx-loader": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "globby": "^11.0.2",
+        "joi": "^17.4.0",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "minimatch": "^3.0.4",
+        "remark-admonitions": "^1.2.1",
+        "slash": "^3.0.0",
+        "webpack": "^4.44.1"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-pages/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/@docusaurus/plugin-content-pages/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-debug": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-j2xR7i0Hw8v4SBtNvf8H5zoeKFZHScLdfJ93aUHe4ERf3AfACZuG8/tjnsarrfQK59HjbwWqbRC1mUgc2nFfwA==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "react-json-view": "^1.21.1"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-google-analytics": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-A73FA1hRHxbCZ7WVUthrEty5jRAdWlWAg9pijwSFFg5YG2kb0thNqGqMU/P5dqcV/ytE4907WvXMpKYmLtFVOg==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-google-gtag": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-161+C6XZAziT/MRF9HZFCzg0ybzzkW/NHIuIKPmiQjeBB+DXYopvEmldKcPlZbs8YCSD9nMxkTx39pr1AWjffw==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/plugin-sitemap": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-ZaMeJFDdey+PDMxg7qI2u9Wm7ylZb30FBR14wPSH5da+yMnNtl8wAlWEW8RkEgKYo04mE7DMvdEZ1YdsPF7cQg==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "fs-extra": "^9.1.0",
+        "joi": "^17.4.0",
+        "sitemap": "^6.3.6"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/preset-classic": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-Z5XKcgyrZWyUvqQZ7cAJ+E3rHkXZPRo8/23vOV5f/5sM7HeW871e+FU37RXIEFu8E8fhpCgQQ6FPEVMyiVS7Uw==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-blog": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-docs": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-pages": "2.0.0-alpha.72",
+        "@docusaurus/plugin-debug": "2.0.0-alpha.72",
+        "@docusaurus/plugin-google-analytics": "2.0.0-alpha.72",
+        "@docusaurus/plugin-google-gtag": "2.0.0-alpha.72",
+        "@docusaurus/plugin-sitemap": "2.0.0-alpha.72",
+        "@docusaurus/theme-classic": "2.0.0-alpha.72",
+        "@docusaurus/theme-search-algolia": "2.0.0-alpha.72"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/react-loadable": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz",
+      "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==",
+      "license": "MIT",
+      "dependencies": {
+        "prop-types": "^15.6.2"
+      },
+      "peerDependencies": {
+        "react": "*"
+      }
+    },
+    "node_modules/@docusaurus/theme-classic": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-X5kDmMG6xCw+PpkOysnulcq9OuSsljR7Z/JiAkOeAFfd6LNeMk983q+Eu72xWxpmhmBBBkE56rhdxuBXKQJCsw==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-blog": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-docs": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-pages": "2.0.0-alpha.72",
+        "@docusaurus/theme-common": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "@mdx-js/mdx": "^1.6.21",
+        "@mdx-js/react": "^1.6.21",
+        "@types/react-toggle": "^4.0.2",
+        "chalk": "^4.1.0",
+        "clsx": "^1.1.1",
+        "copy-text-to-clipboard": "^3.0.0",
+        "fs-extra": "^9.1.0",
+        "globby": "^11.0.2",
+        "infima": "0.2.0-alpha.21",
+        "joi": "^17.4.0",
+        "lodash": "^4.17.20",
+        "parse-numeric-range": "^1.2.0",
+        "postcss": "^7.0.2",
+        "prism-react-renderer": "^1.1.1",
+        "prismjs": "^1.23.0",
+        "prop-types": "^15.7.2",
+        "react-router-dom": "^5.2.0",
+        "react-toggle": "^4.1.2",
+        "rtlcss": "^2.6.2"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/theme-common": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-4NI3VCIBVJvOUk1YhBs2V4QwH1CR65sQQt2MFhHbeAmkKh1V0dYDFF8bVxrTSl7NhTICVk2Azn+tItRNkAXbdg==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-blog": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-docs": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-pages": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/theme-search-algolia": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-K+7WvYx0vkclaCN6nvcX4rFD/M+0b0YpjAbg+aFLzeAo77vIJESgByOc6RuK3XNALX4H2U8k7j0+wWIPsJtM1Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@docsearch/react": "^3.0.0-alpha.33",
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/theme-common": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "algoliasearch": "^4.8.4",
+        "algoliasearch-helper": "^3.3.4",
+        "clsx": "^1.1.1",
+        "eta": "^1.12.1",
+        "joi": "^17.4.0",
+        "lodash": "^4.17.20"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.4 || ^17.0.0",
+        "react-dom": "^16.8.4 || ^17.0.0"
+      }
+    },
+    "node_modules/@docusaurus/types": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-/AfFD2Kdfm2rvG5j1v0w0L5gVuTPIE2vGOgLZh6EGzJT/Xx6CDdso9aAbhHiGfQkQS3bu1BPpLWqKlX9Ovi/aw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/webpack": "^4.41.0",
+        "commander": "^5.1.0",
+        "joi": "^17.4.0",
+        "querystring": "0.2.0",
+        "webpack-merge": "^4.2.2"
+      }
+    },
+    "node_modules/@docusaurus/types/node_modules/commander": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz",
+      "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/@docusaurus/utils": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-seWNBdX9LI1jREiogh0azXZaf2HStzb3MECsjAVrtEikQFbfG7K7S27C9WXDlUeQw6LVL/q0JEjHFOJD+cTSLA==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@types/github-slugger": "^1.3.0",
+        "chalk": "^4.1.0",
+        "escape-string-regexp": "^4.0.0",
+        "fs-extra": "^9.1.0",
+        "gray-matter": "^4.0.2",
+        "lodash": "^4.17.20",
+        "resolve-pathname": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      }
+    },
+    "node_modules/@docusaurus/utils-validation": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-qhpyCVCCCTy0ui62GxXz6vLazcRCGal/jBGcgnxSgQ4AyXrU2NpPQH2hunOLknL6D3BivTb+w+IAFHE9JAMX0Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "chalk": "^4.1.0",
+        "joi": "^17.4.0"
+      },
+      "engines": {
+        "node": ">=12.13.0"
+      }
+    },
+    "node_modules/@docusaurus/utils/node_modules/escape-string-regexp": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz",
+      "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==",
+      "license": "MIT",
+      "dependencies": {
+        "bluebird": "^3.7.1",
+        "cheerio": "^0.22.0",
+        "eval": "^0.1.4",
+        "url": "^0.11.0",
+        "webpack-sources": "^1.4.3"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/cheerio": {
+      "version": "0.22.0",
+      "resolved": "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz",
+      "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
+      "license": "MIT",
+      "dependencies": {
+        "css-select": "~1.2.0",
+        "dom-serializer": "~0.1.0",
+        "entities": "~1.1.1",
+        "htmlparser2": "^3.9.1",
+        "lodash.assignin": "^4.0.9",
+        "lodash.bind": "^4.1.4",
+        "lodash.defaults": "^4.0.1",
+        "lodash.filter": "^4.4.0",
+        "lodash.flatten": "^4.2.0",
+        "lodash.foreach": "^4.3.0",
+        "lodash.map": "^4.4.0",
+        "lodash.merge": "^4.4.0",
+        "lodash.pick": "^4.2.1",
+        "lodash.reduce": "^4.4.0",
+        "lodash.reject": "^4.4.0",
+        "lodash.some": "^4.4.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/css-select": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz",
+      "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+      "license": "BSD-like",
+      "dependencies": {
+        "boolbase": "~1.0.0",
+        "css-what": "2.1",
+        "domutils": "1.5.1",
+        "nth-check": "~1.0.1"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/css-what": {
+      "version": "2.1.3",
+      "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz",
+      "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/dom-serializer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz",
+      "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^1.3.0",
+        "entities": "^1.1.1"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/domutils": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz",
+      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+      "dependencies": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/domutils/node_modules/dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      }
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/domutils/node_modules/dom-serializer/node_modules/domelementtype": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz",
+      "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/@endiliey/static-site-generator-webpack-plugin/node_modules/domutils/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "license": "BSD-2-Clause",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/@hapi/hoek": {
+      "version": "9.1.1",
+      "resolved": "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz",
+      "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@hapi/topo": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz",
+      "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@hapi/hoek": "^9.0.0"
+      }
+    },
+    "node_modules/@mdx-js/mdx": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz",
+      "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "7.12.9",
+        "@babel/plugin-syntax-jsx": "7.12.1",
+        "@babel/plugin-syntax-object-rest-spread": "7.8.3",
+        "@mdx-js/util": "1.6.22",
+        "babel-plugin-apply-mdx-type-prop": "1.6.22",
+        "babel-plugin-extract-import-names": "1.6.22",
+        "camelcase-css": "2.0.1",
+        "detab": "2.0.4",
+        "hast-util-raw": "6.0.1",
+        "lodash.uniq": "4.5.0",
+        "mdast-util-to-hast": "10.0.1",
+        "remark-footnotes": "2.0.0",
+        "remark-mdx": "1.6.22",
+        "remark-parse": "8.0.3",
+        "remark-squeeze-paragraphs": "4.0.0",
+        "style-to-object": "0.3.0",
+        "unified": "9.2.0",
+        "unist-builder": "2.0.3",
+        "unist-util-visit": "2.0.3"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/@mdx-js/mdx/node_modules/@babel/core": {
+      "version": "7.12.9",
+      "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz",
+      "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.12.5",
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helpers": "^7.12.5",
+        "@babel/parser": "^7.12.7",
+        "@babel/template": "^7.12.7",
+        "@babel/traverse": "^7.12.9",
+        "@babel/types": "^7.12.7",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@mdx-js/mdx/node_modules/@babel/helper-plugin-utils": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "license": "MIT"
+    },
+    "node_modules/@mdx-js/mdx/node_modules/babel-plugin-apply-mdx-type-prop": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz",
+      "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "7.10.4",
+        "@mdx-js/util": "1.6.22"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.11.6"
+      }
+    },
+    "node_modules/@mdx-js/mdx/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@mdx-js/mdx/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/@mdx-js/mdx/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/@mdx-js/mdx/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/@mdx-js/react": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz",
+      "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      },
+      "peerDependencies": {
+        "react": "^16.13.1 || ^17.0.0"
+      }
+    },
+    "node_modules/@mdx-js/util": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz",
+      "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/@nodelib/fs.scandir": {
+      "version": "2.1.4",
+      "resolved": "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+      "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "2.0.4",
+        "run-parallel": "^1.1.9"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.stat": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+      "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@nodelib/fs.walk": {
+      "version": "1.2.6",
+      "resolved": "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+      "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.scandir": "2.1.4",
+        "fastq": "^1.6.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "license": "MIT",
+      "dependencies": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@npmcli/move-file/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/@npmcli/move-file/node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/@polka/url": {
+      "version": "1.0.0-next.11",
+      "resolved": "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz",
+      "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA==",
+      "license": "MIT"
+    },
+    "node_modules/@sideway/address": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.1.tgz",
+      "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@hapi/hoek": "^9.0.0"
+      }
+    },
+    "node_modules/@sideway/formula": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz",
+      "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@sideway/pinpoint": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@sindresorhus/is": {
+      "version": "0.14.0",
+      "resolved": "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz",
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+      "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+      "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+      "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+      "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+      "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+      "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+      "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-plugin-transform-svg-component": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+      "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/babel-preset": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+      "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+      "license": "MIT",
+      "dependencies": {
+        "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+        "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+        "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+        "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+        "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+        "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+        "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+        "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/core": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz",
+      "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@svgr/plugin-jsx": "^5.5.0",
+        "camelcase": "^6.2.0",
+        "cosmiconfig": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/hast-util-to-babel-ast": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+      "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/types": "^7.12.6"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/plugin-jsx": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+      "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.12.3",
+        "@svgr/babel-preset": "^5.5.0",
+        "@svgr/hast-util-to-babel-ast": "^5.5.0",
+        "svg-parser": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/plugin-svgo": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+      "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cosmiconfig": "^7.0.0",
+        "deepmerge": "^4.2.2",
+        "svgo": "^1.2.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@svgr/webpack": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz",
+      "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "^7.12.3",
+        "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+        "@babel/preset-env": "^7.12.1",
+        "@babel/preset-react": "^7.12.5",
+        "@svgr/core": "^5.5.0",
+        "@svgr/plugin-jsx": "^5.5.0",
+        "@svgr/plugin-svgo": "^5.5.0",
+        "loader-utils": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/gregberge"
+      }
+    },
+    "node_modules/@szmarczak/http-timer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "license": "MIT",
+      "dependencies": {
+        "defer-to-connect": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@types/anymatch": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz",
+      "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/github-slugger": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/@types/github-slugger/-/github-slugger-1.3.0.tgz",
+      "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==",
+      "license": "MIT"
+    },
+    "node_modules/@types/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/hast": {
+      "version": "2.3.1",
+      "resolved": "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz",
+      "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/@types/html-minifier-terser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.7",
+      "resolved": "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz",
+      "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/mdast": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz",
+      "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "*"
+      }
+    },
+    "node_modules/@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/node": {
+      "version": "14.14.35",
+      "resolved": "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz",
+      "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag==",
+      "license": "MIT"
+    },
+    "node_modules/@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/parse5": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz",
+      "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/prop-types": {
+      "version": "15.7.3",
+      "resolved": "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz",
+      "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==",
+      "license": "MIT"
+    },
+    "node_modules/@types/q": {
+      "version": "1.5.4",
+      "resolved": "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz",
+      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug==",
+      "license": "MIT"
+    },
+    "node_modules/@types/react": {
+      "version": "17.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz",
+      "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "node_modules/@types/react-toggle": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/@types/react-toggle/-/react-toggle-4.0.2.tgz",
+      "integrity": "sha512-sHqfoKFnL0YU2+OC4meNEC8Ptx9FE8/+nFeFvNcdBa6ANA8KpAzj3R9JN8GtrvlLgjKDoYgI7iILgXYcTPo2IA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/react": "*"
+      }
+    },
+    "node_modules/@types/sax": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.1.tgz",
+      "integrity": "sha512-dqYdvN7Sbw8QT/0Ci5rhjE4/iCMJEM0Y9rHpCu+gGXD9Lwbz28t6HI2yegsB6BoV1sShRMU6lAmAcgRjmFy7LA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/scheduler": {
+      "version": "0.16.1",
+      "resolved": "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz",
+      "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/source-list-map": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/tapable": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz",
+      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==",
+      "license": "MIT"
+    },
+    "node_modules/@types/uglify-js": {
+      "version": "3.13.0",
+      "resolved": "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz",
+      "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@types/unist": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz",
+      "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==",
+      "license": "MIT"
+    },
+    "node_modules/@types/webpack": {
+      "version": "4.41.26",
+      "resolved": "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz",
+      "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/anymatch": "*",
+        "@types/node": "*",
+        "@types/tapable": "*",
+        "@types/uglify-js": "*",
+        "@types/webpack-sources": "*",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/@types/webpack-sources": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz",
+      "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.7.3"
+      }
+    },
+    "node_modules/@types/webpack-sources/node_modules/source-map": {
+      "version": "0.7.3",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz",
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
+      "license": "ISC"
+    },
+    "node_modules/@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "license": "MIT",
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "license": "MIT",
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
+      "license": "MIT"
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+      "license": "Apache-2.0"
+    },
+    "node_modules/abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+    },
+    "node_modules/accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "6.4.2",
+      "resolved": "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-walk": {
+      "version": "8.0.2",
+      "resolved": "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.2.tgz",
+      "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/address": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz",
+      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.12.0"
+      }
+    },
+    "node_modules/aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "license": "MIT",
+      "dependencies": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "license": "MIT",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "ajv": ">=5.0.0"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/algoliasearch": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.8.6.tgz",
+      "integrity": "sha512-G8IA3lcgaQB4r9HuQ4G+uSFjjz0Wv2OgEPiQ8emA+G2UUlroOfMl064j1bq/G+QTW0LmTQp9JwrFDRWxFM9J7w==",
+      "license": "MIT",
+      "dependencies": {
+        "@algolia/cache-browser-local-storage": "4.8.6",
+        "@algolia/cache-common": "4.8.6",
+        "@algolia/cache-in-memory": "4.8.6",
+        "@algolia/client-account": "4.8.6",
+        "@algolia/client-analytics": "4.8.6",
+        "@algolia/client-common": "4.8.6",
+        "@algolia/client-recommendation": "4.8.6",
+        "@algolia/client-search": "4.8.6",
+        "@algolia/logger-common": "4.8.6",
+        "@algolia/logger-console": "4.8.6",
+        "@algolia/requester-browser-xhr": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/requester-node-http": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "node_modules/algoliasearch-helper": {
+      "version": "3.4.4",
+      "resolved": "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.4.4.tgz",
+      "integrity": "sha512-OjyVLjykaYKCMxxRMZNiwLp8CS310E0qAeIY2NaublcmLAh8/SL19+zYHp7XCLtMem2ZXwl3ywMiA32O9jszuw==",
+      "license": "MIT",
+      "dependencies": {
+        "events": "^1.1.1"
+      },
+      "peerDependencies": {
+        "algoliasearch": ">= 3.1 < 5"
+      }
+    },
+    "node_modules/alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
+      "license": "MIT"
+    },
+    "node_modules/ansi-align": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz",
+      "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^3.0.0"
+      }
+    },
+    "node_modules/ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz",
+      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ansi-escapes": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+      "license": "MIT",
+      "dependencies": {
+        "type-fest": "^0.11.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-escapes/node_modules/type-fest": {
+      "version": "0.11.0",
+      "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz",
+      "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=",
+      "engines": [
+        "node >= 0.8.0"
+      ],
+      "license": "Apache-2.0",
+      "bin": {
+        "ansi-html": "bin/ansi-html"
+      }
+    },
+    "node_modules/ansi-regex": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "license": "ISC",
+      "dependencies": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      }
+    },
+    "node_modules/anymatch/node_modules/normalize-path": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz",
+      "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+      "license": "MIT",
+      "dependencies": {
+        "remove-trailing-separator": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
+      "license": "ISC"
+    },
+    "node_modules/arg": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/arg/-/arg-5.0.0.tgz",
+      "integrity": "sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ==",
+      "license": "MIT"
+    },
+    "node_modules/argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "license": "MIT",
+      "dependencies": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "node_modules/arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
+      "license": "MIT"
+    },
+    "node_modules/array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
+      "license": "MIT"
+    },
+    "node_modules/asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "node_modules/assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      }
+    },
+    "node_modules/assert/node_modules/inherits": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz",
+      "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+      "license": "ISC"
+    },
+    "node_modules/assert/node_modules/util": {
+      "version": "0.10.3",
+      "resolved": "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz",
+      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "2.0.1"
+      }
+    },
+    "node_modules/assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/async": {
+      "version": "2.6.3",
+      "resolved": "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz",
+      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "node_modules/async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+      "license": "MIT"
+    },
+    "node_modules/async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+      "license": "MIT"
+    },
+    "node_modules/at-least-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz",
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">= 4.0.0"
+      }
+    },
+    "node_modules/atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
+      "license": "(MIT OR Apache-2.0)",
+      "bin": {
+        "atob": "bin/atob.js"
+      },
+      "engines": {
+        "node": ">= 4.5.0"
+      }
+    },
+    "node_modules/autocomplete.js": {
+      "version": "0.37.1",
+      "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.37.1.tgz",
+      "integrity": "sha512-PgSe9fHYhZEsm/9jggbjtVsGXJkPLvd+9mC7gZJ662vVL5CRWEtm/mIrrzCx0MrNxHVwxD5d00UOn6NsmL2LUQ==",
+      "dependencies": {
+        "immediate": "^3.2.3"
+      }
+    },
+    "node_modules/autoprefixer": {
+      "version": "9.8.6",
+      "resolved": "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz",
+      "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001109",
+        "colorette": "^1.2.1",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "bin": {
+        "autoprefixer": "bin/autoprefixer"
+      },
+      "funding": {
+        "type": "tidelift",
+        "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+      }
+    },
+    "node_modules/autoprefixer/node_modules/postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "license": "MIT"
+    },
+    "node_modules/axios": {
+      "version": "0.21.1",
+      "resolved": "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz",
+      "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+      "license": "MIT",
+      "dependencies": {
+        "follow-redirects": "^1.10.0"
+      }
+    },
+    "node_modules/babel-loader": {
+      "version": "8.2.2",
+      "resolved": "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz",
+      "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
+      "license": "MIT",
+      "dependencies": {
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^1.4.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
+      },
+      "engines": {
+        "node": ">= 8.9"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "webpack": ">=2"
+      }
+    },
+    "node_modules/babel-loader/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/babel-loader/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/babel-loader/node_modules/schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 8.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/babel-plugin-dynamic-import-node": {
+      "version": "2.3.3",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+      "license": "MIT",
+      "dependencies": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "node_modules/babel-plugin-extract-import-names": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz",
+      "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "7.10.4"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "license": "MIT"
+    },
+    "node_modules/babel-plugin-polyfill-corejs2": {
+      "version": "0.1.10",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz",
+      "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/compat-data": "^7.13.0",
+        "@babel/helper-define-polyfill-provider": "^0.1.5",
+        "semver": "^6.1.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-corejs3": {
+      "version": "0.1.7",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz",
+      "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.1.5",
+        "core-js-compat": "^3.8.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/babel-plugin-polyfill-regenerator": {
+      "version": "0.1.6",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz",
+      "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-define-polyfill-provider": "^0.1.5"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/bail": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz",
+      "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+      "license": "MIT"
+    },
+    "node_modules/base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "license": "MIT",
+      "dependencies": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/base16": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz",
+      "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=",
+      "license": "MIT"
+    },
+    "node_modules/base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
+      "license": "MIT"
+    },
+    "node_modules/bcp-47-match": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz",
+      "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w==",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "node_modules/bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+      "license": "MIT"
+    },
+    "node_modules/bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
+      "license": "MIT"
+    },
+    "node_modules/body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/body-parser/node_modules/bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "license": "MIT",
+      "dependencies": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      }
+    },
+    "node_modules/bonjour/node_modules/array-flatten": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz",
+      "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==",
+      "license": "MIT"
+    },
+    "node_modules/boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+      "license": "ISC"
+    },
+    "node_modules/boxen": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/boxen/-/boxen-5.0.0.tgz",
+      "integrity": "sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-align": "^3.0.0",
+        "camelcase": "^6.2.0",
+        "chalk": "^4.1.0",
+        "cli-boxes": "^2.2.1",
+        "string-width": "^4.2.0",
+        "type-fest": "^0.20.2",
+        "widest-line": "^3.1.0",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/boxen/node_modules/ansi-regex": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/boxen/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/boxen/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/boxen/node_modules/string-width": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz",
+      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/boxen/node_modules/strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "license": "MIT",
+      "dependencies": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
+      "license": "MIT"
+    },
+    "node_modules/browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "license": "MIT",
+      "dependencies": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "license": "MIT",
+      "dependencies": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "node_modules/browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "license": "MIT",
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/browserify-rsa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^5.0.0",
+        "randombytes": "^2.0.1"
+      }
+    },
+    "node_modules/browserify-rsa/node_modules/bn.js": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz",
+      "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
+      "license": "MIT"
+    },
+    "node_modules/browserify-sign": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+      "license": "ISC",
+      "dependencies": {
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      }
+    },
+    "node_modules/browserify-sign/node_modules/bn.js": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz",
+      "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==",
+      "license": "MIT"
+    },
+    "node_modules/browserify-sign/node_modules/readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "license": "MIT",
+      "dependencies": {
+        "pako": "~1.0.5"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.16.3",
+      "resolved": "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz",
+      "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+      "license": "MIT",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001181",
+        "colorette": "^1.2.1",
+        "electron-to-chromium": "^1.3.649",
+        "escalade": "^3.1.1",
+        "node-releases": "^1.1.70"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/browserslist"
+      }
+    },
+    "node_modules/buffer": {
+      "version": "4.9.2",
+      "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+      "license": "MIT",
+      "dependencies": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+      "license": "MIT"
+    },
+    "node_modules/buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
+      "license": "MIT"
+    },
+    "node_modules/buffer-json": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz",
+      "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==",
+      "license": "MIT"
+    },
+    "node_modules/buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
+      "license": "MIT"
+    },
+    "node_modules/builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
+      "license": "MIT"
+    },
+    "node_modules/bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/cacache": {
+      "version": "15.0.5",
+      "resolved": "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz",
+      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
+      "license": "ISC",
+      "dependencies": {
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.0",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/cacache/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/cacache/node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/cache-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz",
+      "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==",
+      "license": "MIT",
+      "dependencies": {
+        "buffer-json": "^2.0.0",
+        "find-cache-dir": "^3.0.0",
+        "loader-utils": "^1.2.3",
+        "mkdirp": "^0.5.1",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 8.9.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0"
+      }
+    },
+    "node_modules/cache-loader/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/cache-loader/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/cache-loader/node_modules/schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 8.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/cacheable-request": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz",
+      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "license": "MIT",
+      "dependencies": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^3.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^4.1.0",
+        "responselike": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cacheable-request/node_modules/get-stream": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz",
+      "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+      "license": "MIT",
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cacheable-request/node_modules/lowercase-keys": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+      "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cacheable-request/node_modules/normalize-url": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz",
+      "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/caller-callsite/node_modules/callsites": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz",
+      "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz",
+      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+      "license": "MIT",
+      "dependencies": {
+        "caller-callsite": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/camel-case": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz",
+      "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+      "license": "MIT",
+      "dependencies": {
+        "pascal-case": "^3.1.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/camelcase": {
+      "version": "6.2.0",
+      "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz",
+      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001202",
+      "resolved": "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz",
+      "integrity": "sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ==",
+      "license": "CC-BY-4.0"
+    },
+    "node_modules/ccount": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz",
+      "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/chalk": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz",
+      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/chalk/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/chalk/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/chalk/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/chalk/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/character-entities": {
+      "version": "1.2.4",
+      "resolved": "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz",
+      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/character-entities-legacy": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+      "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/character-reference-invalid": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+      "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "2.1.8",
+      "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz",
+      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+      "license": "MIT",
+      "dependencies": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "fsevents": "^1.2.7",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      },
+      "optionalDependencies": {
+        "fsevents": "^1.2.7"
+      }
+    },
+    "node_modules/chokidar/node_modules/glob-parent": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz",
+      "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^3.1.0",
+        "path-dirname": "^1.0.0"
+      }
+    },
+    "node_modules/chokidar/node_modules/glob-parent/node_modules/is-glob": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz",
+      "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/chrome-trace-event/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "license": "0BSD"
+    },
+    "node_modules/ci-info": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz",
+      "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ==",
+      "license": "MIT"
+    },
+    "node_modules/cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "license": "MIT",
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/classnames": {
+      "version": "2.2.6",
+      "resolved": "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz",
+      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==",
+      "license": "MIT"
+    },
+    "node_modules/clean-css": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/clean-css/-/clean-css-5.1.1.tgz",
+      "integrity": "sha512-GQ6HdEyJN0543mRTA/TkZ7RPoMXGWKq1shs9H86F2kLuixR0RI+xd4JfhJxWUW08FGKQXTKAKpVjKQXu5zkFNA==",
+      "license": "MIT",
+      "dependencies": {
+        "source-map": "~0.6.0"
+      },
+      "engines": {
+        "node": ">= 10.0"
+      }
+    },
+    "node_modules/clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/cli-boxes": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz",
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/clipboard": {
+      "version": "2.0.8",
+      "resolved": "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz",
+      "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
+    "node_modules/cliui": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "license": "ISC",
+      "dependencies": {
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
+      }
+    },
+    "node_modules/cliui/node_modules/wrap-ansi": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.0",
+        "string-width": "^3.0.0",
+        "strip-ansi": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "license": "MIT",
+      "dependencies": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "node_modules/clsx": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz",
+      "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      },
+      "engines": {
+        "node": ">= 4.0"
+      }
+    },
+    "node_modules/coa/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/collapse-white-space": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
+      "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "license": "MIT",
+      "dependencies": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/color": {
+      "version": "3.1.3",
+      "resolved": "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz",
+      "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.4"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-convert/node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+      "license": "MIT"
+    },
+    "node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+      "license": "MIT"
+    },
+    "node_modules/color-string": {
+      "version": "1.5.5",
+      "resolved": "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz",
+      "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "node_modules/color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+      "bin": {
+        "color-support": "bin.js"
+      }
+    },
+    "node_modules/colorette": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz",
+      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+      "license": "MIT"
+    },
+    "node_modules/comma-separated-tokens": {
+      "version": "1.0.8",
+      "resolved": "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+      "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+      "license": "MIT"
+    },
+    "node_modules/commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+      "license": "MIT"
+    },
+    "node_modules/component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+      "license": "MIT"
+    },
+    "node_modules/compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": ">= 1.43.0 < 2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "license": "MIT",
+      "dependencies": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/compression/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "license": "MIT"
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+      "license": "MIT"
+    },
+    "node_modules/concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "engines": [
+        "node >= 0.8"
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "node_modules/configstore": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz",
+      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dot-prop": "^5.2.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "unique-string": "^2.0.0",
+        "write-file-atomic": "^3.0.0",
+        "xdg-basedir": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8"
+      }
+    },
+    "node_modules/consola": {
+      "version": "2.15.3",
+      "resolved": "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz",
+      "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==",
+      "license": "MIT"
+    },
+    "node_modules/console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
+    },
+    "node_modules/console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+    },
+    "node_modules/constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
+      "license": "MIT"
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.1.1"
+      }
+    },
+    "node_modules/convert-source-map/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "license": "MIT"
+    },
+    "node_modules/cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
+      "license": "MIT"
+    },
+    "node_modules/copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "license": "ISC",
+      "dependencies": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "node_modules/copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/copy-text-to-clipboard": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz",
+      "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/copy-webpack-plugin": {
+      "version": "6.4.1",
+      "resolved": "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz",
+      "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==",
+      "license": "MIT",
+      "dependencies": {
+        "cacache": "^15.0.5",
+        "fast-glob": "^3.2.4",
+        "find-cache-dir": "^3.3.1",
+        "glob-parent": "^5.1.1",
+        "globby": "^11.0.1",
+        "loader-utils": "^2.0.0",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^3.0.2",
+        "schema-utils": "^3.0.0",
+        "serialize-javascript": "^5.0.1",
+        "webpack-sources": "^1.4.3"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.37.0 || ^5.0.0"
+      }
+    },
+    "node_modules/copy-webpack-plugin/node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/core-js": {
+      "version": "3.9.1",
+      "resolved": "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz",
+      "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/core-js-compat": {
+      "version": "3.9.1",
+      "resolved": "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz",
+      "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.16.3",
+        "semver": "7.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/core-js-compat/node_modules/semver": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz",
+      "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/core-js-pure": {
+      "version": "3.9.1",
+      "resolved": "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.1.tgz",
+      "integrity": "sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/core-js"
+      }
+    },
+    "node_modules/core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "license": "MIT"
+    },
+    "node_modules/cosmiconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      }
+    },
+    "node_modules/create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "license": "MIT",
+      "dependencies": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "node_modules/create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "license": "MIT",
+      "dependencies": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "node_modules/cross-fetch": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.0.tgz",
+      "integrity": "sha512-a+yso9lSpXQI9DH+YjAu/m0dVfP8IVoZDPBLLFcvGpeq3KHNdikkekTOdkHiXEuTq4GBOeO0MfWkE40yzF1w7g==",
+      "license": "MIT",
+      "dependencies": {
+        "node-fetch": "2.6.1"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/cross-spawn/node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/cross-spawn/node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "license": "MIT",
+      "dependencies": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/crypto-random-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/css-blank-pseudo": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
+      "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.5"
+      },
+      "bin": {
+        "css-blank-pseudo": "cli.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      },
+      "engines": {
+        "node": ">4"
+      }
+    },
+    "node_modules/css-has-pseudo": {
+      "version": "0.10.0",
+      "resolved": "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
+      "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^5.0.0-rc.4"
+      },
+      "bin": {
+        "css-has-pseudo": "cli.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/css-has-pseudo/node_modules/cssesc": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+      "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+      "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^2.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/css-loader": {
+      "version": "5.1.3",
+      "resolved": "https://registry.yarnpkg.com/css-loader/-/css-loader-5.1.3.tgz",
+      "integrity": "sha512-CoPZvyh8sLiGARK3gqczpfdedbM74klGWurF2CsNZ2lhNaXdLIUks+3Mfax3WBeRuHoglU+m7KG/+7gY6G4aag==",
+      "license": "MIT",
+      "dependencies": {
+        "camelcase": "^6.2.0",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^5.1.0",
+        "loader-utils": "^2.0.0",
+        "postcss": "^8.2.8",
+        "postcss-modules-extract-imports": "^3.0.0",
+        "postcss-modules-local-by-default": "^4.0.0",
+        "postcss-modules-scope": "^3.0.0",
+        "postcss-modules-values": "^4.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^3.0.0",
+        "semver": "^7.3.4"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.27.0 || ^5.0.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+      "license": "ISC",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss": {
+      "version": "8.2.8",
+      "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-8.2.8.tgz",
+      "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+      "license": "MIT",
+      "dependencies": {
+        "colorette": "^1.2.2",
+        "nanoid": "^3.1.20",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "license": "ISC",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss-modules-local-by-default": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+      "license": "MIT",
+      "dependencies": {
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss-modules-scope": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+      "license": "ISC",
+      "dependencies": {
+        "postcss-selector-parser": "^6.0.4"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "license": "ISC",
+      "dependencies": {
+        "icss-utils": "^5.0.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss-selector-parser": {
+      "version": "6.0.4",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+      "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/css-loader/node_modules/postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "license": "MIT"
+    },
+    "node_modules/css-loader/node_modules/semver": {
+      "version": "7.3.4",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz",
+      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+      "license": "ISC",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/css-prefers-color-scheme": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
+      "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.5"
+      },
+      "bin": {
+        "css-prefers-color-scheme": "cli.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/css-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz",
+      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "^1.0.0",
+        "css-what": "^3.2.1",
+        "domutils": "^1.7.0",
+        "nth-check": "^1.0.2"
+      }
+    },
+    "node_modules/css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
+      "license": "MIT"
+    },
+    "node_modules/css-select/node_modules/css-what": {
+      "version": "3.4.2",
+      "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz",
+      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">= 6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/fb55"
+      }
+    },
+    "node_modules/css-select/node_modules/domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/css-select/node_modules/domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/css-selector-parser": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
+      "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g=="
+    },
+    "node_modules/css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+      "license": "MIT",
+      "dependencies": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/cssdb": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz",
+      "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==",
+      "license": "CC0-1.0"
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssnano": {
+      "version": "4.1.10",
+      "resolved": "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz",
+      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.7",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano-preset-advanced": {
+      "version": "4.0.7",
+      "resolved": "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz",
+      "integrity": "sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw==",
+      "license": "MIT",
+      "dependencies": {
+        "autoprefixer": "^9.4.7",
+        "cssnano-preset-default": "^4.0.7",
+        "postcss-discard-unused": "^4.0.1",
+        "postcss-merge-idents": "^4.0.1",
+        "postcss-reduce-idents": "^4.0.2",
+        "postcss-zindex": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano-preset-default": {
+      "version": "4.0.7",
+      "resolved": "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "license": "MIT",
+      "dependencies": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.2",
+        "postcss-unique-selectors": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/cssnano/node_modules/cosmiconfig": {
+      "version": "5.2.1",
+      "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+      "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+      "license": "MIT",
+      "dependencies": {
+        "import-fresh": "^2.0.0",
+        "is-directory": "^0.3.1",
+        "js-yaml": "^3.13.1",
+        "parse-json": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssnano/node_modules/import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "license": "MIT",
+      "dependencies": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/cssnano/node_modules/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+      "license": "MIT",
+      "dependencies": {
+        "error-ex": "^1.3.1",
+        "json-parse-better-errors": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csso": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+      "license": "MIT",
+      "dependencies": {
+        "css-tree": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/css-tree": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz",
+      "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "mdn-data": "2.0.14",
+        "source-map": "^0.6.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/csso/node_modules/mdn-data": {
+      "version": "2.0.14",
+      "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz",
+      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+      "license": "CC0-1.0"
+    },
+    "node_modules/csstype": {
+      "version": "3.0.7",
+      "resolved": "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz",
+      "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g==",
+      "license": "MIT"
+    },
+    "node_modules/cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
+      "license": "MIT"
+    },
+    "node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "license": "MIT",
+      "dependencies": {
+        "mimic-response": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "license": "MIT",
+      "dependencies": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/default-gateway": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz",
+      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "execa": "^1.0.0",
+        "ip-regex": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/default-gateway/node_modules/cross-spawn": {
+      "version": "6.0.5",
+      "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz",
+      "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+      "license": "MIT",
+      "dependencies": {
+        "nice-try": "^1.0.4",
+        "path-key": "^2.0.1",
+        "semver": "^5.5.0",
+        "shebang-command": "^1.2.0",
+        "which": "^1.2.9"
+      },
+      "engines": {
+        "node": ">=4.8"
+      }
+    },
+    "node_modules/default-gateway/node_modules/execa": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz",
+      "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+      "license": "MIT",
+      "dependencies": {
+        "cross-spawn": "^6.0.0",
+        "get-stream": "^4.0.0",
+        "is-stream": "^1.1.0",
+        "npm-run-path": "^2.0.0",
+        "p-finally": "^1.0.0",
+        "signal-exit": "^3.0.0",
+        "strip-eof": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/default-gateway/node_modules/is-stream": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz",
+      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/default-gateway/node_modules/npm-run-path": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz",
+      "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/default-gateway/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/default-gateway/node_modules/shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/default-gateway/node_modules/shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/defer-to-connect": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+      "license": "MIT"
+    },
+    "node_modules/define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "license": "MIT",
+      "dependencies": {
+        "object-keys": "^1.0.12"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-accessor-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+      "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-accessor-descriptor/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-data-descriptor": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+      "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-data-descriptor/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/is-descriptor": {
+      "version": "0.1.6",
+      "resolved": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz",
+      "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-accessor-descriptor": "^0.1.6",
+        "is-data-descriptor": "^0.1.4",
+        "kind-of": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/define-property/node_modules/kind-of": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz",
+      "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/del": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz",
+      "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "globby": "^11.0.1",
+        "graceful-fs": "^4.2.4",
+        "is-glob": "^4.0.1",
+        "is-path-cwd": "^2.2.0",
+        "is-path-inside": "^3.0.2",
+        "p-map": "^4.0.0",
+        "rimraf": "^3.0.2",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/del/node_modules/rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/des.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
+      "license": "MIT"
+    },
+    "node_modules/detab": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz",
+      "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==",
+      "license": "MIT",
+      "dependencies": {
+        "repeat-string": "^1.5.4"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/detect-node": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.5.tgz",
+      "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw==",
+      "license": "MIT"
+    },
+    "node_modules/detect-port": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz",
+      "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==",
+      "license": "MIT",
+      "dependencies": {
+        "address": "^1.0.1",
+        "debug": "^2.6.0"
+      },
+      "bin": {
+        "detect": "bin/detect-port",
+        "detect-port": "bin/detect-port"
+      },
+      "engines": {
+        "node": ">= 4.2.1"
+      }
+    },
+    "node_modules/detect-port-alt": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+      "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "address": "^1.0.1",
+        "debug": "^2.6.0"
+      },
+      "bin": {
+        "detect": "bin/detect-port",
+        "detect-port": "bin/detect-port"
+      },
+      "engines": {
+        "node": ">= 4.2.1"
+      }
+    },
+    "node_modules/diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "node_modules/dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "license": "MIT",
+      "dependencies": {
+        "path-type": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/direction": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz",
+      "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ==",
+      "bin": {
+        "direction": "cli.js"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
+      "license": "MIT"
+    },
+    "node_modules/dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "license": "MIT",
+      "dependencies": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "node_modules/dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "license": "MIT",
+      "dependencies": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "node_modules/docusaurus-lunr-search": {
+      "version": "2.1.10",
+      "resolved": "https://registry.npmjs.org/docusaurus-lunr-search/-/docusaurus-lunr-search-2.1.10.tgz",
+      "integrity": "sha512-UIb19XkoP9VyXoKxua99PS4wpfnifw/jwVUBok0B0NAm+3HSTfoJ8GQVZPHmc26h7jX/FnqfIeUKS+xcqlQPTw==",
+      "dependencies": {
+        "autocomplete.js": "^0.37.0",
+        "classnames": "^2.2.6",
+        "gauge": "^3.0.0",
+        "hast-util-select": "^4.0.0",
+        "hast-util-to-text": "^2.0.0",
+        "hogan.js": "^3.0.2",
+        "lunr": "^2.3.8",
+        "lunr-languages": "^1.4.0",
+        "minimatch": "^3.0.4",
+        "object-assign": "^4.1.1",
+        "rehype-parse": "^7.0.1",
+        "to-vfile": "^6.1.0",
+        "unified": "^9.0.0",
+        "unist-util-is": "^4.0.2"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "peerDependencies": {
+        "@docusaurus/core": "^2.0.0-alpha.60 || ^2.0.0",
+        "react": "^16.8.4",
+        "react-dom": "^16.8.4"
+      }
+    },
+    "node_modules/docusaurus-lunr-search/node_modules/hast-util-from-parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
+      "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
+      "dependencies": {
+        "@types/parse5": "^5.0.0",
+        "hastscript": "^6.0.0",
+        "property-information": "^5.0.0",
+        "vfile": "^4.0.0",
+        "vfile-location": "^3.2.0",
+        "web-namespaces": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/docusaurus-lunr-search/node_modules/hastscript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+      "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+      "dependencies": {
+        "@types/hast": "^2.0.0",
+        "comma-separated-tokens": "^1.0.0",
+        "hast-util-parse-selector": "^2.0.0",
+        "property-information": "^5.0.0",
+        "space-separated-tokens": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/docusaurus-lunr-search/node_modules/rehype-parse": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-7.0.1.tgz",
+      "integrity": "sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw==",
+      "dependencies": {
+        "hast-util-from-parse5": "^6.0.0",
+        "parse5": "^6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "license": "MIT",
+      "dependencies": {
+        "utila": "~0.4"
+      }
+    },
+    "node_modules/dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      }
+    },
+    "node_modules/dom-serializer/node_modules/entities": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+      "license": "BSD-2-Clause",
+      "funding": {
+        "url": "https://github.com/fb55/entities?sponsor=1"
+      }
+    },
+    "node_modules/domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4",
+        "npm": ">=1.2"
+      }
+    },
+    "node_modules/domelementtype": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz",
+      "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/fb55"
+        }
+      ],
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/dot-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz",
+      "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+      "license": "MIT",
+      "dependencies": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "license": "MIT",
+      "dependencies": {
+        "is-obj": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+      "license": "MIT"
+    },
+    "node_modules/duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "license": "MIT",
+      "dependencies": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+      "license": "MIT"
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.3.691",
+      "resolved": "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.691.tgz",
+      "integrity": "sha512-ZqiO69KImmOGCyoH0icQPU3SndJiW93juEvf63gQngyhODO6SpQIPMTOHldtCs5DS5GMKvAkquk230E2zt2vpw==",
+      "license": "ISC"
+    },
+    "node_modules/elliptic": {
+      "version": "6.5.4",
+      "resolved": "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz",
+      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+      "license": "MIT"
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/emoticon": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz",
+      "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "once": "^1.4.0"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+      "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/enhanced-resolve/node_modules/memory-fs": {
+      "version": "0.5.0",
+      "resolved": "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz",
+      "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+      "license": "MIT",
+      "dependencies": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "license": "MIT",
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "license": "MIT",
+      "dependencies": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "node_modules/es-abstract": {
+      "version": "1.18.0",
+      "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz",
+      "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.2",
+        "is-callable": "^1.2.3",
+        "is-negative-zero": "^2.0.1",
+        "is-regex": "^1.1.2",
+        "is-string": "^1.0.5",
+        "object-inspect": "^1.9.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.2",
+        "string.prototype.trimend": "^1.0.4",
+        "string.prototype.trimstart": "^1.0.4",
+        "unbox-primitive": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-goat": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz",
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
+      "license": "MIT"
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+      "license": "BSD-2-Clause",
+      "bin": {
+        "esparse": "bin/esparse.js",
+        "esvalidate": "bin/esvalidate.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz",
+      "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+      "license": "BSD-2-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/eta": {
+      "version": "1.12.1",
+      "resolved": "https://registry.yarnpkg.com/eta/-/eta-1.12.1.tgz",
+      "integrity": "sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/eta-dev/eta?sponsor=1"
+      }
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/eval": {
+      "version": "0.1.6",
+      "resolved": "https://registry.yarnpkg.com/eval/-/eval-0.1.6.tgz",
+      "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==",
+      "dependencies": {
+        "require-like": ">= 0.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+      "license": "MIT"
+    },
+    "node_modules/events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/eventsource": {
+      "version": "1.0.7",
+      "resolved": "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz",
+      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+      "license": "MIT",
+      "dependencies": {
+        "original": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "license": "MIT",
+      "dependencies": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/execa": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz",
+      "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/execa/node_modules/get-stream": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz",
+      "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "license": "MIT",
+      "dependencies": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/express/node_modules/content-disposition": {
+      "version": "0.5.3",
+      "resolved": "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz",
+      "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "5.1.2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/express/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "license": "MIT"
+    },
+    "node_modules/extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+      "license": "MIT"
+    },
+    "node_modules/extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "license": "MIT",
+      "dependencies": {
+        "is-extendable": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "license": "MIT",
+      "dependencies": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/extglob/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+      "license": "MIT"
+    },
+    "node_modules/fast-glob": {
+      "version": "3.2.5",
+      "resolved": "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz",
+      "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+      "license": "MIT",
+      "dependencies": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2",
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fast-glob/node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "license": "MIT",
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fast-glob/node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "license": "MIT",
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fast-glob/node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/fast-glob/node_modules/micromatch": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz",
+      "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "braces": "^3.0.1",
+        "picomatch": "^2.0.5"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/fast-glob/node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+      "license": "MIT"
+    },
+    "node_modules/fast-url-parser": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
+      "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=",
+      "license": "MIT",
+      "dependencies": {
+        "punycode": "^1.3.2"
+      }
+    },
+    "node_modules/fastq": {
+      "version": "1.11.0",
+      "resolved": "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz",
+      "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+      "license": "ISC",
+      "dependencies": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "node_modules/faye-websocket": {
+      "version": "0.11.3",
+      "resolved": "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz",
+      "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "websocket-driver": ">=0.5.1"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/fbemitter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz",
+      "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "fbjs": "^3.0.0"
+      }
+    },
+    "node_modules/fbjs": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz",
+      "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==",
+      "license": "MIT",
+      "dependencies": {
+        "cross-fetch": "^3.0.4",
+        "fbjs-css-vars": "^1.0.0",
+        "loose-envify": "^1.0.0",
+        "object-assign": "^4.1.0",
+        "promise": "^7.1.1",
+        "setimmediate": "^1.0.5",
+        "ua-parser-js": "^0.7.18"
+      }
+    },
+    "node_modules/fbjs-css-vars": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
+      "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==",
+      "license": "MIT"
+    },
+    "node_modules/feed": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz",
+      "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
+      "license": "MIT",
+      "dependencies": {
+        "xml-js": "^1.6.11"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+      "license": "ISC"
+    },
+    "node_modules/figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "license": "MIT",
+      "dependencies": {
+        "escape-string-regexp": "^1.0.5"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/file-loader": {
+      "version": "6.2.0",
+      "resolved": "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz",
+      "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+      "license": "MIT",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/filesize": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz",
+      "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "license": "MIT",
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/find-cache-dir": {
+      "version": "3.3.1",
+      "resolved": "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+      "license": "MIT",
+      "dependencies": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "license": "MIT",
+      "dependencies": {
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/flatten": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz",
+      "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==",
+      "license": "MIT"
+    },
+    "node_modules/flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "node_modules/flux": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/flux/-/flux-4.0.1.tgz",
+      "integrity": "sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "fbemitter": "^3.0.0",
+        "fbjs": "^3.0.0"
+      },
+      "peerDependencies": {
+        "react": "^15.0.2 || ^16.0.0 || ^17.0.0"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.13.3",
+      "resolved": "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz",
+      "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fork-ts-checker-webpack-plugin": {
+      "version": "4.1.6",
+      "resolved": "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz",
+      "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.5.5",
+        "chalk": "^2.4.1",
+        "micromatch": "^3.1.10",
+        "minimatch": "^3.0.4",
+        "semver": "^5.6.0",
+        "tapable": "^1.0.0",
+        "worker-rpc": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=6.11.5",
+        "yarn": ">=1.0.0"
+      }
+    },
+    "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fraction.js": {
+      "version": "4.0.13",
+      "resolved": "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.13.tgz",
+      "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA==",
+      "license": "MIT OR GPL-2.0-or-later",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "license": "MIT",
+      "dependencies": {
+        "map-cache": "^0.2.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "node_modules/fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "license": "MIT",
+      "dependencies": {
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "license": "ISC",
+      "dependencies": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+      "license": "ISC"
+    },
+    "node_modules/fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "hasInstallScript": true,
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "dependencies": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      },
+      "engines": {
+        "node": ">= 4.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "license": "MIT"
+    },
+    "node_modules/gauge": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.0.tgz",
+      "integrity": "sha512-VSxauaaCsLOTerAyzunAYGgK3iaWZvOL1BCvBvf/IhDWrczPAf1tUqn05DOCJOOe4k3vOdX6fHhJIvF2UtCMhw==",
+      "dependencies": {
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.1",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1 || ^2.0.0",
+        "strip-ansi": "^3.0.1 || ^4.0.0",
+        "wide-align": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/gauge/node_modules/ansi-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/gauge/node_modules/string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "dependencies": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/gauge/node_modules/strip-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+      "dependencies": {
+        "ansi-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+      "license": "ISC",
+      "engines": {
+        "node": "6.* || 8.* || >= 10.*"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==",
+      "license": "ISC"
+    },
+    "node_modules/get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "license": "MIT",
+      "dependencies": {
+        "pump": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/github-slugger": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz",
+      "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==",
+      "license": "ISC",
+      "dependencies": {
+        "emoji-regex": ">=6.0.0 <=6.1.1"
+      }
+    },
+    "node_modules/github-slugger/node_modules/emoji-regex": {
+      "version": "6.1.1",
+      "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz",
+      "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4=",
+      "license": "MIT"
+    },
+    "node_modules/glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "license": "ISC",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "license": "ISC",
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/global-dirs": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz",
+      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+      "license": "MIT",
+      "dependencies": {
+        "ini": "2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/global-dirs/node_modules/ini": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz",
+      "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/global-modules": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz",
+      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+      "license": "MIT",
+      "dependencies": {
+        "global-prefix": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/global-prefix": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz",
+      "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+      "license": "MIT",
+      "dependencies": {
+        "ini": "^1.3.5",
+        "kind-of": "^6.0.2",
+        "which": "^1.3.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/globby": {
+      "version": "11.0.2",
+      "resolved": "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz",
+      "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
+      "license": "MIT",
+      "dependencies": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "delegate": "^3.1.2"
+      }
+    },
+    "node_modules/got": {
+      "version": "9.6.0",
+      "resolved": "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@sindresorhus/is": "^0.14.0",
+        "@szmarczak/http-timer": "^1.1.2",
+        "cacheable-request": "^6.0.0",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^4.1.0",
+        "lowercase-keys": "^1.0.1",
+        "mimic-response": "^1.0.1",
+        "p-cancelable": "^1.0.0",
+        "to-readable-stream": "^1.0.0",
+        "url-parse-lax": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8.6"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.6",
+      "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz",
+      "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+      "license": "ISC"
+    },
+    "node_modules/gray-matter": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz",
+      "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
+      "license": "MIT",
+      "dependencies": {
+        "js-yaml": "^3.11.0",
+        "kind-of": "^6.0.2",
+        "section-matter": "^1.0.0",
+        "strip-bom-string": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz",
+      "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+      "license": "MIT",
+      "dependencies": {
+        "duplexer": "^0.1.1",
+        "pify": "^4.0.1"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/handle-thing": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz",
+      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+      "license": "MIT"
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-bigints": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz",
+      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz",
+      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+    },
+    "node_modules/has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "license": "MIT",
+      "dependencies": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-values/node_modules/kind-of": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz",
+      "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/has-yarn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz",
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/hash-base/node_modules/readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "node_modules/hast-to-hyperscript": {
+      "version": "9.0.1",
+      "resolved": "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz",
+      "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^2.0.3",
+        "comma-separated-tokens": "^1.0.0",
+        "property-information": "^5.3.0",
+        "space-separated-tokens": "^1.0.0",
+        "style-to-object": "^0.3.0",
+        "unist-util-is": "^4.0.0",
+        "web-namespaces": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-from-parse5": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz",
+      "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==",
+      "license": "MIT",
+      "dependencies": {
+        "ccount": "^1.0.3",
+        "hastscript": "^5.0.0",
+        "property-information": "^5.0.0",
+        "web-namespaces": "^1.1.2",
+        "xtend": "^4.0.1"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-has-property": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz",
+      "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-is-element": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz",
+      "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-parse-selector": {
+      "version": "2.2.5",
+      "resolved": "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+      "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-raw": {
+      "version": "6.0.1",
+      "resolved": "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz",
+      "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^2.0.0",
+        "hast-util-from-parse5": "^6.0.0",
+        "hast-util-to-parse5": "^6.0.0",
+        "html-void-elements": "^1.0.0",
+        "parse5": "^6.0.0",
+        "unist-util-position": "^3.0.0",
+        "vfile": "^4.0.0",
+        "web-namespaces": "^1.0.0",
+        "xtend": "^4.0.0",
+        "zwitch": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-raw/node_modules/hast-util-from-parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
+      "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/parse5": "^5.0.0",
+        "hastscript": "^6.0.0",
+        "property-information": "^5.0.0",
+        "vfile": "^4.0.0",
+        "vfile-location": "^3.2.0",
+        "web-namespaces": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-raw/node_modules/hastscript": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz",
+      "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/hast": "^2.0.0",
+        "comma-separated-tokens": "^1.0.0",
+        "hast-util-parse-selector": "^2.0.0",
+        "property-information": "^5.0.0",
+        "space-separated-tokens": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-select": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-4.0.2.tgz",
+      "integrity": "sha512-8EEG2//bN5rrzboPWD2HdS3ugLijNioS1pqOTIolXNf67xxShYw4SQEmVXd3imiBG+U2bC2nVTySr/iRAA7Cjg==",
+      "dependencies": {
+        "bcp-47-match": "^1.0.0",
+        "comma-separated-tokens": "^1.0.0",
+        "css-selector-parser": "^1.0.0",
+        "direction": "^1.0.0",
+        "hast-util-has-property": "^1.0.0",
+        "hast-util-is-element": "^1.0.0",
+        "hast-util-to-string": "^1.0.0",
+        "hast-util-whitespace": "^1.0.0",
+        "not": "^0.1.0",
+        "nth-check": "^2.0.0",
+        "property-information": "^5.0.0",
+        "space-separated-tokens": "^1.0.0",
+        "unist-util-visit": "^2.0.0",
+        "zwitch": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-select/node_modules/nth-check": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+      "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+      "dependencies": {
+        "boolbase": "^1.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/fb55/nth-check?sponsor=1"
+      }
+    },
+    "node_modules/hast-util-to-parse5": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz",
+      "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "hast-to-hyperscript": "^9.0.0",
+        "property-information": "^5.0.0",
+        "web-namespaces": "^1.0.0",
+        "xtend": "^4.0.0",
+        "zwitch": "^1.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-string": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz",
+      "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-to-text": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz",
+      "integrity": "sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==",
+      "dependencies": {
+        "hast-util-is-element": "^1.0.0",
+        "repeat-string": "^1.0.0",
+        "unist-util-find-after": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hast-util-whitespace": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
+      "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A==",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/hastscript": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz",
+      "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "license": "MIT",
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "node_modules/hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
+      "license": "MIT"
+    },
+    "node_modules/history": {
+      "version": "4.10.1",
+      "resolved": "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz",
+      "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.1.2",
+        "loose-envify": "^1.2.0",
+        "resolve-pathname": "^3.0.0",
+        "tiny-invariant": "^1.0.2",
+        "tiny-warning": "^1.0.0",
+        "value-equal": "^1.0.1"
+      }
+    },
+    "node_modules/hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "license": "MIT",
+      "dependencies": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "node_modules/hogan.js": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz",
+      "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=",
+      "dependencies": {
+        "mkdirp": "0.3.0",
+        "nopt": "1.0.10"
+      },
+      "bin": {
+        "hulk": "bin/hulk"
+      }
+    },
+    "node_modules/hogan.js/node_modules/mkdirp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz",
+      "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=",
+      "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/hoist-non-react-statics": {
+      "version": "3.3.2",
+      "resolved": "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+      "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "react-is": "^16.7.0"
+      }
+    },
+    "node_modules/hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "node_modules/hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
+      "license": "MIT"
+    },
+    "node_modules/hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
+      "license": "MIT"
+    },
+    "node_modules/html-comment-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
+      "license": "MIT"
+    },
+    "node_modules/html-entities": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz",
+      "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==",
+      "license": "MIT"
+    },
+    "node_modules/html-minifier-terser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+      "license": "MIT",
+      "dependencies": {
+        "camel-case": "^4.1.1",
+        "clean-css": "^4.2.3",
+        "commander": "^4.1.1",
+        "he": "^1.2.0",
+        "param-case": "^3.0.3",
+        "relateurl": "^0.2.7",
+        "terser": "^4.6.3"
+      },
+      "bin": {
+        "html-minifier-terser": "cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/html-minifier-terser/node_modules/clean-css": {
+      "version": "4.2.3",
+      "resolved": "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz",
+      "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+      "license": "MIT",
+      "dependencies": {
+        "source-map": "~0.6.0"
+      },
+      "engines": {
+        "node": ">= 4.0"
+      }
+    },
+    "node_modules/html-minifier-terser/node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/html-tags": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz",
+      "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/html-void-elements": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz",
+      "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/html-webpack-plugin": {
+      "version": "4.5.2",
+      "resolved": "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz",
+      "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/html-minifier-terser": "^5.0.0",
+        "@types/tapable": "^1.0.5",
+        "@types/webpack": "^4.41.8",
+        "html-minifier-terser": "^5.0.1",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "pretty-error": "^2.1.1",
+        "tapable": "^1.1.3",
+        "util.promisify": "1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/html-webpack-plugin/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/html-webpack-plugin/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/domelementtype": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz",
+      "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/htmlparser2/node_modules/domhandler": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz",
+      "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/domutils": {
+      "version": "1.7.0",
+      "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz",
+      "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "dom-serializer": "0",
+        "domelementtype": "1"
+      }
+    },
+    "node_modules/htmlparser2/node_modules/readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/http-cache-semantics": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+      "license": "BSD-2-Clause"
+    },
+    "node_modules/http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
+      "license": "MIT"
+    },
+    "node_modules/http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/http-errors/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "license": "ISC"
+    },
+    "node_modules/http-parser-js": {
+      "version": "0.5.3",
+      "resolved": "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz",
+      "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==",
+      "license": "MIT"
+    },
+    "node_modules/http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "license": "MIT",
+      "dependencies": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
+      "license": "MIT"
+    },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "license": "MIT",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=",
+      "license": "MIT"
+    },
+    "node_modules/ignore": {
+      "version": "5.1.8",
+      "resolved": "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/immediate": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
+      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q=="
+    },
+    "node_modules/immer": {
+      "version": "8.0.1",
+      "resolved": "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz",
+      "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/immer"
+      }
+    },
+    "node_modules/import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "license": "MIT",
+      "dependencies": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/import-fresh/node_modules/resolve-from": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz",
+      "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-lazy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "license": "MIT",
+      "dependencies": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.19"
+      }
+    },
+    "node_modules/indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
+      "license": "MIT"
+    },
+    "node_modules/infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
+      "license": "ISC"
+    },
+    "node_modules/infima": {
+      "version": "0.2.0-alpha.21",
+      "resolved": "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.21.tgz",
+      "integrity": "sha512-32uq+rWIrLNZx0jzNrwJWE8Go9NvpP0JTRKMXJ8aYlWZ0vm9OCgAEcVquwFBSW6ZP7R2rjBUjPy/nJ3PK7MhUA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "license": "ISC",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+      "license": "ISC"
+    },
+    "node_modules/ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+      "license": "ISC"
+    },
+    "node_modules/inline-style-parser": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
+      "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==",
+      "license": "MIT"
+    },
+    "node_modules/internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "license": "MIT",
+      "dependencies": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
+      "license": "MIT"
+    },
+    "node_modules/ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-absolute-url": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+      "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-alphabetical": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+      "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-alphanumerical": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+      "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+      "license": "MIT",
+      "dependencies": {
+        "is-alphabetical": "^1.0.0",
+        "is-decimal": "^1.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-arguments": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz",
+      "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "license": "MIT"
+    },
+    "node_modules/is-bigint": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz",
+      "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "license": "MIT",
+      "dependencies": {
+        "binary-extensions": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-boolean-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
+      "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+      "license": "MIT"
+    },
+    "node_modules/is-callable": {
+      "version": "1.2.3",
+      "resolved": "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz",
+      "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "license": "MIT",
+      "dependencies": {
+        "ci-info": "^2.0.0"
+      },
+      "bin": {
+        "is-ci": "bin.js"
+      }
+    },
+    "node_modules/is-ci/node_modules/ci-info": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz",
+      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+      "license": "MIT"
+    },
+    "node_modules/is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "license": "MIT",
+      "dependencies": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz",
+      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+      "license": "MIT",
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-decimal": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz",
+      "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+      "license": "MIT",
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-hexadecimal": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+      "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-installed-globally": {
+      "version": "0.4.0",
+      "resolved": "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "global-dirs": "^3.0.0",
+        "is-path-inside": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-negative-zero": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-npm": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz",
+      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number-object": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz",
+      "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-number/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/is-path-in-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-path-inside": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/is-path-in-cwd/node_modules/is-path-inside": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz",
+      "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+      "license": "MIT",
+      "dependencies": {
+        "path-is-inside": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-plain-obj": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "license": "MIT",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz",
+      "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "has-symbols": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
+      "license": "ISC"
+    },
+    "node_modules/is-root": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz",
+      "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz",
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-svg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz",
+      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
+      "license": "MIT",
+      "dependencies": {
+        "html-comment-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "license": "MIT",
+      "dependencies": {
+        "has-symbols": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+      "license": "MIT"
+    },
+    "node_modules/is-whitespace-character": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
+      "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-word-character": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz",
+      "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/is-yarn-global": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
+      "license": "MIT"
+    },
+    "node_modules/isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+      "license": "MIT"
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "license": "ISC"
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/jest-worker": {
+      "version": "26.6.2",
+      "resolved": "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz",
+      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/jest-worker/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-worker/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/joi": {
+      "version": "17.4.0",
+      "resolved": "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz",
+      "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "@hapi/hoek": "^9.0.0",
+        "@hapi/topo": "^5.0.0",
+        "@sideway/address": "^4.1.0",
+        "@sideway/formula": "^3.0.0",
+        "@sideway/pinpoint": "^2.0.0"
+      }
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "license": "MIT"
+    },
+    "node_modules/js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "license": "MIT",
+      "dependencies": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      },
+      "bin": {
+        "js-yaml": "bin/js-yaml.js"
+      }
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "license": "MIT",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+      "license": "MIT"
+    },
+    "node_modules/json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+      "license": "MIT"
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "license": "MIT"
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+      "license": "MIT"
+    },
+    "node_modules/json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
+      "license": "MIT"
+    },
+    "node_modules/json5": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz",
+      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.5"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.1.6",
+        "universalify": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "graceful-fs": "^4.1.6"
+      }
+    },
+    "node_modules/keyv": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz",
+      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "license": "MIT",
+      "dependencies": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "node_modules/killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==",
+      "license": "ISC"
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/klona": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz",
+      "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/last-call-webpack-plugin": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
+      "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash": "^4.17.5",
+        "webpack-sources": "^1.1.0"
+      }
+    },
+    "node_modules/latest-version": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz",
+      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "license": "MIT",
+      "dependencies": {
+        "package-json": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "license": "MIT"
+    },
+    "node_modules/loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4.3.0 <5.0.0 || >=5.10"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz",
+      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+      "license": "MIT"
+    },
+    "node_modules/lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.assignin": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
+      "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.bind": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz",
+      "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.curry": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz",
+      "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.filter": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz",
+      "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.flow": {
+      "version": "3.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz",
+      "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.map": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz",
+      "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "license": "MIT"
+    },
+    "node_modules/lodash.pick": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz",
+      "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.reduce": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
+      "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.reject": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz",
+      "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.some": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz",
+      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.template": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz",
+      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.templatesettings": "^4.0.0"
+      }
+    },
+    "node_modules/lodash.templatesettings": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash._reinterpolate": "^3.0.0"
+      }
+    },
+    "node_modules/lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=",
+      "license": "MIT"
+    },
+    "node_modules/lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+      "license": "MIT"
+    },
+    "node_modules/loglevel": {
+      "version": "1.7.1",
+      "resolved": "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz",
+      "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6.0"
+      },
+      "funding": {
+        "type": "tidelift",
+        "url": "https://tidelift.com/funding/github/npm/loglevel"
+      }
+    },
+    "node_modules/loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      },
+      "bin": {
+        "loose-envify": "cli.js"
+      }
+    },
+    "node_modules/lower-case": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz",
+      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+      "license": "MIT",
+      "dependencies": {
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/lunr": {
+      "version": "2.3.9",
+      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
+      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="
+    },
+    "node_modules/lunr-languages": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.4.0.tgz",
+      "integrity": "sha512-YWfZDExJN/MJEVE/DbM4AuVRLsqeHi+q3wmECMsWjGIOkd5mr9DUNos7fv8f5do9VLRMYXIzFjn+N4+KPI9pQA=="
+    },
+    "node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "license": "MIT",
+      "dependencies": {
+        "object-visit": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/markdown-escapes": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
+      "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "license": "MIT",
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/mdast-squeeze-paragraphs": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz",
+      "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==",
+      "license": "MIT",
+      "dependencies": {
+        "unist-util-remove": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-definitions": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+      "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "unist-util-visit": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-to-hast": {
+      "version": "10.0.1",
+      "resolved": "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz",
+      "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/mdast": "^3.0.0",
+        "@types/unist": "^2.0.0",
+        "mdast-util-definitions": "^4.0.0",
+        "mdurl": "^1.0.0",
+        "unist-builder": "^2.0.0",
+        "unist-util-generated": "^1.0.0",
+        "unist-util-position": "^3.0.0",
+        "unist-util-visit": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdast-util-to-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
+      "license": "CC0-1.0"
+    },
+    "node_modules/mdurl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz",
+      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
+      "license": "MIT"
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "license": "MIT",
+      "dependencies": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
+      "license": "MIT"
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "license": "MIT"
+    },
+    "node_modules/merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/microevent.ts": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz",
+      "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==",
+      "license": "MIT"
+    },
+    "node_modules/micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "license": "MIT",
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/micromatch/node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/micromatch/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "license": "MIT",
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/micromatch/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      },
+      "bin": {
+        "miller-rabin": "bin/miller-rabin"
+      }
+    },
+    "node_modules/mime": {
+      "version": "2.5.2",
+      "resolved": "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz",
+      "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.46.0",
+      "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz",
+      "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-types": {
+      "version": "2.1.29",
+      "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz",
+      "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "1.46.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mini-create-react-context": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz",
+      "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.12.1",
+        "tiny-warning": "^1.0.3"
+      },
+      "peerDependencies": {
+        "prop-types": "^15.0.0",
+        "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
+      }
+    },
+    "node_modules/mini-css-extract-plugin": {
+      "version": "0.8.2",
+      "resolved": "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz",
+      "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==",
+      "license": "MIT",
+      "dependencies": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "1.9.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "engines": {
+        "node": ">= 6.9.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.4.0"
+      }
+    },
+    "node_modules/mini-css-extract-plugin/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/mini-css-extract-plugin/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mini-css-extract-plugin/node_modules/schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+      "license": "ISC"
+    },
+    "node_modules/minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
+      "license": "MIT"
+    },
+    "node_modules/minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "license": "ISC",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
+      "license": "MIT"
+    },
+    "node_modules/minipass": {
+      "version": "3.1.3",
+      "resolved": "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz",
+      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "license": "MIT",
+      "dependencies": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "license": "MIT",
+      "dependencies": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mixin-deep/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.5"
+      },
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      }
+    },
+    "node_modules/module-alias": {
+      "version": "2.2.2",
+      "resolved": "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz",
+      "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==",
+      "license": "MIT"
+    },
+    "node_modules/move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "license": "ISC",
+      "dependencies": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+      "license": "MIT"
+    },
+    "node_modules/multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "license": "MIT",
+      "dependencies": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      },
+      "bin": {
+        "multicast-dns": "cli.js"
+      }
+    },
+    "node_modules/multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
+      "license": "MIT"
+    },
+    "node_modules/nan": {
+      "version": "2.14.2",
+      "resolved": "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz",
+      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/nanoid": {
+      "version": "3.1.22",
+      "resolved": "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz",
+      "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==",
+      "license": "MIT",
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "license": "MIT",
+      "dependencies": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "license": "MIT",
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/nanomatch/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "license": "MIT"
+    },
+    "node_modules/nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+      "license": "MIT"
+    },
+    "node_modules/no-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz",
+      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+      "license": "MIT",
+      "dependencies": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/node-emoji": {
+      "version": "1.10.0",
+      "resolved": "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz",
+      "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash.toarray": "^4.4.0"
+      }
+    },
+    "node_modules/node-fetch": {
+      "version": "2.6.1",
+      "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz",
+      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+      "license": "MIT",
+      "engines": {
+        "node": "4.x || >=6.0.0"
+      }
+    },
+    "node_modules/node-forge": {
+      "version": "0.10.0",
+      "resolved": "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz",
+      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+      "license": "(BSD-3-Clause OR GPL-2.0)",
+      "engines": {
+        "node": ">= 6.0.0"
+      }
+    },
+    "node_modules/node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      }
+    },
+    "node_modules/node-libs-browser/node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/node-releases": {
+      "version": "1.1.71",
+      "resolved": "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz",
+      "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+      "license": "MIT"
+    },
+    "node_modules/nopt": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+      "dependencies": {
+        "abbrev": "1"
+      },
+      "bin": {
+        "nopt": "bin/nopt.js"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/normalize-url": {
+      "version": "1.9.1",
+      "resolved": "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz",
+      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4.0.1",
+        "prepend-http": "^1.0.0",
+        "query-string": "^4.1.0",
+        "sort-keys": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/not": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz",
+      "integrity": "sha1-yWkcF0bFXc++VMvYvU/wQbwrUZ0="
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "license": "MIT",
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/npm-run-path/node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=",
+      "license": "MIT"
+    },
+    "node_modules/nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "node_modules/null-loader": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz",
+      "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==",
+      "license": "MIT",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=",
+      "license": "MIT"
+    },
+    "node_modules/object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "license": "MIT",
+      "dependencies": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-copy/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz",
+      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
+      "license": "MIT",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-is": {
+      "version": "1.1.5",
+      "resolved": "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz",
+      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4"
+      }
+    },
+    "node_modules/object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "license": "MIT",
+      "dependencies": {
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object.assign": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.getownpropertydescriptors": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
+      "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.2"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "license": "MIT",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object.values": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz",
+      "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.2",
+        "has": "^1.0.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+      "license": "MIT"
+    },
+    "node_modules/on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "license": "MIT",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "license": "ISC",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "license": "MIT",
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/open/node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "license": "MIT",
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/opener": {
+      "version": "1.5.2",
+      "resolved": "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz",
+      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+      "license": "(WTFPL OR MIT)",
+      "bin": {
+        "opener": "bin/opener-bin.js"
+      }
+    },
+    "node_modules/opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-wsl": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/optimize-css-assets-webpack-plugin": {
+      "version": "5.0.4",
+      "resolved": "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz",
+      "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano": "^4.1.10",
+        "last-call-webpack-plugin": "^3.0.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0"
+      }
+    },
+    "node_modules/original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "license": "MIT",
+      "dependencies": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "node_modules/os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
+      "license": "MIT"
+    },
+    "node_modules/p-cancelable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz",
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "license": "MIT",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "license": "MIT",
+      "dependencies": {
+        "aggregate-error": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz",
+      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+      "license": "MIT",
+      "dependencies": {
+        "retry": "^0.12.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/package-json": {
+      "version": "6.5.0",
+      "resolved": "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz",
+      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+      "license": "MIT",
+      "dependencies": {
+        "got": "^9.6.0",
+        "registry-auth-token": "^4.0.0",
+        "registry-url": "^5.0.0",
+        "semver": "^6.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+      "license": "(MIT AND Zlib)"
+    },
+    "node_modules/parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "license": "MIT",
+      "dependencies": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "node_modules/param-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz",
+      "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+      "license": "MIT",
+      "dependencies": {
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "license": "MIT",
+      "dependencies": {
+        "callsites": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+      "license": "ISC",
+      "dependencies": {
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "node_modules/parse-entities": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz",
+      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+      "license": "MIT",
+      "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"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/parse-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/parse-numeric-range": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz",
+      "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg==",
+      "license": "ISC"
+    },
+    "node_modules/parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
+      "license": "MIT"
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/pascal-case": {
+      "version": "3.1.2",
+      "resolved": "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz",
+      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+      "license": "MIT",
+      "dependencies": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node_modules/pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
+      "license": "MIT"
+    },
+    "node_modules/path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "license": "MIT"
+    },
+    "node_modules/path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
+      "license": "(WTFPL OR MIT)"
+    },
+    "node_modules/path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "license": "MIT"
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
+      "license": "MIT"
+    },
+    "node_modules/path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pbkdf2": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz",
+      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+      "license": "MIT",
+      "dependencies": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      },
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "license": "MIT",
+      "dependencies": {
+        "pinkie": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+      "license": "MIT",
+      "dependencies": {
+        "find-up": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-up": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz",
+      "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+      "license": "MIT",
+      "dependencies": {
+        "find-up": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pnp-webpack-plugin": {
+      "version": "1.6.4",
+      "resolved": "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
+      "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
+      "license": "MIT",
+      "dependencies": {
+        "ts-pnp": "^1.1.6"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+      "license": "MIT",
+      "dependencies": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      },
+      "engines": {
+        "node": ">= 0.12.0"
+      }
+    },
+    "node_modules/portfinder/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/portfinder/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "license": "MIT"
+    },
+    "node_modules/posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "7.0.35",
+      "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz",
+      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+      "license": "MIT",
+      "dependencies": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/postcss/"
+      }
+    },
+    "node_modules/postcss-attribute-case-insensitive": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
+      "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^6.0.2"
+      }
+    },
+    "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": {
+      "version": "6.0.4",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+      "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-calc": {
+      "version": "7.0.5",
+      "resolved": "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz",
+      "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      }
+    },
+    "node_modules/postcss-calc/node_modules/postcss-selector-parser": {
+      "version": "6.0.4",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+      "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-calc/node_modules/postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "license": "MIT"
+    },
+    "node_modules/postcss-color-functional-notation": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
+      "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-color-gray": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
+      "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
+      "license": "ISC",
+      "dependencies": {
+        "@csstools/convert-colors": "^1.4.0",
+        "postcss": "^7.0.5",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-color-hex-alpha": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
+      "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.14",
+        "postcss-values-parser": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-color-mod-function": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
+      "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "@csstools/convert-colors": "^1.4.0",
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-color-rebeccapurple": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
+      "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-custom-media": {
+      "version": "7.0.8",
+      "resolved": "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
+      "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.14"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-custom-properties": {
+      "version": "8.0.11",
+      "resolved": "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
+      "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.17",
+        "postcss-values-parser": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-custom-selectors": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
+      "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-custom-selectors/node_modules/cssesc": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+      "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+      "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^2.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-dir-pseudo-class": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
+      "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/postcss-dir-pseudo-class/node_modules/cssesc": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+      "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+      "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^2.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-discard-unused": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz",
+      "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-double-position-gradients": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
+      "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.5",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-env-function": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
+      "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-focus-visible": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
+      "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-focus-within": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
+      "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-font-variant": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz",
+      "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "node_modules/postcss-gap-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
+      "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-image-set-function": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
+      "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-initial": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz",
+      "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash.template": "^4.5.0",
+        "postcss": "^7.0.2"
+      }
+    },
+    "node_modules/postcss-lab-function": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
+      "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "@csstools/convert-colors": "^1.4.0",
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-logical": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz",
+      "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-media-minmax": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
+      "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-merge-idents": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz",
+      "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-same-parent": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "license": "MIT",
+      "dependencies": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "license": "MIT",
+      "dependencies": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "license": "MIT",
+      "dependencies": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-nesting": {
+      "version": "7.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
+      "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "license": "MIT",
+      "dependencies": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-normalize-url/node_modules/is-absolute-url": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+      "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postcss-normalize-url/node_modules/normalize-url": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz",
+      "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-overflow-shorthand": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
+      "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-page-break": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
+      "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "node_modules/postcss-place": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz",
+      "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-preset-env": {
+      "version": "6.7.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
+      "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "autoprefixer": "^9.6.1",
+        "browserslist": "^4.6.4",
+        "caniuse-lite": "^1.0.30000981",
+        "css-blank-pseudo": "^0.1.4",
+        "css-has-pseudo": "^0.10.0",
+        "css-prefers-color-scheme": "^3.1.1",
+        "cssdb": "^4.4.0",
+        "postcss": "^7.0.17",
+        "postcss-attribute-case-insensitive": "^4.0.1",
+        "postcss-color-functional-notation": "^2.0.1",
+        "postcss-color-gray": "^5.0.0",
+        "postcss-color-hex-alpha": "^5.0.3",
+        "postcss-color-mod-function": "^3.0.3",
+        "postcss-color-rebeccapurple": "^4.0.1",
+        "postcss-custom-media": "^7.0.8",
+        "postcss-custom-properties": "^8.0.11",
+        "postcss-custom-selectors": "^5.1.2",
+        "postcss-dir-pseudo-class": "^5.0.0",
+        "postcss-double-position-gradients": "^1.0.0",
+        "postcss-env-function": "^2.0.2",
+        "postcss-focus-visible": "^4.0.0",
+        "postcss-focus-within": "^3.0.0",
+        "postcss-font-variant": "^4.0.0",
+        "postcss-gap-properties": "^2.0.0",
+        "postcss-image-set-function": "^3.0.1",
+        "postcss-initial": "^3.0.0",
+        "postcss-lab-function": "^2.0.1",
+        "postcss-logical": "^3.0.0",
+        "postcss-media-minmax": "^4.0.0",
+        "postcss-nesting": "^7.0.0",
+        "postcss-overflow-shorthand": "^2.0.0",
+        "postcss-page-break": "^2.0.0",
+        "postcss-place": "^4.0.1",
+        "postcss-pseudo-class-any-link": "^6.0.0",
+        "postcss-replace-overflow-wrap": "^3.0.0",
+        "postcss-selector-matches": "^4.0.0",
+        "postcss-selector-not": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-pseudo-class-any-link": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
+      "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+      "license": "CC0-1.0",
+      "dependencies": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/postcss-pseudo-class-any-link/node_modules/cssesc": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+      "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+      "license": "MIT",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+      "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cssesc": "^2.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-reduce-idents": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz",
+      "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "license": "MIT",
+      "dependencies": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-replace-overflow-wrap": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
+      "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "node_modules/postcss-selector-matches": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
+      "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "postcss": "^7.0.2"
+      }
+    },
+    "node_modules/postcss-selector-not": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz",
+      "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==",
+      "license": "MIT",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "postcss": "^7.0.2"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "3.1.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+      "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+      "license": "MIT",
+      "dependencies": {
+        "dot-prop": "^5.2.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/postcss-sort-media-queries": {
+      "version": "1.31.21",
+      "resolved": "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz",
+      "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==",
+      "license": "MIT",
+      "dependencies": {
+        "postcss": "^7.0.27",
+        "sort-css-media-queries": "1.5.0"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "license": "MIT",
+      "dependencies": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "license": "MIT",
+      "dependencies": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+      "license": "MIT"
+    },
+    "node_modules/postcss-values-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
+      "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
+      "license": "MIT",
+      "dependencies": {
+        "flatten": "^1.0.2",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=6.14.4"
+      }
+    },
+    "node_modules/postcss-zindex": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz",
+      "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==",
+      "license": "MIT",
+      "dependencies": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/postcss/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss/node_modules/chalk/node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss/node_modules/supports-color": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz",
+      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/pretty-error": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz",
+      "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash": "^4.17.20",
+        "renderkid": "^2.0.4"
+      }
+    },
+    "node_modules/pretty-time": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz",
+      "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/prism-react-renderer": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.0.tgz",
+      "integrity": "sha512-GHqzxLYImx1iKN1jJURcuRoA/0ygCcNhfGw1IT8nPIMzarmKQ3Nc+JcG0gi8JXQzuh0C5ShE4npMIoqNin40hg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": ">=0.14.9"
+      }
+    },
+    "node_modules/prismjs": {
+      "version": "1.23.0",
+      "resolved": "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz",
+      "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==",
+      "license": "MIT",
+      "dependencies": {
+        "clipboard": "^2.0.0"
+      },
+      "optionalDependencies": {
+        "clipboard": "^2.0.0"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+      "license": "MIT"
+    },
+    "node_modules/promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "license": "MIT",
+      "dependencies": {
+        "asap": "~2.0.3"
+      }
+    },
+    "node_modules/promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
+      "license": "ISC"
+    },
+    "node_modules/prompts": {
+      "version": "2.4.0",
+      "resolved": "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz",
+      "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==",
+      "license": "MIT",
+      "dependencies": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/prop-types": {
+      "version": "15.7.2",
+      "resolved": "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz",
+      "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.8.1"
+      }
+    },
+    "node_modules/property-information": {
+      "version": "5.6.0",
+      "resolved": "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz",
+      "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+      "license": "MIT",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.6",
+      "resolved": "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz",
+      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+      "license": "MIT",
+      "dependencies": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
+      "license": "MIT"
+    },
+    "node_modules/public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "license": "MIT",
+      "dependencies": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "node_modules/pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "license": "MIT",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "license": "MIT",
+      "dependencies": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      }
+    },
+    "node_modules/pumpify/node_modules/pump": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz",
+      "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+      "license": "MIT",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "node_modules/punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+      "license": "MIT"
+    },
+    "node_modules/pupa": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz",
+      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+      "license": "MIT",
+      "dependencies": {
+        "escape-goat": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/pure-color": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz",
+      "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=",
+      "license": "MIT"
+    },
+    "node_modules/q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6.0",
+        "teleport": ">=0.2.0"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.7.0",
+      "resolved": "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
+      "engines": {
+        "node": ">=0.4.x"
+      }
+    },
+    "node_modules/querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+      "license": "MIT"
+    },
+    "node_modules/queue-microtask": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz",
+      "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "license": "MIT",
+      "dependencies": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/raw-body/node_modules/bytes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz",
+      "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
+      "dependencies": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "bin": {
+        "rc": "cli.js"
+      }
+    },
+    "node_modules/react": {
+      "version": "17.0.1",
+      "resolved": "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz",
+      "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/react-base16-styling": {
+      "version": "0.6.0",
+      "resolved": "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz",
+      "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=",
+      "license": "MIT",
+      "dependencies": {
+        "base16": "^1.0.0",
+        "lodash.curry": "^4.0.1",
+        "lodash.flow": "^3.3.0",
+        "pure-color": "^1.2.0"
+      }
+    },
+    "node_modules/react-dev-utils": {
+      "version": "11.0.4",
+      "resolved": "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz",
+      "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "7.10.4",
+        "address": "1.1.2",
+        "browserslist": "4.14.2",
+        "chalk": "2.4.2",
+        "cross-spawn": "7.0.3",
+        "detect-port-alt": "1.1.6",
+        "escape-string-regexp": "2.0.0",
+        "filesize": "6.1.0",
+        "find-up": "4.1.0",
+        "fork-ts-checker-webpack-plugin": "4.1.6",
+        "global-modules": "2.0.0",
+        "globby": "11.0.1",
+        "gzip-size": "5.1.1",
+        "immer": "8.0.1",
+        "is-root": "2.1.0",
+        "loader-utils": "2.0.0",
+        "open": "^7.0.2",
+        "pkg-up": "3.1.0",
+        "prompts": "2.4.0",
+        "react-error-overlay": "^6.0.9",
+        "recursive-readdir": "2.2.2",
+        "shell-quote": "1.7.2",
+        "strip-ansi": "6.0.0",
+        "text-table": "0.2.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/@babel/code-frame": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz",
+      "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/highlight": "^7.10.4"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/ansi-regex": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/browserslist": {
+      "version": "4.14.2",
+      "resolved": "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz",
+      "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==",
+      "license": "MIT",
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001125",
+        "electron-to-chromium": "^1.3.564",
+        "escalade": "^3.0.2",
+        "node-releases": "^1.1.61"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      },
+      "funding": {
+        "type": "tidelift",
+        "url": "https://tidelift.com/funding/github/npm/browserslist"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/escape-string-regexp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+      "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "license": "MIT",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/globby": {
+      "version": "11.0.1",
+      "resolved": "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz",
+      "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+      "license": "MIT",
+      "dependencies": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "license": "MIT",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "license": "MIT",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dev-utils/node_modules/strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/react-dom": {
+      "version": "17.0.1",
+      "resolved": "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz",
+      "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.1"
+      },
+      "peerDependencies": {
+        "react": "17.0.1"
+      }
+    },
+    "node_modules/react-error-overlay": {
+      "version": "6.0.9",
+      "resolved": "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
+      "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==",
+      "license": "MIT"
+    },
+    "node_modules/react-fast-compare": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
+      "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==",
+      "license": "MIT"
+    },
+    "node_modules/react-helmet": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz",
+      "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==",
+      "license": "MIT",
+      "dependencies": {
+        "object-assign": "^4.1.1",
+        "prop-types": "^15.7.2",
+        "react-fast-compare": "^3.1.1",
+        "react-side-effect": "^2.1.0"
+      },
+      "peerDependencies": {
+        "react": ">=16.3.0"
+      }
+    },
+    "node_modules/react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
+      "license": "MIT"
+    },
+    "node_modules/react-json-view": {
+      "version": "1.21.3",
+      "resolved": "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz",
+      "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==",
+      "license": "MIT",
+      "dependencies": {
+        "flux": "^4.0.1",
+        "react-base16-styling": "^0.6.0",
+        "react-lifecycles-compat": "^3.0.4",
+        "react-textarea-autosize": "^8.3.2"
+      },
+      "peerDependencies": {
+        "react": "^17.0.0 || ^16.3.0 || ^15.5.4",
+        "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4"
+      }
+    },
+    "node_modules/react-lifecycles-compat": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+      "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==",
+      "license": "MIT"
+    },
+    "node_modules/react-loadable": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz",
+      "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==",
+      "license": "MIT",
+      "dependencies": {
+        "prop-types": "^15.5.0"
+      },
+      "peerDependencies": {
+        "react": "*"
+      }
+    },
+    "node_modules/react-loadable-ssr-addon": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz",
+      "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.10.3"
+      },
+      "engines": {
+        "node": ">=4.2.4"
+      },
+      "peerDependencies": {
+        "react-loadable": "*",
+        "webpack": ">=4.41.1"
+      }
+    },
+    "node_modules/react-router": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz",
+      "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.1.2",
+        "history": "^4.9.0",
+        "hoist-non-react-statics": "^3.1.0",
+        "loose-envify": "^1.3.1",
+        "mini-create-react-context": "^0.4.0",
+        "path-to-regexp": "^1.7.0",
+        "prop-types": "^15.6.2",
+        "react-is": "^16.6.0",
+        "tiny-invariant": "^1.0.2",
+        "tiny-warning": "^1.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=15"
+      }
+    },
+    "node_modules/react-router-config": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz",
+      "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.1.2"
+      },
+      "peerDependencies": {
+        "react": ">=15",
+        "react-router": ">=5"
+      }
+    },
+    "node_modules/react-router-dom": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz",
+      "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.1.2",
+        "history": "^4.9.0",
+        "loose-envify": "^1.3.1",
+        "prop-types": "^15.6.2",
+        "react-router": "5.2.0",
+        "tiny-invariant": "^1.0.2",
+        "tiny-warning": "^1.0.0"
+      },
+      "peerDependencies": {
+        "react": ">=15"
+      }
+    },
+    "node_modules/react-router/node_modules/isarray": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz",
+      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+      "license": "MIT"
+    },
+    "node_modules/react-router/node_modules/path-to-regexp": {
+      "version": "1.8.0",
+      "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+      "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+      "license": "MIT",
+      "dependencies": {
+        "isarray": "0.0.1"
+      }
+    },
+    "node_modules/react-side-effect": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz",
+      "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.3.0 || ^17.0.0"
+      }
+    },
+    "node_modules/react-textarea-autosize": {
+      "version": "8.3.2",
+      "resolved": "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.2.tgz",
+      "integrity": "sha512-JrMWVgQSaExQByP3ggI1eA8zF4mF0+ddVuX7acUeK2V7bmrpjVOY72vmLz2IXFJSAXoY3D80nEzrn0GWajWK3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.10.2",
+        "use-composed-ref": "^1.0.0",
+        "use-latest": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0"
+      }
+    },
+    "node_modules/react-toggle": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.2.tgz",
+      "integrity": "sha512-4Ohw31TuYQdhWfA6qlKafeXx3IOH7t4ZHhmRdwsm1fQREwOBGxJT+I22sgHqR/w8JRdk+AeMCJXPImEFSrNXow==",
+      "license": "MIT",
+      "dependencies": {
+        "classnames": "^2.2.5"
+      },
+      "peerDependencies": {
+        "prop-types": ">= 15.3.0 < 18",
+        "react": ">= 15.3.0 < 18",
+        "react-dom": ">= 15.3.0 < 18"
+      }
+    },
+    "node_modules/readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "license": "MIT",
+      "dependencies": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "node_modules/readable-stream/node_modules/safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+      "license": "MIT"
+    },
+    "node_modules/readable-stream/node_modules/string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "license": "MIT",
+      "dependencies": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      },
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/reading-time": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/reading-time/-/reading-time-1.3.0.tgz",
+      "integrity": "sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g==",
+      "license": "MIT"
+    },
+    "node_modules/rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "dependencies": {
+        "resolve": "^1.1.6"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/recursive-readdir": {
+      "version": "2.2.2",
+      "resolved": "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+      "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+      "license": "MIT",
+      "dependencies": {
+        "minimatch": "3.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "license": "MIT"
+    },
+    "node_modules/regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+      "license": "MIT",
+      "dependencies": {
+        "regenerate": "^1.4.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.13.7",
+      "resolved": "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+      "license": "MIT"
+    },
+    "node_modules/regenerator-transform": {
+      "version": "0.14.5",
+      "resolved": "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "node_modules/regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "license": "MIT",
+      "dependencies": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regex-not/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "license": "MIT",
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regex-not/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/regexp.prototype.flags": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      },
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/regexpu-core": {
+      "version": "4.7.1",
+      "resolved": "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz",
+      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+      "license": "MIT",
+      "dependencies": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.2.0",
+        "regjsgen": "^0.5.1",
+        "regjsparser": "^0.6.4",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.2.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/registry-auth-token": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+      "license": "MIT",
+      "dependencies": {
+        "rc": "^1.2.8"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/registry-url": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz",
+      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+      "license": "MIT",
+      "dependencies": {
+        "rc": "^1.2.8"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/regjsgen": {
+      "version": "0.5.2",
+      "resolved": "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+      "license": "MIT"
+    },
+    "node_modules/regjsparser": {
+      "version": "0.6.7",
+      "resolved": "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz",
+      "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "jsesc": "~0.5.0"
+      },
+      "bin": {
+        "regjsparser": "bin/parser"
+      }
+    },
+    "node_modules/regjsparser/node_modules/jsesc": {
+      "version": "0.5.0",
+      "resolved": "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz",
+      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      }
+    },
+    "node_modules/rehype-parse": {
+      "version": "6.0.2",
+      "resolved": "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz",
+      "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==",
+      "license": "MIT",
+      "dependencies": {
+        "hast-util-from-parse5": "^5.0.0",
+        "parse5": "^5.0.0",
+        "xtend": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/rehype-parse/node_modules/parse5": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz",
+      "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==",
+      "license": "MIT"
+    },
+    "node_modules/relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/remark-admonitions": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz",
+      "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==",
+      "license": "MIT",
+      "dependencies": {
+        "rehype-parse": "^6.0.2",
+        "unified": "^8.4.2",
+        "unist-util-visit": "^2.0.1"
+      }
+    },
+    "node_modules/remark-admonitions/node_modules/unified": {
+      "version": "8.4.2",
+      "resolved": "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz",
+      "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==",
+      "license": "MIT",
+      "dependencies": {
+        "bail": "^1.0.0",
+        "extend": "^3.0.0",
+        "is-plain-obj": "^2.0.0",
+        "trough": "^1.0.0",
+        "vfile": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-emoji": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.1.0.tgz",
+      "integrity": "sha512-lDddGsxXURV01WS9WAiS9rO/cedO1pvr9tahtLhr6qCGFhHG4yZSJW3Ha4Nw9Uk1hLNmUBtPC0+m45Ms+xEitg==",
+      "license": "MIT",
+      "dependencies": {
+        "emoticon": "^3.2.0",
+        "node-emoji": "^1.10.0",
+        "unist-util-visit": "^2.0.2"
+      }
+    },
+    "node_modules/remark-footnotes": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz",
+      "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-mdx": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz",
+      "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/core": "7.12.9",
+        "@babel/helper-plugin-utils": "7.10.4",
+        "@babel/plugin-proposal-object-rest-spread": "7.12.1",
+        "@babel/plugin-syntax-jsx": "7.12.1",
+        "@mdx-js/util": "1.6.22",
+        "is-alphabetical": "1.0.4",
+        "remark-parse": "8.0.3",
+        "unified": "9.2.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-mdx/node_modules/@babel/core": {
+      "version": "7.12.9",
+      "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz",
+      "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/code-frame": "^7.10.4",
+        "@babel/generator": "^7.12.5",
+        "@babel/helper-module-transforms": "^7.12.1",
+        "@babel/helpers": "^7.12.5",
+        "@babel/parser": "^7.12.7",
+        "@babel/template": "^7.12.7",
+        "@babel/traverse": "^7.12.9",
+        "@babel/types": "^7.12.7",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.1",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "resolve": "^1.3.2",
+        "semver": "^5.4.1",
+        "source-map": "^0.5.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "license": "MIT"
+    },
+    "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+      "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+      "license": "MIT",
+      "dependencies": {
+        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+        "@babel/plugin-transform-parameters": "^7.12.1"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread/node_modules/@babel/helper-plugin-utils": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
+      "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==",
+      "license": "MIT"
+    },
+    "node_modules/remark-mdx/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/remark-mdx/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/remark-mdx/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/remark-mdx/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/remark-parse": {
+      "version": "8.0.3",
+      "resolved": "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz",
+      "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
+      "license": "MIT",
+      "dependencies": {
+        "ccount": "^1.0.0",
+        "collapse-white-space": "^1.0.2",
+        "is-alphabetical": "^1.0.0",
+        "is-decimal": "^1.0.0",
+        "is-whitespace-character": "^1.0.0",
+        "is-word-character": "^1.0.0",
+        "markdown-escapes": "^1.0.0",
+        "parse-entities": "^2.0.0",
+        "repeat-string": "^1.5.4",
+        "state-toggle": "^1.0.0",
+        "trim": "0.0.1",
+        "trim-trailing-lines": "^1.0.0",
+        "unherit": "^1.0.4",
+        "unist-util-remove-position": "^2.0.0",
+        "vfile-location": "^3.0.0",
+        "xtend": "^4.0.1"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remark-squeeze-paragraphs": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz",
+      "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==",
+      "license": "MIT",
+      "dependencies": {
+        "mdast-squeeze-paragraphs": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+      "license": "ISC"
+    },
+    "node_modules/renderkid": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz",
+      "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==",
+      "license": "MIT",
+      "dependencies": {
+        "css-select": "^2.0.2",
+        "dom-converter": "^0.2",
+        "htmlparser2": "^3.10.1",
+        "lodash": "^4.17.20",
+        "strip-ansi": "^3.0.0"
+      }
+    },
+    "node_modules/renderkid/node_modules/ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/renderkid/node_modules/strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10"
+      }
+    },
+    "node_modules/require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/require-like": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz",
+      "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+      "license": "ISC"
+    },
+    "node_modules/requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+      "license": "MIT"
+    },
+    "node_modules/resolve": {
+      "version": "1.20.0",
+      "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz",
+      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "license": "MIT",
+      "dependencies": {
+        "is-core-module": "^2.2.0",
+        "path-parse": "^1.0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "license": "MIT",
+      "dependencies": {
+        "resolve-from": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/resolve-pathname": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
+      "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==",
+      "license": "MIT"
+    },
+    "node_modules/resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+      "license": "MIT"
+    },
+    "node_modules/responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "license": "MIT",
+      "dependencies": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "node_modules/ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.12"
+      }
+    },
+    "node_modules/retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+      "license": "MIT",
+      "engines": {
+        "iojs": ">=1.0.0",
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "license": "MIT"
+    },
+    "node_modules/rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "license": "MIT"
+    },
+    "node_modules/rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "license": "ISC",
+      "dependencies": {
+        "glob": "^7.1.3"
+      },
+      "bin": {
+        "rimraf": "bin.js"
+      }
+    },
+    "node_modules/ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "license": "MIT",
+      "dependencies": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "node_modules/rtlcss": {
+      "version": "2.6.2",
+      "resolved": "https://registry.yarnpkg.com/rtlcss/-/rtlcss-2.6.2.tgz",
+      "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==",
+      "license": "MIT",
+      "dependencies": {
+        "@choojs/findup": "^0.2.1",
+        "chalk": "^2.4.2",
+        "mkdirp": "^0.5.1",
+        "postcss": "^6.0.23",
+        "strip-json-comments": "^2.0.0"
+      },
+      "bin": {
+        "rtlcss": "bin/rtlcss.js"
+      }
+    },
+    "node_modules/rtlcss/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/rtlcss/node_modules/postcss": {
+      "version": "6.0.23",
+      "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz",
+      "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+      "license": "MIT",
+      "dependencies": {
+        "chalk": "^2.4.1",
+        "source-map": "^0.6.1",
+        "supports-color": "^5.4.0"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "dependencies": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "node_modules/run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "license": "ISC",
+      "dependencies": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "node_modules/rxjs": {
+      "version": "6.6.6",
+      "resolved": "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz",
+      "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "^1.9.0"
+      },
+      "engines": {
+        "npm": ">=2.0.0"
+      }
+    },
+    "node_modules/rxjs/node_modules/tslib": {
+      "version": "1.14.1",
+      "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz",
+      "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+      "license": "0BSD"
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT"
+    },
+    "node_modules/safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "license": "MIT",
+      "dependencies": {
+        "ret": "~0.1.10"
+      }
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+      "license": "MIT"
+    },
+    "node_modules/sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+      "license": "ISC"
+    },
+    "node_modules/scheduler": {
+      "version": "0.20.1",
+      "resolved": "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz",
+      "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==",
+      "license": "MIT",
+      "dependencies": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "node_modules/schema-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz",
+      "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/json-schema": "^7.0.6",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/section-matter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz",
+      "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+      "license": "MIT",
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "kind-of": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
+      "license": "MIT"
+    },
+    "node_modules/selfsigned": {
+      "version": "1.10.8",
+      "resolved": "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz",
+      "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
+      "license": "MIT",
+      "dependencies": {
+        "node-forge": "^0.10.0"
+      }
+    },
+    "node_modules/semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/semver-diff": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz",
+      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+      "license": "MIT",
+      "dependencies": {
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/http-errors": {
+      "version": "1.7.3",
+      "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz",
+      "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/send/node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "license": "MIT",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz",
+      "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+      "license": "MIT"
+    },
+    "node_modules/serialize-javascript": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/serve-handler": {
+      "version": "6.1.3",
+      "resolved": "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz",
+      "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==",
+      "license": "MIT",
+      "dependencies": {
+        "bytes": "3.0.0",
+        "content-disposition": "0.5.2",
+        "fast-url-parser": "1.1.3",
+        "mime-types": "2.1.18",
+        "minimatch": "3.0.4",
+        "path-is-inside": "1.0.2",
+        "path-to-regexp": "2.2.1",
+        "range-parser": "1.2.0"
+      }
+    },
+    "node_modules/serve-handler/node_modules/mime-db": {
+      "version": "1.33.0",
+      "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz",
+      "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/serve-handler/node_modules/mime-types": {
+      "version": "2.1.18",
+      "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz",
+      "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+      "license": "MIT",
+      "dependencies": {
+        "mime-db": "~1.33.0"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/serve-handler/node_modules/path-to-regexp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
+      "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==",
+      "license": "MIT"
+    },
+    "node_modules/serve-handler/node_modules/range-parser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz",
+      "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "license": "MIT",
+      "dependencies": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/serve-index/node_modules/http-errors": {
+      "version": "1.6.3",
+      "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz",
+      "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+      "license": "MIT",
+      "dependencies": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.0",
+        "statuses": ">= 1.4.0 < 2"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/serve-index/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "license": "ISC"
+    },
+    "node_modules/serve-index/node_modules/setprototypeof": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz",
+      "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+      "license": "ISC"
+    },
+    "node_modules/serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "license": "MIT",
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+      "license": "ISC"
+    },
+    "node_modules/set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "license": "MIT",
+      "dependencies": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
+      "license": "MIT"
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
+      "license": "ISC"
+    },
+    "node_modules/sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "license": "(MIT AND BSD-3-Clause)",
+      "dependencies": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      },
+      "bin": {
+        "sha.js": "bin.js"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "license": "MIT",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shell-quote": {
+      "version": "1.7.2",
+      "resolved": "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz",
+      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==",
+      "license": "MIT"
+    },
+    "node_modules/shelljs": {
+      "version": "0.8.4",
+      "resolved": "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz",
+      "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      },
+      "bin": {
+        "shjs": "bin/shjs"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "license": "ISC"
+    },
+    "node_modules/simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "license": "MIT",
+      "dependencies": {
+        "is-arrayish": "^0.3.1"
+      }
+    },
+    "node_modules/simple-swizzle/node_modules/is-arrayish": {
+      "version": "0.3.2",
+      "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+      "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+      "license": "MIT"
+    },
+    "node_modules/sirv": {
+      "version": "1.0.11",
+      "resolved": "https://registry.yarnpkg.com/sirv/-/sirv-1.0.11.tgz",
+      "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==",
+      "license": "MIT",
+      "dependencies": {
+        "@polka/url": "^1.0.0-next.9",
+        "mime": "^2.3.1",
+        "totalist": "^1.0.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+      "license": "MIT"
+    },
+    "node_modules/sitemap": {
+      "version": "6.4.0",
+      "resolved": "https://registry.yarnpkg.com/sitemap/-/sitemap-6.4.0.tgz",
+      "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/node": "^14.14.28",
+        "@types/sax": "^1.2.1",
+        "arg": "^5.0.0",
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "sitemap": "dist/cli.js"
+      },
+      "engines": {
+        "node": ">=10.3.0",
+        "npm": ">=5.6.0"
+      }
+    },
+    "node_modules/slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "license": "MIT",
+      "dependencies": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "license": "MIT",
+      "dependencies": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-node/node_modules/define-property": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz",
+      "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^3.2.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon-util/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/snapdragon/node_modules/source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sockjs": {
+      "version": "0.3.21",
+      "resolved": "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz",
+      "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
+      "license": "MIT",
+      "dependencies": {
+        "faye-websocket": "^0.11.3",
+        "uuid": "^3.4.0",
+        "websocket-driver": "^0.7.4"
+      }
+    },
+    "node_modules/sockjs-client": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz",
+      "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^3.2.6",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "^0.11.3",
+        "inherits": "^2.0.4",
+        "json3": "^3.3.3",
+        "url-parse": "^1.4.7"
+      }
+    },
+    "node_modules/sockjs-client/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/sockjs-client/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+      "license": "MIT"
+    },
+    "node_modules/sort-css-media-queries": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz",
+      "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6.3.0"
+      }
+    },
+    "node_modules/sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-obj": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sort-keys/node_modules/is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
+      "license": "MIT"
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "license": "MIT",
+      "dependencies": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.19",
+      "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+      "license": "MIT",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
+      "license": "MIT"
+    },
+    "node_modules/space-separated-tokens": {
+      "version": "1.1.5",
+      "resolved": "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+      "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/spdy": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "license": "MIT",
+      "dependencies": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      }
+    },
+    "node_modules/spdy-transport/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/spdy-transport/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/spdy-transport/node_modules/readable-stream": {
+      "version": "3.6.0",
+      "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+      "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.3",
+        "string_decoder": "^1.1.1",
+        "util-deprecate": "^1.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/spdy/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/spdy/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "license": "MIT",
+      "dependencies": {
+        "extend-shallow": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split-string/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "license": "MIT",
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split-string/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+      "license": "BSD-3-Clause"
+    },
+    "node_modules/ssri": {
+      "version": "8.0.1",
+      "resolved": "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "license": "ISC",
+      "dependencies": {
+        "minipass": "^3.1.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "license": "MIT"
+    },
+    "node_modules/state-toggle": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz",
+      "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "license": "MIT",
+      "dependencies": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/std-env": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/std-env/-/std-env-2.3.0.tgz",
+      "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==",
+      "license": "MIT",
+      "dependencies": {
+        "ci-info": "^3.0.0"
+      }
+    },
+    "node_modules/stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "node_modules/stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "license": "MIT",
+      "dependencies": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "node_modules/stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "license": "MIT",
+      "dependencies": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "node_modules/stream-shift": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
+      "license": "MIT"
+    },
+    "node_modules/strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "license": "MIT",
+      "dependencies": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "node_modules/string-width": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/string.prototype.trimend": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/string.prototype.trimstart": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+      "license": "MIT",
+      "dependencies": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/stringify-object/node_modules/is-obj": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz",
+      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-ansi": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/strip-bom-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+      "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/style-to-object": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz",
+      "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
+      "license": "MIT",
+      "dependencies": {
+        "inline-style-parser": "0.1.1"
+      }
+    },
+    "node_modules/stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "license": "MIT",
+      "dependencies": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/svg-parser": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz",
+      "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+      "license": "MIT"
+    },
+    "node_modules/svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz",
+      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+      "license": "MIT",
+      "dependencies": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.37",
+        "csso": "^4.0.2",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      },
+      "bin": {
+        "svgo": "bin/svgo"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/svgo/node_modules/chalk": {
+      "version": "2.4.2",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/svgo/node_modules/util.promisify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz",
+      "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.17.2",
+        "has-symbols": "^1.0.1",
+        "object.getownpropertydescriptors": "^2.1.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/tar": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz",
+      "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+      "license": "ISC",
+      "dependencies": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^3.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/tar/node_modules/mkdirp": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "license": "MIT",
+      "bin": {
+        "mkdirp": "bin/cmd.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz",
+      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "4.2.3",
+      "resolved": "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz",
+      "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==",
+      "license": "MIT",
+      "dependencies": {
+        "cacache": "^15.0.5",
+        "find-cache-dir": "^3.3.1",
+        "jest-worker": "^26.5.0",
+        "p-limit": "^3.0.2",
+        "schema-utils": "^3.0.0",
+        "serialize-javascript": "^5.0.1",
+        "source-map": "^0.6.1",
+        "terser": "^5.3.4",
+        "webpack-sources": "^1.4.3"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/p-limit": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz",
+      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "yocto-queue": "^0.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/terser": {
+      "version": "5.6.1",
+      "resolved": "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz",
+      "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "commander": "^2.20.0",
+        "source-map": "~0.7.2",
+        "source-map-support": "~0.5.19"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": {
+      "version": "0.7.3",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz",
+      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
+      "license": "BSD-3-Clause",
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+      "license": "MIT"
+    },
+    "node_modules/through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "license": "MIT",
+      "dependencies": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "node_modules/thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+      "license": "MIT"
+    },
+    "node_modules/timers-browserify": {
+      "version": "2.0.12",
+      "resolved": "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "setimmediate": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6.0"
+      }
+    },
+    "node_modules/timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
+      "license": "MIT"
+    },
+    "node_modules/tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/tiny-invariant": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
+      "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==",
+      "license": "MIT"
+    },
+    "node_modules/tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
+      "license": "MIT"
+    },
+    "node_modules/to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
+      "license": "MIT"
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "license": "MIT",
+      "dependencies": {
+        "kind-of": "^3.0.2"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-object-path/node_modules/kind-of": {
+      "version": "3.2.2",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+      "license": "MIT",
+      "dependencies": {
+        "is-buffer": "^1.1.5"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-readable-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "license": "MIT",
+      "dependencies": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "license": "MIT",
+      "dependencies": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/define-property": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz",
+      "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+      "license": "MIT",
+      "dependencies": {
+        "is-descriptor": "^1.0.2",
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/extend-shallow": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+      "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+      "license": "MIT",
+      "dependencies": {
+        "assign-symbols": "^1.0.0",
+        "is-extendable": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex/node_modules/is-extendable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+      "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+      "license": "MIT",
+      "dependencies": {
+        "is-plain-object": "^2.0.4"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-vfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.1.0.tgz",
+      "integrity": "sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==",
+      "dependencies": {
+        "is-buffer": "^2.0.0",
+        "vfile": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/to-vfile/node_modules/is-buffer": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/totalist": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz",
+      "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/trim": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz",
+      "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
+    },
+    "node_modules/trim-trailing-lines": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz",
+      "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/trough": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz",
+      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/ts-essentials": {
+      "version": "2.0.12",
+      "resolved": "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz",
+      "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==",
+      "license": "MIT"
+    },
+    "node_modules/ts-pnp": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz",
+      "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      },
+      "peerDependenciesMeta": {
+        "typescript": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz",
+      "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+      "license": "0BSD"
+    },
+    "node_modules/tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
+      "license": "MIT"
+    },
+    "node_modules/type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+      "license": "(MIT OR CC0-1.0)",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "license": "MIT",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+      "license": "MIT"
+    },
+    "node_modules/typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "license": "MIT",
+      "dependencies": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "node_modules/ua-parser-js": {
+      "version": "0.7.24",
+      "resolved": "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz",
+      "integrity": "sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw==",
+      "license": "MIT",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/unbox-primitive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
+      "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==",
+      "license": "MIT",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has-bigints": "^1.0.0",
+        "has-symbols": "^1.0.0",
+        "which-boxed-primitive": "^1.0.1"
+      }
+    },
+    "node_modules/unherit": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz",
+      "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "^2.0.0",
+        "xtend": "^4.0.0"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "license": "MIT",
+      "dependencies": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-match-property-value-ecmascript": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unicode-property-aliases-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/unified": {
+      "version": "9.2.0",
+      "resolved": "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz",
+      "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
+      "license": "MIT",
+      "dependencies": {
+        "bail": "^1.0.0",
+        "extend": "^3.0.0",
+        "is-buffer": "^2.0.0",
+        "is-plain-obj": "^2.0.0",
+        "trough": "^1.0.0",
+        "vfile": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unified/node_modules/is-buffer": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz",
+      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "license": "MIT",
+      "dependencies": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
+      "license": "MIT"
+    },
+    "node_modules/uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
+      "license": "MIT"
+    },
+    "node_modules/unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "license": "ISC",
+      "dependencies": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "node_modules/unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "license": "ISC",
+      "dependencies": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "node_modules/unique-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz",
+      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "license": "MIT",
+      "dependencies": {
+        "crypto-random-string": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/unist-builder": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz",
+      "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-find-after": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz",
+      "integrity": "sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==",
+      "dependencies": {
+        "unist-util-is": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-generated": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz",
+      "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-is": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz",
+      "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-position": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz",
+      "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-remove": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.1.tgz",
+      "integrity": "sha512-YtuetK6o16CMfG+0u4nndsWpujgsHDHHLyE0yGpJLLn5xSjKeyGyzEBOI2XbmoUHCYabmNgX52uxlWoQhcvR7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "unist-util-is": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-remove-position": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
+      "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
+      "license": "MIT",
+      "dependencies": {
+        "unist-util-visit": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-stringify-position": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^2.0.2"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-visit": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+      "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^2.0.0",
+        "unist-util-is": "^4.0.0",
+        "unist-util-visit-parents": "^3.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/unist-util-visit-parents": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
+      "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^2.0.0",
+        "unist-util-is": "^4.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 10.0.0"
+      }
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
+      "license": "MIT"
+    },
+    "node_modules/unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "license": "MIT",
+      "dependencies": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value": {
+      "version": "0.3.1",
+      "resolved": "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz",
+      "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+      "license": "MIT",
+      "dependencies": {
+        "get-value": "^2.0.3",
+        "has-values": "^0.1.4",
+        "isobject": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz",
+      "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+      "license": "MIT",
+      "dependencies": {
+        "isarray": "1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/unset-value/node_modules/has-values": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz",
+      "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4",
+        "yarn": "*"
+      }
+    },
+    "node_modules/update-notifier": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz",
+      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "boxen": "^5.0.0",
+        "chalk": "^4.1.0",
+        "configstore": "^5.0.1",
+        "has-yarn": "^2.1.0",
+        "import-lazy": "^2.1.0",
+        "is-ci": "^2.0.0",
+        "is-installed-globally": "^0.4.0",
+        "is-npm": "^5.0.0",
+        "is-yarn-global": "^0.3.0",
+        "latest-version": "^5.1.0",
+        "pupa": "^2.1.1",
+        "semver": "^7.3.4",
+        "semver-diff": "^3.1.1",
+        "xdg-basedir": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/yeoman/update-notifier?sponsor=1"
+      }
+    },
+    "node_modules/update-notifier/node_modules/semver": {
+      "version": "7.3.4",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz",
+      "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+      "license": "ISC",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "license": "BSD-2-Clause",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/uri-js/node_modules/punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+      "license": "MIT"
+    },
+    "node_modules/url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "license": "MIT",
+      "dependencies": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      }
+    },
+    "node_modules/url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "license": "MIT",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "file-loader": "*",
+        "webpack": "^4.0.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "file-loader": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/url-parse": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz",
+      "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
+      "license": "MIT",
+      "dependencies": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "node_modules/url-parse-lax": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "license": "MIT",
+      "dependencies": {
+        "prepend-http": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/url-parse-lax/node_modules/prepend-http": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz",
+      "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/url/node_modules/punycode": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz",
+      "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+      "license": "MIT"
+    },
+    "node_modules/use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/use-composed-ref": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz",
+      "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==",
+      "license": "MIT",
+      "dependencies": {
+        "ts-essentials": "^2.0.3"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0"
+      }
+    },
+    "node_modules/use-isomorphic-layout-effect": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz",
+      "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==",
+      "license": "MIT",
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/use-latest": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz",
+      "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==",
+      "license": "MIT",
+      "dependencies": {
+        "use-isomorphic-layout-effect": "^1.0.0"
+      },
+      "peerDependencies": {
+        "react": "^16.8.0 || ^17.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/react": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "license": "MIT",
+      "dependencies": {
+        "inherits": "2.0.3"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+      "license": "MIT"
+    },
+    "node_modules/util.promisify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz",
+      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+      "license": "MIT",
+      "dependencies": {
+        "define-properties": "^1.1.2",
+        "object.getownpropertydescriptors": "^2.0.3"
+      }
+    },
+    "node_modules/util/node_modules/inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+      "license": "ISC"
+    },
+    "node_modules/utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
+      "license": "MIT"
+    },
+    "node_modules/utility-types": {
+      "version": "3.10.0",
+      "resolved": "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz",
+      "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+      "license": "MIT",
+      "bin": {
+        "uuid": "bin/uuid"
+      }
+    },
+    "node_modules/value-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz",
+      "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==",
+      "license": "MIT"
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz",
+      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/vfile": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz",
+      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^2.0.0",
+        "is-buffer": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0",
+        "vfile-message": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/vfile-location": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz",
+      "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==",
+      "license": "MIT",
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/vfile-message": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz",
+      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/unist": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/unified"
+      }
+    },
+    "node_modules/vfile/node_modules/is-buffer": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz",
+      "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
+      "license": "MIT"
+    },
+    "node_modules/wait-on": {
+      "version": "5.3.0",
+      "resolved": "https://registry.yarnpkg.com/wait-on/-/wait-on-5.3.0.tgz",
+      "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
+      "license": "MIT",
+      "dependencies": {
+        "axios": "^0.21.1",
+        "joi": "^17.3.0",
+        "lodash": "^4.17.21",
+        "minimist": "^1.2.5",
+        "rxjs": "^6.6.3"
+      },
+      "bin": {
+        "wait-on": "bin/wait-on"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "1.7.5",
+      "resolved": "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz",
+      "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
+      "license": "MIT",
+      "dependencies": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.1"
+      },
+      "optionalDependencies": {
+        "chokidar": "^3.4.1",
+        "watchpack-chokidar2": "^2.0.1"
+      }
+    },
+    "node_modules/watchpack-chokidar2": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "chokidar": "^2.1.8"
+      }
+    },
+    "node_modules/watchpack/node_modules/anymatch": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz",
+      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+      "license": "ISC",
+      "optional": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/watchpack/node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/chokidar": {
+      "version": "3.5.1",
+      "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz",
+      "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "anymatch": "~3.1.1",
+        "braces": "~3.0.2",
+        "fsevents": "~2.3.1",
+        "glob-parent": "~5.1.0",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.5.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.1"
+      }
+    },
+    "node_modules/watchpack/node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "license": "MIT",
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/watchpack/node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "license": "MIT",
+      "optional": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/readdirp": {
+      "version": "3.5.0",
+      "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz",
+      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/watchpack/node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "license": "MIT",
+      "optional": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "license": "MIT",
+      "dependencies": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "node_modules/web-namespaces": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz",
+      "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "4.46.0",
+      "resolved": "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz",
+      "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
+      "license": "MIT",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
+        "ajv": "^6.10.2",
+        "ajv-keywords": "^3.4.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^4.5.0",
+        "eslint-scope": "^4.0.3",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.4.0",
+        "loader-utils": "^1.2.3",
+        "memory-fs": "^0.4.1",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
+        "webpack-sources": "^1.4.1"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=6.11.5"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        },
+        "webpack-command": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-bundle-analyzer": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz",
+      "integrity": "sha512-9DhNa+aXpqdHk8LkLPTBU/dMfl84Y+WE2+KnfI6rSpNRNVKa0VGLjPd2pjFubDeqnWmulFggxmWBxhfJXZnR0g==",
+      "license": "MIT",
+      "dependencies": {
+        "acorn": "^8.0.4",
+        "acorn-walk": "^8.0.0",
+        "chalk": "^4.1.0",
+        "commander": "^6.2.0",
+        "gzip-size": "^6.0.0",
+        "lodash": "^4.17.20",
+        "opener": "^1.5.2",
+        "sirv": "^1.0.7",
+        "ws": "^7.3.1"
+      },
+      "bin": {
+        "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/webpack-bundle-analyzer/node_modules/acorn": {
+      "version": "8.1.0",
+      "resolved": "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz",
+      "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA==",
+      "license": "MIT",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+      "version": "6.2.1",
+      "resolved": "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz",
+      "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+      "license": "MIT",
+      "dependencies": {
+        "duplexer": "^0.1.2"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/webpack-bundle-analyzer/node_modules/ws": {
+      "version": "7.4.4",
+      "resolved": "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz",
+      "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8.3.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": "^5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-dev-middleware": {
+      "version": "3.7.3",
+      "resolved": "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
+      "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      },
+      "engines": {
+        "node": ">= 6"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/webpack-dev-server": {
+      "version": "3.11.2",
+      "resolved": "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz",
+      "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.8",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "debug": "^4.1.1",
+        "del": "^4.1.1",
+        "express": "^4.17.1",
+        "html-entities": "^1.3.1",
+        "http-proxy-middleware": "0.19.1",
+        "import-local": "^2.0.0",
+        "internal-ip": "^4.3.0",
+        "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.3",
+        "killable": "^1.0.1",
+        "loglevel": "^1.6.8",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.26",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.8",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "^0.3.21",
+        "sockjs-client": "^1.5.0",
+        "spdy": "^4.0.2",
+        "strip-ansi": "^3.0.1",
+        "supports-color": "^6.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "^3.7.2",
+        "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
+        "yargs": "^13.3.2"
+      },
+      "bin": {
+        "webpack-dev-server": "bin/webpack-dev-server.js"
+      },
+      "engines": {
+        "node": ">= 6.11.5"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/array-union": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz",
+      "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+      "license": "MIT",
+      "dependencies": {
+        "array-uniq": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/debug": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+      "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+      "license": "MIT",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/del": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz",
+      "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+      "license": "MIT",
+      "dependencies": {
+        "@types/glob": "^7.1.1",
+        "globby": "^6.1.0",
+        "is-path-cwd": "^2.0.0",
+        "is-path-in-cwd": "^2.0.0",
+        "p-map": "^2.0.0",
+        "pify": "^4.0.1",
+        "rimraf": "^2.6.3"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/globby": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz",
+      "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+      "license": "MIT",
+      "dependencies": {
+        "array-union": "^1.0.1",
+        "glob": "^7.0.3",
+        "object-assign": "^4.0.1",
+        "pify": "^2.0.0",
+        "pinkie-promise": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+      "license": "MIT"
+    },
+    "node_modules/webpack-dev-server/node_modules/p-map": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz",
+      "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/webpack-dev-server/node_modules/supports-color": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz",
+      "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+      "license": "MIT",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+      "license": "MIT",
+      "dependencies": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz",
+      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+      "license": "MIT",
+      "dependencies": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "node_modules/webpack/node_modules/cacache": {
+      "version": "12.0.4",
+      "resolved": "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz",
+      "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+      "license": "ISC",
+      "dependencies": {
+        "bluebird": "^3.5.5",
+        "chownr": "^1.1.1",
+        "figgy-pudding": "^3.5.1",
+        "glob": "^7.1.4",
+        "graceful-fs": "^4.1.15",
+        "infer-owner": "^1.0.3",
+        "lru-cache": "^5.1.1",
+        "mississippi": "^3.0.0",
+        "mkdirp": "^0.5.1",
+        "move-concurrently": "^1.0.1",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^2.6.3",
+        "ssri": "^6.0.1",
+        "unique-filename": "^1.1.1",
+        "y18n": "^4.0.0"
+      }
+    },
+    "node_modules/webpack/node_modules/chownr": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz",
+      "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
+      "license": "ISC"
+    },
+    "node_modules/webpack/node_modules/find-cache-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+      "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+      "license": "MIT",
+      "dependencies": {
+        "commondir": "^1.0.1",
+        "make-dir": "^2.0.0",
+        "pkg-dir": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/webpack/node_modules/json5": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+      "license": "MIT",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/webpack/node_modules/loader-utils": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+      "license": "MIT",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/webpack/node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "license": "ISC",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/webpack/node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "license": "MIT",
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/webpack/node_modules/schema-utils": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz",
+      "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+      "license": "MIT",
+      "dependencies": {
+        "ajv": "^6.1.0",
+        "ajv-errors": "^1.0.0",
+        "ajv-keywords": "^3.1.0"
+      },
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/webpack/node_modules/semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+      "license": "ISC",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/webpack/node_modules/serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/webpack/node_modules/ssri": {
+      "version": "6.0.1",
+      "resolved": "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz",
+      "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+      "license": "ISC",
+      "dependencies": {
+        "figgy-pudding": "^3.5.1"
+      }
+    },
+    "node_modules/webpack/node_modules/terser-webpack-plugin": {
+      "version": "1.4.5",
+      "resolved": "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+      "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+      "license": "MIT",
+      "dependencies": {
+        "cacache": "^12.0.2",
+        "find-cache-dir": "^2.1.0",
+        "is-wsl": "^1.1.0",
+        "schema-utils": "^1.0.0",
+        "serialize-javascript": "^4.0.0",
+        "source-map": "^0.6.1",
+        "terser": "^4.1.2",
+        "webpack-sources": "^1.4.0",
+        "worker-farm": "^1.7.0"
+      },
+      "engines": {
+        "node": ">= 6.9.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0"
+      }
+    },
+    "node_modules/webpack/node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+      "license": "ISC"
+    },
+    "node_modules/webpackbar": {
+      "version": "5.0.0-3",
+      "resolved": "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.0-3.tgz",
+      "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-escapes": "^4.3.1",
+        "chalk": "^4.1.0",
+        "consola": "^2.15.0",
+        "figures": "^3.2.0",
+        "pretty-time": "^1.1.0",
+        "std-env": "^2.2.1",
+        "text-table": "^0.2.0",
+        "wrap-ansi": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "peerDependencies": {
+        "webpack": "3 || 4 || 5"
+      }
+    },
+    "node_modules/websocket-driver": {
+      "version": "0.7.4",
+      "resolved": "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz",
+      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "http-parser-js": ">=0.5.1",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      },
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+      "license": "Apache-2.0",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "license": "ISC",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "which": "bin/which"
+      }
+    },
+    "node_modules/which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "license": "MIT",
+      "dependencies": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+      "license": "ISC"
+    },
+    "node_modules/wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "dependencies": {
+        "string-width": "^1.0.2 || 2"
+      }
+    },
+    "node_modules/wide-align/node_modules/ansi-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/wide-align/node_modules/string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "dependencies": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/wide-align/node_modules/strip-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+      "dependencies": {
+        "ansi-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/widest-line": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz",
+      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "license": "MIT",
+      "dependencies": {
+        "string-width": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/widest-line/node_modules/ansi-regex": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/widest-line/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/widest-line/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/widest-line/node_modules/string-width": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz",
+      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/widest-line/node_modules/strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+      "license": "MIT",
+      "dependencies": {
+        "errno": "~0.1.7"
+      }
+    },
+    "node_modules/worker-rpc": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz",
+      "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
+      "license": "MIT",
+      "dependencies": {
+        "microevent.ts": "~0.1.1"
+      }
+    },
+    "node_modules/wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/ansi-regex": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+      "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "license": "MIT",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "license": "MIT",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/emoji-regex": {
+      "version": "8.0.0",
+      "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+      "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+      "license": "MIT"
+    },
+    "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+      "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/string-width": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz",
+      "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+      "license": "MIT",
+      "dependencies": {
+        "emoji-regex": "^8.0.0",
+        "is-fullwidth-code-point": "^3.0.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrap-ansi/node_modules/strip-ansi": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+      "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+      "license": "MIT",
+      "dependencies": {
+        "ansi-regex": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+      "license": "ISC"
+    },
+    "node_modules/write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "license": "ISC",
+      "dependencies": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "node_modules/ws": {
+      "version": "6.2.1",
+      "resolved": "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz",
+      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+      "license": "MIT",
+      "dependencies": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "node_modules/xdg-basedir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/xml-js": {
+      "version": "1.6.11",
+      "resolved": "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz",
+      "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+      "license": "MIT",
+      "dependencies": {
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "xml-js": "bin/cli.js"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/y18n": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz",
+      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
+      "license": "ISC"
+    },
+    "node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "license": "ISC"
+    },
+    "node_modules/yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/yargs": {
+      "version": "13.3.2",
+      "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz",
+      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "license": "MIT",
+      "dependencies": {
+        "cliui": "^5.0.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^3.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^13.1.2"
+      }
+    },
+    "node_modules/yargs-parser": {
+      "version": "13.1.2",
+      "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz",
+      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "license": "ISC",
+      "dependencies": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      }
+    },
+    "node_modules/yargs-parser/node_modules/camelcase": {
+      "version": "5.3.1",
+      "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz",
+      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/zwitch": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz",
+      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+      "license": "MIT",
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/wooorm"
+      }
+    }
+  },
+  "dependencies": {
+    "@algolia/autocomplete-core": {
+      "version": "1.0.0-alpha.44",
+      "resolved": "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.0.0-alpha.44.tgz",
+      "integrity": "sha512-2iMXthldMIDXtlbg9omRKLgg1bLo2ZzINAEqwhNjUeyj1ceEyL1ck6FY0VnJpf2LsjmNthHCz2BuFk+nYUeDNA==",
+      "requires": {
+        "@algolia/autocomplete-shared": "1.0.0-alpha.44"
+      }
+    },
+    "@algolia/autocomplete-preset-algolia": {
+      "version": "1.0.0-alpha.44",
+      "resolved": "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.0.0-alpha.44.tgz",
+      "integrity": "sha512-DCHwo5ovzg9k2ejUolGNTLFnIA7GpsrkbNJTy1sFbMnYfBmeK8egZPZnEl7lBTr27OaZu7IkWpTepLVSztZyng==",
+      "requires": {
+        "@algolia/autocomplete-shared": "1.0.0-alpha.44"
+      }
+    },
+    "@algolia/autocomplete-shared": {
+      "version": "1.0.0-alpha.44",
+      "resolved": "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.0.0-alpha.44.tgz",
+      "integrity": "sha512-2oQZPERYV+yNx/yoVWYjZZdOqsitJ5dfxXJjL18yczOXH6ujnsq+DTczSrX+RjzjQdVeJ1UAG053EJQF/FOiMg=="
+    },
+    "@algolia/cache-browser-local-storage": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.8.6.tgz",
+      "integrity": "sha512-Bam7otzjIEgrRXWmk0Amm1+B3ROI5dQnUfJEBjIy0YPM0kMahEoJXCw6160tGKxJLl1g6icoC953nGshQKO7cA==",
+      "requires": {
+        "@algolia/cache-common": "4.8.6"
+      }
+    },
+    "@algolia/cache-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.8.6.tgz",
+      "integrity": "sha512-eGQlsXU5G7n4RvV/K6qe6lRAeL6EKAYPT3yZDBjCW4pAh7JWta+77a7BwUQkTqXN1MEQWZXjex3E4z/vFpzNrg=="
+    },
+    "@algolia/cache-in-memory": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.8.6.tgz",
+      "integrity": "sha512-kbJrvCFANxL/l5Pq1NFyHLRphKDwmqcD/OJga0IbNKEulRGDPkt1+pC7/q8d2ikP12adBjLLg2CVias9RJpIaw==",
+      "requires": {
+        "@algolia/cache-common": "4.8.6"
+      }
+    },
+    "@algolia/client-account": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.8.6.tgz",
+      "integrity": "sha512-FQVJE/BgCb78jtG7V0r30sMl9P5JKsrsOacGtGF2YebqI0YF25y8Z1nO39lbdjahxUS3QkDw2d0P2EVMj65g2Q==",
+      "requires": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/client-search": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "@algolia/client-analytics": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.8.6.tgz",
+      "integrity": "sha512-ZBYFUlzNaWDFtt0rYHI7xbfVX0lPWU9lcEEXI/BlnkRgEkm247H503tNatPQFA1YGkob52EU18sV1eJ+OFRBLA==",
+      "requires": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/client-search": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "@algolia/client-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.8.6.tgz",
+      "integrity": "sha512-8dI+K3Nvbes2YRZm2LY7bdCUD05e60BhacrMLxFuKxnBGuNehME1wbxq/QxcG1iNFJlxLIze5TxIcNN3+pn76g==",
+      "requires": {
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "@algolia/client-recommendation": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-recommendation/-/client-recommendation-4.8.6.tgz",
+      "integrity": "sha512-Kg8DpjwvaWWujNx6sAUrSL+NTHxFe/UNaliCcSKaMhd3+FiPXN+CrSkO0KWR7I+oK2qGBTG/2Y0BhFOJ5/B/RA==",
+      "requires": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "@algolia/client-search": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.8.6.tgz",
+      "integrity": "sha512-vXLS6umL/9G3bwqc6pkrS9K5/s8coq55mpfRARL+bs0NsToOf77WSTdwzlxv/KdbVF7dHjXgUpBvJ6RyR4ZdAw==",
+      "requires": {
+        "@algolia/client-common": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "@algolia/logger-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.8.6.tgz",
+      "integrity": "sha512-FMRxZGdDxSzd0/Mv0R1021FvUt0CcbsQLYeyckvSWX8w+Uk4o0lcV6UtZdERVR5XZsGOqoXLMIYDbR2vkbGbVw=="
+    },
+    "@algolia/logger-console": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.8.6.tgz",
+      "integrity": "sha512-TYw9lwUCjvApC6Z0zn36T6gkCl7hbfJmnU+Z/D8pFJ3Yp7lz06S3oWGjbdrULrYP1w1VOhjd0X7/yGNsMhzutQ==",
+      "requires": {
+        "@algolia/logger-common": "4.8.6"
+      }
+    },
+    "@algolia/requester-browser-xhr": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.8.6.tgz",
+      "integrity": "sha512-omh6uJ3CJXOmcrU9M3/KfGg8XkUuGJGIMkqEbkFvIebpBJxfs6TVs0ziNeMFAcAfhi8/CGgpLbDSgJtWdGQa6w==",
+      "requires": {
+        "@algolia/requester-common": "4.8.6"
+      }
+    },
+    "@algolia/requester-common": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.8.6.tgz",
+      "integrity": "sha512-r5xJqq/D9KACkI5DgRbrysVL5DUUagikpciH0k0zjBbm+cXiYfpmdflo/h6JnY6kmvWgjr/4DoeTjKYb/0deAQ=="
+    },
+    "@algolia/requester-node-http": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.8.6.tgz",
+      "integrity": "sha512-TB36OqTVOKyHCOtdxhn/IJyI/NXi/BWy8IEbsiWwwZWlL79NWHbetj49jXWFolEYEuu8PgDjjZGpRhypSuO9XQ==",
+      "requires": {
+        "@algolia/requester-common": "4.8.6"
+      }
+    },
+    "@algolia/transporter": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.8.6.tgz",
+      "integrity": "sha512-NRb31J0TP7EPoVMpXZ4yAtr61d26R8KGaf6qdULknvq5sOVHuuH4PwmF08386ERfIsgnM/OBhl+uzwACdCIjSg==",
+      "requires": {
+        "@algolia/cache-common": "4.8.6",
+        "@algolia/logger-common": "4.8.6",
+        "@algolia/requester-common": "4.8.6"
+      }
+    },
+    "@babel/code-frame": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz",
+      "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
+      "requires": {
+        "@babel/highlight": "^7.12.13"
+      }
+    },
+    "@babel/compat-data": {
+      "version": "7.13.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.11.tgz",
+      "integrity": "sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg=="
+    },
+    "@babel/core": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.13.10.tgz",
+      "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==",
+      "requires": {
+        "@babel/code-frame": "^7.12.13",
+        "@babel/generator": "^7.13.9",
+        "@babel/helper-compilation-targets": "^7.13.10",
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helpers": "^7.13.10",
+        "@babel/parser": "^7.13.10",
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.1.2",
+        "lodash": "^4.17.19",
+        "semver": "^6.3.0",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "@babel/generator": {
+      "version": "7.13.9",
+      "resolved": "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz",
+      "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==",
+      "requires": {
+        "@babel/types": "^7.13.0",
+        "jsesc": "^2.5.1",
+        "source-map": "^0.5.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "@babel/helper-annotate-as-pure": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz",
+      "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==",
+      "requires": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-builder-binary-assignment-operator-visitor": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz",
+      "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==",
+      "requires": {
+        "@babel/helper-explode-assignable-expression": "^7.12.13",
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-compilation-targets": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz",
+      "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==",
+      "requires": {
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-validator-option": "^7.12.17",
+        "browserslist": "^4.14.5",
+        "semver": "^6.3.0"
+      }
+    },
+    "@babel/helper-create-class-features-plugin": {
+      "version": "7.13.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz",
+      "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==",
+      "requires": {
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-member-expression-to-functions": "^7.13.0",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.13.0",
+        "@babel/helper-split-export-declaration": "^7.12.13"
+      }
+    },
+    "@babel/helper-create-regexp-features-plugin": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz",
+      "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "regexpu-core": "^4.7.1"
+      }
+    },
+    "@babel/helper-define-polyfill-provider": {
+      "version": "0.1.5",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz",
+      "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==",
+      "requires": {
+        "@babel/helper-compilation-targets": "^7.13.0",
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/traverse": "^7.13.0",
+        "debug": "^4.1.1",
+        "lodash.debounce": "^4.0.8",
+        "resolve": "^1.14.2",
+        "semver": "^6.1.2"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "@babel/helper-explode-assignable-expression": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz",
+      "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==",
+      "requires": {
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/helper-function-name": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
+      "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
+      "requires": {
+        "@babel/helper-get-function-arity": "^7.12.13",
+        "@babel/template": "^7.12.13",
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-get-function-arity": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
+      "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
+      "requires": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-hoist-variables": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz",
+      "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==",
+      "requires": {
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/helper-member-expression-to-functions": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz",
+      "integrity": "sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ==",
+      "requires": {
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/helper-module-imports": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz",
+      "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==",
+      "requires": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-module-transforms": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz",
+      "integrity": "sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw==",
+      "requires": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.13.0",
+        "@babel/helper-simple-access": "^7.12.13",
+        "@babel/helper-split-export-declaration": "^7.12.13",
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0",
+        "lodash": "^4.17.19"
+      }
+    },
+    "@babel/helper-optimise-call-expression": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
+      "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
+      "requires": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-plugin-utils": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
+      "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ=="
+    },
+    "@babel/helper-remap-async-to-generator": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz",
+      "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "@babel/helper-wrap-function": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/helper-replace-supers": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz",
+      "integrity": "sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw==",
+      "requires": {
+        "@babel/helper-member-expression-to-functions": "^7.13.0",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/helper-simple-access": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz",
+      "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==",
+      "requires": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-skip-transparent-expression-wrappers": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
+      "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
+      "requires": {
+        "@babel/types": "^7.12.1"
+      }
+    },
+    "@babel/helper-split-export-declaration": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
+      "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
+      "requires": {
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.12.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+      "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw=="
+    },
+    "@babel/helper-validator-option": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
+      "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw=="
+    },
+    "@babel/helper-wrap-function": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz",
+      "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==",
+      "requires": {
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/helpers": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz",
+      "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==",
+      "requires": {
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz",
+      "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        }
+      }
+    },
+    "@babel/parser": {
+      "version": "7.13.11",
+      "resolved": "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.11.tgz",
+      "integrity": "sha512-PhuoqeHoO9fc4ffMEVk4qb/w/s2iOSWohvbHxLtxui0eBg3Lg5gN1U8wp1V1u61hOWkPQJJyJzGH6Y+grwkq8Q=="
+    },
+    "@babel/plugin-proposal-async-generator-functions": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz",
+      "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-remap-async-to-generator": "^7.13.0",
+        "@babel/plugin-syntax-async-generators": "^7.8.4"
+      }
+    },
+    "@babel/plugin-proposal-class-properties": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz",
+      "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==",
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-proposal-dynamic-import": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz",
+      "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-export-namespace-from": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz",
+      "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-json-strings": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz",
+      "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-logical-assignment-operators": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz",
+      "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-nullish-coalescing-operator": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz",
+      "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-numeric-separator": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz",
+      "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+      }
+    },
+    "@babel/plugin-proposal-object-rest-spread": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz",
+      "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==",
+      "requires": {
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-compilation-targets": "^7.13.8",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-transform-parameters": "^7.13.0"
+      }
+    },
+    "@babel/plugin-proposal-optional-catch-binding": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz",
+      "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-optional-chaining": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.8.tgz",
+      "integrity": "sha512-hpbBwbTgd7Cz1QryvwJZRo1U0k1q8uyBmeXOSQUjdg/A2TASkhR/rz7AyqZ/kS8kbpsNA80rOYbxySBJAqmhhQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
+      }
+    },
+    "@babel/plugin-proposal-private-methods": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz",
+      "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==",
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-proposal-unicode-property-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz",
+      "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-syntax-async-generators": {
+      "version": "7.8.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+      "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-class-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-syntax-dynamic-import": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+      "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-export-namespace-from": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+      "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.3"
+      }
+    },
+    "@babel/plugin-syntax-json-strings": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+      "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-jsx": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz",
+      "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      },
+      "dependencies": {
+        "@babel/core": {
+          "version": "7.12.9",
+          "peer": true,
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.12.5",
+            "@babel/helper-module-transforms": "^7.12.1",
+            "@babel/helpers": "^7.12.5",
+            "@babel/parser": "^7.12.7",
+            "@babel/template": "^7.12.7",
+            "@babel/traverse": "^7.12.9",
+            "@babel/types": "^7.12.7",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.2",
+            "lodash": "^4.17.19",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "peer": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+          "peer": true
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "peer": true
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+          "peer": true
+        }
+      }
+    },
+    "@babel/plugin-syntax-logical-assignment-operators": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+      "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-nullish-coalescing-operator": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+      "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-numeric-separator": {
+      "version": "7.10.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+      "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-syntax-object-rest-spread": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+      "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-catch-binding": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+      "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-optional-chaining": {
+      "version": "7.8.3",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+      "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.8.0"
+      }
+    },
+    "@babel/plugin-syntax-top-level-await": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz",
+      "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-syntax-typescript": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz",
+      "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-arrow-functions": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz",
+      "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-async-to-generator": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz",
+      "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==",
+      "requires": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-remap-async-to-generator": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-block-scoped-functions": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz",
+      "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-block-scoping": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz",
+      "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-classes": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz",
+      "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-replace-supers": "^7.13.0",
+        "@babel/helper-split-export-declaration": "^7.12.13",
+        "globals": "^11.1.0"
+      }
+    },
+    "@babel/plugin-transform-computed-properties": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz",
+      "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-destructuring": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz",
+      "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-dotall-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz",
+      "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-duplicate-keys": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz",
+      "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-exponentiation-operator": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz",
+      "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==",
+      "requires": {
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-for-of": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz",
+      "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-function-name": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz",
+      "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==",
+      "requires": {
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-literals": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz",
+      "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-member-expression-literals": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz",
+      "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-modules-amd": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz",
+      "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==",
+      "requires": {
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-commonjs": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz",
+      "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==",
+      "requires": {
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-simple-access": "^7.12.13",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-systemjs": {
+      "version": "7.13.8",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz",
+      "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==",
+      "requires": {
+        "@babel/helper-hoist-variables": "^7.13.0",
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "babel-plugin-dynamic-import-node": "^2.3.3"
+      }
+    },
+    "@babel/plugin-transform-modules-umd": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz",
+      "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==",
+      "requires": {
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-named-capturing-groups-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz",
+      "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-new-target": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz",
+      "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-object-super": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz",
+      "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-parameters": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz",
+      "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-property-literals": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz",
+      "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-react-constant-elements": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.13.10.tgz",
+      "integrity": "sha512-E+aCW9j7mLq01tOuGV08YzLBt+vSyr4bOPT75B6WrAlrUfmOYOZ/yWk847EH0dv0xXiCihWLEmlX//O30YhpIw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-react-display-name": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.12.13.tgz",
+      "integrity": "sha512-MprESJzI9O5VnJZrL7gg1MpdqmiFcUv41Jc7SahxYsNP2kDkFqClxxTZq+1Qv4AFCamm+GXMRDQINNn+qrxmiA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-react-jsx": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.12.17.tgz",
+      "integrity": "sha512-mwaVNcXV+l6qJOuRhpdTEj8sT/Z0owAVWf9QujTZ0d2ye9X/K+MTOTSizcgKOj18PGnTc/7g1I4+cIUjsKhBcw==",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.12.13",
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-syntax-jsx": "^7.12.13",
+        "@babel/types": "^7.12.17"
+      },
+      "dependencies": {
+        "@babel/plugin-syntax-jsx": {
+          "version": "7.12.13",
+          "resolved": "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.13.tgz",
+          "integrity": "sha512-d4HM23Q1K7oq/SLNmG6mRt85l2csmQ0cHRaxRXjKW0YFdEXqlZ5kzFQKH5Uc3rDJECgu+yCRgPkG04Mm98R/1g==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.12.13"
+          }
+        }
+      }
+    },
+    "@babel/plugin-transform-react-jsx-development": {
+      "version": "7.12.17",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.12.17.tgz",
+      "integrity": "sha512-BPjYV86SVuOaudFhsJR1zjgxxOhJDt6JHNoD48DxWEIxUCAMjV1ys6DYw4SDYZh0b1QsS2vfIA9t/ZsQGsDOUQ==",
+      "requires": {
+        "@babel/plugin-transform-react-jsx": "^7.12.17"
+      }
+    },
+    "@babel/plugin-transform-react-pure-annotations": {
+      "version": "7.12.1",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.12.1.tgz",
+      "integrity": "sha512-RqeaHiwZtphSIUZ5I85PEH19LOSzxfuEazoY7/pWASCAIBuATQzpSVD+eT6MebeeZT2F4eSL0u4vw6n4Nm0Mjg==",
+      "requires": {
+        "@babel/helper-annotate-as-pure": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.10.4"
+      }
+    },
+    "@babel/plugin-transform-regenerator": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz",
+      "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==",
+      "requires": {
+        "regenerator-transform": "^0.14.2"
+      }
+    },
+    "@babel/plugin-transform-reserved-words": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz",
+      "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-runtime": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz",
+      "integrity": "sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA==",
+      "requires": {
+        "@babel/helper-module-imports": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "babel-plugin-polyfill-corejs2": "^0.1.4",
+        "babel-plugin-polyfill-corejs3": "^0.1.3",
+        "babel-plugin-polyfill-regenerator": "^0.1.2",
+        "semver": "^6.3.0"
+      }
+    },
+    "@babel/plugin-transform-shorthand-properties": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz",
+      "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-spread": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz",
+      "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
+      }
+    },
+    "@babel/plugin-transform-sticky-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz",
+      "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-template-literals": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz",
+      "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0"
+      }
+    },
+    "@babel/plugin-transform-typeof-symbol": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz",
+      "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-typescript": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz",
+      "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==",
+      "requires": {
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-typescript": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-unicode-escapes": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz",
+      "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/plugin-transform-unicode-regex": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz",
+      "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==",
+      "requires": {
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
+      }
+    },
+    "@babel/preset-env": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.13.10.tgz",
+      "integrity": "sha512-nOsTScuoRghRtUsRr/c69d042ysfPHcu+KOB4A9aAO9eJYqrkat+LF8G1yp1HD18QiwixT2CisZTr/0b3YZPXQ==",
+      "requires": {
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-compilation-targets": "^7.13.10",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-option": "^7.12.17",
+        "@babel/plugin-proposal-async-generator-functions": "^7.13.8",
+        "@babel/plugin-proposal-class-properties": "^7.13.0",
+        "@babel/plugin-proposal-dynamic-import": "^7.13.8",
+        "@babel/plugin-proposal-export-namespace-from": "^7.12.13",
+        "@babel/plugin-proposal-json-strings": "^7.13.8",
+        "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
+        "@babel/plugin-proposal-numeric-separator": "^7.12.13",
+        "@babel/plugin-proposal-object-rest-spread": "^7.13.8",
+        "@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
+        "@babel/plugin-proposal-optional-chaining": "^7.13.8",
+        "@babel/plugin-proposal-private-methods": "^7.13.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.12.13",
+        "@babel/plugin-syntax-async-generators": "^7.8.4",
+        "@babel/plugin-syntax-class-properties": "^7.12.13",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+        "@babel/plugin-syntax-json-strings": "^7.8.3",
+        "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+        "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+        "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+        "@babel/plugin-syntax-top-level-await": "^7.12.13",
+        "@babel/plugin-transform-arrow-functions": "^7.13.0",
+        "@babel/plugin-transform-async-to-generator": "^7.13.0",
+        "@babel/plugin-transform-block-scoped-functions": "^7.12.13",
+        "@babel/plugin-transform-block-scoping": "^7.12.13",
+        "@babel/plugin-transform-classes": "^7.13.0",
+        "@babel/plugin-transform-computed-properties": "^7.13.0",
+        "@babel/plugin-transform-destructuring": "^7.13.0",
+        "@babel/plugin-transform-dotall-regex": "^7.12.13",
+        "@babel/plugin-transform-duplicate-keys": "^7.12.13",
+        "@babel/plugin-transform-exponentiation-operator": "^7.12.13",
+        "@babel/plugin-transform-for-of": "^7.13.0",
+        "@babel/plugin-transform-function-name": "^7.12.13",
+        "@babel/plugin-transform-literals": "^7.12.13",
+        "@babel/plugin-transform-member-expression-literals": "^7.12.13",
+        "@babel/plugin-transform-modules-amd": "^7.13.0",
+        "@babel/plugin-transform-modules-commonjs": "^7.13.8",
+        "@babel/plugin-transform-modules-systemjs": "^7.13.8",
+        "@babel/plugin-transform-modules-umd": "^7.13.0",
+        "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13",
+        "@babel/plugin-transform-new-target": "^7.12.13",
+        "@babel/plugin-transform-object-super": "^7.12.13",
+        "@babel/plugin-transform-parameters": "^7.13.0",
+        "@babel/plugin-transform-property-literals": "^7.12.13",
+        "@babel/plugin-transform-regenerator": "^7.12.13",
+        "@babel/plugin-transform-reserved-words": "^7.12.13",
+        "@babel/plugin-transform-shorthand-properties": "^7.12.13",
+        "@babel/plugin-transform-spread": "^7.13.0",
+        "@babel/plugin-transform-sticky-regex": "^7.12.13",
+        "@babel/plugin-transform-template-literals": "^7.13.0",
+        "@babel/plugin-transform-typeof-symbol": "^7.12.13",
+        "@babel/plugin-transform-unicode-escapes": "^7.12.13",
+        "@babel/plugin-transform-unicode-regex": "^7.12.13",
+        "@babel/preset-modules": "^0.1.4",
+        "@babel/types": "^7.13.0",
+        "babel-plugin-polyfill-corejs2": "^0.1.4",
+        "babel-plugin-polyfill-corejs3": "^0.1.3",
+        "babel-plugin-polyfill-regenerator": "^0.1.2",
+        "core-js-compat": "^3.9.0",
+        "semver": "^6.3.0"
+      }
+    },
+    "@babel/preset-modules": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
+      "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.0.0",
+        "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
+        "@babel/plugin-transform-dotall-regex": "^7.4.4",
+        "@babel/types": "^7.4.4",
+        "esutils": "^2.0.2"
+      }
+    },
+    "@babel/preset-react": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.12.13.tgz",
+      "integrity": "sha512-TYM0V9z6Abb6dj1K7i5NrEhA13oS5ujUYQYDfqIBXYHOc2c2VkFgc+q9kyssIyUfy4/hEwqrgSlJ/Qgv8zJLsA==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/plugin-transform-react-display-name": "^7.12.13",
+        "@babel/plugin-transform-react-jsx": "^7.12.13",
+        "@babel/plugin-transform-react-jsx-development": "^7.12.12",
+        "@babel/plugin-transform-react-pure-annotations": "^7.12.1"
+      }
+    },
+    "@babel/preset-typescript": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz",
+      "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==",
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-option": "^7.12.17",
+        "@babel/plugin-transform-typescript": "^7.13.0"
+      }
+    },
+    "@babel/runtime": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz",
+      "integrity": "sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==",
+      "requires": {
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@babel/runtime-corejs3": {
+      "version": "7.13.10",
+      "resolved": "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.13.10.tgz",
+      "integrity": "sha512-x/XYVQ1h684pp1mJwOV4CyvqZXqbc8CMsMGUnAbuc82ZCdv1U63w5RSUzgDSXQHG5Rps/kiksH6g2D5BuaKyXg==",
+      "requires": {
+        "core-js-pure": "^3.0.0",
+        "regenerator-runtime": "^0.13.4"
+      }
+    },
+    "@babel/template": {
+      "version": "7.12.13",
+      "resolved": "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz",
+      "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
+      "requires": {
+        "@babel/code-frame": "^7.12.13",
+        "@babel/parser": "^7.12.13",
+        "@babel/types": "^7.12.13"
+      }
+    },
+    "@babel/traverse": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz",
+      "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==",
+      "requires": {
+        "@babel/code-frame": "^7.12.13",
+        "@babel/generator": "^7.13.0",
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-split-export-declaration": "^7.12.13",
+        "@babel/parser": "^7.13.0",
+        "@babel/types": "^7.13.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0",
+        "lodash": "^4.17.19"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "@babel/types": {
+      "version": "7.13.0",
+      "resolved": "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz",
+      "integrity": "sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA==",
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.12.11",
+        "lodash": "^4.17.19",
+        "to-fast-properties": "^2.0.0"
+      }
+    },
+    "@choojs/findup": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/@choojs/findup/-/findup-0.2.1.tgz",
+      "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==",
+      "requires": {
+        "commander": "^2.15.1"
+      }
+    },
+    "@csstools/convert-colors": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz",
+      "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw=="
+    },
+    "@docsearch/css": {
+      "version": "3.0.0-alpha.34",
+      "resolved": "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.34.tgz",
+      "integrity": "sha512-ZUbmxbN9gQp3vuBo9GDnm+ywB9aZQSh0ogjt6865PmeRUvyCCvgSwyZktliLPvAztoGX56qewQjxNcso3RrSow=="
+    },
+    "@docsearch/react": {
+      "version": "3.0.0-alpha.34",
+      "resolved": "https://registry.yarnpkg.com/@docsearch/react/-/react-3.0.0-alpha.34.tgz",
+      "integrity": "sha512-BBVxu2qY1fyhxJfrGZvknFL6j1fJ3wLZvf2DsmVfmihu/RhYYnf8/C1gbc7RWX2fSoSzbQCcSuNbn4RvjuUJ+A==",
+      "requires": {
+        "@algolia/autocomplete-core": "1.0.0-alpha.44",
+        "@algolia/autocomplete-preset-algolia": "1.0.0-alpha.44",
+        "@docsearch/css": "3.0.0-alpha.34",
+        "algoliasearch": "^4.0.0"
+      }
+    },
+    "@docusaurus/core": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-PV0rlvVRvVEdqs1I4PktwZBJkhFg4O4bVeqseaTYuA1u/poQSiiZ+rhrZRJ+/OcTHZ8VlYZw7tCHaRH4RLbP2g==",
+      "requires": {
+        "@babel/core": "^7.12.16",
+        "@babel/generator": "^7.12.15",
+        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13",
+        "@babel/plugin-proposal-optional-chaining": "^7.12.16",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+        "@babel/plugin-transform-runtime": "^7.12.15",
+        "@babel/preset-env": "^7.12.16",
+        "@babel/preset-react": "^7.12.13",
+        "@babel/preset-typescript": "^7.12.16",
+        "@babel/runtime": "^7.12.5",
+        "@babel/runtime-corejs3": "^7.12.13",
+        "@babel/traverse": "^7.12.13",
+        "@docusaurus/cssnano-preset": "2.0.0-alpha.72",
+        "@docusaurus/react-loadable": "5.5.0",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "@endiliey/static-site-generator-webpack-plugin": "^4.0.0",
+        "@svgr/webpack": "^5.5.0",
+        "autoprefixer": "^10.2.5",
+        "babel-loader": "^8.2.2",
+        "babel-plugin-dynamic-import-node": "2.3.0",
+        "boxen": "^5.0.0",
+        "cache-loader": "^4.1.0",
+        "chalk": "^4.1.0",
+        "chokidar": "^3.5.1",
+        "clean-css": "^5.1.1",
+        "commander": "^5.1.0",
+        "copy-webpack-plugin": "^6.4.1",
+        "core-js": "^3.9.1",
+        "css-loader": "^5.1.1",
+        "del": "^6.0.0",
+        "detect-port": "^1.3.0",
+        "eta": "^1.12.1",
+        "express": "^4.17.1",
+        "file-loader": "^6.2.0",
+        "fs-extra": "^9.1.0",
+        "github-slugger": "^1.3.0",
+        "globby": "^11.0.2",
+        "html-minifier-terser": "^5.1.1",
+        "html-tags": "^3.1.0",
+        "html-webpack-plugin": "^4.5.0",
+        "import-fresh": "^3.3.0",
+        "is-root": "^2.1.0",
+        "joi": "^17.4.0",
+        "leven": "^3.1.0",
+        "lodash": "^4.17.20",
+        "mini-css-extract-plugin": "^0.8.0",
+        "module-alias": "^2.2.2",
+        "nprogress": "^0.2.0",
+        "null-loader": "^4.0.0",
+        "optimize-css-assets-webpack-plugin": "^5.0.4",
+        "pnp-webpack-plugin": "^1.6.4",
+        "postcss": "^8.2.7",
+        "postcss-loader": "^4.1.0",
+        "postcss-preset-env": "^6.7.0",
+        "prompts": "^2.4.0",
+        "react-dev-utils": "^11.0.1",
+        "react-helmet": "^6.1.0",
+        "react-loadable": "^5.5.0",
+        "react-loadable-ssr-addon": "^0.3.0",
+        "react-router": "^5.2.0",
+        "react-router-config": "^5.1.1",
+        "react-router-dom": "^5.2.0",
+        "resolve-pathname": "^3.0.0",
+        "semver": "^7.3.4",
+        "serve-handler": "^6.1.3",
+        "shelljs": "^0.8.4",
+        "std-env": "^2.2.1",
+        "terser-webpack-plugin": "^4.1.0",
+        "update-notifier": "^5.1.0",
+        "url-loader": "^4.1.1",
+        "wait-on": "^5.2.1",
+        "webpack": "^4.44.1",
+        "webpack-bundle-analyzer": "^4.4.0",
+        "webpack-dev-server": "^3.11.2",
+        "webpack-merge": "^4.2.2",
+        "webpackbar": "^5.0.0-3"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "autoprefixer": {
+          "version": "10.2.5",
+          "resolved": "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.2.5.tgz",
+          "integrity": "sha512-7H4AJZXvSsn62SqZyJCP+1AWwOuoYpUfK6ot9vm0e87XD6mT8lDywc9D9OTJPMULyGcvmIxzTAMeG2Cc+YX+fA==",
+          "requires": {
+            "browserslist": "^4.16.3",
+            "caniuse-lite": "^1.0.30001196",
+            "colorette": "^1.2.2",
+            "fraction.js": "^4.0.13",
+            "normalize-range": "^0.1.2",
+            "postcss-value-parser": "^4.1.0"
+          }
+        },
+        "babel-plugin-dynamic-import-node": {
+          "version": "2.3.0",
+          "resolved": "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
+          "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
+          "requires": {
+            "object.assign": "^4.1.0"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.2.0",
+          "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+          "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.5.1",
+          "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz",
+          "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.3.1",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.5.0"
+          }
+        },
+        "commander": {
+          "version": "5.1.0",
+          "resolved": "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz",
+          "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.3.2",
+          "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz",
+          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+          "optional": true
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        },
+        "postcss": {
+          "version": "8.2.8",
+          "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-8.2.8.tgz",
+          "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+          "requires": {
+            "colorette": "^1.2.2",
+            "nanoid": "^3.1.20",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-loader": {
+          "version": "4.2.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-4.2.0.tgz",
+          "integrity": "sha512-mqgScxHqbiz1yxbnNcPdKYo/6aVt+XExURmEbQlviFVWogDbM4AJ0A/B+ZBpYsJrTRxKw7HyRazg9x0Q9SWwLA==",
+          "requires": {
+            "cosmiconfig": "^7.0.0",
+            "klona": "^2.0.4",
+            "loader-utils": "^2.0.0",
+            "schema-utils": "^3.0.0",
+            "semver": "^7.3.4"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+        },
+        "readdirp": {
+          "version": "3.5.0",
+          "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz",
+          "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "@docusaurus/cssnano-preset": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-7W/dlemTaipVd/zrd9Fjq/xp6IX/qn2z/GDaPbJ2SPklHbts5nWuRAt++wkG8Ue+Qxc9Q5uOBjW0ihVb4478+A==",
+      "requires": {
+        "cssnano-preset-advanced": "^4.0.7",
+        "postcss": "^7.0.2",
+        "postcss-sort-media-queries": "^1.7.26"
+      }
+    },
+    "@docusaurus/mdx-loader": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-tG8EZc3w4xt7IKJIniPFChfVY1/adpn6w6vsXVxE96Y/1PmqKjIp6mtVKdzTShaf6MCnKrAOtEUSQR0eCRHOjQ==",
+      "requires": {
+        "@babel/parser": "^7.12.16",
+        "@babel/traverse": "^7.12.13",
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@mdx-js/mdx": "^1.6.21",
+        "@mdx-js/react": "^1.6.21",
+        "escape-html": "^1.0.3",
+        "file-loader": "^6.2.0",
+        "fs-extra": "^9.1.0",
+        "github-slugger": "^1.3.0",
+        "gray-matter": "^4.0.2",
+        "loader-utils": "^2.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "remark-emoji": "^2.1.0",
+        "stringify-object": "^3.3.0",
+        "unist-util-visit": "^2.0.2",
+        "url-loader": "^4.1.1",
+        "webpack": "^4.44.1"
+      }
+    },
+    "@docusaurus/plugin-content-blog": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-q1noOyULAQ5CkSNciUZDf1v0ly234jX3Ts6ckAy/XK5B3F340Ou8UuEFNbVap2fkRC1hOXe7RnEmFwW1PxmqmA==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/mdx-loader": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "chalk": "^4.1.0",
+        "feed": "^4.2.2",
+        "fs-extra": "^9.1.0",
+        "globby": "^11.0.2",
+        "joi": "^17.4.0",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "reading-time": "^1.3.0",
+        "remark-admonitions": "^1.2.1",
+        "webpack": "^4.44.1"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "@docusaurus/plugin-content-docs": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-EpMt0z/Z7SsOuQFIZlo31XsndxJ0blp7n0bVNcIlcFiNHYoBVVPbYb4VKP2W+1Sfw5K1XouUxoXRM30FyDrjhw==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/mdx-loader": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "chalk": "^4.1.0",
+        "execa": "^5.0.0",
+        "fs-extra": "^9.1.0",
+        "globby": "^11.0.2",
+        "import-fresh": "^3.2.2",
+        "joi": "^17.4.0",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "remark-admonitions": "^1.2.1",
+        "shelljs": "^0.8.4",
+        "utility-types": "^3.10.0",
+        "webpack": "^4.44.1"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "@docusaurus/plugin-content-pages": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-ETBx+3+U+1sj0C/E8C3huQj5lGcSlmj0ZHBrBb3qP3zHS8+gWHAyUiXst3bvFs5mJX7JHkxfaHZc2hLxXLpaJg==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/mdx-loader": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "globby": "^11.0.2",
+        "joi": "^17.4.0",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "minimatch": "^3.0.4",
+        "remark-admonitions": "^1.2.1",
+        "slash": "^3.0.0",
+        "webpack": "^4.44.1"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "@docusaurus/plugin-debug": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-j2xR7i0Hw8v4SBtNvf8H5zoeKFZHScLdfJ93aUHe4ERf3AfACZuG8/tjnsarrfQK59HjbwWqbRC1mUgc2nFfwA==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "react-json-view": "^1.21.1"
+      }
+    },
+    "@docusaurus/plugin-google-analytics": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-A73FA1hRHxbCZ7WVUthrEty5jRAdWlWAg9pijwSFFg5YG2kb0thNqGqMU/P5dqcV/ytE4907WvXMpKYmLtFVOg==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72"
+      }
+    },
+    "@docusaurus/plugin-google-gtag": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-161+C6XZAziT/MRF9HZFCzg0ybzzkW/NHIuIKPmiQjeBB+DXYopvEmldKcPlZbs8YCSD9nMxkTx39pr1AWjffw==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72"
+      }
+    },
+    "@docusaurus/plugin-sitemap": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-ZaMeJFDdey+PDMxg7qI2u9Wm7ylZb30FBR14wPSH5da+yMnNtl8wAlWEW8RkEgKYo04mE7DMvdEZ1YdsPF7cQg==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "fs-extra": "^9.1.0",
+        "joi": "^17.4.0",
+        "sitemap": "^6.3.6"
+      }
+    },
+    "@docusaurus/preset-classic": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-Z5XKcgyrZWyUvqQZ7cAJ+E3rHkXZPRo8/23vOV5f/5sM7HeW871e+FU37RXIEFu8E8fhpCgQQ6FPEVMyiVS7Uw==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-blog": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-docs": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-pages": "2.0.0-alpha.72",
+        "@docusaurus/plugin-debug": "2.0.0-alpha.72",
+        "@docusaurus/plugin-google-analytics": "2.0.0-alpha.72",
+        "@docusaurus/plugin-google-gtag": "2.0.0-alpha.72",
+        "@docusaurus/plugin-sitemap": "2.0.0-alpha.72",
+        "@docusaurus/theme-classic": "2.0.0-alpha.72",
+        "@docusaurus/theme-search-algolia": "2.0.0-alpha.72"
+      }
+    },
+    "@docusaurus/react-loadable": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz",
+      "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==",
+      "requires": {
+        "prop-types": "^15.6.2"
+      }
+    },
+    "@docusaurus/theme-classic": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-X5kDmMG6xCw+PpkOysnulcq9OuSsljR7Z/JiAkOeAFfd6LNeMk983q+Eu72xWxpmhmBBBkE56rhdxuBXKQJCsw==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-blog": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-docs": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-pages": "2.0.0-alpha.72",
+        "@docusaurus/theme-common": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "@docusaurus/utils-validation": "2.0.0-alpha.72",
+        "@mdx-js/mdx": "^1.6.21",
+        "@mdx-js/react": "^1.6.21",
+        "@types/react-toggle": "^4.0.2",
+        "chalk": "^4.1.0",
+        "clsx": "^1.1.1",
+        "copy-text-to-clipboard": "^3.0.0",
+        "fs-extra": "^9.1.0",
+        "globby": "^11.0.2",
+        "infima": "0.2.0-alpha.21",
+        "joi": "^17.4.0",
+        "lodash": "^4.17.20",
+        "parse-numeric-range": "^1.2.0",
+        "postcss": "^7.0.2",
+        "prism-react-renderer": "^1.1.1",
+        "prismjs": "^1.23.0",
+        "prop-types": "^15.7.2",
+        "react-router-dom": "^5.2.0",
+        "react-toggle": "^4.1.2",
+        "rtlcss": "^2.6.2"
+      }
+    },
+    "@docusaurus/theme-common": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-4NI3VCIBVJvOUk1YhBs2V4QwH1CR65sQQt2MFhHbeAmkKh1V0dYDFF8bVxrTSl7NhTICVk2Azn+tItRNkAXbdg==",
+      "requires": {
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-blog": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-docs": "2.0.0-alpha.72",
+        "@docusaurus/plugin-content-pages": "2.0.0-alpha.72",
+        "@docusaurus/types": "2.0.0-alpha.72"
+      }
+    },
+    "@docusaurus/theme-search-algolia": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-K+7WvYx0vkclaCN6nvcX4rFD/M+0b0YpjAbg+aFLzeAo77vIJESgByOc6RuK3XNALX4H2U8k7j0+wWIPsJtM1Q==",
+      "requires": {
+        "@docsearch/react": "^3.0.0-alpha.33",
+        "@docusaurus/core": "2.0.0-alpha.72",
+        "@docusaurus/theme-common": "2.0.0-alpha.72",
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "algoliasearch": "^4.8.4",
+        "algoliasearch-helper": "^3.3.4",
+        "clsx": "^1.1.1",
+        "eta": "^1.12.1",
+        "joi": "^17.4.0",
+        "lodash": "^4.17.20"
+      }
+    },
+    "@docusaurus/types": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-/AfFD2Kdfm2rvG5j1v0w0L5gVuTPIE2vGOgLZh6EGzJT/Xx6CDdso9aAbhHiGfQkQS3bu1BPpLWqKlX9Ovi/aw==",
+      "requires": {
+        "@types/webpack": "^4.41.0",
+        "commander": "^5.1.0",
+        "joi": "^17.4.0",
+        "querystring": "0.2.0",
+        "webpack-merge": "^4.2.2"
+      },
+      "dependencies": {
+        "commander": {
+          "version": "5.1.0",
+          "resolved": "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz",
+          "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
+        }
+      }
+    },
+    "@docusaurus/utils": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-seWNBdX9LI1jREiogh0azXZaf2HStzb3MECsjAVrtEikQFbfG7K7S27C9WXDlUeQw6LVL/q0JEjHFOJD+cTSLA==",
+      "requires": {
+        "@docusaurus/types": "2.0.0-alpha.72",
+        "@types/github-slugger": "^1.3.0",
+        "chalk": "^4.1.0",
+        "escape-string-regexp": "^4.0.0",
+        "fs-extra": "^9.1.0",
+        "gray-matter": "^4.0.2",
+        "lodash": "^4.17.20",
+        "resolve-pathname": "^3.0.0"
+      },
+      "dependencies": {
+        "escape-string-regexp": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+          "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+        }
+      }
+    },
+    "@docusaurus/utils-validation": {
+      "version": "2.0.0-alpha.72",
+      "resolved": "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.72.tgz",
+      "integrity": "sha512-qhpyCVCCCTy0ui62GxXz6vLazcRCGal/jBGcgnxSgQ4AyXrU2NpPQH2hunOLknL6D3BivTb+w+IAFHE9JAMX0Q==",
+      "requires": {
+        "@docusaurus/utils": "2.0.0-alpha.72",
+        "chalk": "^4.1.0",
+        "joi": "^17.4.0"
+      }
+    },
+    "@endiliey/static-site-generator-webpack-plugin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz",
+      "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==",
+      "requires": {
+        "bluebird": "^3.7.1",
+        "cheerio": "^0.22.0",
+        "eval": "^0.1.4",
+        "url": "^0.11.0",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "cheerio": {
+          "version": "0.22.0",
+          "resolved": "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz",
+          "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=",
+          "requires": {
+            "css-select": "~1.2.0",
+            "dom-serializer": "~0.1.0",
+            "entities": "~1.1.1",
+            "htmlparser2": "^3.9.1",
+            "lodash.assignin": "^4.0.9",
+            "lodash.bind": "^4.1.4",
+            "lodash.defaults": "^4.0.1",
+            "lodash.filter": "^4.4.0",
+            "lodash.flatten": "^4.2.0",
+            "lodash.foreach": "^4.3.0",
+            "lodash.map": "^4.4.0",
+            "lodash.merge": "^4.4.0",
+            "lodash.pick": "^4.2.1",
+            "lodash.reduce": "^4.4.0",
+            "lodash.reject": "^4.4.0",
+            "lodash.some": "^4.4.0"
+          }
+        },
+        "css-select": {
+          "version": "1.2.0",
+          "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz",
+          "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+          "requires": {
+            "boolbase": "~1.0.0",
+            "css-what": "2.1",
+            "domutils": "1.5.1",
+            "nth-check": "~1.0.1"
+          }
+        },
+        "css-what": {
+          "version": "2.1.3",
+          "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz",
+          "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg=="
+        },
+        "dom-serializer": {
+          "version": "0.1.1",
+          "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz",
+          "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+          "requires": {
+            "domelementtype": "^1.3.0",
+            "entities": "^1.1.1"
+          }
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+        },
+        "domutils": {
+          "version": "1.5.1",
+          "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz",
+          "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          },
+          "dependencies": {
+            "dom-serializer": {
+              "version": "0.2.2",
+              "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+              "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+              "requires": {
+                "domelementtype": "^2.0.1",
+                "entities": "^2.0.0"
+              },
+              "dependencies": {
+                "domelementtype": {
+                  "version": "2.1.0",
+                  "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz",
+                  "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w=="
+                }
+              }
+            },
+            "entities": {
+              "version": "2.2.0",
+              "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz",
+              "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+            }
+          }
+        }
+      }
+    },
+    "@hapi/hoek": {
+      "version": "9.1.1",
+      "resolved": "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.1.1.tgz",
+      "integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw=="
+    },
+    "@hapi/topo": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/@hapi/topo/-/topo-5.0.0.tgz",
+      "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
+      "requires": {
+        "@hapi/hoek": "^9.0.0"
+      }
+    },
+    "@mdx-js/mdx": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/@mdx-js/mdx/-/mdx-1.6.22.tgz",
+      "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==",
+      "requires": {
+        "@babel/core": "7.12.9",
+        "@babel/plugin-syntax-jsx": "7.12.1",
+        "@babel/plugin-syntax-object-rest-spread": "7.8.3",
+        "@mdx-js/util": "1.6.22",
+        "babel-plugin-apply-mdx-type-prop": "1.6.22",
+        "babel-plugin-extract-import-names": "1.6.22",
+        "camelcase-css": "2.0.1",
+        "detab": "2.0.4",
+        "hast-util-raw": "6.0.1",
+        "lodash.uniq": "4.5.0",
+        "mdast-util-to-hast": "10.0.1",
+        "remark-footnotes": "2.0.0",
+        "remark-mdx": "1.6.22",
+        "remark-parse": "8.0.3",
+        "remark-squeeze-paragraphs": "4.0.0",
+        "style-to-object": "0.3.0",
+        "unified": "9.2.0",
+        "unist-builder": "2.0.3",
+        "unist-util-visit": "2.0.3"
+      },
+      "dependencies": {
+        "@babel/core": {
+          "version": "7.12.9",
+          "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz",
+          "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.12.5",
+            "@babel/helper-module-transforms": "^7.12.1",
+            "@babel/helpers": "^7.12.5",
+            "@babel/parser": "^7.12.7",
+            "@babel/template": "^7.12.7",
+            "@babel/traverse": "^7.12.9",
+            "@babel/types": "^7.12.7",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.2",
+            "lodash": "^4.17.19",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+        },
+        "babel-plugin-apply-mdx-type-prop": {
+          "version": "1.6.22",
+          "resolved": "https://registry.yarnpkg.com/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz",
+          "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==",
+          "requires": {
+            "@babel/helper-plugin-utils": "7.10.4",
+            "@mdx-js/util": "1.6.22"
+          }
+        },
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "@mdx-js/react": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/@mdx-js/react/-/react-1.6.22.tgz",
+      "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==",
+      "requires": {}
+    },
+    "@mdx-js/util": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.22.tgz",
+      "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA=="
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.4",
+      "resolved": "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
+      "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==",
+      "requires": {
+        "@nodelib/fs.stat": "2.0.4",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz",
+      "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q=="
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.6",
+      "resolved": "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz",
+      "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==",
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.4",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@npmcli/move-file": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz",
+      "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
+      "requires": {
+        "mkdirp": "^1.0.4",
+        "rimraf": "^3.0.2"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "@polka/url": {
+      "version": "1.0.0-next.11",
+      "resolved": "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz",
+      "integrity": "sha512-3NsZsJIA/22P3QUyrEDNA2D133H4j224twJrdipXN38dpnIOzAbUDtOwkcJ5pXmn75w7LSQDjA4tO9dm1XlqlA=="
+    },
+    "@sideway/address": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.1.tgz",
+      "integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==",
+      "requires": {
+        "@hapi/hoek": "^9.0.0"
+      }
+    },
+    "@sideway/formula": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.0.tgz",
+      "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg=="
+    },
+    "@sideway/pinpoint": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+      "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ=="
+    },
+    "@sindresorhus/is": {
+      "version": "0.14.0",
+      "resolved": "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz",
+      "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ=="
+    },
+    "@svgr/babel-plugin-add-jsx-attribute": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz",
+      "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg=="
+    },
+    "@svgr/babel-plugin-remove-jsx-attribute": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz",
+      "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg=="
+    },
+    "@svgr/babel-plugin-remove-jsx-empty-expression": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz",
+      "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA=="
+    },
+    "@svgr/babel-plugin-replace-jsx-attribute-value": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz",
+      "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ=="
+    },
+    "@svgr/babel-plugin-svg-dynamic-title": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz",
+      "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg=="
+    },
+    "@svgr/babel-plugin-svg-em-dimensions": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz",
+      "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw=="
+    },
+    "@svgr/babel-plugin-transform-react-native-svg": {
+      "version": "5.4.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz",
+      "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q=="
+    },
+    "@svgr/babel-plugin-transform-svg-component": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz",
+      "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ=="
+    },
+    "@svgr/babel-preset": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/babel-preset/-/babel-preset-5.5.0.tgz",
+      "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==",
+      "requires": {
+        "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0",
+        "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0",
+        "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1",
+        "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1",
+        "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0",
+        "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0",
+        "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0",
+        "@svgr/babel-plugin-transform-svg-component": "^5.5.0"
+      }
+    },
+    "@svgr/core": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/core/-/core-5.5.0.tgz",
+      "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==",
+      "requires": {
+        "@svgr/plugin-jsx": "^5.5.0",
+        "camelcase": "^6.2.0",
+        "cosmiconfig": "^7.0.0"
+      }
+    },
+    "@svgr/hast-util-to-babel-ast": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
+      "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==",
+      "requires": {
+        "@babel/types": "^7.12.6"
+      }
+    },
+    "@svgr/plugin-jsx": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz",
+      "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==",
+      "requires": {
+        "@babel/core": "^7.12.3",
+        "@svgr/babel-preset": "^5.5.0",
+        "@svgr/hast-util-to-babel-ast": "^5.5.0",
+        "svg-parser": "^2.0.2"
+      }
+    },
+    "@svgr/plugin-svgo": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz",
+      "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==",
+      "requires": {
+        "cosmiconfig": "^7.0.0",
+        "deepmerge": "^4.2.2",
+        "svgo": "^1.2.2"
+      }
+    },
+    "@svgr/webpack": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/@svgr/webpack/-/webpack-5.5.0.tgz",
+      "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==",
+      "requires": {
+        "@babel/core": "^7.12.3",
+        "@babel/plugin-transform-react-constant-elements": "^7.12.1",
+        "@babel/preset-env": "^7.12.1",
+        "@babel/preset-react": "^7.12.5",
+        "@svgr/core": "^5.5.0",
+        "@svgr/plugin-jsx": "^5.5.0",
+        "@svgr/plugin-svgo": "^5.5.0",
+        "loader-utils": "^2.0.0"
+      }
+    },
+    "@szmarczak/http-timer": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+      "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+      "requires": {
+        "defer-to-connect": "^1.0.1"
+      }
+    },
+    "@types/anymatch": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz",
+      "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA=="
+    },
+    "@types/github-slugger": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/@types/github-slugger/-/github-slugger-1.3.0.tgz",
+      "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g=="
+    },
+    "@types/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/hast": {
+      "version": "2.3.1",
+      "resolved": "https://registry.yarnpkg.com/@types/hast/-/hast-2.3.1.tgz",
+      "integrity": "sha512-viwwrB+6xGzw+G1eWpF9geV3fnsDgXqHG+cqgiHrvQfDUW5hzhCyV7Sy3UJxhfRFBsgky2SSW33qi/YrIkjX5Q==",
+      "requires": {
+        "@types/unist": "*"
+      }
+    },
+    "@types/html-minifier-terser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA=="
+    },
+    "@types/json-schema": {
+      "version": "7.0.7",
+      "resolved": "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz",
+      "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA=="
+    },
+    "@types/mdast": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz",
+      "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+      "requires": {
+        "@types/unist": "*"
+      }
+    },
+    "@types/minimatch": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz",
+      "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA=="
+    },
+    "@types/node": {
+      "version": "14.14.35",
+      "resolved": "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz",
+      "integrity": "sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag=="
+    },
+    "@types/parse-json": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz",
+      "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
+    },
+    "@types/parse5": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/parse5/-/parse5-5.0.3.tgz",
+      "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw=="
+    },
+    "@types/prop-types": {
+      "version": "15.7.3",
+      "resolved": "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz",
+      "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw=="
+    },
+    "@types/q": {
+      "version": "1.5.4",
+      "resolved": "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz",
+      "integrity": "sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug=="
+    },
+    "@types/react": {
+      "version": "17.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/react/-/react-17.0.3.tgz",
+      "integrity": "sha512-wYOUxIgs2HZZ0ACNiIayItyluADNbONl7kt8lkLjVK8IitMH5QMyAh75Fwhmo37r1m7L2JaFj03sIfxBVDvRAg==",
+      "requires": {
+        "@types/prop-types": "*",
+        "@types/scheduler": "*",
+        "csstype": "^3.0.2"
+      }
+    },
+    "@types/react-toggle": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/@types/react-toggle/-/react-toggle-4.0.2.tgz",
+      "integrity": "sha512-sHqfoKFnL0YU2+OC4meNEC8Ptx9FE8/+nFeFvNcdBa6ANA8KpAzj3R9JN8GtrvlLgjKDoYgI7iILgXYcTPo2IA==",
+      "requires": {
+        "@types/react": "*"
+      }
+    },
+    "@types/sax": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.1.tgz",
+      "integrity": "sha512-dqYdvN7Sbw8QT/0Ci5rhjE4/iCMJEM0Y9rHpCu+gGXD9Lwbz28t6HI2yegsB6BoV1sShRMU6lAmAcgRjmFy7LA==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
+    "@types/scheduler": {
+      "version": "0.16.1",
+      "resolved": "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.1.tgz",
+      "integrity": "sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA=="
+    },
+    "@types/source-list-map": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz",
+      "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA=="
+    },
+    "@types/tapable": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz",
+      "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA=="
+    },
+    "@types/uglify-js": {
+      "version": "3.13.0",
+      "resolved": "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.13.0.tgz",
+      "integrity": "sha512-EGkrJD5Uy+Pg0NUR8uA4bJ5WMfljyad0G+784vLCNUkD+QwOJXUbBYExXfVGf7YtyzdQp3L/XMYcliB987kL5Q==",
+      "requires": {
+        "source-map": "^0.6.1"
+      }
+    },
+    "@types/unist": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz",
+      "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ=="
+    },
+    "@types/webpack": {
+      "version": "4.41.26",
+      "resolved": "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.26.tgz",
+      "integrity": "sha512-7ZyTfxjCRwexh+EJFwRUM+CDB2XvgHl4vfuqf1ZKrgGvcS5BrNvPQqJh3tsZ0P6h6Aa1qClVHaJZszLPzpqHeA==",
+      "requires": {
+        "@types/anymatch": "*",
+        "@types/node": "*",
+        "@types/tapable": "*",
+        "@types/uglify-js": "*",
+        "@types/webpack-sources": "*",
+        "source-map": "^0.6.0"
+      }
+    },
+    "@types/webpack-sources": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-2.1.0.tgz",
+      "integrity": "sha512-LXn/oYIpBeucgP1EIJbKQ2/4ZmpvRl+dlrFdX7+94SKRUV3Evy3FsfMZY318vGhkWUS5MPhtOM3w1/hCOAOXcg==",
+      "requires": {
+        "@types/node": "*",
+        "@types/source-list-map": "*",
+        "source-map": "^0.7.3"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.7.3",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+        }
+      }
+    },
+    "@webassemblyjs/ast": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz",
+      "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
+      "requires": {
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
+      "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA=="
+    },
+    "@webassemblyjs/helper-api-error": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
+      "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw=="
+    },
+    "@webassemblyjs/helper-buffer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
+      "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA=="
+    },
+    "@webassemblyjs/helper-code-frame": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
+      "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
+      "requires": {
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-fsm": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
+      "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw=="
+    },
+    "@webassemblyjs/helper-module-context": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
+      "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0"
+      }
+    },
+    "@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
+      "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="
+    },
+    "@webassemblyjs/helper-wasm-section": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
+      "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0"
+      }
+    },
+    "@webassemblyjs/ieee754": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
+      "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
+      "requires": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "@webassemblyjs/leb128": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
+      "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
+      "requires": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/utf8": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
+      "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w=="
+    },
+    "@webassemblyjs/wasm-edit": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
+      "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/helper-wasm-section": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-opt": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "@webassemblyjs/wast-printer": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-gen": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
+      "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-opt": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
+      "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-buffer": "1.9.0",
+        "@webassemblyjs/wasm-gen": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wasm-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
+      "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
+        "@webassemblyjs/ieee754": "1.9.0",
+        "@webassemblyjs/leb128": "1.9.0",
+        "@webassemblyjs/utf8": "1.9.0"
+      }
+    },
+    "@webassemblyjs/wast-parser": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
+      "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/floating-point-hex-parser": "1.9.0",
+        "@webassemblyjs/helper-api-error": "1.9.0",
+        "@webassemblyjs/helper-code-frame": "1.9.0",
+        "@webassemblyjs/helper-fsm": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@webassemblyjs/wast-printer": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
+      "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/wast-parser": "1.9.0",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+    },
+    "@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+    },
+    "abbrev": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+      "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
+    },
+    "accepts": {
+      "version": "1.3.7",
+      "resolved": "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz",
+      "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+      "requires": {
+        "mime-types": "~2.1.24",
+        "negotiator": "0.6.2"
+      }
+    },
+    "acorn": {
+      "version": "6.4.2",
+      "resolved": "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz",
+      "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="
+    },
+    "acorn-walk": {
+      "version": "8.0.2",
+      "resolved": "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.0.2.tgz",
+      "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A=="
+    },
+    "address": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz",
+      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA=="
+    },
+    "aggregate-error": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz",
+      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
+      "requires": {
+        "clean-stack": "^2.0.0",
+        "indent-string": "^4.0.0"
+      }
+    },
+    "ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "requires": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      }
+    },
+    "ajv-errors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz",
+      "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+      "requires": {}
+    },
+    "ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "requires": {}
+    },
+    "algoliasearch": {
+      "version": "4.8.6",
+      "resolved": "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.8.6.tgz",
+      "integrity": "sha512-G8IA3lcgaQB4r9HuQ4G+uSFjjz0Wv2OgEPiQ8emA+G2UUlroOfMl064j1bq/G+QTW0LmTQp9JwrFDRWxFM9J7w==",
+      "requires": {
+        "@algolia/cache-browser-local-storage": "4.8.6",
+        "@algolia/cache-common": "4.8.6",
+        "@algolia/cache-in-memory": "4.8.6",
+        "@algolia/client-account": "4.8.6",
+        "@algolia/client-analytics": "4.8.6",
+        "@algolia/client-common": "4.8.6",
+        "@algolia/client-recommendation": "4.8.6",
+        "@algolia/client-search": "4.8.6",
+        "@algolia/logger-common": "4.8.6",
+        "@algolia/logger-console": "4.8.6",
+        "@algolia/requester-browser-xhr": "4.8.6",
+        "@algolia/requester-common": "4.8.6",
+        "@algolia/requester-node-http": "4.8.6",
+        "@algolia/transporter": "4.8.6"
+      }
+    },
+    "algoliasearch-helper": {
+      "version": "3.4.4",
+      "resolved": "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.4.4.tgz",
+      "integrity": "sha512-OjyVLjykaYKCMxxRMZNiwLp8CS310E0qAeIY2NaublcmLAh8/SL19+zYHp7XCLtMem2ZXwl3ywMiA32O9jszuw==",
+      "requires": {
+        "events": "^1.1.1"
+      }
+    },
+    "alphanum-sort": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
+      "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM="
+    },
+    "ansi-align": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz",
+      "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+      "requires": {
+        "string-width": "^3.0.0"
+      }
+    },
+    "ansi-colors": {
+      "version": "3.2.4",
+      "resolved": "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz",
+      "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA=="
+    },
+    "ansi-escapes": {
+      "version": "4.3.1",
+      "resolved": "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
+      "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+      "requires": {
+        "type-fest": "^0.11.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.11.0",
+          "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz",
+          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ=="
+        }
+      }
+    },
+    "ansi-html": {
+      "version": "0.0.7",
+      "resolved": "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz",
+      "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4="
+    },
+    "ansi-regex": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz",
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg=="
+    },
+    "ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "requires": {
+        "color-convert": "^1.9.0"
+      }
+    },
+    "anymatch": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz",
+      "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+      "requires": {
+        "micromatch": "^3.1.4",
+        "normalize-path": "^2.1.1"
+      },
+      "dependencies": {
+        "normalize-path": {
+          "version": "2.1.1",
+          "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz",
+          "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
+          "requires": {
+            "remove-trailing-separator": "^1.0.1"
+          }
+        }
+      }
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+    },
+    "arg": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/arg/-/arg-5.0.0.tgz",
+      "integrity": "sha512-4P8Zm2H+BRS+c/xX1LrHw0qKpEhdlZjLCgWy+d78T9vqa2Z2SiD2wMrYuWIAFy5IZUD7nnNXroRttz+0RzlrzQ=="
+    },
+    "argparse": {
+      "version": "1.0.10",
+      "resolved": "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz",
+      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+      "requires": {
+        "sprintf-js": "~1.0.2"
+      }
+    },
+    "arr-diff": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz",
+      "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+    },
+    "arr-flatten": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz",
+      "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+    },
+    "arr-union": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz",
+      "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+    },
+    "array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+    },
+    "array-union": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz",
+      "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+    },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+    },
+    "array-unique": {
+      "version": "0.3.2",
+      "resolved": "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz",
+      "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+    },
+    "asap": {
+      "version": "2.0.6",
+      "resolved": "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz",
+      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+    },
+    "asn1.js": {
+      "version": "5.4.1",
+      "resolved": "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz",
+      "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
+      "requires": {
+        "bn.js": "^4.0.0",
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0",
+        "safer-buffer": "^2.1.0"
+      }
+    },
+    "assert": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz",
+      "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "util": "0.10.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+        },
+        "util": {
+          "version": "0.10.3",
+          "resolved": "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz",
+          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+          "requires": {
+            "inherits": "2.0.1"
+          }
+        }
+      }
+    },
+    "assign-symbols": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz",
+      "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+    },
+    "async": {
+      "version": "2.6.3",
+      "resolved": "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz",
+      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
+      "requires": {
+        "lodash": "^4.17.14"
+      }
+    },
+    "async-each": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz",
+      "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ=="
+    },
+    "async-limiter": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz",
+      "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ=="
+    },
+    "at-least-node": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz",
+      "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg=="
+    },
+    "atob": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz",
+      "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+    },
+    "autocomplete.js": {
+      "version": "0.37.1",
+      "resolved": "https://registry.npmjs.org/autocomplete.js/-/autocomplete.js-0.37.1.tgz",
+      "integrity": "sha512-PgSe9fHYhZEsm/9jggbjtVsGXJkPLvd+9mC7gZJ662vVL5CRWEtm/mIrrzCx0MrNxHVwxD5d00UOn6NsmL2LUQ==",
+      "requires": {
+        "immediate": "^3.2.3"
+      }
+    },
+    "autoprefixer": {
+      "version": "9.8.6",
+      "resolved": "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.6.tgz",
+      "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+      "requires": {
+        "browserslist": "^4.12.0",
+        "caniuse-lite": "^1.0.30001109",
+        "colorette": "^1.2.1",
+        "normalize-range": "^0.1.2",
+        "num2fraction": "^1.2.2",
+        "postcss": "^7.0.32",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+        }
+      }
+    },
+    "axios": {
+      "version": "0.21.1",
+      "resolved": "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz",
+      "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+      "requires": {
+        "follow-redirects": "^1.10.0"
+      }
+    },
+    "babel-loader": {
+      "version": "8.2.2",
+      "resolved": "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz",
+      "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
+      "requires": {
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^1.4.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz",
+          "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
+    "babel-plugin-dynamic-import-node": {
+      "version": "2.3.3",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
+      "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
+      "requires": {
+        "object.assign": "^4.1.0"
+      }
+    },
+    "babel-plugin-extract-import-names": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz",
+      "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==",
+      "requires": {
+        "@babel/helper-plugin-utils": "7.10.4"
+      },
+      "dependencies": {
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+        }
+      }
+    },
+    "babel-plugin-polyfill-corejs2": {
+      "version": "0.1.10",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz",
+      "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==",
+      "requires": {
+        "@babel/compat-data": "^7.13.0",
+        "@babel/helper-define-polyfill-provider": "^0.1.5",
+        "semver": "^6.1.1"
+      }
+    },
+    "babel-plugin-polyfill-corejs3": {
+      "version": "0.1.7",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz",
+      "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==",
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.1.5",
+        "core-js-compat": "^3.8.1"
+      }
+    },
+    "babel-plugin-polyfill-regenerator": {
+      "version": "0.1.6",
+      "resolved": "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz",
+      "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==",
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.1.5"
+      }
+    },
+    "bail": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz",
+      "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ=="
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "base": {
+      "version": "0.11.2",
+      "resolved": "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz",
+      "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+      "requires": {
+        "cache-base": "^1.0.1",
+        "class-utils": "^0.3.5",
+        "component-emitter": "^1.2.1",
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.1",
+        "mixin-deep": "^1.2.0",
+        "pascalcase": "^0.1.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        }
+      }
+    },
+    "base16": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/base16/-/base16-1.0.0.tgz",
+      "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA="
+    },
+    "base64-js": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz",
+      "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+    },
+    "batch": {
+      "version": "0.6.1",
+      "resolved": "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz",
+      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY="
+    },
+    "bcp-47-match": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/bcp-47-match/-/bcp-47-match-1.0.3.tgz",
+      "integrity": "sha512-LggQ4YTdjWQSKELZF5JwchnBa1u0pIQSZf5lSdOHEdbVP55h0qICA/FUp3+W99q0xqxYa1ZQizTUH87gecII5w=="
+    },
+    "big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="
+    },
+    "binary-extensions": {
+      "version": "1.13.1",
+      "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz",
+      "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "optional": true,
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "bluebird": {
+      "version": "3.7.2",
+      "resolved": "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz",
+      "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
+    },
+    "bn.js": {
+      "version": "4.12.0",
+      "resolved": "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz",
+      "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA=="
+    },
+    "body-parser": {
+      "version": "1.19.0",
+      "resolved": "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz",
+      "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+      "requires": {
+        "bytes": "3.1.0",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "on-finished": "~2.3.0",
+        "qs": "6.7.0",
+        "raw-body": "2.4.0",
+        "type-is": "~1.6.17"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.1.0",
+          "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz",
+          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+        }
+      }
+    },
+    "bonjour": {
+      "version": "3.5.0",
+      "resolved": "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz",
+      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
+      "requires": {
+        "array-flatten": "^2.1.0",
+        "deep-equal": "^1.0.1",
+        "dns-equal": "^1.0.0",
+        "dns-txt": "^2.0.2",
+        "multicast-dns": "^6.0.1",
+        "multicast-dns-service-types": "^1.1.0"
+      },
+      "dependencies": {
+        "array-flatten": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz",
+          "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ=="
+        }
+      }
+    },
+    "boolbase": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz",
+      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24="
+    },
+    "boxen": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/boxen/-/boxen-5.0.0.tgz",
+      "integrity": "sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA==",
+      "requires": {
+        "ansi-align": "^3.0.0",
+        "camelcase": "^6.2.0",
+        "chalk": "^4.1.0",
+        "cli-boxes": "^2.2.1",
+        "string-width": "^4.2.0",
+        "type-fest": "^0.20.2",
+        "widest-line": "^3.1.0",
+        "wrap-ansi": "^7.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "braces": {
+      "version": "2.3.2",
+      "resolved": "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz",
+      "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+      "requires": {
+        "arr-flatten": "^1.1.0",
+        "array-unique": "^0.3.2",
+        "extend-shallow": "^2.0.1",
+        "fill-range": "^4.0.0",
+        "isobject": "^3.0.1",
+        "repeat-element": "^1.1.2",
+        "snapdragon": "^0.8.1",
+        "snapdragon-node": "^2.0.1",
+        "split-string": "^3.0.2",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+    },
+    "browserify-aes": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz",
+      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
+      "requires": {
+        "buffer-xor": "^1.0.3",
+        "cipher-base": "^1.0.0",
+        "create-hash": "^1.1.0",
+        "evp_bytestokey": "^1.0.3",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
+      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
+      "requires": {
+        "browserify-aes": "^1.0.4",
+        "browserify-des": "^1.0.0",
+        "evp_bytestokey": "^1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz",
+      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "des.js": "^1.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
+      "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
+      "requires": {
+        "bn.js": "^5.0.0",
+        "randombytes": "^2.0.1"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "5.2.0",
+          "resolved": "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz",
+          "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+        }
+      }
+    },
+    "browserify-sign": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz",
+      "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==",
+      "requires": {
+        "bn.js": "^5.1.1",
+        "browserify-rsa": "^4.0.1",
+        "create-hash": "^1.2.0",
+        "create-hmac": "^1.1.7",
+        "elliptic": "^6.5.3",
+        "inherits": "^2.0.4",
+        "parse-asn1": "^5.1.5",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "bn.js": {
+          "version": "5.2.0",
+          "resolved": "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz",
+          "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw=="
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
+      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
+      "requires": {
+        "pako": "~1.0.5"
+      }
+    },
+    "browserslist": {
+      "version": "4.16.3",
+      "resolved": "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz",
+      "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+      "requires": {
+        "caniuse-lite": "^1.0.30001181",
+        "colorette": "^1.2.1",
+        "electron-to-chromium": "^1.3.649",
+        "escalade": "^3.1.1",
+        "node-releases": "^1.1.70"
+      }
+    },
+    "buffer": {
+      "version": "4.9.2",
+      "resolved": "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz",
+      "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+      "requires": {
+        "base64-js": "^1.0.2",
+        "ieee754": "^1.1.4",
+        "isarray": "^1.0.0"
+      }
+    },
+    "buffer-from": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz",
+      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
+    },
+    "buffer-indexof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
+      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g=="
+    },
+    "buffer-json": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz",
+      "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw=="
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+    },
+    "bytes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz",
+      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
+    },
+    "cacache": {
+      "version": "15.0.5",
+      "resolved": "https://registry.yarnpkg.com/cacache/-/cacache-15.0.5.tgz",
+      "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==",
+      "requires": {
+        "@npmcli/move-file": "^1.0.1",
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "glob": "^7.1.4",
+        "infer-owner": "^1.0.4",
+        "lru-cache": "^6.0.0",
+        "minipass": "^3.1.1",
+        "minipass-collect": "^1.0.2",
+        "minipass-flush": "^1.0.5",
+        "minipass-pipeline": "^1.2.2",
+        "mkdirp": "^1.0.3",
+        "p-map": "^4.0.0",
+        "promise-inflight": "^1.0.1",
+        "rimraf": "^3.0.2",
+        "ssri": "^8.0.0",
+        "tar": "^6.0.2",
+        "unique-filename": "^1.1.1"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+        },
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "cache-base": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz",
+      "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+      "requires": {
+        "collection-visit": "^1.0.0",
+        "component-emitter": "^1.2.1",
+        "get-value": "^2.0.6",
+        "has-value": "^1.0.0",
+        "isobject": "^3.0.1",
+        "set-value": "^2.0.0",
+        "to-object-path": "^0.3.0",
+        "union-value": "^1.0.0",
+        "unset-value": "^1.0.0"
+      }
+    },
+    "cache-loader": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz",
+      "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==",
+      "requires": {
+        "buffer-json": "^2.0.0",
+        "find-cache-dir": "^3.0.0",
+        "loader-utils": "^1.2.3",
+        "mkdirp": "^0.5.1",
+        "neo-async": "^2.6.1",
+        "schema-utils": "^2.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "schema-utils": {
+          "version": "2.7.1",
+          "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz",
+          "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+          "requires": {
+            "@types/json-schema": "^7.0.5",
+            "ajv": "^6.12.4",
+            "ajv-keywords": "^3.5.2"
+          }
+        }
+      }
+    },
+    "cacheable-request": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz",
+      "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+      "requires": {
+        "clone-response": "^1.0.2",
+        "get-stream": "^5.1.0",
+        "http-cache-semantics": "^4.0.0",
+        "keyv": "^3.0.0",
+        "lowercase-keys": "^2.0.0",
+        "normalize-url": "^4.1.0",
+        "responselike": "^1.0.2"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "5.2.0",
+          "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz",
+          "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+          "requires": {
+            "pump": "^3.0.0"
+          }
+        },
+        "lowercase-keys": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+          "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+        },
+        "normalize-url": {
+          "version": "4.5.0",
+          "resolved": "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz",
+          "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ=="
+        }
+      }
+    },
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "caller-callsite": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz",
+      "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
+      "requires": {
+        "callsites": "^2.0.0"
+      },
+      "dependencies": {
+        "callsites": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz",
+          "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA="
+        }
+      }
+    },
+    "caller-path": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz",
+      "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
+      "requires": {
+        "caller-callsite": "^2.0.0"
+      }
+    },
+    "callsites": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz",
+      "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+    },
+    "camel-case": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz",
+      "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+      "requires": {
+        "pascal-case": "^3.1.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "camelcase": {
+      "version": "6.2.0",
+      "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz",
+      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg=="
+    },
+    "camelcase-css": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz",
+      "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="
+    },
+    "caniuse-api": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz",
+      "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-lite": "^1.0.0",
+        "lodash.memoize": "^4.1.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
+    "caniuse-lite": {
+      "version": "1.0.30001202",
+      "resolved": "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz",
+      "integrity": "sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ=="
+    },
+    "ccount": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz",
+      "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg=="
+    },
+    "chalk": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz",
+      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+      "requires": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "character-entities": {
+      "version": "1.2.4",
+      "resolved": "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.4.tgz",
+      "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw=="
+    },
+    "character-entities-legacy": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+      "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA=="
+    },
+    "character-reference-invalid": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+      "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg=="
+    },
+    "chokidar": {
+      "version": "2.1.8",
+      "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz",
+      "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+      "requires": {
+        "anymatch": "^2.0.0",
+        "async-each": "^1.0.1",
+        "braces": "^2.3.2",
+        "fsevents": "^1.2.7",
+        "glob-parent": "^3.1.0",
+        "inherits": "^2.0.3",
+        "is-binary-path": "^1.0.0",
+        "is-glob": "^4.0.0",
+        "normalize-path": "^3.0.0",
+        "path-is-absolute": "^1.0.0",
+        "readdirp": "^2.2.1",
+        "upath": "^1.1.1"
+      },
+      "dependencies": {
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        }
+      }
+    },
+    "chownr": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz",
+      "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
+    },
+    "chrome-trace-event": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
+      "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
+      "requires": {
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+        }
+      }
+    },
+    "ci-info": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-3.1.1.tgz",
+      "integrity": "sha512-kdRWLBIJwdsYJWYJFtAFFYxybguqeF91qpZaggjG5Nf8QKdizFG2hjqvaTXbxFIcYbSaD74KpAXv6BSm17DHEQ=="
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "class-utils": {
+      "version": "0.3.6",
+      "resolved": "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz",
+      "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "define-property": "^0.2.5",
+        "isobject": "^3.0.0",
+        "static-extend": "^0.1.1"
+      }
+    },
+    "classnames": {
+      "version": "2.2.6",
+      "resolved": "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz",
+      "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
+    },
+    "clean-css": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/clean-css/-/clean-css-5.1.1.tgz",
+      "integrity": "sha512-GQ6HdEyJN0543mRTA/TkZ7RPoMXGWKq1shs9H86F2kLuixR0RI+xd4JfhJxWUW08FGKQXTKAKpVjKQXu5zkFNA==",
+      "requires": {
+        "source-map": "~0.6.0"
+      }
+    },
+    "clean-stack": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz",
+      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
+    },
+    "cli-boxes": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz",
+      "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw=="
+    },
+    "clipboard": {
+      "version": "2.0.8",
+      "resolved": "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.8.tgz",
+      "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==",
+      "optional": true,
+      "requires": {
+        "good-listener": "^1.2.2",
+        "select": "^1.1.2",
+        "tiny-emitter": "^2.0.0"
+      }
+    },
+    "cliui": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz",
+      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+      "requires": {
+        "string-width": "^3.1.0",
+        "strip-ansi": "^5.2.0",
+        "wrap-ansi": "^5.1.0"
+      },
+      "dependencies": {
+        "wrap-ansi": {
+          "version": "5.1.0",
+          "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+          "requires": {
+            "ansi-styles": "^3.2.0",
+            "string-width": "^3.0.0",
+            "strip-ansi": "^5.0.0"
+          }
+        }
+      }
+    },
+    "clone-response": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz",
+      "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "clsx": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz",
+      "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA=="
+    },
+    "coa": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz",
+      "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
+      "requires": {
+        "@types/q": "^1.5.1",
+        "chalk": "^2.4.1",
+        "q": "^1.1.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        }
+      }
+    },
+    "collapse-white-space": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
+      "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ=="
+    },
+    "collection-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz",
+      "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+      "requires": {
+        "map-visit": "^1.0.0",
+        "object-visit": "^1.0.0"
+      }
+    },
+    "color": {
+      "version": "3.1.3",
+      "resolved": "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz",
+      "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
+      "requires": {
+        "color-convert": "^1.9.1",
+        "color-string": "^1.5.4"
+      }
+    },
+    "color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "requires": {
+        "color-name": "1.1.3"
+      },
+      "dependencies": {
+        "color-name": {
+          "version": "1.1.3",
+          "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz",
+          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+        }
+      }
+    },
+    "color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "color-string": {
+      "version": "1.5.5",
+      "resolved": "https://registry.yarnpkg.com/color-string/-/color-string-1.5.5.tgz",
+      "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==",
+      "requires": {
+        "color-name": "^1.0.0",
+        "simple-swizzle": "^0.2.2"
+      }
+    },
+    "color-support": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+      "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
+    },
+    "colorette": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz",
+      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w=="
+    },
+    "comma-separated-tokens": {
+      "version": "1.0.8",
+      "resolved": "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+      "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw=="
+    },
+    "commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs="
+    },
+    "component-emitter": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz",
+      "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+    },
+    "compressible": {
+      "version": "2.0.18",
+      "resolved": "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz",
+      "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+      "requires": {
+        "mime-db": ">= 1.43.0 < 2"
+      }
+    },
+    "compression": {
+      "version": "1.7.4",
+      "resolved": "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz",
+      "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
+      "requires": {
+        "accepts": "~1.3.5",
+        "bytes": "3.0.0",
+        "compressible": "~2.0.16",
+        "debug": "2.6.9",
+        "on-headers": "~1.0.2",
+        "safe-buffer": "5.1.2",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "concat-stream": {
+      "version": "1.6.2",
+      "resolved": "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz",
+      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.2.2",
+        "typedarray": "^0.0.6"
+      }
+    },
+    "configstore": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz",
+      "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+      "requires": {
+        "dot-prop": "^5.2.0",
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "unique-string": "^2.0.0",
+        "write-file-atomic": "^3.0.0",
+        "xdg-basedir": "^4.0.0"
+      }
+    },
+    "connect-history-api-fallback": {
+      "version": "1.6.0",
+      "resolved": "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
+      "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg=="
+    },
+    "consola": {
+      "version": "2.15.3",
+      "resolved": "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz",
+      "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="
+    },
+    "console-browserify": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz",
+      "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+    },
+    "content-disposition": {
+      "version": "0.5.2",
+      "resolved": "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz",
+      "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
+    },
+    "content-type": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz",
+      "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+    },
+    "convert-source-map": {
+      "version": "1.7.0",
+      "resolved": "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz",
+      "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
+      "requires": {
+        "safe-buffer": "~5.1.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        }
+      }
+    },
+    "cookie": {
+      "version": "0.4.0",
+      "resolved": "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz",
+      "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+    },
+    "cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+    },
+    "copy-concurrently": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz",
+      "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==",
+      "requires": {
+        "aproba": "^1.1.1",
+        "fs-write-stream-atomic": "^1.0.8",
+        "iferr": "^0.1.5",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.0"
+      }
+    },
+    "copy-descriptor": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+      "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+    },
+    "copy-text-to-clipboard": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz",
+      "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q=="
+    },
+    "copy-webpack-plugin": {
+      "version": "6.4.1",
+      "resolved": "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz",
+      "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==",
+      "requires": {
+        "cacache": "^15.0.5",
+        "fast-glob": "^3.2.4",
+        "find-cache-dir": "^3.3.1",
+        "glob-parent": "^5.1.1",
+        "globby": "^11.0.1",
+        "loader-utils": "^2.0.0",
+        "normalize-path": "^3.0.0",
+        "p-limit": "^3.0.2",
+        "schema-utils": "^3.0.0",
+        "serialize-javascript": "^5.0.1",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        }
+      }
+    },
+    "core-js": {
+      "version": "3.9.1",
+      "resolved": "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz",
+      "integrity": "sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg=="
+    },
+    "core-js-compat": {
+      "version": "3.9.1",
+      "resolved": "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz",
+      "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==",
+      "requires": {
+        "browserslist": "^4.16.3",
+        "semver": "7.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.0.0",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz",
+          "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A=="
+        }
+      }
+    },
+    "core-js-pure": {
+      "version": "3.9.1",
+      "resolved": "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.9.1.tgz",
+      "integrity": "sha512-laz3Zx0avrw9a4QEIdmIblnVuJz8W51leY9iLThatCsFawWxC3sE4guASC78JbCin+DkwMpCdp1AVAuzL/GN7A=="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "cosmiconfig": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+      "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+      "requires": {
+        "@types/parse-json": "^4.0.0",
+        "import-fresh": "^3.2.1",
+        "parse-json": "^5.0.0",
+        "path-type": "^4.0.0",
+        "yaml": "^1.10.0"
+      }
+    },
+    "create-ecdh": {
+      "version": "4.0.4",
+      "resolved": "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz",
+      "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
+      "requires": {
+        "bn.js": "^4.1.0",
+        "elliptic": "^6.5.3"
+      }
+    },
+    "create-hash": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz",
+      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
+      "requires": {
+        "cipher-base": "^1.0.1",
+        "inherits": "^2.0.1",
+        "md5.js": "^1.3.4",
+        "ripemd160": "^2.0.1",
+        "sha.js": "^2.4.0"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.7",
+      "resolved": "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz",
+      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
+      "requires": {
+        "cipher-base": "^1.0.3",
+        "create-hash": "^1.1.0",
+        "inherits": "^2.0.1",
+        "ripemd160": "^2.0.0",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "cross-fetch": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.0.tgz",
+      "integrity": "sha512-a+yso9lSpXQI9DH+YjAu/m0dVfP8IVoZDPBLLFcvGpeq3KHNdikkekTOdkHiXEuTq4GBOeO0MfWkE40yzF1w7g==",
+      "requires": {
+        "node-fetch": "2.6.1"
+      }
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "dependencies": {
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+        },
+        "which": {
+          "version": "2.0.2",
+          "resolved": "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz",
+          "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+          "requires": {
+            "isexe": "^2.0.0"
+          }
+        }
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.12.0",
+      "resolved": "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
+      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
+      "requires": {
+        "browserify-cipher": "^1.0.0",
+        "browserify-sign": "^4.0.0",
+        "create-ecdh": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "create-hmac": "^1.1.0",
+        "diffie-hellman": "^5.0.0",
+        "inherits": "^2.0.1",
+        "pbkdf2": "^3.0.3",
+        "public-encrypt": "^4.0.0",
+        "randombytes": "^2.0.0",
+        "randomfill": "^1.0.3"
+      }
+    },
+    "crypto-random-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+      "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
+    },
+    "css-blank-pseudo": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz",
+      "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==",
+      "requires": {
+        "postcss": "^7.0.5"
+      }
+    },
+    "css-color-names": {
+      "version": "0.0.4",
+      "resolved": "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz",
+      "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA="
+    },
+    "css-declaration-sorter": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
+      "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
+      "requires": {
+        "postcss": "^7.0.1",
+        "timsort": "^0.3.0"
+      }
+    },
+    "css-has-pseudo": {
+      "version": "0.10.0",
+      "resolved": "https://registry.yarnpkg.com/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
+      "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
+      "requires": {
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^5.0.0-rc.4"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+        },
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+          "requires": {
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "css-loader": {
+      "version": "5.1.3",
+      "resolved": "https://registry.yarnpkg.com/css-loader/-/css-loader-5.1.3.tgz",
+      "integrity": "sha512-CoPZvyh8sLiGARK3gqczpfdedbM74klGWurF2CsNZ2lhNaXdLIUks+3Mfax3WBeRuHoglU+m7KG/+7gY6G4aag==",
+      "requires": {
+        "camelcase": "^6.2.0",
+        "cssesc": "^3.0.0",
+        "icss-utils": "^5.1.0",
+        "loader-utils": "^2.0.0",
+        "postcss": "^8.2.8",
+        "postcss-modules-extract-imports": "^3.0.0",
+        "postcss-modules-local-by-default": "^4.0.0",
+        "postcss-modules-scope": "^3.0.0",
+        "postcss-modules-values": "^4.0.0",
+        "postcss-value-parser": "^4.1.0",
+        "schema-utils": "^3.0.0",
+        "semver": "^7.3.4"
+      },
+      "dependencies": {
+        "icss-utils": {
+          "version": "5.1.0",
+          "resolved": "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz",
+          "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+          "requires": {}
+        },
+        "postcss": {
+          "version": "8.2.8",
+          "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-8.2.8.tgz",
+          "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
+          "requires": {
+            "colorette": "^1.2.2",
+            "nanoid": "^3.1.20",
+            "source-map": "^0.6.1"
+          }
+        },
+        "postcss-modules-extract-imports": {
+          "version": "3.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+          "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+          "requires": {}
+        },
+        "postcss-modules-local-by-default": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+          "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+          "requires": {
+            "icss-utils": "^5.0.0",
+            "postcss-selector-parser": "^6.0.2",
+            "postcss-value-parser": "^4.1.0"
+          }
+        },
+        "postcss-modules-scope": {
+          "version": "3.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+          "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+          "requires": {
+            "postcss-selector-parser": "^6.0.4"
+          }
+        },
+        "postcss-modules-values": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+          "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+          "requires": {
+            "icss-utils": "^5.0.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+          "requires": {
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+        },
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
+      }
+    },
+    "css-prefers-color-scheme": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz",
+      "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==",
+      "requires": {
+        "postcss": "^7.0.5"
+      }
+    },
+    "css-select": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz",
+      "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
+      "requires": {
+        "boolbase": "^1.0.0",
+        "css-what": "^3.2.1",
+        "domutils": "^1.7.0",
+        "nth-check": "^1.0.2"
+      },
+      "dependencies": {
+        "css-what": {
+          "version": "3.4.2",
+          "resolved": "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz",
+          "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ=="
+        },
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+        },
+        "domutils": {
+          "version": "1.7.0",
+          "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz",
+          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        }
+      }
+    },
+    "css-select-base-adapter": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
+      "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w=="
+    },
+    "css-selector-parser": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz",
+      "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g=="
+    },
+    "css-tree": {
+      "version": "1.0.0-alpha.37",
+      "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
+      "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
+      "requires": {
+        "mdn-data": "2.0.4",
+        "source-map": "^0.6.1"
+      }
+    },
+    "cssdb": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz",
+      "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ=="
+    },
+    "cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+    },
+    "cssnano": {
+      "version": "4.1.10",
+      "resolved": "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz",
+      "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
+      "requires": {
+        "cosmiconfig": "^5.0.0",
+        "cssnano-preset-default": "^4.0.7",
+        "is-resolvable": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "cosmiconfig": {
+          "version": "5.2.1",
+          "resolved": "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
+          "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
+          "requires": {
+            "import-fresh": "^2.0.0",
+            "is-directory": "^0.3.1",
+            "js-yaml": "^3.13.1",
+            "parse-json": "^4.0.0"
+          }
+        },
+        "import-fresh": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz",
+          "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+          "requires": {
+            "caller-path": "^2.0.0",
+            "resolve-from": "^3.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz",
+          "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
+          "requires": {
+            "error-ex": "^1.3.1",
+            "json-parse-better-errors": "^1.0.1"
+          }
+        }
+      }
+    },
+    "cssnano-preset-advanced": {
+      "version": "4.0.7",
+      "resolved": "https://registry.yarnpkg.com/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.7.tgz",
+      "integrity": "sha512-j1O5/DQnaAqEyFFQfC+Z/vRlLXL3LxJHN+lvsfYqr7KgPH74t69+Rsy2yXkovWNaJjZYBpdz2Fj8ab2nH7pZXw==",
+      "requires": {
+        "autoprefixer": "^9.4.7",
+        "cssnano-preset-default": "^4.0.7",
+        "postcss-discard-unused": "^4.0.1",
+        "postcss-merge-idents": "^4.0.1",
+        "postcss-reduce-idents": "^4.0.2",
+        "postcss-zindex": "^4.0.1"
+      }
+    },
+    "cssnano-preset-default": {
+      "version": "4.0.7",
+      "resolved": "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
+      "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
+      "requires": {
+        "css-declaration-sorter": "^4.0.1",
+        "cssnano-util-raw-cache": "^4.0.1",
+        "postcss": "^7.0.0",
+        "postcss-calc": "^7.0.1",
+        "postcss-colormin": "^4.0.3",
+        "postcss-convert-values": "^4.0.1",
+        "postcss-discard-comments": "^4.0.2",
+        "postcss-discard-duplicates": "^4.0.2",
+        "postcss-discard-empty": "^4.0.1",
+        "postcss-discard-overridden": "^4.0.1",
+        "postcss-merge-longhand": "^4.0.11",
+        "postcss-merge-rules": "^4.0.3",
+        "postcss-minify-font-values": "^4.0.2",
+        "postcss-minify-gradients": "^4.0.2",
+        "postcss-minify-params": "^4.0.2",
+        "postcss-minify-selectors": "^4.0.2",
+        "postcss-normalize-charset": "^4.0.1",
+        "postcss-normalize-display-values": "^4.0.2",
+        "postcss-normalize-positions": "^4.0.2",
+        "postcss-normalize-repeat-style": "^4.0.2",
+        "postcss-normalize-string": "^4.0.2",
+        "postcss-normalize-timing-functions": "^4.0.2",
+        "postcss-normalize-unicode": "^4.0.1",
+        "postcss-normalize-url": "^4.0.1",
+        "postcss-normalize-whitespace": "^4.0.2",
+        "postcss-ordered-values": "^4.1.2",
+        "postcss-reduce-initial": "^4.0.3",
+        "postcss-reduce-transforms": "^4.0.2",
+        "postcss-svgo": "^4.0.2",
+        "postcss-unique-selectors": "^4.0.1"
+      }
+    },
+    "cssnano-util-get-arguments": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
+      "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8="
+    },
+    "cssnano-util-get-match": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
+      "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0="
+    },
+    "cssnano-util-raw-cache": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
+      "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q=="
+    },
+    "csso": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
+      "requires": {
+        "css-tree": "^1.1.2"
+      },
+      "dependencies": {
+        "css-tree": {
+          "version": "1.1.2",
+          "resolved": "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz",
+          "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
+          "requires": {
+            "mdn-data": "2.0.14",
+            "source-map": "^0.6.1"
+          }
+        },
+        "mdn-data": {
+          "version": "2.0.14",
+          "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz",
+          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow=="
+        }
+      }
+    },
+    "csstype": {
+      "version": "3.0.7",
+      "resolved": "https://registry.yarnpkg.com/csstype/-/csstype-3.0.7.tgz",
+      "integrity": "sha512-KxnUB0ZMlnUWCsx2Z8MUsr6qV6ja1w9ArPErJaJaF8a5SOWoHLIszeCTKGRGRgtLgYrs1E8CHkNSP1VZTTPc9g=="
+    },
+    "cyclist": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz",
+      "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk="
+    },
+    "debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "decamelize": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz",
+      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
+    },
+    "decode-uri-component": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+      "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+    },
+    "decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "deep-equal": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz",
+      "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+      "requires": {
+        "is-arguments": "^1.0.4",
+        "is-date-object": "^1.0.1",
+        "is-regex": "^1.0.4",
+        "object-is": "^1.0.1",
+        "object-keys": "^1.1.1",
+        "regexp.prototype.flags": "^1.2.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "deepmerge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz",
+      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
+    },
+    "default-gateway": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz",
+      "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==",
+      "requires": {
+        "execa": "^1.0.0",
+        "ip-regex": "^2.1.0"
+      },
+      "dependencies": {
+        "cross-spawn": {
+          "version": "6.0.5",
+          "resolved": "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz",
+          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+          "requires": {
+            "nice-try": "^1.0.4",
+            "path-key": "^2.0.1",
+            "semver": "^5.5.0",
+            "shebang-command": "^1.2.0",
+            "which": "^1.2.9"
+          }
+        },
+        "execa": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz",
+          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
+          "requires": {
+            "cross-spawn": "^6.0.0",
+            "get-stream": "^4.0.0",
+            "is-stream": "^1.1.0",
+            "npm-run-path": "^2.0.0",
+            "p-finally": "^1.0.0",
+            "signal-exit": "^3.0.0",
+            "strip-eof": "^1.0.0"
+          }
+        },
+        "is-stream": {
+          "version": "1.1.0",
+          "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz",
+          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ="
+        },
+        "npm-run-path": {
+          "version": "2.0.2",
+          "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz",
+          "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
+          "requires": {
+            "path-key": "^2.0.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        },
+        "shebang-command": {
+          "version": "1.2.0",
+          "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz",
+          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+          "requires": {
+            "shebang-regex": "^1.0.0"
+          }
+        },
+        "shebang-regex": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz",
+          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
+        }
+      }
+    },
+    "defer-to-connect": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+      "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
+    },
+    "define-properties": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz",
+      "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+      "requires": {
+        "object-keys": "^1.0.12"
+      }
+    },
+    "define-property": {
+      "version": "0.2.5",
+      "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz",
+      "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+      "requires": {
+        "is-descriptor": "^0.1.0"
+      },
+      "dependencies": {
+        "is-accessor-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+          "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-data-descriptor": {
+          "version": "0.1.4",
+          "resolved": "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+          "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+          "requires": {
+            "kind-of": "^3.0.2"
+          },
+          "dependencies": {
+            "kind-of": {
+              "version": "3.2.2",
+              "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+              "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+              "requires": {
+                "is-buffer": "^1.1.5"
+              }
+            }
+          }
+        },
+        "is-descriptor": {
+          "version": "0.1.6",
+          "resolved": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz",
+          "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+          "requires": {
+            "is-accessor-descriptor": "^0.1.6",
+            "is-data-descriptor": "^0.1.4",
+            "kind-of": "^5.0.0"
+          }
+        },
+        "kind-of": {
+          "version": "5.1.0",
+          "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz",
+          "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+        }
+      }
+    },
+    "del": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz",
+      "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
+      "requires": {
+        "globby": "^11.0.1",
+        "graceful-fs": "^4.2.4",
+        "is-glob": "^4.0.1",
+        "is-path-cwd": "^2.2.0",
+        "is-path-inside": "^3.0.2",
+        "p-map": "^4.0.0",
+        "rimraf": "^3.0.2",
+        "slash": "^3.0.0"
+      },
+      "dependencies": {
+        "rimraf": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz",
+          "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+          "requires": {
+            "glob": "^7.1.3"
+          }
+        }
+      }
+    },
+    "delegate": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz",
+      "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==",
+      "optional": true
+    },
+    "depd": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz",
+      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+    },
+    "des.js": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz",
+      "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
+      "requires": {
+        "inherits": "^2.0.1",
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "destroy": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz",
+      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+    },
+    "detab": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/detab/-/detab-2.0.4.tgz",
+      "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==",
+      "requires": {
+        "repeat-string": "^1.5.4"
+      }
+    },
+    "detect-node": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.5.tgz",
+      "integrity": "sha512-qi86tE6hRcFHy8jI1m2VG+LaPUR1LhqDa5G8tVjuUXmOrpuAgqsA1pN0+ldgr3aKUH+QLI9hCY/OcRYisERejw=="
+    },
+    "detect-port": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/detect-port/-/detect-port-1.3.0.tgz",
+      "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==",
+      "requires": {
+        "address": "^1.0.1",
+        "debug": "^2.6.0"
+      }
+    },
+    "detect-port-alt": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz",
+      "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==",
+      "requires": {
+        "address": "^1.0.1",
+        "debug": "^2.6.0"
+      }
+    },
+    "diffie-hellman": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
+      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
+      "requires": {
+        "bn.js": "^4.1.0",
+        "miller-rabin": "^4.0.0",
+        "randombytes": "^2.0.0"
+      }
+    },
+    "dir-glob": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz",
+      "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+      "requires": {
+        "path-type": "^4.0.0"
+      }
+    },
+    "direction": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/direction/-/direction-1.0.4.tgz",
+      "integrity": "sha512-GYqKi1aH7PJXxdhTeZBFrg8vUBeKXi+cNprXsC1kpJcbcVnV9wBsrOu1cQEdG0WeQwlfHiy3XvnKfIrJ2R0NzQ=="
+    },
+    "dns-equal": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz",
+      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0="
+    },
+    "dns-packet": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz",
+      "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==",
+      "requires": {
+        "ip": "^1.1.0",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "dns-txt": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz",
+      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
+      "requires": {
+        "buffer-indexof": "^1.0.0"
+      }
+    },
+    "docusaurus-lunr-search": {
+      "version": "2.1.10",
+      "resolved": "https://registry.npmjs.org/docusaurus-lunr-search/-/docusaurus-lunr-search-2.1.10.tgz",
+      "integrity": "sha512-UIb19XkoP9VyXoKxua99PS4wpfnifw/jwVUBok0B0NAm+3HSTfoJ8GQVZPHmc26h7jX/FnqfIeUKS+xcqlQPTw==",
+      "requires": {
+        "autocomplete.js": "^0.37.0",
+        "classnames": "^2.2.6",
+        "gauge": "^3.0.0",
+        "hast-util-select": "^4.0.0",
+        "hast-util-to-text": "^2.0.0",
+        "hogan.js": "^3.0.2",
+        "lunr": "^2.3.8",
+        "lunr-languages": "^1.4.0",
+        "minimatch": "^3.0.4",
+        "object-assign": "^4.1.1",
+        "rehype-parse": "^7.0.1",
+        "to-vfile": "^6.1.0",
+        "unified": "^9.0.0",
+        "unist-util-is": "^4.0.2"
+      },
+      "dependencies": {
+        "hast-util-from-parse5": {
+          "version": "6.0.1",
+          "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
+          "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
+          "requires": {
+            "@types/parse5": "^5.0.0",
+            "hastscript": "^6.0.0",
+            "property-information": "^5.0.0",
+            "vfile": "^4.0.0",
+            "vfile-location": "^3.2.0",
+            "web-namespaces": "^1.0.0"
+          }
+        },
+        "hastscript": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+          "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+          "requires": {
+            "@types/hast": "^2.0.0",
+            "comma-separated-tokens": "^1.0.0",
+            "hast-util-parse-selector": "^2.0.0",
+            "property-information": "^5.0.0",
+            "space-separated-tokens": "^1.0.0"
+          }
+        },
+        "rehype-parse": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-7.0.1.tgz",
+          "integrity": "sha512-fOiR9a9xH+Le19i4fGzIEowAbwG7idy2Jzs4mOrFWBSJ0sNUgy0ev871dwWnbOo371SjgjG4pwzrbgSVrKxecw==",
+          "requires": {
+            "hast-util-from-parse5": "^6.0.0",
+            "parse5": "^6.0.0"
+          }
+        }
+      }
+    },
+    "dom-converter": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz",
+      "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==",
+      "requires": {
+        "utila": "~0.4"
+      }
+    },
+    "dom-serializer": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz",
+      "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+      "requires": {
+        "domelementtype": "^2.0.1",
+        "entities": "^2.0.0"
+      },
+      "dependencies": {
+        "entities": {
+          "version": "2.2.0",
+          "resolved": "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz",
+          "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+        }
+      }
+    },
+    "domain-browser": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz",
+      "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
+    },
+    "domelementtype": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz",
+      "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w=="
+    },
+    "dot-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz",
+      "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+      "requires": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "dot-prop": {
+      "version": "5.3.0",
+      "resolved": "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz",
+      "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+      "requires": {
+        "is-obj": "^2.0.0"
+      }
+    },
+    "duplexer": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz",
+      "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="
+    },
+    "duplexer3": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz",
+      "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI="
+    },
+    "duplexify": {
+      "version": "3.7.1",
+      "resolved": "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz",
+      "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
+      "requires": {
+        "end-of-stream": "^1.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+    },
+    "electron-to-chromium": {
+      "version": "1.3.691",
+      "resolved": "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.691.tgz",
+      "integrity": "sha512-ZqiO69KImmOGCyoH0icQPU3SndJiW93juEvf63gQngyhODO6SpQIPMTOHldtCs5DS5GMKvAkquk230E2zt2vpw=="
+    },
+    "elliptic": {
+      "version": "6.5.4",
+      "resolved": "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz",
+      "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
+      "requires": {
+        "bn.js": "^4.11.9",
+        "brorand": "^1.1.0",
+        "hash.js": "^1.0.0",
+        "hmac-drbg": "^1.0.1",
+        "inherits": "^2.0.4",
+        "minimalistic-assert": "^1.0.1",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "emoji-regex": {
+      "version": "7.0.3",
+      "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz",
+      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+    },
+    "emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="
+    },
+    "emoticon": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/emoticon/-/emoticon-3.2.0.tgz",
+      "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg=="
+    },
+    "encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+    },
+    "end-of-stream": {
+      "version": "1.4.4",
+      "resolved": "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz",
+      "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "enhanced-resolve": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
+      "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "memory-fs": "^0.5.0",
+        "tapable": "^1.0.0"
+      },
+      "dependencies": {
+        "memory-fs": {
+          "version": "0.5.0",
+          "resolved": "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz",
+          "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
+          "requires": {
+            "errno": "^0.1.3",
+            "readable-stream": "^2.0.1"
+          }
+        }
+      }
+    },
+    "entities": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz",
+      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w=="
+    },
+    "errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "requires": {
+        "prr": "~1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz",
+      "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+      "requires": {
+        "is-arrayish": "^0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.18.0",
+      "resolved": "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz",
+      "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "es-to-primitive": "^1.2.1",
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.2",
+        "is-callable": "^1.2.3",
+        "is-negative-zero": "^2.0.1",
+        "is-regex": "^1.1.2",
+        "is-string": "^1.0.5",
+        "object-inspect": "^1.9.0",
+        "object-keys": "^1.1.1",
+        "object.assign": "^4.1.2",
+        "string.prototype.trimend": "^1.0.4",
+        "string.prototype.trimstart": "^1.0.4",
+        "unbox-primitive": "^1.0.0"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+      "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+      "requires": {
+        "is-callable": "^1.1.4",
+        "is-date-object": "^1.0.1",
+        "is-symbol": "^1.0.2"
+      }
+    },
+    "escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+    },
+    "escape-goat": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz",
+      "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q=="
+    },
+    "escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "eslint-scope": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz",
+      "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==",
+      "requires": {
+        "esrecurse": "^4.1.0",
+        "estraverse": "^4.1.1"
+      }
+    },
+    "esprima": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz",
+      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+    },
+    "esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "requires": {
+        "estraverse": "^5.2.0"
+      },
+      "dependencies": {
+        "estraverse": {
+          "version": "5.2.0",
+          "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz",
+          "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
+        }
+      }
+    },
+    "estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="
+    },
+    "esutils": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz",
+      "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+    },
+    "eta": {
+      "version": "1.12.1",
+      "resolved": "https://registry.yarnpkg.com/eta/-/eta-1.12.1.tgz",
+      "integrity": "sha512-H8npoci2J/7XiPnVcCVulBSPsTNGvGaINyMjQDU8AFqp9LGsEYS88g2CiU+d01Sg44WtX7o4nb8wUJ9vnI+tiA=="
+    },
+    "etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+    },
+    "eval": {
+      "version": "0.1.6",
+      "resolved": "https://registry.yarnpkg.com/eval/-/eval-0.1.6.tgz",
+      "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==",
+      "requires": {
+        "require-like": ">= 0.1.1"
+      }
+    },
+    "eventemitter3": {
+      "version": "4.0.7",
+      "resolved": "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz",
+      "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
+    },
+    "eventsource": {
+      "version": "1.0.7",
+      "resolved": "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz",
+      "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==",
+      "requires": {
+        "original": "^1.0.0"
+      }
+    },
+    "evp_bytestokey": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
+      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
+      "requires": {
+        "md5.js": "^1.3.4",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "execa": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz",
+      "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+      "requires": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "dependencies": {
+        "get-stream": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz",
+          "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg=="
+        }
+      }
+    },
+    "expand-brackets": {
+      "version": "2.1.4",
+      "resolved": "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz",
+      "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+      "requires": {
+        "debug": "^2.3.3",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "posix-character-classes": "^0.1.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      }
+    },
+    "express": {
+      "version": "4.17.1",
+      "resolved": "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz",
+      "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+      "requires": {
+        "accepts": "~1.3.7",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.19.0",
+        "content-disposition": "0.5.3",
+        "content-type": "~1.0.4",
+        "cookie": "0.4.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "~1.1.2",
+        "fresh": "0.5.2",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.5",
+        "qs": "6.7.0",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.1.2",
+        "send": "0.17.1",
+        "serve-static": "1.14.1",
+        "setprototypeof": "1.1.1",
+        "statuses": "~1.5.0",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "dependencies": {
+        "content-disposition": {
+          "version": "0.5.3",
+          "resolved": "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz",
+          "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+          "requires": {
+            "safe-buffer": "5.1.2"
+          }
+        },
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        }
+      }
+    },
+    "extend": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz",
+      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+    },
+    "extend-shallow": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz",
+      "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+      "requires": {
+        "is-extendable": "^0.1.0"
+      }
+    },
+    "extglob": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz",
+      "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+      "requires": {
+        "array-unique": "^0.3.2",
+        "define-property": "^1.0.0",
+        "expand-brackets": "^2.1.4",
+        "extend-shallow": "^2.0.1",
+        "fragment-cache": "^0.2.1",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        }
+      }
+    },
+    "fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "fast-glob": {
+      "version": "3.2.5",
+      "resolved": "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz",
+      "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
+      "requires": {
+        "@nodelib/fs.stat": "^2.0.2",
+        "@nodelib/fs.walk": "^1.2.3",
+        "glob-parent": "^5.1.0",
+        "merge2": "^1.3.0",
+        "micromatch": "^4.0.2",
+        "picomatch": "^2.2.1"
+      },
+      "dependencies": {
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "fast-url-parser": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz",
+      "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=",
+      "requires": {
+        "punycode": "^1.3.2"
+      }
+    },
+    "fastq": {
+      "version": "1.11.0",
+      "resolved": "https://registry.yarnpkg.com/fastq/-/fastq-1.11.0.tgz",
+      "integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
+      "requires": {
+        "reusify": "^1.0.4"
+      }
+    },
+    "faye-websocket": {
+      "version": "0.11.3",
+      "resolved": "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz",
+      "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==",
+      "requires": {
+        "websocket-driver": ">=0.5.1"
+      }
+    },
+    "fbemitter": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/fbemitter/-/fbemitter-3.0.0.tgz",
+      "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==",
+      "requires": {
+        "fbjs": "^3.0.0"
+      }
+    },
+    "fbjs": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/fbjs/-/fbjs-3.0.0.tgz",
+      "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==",
+      "requires": {
+        "cross-fetch": "^3.0.4",
+        "fbjs-css-vars": "^1.0.0",
+        "loose-envify": "^1.0.0",
+        "object-assign": "^4.1.0",
+        "promise": "^7.1.1",
+        "setimmediate": "^1.0.5",
+        "ua-parser-js": "^0.7.18"
+      }
+    },
+    "fbjs-css-vars": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz",
+      "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ=="
+    },
+    "feed": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/feed/-/feed-4.2.2.tgz",
+      "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==",
+      "requires": {
+        "xml-js": "^1.6.11"
+      }
+    },
+    "figgy-pudding": {
+      "version": "3.5.2",
+      "resolved": "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+      "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="
+    },
+    "figures": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz",
+      "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+      "requires": {
+        "escape-string-regexp": "^1.0.5"
+      }
+    },
+    "file-loader": {
+      "version": "6.2.0",
+      "resolved": "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz",
+      "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      }
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
+      "optional": true
+    },
+    "filesize": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz",
+      "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg=="
+    },
+    "fill-range": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz",
+      "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1",
+        "to-regex-range": "^2.1.0"
+      }
+    },
+    "finalhandler": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz",
+      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+      "requires": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "~2.3.0",
+        "parseurl": "~1.3.3",
+        "statuses": "~1.5.0",
+        "unpipe": "~1.0.0"
+      }
+    },
+    "find-cache-dir": {
+      "version": "3.3.1",
+      "resolved": "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
+      "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
+      "requires": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      },
+      "dependencies": {
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        },
+        "pkg-dir": {
+          "version": "4.2.0",
+          "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz",
+          "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+          "requires": {
+            "find-up": "^4.0.0"
+          }
+        }
+      }
+    },
+    "find-up": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz",
+      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+      "requires": {
+        "locate-path": "^3.0.0"
+      }
+    },
+    "flatten": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/flatten/-/flatten-1.0.3.tgz",
+      "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg=="
+    },
+    "flush-write-stream": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
+      "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.3.6"
+      }
+    },
+    "flux": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/flux/-/flux-4.0.1.tgz",
+      "integrity": "sha512-emk4RCvJ8RzNP2lNpphKnG7r18q8elDYNAPx7xn+bDeOIo9FFfxEfIQ2y6YbQNmnsGD3nH1noxtLE64Puz1bRQ==",
+      "requires": {
+        "fbemitter": "^3.0.0",
+        "fbjs": "^3.0.0"
+      }
+    },
+    "follow-redirects": {
+      "version": "1.13.3",
+      "resolved": "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.3.tgz",
+      "integrity": "sha512-DUgl6+HDzB0iEptNQEXLx/KhTmDb8tZUHSeLqpnjpknR70H0nC2t9N73BK6fN4hOvJ84pKlIQVQ4k5FFlBedKA=="
+    },
+    "for-in": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz",
+      "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+    },
+    "fork-ts-checker-webpack-plugin": {
+      "version": "4.1.6",
+      "resolved": "https://registry.yarnpkg.com/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz",
+      "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==",
+      "requires": {
+        "@babel/code-frame": "^7.5.5",
+        "chalk": "^2.4.1",
+        "micromatch": "^3.1.10",
+        "minimatch": "^3.0.4",
+        "semver": "^5.6.0",
+        "tapable": "^1.0.0",
+        "worker-rpc": "^0.1.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        }
+      }
+    },
+    "forwarded": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz",
+      "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+    },
+    "fraction.js": {
+      "version": "4.0.13",
+      "resolved": "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.0.13.tgz",
+      "integrity": "sha512-E1fz2Xs9ltlUp+qbiyx9wmt2n9dRzPsS11Jtdb8D2o+cC7wr9xkkKsVKJuBX0ST+LVS+LhLO+SbLJNtfWcJvXA=="
+    },
+    "fragment-cache": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz",
+      "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+      "requires": {
+        "map-cache": "^0.2.2"
+      }
+    },
+    "fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+    },
+    "from2": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz",
+      "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=",
+      "requires": {
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.0.0"
+      }
+    },
+    "fs-extra": {
+      "version": "9.1.0",
+      "resolved": "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz",
+      "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+      "requires": {
+        "at-least-node": "^1.0.0",
+        "graceful-fs": "^4.2.0",
+        "jsonfile": "^6.0.1",
+        "universalify": "^2.0.0"
+      }
+    },
+    "fs-minipass": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz",
+      "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "iferr": "^0.1.5",
+        "imurmurhash": "^0.1.4",
+        "readable-stream": "1 || 2"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "fsevents": {
+      "version": "1.2.13",
+      "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz",
+      "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+      "optional": true,
+      "requires": {
+        "bindings": "^1.5.0",
+        "nan": "^2.12.1"
+      }
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
+    },
+    "gauge": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.0.tgz",
+      "integrity": "sha512-VSxauaaCsLOTerAyzunAYGgK3iaWZvOL1BCvBvf/IhDWrczPAf1tUqn05DOCJOOe4k3vOdX6fHhJIvF2UtCMhw==",
+      "requires": {
+        "aproba": "^1.0.3 || ^2.0.0",
+        "color-support": "^1.1.2",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.1",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1 || ^2.0.0",
+        "strip-ansi": "^3.0.1 || ^4.0.0",
+        "wide-align": "^1.1.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="
+    },
+    "get-caller-file": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz",
+      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
+    },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "get-own-enumerable-property-symbols": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
+      "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g=="
+    },
+    "get-stream": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz",
+      "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+      "requires": {
+        "pump": "^3.0.0"
+      }
+    },
+    "get-value": {
+      "version": "2.0.6",
+      "resolved": "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz",
+      "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+    },
+    "github-slugger": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.3.0.tgz",
+      "integrity": "sha512-gwJScWVNhFYSRDvURk/8yhcFBee6aFjye2a7Lhb2bUyRulpIoek9p0I9Kt7PT67d/nUlZbFu8L9RLiA0woQN8Q==",
+      "requires": {
+        "emoji-regex": ">=6.0.0 <=6.1.1"
+      },
+      "dependencies": {
+        "emoji-regex": {
+          "version": "6.1.1",
+          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz",
+          "integrity": "sha1-xs0OwbBkLio8Z6ETfvxeeW2k+I4="
+        }
+      }
+    },
+    "glob": {
+      "version": "7.1.6",
+      "resolved": "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz",
+      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+      "requires": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.0.4",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      }
+    },
+    "glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "requires": {
+        "is-glob": "^4.0.1"
+      }
+    },
+    "global-dirs": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz",
+      "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==",
+      "requires": {
+        "ini": "2.0.0"
+      },
+      "dependencies": {
+        "ini": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz",
+          "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="
+        }
+      }
+    },
+    "global-modules": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz",
+      "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+      "requires": {
+        "global-prefix": "^3.0.0"
+      }
+    },
+    "global-prefix": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz",
+      "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+      "requires": {
+        "ini": "^1.3.5",
+        "kind-of": "^6.0.2",
+        "which": "^1.3.1"
+      }
+    },
+    "globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="
+    },
+    "globby": {
+      "version": "11.0.2",
+      "resolved": "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz",
+      "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==",
+      "requires": {
+        "array-union": "^2.1.0",
+        "dir-glob": "^3.0.1",
+        "fast-glob": "^3.1.1",
+        "ignore": "^5.1.4",
+        "merge2": "^1.3.0",
+        "slash": "^3.0.0"
+      }
+    },
+    "good-listener": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz",
+      "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=",
+      "optional": true,
+      "requires": {
+        "delegate": "^3.1.2"
+      }
+    },
+    "got": {
+      "version": "9.6.0",
+      "resolved": "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz",
+      "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+      "requires": {
+        "@sindresorhus/is": "^0.14.0",
+        "@szmarczak/http-timer": "^1.1.2",
+        "cacheable-request": "^6.0.0",
+        "decompress-response": "^3.3.0",
+        "duplexer3": "^0.1.4",
+        "get-stream": "^4.1.0",
+        "lowercase-keys": "^1.0.1",
+        "mimic-response": "^1.0.1",
+        "p-cancelable": "^1.0.0",
+        "to-readable-stream": "^1.0.0",
+        "url-parse-lax": "^3.0.0"
+      }
+    },
+    "graceful-fs": {
+      "version": "4.2.6",
+      "resolved": "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz",
+      "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ=="
+    },
+    "gray-matter": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz",
+      "integrity": "sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==",
+      "requires": {
+        "js-yaml": "^3.11.0",
+        "kind-of": "^6.0.2",
+        "section-matter": "^1.0.0",
+        "strip-bom-string": "^1.0.0"
+      }
+    },
+    "gzip-size": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz",
+      "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==",
+      "requires": {
+        "duplexer": "^0.1.1",
+        "pify": "^4.0.1"
+      }
+    },
+    "handle-thing": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz",
+      "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg=="
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "has-bigints": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz",
+      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
+    },
+    "has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
+    },
+    "has-symbols": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz",
+      "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+    },
+    "has-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz",
+      "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+      "requires": {
+        "get-value": "^2.0.6",
+        "has-values": "^1.0.0",
+        "isobject": "^3.0.0"
+      }
+    },
+    "has-values": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz",
+      "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "kind-of": "^4.0.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz",
+          "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "has-yarn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz",
+      "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw=="
+    },
+    "hash-base": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz",
+      "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
+      "requires": {
+        "inherits": "^2.0.4",
+        "readable-stream": "^3.6.0",
+        "safe-buffer": "^5.2.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "hash.js": {
+      "version": "1.1.7",
+      "resolved": "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz",
+      "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
+      "requires": {
+        "inherits": "^2.0.3",
+        "minimalistic-assert": "^1.0.1"
+      }
+    },
+    "hast-to-hyperscript": {
+      "version": "9.0.1",
+      "resolved": "https://registry.yarnpkg.com/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz",
+      "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==",
+      "requires": {
+        "@types/unist": "^2.0.3",
+        "comma-separated-tokens": "^1.0.0",
+        "property-information": "^5.3.0",
+        "space-separated-tokens": "^1.0.0",
+        "style-to-object": "^0.3.0",
+        "unist-util-is": "^4.0.0",
+        "web-namespaces": "^1.0.0"
+      }
+    },
+    "hast-util-from-parse5": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz",
+      "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==",
+      "requires": {
+        "ccount": "^1.0.3",
+        "hastscript": "^5.0.0",
+        "property-information": "^5.0.0",
+        "web-namespaces": "^1.1.2",
+        "xtend": "^4.0.1"
+      }
+    },
+    "hast-util-has-property": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hast-util-has-property/-/hast-util-has-property-1.0.4.tgz",
+      "integrity": "sha512-ghHup2voGfgFoHMGnaLHOjbYFACKrRh9KFttdCzMCbFoBMJXiNi2+XTrPP8+q6cDJM/RSqlCfVWrjp1H201rZg=="
+    },
+    "hast-util-is-element": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-1.1.0.tgz",
+      "integrity": "sha512-oUmNua0bFbdrD/ELDSSEadRVtWZOf3iF6Lbv81naqsIV99RnSCieTbWuWCY8BAeEfKJTKl0gRdokv+dELutHGQ=="
+    },
+    "hast-util-parse-selector": {
+      "version": "2.2.5",
+      "resolved": "https://registry.yarnpkg.com/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+      "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ=="
+    },
+    "hast-util-raw": {
+      "version": "6.0.1",
+      "resolved": "https://registry.yarnpkg.com/hast-util-raw/-/hast-util-raw-6.0.1.tgz",
+      "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==",
+      "requires": {
+        "@types/hast": "^2.0.0",
+        "hast-util-from-parse5": "^6.0.0",
+        "hast-util-to-parse5": "^6.0.0",
+        "html-void-elements": "^1.0.0",
+        "parse5": "^6.0.0",
+        "unist-util-position": "^3.0.0",
+        "vfile": "^4.0.0",
+        "web-namespaces": "^1.0.0",
+        "xtend": "^4.0.0",
+        "zwitch": "^1.0.0"
+      },
+      "dependencies": {
+        "hast-util-from-parse5": {
+          "version": "6.0.1",
+          "resolved": "https://registry.yarnpkg.com/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz",
+          "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==",
+          "requires": {
+            "@types/parse5": "^5.0.0",
+            "hastscript": "^6.0.0",
+            "property-information": "^5.0.0",
+            "vfile": "^4.0.0",
+            "vfile-location": "^3.2.0",
+            "web-namespaces": "^1.0.0"
+          }
+        },
+        "hastscript": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/hastscript/-/hastscript-6.0.0.tgz",
+          "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+          "requires": {
+            "@types/hast": "^2.0.0",
+            "comma-separated-tokens": "^1.0.0",
+            "hast-util-parse-selector": "^2.0.0",
+            "property-information": "^5.0.0",
+            "space-separated-tokens": "^1.0.0"
+          }
+        }
+      }
+    },
+    "hast-util-select": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/hast-util-select/-/hast-util-select-4.0.2.tgz",
+      "integrity": "sha512-8EEG2//bN5rrzboPWD2HdS3ugLijNioS1pqOTIolXNf67xxShYw4SQEmVXd3imiBG+U2bC2nVTySr/iRAA7Cjg==",
+      "requires": {
+        "bcp-47-match": "^1.0.0",
+        "comma-separated-tokens": "^1.0.0",
+        "css-selector-parser": "^1.0.0",
+        "direction": "^1.0.0",
+        "hast-util-has-property": "^1.0.0",
+        "hast-util-is-element": "^1.0.0",
+        "hast-util-to-string": "^1.0.0",
+        "hast-util-whitespace": "^1.0.0",
+        "not": "^0.1.0",
+        "nth-check": "^2.0.0",
+        "property-information": "^5.0.0",
+        "space-separated-tokens": "^1.0.0",
+        "unist-util-visit": "^2.0.0",
+        "zwitch": "^1.0.0"
+      },
+      "dependencies": {
+        "nth-check": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
+          "integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+          "requires": {
+            "boolbase": "^1.0.0"
+          }
+        }
+      }
+    },
+    "hast-util-to-parse5": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz",
+      "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==",
+      "requires": {
+        "hast-to-hyperscript": "^9.0.0",
+        "property-information": "^5.0.0",
+        "web-namespaces": "^1.0.0",
+        "xtend": "^4.0.0",
+        "zwitch": "^1.0.0"
+      }
+    },
+    "hast-util-to-string": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hast-util-to-string/-/hast-util-to-string-1.0.4.tgz",
+      "integrity": "sha512-eK0MxRX47AV2eZ+Lyr18DCpQgodvaS3fAQO2+b9Two9F5HEoRPhiUMNzoXArMJfZi2yieFzUBMRl3HNJ3Jus3w=="
+    },
+    "hast-util-to-text": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/hast-util-to-text/-/hast-util-to-text-2.0.1.tgz",
+      "integrity": "sha512-8nsgCARfs6VkwH2jJU9b8LNTuR4700na+0h3PqCaEk4MAnMDeu5P0tP8mjk9LLNGxIeQRLbiDbZVw6rku+pYsQ==",
+      "requires": {
+        "hast-util-is-element": "^1.0.0",
+        "repeat-string": "^1.0.0",
+        "unist-util-find-after": "^3.0.0"
+      }
+    },
+    "hast-util-whitespace": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-1.0.4.tgz",
+      "integrity": "sha512-I5GTdSfhYfAPNztx2xJRQpG8cuDSNt599/7YUn7Gx/WxNMsG+a835k97TDkFgk123cwjfwINaZknkKkphx/f2A=="
+    },
+    "hastscript": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/hastscript/-/hastscript-5.1.2.tgz",
+      "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==",
+      "requires": {
+        "comma-separated-tokens": "^1.0.0",
+        "hast-util-parse-selector": "^2.0.0",
+        "property-information": "^5.0.0",
+        "space-separated-tokens": "^1.0.0"
+      }
+    },
+    "he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
+    },
+    "hex-color-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
+      "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ=="
+    },
+    "history": {
+      "version": "4.10.1",
+      "resolved": "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz",
+      "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==",
+      "requires": {
+        "@babel/runtime": "^7.1.2",
+        "loose-envify": "^1.2.0",
+        "resolve-pathname": "^3.0.0",
+        "tiny-invariant": "^1.0.2",
+        "tiny-warning": "^1.0.0",
+        "value-equal": "^1.0.1"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "requires": {
+        "hash.js": "^1.0.3",
+        "minimalistic-assert": "^1.0.0",
+        "minimalistic-crypto-utils": "^1.0.1"
+      }
+    },
+    "hogan.js": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/hogan.js/-/hogan.js-3.0.2.tgz",
+      "integrity": "sha1-TNnhq9QpQUbnZ55B14mHMrAse/0=",
+      "requires": {
+        "mkdirp": "0.3.0",
+        "nopt": "1.0.10"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "0.3.0",
+          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz",
+          "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4="
+        }
+      }
+    },
+    "hoist-non-react-statics": {
+      "version": "3.3.2",
+      "resolved": "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+      "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+      "requires": {
+        "react-is": "^16.7.0"
+      }
+    },
+    "hpack.js": {
+      "version": "2.1.6",
+      "resolved": "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz",
+      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
+      "requires": {
+        "inherits": "^2.0.1",
+        "obuf": "^1.0.0",
+        "readable-stream": "^2.0.1",
+        "wbuf": "^1.1.0"
+      }
+    },
+    "hsl-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz",
+      "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4="
+    },
+    "hsla-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz",
+      "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg="
+    },
+    "html-comment-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
+      "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ=="
+    },
+    "html-entities": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz",
+      "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA=="
+    },
+    "html-minifier-terser": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz",
+      "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==",
+      "requires": {
+        "camel-case": "^4.1.1",
+        "clean-css": "^4.2.3",
+        "commander": "^4.1.1",
+        "he": "^1.2.0",
+        "param-case": "^3.0.3",
+        "relateurl": "^0.2.7",
+        "terser": "^4.6.3"
+      },
+      "dependencies": {
+        "clean-css": {
+          "version": "4.2.3",
+          "resolved": "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz",
+          "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==",
+          "requires": {
+            "source-map": "~0.6.0"
+          }
+        },
+        "commander": {
+          "version": "4.1.1",
+          "resolved": "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz",
+          "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="
+        }
+      }
+    },
+    "html-tags": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/html-tags/-/html-tags-3.1.0.tgz",
+      "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg=="
+    },
+    "html-void-elements": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/html-void-elements/-/html-void-elements-1.0.5.tgz",
+      "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w=="
+    },
+    "html-webpack-plugin": {
+      "version": "4.5.2",
+      "resolved": "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz",
+      "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==",
+      "requires": {
+        "@types/html-minifier-terser": "^5.0.0",
+        "@types/tapable": "^1.0.5",
+        "@types/webpack": "^4.41.8",
+        "html-minifier-terser": "^5.0.1",
+        "loader-utils": "^1.2.3",
+        "lodash": "^4.17.20",
+        "pretty-error": "^2.1.1",
+        "tapable": "^1.1.3",
+        "util.promisify": "1.0.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        }
+      }
+    },
+    "htmlparser2": {
+      "version": "3.10.1",
+      "resolved": "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz",
+      "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+      "requires": {
+        "domelementtype": "^1.3.1",
+        "domhandler": "^2.3.0",
+        "domutils": "^1.5.1",
+        "entities": "^1.1.1",
+        "inherits": "^2.0.1",
+        "readable-stream": "^3.1.1"
+      },
+      "dependencies": {
+        "domelementtype": {
+          "version": "1.3.1",
+          "resolved": "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz",
+          "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
+        },
+        "domhandler": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz",
+          "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+          "requires": {
+            "domelementtype": "1"
+          }
+        },
+        "domutils": {
+          "version": "1.7.0",
+          "resolved": "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz",
+          "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+          "requires": {
+            "dom-serializer": "0",
+            "domelementtype": "1"
+          }
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "http-cache-semantics": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+      "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+    },
+    "http-deceiver": {
+      "version": "1.2.7",
+      "resolved": "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz",
+      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc="
+    },
+    "http-errors": {
+      "version": "1.7.2",
+      "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz",
+      "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+      "requires": {
+        "depd": "~1.1.2",
+        "inherits": "2.0.3",
+        "setprototypeof": "1.1.1",
+        "statuses": ">= 1.5.0 < 2",
+        "toidentifier": "1.0.0"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        }
+      }
+    },
+    "http-parser-js": {
+      "version": "0.5.3",
+      "resolved": "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.3.tgz",
+      "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg=="
+    },
+    "http-proxy": {
+      "version": "1.18.1",
+      "resolved": "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz",
+      "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+      "requires": {
+        "eventemitter3": "^4.0.0",
+        "follow-redirects": "^1.0.0",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "http-proxy-middleware": {
+      "version": "0.19.1",
+      "resolved": "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz",
+      "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==",
+      "requires": {
+        "http-proxy": "^1.17.0",
+        "is-glob": "^4.0.0",
+        "lodash": "^4.17.11",
+        "micromatch": "^3.1.10"
+      }
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+    },
+    "human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "requires": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "ieee754": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz",
+      "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+    },
+    "ignore": {
+      "version": "5.1.8",
+      "resolved": "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw=="
+    },
+    "immediate": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.3.0.tgz",
+      "integrity": "sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q=="
+    },
+    "immer": {
+      "version": "8.0.1",
+      "resolved": "https://registry.yarnpkg.com/immer/-/immer-8.0.1.tgz",
+      "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA=="
+    },
+    "import-fresh": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz",
+      "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+      "requires": {
+        "parent-module": "^1.0.0",
+        "resolve-from": "^4.0.0"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+        }
+      }
+    },
+    "import-lazy": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz",
+      "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM="
+    },
+    "import-local": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz",
+      "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+      "requires": {
+        "pkg-dir": "^3.0.0",
+        "resolve-cwd": "^2.0.0"
+      }
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+    },
+    "indent-string": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
+    },
+    "indexes-of": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz",
+      "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc="
+    },
+    "infer-owner": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz",
+      "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
+    },
+    "infima": {
+      "version": "0.2.0-alpha.21",
+      "resolved": "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.21.tgz",
+      "integrity": "sha512-32uq+rWIrLNZx0jzNrwJWE8Go9NvpP0JTRKMXJ8aYlWZ0vm9OCgAEcVquwFBSW6ZP7R2rjBUjPy/nJ3PK7MhUA=="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.8",
+      "resolved": "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="
+    },
+    "inline-style-parser": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz",
+      "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="
+    },
+    "internal-ip": {
+      "version": "4.3.0",
+      "resolved": "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz",
+      "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==",
+      "requires": {
+        "default-gateway": "^4.2.0",
+        "ipaddr.js": "^1.9.0"
+      }
+    },
+    "interpret": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz",
+      "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
+    },
+    "ip": {
+      "version": "1.1.5",
+      "resolved": "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz",
+      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo="
+    },
+    "ip-regex": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz",
+      "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk="
+    },
+    "ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
+    },
+    "is-absolute-url": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
+      "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q=="
+    },
+    "is-accessor-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+      "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+      "requires": {
+        "kind-of": "^6.0.0"
+      }
+    },
+    "is-alphabetical": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+      "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg=="
+    },
+    "is-alphanumerical": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+      "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+      "requires": {
+        "is-alphabetical": "^1.0.0",
+        "is-decimal": "^1.0.0"
+      }
+    },
+    "is-arguments": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz",
+      "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+      "requires": {
+        "call-bind": "^1.0.0"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
+    },
+    "is-bigint": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz",
+      "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg=="
+    },
+    "is-binary-path": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz",
+      "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+      "requires": {
+        "binary-extensions": "^1.0.0"
+      }
+    },
+    "is-boolean-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
+      "integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
+      "requires": {
+        "call-bind": "^1.0.0"
+      }
+    },
+    "is-buffer": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz",
+      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+    },
+    "is-callable": {
+      "version": "1.2.3",
+      "resolved": "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz",
+      "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
+    },
+    "is-ci": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz",
+      "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+      "requires": {
+        "ci-info": "^2.0.0"
+      },
+      "dependencies": {
+        "ci-info": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz",
+          "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ=="
+        }
+      }
+    },
+    "is-color-stop": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz",
+      "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
+      "requires": {
+        "css-color-names": "^0.0.4",
+        "hex-color-regex": "^1.1.0",
+        "hsl-regex": "^1.0.0",
+        "hsla-regex": "^1.0.0",
+        "rgb-regex": "^1.0.1",
+        "rgba-regex": "^1.0.0"
+      }
+    },
+    "is-core-module": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz",
+      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-data-descriptor": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+      "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+      "requires": {
+        "kind-of": "^6.0.0"
+      }
+    },
+    "is-date-object": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz",
+      "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g=="
+    },
+    "is-decimal": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz",
+      "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw=="
+    },
+    "is-descriptor": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz",
+      "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+      "requires": {
+        "is-accessor-descriptor": "^1.0.0",
+        "is-data-descriptor": "^1.0.0",
+        "kind-of": "^6.0.2"
+      }
+    },
+    "is-directory": {
+      "version": "0.3.1",
+      "resolved": "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz",
+      "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE="
+    },
+    "is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw=="
+    },
+    "is-extendable": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz",
+      "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+    },
+    "is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+    },
+    "is-fullwidth-code-point": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
+    },
+    "is-glob": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz",
+      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+      "requires": {
+        "is-extglob": "^2.1.1"
+      }
+    },
+    "is-hexadecimal": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+      "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw=="
+    },
+    "is-installed-globally": {
+      "version": "0.4.0",
+      "resolved": "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+      "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+      "requires": {
+        "global-dirs": "^3.0.0",
+        "is-path-inside": "^3.0.2"
+      }
+    },
+    "is-negative-zero": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
+    },
+    "is-npm": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz",
+      "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA=="
+    },
+    "is-number": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz",
+      "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "is-number-object": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz",
+      "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw=="
+    },
+    "is-obj": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz",
+      "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="
+    },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ=="
+    },
+    "is-path-in-cwd": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+      "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+      "requires": {
+        "is-path-inside": "^2.1.0"
+      },
+      "dependencies": {
+        "is-path-inside": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz",
+          "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+          "requires": {
+            "path-is-inside": "^1.0.2"
+          }
+        }
+      }
+    },
+    "is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
+    },
+    "is-plain-obj": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA=="
+    },
+    "is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "is-regex": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz",
+      "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-regexp": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz",
+      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk="
+    },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+    },
+    "is-root": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz",
+      "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg=="
+    },
+    "is-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw=="
+    },
+    "is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz",
+      "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ=="
+    },
+    "is-svg": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz",
+      "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
+      "requires": {
+        "html-comment-regex": "^1.1.0"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz",
+      "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+      "requires": {
+        "has-symbols": "^1.0.1"
+      }
+    },
+    "is-typedarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz",
+      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+    },
+    "is-whitespace-character": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
+      "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w=="
+    },
+    "is-windows": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz",
+      "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+    },
+    "is-word-character": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz",
+      "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA=="
+    },
+    "is-wsl": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz",
+      "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0="
+    },
+    "is-yarn-global": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+      "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw=="
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+    },
+    "isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+    },
+    "jest-worker": {
+      "version": "26.6.2",
+      "resolved": "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz",
+      "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
+      "requires": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^7.0.0"
+      },
+      "dependencies": {
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
+      }
+    },
+    "joi": {
+      "version": "17.4.0",
+      "resolved": "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz",
+      "integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==",
+      "requires": {
+        "@hapi/hoek": "^9.0.0",
+        "@hapi/topo": "^5.0.0",
+        "@sideway/address": "^4.1.0",
+        "@sideway/formula": "^3.0.0",
+        "@sideway/pinpoint": "^2.0.0"
+      }
+    },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "js-yaml": {
+      "version": "3.14.1",
+      "resolved": "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz",
+      "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+      "requires": {
+        "argparse": "^1.0.7",
+        "esprima": "^4.0.0"
+      }
+    },
+    "jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
+    },
+    "json-buffer": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz",
+      "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg="
+    },
+    "json-parse-better-errors": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="
+    },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "json3": {
+      "version": "3.3.3",
+      "resolved": "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz",
+      "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA=="
+    },
+    "json5": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz",
+      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "jsonfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz",
+      "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+      "requires": {
+        "graceful-fs": "^4.1.6",
+        "universalify": "^2.0.0"
+      }
+    },
+    "keyv": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz",
+      "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+      "requires": {
+        "json-buffer": "3.0.0"
+      }
+    },
+    "killable": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz",
+      "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg=="
+    },
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+    },
+    "kleur": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz",
+      "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="
+    },
+    "klona": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz",
+      "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA=="
+    },
+    "last-call-webpack-plugin": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz",
+      "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==",
+      "requires": {
+        "lodash": "^4.17.5",
+        "webpack-sources": "^1.1.0"
+      }
+    },
+    "latest-version": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz",
+      "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+      "requires": {
+        "package-json": "^6.3.0"
+      }
+    },
+    "leven": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz",
+      "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+    },
+    "loader-runner": {
+      "version": "2.4.0",
+      "resolved": "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz",
+      "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="
+    },
+    "loader-utils": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz",
+      "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+      "requires": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      }
+    },
+    "locate-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz",
+      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+      "requires": {
+        "p-locate": "^3.0.0",
+        "path-exists": "^3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.21",
+      "resolved": "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz",
+      "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+    },
+    "lodash._reinterpolate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+      "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+    },
+    "lodash.assignin": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz",
+      "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI="
+    },
+    "lodash.bind": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz",
+      "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU="
+    },
+    "lodash.curry": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/lodash.curry/-/lodash.curry-4.1.1.tgz",
+      "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA="
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
+    },
+    "lodash.defaults": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+      "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
+    },
+    "lodash.filter": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz",
+      "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4="
+    },
+    "lodash.flatten": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+      "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
+    },
+    "lodash.flow": {
+      "version": "3.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.flow/-/lodash.flow-3.5.0.tgz",
+      "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o="
+    },
+    "lodash.foreach": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
+      "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM="
+    },
+    "lodash.map": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz",
+      "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM="
+    },
+    "lodash.memoize": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4="
+    },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+    },
+    "lodash.pick": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz",
+      "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM="
+    },
+    "lodash.reduce": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz",
+      "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs="
+    },
+    "lodash.reject": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz",
+      "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU="
+    },
+    "lodash.some": {
+      "version": "4.6.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz",
+      "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0="
+    },
+    "lodash.template": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz",
+      "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0",
+        "lodash.templatesettings": "^4.0.0"
+      }
+    },
+    "lodash.templatesettings": {
+      "version": "4.2.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+      "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+      "requires": {
+        "lodash._reinterpolate": "^3.0.0"
+      }
+    },
+    "lodash.toarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
+      "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE="
+    },
+    "lodash.uniq": {
+      "version": "4.5.0",
+      "resolved": "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M="
+    },
+    "loglevel": {
+      "version": "1.7.1",
+      "resolved": "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz",
+      "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw=="
+    },
+    "loose-envify": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz",
+      "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+      "requires": {
+        "js-tokens": "^3.0.0 || ^4.0.0"
+      }
+    },
+    "lower-case": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz",
+      "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+      "requires": {
+        "tslib": "^2.0.3"
+      }
+    },
+    "lowercase-keys": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+      "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA=="
+    },
+    "lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "lunr": {
+      "version": "2.3.9",
+      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
+      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="
+    },
+    "lunr-languages": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/lunr-languages/-/lunr-languages-1.4.0.tgz",
+      "integrity": "sha512-YWfZDExJN/MJEVE/DbM4AuVRLsqeHi+q3wmECMsWjGIOkd5mr9DUNos7fv8f5do9VLRMYXIzFjn+N4+KPI9pQA=="
+    },
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "requires": {
+        "semver": "^6.0.0"
+      }
+    },
+    "map-cache": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz",
+      "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+    },
+    "map-visit": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz",
+      "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+      "requires": {
+        "object-visit": "^1.0.0"
+      }
+    },
+    "markdown-escapes": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
+      "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg=="
+    },
+    "md5.js": {
+      "version": "1.3.5",
+      "resolved": "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz",
+      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "mdast-squeeze-paragraphs": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz",
+      "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==",
+      "requires": {
+        "unist-util-remove": "^2.0.0"
+      }
+    },
+    "mdast-util-definitions": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz",
+      "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==",
+      "requires": {
+        "unist-util-visit": "^2.0.0"
+      }
+    },
+    "mdast-util-to-hast": {
+      "version": "10.0.1",
+      "resolved": "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz",
+      "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==",
+      "requires": {
+        "@types/mdast": "^3.0.0",
+        "@types/unist": "^2.0.0",
+        "mdast-util-definitions": "^4.0.0",
+        "mdurl": "^1.0.0",
+        "unist-builder": "^2.0.0",
+        "unist-util-generated": "^1.0.0",
+        "unist-util-position": "^3.0.0",
+        "unist-util-visit": "^2.0.0"
+      }
+    },
+    "mdast-util-to-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w=="
+    },
+    "mdn-data": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz",
+      "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA=="
+    },
+    "mdurl": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz",
+      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
+    },
+    "media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+    },
+    "memory-fs": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz",
+      "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=",
+      "requires": {
+        "errno": "^0.1.3",
+        "readable-stream": "^2.0.1"
+      }
+    },
+    "merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "merge2": {
+      "version": "1.4.1",
+      "resolved": "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz",
+      "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+    },
+    "methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+    },
+    "microevent.ts": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/microevent.ts/-/microevent.ts-0.1.1.tgz",
+      "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g=="
+    },
+    "micromatch": {
+      "version": "3.1.10",
+      "resolved": "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz",
+      "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "braces": "^2.3.1",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "extglob": "^2.0.4",
+        "fragment-cache": "^0.2.1",
+        "kind-of": "^6.0.2",
+        "nanomatch": "^1.2.9",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.2"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "2.0.2",
+          "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz",
+          "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+          "requires": {
+            "is-descriptor": "^1.0.2",
+            "isobject": "^3.0.1"
+          }
+        },
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
+          }
+        },
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "miller-rabin": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz",
+      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+      "requires": {
+        "bn.js": "^4.0.0",
+        "brorand": "^1.0.1"
+      }
+    },
+    "mime": {
+      "version": "2.5.2",
+      "resolved": "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz",
+      "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg=="
+    },
+    "mime-db": {
+      "version": "1.46.0",
+      "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz",
+      "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ=="
+    },
+    "mime-types": {
+      "version": "2.1.29",
+      "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz",
+      "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==",
+      "requires": {
+        "mime-db": "1.46.0"
+      }
+    },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+    },
+    "mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+    },
+    "mini-create-react-context": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz",
+      "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==",
+      "requires": {
+        "@babel/runtime": "^7.12.1",
+        "tiny-warning": "^1.0.3"
+      }
+    },
+    "mini-css-extract-plugin": {
+      "version": "0.8.2",
+      "resolved": "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz",
+      "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==",
+      "requires": {
+        "loader-utils": "^1.1.0",
+        "normalize-url": "1.9.1",
+        "schema-utils": "^1.0.0",
+        "webpack-sources": "^1.1.0"
+      },
+      "dependencies": {
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        }
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "^1.1.7"
+      }
+    },
+    "minimist": {
+      "version": "1.2.5",
+      "resolved": "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz",
+      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+    },
+    "minipass": {
+      "version": "3.1.3",
+      "resolved": "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz",
+      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+      "requires": {
+        "yallist": "^4.0.0"
+      }
+    },
+    "minipass-collect": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz",
+      "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-flush": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz",
+      "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minipass-pipeline": {
+      "version": "1.2.4",
+      "resolved": "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
+      "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
+      "requires": {
+        "minipass": "^3.0.0"
+      }
+    },
+    "minizlib": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz",
+      "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+      "requires": {
+        "minipass": "^3.0.0",
+        "yallist": "^4.0.0"
+      }
+    },
+    "mississippi": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz",
+      "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==",
+      "requires": {
+        "concat-stream": "^1.5.0",
+        "duplexify": "^3.4.2",
+        "end-of-stream": "^1.1.0",
+        "flush-write-stream": "^1.0.0",
+        "from2": "^2.1.0",
+        "parallel-transform": "^1.1.0",
+        "pump": "^3.0.0",
+        "pumpify": "^1.3.3",
+        "stream-each": "^1.1.0",
+        "through2": "^2.0.0"
+      }
+    },
+    "mixin-deep": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz",
+      "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+      "requires": {
+        "for-in": "^1.0.2",
+        "is-extendable": "^1.0.1"
+      },
+      "dependencies": {
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "mkdirp": {
+      "version": "0.5.5",
+      "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz",
+      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
+      "requires": {
+        "minimist": "^1.2.5"
+      }
+    },
+    "module-alias": {
+      "version": "2.2.2",
+      "resolved": "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz",
+      "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q=="
+    },
+    "move-concurrently": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz",
+      "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=",
+      "requires": {
+        "aproba": "^1.1.1",
+        "copy-concurrently": "^1.0.0",
+        "fs-write-stream-atomic": "^1.0.8",
+        "mkdirp": "^0.5.1",
+        "rimraf": "^2.5.4",
+        "run-queue": "^1.0.3"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "multicast-dns": {
+      "version": "6.2.3",
+      "resolved": "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz",
+      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
+      "requires": {
+        "dns-packet": "^1.3.1",
+        "thunky": "^1.0.2"
+      }
+    },
+    "multicast-dns-service-types": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
+      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE="
+    },
+    "nan": {
+      "version": "2.14.2",
+      "resolved": "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz",
+      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
+      "optional": true
+    },
+    "nanoid": {
+      "version": "3.1.22",
+      "resolved": "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.22.tgz",
+      "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ=="
+    },
+    "nanomatch": {
+      "version": "1.2.13",
+      "resolved": "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz",
+      "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+      "requires": {
+        "arr-diff": "^4.0.0",
+        "array-unique": "^0.3.2",
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "fragment-cache": "^0.2.1",
+        "is-windows": "^1.0.2",
+        "kind-of": "^6.0.2",
+        "object.pick": "^1.3.0",
+        "regex-not": "^1.0.0",
+        "snapdragon": "^0.8.1",
+        "to-regex": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "2.0.2",
+          "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz",
+          "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+          "requires": {
+            "is-descriptor": "^1.0.2",
+            "isobject": "^3.0.1"
+          }
+        },
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
+          }
+        },
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "negotiator": {
+      "version": "0.6.2",
+      "resolved": "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz",
+      "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+    },
+    "neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "nice-try": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz",
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+    },
+    "no-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz",
+      "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+      "requires": {
+        "lower-case": "^2.0.2",
+        "tslib": "^2.0.3"
+      }
+    },
+    "node-emoji": {
+      "version": "1.10.0",
+      "resolved": "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.10.0.tgz",
+      "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==",
+      "requires": {
+        "lodash.toarray": "^4.4.0"
+      }
+    },
+    "node-fetch": {
+      "version": "2.6.1",
+      "resolved": "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz",
+      "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
+    },
+    "node-forge": {
+      "version": "0.10.0",
+      "resolved": "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz",
+      "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA=="
+    },
+    "node-libs-browser": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
+      "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
+      "requires": {
+        "assert": "^1.1.1",
+        "browserify-zlib": "^0.2.0",
+        "buffer": "^4.3.0",
+        "console-browserify": "^1.1.0",
+        "constants-browserify": "^1.0.0",
+        "crypto-browserify": "^3.11.0",
+        "domain-browser": "^1.1.1",
+        "events": "^3.0.0",
+        "https-browserify": "^1.0.0",
+        "os-browserify": "^0.3.0",
+        "path-browserify": "0.0.1",
+        "process": "^0.11.10",
+        "punycode": "^1.2.4",
+        "querystring-es3": "^0.2.0",
+        "readable-stream": "^2.3.3",
+        "stream-browserify": "^2.0.1",
+        "stream-http": "^2.7.2",
+        "string_decoder": "^1.0.0",
+        "timers-browserify": "^2.0.4",
+        "tty-browserify": "0.0.0",
+        "url": "^0.11.0",
+        "util": "^0.11.0",
+        "vm-browserify": "^1.0.1"
+      },
+      "dependencies": {
+        "events": {
+          "version": "3.3.0",
+          "resolved": "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz",
+          "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
+        }
+      }
+    },
+    "node-releases": {
+      "version": "1.1.71",
+      "resolved": "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz",
+      "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg=="
+    },
+    "nopt": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
+      "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
+      "requires": {
+        "abbrev": "1"
+      }
+    },
+    "normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="
+    },
+    "normalize-range": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz",
+      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI="
+    },
+    "normalize-url": {
+      "version": "1.9.1",
+      "resolved": "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz",
+      "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
+      "requires": {
+        "object-assign": "^4.0.1",
+        "prepend-http": "^1.0.0",
+        "query-string": "^4.1.0",
+        "sort-keys": "^1.0.0"
+      }
+    },
+    "not": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/not/-/not-0.1.0.tgz",
+      "integrity": "sha1-yWkcF0bFXc++VMvYvU/wQbwrUZ0="
+    },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "requires": {
+        "path-key": "^3.0.0"
+      },
+      "dependencies": {
+        "path-key": {
+          "version": "3.1.1",
+          "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz",
+          "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+        }
+      }
+    },
+    "nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E="
+    },
+    "nth-check": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz",
+      "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+      "requires": {
+        "boolbase": "~1.0.0"
+      }
+    },
+    "null-loader": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/null-loader/-/null-loader-4.0.1.tgz",
+      "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==",
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      }
+    },
+    "num2fraction": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz",
+      "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-copy": {
+      "version": "0.1.0",
+      "resolved": "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz",
+      "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+      "requires": {
+        "copy-descriptor": "^0.1.0",
+        "define-property": "^0.2.5",
+        "kind-of": "^3.0.3"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "object-inspect": {
+      "version": "1.9.0",
+      "resolved": "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz",
+      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
+    },
+    "object-is": {
+      "version": "1.1.5",
+      "resolved": "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz",
+      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "object-keys": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz",
+      "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="
+    },
+    "object-visit": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz",
+      "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+      "requires": {
+        "isobject": "^3.0.0"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "requires": {
+        "call-bind": "^1.0.0",
+        "define-properties": "^1.1.3",
+        "has-symbols": "^1.0.1",
+        "object-keys": "^1.1.1"
+      }
+    },
+    "object.getownpropertydescriptors": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
+      "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.2"
+      }
+    },
+    "object.pick": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz",
+      "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+      "requires": {
+        "isobject": "^3.0.1"
+      }
+    },
+    "object.values": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/object.values/-/object.values-1.1.3.tgz",
+      "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.2",
+        "has": "^1.0.3"
+      }
+    },
+    "obuf": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz",
+      "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg=="
+    },
+    "on-finished": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz",
+      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+      "requires": {
+        "ee-first": "1.1.1"
+      }
+    },
+    "on-headers": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz",
+      "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "requires": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "dependencies": {
+        "is-wsl": {
+          "version": "2.2.0",
+          "resolved": "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz",
+          "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+          "requires": {
+            "is-docker": "^2.0.0"
+          }
+        }
+      }
+    },
+    "opener": {
+      "version": "1.5.2",
+      "resolved": "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz",
+      "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="
+    },
+    "opn": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz",
+      "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+      "requires": {
+        "is-wsl": "^1.1.0"
+      }
+    },
+    "optimize-css-assets-webpack-plugin": {
+      "version": "5.0.4",
+      "resolved": "https://registry.yarnpkg.com/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.4.tgz",
+      "integrity": "sha512-wqd6FdI2a5/FdoiCNNkEvLeA//lHHfG24Ln2Xm2qqdIk4aOlsR18jwpyOihqQ8849W3qu2DX8fOYxpvTMj+93A==",
+      "requires": {
+        "cssnano": "^4.1.10",
+        "last-call-webpack-plugin": "^3.0.0"
+      }
+    },
+    "original": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz",
+      "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==",
+      "requires": {
+        "url-parse": "^1.4.3"
+      }
+    },
+    "os-browserify": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz",
+      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
+    },
+    "p-cancelable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz",
+      "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw=="
+    },
+    "p-finally": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz",
+      "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+    },
+    "p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "requires": {
+        "p-try": "^2.0.0"
+      }
+    },
+    "p-locate": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz",
+      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+      "requires": {
+        "p-limit": "^2.0.0"
+      }
+    },
+    "p-map": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz",
+      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+      "requires": {
+        "aggregate-error": "^3.0.0"
+      }
+    },
+    "p-retry": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz",
+      "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==",
+      "requires": {
+        "retry": "^0.12.0"
+      }
+    },
+    "p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
+    },
+    "package-json": {
+      "version": "6.5.0",
+      "resolved": "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz",
+      "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+      "requires": {
+        "got": "^9.6.0",
+        "registry-auth-token": "^4.0.0",
+        "registry-url": "^5.0.0",
+        "semver": "^6.2.0"
+      }
+    },
+    "pako": {
+      "version": "1.0.11",
+      "resolved": "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz",
+      "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
+    },
+    "parallel-transform": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz",
+      "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==",
+      "requires": {
+        "cyclist": "^1.0.1",
+        "inherits": "^2.0.3",
+        "readable-stream": "^2.1.5"
+      }
+    },
+    "param-case": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz",
+      "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+      "requires": {
+        "dot-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "parent-module": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz",
+      "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+      "requires": {
+        "callsites": "^3.0.0"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.6",
+      "resolved": "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz",
+      "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
+      "requires": {
+        "asn1.js": "^5.2.0",
+        "browserify-aes": "^1.0.0",
+        "evp_bytestokey": "^1.0.0",
+        "pbkdf2": "^3.0.3",
+        "safe-buffer": "^5.1.1"
+      }
+    },
+    "parse-entities": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/parse-entities/-/parse-entities-2.0.0.tgz",
+      "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+      "requires": {
+        "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-json": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+      "requires": {
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
+      }
+    },
+    "parse-numeric-range": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz",
+      "integrity": "sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg=="
+    },
+    "parse5": {
+      "version": "6.0.1",
+      "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz",
+      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
+    },
+    "parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+    },
+    "pascal-case": {
+      "version": "3.1.2",
+      "resolved": "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz",
+      "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+      "requires": {
+        "no-case": "^3.0.4",
+        "tslib": "^2.0.3"
+      }
+    },
+    "pascalcase": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz",
+      "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+    },
+    "path-browserify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz",
+      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
+    },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA="
+    },
+    "path-exists": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz",
+      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-is-inside": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz",
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
+    },
+    "path-key": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz",
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+    },
+    "path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+    },
+    "path-type": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz",
+      "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+    },
+    "pbkdf2": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz",
+      "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==",
+      "requires": {
+        "create-hash": "^1.1.2",
+        "create-hmac": "^1.1.4",
+        "ripemd160": "^2.0.1",
+        "safe-buffer": "^5.0.1",
+        "sha.js": "^2.4.8"
+      }
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg=="
+    },
+    "pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="
+    },
+    "pinkie": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz",
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+    },
+    "pinkie-promise": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+      "requires": {
+        "pinkie": "^2.0.0"
+      }
+    },
+    "pkg-dir": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz",
+      "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
+      "requires": {
+        "find-up": "^3.0.0"
+      }
+    },
+    "pkg-up": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz",
+      "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==",
+      "requires": {
+        "find-up": "^3.0.0"
+      }
+    },
+    "pnp-webpack-plugin": {
+      "version": "1.6.4",
+      "resolved": "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
+      "integrity": "sha512-7Wjy+9E3WwLOEL30D+m8TSTF7qJJUJLONBnwQp0518siuMxUQUbgZwssaFX+QKlZkjHZcw/IpZCt/H0srrntSg==",
+      "requires": {
+        "ts-pnp": "^1.1.6"
+      }
+    },
+    "portfinder": {
+      "version": "1.0.28",
+      "resolved": "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz",
+      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
+      "requires": {
+        "async": "^2.6.2",
+        "debug": "^3.1.1",
+        "mkdirp": "^0.5.5"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+        }
+      }
+    },
+    "posix-character-classes": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+      "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+    },
+    "postcss": {
+      "version": "7.0.35",
+      "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-7.0.35.tgz",
+      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+      "requires": {
+        "chalk": "^2.4.2",
+        "source-map": "^0.6.1",
+        "supports-color": "^6.1.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "5.5.0",
+              "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-attribute-case-insensitive": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
+      "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^6.0.2"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+          "requires": {
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
+          }
+        }
+      }
+    },
+    "postcss-calc": {
+      "version": "7.0.5",
+      "resolved": "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz",
+      "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+      "requires": {
+        "postcss": "^7.0.27",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.0.2"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+          "requires": {
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+          "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ=="
+        }
+      }
+    },
+    "postcss-color-functional-notation": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz",
+      "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-color-gray": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz",
+      "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==",
+      "requires": {
+        "@csstools/convert-colors": "^1.4.0",
+        "postcss": "^7.0.5",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-color-hex-alpha": {
+      "version": "5.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
+      "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
+      "requires": {
+        "postcss": "^7.0.14",
+        "postcss-values-parser": "^2.0.1"
+      }
+    },
+    "postcss-color-mod-function": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz",
+      "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==",
+      "requires": {
+        "@csstools/convert-colors": "^1.4.0",
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-color-rebeccapurple": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz",
+      "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-colormin": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
+      "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+      "requires": {
+        "browserslist": "^4.0.0",
+        "color": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-convert-values": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
+      "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-custom-media": {
+      "version": "7.0.8",
+      "resolved": "https://registry.yarnpkg.com/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
+      "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+      "requires": {
+        "postcss": "^7.0.14"
+      }
+    },
+    "postcss-custom-properties": {
+      "version": "8.0.11",
+      "resolved": "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
+      "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
+      "requires": {
+        "postcss": "^7.0.17",
+        "postcss-values-parser": "^2.0.1"
+      }
+    },
+    "postcss-custom-selectors": {
+      "version": "5.1.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz",
+      "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+        },
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+          "requires": {
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-dir-pseudo-class": {
+      "version": "5.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz",
+      "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+        },
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+          "requires": {
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-discard-comments": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
+      "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-discard-unused": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz",
+      "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==",
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-double-position-gradients": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
+      "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
+      "requires": {
+        "postcss": "^7.0.5",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-env-function": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
+      "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-focus-visible": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
+      "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-focus-within": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
+      "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-font-variant": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz",
+      "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-gap-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
+      "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-image-set-function": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
+      "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-initial": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-initial/-/postcss-initial-3.0.2.tgz",
+      "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
+      "requires": {
+        "lodash.template": "^4.5.0",
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-lab-function": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
+      "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
+      "requires": {
+        "@csstools/convert-colors": "^1.4.0",
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-logical": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz",
+      "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-media-minmax": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
+      "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-merge-idents": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz",
+      "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==",
+      "requires": {
+        "cssnano-util-same-parent": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+      "requires": {
+        "css-color-names": "0.0.4",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "stylehacks": "^4.0.0"
+      }
+    },
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      }
+    },
+    "postcss-nesting": {
+      "version": "7.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
+      "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "requires": {
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "is-absolute-url": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
+          "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY="
+        },
+        "normalize-url": {
+          "version": "3.3.0",
+          "resolved": "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz",
+          "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg=="
+        }
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-overflow-shorthand": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
+      "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-page-break": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
+      "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-place": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-place/-/postcss-place-4.0.1.tgz",
+      "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      }
+    },
+    "postcss-preset-env": {
+      "version": "6.7.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
+      "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
+      "requires": {
+        "autoprefixer": "^9.6.1",
+        "browserslist": "^4.6.4",
+        "caniuse-lite": "^1.0.30000981",
+        "css-blank-pseudo": "^0.1.4",
+        "css-has-pseudo": "^0.10.0",
+        "css-prefers-color-scheme": "^3.1.1",
+        "cssdb": "^4.4.0",
+        "postcss": "^7.0.17",
+        "postcss-attribute-case-insensitive": "^4.0.1",
+        "postcss-color-functional-notation": "^2.0.1",
+        "postcss-color-gray": "^5.0.0",
+        "postcss-color-hex-alpha": "^5.0.3",
+        "postcss-color-mod-function": "^3.0.3",
+        "postcss-color-rebeccapurple": "^4.0.1",
+        "postcss-custom-media": "^7.0.8",
+        "postcss-custom-properties": "^8.0.11",
+        "postcss-custom-selectors": "^5.1.2",
+        "postcss-dir-pseudo-class": "^5.0.0",
+        "postcss-double-position-gradients": "^1.0.0",
+        "postcss-env-function": "^2.0.2",
+        "postcss-focus-visible": "^4.0.0",
+        "postcss-focus-within": "^3.0.0",
+        "postcss-font-variant": "^4.0.0",
+        "postcss-gap-properties": "^2.0.0",
+        "postcss-image-set-function": "^3.0.1",
+        "postcss-initial": "^3.0.0",
+        "postcss-lab-function": "^2.0.1",
+        "postcss-logical": "^3.0.0",
+        "postcss-media-minmax": "^4.0.0",
+        "postcss-nesting": "^7.0.0",
+        "postcss-overflow-shorthand": "^2.0.0",
+        "postcss-page-break": "^2.0.0",
+        "postcss-place": "^4.0.1",
+        "postcss-pseudo-class-any-link": "^6.0.0",
+        "postcss-replace-overflow-wrap": "^3.0.0",
+        "postcss-selector-matches": "^4.0.0",
+        "postcss-selector-not": "^4.0.0"
+      }
+    },
+    "postcss-pseudo-class-any-link": {
+      "version": "6.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
+      "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "dependencies": {
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg=="
+        },
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+          "requires": {
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        }
+      }
+    },
+    "postcss-reduce-idents": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz",
+      "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==",
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      }
+    },
+    "postcss-replace-overflow-wrap": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
+      "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+      "requires": {
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-selector-matches": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
+      "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-selector-not": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz",
+      "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==",
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "postcss": "^7.0.2"
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "3.1.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+      "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+      "requires": {
+        "dot-prop": "^5.2.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "postcss-sort-media-queries": {
+      "version": "1.31.21",
+      "resolved": "https://registry.yarnpkg.com/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz",
+      "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==",
+      "requires": {
+        "postcss": "^7.0.27",
+        "sort-css-media-queries": "1.5.0"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "requires": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      }
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "postcss-value-parser": {
+      "version": "3.3.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+      "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ=="
+    },
+    "postcss-values-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
+      "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
+      "requires": {
+        "flatten": "^1.0.2",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "postcss-zindex": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-4.0.1.tgz",
+      "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==",
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      }
+    },
+    "prepend-http": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz",
+      "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw="
+    },
+    "pretty-error": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.2.tgz",
+      "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==",
+      "requires": {
+        "lodash": "^4.17.20",
+        "renderkid": "^2.0.4"
+      }
+    },
+    "pretty-time": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz",
+      "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA=="
+    },
+    "prism-react-renderer": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.2.0.tgz",
+      "integrity": "sha512-GHqzxLYImx1iKN1jJURcuRoA/0ygCcNhfGw1IT8nPIMzarmKQ3Nc+JcG0gi8JXQzuh0C5ShE4npMIoqNin40hg==",
+      "requires": {}
+    },
+    "prismjs": {
+      "version": "1.23.0",
+      "resolved": "https://registry.yarnpkg.com/prismjs/-/prismjs-1.23.0.tgz",
+      "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==",
+      "requires": {
+        "clipboard": "^2.0.0"
+      }
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "promise": {
+      "version": "7.3.1",
+      "resolved": "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz",
+      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+      "requires": {
+        "asap": "~2.0.3"
+      }
+    },
+    "promise-inflight": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz",
+      "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
+    },
+    "prompts": {
+      "version": "2.4.0",
+      "resolved": "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz",
+      "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==",
+      "requires": {
+        "kleur": "^3.0.3",
+        "sisteransi": "^1.0.5"
+      }
+    },
+    "prop-types": {
+      "version": "15.7.2",
+      "resolved": "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz",
+      "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+      "requires": {
+        "loose-envify": "^1.4.0",
+        "object-assign": "^4.1.1",
+        "react-is": "^16.8.1"
+      }
+    },
+    "property-information": {
+      "version": "5.6.0",
+      "resolved": "https://registry.yarnpkg.com/property-information/-/property-information-5.6.0.tgz",
+      "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+      "requires": {
+        "xtend": "^4.0.0"
+      }
+    },
+    "proxy-addr": {
+      "version": "2.0.6",
+      "resolved": "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz",
+      "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
+      "requires": {
+        "forwarded": "~0.1.2",
+        "ipaddr.js": "1.9.1"
+      }
+    },
+    "prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY="
+    },
+    "public-encrypt": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz",
+      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+      "requires": {
+        "bn.js": "^4.1.0",
+        "browserify-rsa": "^4.0.0",
+        "create-hash": "^1.1.0",
+        "parse-asn1": "^5.0.0",
+        "randombytes": "^2.0.1",
+        "safe-buffer": "^5.1.2"
+      }
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "pumpify": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz",
+      "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+      "requires": {
+        "duplexify": "^3.6.0",
+        "inherits": "^2.0.3",
+        "pump": "^2.0.0"
+      },
+      "dependencies": {
+        "pump": {
+          "version": "2.0.1",
+          "resolved": "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz",
+          "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+          "requires": {
+            "end-of-stream": "^1.1.0",
+            "once": "^1.3.1"
+          }
+        }
+      }
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+    },
+    "pupa": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz",
+      "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==",
+      "requires": {
+        "escape-goat": "^2.0.0"
+      }
+    },
+    "pure-color": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/pure-color/-/pure-color-1.3.0.tgz",
+      "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4="
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc="
+    },
+    "qs": {
+      "version": "6.7.0",
+      "resolved": "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz",
+      "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+    },
+    "query-string": {
+      "version": "4.3.4",
+      "resolved": "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz",
+      "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
+      "requires": {
+        "object-assign": "^4.1.0",
+        "strict-uri-encode": "^1.0.0"
+      }
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+    },
+    "querystringify": {
+      "version": "2.2.0",
+      "resolved": "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz",
+      "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ=="
+    },
+    "queue-microtask": {
+      "version": "1.2.2",
+      "resolved": "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz",
+      "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg=="
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "randomfill": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz",
+      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+      "requires": {
+        "randombytes": "^2.0.5",
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+    },
+    "raw-body": {
+      "version": "2.4.0",
+      "resolved": "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz",
+      "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+      "requires": {
+        "bytes": "3.1.0",
+        "http-errors": "1.7.2",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "dependencies": {
+        "bytes": {
+          "version": "3.1.0",
+          "resolved": "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz",
+          "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+        }
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      }
+    },
+    "react": {
+      "version": "17.0.1",
+      "resolved": "https://registry.yarnpkg.com/react/-/react-17.0.1.tgz",
+      "integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "react-base16-styling": {
+      "version": "0.6.0",
+      "resolved": "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.6.0.tgz",
+      "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=",
+      "requires": {
+        "base16": "^1.0.0",
+        "lodash.curry": "^4.0.1",
+        "lodash.flow": "^3.3.0",
+        "pure-color": "^1.2.0"
+      }
+    },
+    "react-dev-utils": {
+      "version": "11.0.4",
+      "resolved": "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-11.0.4.tgz",
+      "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==",
+      "requires": {
+        "@babel/code-frame": "7.10.4",
+        "address": "1.1.2",
+        "browserslist": "4.14.2",
+        "chalk": "2.4.2",
+        "cross-spawn": "7.0.3",
+        "detect-port-alt": "1.1.6",
+        "escape-string-regexp": "2.0.0",
+        "filesize": "6.1.0",
+        "find-up": "4.1.0",
+        "fork-ts-checker-webpack-plugin": "4.1.6",
+        "global-modules": "2.0.0",
+        "globby": "11.0.1",
+        "gzip-size": "5.1.1",
+        "immer": "8.0.1",
+        "is-root": "2.1.0",
+        "loader-utils": "2.0.0",
+        "open": "^7.0.2",
+        "pkg-up": "3.1.0",
+        "prompts": "2.4.0",
+        "react-error-overlay": "^6.0.9",
+        "recursive-readdir": "2.2.2",
+        "shell-quote": "1.7.2",
+        "strip-ansi": "6.0.0",
+        "text-table": "0.2.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.4",
+          "resolved": "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "browserslist": {
+          "version": "4.14.2",
+          "resolved": "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.2.tgz",
+          "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==",
+          "requires": {
+            "caniuse-lite": "^1.0.30001125",
+            "electron-to-chromium": "^1.3.564",
+            "escalade": "^3.0.2",
+            "node-releases": "^1.1.61"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          },
+          "dependencies": {
+            "escape-string-regexp": {
+              "version": "1.0.5",
+              "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+              "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+            }
+          }
+        },
+        "escape-string-regexp": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+          "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="
+        },
+        "find-up": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+          "requires": {
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
+          }
+        },
+        "globby": {
+          "version": "11.0.1",
+          "resolved": "https://registry.yarnpkg.com/globby/-/globby-11.0.1.tgz",
+          "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==",
+          "requires": {
+            "array-union": "^2.1.0",
+            "dir-glob": "^3.0.1",
+            "fast-glob": "^3.1.1",
+            "ignore": "^5.1.4",
+            "merge2": "^1.3.0",
+            "slash": "^3.0.0"
+          }
+        },
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+          "requires": {
+            "p-locate": "^4.1.0"
+          }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "react-dom": {
+      "version": "17.0.1",
+      "resolved": "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.1.tgz",
+      "integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1",
+        "scheduler": "^0.20.1"
+      }
+    },
+    "react-error-overlay": {
+      "version": "6.0.9",
+      "resolved": "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.9.tgz",
+      "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew=="
+    },
+    "react-fast-compare": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz",
+      "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA=="
+    },
+    "react-helmet": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/react-helmet/-/react-helmet-6.1.0.tgz",
+      "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==",
+      "requires": {
+        "object-assign": "^4.1.1",
+        "prop-types": "^15.7.2",
+        "react-fast-compare": "^3.1.1",
+        "react-side-effect": "^2.1.0"
+      }
+    },
+    "react-is": {
+      "version": "16.13.1",
+      "resolved": "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz",
+      "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+    },
+    "react-json-view": {
+      "version": "1.21.3",
+      "resolved": "https://registry.yarnpkg.com/react-json-view/-/react-json-view-1.21.3.tgz",
+      "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==",
+      "requires": {
+        "flux": "^4.0.1",
+        "react-base16-styling": "^0.6.0",
+        "react-lifecycles-compat": "^3.0.4",
+        "react-textarea-autosize": "^8.3.2"
+      }
+    },
+    "react-lifecycles-compat": {
+      "version": "3.0.4",
+      "resolved": "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
+      "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
+    },
+    "react-loadable": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/react-loadable/-/react-loadable-5.5.0.tgz",
+      "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==",
+      "requires": {
+        "prop-types": "^15.5.0"
+      }
+    },
+    "react-loadable-ssr-addon": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz",
+      "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==",
+      "requires": {
+        "@babel/runtime": "^7.10.3"
+      }
+    },
+    "react-router": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz",
+      "integrity": "sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==",
+      "requires": {
+        "@babel/runtime": "^7.1.2",
+        "history": "^4.9.0",
+        "hoist-non-react-statics": "^3.1.0",
+        "loose-envify": "^1.3.1",
+        "mini-create-react-context": "^0.4.0",
+        "path-to-regexp": "^1.7.0",
+        "prop-types": "^15.6.2",
+        "react-is": "^16.6.0",
+        "tiny-invariant": "^1.0.2",
+        "tiny-warning": "^1.0.0"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "0.0.1",
+          "resolved": "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz",
+          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+        },
+        "path-to-regexp": {
+          "version": "1.8.0",
+          "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+          "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+          "requires": {
+            "isarray": "0.0.1"
+          }
+        }
+      }
+    },
+    "react-router-config": {
+      "version": "5.1.1",
+      "resolved": "https://registry.yarnpkg.com/react-router-config/-/react-router-config-5.1.1.tgz",
+      "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==",
+      "requires": {
+        "@babel/runtime": "^7.1.2"
+      }
+    },
+    "react-router-dom": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz",
+      "integrity": "sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==",
+      "requires": {
+        "@babel/runtime": "^7.1.2",
+        "history": "^4.9.0",
+        "loose-envify": "^1.3.1",
+        "prop-types": "^15.6.2",
+        "react-router": "5.2.0",
+        "tiny-invariant": "^1.0.2",
+        "tiny-warning": "^1.0.0"
+      }
+    },
+    "react-side-effect": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/react-side-effect/-/react-side-effect-2.1.1.tgz",
+      "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==",
+      "requires": {}
+    },
+    "react-textarea-autosize": {
+      "version": "8.3.2",
+      "resolved": "https://registry.yarnpkg.com/react-textarea-autosize/-/react-textarea-autosize-8.3.2.tgz",
+      "integrity": "sha512-JrMWVgQSaExQByP3ggI1eA8zF4mF0+ddVuX7acUeK2V7bmrpjVOY72vmLz2IXFJSAXoY3D80nEzrn0GWajWK3Q==",
+      "requires": {
+        "@babel/runtime": "^7.10.2",
+        "use-composed-ref": "^1.0.0",
+        "use-latest": "^1.0.0"
+      }
+    },
+    "react-toggle": {
+      "version": "4.1.2",
+      "resolved": "https://registry.yarnpkg.com/react-toggle/-/react-toggle-4.1.2.tgz",
+      "integrity": "sha512-4Ohw31TuYQdhWfA6qlKafeXx3IOH7t4ZHhmRdwsm1fQREwOBGxJT+I22sgHqR/w8JRdk+AeMCJXPImEFSrNXow==",
+      "requires": {
+        "classnames": "^2.2.5"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz",
+      "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      },
+      "dependencies": {
+        "safe-buffer": {
+          "version": "5.1.2",
+          "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz",
+          "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+        },
+        "string_decoder": {
+          "version": "1.1.1",
+          "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz",
+          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+          "requires": {
+            "safe-buffer": "~5.1.0"
+          }
+        }
+      }
+    },
+    "readdirp": {
+      "version": "2.2.1",
+      "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz",
+      "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+      "requires": {
+        "graceful-fs": "^4.1.11",
+        "micromatch": "^3.1.10",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "reading-time": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/reading-time/-/reading-time-1.3.0.tgz",
+      "integrity": "sha512-RJ8J5O6UvrclfZpcPSPuKusrdRfoY7uXXoYOOdeswZNtSkQaewT3919yz6RyloDBR+iwcUyz5zGOUjhgvfuv3g=="
+    },
+    "rechoir": {
+      "version": "0.6.2",
+      "resolved": "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz",
+      "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
+      "requires": {
+        "resolve": "^1.1.6"
+      }
+    },
+    "recursive-readdir": {
+      "version": "2.2.2",
+      "resolved": "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz",
+      "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==",
+      "requires": {
+        "minimatch": "3.0.4"
+      }
+    },
+    "regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+      "requires": {
+        "regenerate": "^1.4.0"
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.13.7",
+      "resolved": "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+    },
+    "regenerator-transform": {
+      "version": "0.14.5",
+      "resolved": "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+      "requires": {
+        "@babel/runtime": "^7.8.4"
+      }
+    },
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "requires": {
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
+          }
+        },
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "regexp.prototype.flags": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "regexpu-core": {
+      "version": "4.7.1",
+      "resolved": "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz",
+      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+      "requires": {
+        "regenerate": "^1.4.0",
+        "regenerate-unicode-properties": "^8.2.0",
+        "regjsgen": "^0.5.1",
+        "regjsparser": "^0.6.4",
+        "unicode-match-property-ecmascript": "^1.0.4",
+        "unicode-match-property-value-ecmascript": "^1.2.0"
+      }
+    },
+    "registry-auth-token": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "registry-url": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz",
+      "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+      "requires": {
+        "rc": "^1.2.8"
+      }
+    },
+    "regjsgen": {
+      "version": "0.5.2",
+      "resolved": "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A=="
+    },
+    "regjsparser": {
+      "version": "0.6.7",
+      "resolved": "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz",
+      "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==",
+      "requires": {
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0="
+        }
+      }
+    },
+    "rehype-parse": {
+      "version": "6.0.2",
+      "resolved": "https://registry.yarnpkg.com/rehype-parse/-/rehype-parse-6.0.2.tgz",
+      "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==",
+      "requires": {
+        "hast-util-from-parse5": "^5.0.0",
+        "parse5": "^5.0.0",
+        "xtend": "^4.0.0"
+      },
+      "dependencies": {
+        "parse5": {
+          "version": "5.1.1",
+          "resolved": "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz",
+          "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug=="
+        }
+      }
+    },
+    "relateurl": {
+      "version": "0.2.7",
+      "resolved": "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz",
+      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk="
+    },
+    "remark-admonitions": {
+      "version": "1.2.1",
+      "resolved": "https://registry.yarnpkg.com/remark-admonitions/-/remark-admonitions-1.2.1.tgz",
+      "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==",
+      "requires": {
+        "rehype-parse": "^6.0.2",
+        "unified": "^8.4.2",
+        "unist-util-visit": "^2.0.1"
+      },
+      "dependencies": {
+        "unified": {
+          "version": "8.4.2",
+          "resolved": "https://registry.yarnpkg.com/unified/-/unified-8.4.2.tgz",
+          "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==",
+          "requires": {
+            "bail": "^1.0.0",
+            "extend": "^3.0.0",
+            "is-plain-obj": "^2.0.0",
+            "trough": "^1.0.0",
+            "vfile": "^4.0.0"
+          }
+        }
+      }
+    },
+    "remark-emoji": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/remark-emoji/-/remark-emoji-2.1.0.tgz",
+      "integrity": "sha512-lDddGsxXURV01WS9WAiS9rO/cedO1pvr9tahtLhr6qCGFhHG4yZSJW3Ha4Nw9Uk1hLNmUBtPC0+m45Ms+xEitg==",
+      "requires": {
+        "emoticon": "^3.2.0",
+        "node-emoji": "^1.10.0",
+        "unist-util-visit": "^2.0.2"
+      }
+    },
+    "remark-footnotes": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz",
+      "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ=="
+    },
+    "remark-mdx": {
+      "version": "1.6.22",
+      "resolved": "https://registry.yarnpkg.com/remark-mdx/-/remark-mdx-1.6.22.tgz",
+      "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==",
+      "requires": {
+        "@babel/core": "7.12.9",
+        "@babel/helper-plugin-utils": "7.10.4",
+        "@babel/plugin-proposal-object-rest-spread": "7.12.1",
+        "@babel/plugin-syntax-jsx": "7.12.1",
+        "@mdx-js/util": "1.6.22",
+        "is-alphabetical": "1.0.4",
+        "remark-parse": "8.0.3",
+        "unified": "9.2.0"
+      },
+      "dependencies": {
+        "@babel/core": {
+          "version": "7.12.9",
+          "resolved": "https://registry.yarnpkg.com/@babel/core/-/core-7.12.9.tgz",
+          "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==",
+          "requires": {
+            "@babel/code-frame": "^7.10.4",
+            "@babel/generator": "^7.12.5",
+            "@babel/helper-module-transforms": "^7.12.1",
+            "@babel/helpers": "^7.12.5",
+            "@babel/parser": "^7.12.7",
+            "@babel/template": "^7.12.7",
+            "@babel/traverse": "^7.12.9",
+            "@babel/types": "^7.12.7",
+            "convert-source-map": "^1.7.0",
+            "debug": "^4.1.0",
+            "gensync": "^1.0.0-beta.1",
+            "json5": "^2.1.2",
+            "lodash": "^4.17.19",
+            "resolve": "^1.3.2",
+            "semver": "^5.4.1",
+            "source-map": "^0.5.0"
+          }
+        },
+        "@babel/helper-plugin-utils": {
+          "version": "7.10.4",
+          "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
+          "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg=="
+        },
+        "@babel/plugin-proposal-object-rest-spread": {
+          "version": "7.12.1",
+          "resolved": "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
+          "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+          "requires": {
+            "@babel/helper-plugin-utils": "^7.10.4",
+            "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
+            "@babel/plugin-transform-parameters": "^7.12.1"
+          },
+          "dependencies": {
+            "@babel/helper-plugin-utils": {
+              "version": "7.13.0",
+              "resolved": "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
+              "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ=="
+            }
+          }
+        },
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        },
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "remark-parse": {
+      "version": "8.0.3",
+      "resolved": "https://registry.yarnpkg.com/remark-parse/-/remark-parse-8.0.3.tgz",
+      "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
+      "requires": {
+        "ccount": "^1.0.0",
+        "collapse-white-space": "^1.0.2",
+        "is-alphabetical": "^1.0.0",
+        "is-decimal": "^1.0.0",
+        "is-whitespace-character": "^1.0.0",
+        "is-word-character": "^1.0.0",
+        "markdown-escapes": "^1.0.0",
+        "parse-entities": "^2.0.0",
+        "repeat-string": "^1.5.4",
+        "state-toggle": "^1.0.0",
+        "trim": "0.0.1",
+        "trim-trailing-lines": "^1.0.0",
+        "unherit": "^1.0.4",
+        "unist-util-remove-position": "^2.0.0",
+        "vfile-location": "^3.0.0",
+        "xtend": "^4.0.1"
+      }
+    },
+    "remark-squeeze-paragraphs": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz",
+      "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==",
+      "requires": {
+        "mdast-squeeze-paragraphs": "^4.0.0"
+      }
+    },
+    "remove-trailing-separator": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+      "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8="
+    },
+    "renderkid": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.5.tgz",
+      "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==",
+      "requires": {
+        "css-select": "^2.0.2",
+        "dom-converter": "^0.2",
+        "htmlparser2": "^3.10.1",
+        "lodash": "^4.17.20",
+        "strip-ansi": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
+      }
+    },
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
+    },
+    "require-like": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/require-like/-/require-like-0.1.2.tgz",
+      "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o="
+    },
+    "require-main-filename": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz",
+      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+    },
+    "requires-port": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz",
+      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
+    },
+    "resolve": {
+      "version": "1.20.0",
+      "resolved": "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz",
+      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "requires": {
+        "is-core-module": "^2.2.0",
+        "path-parse": "^1.0.6"
+      }
+    },
+    "resolve-cwd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
+      "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
+      "requires": {
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g="
+    },
+    "resolve-pathname": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz",
+      "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng=="
+    },
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+    },
+    "responselike": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz",
+      "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+      "requires": {
+        "lowercase-keys": "^1.0.0"
+      }
+    },
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+    },
+    "retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
+    },
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+    },
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE="
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM="
+    },
+    "rimraf": {
+      "version": "2.7.1",
+      "resolved": "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz",
+      "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+      "requires": {
+        "glob": "^7.1.3"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz",
+      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+      "requires": {
+        "hash-base": "^3.0.0",
+        "inherits": "^2.0.1"
+      }
+    },
+    "rtlcss": {
+      "version": "2.6.2",
+      "resolved": "https://registry.yarnpkg.com/rtlcss/-/rtlcss-2.6.2.tgz",
+      "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==",
+      "requires": {
+        "@choojs/findup": "^0.2.1",
+        "chalk": "^2.4.2",
+        "mkdirp": "^0.5.1",
+        "postcss": "^6.0.23",
+        "strip-json-comments": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "postcss": {
+          "version": "6.0.23",
+          "resolved": "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        }
+      }
+    },
+    "run-parallel": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz",
+      "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+      "requires": {
+        "queue-microtask": "^1.2.2"
+      }
+    },
+    "run-queue": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz",
+      "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=",
+      "requires": {
+        "aproba": "^1.1.1"
+      }
+    },
+    "rxjs": {
+      "version": "6.6.6",
+      "resolved": "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz",
+      "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==",
+      "requires": {
+        "tslib": "^1.9.0"
+      },
+      "dependencies": {
+        "tslib": {
+          "version": "1.14.1",
+          "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz",
+          "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+        }
+      }
+    },
+    "safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+    },
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "requires": {
+        "ret": "~0.1.10"
+      }
+    },
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    },
+    "scheduler": {
+      "version": "0.20.1",
+      "resolved": "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.1.tgz",
+      "integrity": "sha512-LKTe+2xNJBNxu/QhHvDR14wUXHRQbVY5ZOYpOGWRzhydZUqrLb2JBvLPY7cAqFmqrWuDED0Mjk7013SZiOz6Bw==",
+      "requires": {
+        "loose-envify": "^1.1.0",
+        "object-assign": "^4.1.1"
+      }
+    },
+    "schema-utils": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz",
+      "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
+      "requires": {
+        "@types/json-schema": "^7.0.6",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      }
+    },
+    "section-matter": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/section-matter/-/section-matter-1.0.0.tgz",
+      "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "kind-of": "^6.0.0"
+      }
+    },
+    "select": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz",
+      "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=",
+      "optional": true
+    },
+    "select-hose": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz",
+      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo="
+    },
+    "selfsigned": {
+      "version": "1.10.8",
+      "resolved": "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz",
+      "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==",
+      "requires": {
+        "node-forge": "^0.10.0"
+      }
+    },
+    "semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+    },
+    "semver-diff": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz",
+      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+      "requires": {
+        "semver": "^6.3.0"
+      }
+    },
+    "send": {
+      "version": "0.17.1",
+      "resolved": "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz",
+      "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+      "requires": {
+        "debug": "2.6.9",
+        "depd": "~1.1.2",
+        "destroy": "~1.0.4",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "~1.7.2",
+        "mime": "1.6.0",
+        "ms": "2.1.1",
+        "on-finished": "~2.3.0",
+        "range-parser": "~1.2.1",
+        "statuses": "~1.5.0"
+      },
+      "dependencies": {
+        "http-errors": {
+          "version": "1.7.3",
+          "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz",
+          "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.4",
+            "setprototypeof": "1.1.1",
+            "statuses": ">= 1.5.0 < 2",
+            "toidentifier": "1.0.0"
+          }
+        },
+        "mime": {
+          "version": "1.6.0",
+          "resolved": "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz",
+          "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+        }
+      }
+    },
+    "serialize-javascript": {
+      "version": "5.0.1",
+      "resolved": "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
+      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
+      "requires": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "serve-handler": {
+      "version": "6.1.3",
+      "resolved": "https://registry.yarnpkg.com/serve-handler/-/serve-handler-6.1.3.tgz",
+      "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==",
+      "requires": {
+        "bytes": "3.0.0",
+        "content-disposition": "0.5.2",
+        "fast-url-parser": "1.1.3",
+        "mime-types": "2.1.18",
+        "minimatch": "3.0.4",
+        "path-is-inside": "1.0.2",
+        "path-to-regexp": "2.2.1",
+        "range-parser": "1.2.0"
+      },
+      "dependencies": {
+        "mime-db": {
+          "version": "1.33.0",
+          "resolved": "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz",
+          "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
+        },
+        "mime-types": {
+          "version": "2.1.18",
+          "resolved": "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz",
+          "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+          "requires": {
+            "mime-db": "~1.33.0"
+          }
+        },
+        "path-to-regexp": {
+          "version": "2.2.1",
+          "resolved": "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz",
+          "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ=="
+        },
+        "range-parser": {
+          "version": "1.2.0",
+          "resolved": "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz",
+          "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
+        }
+      }
+    },
+    "serve-index": {
+      "version": "1.9.1",
+      "resolved": "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz",
+      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
+      "requires": {
+        "accepts": "~1.3.4",
+        "batch": "0.6.1",
+        "debug": "2.6.9",
+        "escape-html": "~1.0.3",
+        "http-errors": "~1.6.2",
+        "mime-types": "~2.1.17",
+        "parseurl": "~1.3.2"
+      },
+      "dependencies": {
+        "http-errors": {
+          "version": "1.6.3",
+          "resolved": "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz",
+          "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+          "requires": {
+            "depd": "~1.1.2",
+            "inherits": "2.0.3",
+            "setprototypeof": "1.1.0",
+            "statuses": ">= 1.4.0 < 2"
+          }
+        },
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        },
+        "setprototypeof": {
+          "version": "1.1.0",
+          "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz",
+          "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
+        }
+      }
+    },
+    "serve-static": {
+      "version": "1.14.1",
+      "resolved": "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz",
+      "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+      "requires": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.17.1"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+      "requires": {
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      }
+    },
+    "setimmediate": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz",
+      "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU="
+    },
+    "setprototypeof": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz",
+      "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+    },
+    "sha.js": {
+      "version": "2.4.11",
+      "resolved": "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz",
+      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+      "requires": {
+        "inherits": "^2.0.1",
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+    },
+    "shell-quote": {
+      "version": "1.7.2",
+      "resolved": "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz",
+      "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg=="
+    },
+    "shelljs": {
+      "version": "0.8.4",
+      "resolved": "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz",
+      "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==",
+      "requires": {
+        "glob": "^7.0.0",
+        "interpret": "^1.0.0",
+        "rechoir": "^0.6.2"
+      }
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA=="
+    },
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
+      "requires": {
+        "is-arrayish": "^0.3.1"
+      },
+      "dependencies": {
+        "is-arrayish": {
+          "version": "0.3.2",
+          "resolved": "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz",
+          "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
+        }
+      }
+    },
+    "sirv": {
+      "version": "1.0.11",
+      "resolved": "https://registry.yarnpkg.com/sirv/-/sirv-1.0.11.tgz",
+      "integrity": "sha512-SR36i3/LSWja7AJNRBz4fF/Xjpn7lQFI30tZ434dIy+bitLYSP+ZEenHg36i23V2SGEz+kqjksg0uOGZ5LPiqg==",
+      "requires": {
+        "@polka/url": "^1.0.0-next.9",
+        "mime": "^2.3.1",
+        "totalist": "^1.0.0"
+      }
+    },
+    "sisteransi": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz",
+      "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="
+    },
+    "sitemap": {
+      "version": "6.4.0",
+      "resolved": "https://registry.yarnpkg.com/sitemap/-/sitemap-6.4.0.tgz",
+      "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==",
+      "requires": {
+        "@types/node": "^14.14.28",
+        "@types/sax": "^1.2.1",
+        "arg": "^5.0.0",
+        "sax": "^1.2.4"
+      }
+    },
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+    },
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+      "requires": {
+        "base": "^0.11.1",
+        "debug": "^2.2.0",
+        "define-property": "^0.2.5",
+        "extend-shallow": "^2.0.1",
+        "map-cache": "^0.2.2",
+        "source-map": "^0.5.6",
+        "source-map-resolve": "^0.5.0",
+        "use": "^3.1.0"
+      },
+      "dependencies": {
+        "source-map": {
+          "version": "0.5.7",
+          "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz",
+          "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+        }
+      }
+    },
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+      "requires": {
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+          "requires": {
+            "is-descriptor": "^1.0.0"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "sockjs": {
+      "version": "0.3.21",
+      "resolved": "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz",
+      "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==",
+      "requires": {
+        "faye-websocket": "^0.11.3",
+        "uuid": "^3.4.0",
+        "websocket-driver": "^0.7.4"
+      }
+    },
+    "sockjs-client": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz",
+      "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==",
+      "requires": {
+        "debug": "^3.2.6",
+        "eventsource": "^1.0.7",
+        "faye-websocket": "^0.11.3",
+        "inherits": "^2.0.4",
+        "json3": "^3.3.3",
+        "url-parse": "^1.4.7"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "3.2.7",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz",
+          "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+          "requires": {
+            "ms": "^2.1.1"
+          }
+        },
+        "ms": {
+          "version": "2.1.3",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz",
+          "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+        }
+      }
+    },
+    "sort-css-media-queries": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz",
+      "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw=="
+    },
+    "sort-keys": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz",
+      "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
+      "requires": {
+        "is-plain-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "is-plain-obj": {
+          "version": "1.1.0",
+          "resolved": "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+          "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
+        }
+      }
+    },
+    "source-list-map": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz",
+      "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="
+    },
+    "source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+      "requires": {
+        "atob": "^2.1.2",
+        "decode-uri-component": "^0.2.0",
+        "resolve-url": "^0.2.1",
+        "source-map-url": "^0.4.0",
+        "urix": "^0.1.0"
+      }
+    },
+    "source-map-support": {
+      "version": "0.5.19",
+      "resolved": "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "source-map-url": {
+      "version": "0.4.1",
+      "resolved": "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz",
+      "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="
+    },
+    "space-separated-tokens": {
+      "version": "1.1.5",
+      "resolved": "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+      "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA=="
+    },
+    "spdy": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz",
+      "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+      "requires": {
+        "debug": "^4.1.0",
+        "handle-thing": "^2.0.0",
+        "http-deceiver": "^1.2.7",
+        "select-hose": "^2.0.0",
+        "spdy-transport": "^3.0.0"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        }
+      }
+    },
+    "spdy-transport": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz",
+      "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+      "requires": {
+        "debug": "^4.1.0",
+        "detect-node": "^2.0.4",
+        "hpack.js": "^2.1.6",
+        "obuf": "^1.1.2",
+        "readable-stream": "^3.0.6",
+        "wbuf": "^1.7.3"
+      },
+      "dependencies": {
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+      "requires": {
+        "extend-shallow": "^3.0.0"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
+          }
+        },
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+    },
+    "ssri": {
+      "version": "8.0.1",
+      "resolved": "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz",
+      "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+      "requires": {
+        "minipass": "^3.1.1"
+      }
+    },
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w=="
+    },
+    "state-toggle": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz",
+      "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ=="
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+      "requires": {
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      }
+    },
+    "statuses": {
+      "version": "1.5.0",
+      "resolved": "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz",
+      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+    },
+    "std-env": {
+      "version": "2.3.0",
+      "resolved": "https://registry.yarnpkg.com/std-env/-/std-env-2.3.0.tgz",
+      "integrity": "sha512-4qT5B45+Kjef2Z6pE0BkskzsH0GO7GrND0wGlTM1ioUe3v0dGYx9ZJH0Aro/YyA8fqQ5EyIKDRjZojJYMFTflw==",
+      "requires": {
+        "ci-info": "^3.0.0"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz",
+      "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+      "requires": {
+        "inherits": "~2.0.1",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "stream-each": {
+      "version": "1.2.3",
+      "resolved": "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz",
+      "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "stream-shift": "^1.0.0"
+      }
+    },
+    "stream-http": {
+      "version": "2.8.3",
+      "resolved": "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz",
+      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+      "requires": {
+        "builtin-status-codes": "^3.0.0",
+        "inherits": "^2.0.1",
+        "readable-stream": "^2.3.6",
+        "to-arraybuffer": "^1.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "stream-shift": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz",
+      "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ=="
+    },
+    "strict-uri-encode": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
+      "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM="
+    },
+    "string_decoder": {
+      "version": "1.3.0",
+      "resolved": "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz",
+      "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+      "requires": {
+        "safe-buffer": "~5.2.0"
+      }
+    },
+    "string-width": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+      "requires": {
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
+      }
+    },
+    "string.prototype.trimend": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "string.prototype.trimstart": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
+    },
+    "stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
+      "requires": {
+        "get-own-enumerable-property-symbols": "^3.0.0",
+        "is-obj": "^1.0.1",
+        "is-regexp": "^1.0.0"
+      },
+      "dependencies": {
+        "is-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz",
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8="
+        }
+      }
+    },
+    "strip-ansi": {
+      "version": "5.2.0",
+      "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+      "requires": {
+        "ansi-regex": "^4.1.0"
+      }
+    },
+    "strip-bom-string": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
+      "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI="
+    },
+    "strip-eof": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz",
+      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8="
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+    },
+    "style-to-object": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz",
+      "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==",
+      "requires": {
+        "inline-style-parser": "0.1.1"
+      }
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      }
+    },
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "requires": {
+        "has-flag": "^3.0.0"
+      }
+    },
+    "svg-parser": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/svg-parser/-/svg-parser-2.0.4.tgz",
+      "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="
+    },
+    "svgo": {
+      "version": "1.3.2",
+      "resolved": "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz",
+      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+      "requires": {
+        "chalk": "^2.4.1",
+        "coa": "^2.0.2",
+        "css-select": "^2.0.0",
+        "css-select-base-adapter": "^0.1.1",
+        "css-tree": "1.0.0-alpha.37",
+        "csso": "^4.0.2",
+        "js-yaml": "^3.13.1",
+        "mkdirp": "~0.5.1",
+        "object.values": "^1.1.0",
+        "sax": "~1.2.4",
+        "stable": "^0.1.8",
+        "unquote": "~1.1.1",
+        "util.promisify": "~1.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        },
+        "util.promisify": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz",
+          "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+          "requires": {
+            "define-properties": "^1.1.3",
+            "es-abstract": "^1.17.2",
+            "has-symbols": "^1.0.1",
+            "object.getownpropertydescriptors": "^2.1.0"
+          }
+        }
+      }
+    },
+    "tapable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz",
+      "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="
+    },
+    "tar": {
+      "version": "6.1.0",
+      "resolved": "https://registry.yarnpkg.com/tar/-/tar-6.1.0.tgz",
+      "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+      "requires": {
+        "chownr": "^2.0.0",
+        "fs-minipass": "^2.0.0",
+        "minipass": "^3.0.0",
+        "minizlib": "^2.1.1",
+        "mkdirp": "^1.0.3",
+        "yallist": "^4.0.0"
+      },
+      "dependencies": {
+        "mkdirp": {
+          "version": "1.0.4",
+          "resolved": "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz",
+          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+        }
+      }
+    },
+    "terser": {
+      "version": "4.8.0",
+      "resolved": "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz",
+      "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
+      "requires": {
+        "commander": "^2.20.0",
+        "source-map": "~0.6.1",
+        "source-map-support": "~0.5.12"
+      }
+    },
+    "terser-webpack-plugin": {
+      "version": "4.2.3",
+      "resolved": "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz",
+      "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==",
+      "requires": {
+        "cacache": "^15.0.5",
+        "find-cache-dir": "^3.3.1",
+        "jest-worker": "^26.5.0",
+        "p-limit": "^3.0.2",
+        "schema-utils": "^3.0.0",
+        "serialize-javascript": "^5.0.1",
+        "source-map": "^0.6.1",
+        "terser": "^5.3.4",
+        "webpack-sources": "^1.4.3"
+      },
+      "dependencies": {
+        "p-limit": {
+          "version": "3.1.0",
+          "resolved": "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+          "requires": {
+            "yocto-queue": "^0.1.0"
+          }
+        },
+        "terser": {
+          "version": "5.6.1",
+          "resolved": "https://registry.yarnpkg.com/terser/-/terser-5.6.1.tgz",
+          "integrity": "sha512-yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==",
+          "requires": {
+            "commander": "^2.20.0",
+            "source-map": "~0.7.2",
+            "source-map-support": "~0.5.19"
+          },
+          "dependencies": {
+            "source-map": {
+              "version": "0.7.3",
+              "resolved": "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz",
+              "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
+            }
+          }
+        }
+      }
+    },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+    },
+    "through2": {
+      "version": "2.0.5",
+      "resolved": "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz",
+      "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+      "requires": {
+        "readable-stream": "~2.3.6",
+        "xtend": "~4.0.1"
+      }
+    },
+    "thunky": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz",
+      "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA=="
+    },
+    "timers-browserify": {
+      "version": "2.0.12",
+      "resolved": "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz",
+      "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+      "requires": {
+        "setimmediate": "^1.0.4"
+      }
+    },
+    "timsort": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz",
+      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q="
+    },
+    "tiny-emitter": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+      "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==",
+      "optional": true
+    },
+    "tiny-invariant": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
+      "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw=="
+    },
+    "tiny-warning": {
+      "version": "1.0.3",
+      "resolved": "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
+      "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA=="
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+    },
+    "to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4="
+    },
+    "to-object-path": {
+      "version": "0.3.0",
+      "resolved": "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz",
+      "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+      "requires": {
+        "kind-of": "^3.0.2"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+          "requires": {
+            "is-buffer": "^1.1.5"
+          }
+        }
+      }
+    },
+    "to-readable-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+      "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q=="
+    },
+    "to-regex": {
+      "version": "3.0.2",
+      "resolved": "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz",
+      "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+      "requires": {
+        "define-property": "^2.0.2",
+        "extend-shallow": "^3.0.2",
+        "regex-not": "^1.0.2",
+        "safe-regex": "^1.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "2.0.2",
+          "resolved": "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz",
+          "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+          "requires": {
+            "is-descriptor": "^1.0.2",
+            "isobject": "^3.0.1"
+          }
+        },
+        "extend-shallow": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz",
+          "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+          "requires": {
+            "assign-symbols": "^1.0.0",
+            "is-extendable": "^1.0.1"
+          }
+        },
+        "is-extendable": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz",
+          "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+          "requires": {
+            "is-plain-object": "^2.0.4"
+          }
+        }
+      }
+    },
+    "to-regex-range": {
+      "version": "2.1.1",
+      "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz",
+      "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+      "requires": {
+        "is-number": "^3.0.0",
+        "repeat-string": "^1.6.1"
+      }
+    },
+    "to-vfile": {
+      "version": "6.1.0",
+      "resolved": "https://registry.npmjs.org/to-vfile/-/to-vfile-6.1.0.tgz",
+      "integrity": "sha512-BxX8EkCxOAZe+D/ToHdDsJcVI4HqQfmw0tCkp31zf3dNP/XWIAjU4CmeuSwsSoOzOTqHPOL0KUzyZqJplkD0Qw==",
+      "requires": {
+        "is-buffer": "^2.0.0",
+        "vfile": "^4.0.0"
+      },
+      "dependencies": {
+        "is-buffer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+        }
+      }
+    },
+    "toidentifier": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz",
+      "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+    },
+    "totalist": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz",
+      "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g=="
+    },
+    "trim": {
+      "version": "0.0.1",
+      "resolved": "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz",
+      "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0="
+    },
+    "trim-trailing-lines": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz",
+      "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ=="
+    },
+    "trough": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/trough/-/trough-1.0.5.tgz",
+      "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA=="
+    },
+    "ts-essentials": {
+      "version": "2.0.12",
+      "resolved": "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-2.0.12.tgz",
+      "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w=="
+    },
+    "ts-pnp": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz",
+      "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw=="
+    },
+    "tslib": {
+      "version": "2.1.0",
+      "resolved": "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz",
+      "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+    },
+    "type-fest": {
+      "version": "0.20.2",
+      "resolved": "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz",
+      "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+    },
+    "type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "requires": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      }
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+    },
+    "typedarray-to-buffer": {
+      "version": "3.1.5",
+      "resolved": "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+      "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+      "requires": {
+        "is-typedarray": "^1.0.0"
+      }
+    },
+    "ua-parser-js": {
+      "version": "0.7.24",
+      "resolved": "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz",
+      "integrity": "sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw=="
+    },
+    "unbox-primitive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
+      "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "has-bigints": "^1.0.0",
+        "has-symbols": "^1.0.0",
+        "which-boxed-primitive": "^1.0.1"
+      }
+    },
+    "unherit": {
+      "version": "1.1.3",
+      "resolved": "https://registry.yarnpkg.com/unherit/-/unherit-1.1.3.tgz",
+      "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
+      "requires": {
+        "inherits": "^2.0.0",
+        "xtend": "^4.0.0"
+      }
+    },
+    "unicode-canonical-property-names-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ=="
+    },
+    "unicode-match-property-ecmascript": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+      "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+      "requires": {
+        "unicode-canonical-property-names-ecmascript": "^1.0.4",
+        "unicode-property-aliases-ecmascript": "^1.0.4"
+      }
+    },
+    "unicode-match-property-value-ecmascript": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
+      "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ=="
+    },
+    "unicode-property-aliases-ecmascript": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
+      "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg=="
+    },
+    "unified": {
+      "version": "9.2.0",
+      "resolved": "https://registry.yarnpkg.com/unified/-/unified-9.2.0.tgz",
+      "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
+      "requires": {
+        "bail": "^1.0.0",
+        "extend": "^3.0.0",
+        "is-buffer": "^2.0.0",
+        "is-plain-obj": "^2.0.0",
+        "trough": "^1.0.0",
+        "vfile": "^4.0.0"
+      },
+      "dependencies": {
+        "is-buffer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+        }
+      }
+    },
+    "union-value": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz",
+      "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+      "requires": {
+        "arr-union": "^3.1.0",
+        "get-value": "^2.0.6",
+        "is-extendable": "^0.1.1",
+        "set-value": "^2.0.1"
+      }
+    },
+    "uniq": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz",
+      "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8="
+    },
+    "uniqs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz",
+      "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI="
+    },
+    "unique-filename": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz",
+      "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
+      "requires": {
+        "unique-slug": "^2.0.0"
+      }
+    },
+    "unique-slug": {
+      "version": "2.0.2",
+      "resolved": "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz",
+      "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
+      "requires": {
+        "imurmurhash": "^0.1.4"
+      }
+    },
+    "unique-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz",
+      "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+      "requires": {
+        "crypto-random-string": "^2.0.0"
+      }
+    },
+    "unist-builder": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz",
+      "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw=="
+    },
+    "unist-util-find-after": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/unist-util-find-after/-/unist-util-find-after-3.0.0.tgz",
+      "integrity": "sha512-ojlBqfsBftYXExNu3+hHLfJQ/X1jYY/9vdm4yZWjIbf0VuWF6CRufci1ZyoD/wV2TYMKxXUoNuoqwy+CkgzAiQ==",
+      "requires": {
+        "unist-util-is": "^4.0.0"
+      }
+    },
+    "unist-util-generated": {
+      "version": "1.1.6",
+      "resolved": "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.6.tgz",
+      "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg=="
+    },
+    "unist-util-is": {
+      "version": "4.1.0",
+      "resolved": "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-4.1.0.tgz",
+      "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg=="
+    },
+    "unist-util-position": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.1.0.tgz",
+      "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA=="
+    },
+    "unist-util-remove": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/unist-util-remove/-/unist-util-remove-2.0.1.tgz",
+      "integrity": "sha512-YtuetK6o16CMfG+0u4nndsWpujgsHDHHLyE0yGpJLLn5xSjKeyGyzEBOI2XbmoUHCYabmNgX52uxlWoQhcvR7Q==",
+      "requires": {
+        "unist-util-is": "^4.0.0"
+      }
+    },
+    "unist-util-remove-position": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
+      "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
+      "requires": {
+        "unist-util-visit": "^2.0.0"
+      }
+    },
+    "unist-util-stringify-position": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+      "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
+      "requires": {
+        "@types/unist": "^2.0.2"
+      }
+    },
+    "unist-util-visit": {
+      "version": "2.0.3",
+      "resolved": "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
+      "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
+      "requires": {
+        "@types/unist": "^2.0.0",
+        "unist-util-is": "^4.0.0",
+        "unist-util-visit-parents": "^3.0.0"
+      }
+    },
+    "unist-util-visit-parents": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz",
+      "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==",
+      "requires": {
+        "@types/unist": "^2.0.0",
+        "unist-util-is": "^4.0.0"
+      }
+    },
+    "universalify": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz",
+      "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+    },
+    "unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+    },
+    "unquote": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz",
+      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ="
+    },
+    "unset-value": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz",
+      "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+      "requires": {
+        "has-value": "^0.3.1",
+        "isobject": "^3.0.0"
+      },
+      "dependencies": {
+        "has-value": {
+          "version": "0.3.1",
+          "resolved": "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz",
+          "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+          "requires": {
+            "get-value": "^2.0.3",
+            "has-values": "^0.1.4",
+            "isobject": "^2.0.0"
+          },
+          "dependencies": {
+            "isobject": {
+              "version": "2.1.0",
+              "resolved": "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz",
+              "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+              "requires": {
+                "isarray": "1.0.0"
+              }
+            }
+          }
+        },
+        "has-values": {
+          "version": "0.1.4",
+          "resolved": "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz",
+          "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+        }
+      }
+    },
+    "upath": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz",
+      "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
+    },
+    "update-notifier": {
+      "version": "5.1.0",
+      "resolved": "https://registry.yarnpkg.com/update-notifier/-/update-notifier-5.1.0.tgz",
+      "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==",
+      "requires": {
+        "boxen": "^5.0.0",
+        "chalk": "^4.1.0",
+        "configstore": "^5.0.1",
+        "has-yarn": "^2.1.0",
+        "import-lazy": "^2.1.0",
+        "is-ci": "^2.0.0",
+        "is-installed-globally": "^0.4.0",
+        "is-npm": "^5.0.0",
+        "is-yarn-global": "^0.3.0",
+        "latest-version": "^5.1.0",
+        "pupa": "^2.1.1",
+        "semver": "^7.3.4",
+        "semver-diff": "^3.1.1",
+        "xdg-basedir": "^4.0.0"
+      },
+      "dependencies": {
+        "semver": {
+          "version": "7.3.4",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
+      }
+    },
+    "uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "requires": {
+        "punycode": "^2.1.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "2.1.1",
+          "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz",
+          "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+        }
+      }
+    },
+    "urix": {
+      "version": "0.1.0",
+      "resolved": "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz",
+      "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+        }
+      }
+    },
+    "url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "requires": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      }
+    },
+    "url-parse": {
+      "version": "1.5.1",
+      "resolved": "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.1.tgz",
+      "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
+      "requires": {
+        "querystringify": "^2.1.1",
+        "requires-port": "^1.0.0"
+      }
+    },
+    "url-parse-lax": {
+      "version": "3.0.0",
+      "resolved": "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+      "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+      "requires": {
+        "prepend-http": "^2.0.0"
+      },
+      "dependencies": {
+        "prepend-http": {
+          "version": "2.0.0",
+          "resolved": "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz",
+          "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc="
+        }
+      }
+    },
+    "use": {
+      "version": "3.1.1",
+      "resolved": "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz",
+      "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+    },
+    "use-composed-ref": {
+      "version": "1.1.0",
+      "resolved": "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.1.0.tgz",
+      "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==",
+      "requires": {
+        "ts-essentials": "^2.0.3"
+      }
+    },
+    "use-isomorphic-layout-effect": {
+      "version": "1.1.1",
+      "resolved": "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz",
+      "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==",
+      "requires": {}
+    },
+    "use-latest": {
+      "version": "1.2.0",
+      "resolved": "https://registry.yarnpkg.com/use-latest/-/use-latest-1.2.0.tgz",
+      "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==",
+      "requires": {
+        "use-isomorphic-layout-effect": "^1.0.0"
+      }
+    },
+    "util": {
+      "version": "0.11.1",
+      "resolved": "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz",
+      "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+      "requires": {
+        "inherits": "2.0.3"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.3",
+          "resolved": "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz",
+          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "util.promisify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz",
+      "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==",
+      "requires": {
+        "define-properties": "^1.1.2",
+        "object.getownpropertydescriptors": "^2.0.3"
+      }
+    },
+    "utila": {
+      "version": "0.4.0",
+      "resolved": "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz",
+      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw="
+    },
+    "utility-types": {
+      "version": "3.10.0",
+      "resolved": "https://registry.yarnpkg.com/utility-types/-/utility-types-3.10.0.tgz",
+      "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg=="
+    },
+    "utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+    },
+    "uuid": {
+      "version": "3.4.0",
+      "resolved": "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz",
+      "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
+    },
+    "value-equal": {
+      "version": "1.0.1",
+      "resolved": "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz",
+      "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw=="
+    },
+    "vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+    },
+    "vendors": {
+      "version": "1.0.4",
+      "resolved": "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz",
+      "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w=="
+    },
+    "vfile": {
+      "version": "4.2.1",
+      "resolved": "https://registry.yarnpkg.com/vfile/-/vfile-4.2.1.tgz",
+      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
+      "requires": {
+        "@types/unist": "^2.0.0",
+        "is-buffer": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0",
+        "vfile-message": "^2.0.0"
+      },
+      "dependencies": {
+        "is-buffer": {
+          "version": "2.0.5",
+          "resolved": "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="
+        }
+      }
+    },
+    "vfile-location": {
+      "version": "3.2.0",
+      "resolved": "https://registry.yarnpkg.com/vfile-location/-/vfile-location-3.2.0.tgz",
+      "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA=="
+    },
+    "vfile-message": {
+      "version": "2.0.4",
+      "resolved": "https://registry.yarnpkg.com/vfile-message/-/vfile-message-2.0.4.tgz",
+      "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
+      "requires": {
+        "@types/unist": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0"
+      }
+    },
+    "vm-browserify": {
+      "version": "1.1.2",
+      "resolved": "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz",
+      "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="
+    },
+    "wait-on": {
+      "version": "5.3.0",
+      "resolved": "https://registry.yarnpkg.com/wait-on/-/wait-on-5.3.0.tgz",
+      "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
+      "requires": {
+        "axios": "^0.21.1",
+        "joi": "^17.3.0",
+        "lodash": "^4.17.21",
+        "minimist": "^1.2.5",
+        "rxjs": "^6.6.3"
+      }
+    },
+    "watchpack": {
+      "version": "1.7.5",
+      "resolved": "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz",
+      "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==",
+      "requires": {
+        "chokidar": "^3.4.1",
+        "graceful-fs": "^4.1.2",
+        "neo-async": "^2.5.0",
+        "watchpack-chokidar2": "^2.0.1"
+      },
+      "dependencies": {
+        "anymatch": {
+          "version": "3.1.1",
+          "resolved": "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz",
+          "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+          "optional": true,
+          "requires": {
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
+          }
+        },
+        "binary-extensions": {
+          "version": "2.2.0",
+          "resolved": "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz",
+          "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+          "optional": true
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "optional": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chokidar": {
+          "version": "3.5.1",
+          "resolved": "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz",
+          "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
+          "optional": true,
+          "requires": {
+            "anymatch": "~3.1.1",
+            "braces": "~3.0.2",
+            "fsevents": "~2.3.1",
+            "glob-parent": "~5.1.0",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.5.0"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "optional": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "fsevents": {
+          "version": "2.3.2",
+          "resolved": "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz",
+          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+          "optional": true
+        },
+        "is-binary-path": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz",
+          "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+          "optional": true,
+          "requires": {
+            "binary-extensions": "^2.0.0"
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "optional": true
+        },
+        "readdirp": {
+          "version": "3.5.0",
+          "resolved": "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz",
+          "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+          "optional": true,
+          "requires": {
+            "picomatch": "^2.2.1"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "optional": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
+        }
+      }
+    },
+    "watchpack-chokidar2": {
+      "version": "2.0.1",
+      "resolved": "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz",
+      "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==",
+      "optional": true,
+      "requires": {
+        "chokidar": "^2.1.8"
+      }
+    },
+    "wbuf": {
+      "version": "1.7.3",
+      "resolved": "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz",
+      "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+      "requires": {
+        "minimalistic-assert": "^1.0.0"
+      }
+    },
+    "web-namespaces": {
+      "version": "1.1.4",
+      "resolved": "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz",
+      "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw=="
+    },
+    "webpack": {
+      "version": "4.46.0",
+      "resolved": "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz",
+      "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
+      "requires": {
+        "@webassemblyjs/ast": "1.9.0",
+        "@webassemblyjs/helper-module-context": "1.9.0",
+        "@webassemblyjs/wasm-edit": "1.9.0",
+        "@webassemblyjs/wasm-parser": "1.9.0",
+        "acorn": "^6.4.1",
+        "ajv": "^6.10.2",
+        "ajv-keywords": "^3.4.1",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^4.5.0",
+        "eslint-scope": "^4.0.3",
+        "json-parse-better-errors": "^1.0.2",
+        "loader-runner": "^2.4.0",
+        "loader-utils": "^1.2.3",
+        "memory-fs": "^0.4.1",
+        "micromatch": "^3.1.10",
+        "mkdirp": "^0.5.3",
+        "neo-async": "^2.6.1",
+        "node-libs-browser": "^2.2.1",
+        "schema-utils": "^1.0.0",
+        "tapable": "^1.1.3",
+        "terser-webpack-plugin": "^1.4.3",
+        "watchpack": "^1.7.4",
+        "webpack-sources": "^1.4.1"
+      },
+      "dependencies": {
+        "cacache": {
+          "version": "12.0.4",
+          "resolved": "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz",
+          "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
+          "requires": {
+            "bluebird": "^3.5.5",
+            "chownr": "^1.1.1",
+            "figgy-pudding": "^3.5.1",
+            "glob": "^7.1.4",
+            "graceful-fs": "^4.1.15",
+            "infer-owner": "^1.0.3",
+            "lru-cache": "^5.1.1",
+            "mississippi": "^3.0.0",
+            "mkdirp": "^0.5.1",
+            "move-concurrently": "^1.0.1",
+            "promise-inflight": "^1.0.1",
+            "rimraf": "^2.6.3",
+            "ssri": "^6.0.1",
+            "unique-filename": "^1.1.1",
+            "y18n": "^4.0.0"
+          }
+        },
+        "chownr": {
+          "version": "1.1.4",
+          "resolved": "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz",
+          "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="
+        },
+        "find-cache-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
+          "requires": {
+            "commondir": "^1.0.1",
+            "make-dir": "^2.0.0",
+            "pkg-dir": "^3.0.0"
+          }
+        },
+        "json5": {
+          "version": "1.0.1",
+          "resolved": "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz",
+          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
+          "requires": {
+            "minimist": "^1.2.0"
+          }
+        },
+        "loader-utils": {
+          "version": "1.4.0",
+          "resolved": "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz",
+          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^1.0.1"
+          }
+        },
+        "lru-cache": {
+          "version": "5.1.1",
+          "resolved": "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz",
+          "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+          "requires": {
+            "yallist": "^3.0.2"
+          }
+        },
+        "make-dir": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz",
+          "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+          "requires": {
+            "pify": "^4.0.1",
+            "semver": "^5.6.0"
+          }
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+        },
+        "serialize-javascript": {
+          "version": "4.0.0",
+          "resolved": "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+          "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+          "requires": {
+            "randombytes": "^2.1.0"
+          }
+        },
+        "ssri": {
+          "version": "6.0.1",
+          "resolved": "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz",
+          "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==",
+          "requires": {
+            "figgy-pudding": "^3.5.1"
+          }
+        },
+        "terser-webpack-plugin": {
+          "version": "1.4.5",
+          "resolved": "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
+          "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
+          "requires": {
+            "cacache": "^12.0.2",
+            "find-cache-dir": "^2.1.0",
+            "is-wsl": "^1.1.0",
+            "schema-utils": "^1.0.0",
+            "serialize-javascript": "^4.0.0",
+            "source-map": "^0.6.1",
+            "terser": "^4.1.2",
+            "webpack-sources": "^1.4.0",
+            "worker-farm": "^1.7.0"
+          }
+        },
+        "yallist": {
+          "version": "3.1.1",
+          "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz",
+          "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+        }
+      }
+    },
+    "webpack-bundle-analyzer": {
+      "version": "4.4.0",
+      "resolved": "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.0.tgz",
+      "integrity": "sha512-9DhNa+aXpqdHk8LkLPTBU/dMfl84Y+WE2+KnfI6rSpNRNVKa0VGLjPd2pjFubDeqnWmulFggxmWBxhfJXZnR0g==",
+      "requires": {
+        "acorn": "^8.0.4",
+        "acorn-walk": "^8.0.0",
+        "chalk": "^4.1.0",
+        "commander": "^6.2.0",
+        "gzip-size": "^6.0.0",
+        "lodash": "^4.17.20",
+        "opener": "^1.5.2",
+        "sirv": "^1.0.7",
+        "ws": "^7.3.1"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "8.1.0",
+          "resolved": "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz",
+          "integrity": "sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA=="
+        },
+        "commander": {
+          "version": "6.2.1",
+          "resolved": "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz",
+          "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="
+        },
+        "gzip-size": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/gzip-size/-/gzip-size-6.0.0.tgz",
+          "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+          "requires": {
+            "duplexer": "^0.1.2"
+          }
+        },
+        "ws": {
+          "version": "7.4.4",
+          "resolved": "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz",
+          "integrity": "sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw==",
+          "requires": {}
+        }
+      }
+    },
+    "webpack-dev-middleware": {
+      "version": "3.7.3",
+      "resolved": "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz",
+      "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==",
+      "requires": {
+        "memory-fs": "^0.4.1",
+        "mime": "^2.4.4",
+        "mkdirp": "^0.5.1",
+        "range-parser": "^1.2.1",
+        "webpack-log": "^2.0.0"
+      }
+    },
+    "webpack-dev-server": {
+      "version": "3.11.2",
+      "resolved": "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz",
+      "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==",
+      "requires": {
+        "ansi-html": "0.0.7",
+        "bonjour": "^3.5.0",
+        "chokidar": "^2.1.8",
+        "compression": "^1.7.4",
+        "connect-history-api-fallback": "^1.6.0",
+        "debug": "^4.1.1",
+        "del": "^4.1.1",
+        "express": "^4.17.1",
+        "html-entities": "^1.3.1",
+        "http-proxy-middleware": "0.19.1",
+        "import-local": "^2.0.0",
+        "internal-ip": "^4.3.0",
+        "ip": "^1.1.5",
+        "is-absolute-url": "^3.0.3",
+        "killable": "^1.0.1",
+        "loglevel": "^1.6.8",
+        "opn": "^5.5.0",
+        "p-retry": "^3.0.1",
+        "portfinder": "^1.0.26",
+        "schema-utils": "^1.0.0",
+        "selfsigned": "^1.10.8",
+        "semver": "^6.3.0",
+        "serve-index": "^1.9.1",
+        "sockjs": "^0.3.21",
+        "sockjs-client": "^1.5.0",
+        "spdy": "^4.0.2",
+        "strip-ansi": "^3.0.1",
+        "supports-color": "^6.1.0",
+        "url": "^0.11.0",
+        "webpack-dev-middleware": "^3.7.2",
+        "webpack-log": "^2.0.0",
+        "ws": "^6.2.1",
+        "yargs": "^13.3.2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+        },
+        "array-union": {
+          "version": "1.0.2",
+          "resolved": "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz",
+          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "requires": {
+            "array-uniq": "^1.0.1"
+          }
+        },
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "del": {
+          "version": "4.1.1",
+          "resolved": "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz",
+          "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "globby": "^6.1.0",
+            "is-path-cwd": "^2.0.0",
+            "is-path-in-cwd": "^2.0.0",
+            "p-map": "^2.0.0",
+            "pify": "^4.0.1",
+            "rimraf": "^2.6.3"
+          }
+        },
+        "globby": {
+          "version": "6.1.0",
+          "resolved": "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz",
+          "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=",
+          "requires": {
+            "array-union": "^1.0.1",
+            "glob": "^7.0.3",
+            "object-assign": "^4.0.1",
+            "pify": "^2.0.0",
+            "pinkie-promise": "^2.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "2.3.0",
+              "resolved": "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz",
+              "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+            }
+          }
+        },
+        "ms": {
+          "version": "2.1.2",
+          "resolved": "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz",
+          "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+        },
+        "p-map": {
+          "version": "2.1.0",
+          "resolved": "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz",
+          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
+        },
+        "schema-utils": {
+          "version": "1.0.0",
+          "resolved": "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz",
+          "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
+          "requires": {
+            "ajv": "^6.1.0",
+            "ajv-errors": "^1.0.0",
+            "ajv-keywords": "^3.1.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "webpack-log": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz",
+      "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==",
+      "requires": {
+        "ansi-colors": "^3.0.0",
+        "uuid": "^3.3.2"
+      }
+    },
+    "webpack-merge": {
+      "version": "4.2.2",
+      "resolved": "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz",
+      "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+      "requires": {
+        "lodash": "^4.17.15"
+      }
+    },
+    "webpack-sources": {
+      "version": "1.4.3",
+      "resolved": "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz",
+      "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+      "requires": {
+        "source-list-map": "^2.0.0",
+        "source-map": "~0.6.1"
+      }
+    },
+    "webpackbar": {
+      "version": "5.0.0-3",
+      "resolved": "https://registry.yarnpkg.com/webpackbar/-/webpackbar-5.0.0-3.tgz",
+      "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==",
+      "requires": {
+        "ansi-escapes": "^4.3.1",
+        "chalk": "^4.1.0",
+        "consola": "^2.15.0",
+        "figures": "^3.2.0",
+        "pretty-time": "^1.1.0",
+        "std-env": "^2.2.1",
+        "text-table": "^0.2.0",
+        "wrap-ansi": "^7.0.0"
+      }
+    },
+    "websocket-driver": {
+      "version": "0.7.4",
+      "resolved": "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz",
+      "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+      "requires": {
+        "http-parser-js": ">=0.5.1",
+        "safe-buffer": ">=5.1.0",
+        "websocket-extensions": ">=0.1.1"
+      }
+    },
+    "websocket-extensions": {
+      "version": "0.1.4",
+      "resolved": "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+      "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg=="
+    },
+    "which": {
+      "version": "1.3.1",
+      "resolved": "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz",
+      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+      "requires": {
+        "isexe": "^2.0.0"
+      }
+    },
+    "which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+      "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+      "requires": {
+        "is-bigint": "^1.0.1",
+        "is-boolean-object": "^1.1.0",
+        "is-number-object": "^1.0.4",
+        "is-string": "^1.0.5",
+        "is-symbol": "^1.0.3"
+      }
+    },
+    "which-module": {
+      "version": "2.0.0",
+      "resolved": "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz",
+      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
+    },
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "requires": {
+        "string-width": "^1.0.2 || 2"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "string-width": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+          "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+          "requires": {
+            "is-fullwidth-code-point": "^2.0.0",
+            "strip-ansi": "^4.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "requires": {
+            "ansi-regex": "^3.0.0"
+          }
+        }
+      }
+    },
+    "widest-line": {
+      "version": "3.1.0",
+      "resolved": "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz",
+      "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+      "requires": {
+        "string-width": "^4.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "worker-farm": {
+      "version": "1.7.0",
+      "resolved": "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz",
+      "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==",
+      "requires": {
+        "errno": "~0.1.7"
+      }
+    },
+    "worker-rpc": {
+      "version": "0.1.1",
+      "resolved": "https://registry.yarnpkg.com/worker-rpc/-/worker-rpc-0.1.1.tgz",
+      "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==",
+      "requires": {
+        "microevent.ts": "~0.1.1"
+      }
+    },
+    "wrap-ansi": {
+      "version": "7.0.0",
+      "resolved": "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+      "requires": {
+        "ansi-styles": "^4.0.0",
+        "string-width": "^4.1.0",
+        "strip-ansi": "^6.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg=="
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "emoji-regex": {
+          "version": "8.0.0",
+          "resolved": "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz",
+          "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+          "requires": {
+            "emoji-regex": "^8.0.0",
+            "is-fullwidth-code-point": "^3.0.0",
+            "strip-ansi": "^6.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "6.0.0",
+          "resolved": "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        }
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write-file-atomic": {
+      "version": "3.0.3",
+      "resolved": "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+      "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+      "requires": {
+        "imurmurhash": "^0.1.4",
+        "is-typedarray": "^1.0.0",
+        "signal-exit": "^3.0.2",
+        "typedarray-to-buffer": "^3.1.5"
+      }
+    },
+    "ws": {
+      "version": "6.2.1",
+      "resolved": "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz",
+      "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
+      "requires": {
+        "async-limiter": "~1.0.0"
+      }
+    },
+    "xdg-basedir": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+      "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q=="
+    },
+    "xml-js": {
+      "version": "1.6.11",
+      "resolved": "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.11.tgz",
+      "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==",
+      "requires": {
+        "sax": "^1.2.4"
+      }
+    },
+    "xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+    },
+    "y18n": {
+      "version": "4.0.1",
+      "resolved": "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz",
+      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ=="
+    },
+    "yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "yaml": {
+      "version": "1.10.2",
+      "resolved": "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz",
+      "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
+    },
+    "yargs": {
+      "version": "13.3.2",
+      "resolved": "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz",
+      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+      "requires": {
+        "cliui": "^5.0.0",
+        "find-up": "^3.0.0",
+        "get-caller-file": "^2.0.1",
+        "require-directory": "^2.1.1",
+        "require-main-filename": "^2.0.0",
+        "set-blocking": "^2.0.0",
+        "string-width": "^3.0.0",
+        "which-module": "^2.0.0",
+        "y18n": "^4.0.0",
+        "yargs-parser": "^13.1.2"
+      }
+    },
+    "yargs-parser": {
+      "version": "13.1.2",
+      "resolved": "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz",
+      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
+      "requires": {
+        "camelcase": "^5.0.0",
+        "decamelize": "^1.2.0"
+      },
+      "dependencies": {
+        "camelcase": {
+          "version": "5.3.1",
+          "resolved": "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz",
+          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
+        }
+      }
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+    },
+    "zwitch": {
+      "version": "1.0.5",
+      "resolved": "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz",
+      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw=="
+    }
+  }
+}

+ 37 - 0
package.json

@@ -0,0 +1,37 @@
+{
+  "name": "daw-til-2",
+  "version": "0.0.0",
+  "private": true,
+  "scripts": {
+    "docusaurus": "docusaurus",
+    "start": "docusaurus start",
+    "build": "docusaurus build",
+    "swizzle": "docusaurus swizzle",
+    "deploy": "docusaurus deploy",
+    "clear": "docusaurus clear",
+    "serve": "docusaurus serve",
+    "write-translations": "docusaurus write-translations",
+    "write-heading-ids": "docusaurus write-heading-ids"
+  },
+  "dependencies": {
+    "@docusaurus/core": "2.0.0-alpha.72",
+    "@docusaurus/preset-classic": "2.0.0-alpha.72",
+    "@mdx-js/react": "^1.6.21",
+    "clsx": "^1.1.1",
+    "docusaurus-lunr-search": "^2.1.10",
+    "react": "^17.0.1",
+    "react-dom": "^17.0.1"
+  },
+  "browserslist": {
+    "production": [
+      ">0.5%",
+      "not dead",
+      "not op_mini all"
+    ],
+    "development": [
+      "last 1 chrome version",
+      "last 1 firefox version",
+      "last 1 safari version"
+    ]
+  }
+}

+ 141 - 0
sidebars.js

@@ -0,0 +1,141 @@
+module.exports = {
+  docs: [
+    {
+      type:'doc',
+      id: 'index',
+    },
+    {
+      type: 'category',
+      label: 'Database',
+      items: [
+        'db/MongoDB',
+        'db/MySQL',
+        'db/PostgreSQL',
+        'db/Redis'
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Editor / Shell',
+      items: [
+        'editors/custom',
+        'editors/atom',
+        'editors/bash',
+        'editors/git',
+        'editors/phpstorm',
+        'editors/sublime',
+        'editors/subversion',
+        'editors/terminal',
+        'editors/textmate',
+        'editors/unix',
+        'editors/vi',
+        'editors/zsh',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Frameworks',
+      items: [
+        'waf/nodejs',
+        'waf/npm',
+        'waf/rails',
+        'waf/react',
+        'waf/react_native',
+        'waf/vue',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Language',
+      items: [
+        'lang/Golang',
+        'lang/GraphQL',
+        'lang/JavaScript',
+        'lang/PHP',
+        'lang/Python',
+        'lang/Ruby',
+        'lang/Rust',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Localhost',
+      items: [
+        'localhost/macs',
+        'localhost/apple',
+        'localhost/chrome',
+        'localhost/brew',
+        'localhost/adobe',
+        'localhost/sketch',
+        'localhost/ngrok',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Projects',
+      items: [
+        'projects/dw',
+        'projects/gzet',
+        'projects/juryd',
+        'projects/pants',
+        'projects/woozer',
+        'projects/zeke',
+        'projects/zw',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Remote',
+      items: [
+        'host/Discourse',
+        'host/Drupal',
+        'host/Gitea',
+        'host/Gogs',
+        'host/Icecast',
+        'host/InvoicePlane',
+        'host/Laravel',
+        'host/Lychee',
+        'host/Mailcow',
+        'host/Nodebb',
+        'host/Phproject',
+        'host/Piwik',
+        'host/Siege-sproxy',
+        'host/Webmin',
+        'host/WordPress',
+        'host/Zammad',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'SasS',
+      items: [
+        'saas/aws',
+        'saas/google',
+        'saas/heroku',
+        'saas/linode',
+        'saas/now',
+        'saas/stripe',
+        'saas/twilio',
+      ],
+    },
+    {
+      type: 'category',
+      label: 'Server',
+      items: [
+        'server/apache',
+        'server/docker',
+        'server/goaccess',
+        'server/htop',
+        'server/iptables',
+        'server/kubernetes',
+        'server/letsencrypt',
+        'server/lynis',
+        'server/mail',
+        'server/monit',
+        'server/nginx',
+        'server/ubuntu',
+        'server/ufw',
+      ],
+    },
+  ],
+};

+ 32 - 0
src/css/custom.css

@@ -0,0 +1,32 @@
+/* stylelint-disable docusaurus/copyright-header */
+/**
+ * Any CSS included here will be global. The classic template
+ * bundles Infima by default. Infima is a CSS framework designed to
+ * work well for content-centric websites.
+ */
+
+/* You can override the default Infima variables here. */
+:root {
+  --ifm-color-primary: #25c2a0;
+  --ifm-color-primary-dark: rgb(33, 175, 144);
+  --ifm-color-primary-darker: rgb(31, 165, 136);
+  --ifm-color-primary-darkest: rgb(26, 136, 112);
+  --ifm-color-primary-light: rgb(70, 203, 174);
+  --ifm-color-primary-lighter: rgb(102, 212, 189);
+  --ifm-color-primary-lightest: rgb(146, 224, 208);
+  --ifm-code-font-size: 95%;
+}
+
+.docusaurus-highlight-code-line {
+  background-color: rgb(72, 77, 91);
+  display: block;
+  margin: 0 calc(-1 * var(--ifm-pre-padding));
+  padding: 0 var(--ifm-pre-padding);
+}
+
+.moon::before {
+   content: '\1F31C'; 
+ }
+ .sun::before {
+   content: '\1F31E';
+ }

+ 29 - 0
src/pages/about.md

@@ -0,0 +1,29 @@
+---
+title: About | TIL
+---
+
+# About
+
+#### (TIL) Today I Learned
+Today I learned that Google will translate to and from [Zulu](https://en.wikipedia.org/wiki/Zulu_language).  
+
+![zulu](https://davidawindham.com/til/img/zulu.png)  
+
+ My page is referring to the database and computer operating system and not the Zulu philosophy of a universal bond of sharing that connects all humanity. (https://en.wikipedia.org/wiki/Ubuntu_(philosophy)
+
+One of the best sub-reddits is [TIL](https://www.reddit.com/r/todayilearned/) and other organizations have published thier own TILs ([https://github.com/thoughtbot/til](https://github.com/thoughtbot/til) & [http://video.nationalgeographic.com/video/til](http://video.nationalgeographic.com/video/til)) . I figured that since I spend most of my working time with the terminal, git, and text files, a more efficient and easier method of documenting the time I spend reading other documentation would be to build my own TIL. This way the information I aquire will be easy to record, search and edit.
+
+I'm often searching online documentation for answers to commands, configurations, and error messages. The problem is that I've found myself repeating those searches because of the breadth and depth of the amount of functions and libraries involved in development. My wife suggested I call it TIHIDI (this is how I did it) after explaining what I was working on. It makes sense to put my daily explorations into this publication in lieu of publishing them in the database of my main site because Gitbook is quicker, easier to search, and I can keep all the files in a version control repository on my local machine as well. It'll help keep me keep my bookmarks as little less cluttered and it'll leave my [desk page](https://davidawindham.com/desk) free for longer form essays.  I'm hoping this document will be of assistance. After this README, I'll write a [help page](/help) and I'll add some of my [vi cheat sheets](/docs/editors/vi) to get started.  
+
+
+
+---
+
+### Notes  
+#### 03/18/2021
+
+Migrated this version from Gitbook because it wasn't playing nicely with Node.js v14 and it had a couple security vulnerabilities in the packages. Gitbook stop supporting the open source version likely for business reasons, so I migrated it all to ~~[https://docsify.js.org/](https://docsify.js.org/)~~... didn't do docsify because I can't generate static HTML which is what my DOM parser depends on to pull content elsewhere. Decided on using [https://docusaurus.io/](https://docusaurus.io/) instead. It required a bit of cleanup in the Markdown to do so. See: [https://davidawindham.com/til/help](/help)
+
+#### 05/02/2017  
+
+While working on another project yesterday afternoon, I ran into set of documentation ([https://docs.feathersjs.com/](https://docs.feathersjs.com/)) that I spent a lot of time reading and will likely forget about sometime soon after I abandon using the library in other projects. Of course I stuffed a bookmark of the documentation into my quasi organized set of chrome bookmarks based on each project, but the fact that the documentation was hosted using [Gitbook](https://github.com/GitbookIO/gitbook), reminded me of a practice I've seen others do.

+ 541 - 0
src/pages/help.md

@@ -0,0 +1,541 @@
+---
+title: Help | TIL
+---
+
+# Help
+
+Because sometimes I forget how to drive the software I'm running.
+
+### Docusaurus
+[https://v2.docusaurus.io/docs](https://v2.docusaurus.io/docs)
+```
+npm install
+npm run start
+npm run build  
+```
+#### Creating Docs
+Create a Markdown file in /docs/doc.md  
+Add to sidebars.js
+
+#### Meta Data using Front Matter
+```
+---
+id: my-doc
+title: My document title
+description: My document description
+sidebar_label: My doc
+---
+
+Markdown content
+```
+#### Markdown links
+url paths or relative file paths
+```
+[Create a page](/create-a-page)
+[Create a page](./create-a-page.md)
+```
+
+---
+* 03/18/21 **Gotta Migrate** my TIL. Just noticed that gitbook doesn't play nicely with Node.js v14.
+
+```sh
+david@macs🐶:~/sites/daw_til(master⚡) » gitbook serve --no-live
+/Users/david/.nvm/versions/node/v14.15.4/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js:287
+      if (cb) cb.apply(this, arguments)
+TypeError: cb.apply is not a function
+    at /Users/david/.nvm/versions/node/v14.15.4/lib/node_modules/gitbook-cli/node_modules/npm/node_modules/graceful-fs/polyfills.js:287:18
+    at FSReqCallback.oncomplete (fs.js:184:5)
+david@macs🐶:~/sites/daw_til(master⚡) » node -v                                                                                        
+v14.15.4
+david@macs🐶:~/sites/daw_til(master⚡) » nvm ls
+        v6.10.3
+        v6.11.2
+         v7.6.0
+         v8.4.0
+        v8.11.4
+        v8.12.0
+       v10.16.3
+->     v14.15.4
+         system
+default -> 14 (-> v14.15.4)
+unstable -> N/A (default)
+node -> stable (-> v14.15.4) (default)
+stable -> 14.15 (-> v14.15.4) (default)
+iojs -> iojs- (-> system) (default)
+lts/* -> lts/fermium (-> v14.15.4)
+lts/argon -> v4.9.1 (-> N/A)
+lts/boron -> v6.17.1 (-> N/A)
+lts/carbon -> v8.17.0 (-> N/A)
+lts/dubnium -> v10.23.2 (-> N/A)
+lts/erbium -> v12.20.1 (-> N/A)
+lts/fermium -> v14.15.4
+david@macs🐶:~/sites/daw_til(master⚡) » nvm use 10.16.3
+Now using node v10.16.3 (npm v7.5.4)
+david@macs🐶:~/sites/daw_til(master⚡) » gitbook serve --no-live
+info: 18 plugins are installed...
+```
+
+* 3/14/20 Ran into a couple errors with Gitbook and noticed that they are deprecating the open source version. Will need to migrate Gitbook to Docsify:
+    * [https://github.com/GitbookIO/gitbook](https://github.com/GitbookIO/gitbook)
+    * [https://github.com/docsifyjs/docsify/](https://github.com/docsifyjs/docsify/)
+    * the current [Gitbook Search Plugin](https://github.com/lwdgit/gitbook-plugin-search-plus) key to the current setup and the docsify search is good.
+    * ran package upgrades before migration.  
+    * docsify doesn't support all prism languages - [https://docsify.js.org/#/language-highlight?id=language-highlight](https://docsify.js.org/#/language-highlight?id=language-highlight)
+    * [gitbook-prism-plugin](https://github.com/gaearon/gitbook-plugin-prism) has an outdated version of [prism](https://www.npmjs.com/package/prismjs).
+    * forked pkg to [https://www.npmjs.com/package/gitbook-plugin-prism-dw](https://www.npmjs.com/package/gitbook-plugin-prism-dw)
+    * add "gitbook-plugin-prism-dw": "^2.4.1" to pkg.json
+
+#### migrate
+```sh
+# install docsify globally
+npm  i docsify-cli -g
+# copy existing repo
+mv til/ til_old
+cp /til_old /til
+docsify init til/
+# Rename summary.md to _sidebar.md
+mv summary.md _sidebar.md
+#add loadSidebar: true to window.$docsify in index.html
+docsify serve
+```
+#### migrate notes:
+
+
+
+```js
+{
+  "name": "windhamdavid_til",
+  "version": "1.0.0",
+  "description": "my til gitbook",
+  "dependencies": {
+    "gitbook": "^3.2.3",
+    "gitbook-plugin-ace": "^0.3.2",
+    "gitbook-plugin-advanced-emoji": "^0.2.2",
+    "gitbook-plugin-anchors": "^0.7.1",
+    "gitbook-plugin-github-embed": "^1.3.1",
+    "gitbook-plugin-piwik": "^0.2.1",
+    "gitbook-plugin-search-plus": "^1.0.4-alpha-3",
+    "gitbook-plugin-toggle-chapters": "0.0.3",
+    "gitbook-plugin-toggle-headers": "^0.1.0",
+    "gitbook-plugin-video": "0.0.3"
+  },
+  "devDependencies": {},
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/windhamdavid/til.git"
+  },
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "David A. Windham",
+  "private": true,
+  "license": "UNLICENSED",
+  "homepage": "https://davidawindham.com"
+}
+
+```
+```sh
+david@macs:~/sites/til(master⚡) » npm outdated                                                          130 ↵
+Package                      Current         Wanted         Latest  Location
+gitbook-plugin-search-plus     1.0.3  1.0.4-alpha-3  1.0.4-alpha-3  windhamdavid_til
+gitbook                        3.2.2          3.2.3          2.6.9  windhamdavid_til
+gitbook-plugin-github-embed    1.1.2          1.3.1          1.3.1  windhamdavid_til
+
+```
+
+
+### Gitbook:
+[https://github.com/GitbookIO/gitbook](https://github.com/GitbookIO/gitbook)  
+[https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md](https://github.com/GitbookIO/gitbook/blob/master/docs/setup.md)  
+[https://toolchain.gitbook.com/](https://toolchain.gitbook.com/)
+```
+npm install -g gitbook-cli
+
+cd sites/til
+gitbook help
+gitbook build .
+gitbook serve .
+http://localhost:4000/
+```
+run for production without livereload.js
+```
+gitbook serve --no-live
+```
+
+### Markdown:
+
+[Markdown Cheatsheet from Github](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet)
+[Markdown Cheatsheet](https://gist.github.com/jonschlinkert/5854601)
+
+### Code:
+#### Piwik Plugin
+[https://github.com/emmanuel-keller/gitbook-plugin-piwik](https://github.com/emmanuel-keller/gitbook-plugin-piwik)
+
+
+use the language identifier after the back ticks for the code block in markdown  
+
+```html
+<style>
+    * {
+        margin: 0;
+        padding: 0;
+    }
+</style>
+<script>
+    $(document).ready(function(){
+        var something = 5;
+        if (something == 5){
+            console.log('woohoo');
+        }
+    });
+</script>
+<section>
+    <p>Hello world</p>
+</section>
+```
+
+#### Github
+[https://github.com/visallo/gitbook-plugin-github-embed](https://github.com/visallo/gitbook-plugin-github-embed)
+
+#### Toggle Chapters
+[https://github.com/poojan/gitbook-plugin-toggle-chapters](https://github.com/poojan/gitbook-plugin-toggle-chapters)  
+[https://github.com/hypertrack/gitbook-plugin-toggle-headers](https://github.com/hypertrack/gitbook-plugin-toggle-headers)
+
+### Media:
+#### Images:
+```
+![tabs](./img/til_tabs.png)
+```  
+
+#### Add video from Youtube or Vimeo
+```
+{% video %}https://www.domain.com/video_url{% endvideo %}
+
+```
+#### Add video from source file
+```
+//add url using html5
+<video width="720" height="480" controls src="/media/wha.mp4" type="video/mp4"></video>
+```
+
+###HTML
+adding published date with microformat
+[https://www.w3.org/TR/NOTE-datetime](https://www.w3.org/TR/NOTE-datetime)
+```
+<time class="updated" datetime="2016-11-30T11:16:16+00:00" itemprop="datePublished">11/30/2016</time>
+```
+
+
+### Emojis
+
+People
+
+| :bowtie: `:bowtie:` | :smile: `:smile:` | :laughing: `:laughing:` |
+|---|---|---|
+| :blush: `:blush:` | :smiley: `:smiley:` | :relaxed: `:relaxed:` |
+| :smirk: `:smirk:` | :heart_eyes: `:heart_eyes:` | :kissing_heart: `:kissing_heart:` |
+| :kissing_closed_eyes: `:kissing_closed_eyes:` | :flushed: `:flushed:` | :relieved: `:relieved:` |
+| :satisfied: `:satisfied:` | :grin: `:grin:` | :wink: `:wink:` |
+| :stuck_out_tongue_winking_eye: `:stuck_out_tongue_winking_eye:` | :stuck_out_tongue_closed_eyes: `:stuck_out_tongue_closed_eyes:` | :grinning: `:grinning:` |
+| :kissing: `:kissing:` | :kissing_smiling_eyes: `:kissing_smiling_eyes:` | :stuck_out_tongue: `:stuck_out_tongue:` |
+| :sleeping: `:sleeping:` | :worried: `:worried:` | :frowning: `:frowning:` |
+| :anguished: `:anguished:` | :open_mouth: `:open_mouth:` | :grimacing: `:grimacing:` |
+| :confused: `:confused:` | :hushed: `:hushed:` | :expressionless: `:expressionless:` |
+| :unamused: `:unamused:` | :sweat_smile: `:sweat_smile:` | :sweat: `:sweat:` |
+| :disappointed_relieved: `:disappointed_relieved:` | :weary: `:weary:` | :pensive: `:pensive:` |
+| :disappointed: `:disappointed:` | :confounded: `:confounded:` | :fearful: `:fearful:` |
+| :cold_sweat: `:cold_sweat:` | :persevere: `:persevere:` | :cry: `:cry:` |
+| :sob: `:sob:` | :joy: `:joy:` | :astonished: `:astonished:` |
+| :scream: `:scream:` | :neckbeard: `:neckbeard:` | :tired_face: `:tired_face:` |
+| :angry: `:angry:` | :rage: `:rage:` | :triumph: `:triumph:` |
+| :sleepy: `:sleepy:` | :yum: `:yum:` | :mask: `:mask:` |
+| :sunglasses: `:sunglasses:` | :dizzy_face: `:dizzy_face:` | :imp: `:imp:` |
+| :smiling_imp: `:smiling_imp:` | :neutral_face: `:neutral_face:` | :no_mouth: `:no_mouth:` |
+| :innocent: `:innocent:` | :alien: `:alien:` | :yellow_heart: `:yellow_heart:` |
+| :blue_heart: `:blue_heart:` | :purple_heart: `:purple_heart:` | :heart: `:heart:` |
+| :green_heart: `:green_heart:` | :broken_heart: `:broken_heart:` | :heartbeat: `:heartbeat:` |
+| :heartpulse: `:heartpulse:` | :two_hearts: `:two_hearts:` | :revolving_hearts: `:revolving_hearts:` |
+| :cupid: `:cupid:` | :sparkling_heart: `:sparkling_heart:` | :sparkles: `:sparkles:` |
+| :star: `:star:` | :star2: `:star2:` | :dizzy: `:dizzy:` |
+| :boom: `:boom:` | :collision: `:collision:` | :anger: `:anger:` |
+| :exclamation: `:exclamation:` | :question: `:question:` | :grey_exclamation: `:grey_exclamation:` |
+| :grey_question: `:grey_question:` | :zzz: `:zzz:` | :dash: `:dash:` |
+| :sweat_drops: `:sweat_drops:` | :notes: `:notes:` | :musical_note: `:musical_note:` |
+| :fire: `:fire:` | :hankey: `:hankey:` | :poop: `:poop:` |
+| :shit: `:shit:` | :+1: `:+1:` | :thumbsup: `:thumbsup:` |
+| :-1: `:-1:` | :thumbsdown: `:thumbsdown:` | :ok_hand: `:ok_hand:` |
+| :punch: `:punch:` | :facepunch: `:facepunch:` | :fist: `:fist:` |
+| :v: `:v:` | :wave: `:wave:` | :hand: `:hand:` |
+| :raised_hand: `:raised_hand:` | :open_hands: `:open_hands:` | :point_up: `:point_up:` |
+| :point_down: `:point_down:` | :point_left: `:point_left:` | :point_right: `:point_right:` |
+| :raised_hands: `:raised_hands:` | :pray: `:pray:` | :point_up_2: `:point_up_2:` |
+| :clap: `:clap:` | :muscle: `:muscle:` | :metal: `:metal:` |
+| :fu: `:fu:` | :walking: `:walking:` | :runner: `:runner:` |
+| :running: `:running:` | :couple: `:couple:` | :family: `:family:` |
+| :two_men_holding_hands: `:two_men_holding_hands:` | :two_women_holding_hands: `:two_women_holding_hands:` | :dancer: `:dancer:` |
+| :dancers: `:dancers:` | :ok_woman: `:ok_woman:` | :no_good: `:no_good:` |
+| :information_desk_person: `:information_desk_person:` | :raising_hand: `:raising_hand:` | :bride_with_veil: `:bride_with_veil:` |
+| :person_with_pouting_face: `:person_with_pouting_face:` | :person_frowning: `:person_frowning:` | :bow: `:bow:` |
+| :couplekiss: `:couplekiss:` | :couple_with_heart: `:couple_with_heart:` | :massage: `:massage:` |
+| :haircut: `:haircut:` | :nail_care: `:nail_care:` | :boy: `:boy:` |
+| :girl: `:girl:` | :woman: `:woman:` | :man: `:man:` |
+| :baby: `:baby:` | :older_woman: `:older_woman:` | :older_man: `:older_man:` |
+| :person_with_blond_hair: `:person_with_blond_hair:` | :man_with_gua_pi_mao: `:man_with_gua_pi_mao:` | :man_with_turban: `:man_with_turban:` |
+| :construction_worker: `:construction_worker:` | :cop: `:cop:` | :angel: `:angel:` |
+| :princess: `:princess:` | :smiley_cat: `:smiley_cat:` | :smile_cat: `:smile_cat:` |
+| :heart_eyes_cat: `:heart_eyes_cat:` | :kissing_cat: `:kissing_cat:` | :smirk_cat: `:smirk_cat:` |
+| :scream_cat: `:scream_cat:` | :crying_cat_face: `:crying_cat_face:` | :joy_cat: `:joy_cat:` |
+| :pouting_cat: `:pouting_cat:` | :japanese_ogre: `:japanese_ogre:` | :japanese_goblin: `:japanese_goblin:` |
+| :see_no_evil: `:see_no_evil:` | :hear_no_evil: `:hear_no_evil:` | :speak_no_evil: `:speak_no_evil:` |
+| :guardsman: `:guardsman:` | :skull: `:skull:` | :feet: `:feet:` |
+| :lips: `:lips:` | :kiss: `:kiss:` | :droplet: `:droplet:` |
+| :ear: `:ear:` | :eyes: `:eyes:` | :nose: `:nose:` |
+| :tongue: `:tongue:` | :love_letter: `:love_letter:` | :bust_in_silhouette: `:bust_in_silhouette:` |
+| :busts_in_silhouette: `:busts_in_silhouette:` | :speech_balloon: `:speech_balloon:` | :thought_balloon: `:thought_balloon:` |
+| :feelsgood: `:feelsgood:` | :finnadie: `:finnadie:` | :goberserk: `:goberserk:` |
+| :godmode: `:godmode:` | :hurtrealbad: `:hurtrealbad:` | :rage1: `:rage1:` |
+| :rage2: `:rage2:` | :rage3: `:rage3:` | :rage4: `:rage4:` |
+| :suspect: `:suspect:` | :trollface: `:trollface:` |
+
+Nature
+
+| :sunny: `:sunny:` | :umbrella: `:umbrella:` | :cloud: `:cloud:` |
+|---|---|---|
+| :snowflake: `:snowflake:` | :snowman: `:snowman:` | :zap: `:zap:` |
+| :cyclone: `:cyclone:` | :foggy: `:foggy:` | :ocean: `:ocean:` |
+| :cat: `:cat:` | :dog: `:dog:` | :mouse: `:mouse:` |
+| :hamster: `:hamster:` | :rabbit: `:rabbit:` | :wolf: `:wolf:` |
+| :frog: `:frog:` | :tiger: `:tiger:` | :koala: `:koala:` |
+| :bear: `:bear:` | :pig: `:pig:` | :pig_nose: `:pig_nose:` |
+| :cow: `:cow:` | :boar: `:boar:` | :monkey_face: `:monkey_face:` |
+| :monkey: `:monkey:` | :horse: `:horse:` | :racehorse: `:racehorse:` |
+| :camel: `:camel:` | :sheep: `:sheep:` | :elephant: `:elephant:` |
+| :panda_face: `:panda_face:` | :snake: `:snake:` | :bird: `:bird:` |
+| :baby_chick: `:baby_chick:` | :hatched_chick: `:hatched_chick:` | :hatching_chick: `:hatching_chick:` |
+| :chicken: `:chicken:` | :penguin: `:penguin:` | :turtle: `:turtle:` |
+| :bug: `:bug:` | :honeybee: `:honeybee:` | :ant: `:ant:` |
+| :beetle: `:beetle:` | :snail: `:snail:` | :octopus: `:octopus:` |
+| :tropical_fish: `:tropical_fish:` | :fish: `:fish:` | :whale: `:whale:` |
+| :whale2: `:whale2:` | :dolphin: `:dolphin:` | :cow2: `:cow2:` |
+| :ram: `:ram:` | :rat: `:rat:` | :water_buffalo: `:water_buffalo:` |
+| :tiger2: `:tiger2:` | :rabbit2: `:rabbit2:` | :dragon: `:dragon:` |
+| :goat: `:goat:` | :rooster: `:rooster:` | :dog2: `:dog2:` |
+| :pig2: `:pig2:` | :mouse2: `:mouse2:` | :ox: `:ox:` |
+| :dragon_face: `:dragon_face:` | :blowfish: `:blowfish:` | :crocodile: `:crocodile:` |
+| :dromedary_camel: `:dromedary_camel:` | :leopard: `:leopard:` | :cat2: `:cat2:` |
+| :poodle: `:poodle:` | :paw_prints: `:paw_prints:` | :bouquet: `:bouquet:` |
+| :cherry_blossom: `:cherry_blossom:` | :tulip: `:tulip:` | :four_leaf_clover: `:four_leaf_clover:` |
+| :rose: `:rose:` | :sunflower: `:sunflower:` | :hibiscus: `:hibiscus:` |
+| :maple_leaf: `:maple_leaf:` | :leaves: `:leaves:` | :fallen_leaf: `:fallen_leaf:` |
+| :herb: `:herb:` | :mushroom: `:mushroom:` | :cactus: `:cactus:` |
+| :palm_tree: `:palm_tree:` | :evergreen_tree: `:evergreen_tree:` | :deciduous_tree: `:deciduous_tree:` |
+| :chestnut: `:chestnut:` | :seedling: `:seedling:` | :blossom: `:blossom:` |
+| :ear_of_rice: `:ear_of_rice:` | :shell: `:shell:` | :globe_with_meridians: `:globe_with_meridians:` |
+| :sun_with_face: `:sun_with_face:` | :full_moon_with_face: `:full_moon_with_face:` | :new_moon_with_face: `:new_moon_with_face:` |
+| :new_moon: `:new_moon:` | :waxing_crescent_moon: `:waxing_crescent_moon:` | :first_quarter_moon: `:first_quarter_moon:` |
+| :waxing_gibbous_moon: `:waxing_gibbous_moon:` | :full_moon: `:full_moon:` | :waning_gibbous_moon: `:waning_gibbous_moon:` |
+| :last_quarter_moon: `:last_quarter_moon:` | :waning_crescent_moon: `:waning_crescent_moon:` | :last_quarter_moon_with_face: `:last_quarter_moon_with_face:` |
+| :first_quarter_moon_with_face: `:first_quarter_moon_with_face:` | :moon: `:moon:` | :earth_africa: `:earth_africa:` |
+| :earth_americas: `:earth_americas:` | :earth_asia: `:earth_asia:` | :volcano: `:volcano:` |
+| :milky_way: `:milky_way:` | :partly_sunny: `:partly_sunny:` | :octocat: `:octocat:` |
+| :squirrel: `:squirrel:` |
+
+Objects
+
+| :bamboo: `:bamboo:` | :gift_heart: `:gift_heart:` | :dolls: `:dolls:` |
+|---|---|---|
+| :school_satchel: `:school_satchel:` | :mortar_board: `:mortar_board:` | :flags: `:flags:` |
+| :fireworks: `:fireworks:` | :sparkler: `:sparkler:` | :wind_chime: `:wind_chime:` |
+| :rice_scene: `:rice_scene:` | :jack_o_lantern: `:jack_o_lantern:` | :ghost: `:ghost:` |
+| :santa: `:santa:` | :christmas_tree: `:christmas_tree:` | :gift: `:gift:` |
+| :bell: `:bell:` | :no_bell: `:no_bell:` | :tanabata_tree: `:tanabata_tree:` |
+| :tada: `:tada:` | :confetti_ball: `:confetti_ball:` | :balloon: `:balloon:` |
+| :crystal_ball: `:crystal_ball:` | :cd: `:cd:` | :dvd: `:dvd:` |
+| :floppy_disk: `:floppy_disk:` | :camera: `:camera:` | :video_camera: `:video_camera:` |
+| :movie_camera: `:movie_camera:` | :computer: `:computer:` | :tv: `:tv:` |
+| :iphone: `:iphone:` | :phone: `:phone:` | :telephone: `:telephone:` |
+| :telephone_receiver: `:telephone_receiver:` | :pager: `:pager:` | :fax: `:fax:` |
+| :minidisc: `:minidisc:` | :vhs: `:vhs:` | :sound: `:sound:` |
+| :speaker: `:speaker:` | :mute: `:mute:` | :loudspeaker: `:loudspeaker:` |
+| :mega: `:mega:` | :hourglass: `:hourglass:` | :hourglass_flowing_sand: `:hourglass_flowing_sand:` |
+| :alarm_clock: `:alarm_clock:` | :watch: `:watch:` | :radio: `:radio:` |
+| :satellite: `:satellite:` | :loop: `:loop:` | :mag: `:mag:` |
+| :mag_right: `:mag_right:` | :unlock: `:unlock:` | :lock: `:lock:` |
+| :lock_with_ink_pen: `:lock_with_ink_pen:` | :closed_lock_with_key: `:closed_lock_with_key:` | :key: `:key:` |
+| :bulb: `:bulb:` | :flashlight: `:flashlight:` | :high_brightness: `:high_brightness:` |
+| :low_brightness: `:low_brightness:` | :electric_plug: `:electric_plug:` | :battery: `:battery:` |
+| :calling: `:calling:` | :email: `:email:` | :mailbox: `:mailbox:` |
+| :postbox: `:postbox:` | :bath: `:bath:` | :bathtub: `:bathtub:` |
+| :shower: `:shower:` | :toilet: `:toilet:` | :wrench: `:wrench:` |
+| :nut_and_bolt: `:nut_and_bolt:` | :hammer: `:hammer:` | :seat: `:seat:` |
+| :moneybag: `:moneybag:` | :yen: `:yen:` | :dollar: `:dollar:` |
+| :pound: `:pound:` | :euro: `:euro:` | :credit_card: `:credit_card:` |
+| :money_with_wings: `:money_with_wings:` | :e-mail: `:e-mail:` | :inbox_tray: `:inbox_tray:` |
+| :outbox_tray: `:outbox_tray:` | :envelope: `:envelope:` | :incoming_envelope: `:incoming_envelope:` |
+| :postal_horn: `:postal_horn:` | :mailbox_closed: `:mailbox_closed:` | :mailbox_with_mail: `:mailbox_with_mail:` |
+| :mailbox_with_no_mail: `:mailbox_with_no_mail:` | :door: `:door:` | :smoking: `:smoking:` |
+| :bomb: `:bomb:` | :gun: `:gun:` | :hocho: `:hocho:` |
+| :pill: `:pill:` | :syringe: `:syringe:` | :page_facing_up: `:page_facing_up:` |
+| :page_with_curl: `:page_with_curl:` | :bookmark_tabs: `:bookmark_tabs:` | :bar_chart: `:bar_chart:` |
+| :chart_with_upwards_trend: `:chart_with_upwards_trend:` | :chart_with_downwards_trend: `:chart_with_downwards_trend:` | :scroll: `:scroll:` |
+| :clipboard: `:clipboard:` | :calendar: `:calendar:` | :date: `:date:` |
+| :card_index: `:card_index:` | :file_folder: `:file_folder:` | :open_file_folder: `:open_file_folder:` |
+| :scissors: `:scissors:` | :pushpin: `:pushpin:` | :paperclip: `:paperclip:` |
+| :black_nib: `:black_nib:` | :pencil2: `:pencil2:` | :straight_ruler: `:straight_ruler:` |
+| :triangular_ruler: `:triangular_ruler:` | :closed_book: `:closed_book:` | :green_book: `:green_book:` |
+| :blue_book: `:blue_book:` | :orange_book: `:orange_book:` | :notebook: `:notebook:` |
+| :notebook_with_decorative_cover: `:notebook_with_decorative_cover:` | :ledger: `:ledger:` | :books: `:books:` |
+| :bookmark: `:bookmark:` | :name_badge: `:name_badge:` | :microscope: `:microscope:` |
+| :telescope: `:telescope:` | :newspaper: `:newspaper:` | :football: `:football:` |
+| :basketball: `:basketball:` | :soccer: `:soccer:` | :baseball: `:baseball:` |
+| :tennis: `:tennis:` | :8ball: `:8ball:` | :rugby_football: `:rugby_football:` |
+| :bowling: `:bowling:` | :golf: `:golf:` | :mountain_bicyclist: `:mountain_bicyclist:` |
+| :bicyclist: `:bicyclist:` | :horse_racing: `:horse_racing:` | :snowboarder: `:snowboarder:` |
+| :swimmer: `:swimmer:` | :surfer: `:surfer:` | :ski: `:ski:` |
+| :spades: `:spades:` | :hearts: `:hearts:` | :clubs: `:clubs:` |
+| :diamonds: `:diamonds:` | :gem: `:gem:` | :ring: `:ring:` |
+| :trophy: `:trophy:` | :musical_score: `:musical_score:` | :musical_keyboard: `:musical_keyboard:` |
+| :violin: `:violin:` | :space_invader: `:space_invader:` | :video_game: `:video_game:` |
+| :black_joker: `:black_joker:` | :flower_playing_cards: `:flower_playing_cards:` | :game_die: `:game_die:` |
+| :dart: `:dart:` | :mahjong: `:mahjong:` | :clapper: `:clapper:` |
+| :memo: `:memo:` | :pencil: `:pencil:` | :book: `:book:` |
+| :art: `:art:` | :microphone: `:microphone:` | :headphones: `:headphones:` |
+| :trumpet: `:trumpet:` | :saxophone: `:saxophone:` | :guitar: `:guitar:` |
+| :shoe: `:shoe:` | :sandal: `:sandal:` | :high_heel: `:high_heel:` |
+| :lipstick: `:lipstick:` | :boot: `:boot:` | :shirt: `:shirt:` |
+| :tshirt: `:tshirt:` | :necktie: `:necktie:` | :womans_clothes: `:womans_clothes:` |
+| :dress: `:dress:` | :running_shirt_with_sash: `:running_shirt_with_sash:` | :jeans: `:jeans:` |
+| :kimono: `:kimono:` | :bikini: `:bikini:` | :ribbon: `:ribbon:` |
+| :tophat: `:tophat:` | :crown: `:crown:` | :womans_hat: `:womans_hat:` |
+| :mans_shoe: `:mans_shoe:` | :closed_umbrella: `:closed_umbrella:` | :briefcase: `:briefcase:` |
+| :handbag: `:handbag:` | :pouch: `:pouch:` | :purse: `:purse:` |
+| :eyeglasses: `:eyeglasses:` | :fishing_pole_and_fish: `:fishing_pole_and_fish:` | :coffee: `:coffee:` |
+| :tea: `:tea:` | :sake: `:sake:` | :baby_bottle: `:baby_bottle:` |
+| :beer: `:beer:` | :beers: `:beers:` | :cocktail: `:cocktail:` |
+| :tropical_drink: `:tropical_drink:` | :wine_glass: `:wine_glass:` | :fork_and_knife: `:fork_and_knife:` |
+| :pizza: `:pizza:` | :hamburger: `:hamburger:` | :fries: `:fries:` |
+| :poultry_leg: `:poultry_leg:` | :meat_on_bone: `:meat_on_bone:` | :spaghetti: `:spaghetti:` |
+| :curry: `:curry:` | :fried_shrimp: `:fried_shrimp:` | :bento: `:bento:` |
+| :sushi: `:sushi:` | :fish_cake: `:fish_cake:` | :rice_ball: `:rice_ball:` |
+| :rice_cracker: `:rice_cracker:` | :rice: `:rice:` | :ramen: `:ramen:` |
+| :stew: `:stew:` | :oden: `:oden:` | :dango: `:dango:` |
+| :egg: `:egg:` | :bread: `:bread:` | :doughnut: `:doughnut:` |
+| :custard: `:custard:` | :icecream: `:icecream:` | :ice_cream: `:ice_cream:` |
+| :shaved_ice: `:shaved_ice:` | :birthday: `:birthday:` | :cake: `:cake:` |
+| :cookie: `:cookie:` | :chocolate_bar: `:chocolate_bar:` | :candy: `:candy:` |
+| :lollipop: `:lollipop:` | :honey_pot: `:honey_pot:` | :apple: `:apple:` |
+| :green_apple: `:green_apple:` | :tangerine: `:tangerine:` | :lemon: `:lemon:` |
+| :cherries: `:cherries:` | :grapes: `:grapes:` | :watermelon: `:watermelon:` |
+| :strawberry: `:strawberry:` | :peach: `:peach:` | :melon: `:melon:` |
+| :banana: `:banana:` | :pear: `:pear:` | :pineapple: `:pineapple:` |
+| :sweet_potato: `:sweet_potato:` | :eggplant: `:eggplant:` | :tomato: `:tomato:` |
+| :corn: `:corn:` |
+
+Places
+
+| :house: `:house:` | :house_with_garden: `:house_with_garden:` | :school: `:school:` |
+|---|---|---|
+| :office: `:office:` | :post_office: `:post_office:` | :hospital: `:hospital:` |
+| :bank: `:bank:` | :convenience_store: `:convenience_store:` | :love_hotel: `:love_hotel:` |
+| :hotel: `:hotel:` | :wedding: `:wedding:` | :church: `:church:` |
+| :department_store: `:department_store:` | :european_post_office: `:european_post_office:` | :city_sunrise: `:city_sunrise:` |
+| :city_sunset: `:city_sunset:` | :japanese_castle: `:japanese_castle:` | :european_castle: `:european_castle:` |
+| :tent: `:tent:` | :factory: `:factory:` | :tokyo_tower: `:tokyo_tower:` |
+| :japan: `:japan:` | :mount_fuji: `:mount_fuji:` | :sunrise_over_mountains: `:sunrise_over_mountains:` |
+| :sunrise: `:sunrise:` | :stars: `:stars:` | :statue_of_liberty: `:statue_of_liberty:` |
+| :bridge_at_night: `:bridge_at_night:` | :carousel_horse: `:carousel_horse:` | :rainbow: `:rainbow:` |
+| :ferris_wheel: `:ferris_wheel:` | :fountain: `:fountain:` | :roller_coaster: `:roller_coaster:` |
+| :ship: `:ship:` | :speedboat: `:speedboat:` | :boat: `:boat:` |
+| :sailboat: `:sailboat:` | :rowboat: `:rowboat:` | :anchor: `:anchor:` |
+| :rocket: `:rocket:` | :airplane: `:airplane:` | :helicopter: `:helicopter:` |
+| :steam_locomotive: `:steam_locomotive:` | :tram: `:tram:` | :mountain_railway: `:mountain_railway:` |
+| :bike: `:bike:` | :aerial_tramway: `:aerial_tramway:` | :suspension_railway: `:suspension_railway:` |
+| :mountain_cableway: `:mountain_cableway:` | :tractor: `:tractor:` | :blue_car: `:blue_car:` |
+| :oncoming_automobile: `:oncoming_automobile:` | :car: `:car:` | :red_car: `:red_car:` |
+| :taxi: `:taxi:` | :oncoming_taxi: `:oncoming_taxi:` | :articulated_lorry: `:articulated_lorry:` |
+| :bus: `:bus:` | :oncoming_bus: `:oncoming_bus:` | :rotating_light: `:rotating_light:` |
+| :police_car: `:police_car:` | :oncoming_police_car: `:oncoming_police_car:` | :fire_engine: `:fire_engine:` |
+| :ambulance: `:ambulance:` | :minibus: `:minibus:` | :truck: `:truck:` |
+| :train: `:train:` | :station: `:station:` | :train2: `:train2:` |
+| :bullettrain_front: `:bullettrain_front:` | :bullettrain_side: `:bullettrain_side:` | :light_rail: `:light_rail:` |
+| :monorail: `:monorail:` | :railway_car: `:railway_car:` | :trolleybus: `:trolleybus:` |
+| :ticket: `:ticket:` | :fuelpump: `:fuelpump:` | :vertical_traffic_light: `:vertical_traffic_light:` |
+| :traffic_light: `:traffic_light:` | :warning: `:warning:` | :construction: `:construction:` |
+| :beginner: `:beginner:` | :atm: `:atm:` | :slot_machine: `:slot_machine:` |
+| :busstop: `:busstop:` | :barber: `:barber:` | :hotsprings: `:hotsprings:` |
+| :checkered_flag: `:checkered_flag:` | :crossed_flags: `:crossed_flags:` | :izakaya_lantern: `:izakaya_lantern:` |
+| :moyai: `:moyai:` | :circus_tent: `:circus_tent:` | :performing_arts: `:performing_arts:` |
+| :round_pushpin: `:round_pushpin:` | :triangular_flag_on_post: `:triangular_flag_on_post:` | :jp: `:jp:` |
+| :kr: `:kr:` | :cn: `:cn:` | :us: `:us:` |
+| :fr: `:fr:` | :es: `:es:` | :it: `:it:` |
+| :ru: `:ru:` | :gb: `:gb:` | :uk: `:uk:` |
+| :de: `:de:` |
+
+Symbols
+
+| :one: `:one:` | :two: `:two:` | :three: `:three:` |
+|---|---|---|
+| :four: `:four:` | :five: `:five:` | :six: `:six:` |
+| :seven: `:seven:` | :eight: `:eight:` | :nine: `:nine:` |
+| :keycap_ten: `:keycap_ten:` | :1234: `:1234:` | :zero: `:zero:` |
+| :hash: `:hash:` | :symbols: `:symbols:` | :arrow_backward: `:arrow_backward:` |
+| :arrow_down: `:arrow_down:` | :arrow_forward: `:arrow_forward:` | :arrow_left: `:arrow_left:` |
+| :capital_abcd: `:capital_abcd:` | :abcd: `:abcd:` | :abc: `:abc:` |
+| :arrow_lower_left: `:arrow_lower_left:` | :arrow_lower_right: `:arrow_lower_right:` | :arrow_right: `:arrow_right:` |
+| :arrow_up: `:arrow_up:` | :arrow_upper_left: `:arrow_upper_left:` | :arrow_upper_right: `:arrow_upper_right:` |
+| :arrow_double_down: `:arrow_double_down:` | :arrow_double_up: `:arrow_double_up:` | :arrow_down_small: `:arrow_down_small:` |
+| :arrow_heading_down: `:arrow_heading_down:` | :arrow_heading_up: `:arrow_heading_up:` | :leftwards_arrow_with_hook: `:leftwards_arrow_with_hook:` |
+| :arrow_right_hook: `:arrow_right_hook:` | :left_right_arrow: `:left_right_arrow:` | :arrow_up_down: `:arrow_up_down:` |
+| :arrow_up_small: `:arrow_up_small:` | :arrows_clockwise: `:arrows_clockwise:` | :arrows_counterclockwise: `:arrows_counterclockwise:` |
+| :rewind: `:rewind:` | :fast_forward: `:fast_forward:` | :information_source: `:information_source:` |
+| :ok: `:ok:` | :twisted_rightwards_arrows: `:twisted_rightwards_arrows:` | :repeat: `:repeat:` |
+| :repeat_one: `:repeat_one:` | :new: `:new:` | :top: `:top:` |
+| :up: `:up:` | :cool: `:cool:` | :free: `:free:` |
+| :ng: `:ng:` | :cinema: `:cinema:` | :koko: `:koko:` |
+| :signal_strength: `:signal_strength:` | :u5272: `:u5272:` | :u5408: `:u5408:` |
+| :u55b6: `:u55b6:` | :u6307: `:u6307:` | :u6708: `:u6708:` |
+| :u6709: `:u6709:` | :u6e80: `:u6e80:` | :u7121: `:u7121:` |
+| :u7533: `:u7533:` | :u7a7a: `:u7a7a:` | :u7981: `:u7981:` |
+| :sa: `:sa:` | :restroom: `:restroom:` | :mens: `:mens:` |
+| :womens: `:womens:` | :baby_symbol: `:baby_symbol:` | :no_smoking: `:no_smoking:` |
+| :parking: `:parking:` | :wheelchair: `:wheelchair:` | :metro: `:metro:` |
+| :baggage_claim: `:baggage_claim:` | :accept: `:accept:` | :wc: `:wc:` |
+| :potable_water: `:potable_water:` | :put_litter_in_its_place: `:put_litter_in_its_place:` | :secret: `:secret:` |
+| :congratulations: `:congratulations:` | :m: `:m:` | :passport_control: `:passport_control:` |
+| :left_luggage: `:left_luggage:` | :customs: `:customs:` | :ideograph_advantage: `:ideograph_advantage:` |
+| :cl: `:cl:` | :sos: `:sos:` | :id: `:id:` |
+| :no_entry_sign: `:no_entry_sign:` | :underage: `:underage:` | :no_mobile_phones: `:no_mobile_phones:` |
+| :do_not_litter: `:do_not_litter:` | :non-potable_water: `:non-potable_water:` | :no_bicycles: `:no_bicycles:` |
+| :no_pedestrians: `:no_pedestrians:` | :children_crossing: `:children_crossing:` | :no_entry: `:no_entry:` |
+| :eight_spoked_asterisk: `:eight_spoked_asterisk:` | :eight_pointed_black_star: `:eight_pointed_black_star:` | :heart_decoration: `:heart_decoration:` |
+| :vs: `:vs:` | :vibration_mode: `:vibration_mode:` | :mobile_phone_off: `:mobile_phone_off:` |
+| :chart: `:chart:` | :currency_exchange: `:currency_exchange:` | :aries: `:aries:` |
+| :taurus: `:taurus:` | :gemini: `:gemini:` | :cancer: `:cancer:` |
+| :leo: `:leo:` | :virgo: `:virgo:` | :libra: `:libra:` |
+| :scorpius: `:scorpius:` | :sagittarius: `:sagittarius:` | :capricorn: `:capricorn:` |
+| :aquarius: `:aquarius:` | :pisces: `:pisces:` | :ophiuchus: `:ophiuchus:` |
+| :six_pointed_star: `:six_pointed_star:` | :negative_squared_cross_mark: `:negative_squared_cross_mark:` | :a: `:a:` |
+| :b: `:b:` | :ab: `:ab:` | :o2: `:o2:` |
+| :diamond_shape_with_a_dot_inside: `:diamond_shape_with_a_dot_inside:` | :recycle: `:recycle:` | :end: `:end:` |
+| :on: `:on:` | :soon: `:soon:` | :clock1: `:clock1:` |
+| :clock130: `:clock130:` | :clock10: `:clock10:` | :clock1030: `:clock1030:` |
+| :clock11: `:clock11:` | :clock1130: `:clock1130:` | :clock12: `:clock12:` |
+| :clock1230: `:clock1230:` | :clock2: `:clock2:` | :clock230: `:clock230:` |
+| :clock3: `:clock3:` | :clock330: `:clock330:` | :clock4: `:clock4:` |
+| :clock430: `:clock430:` | :clock5: `:clock5:` | :clock530: `:clock530:` |
+| :clock6: `:clock6:` | :clock630: `:clock630:` | :clock7: `:clock7:` |
+| :clock730: `:clock730:` | :clock8: `:clock8:` | :clock830: `:clock830:` |
+| :clock9: `:clock9:` | :clock930: `:clock930:` | :heavy_dollar_sign: `:heavy_dollar_sign:` |
+| :copyright: `:copyright:` | :registered: `:registered:` | :tm: `:tm:` |
+| :x: `:x:` | :heavy_exclamation_mark: `:heavy_exclamation_mark:` | :bangbang: `:bangbang:` |
+| :interrobang: `:interrobang:` | :o: `:o:` | :heavy_multiplication_x: `:heavy_multiplication_x:` |
+| :heavy_plus_sign: `:heavy_plus_sign:` | :heavy_minus_sign: `:heavy_minus_sign:` | :heavy_division_sign: `:heavy_division_sign:` |
+| :white_flower: `:white_flower:` | :100: `:100:` | :heavy_check_mark: `:heavy_check_mark:` |
+| :ballot_box_with_check: `:ballot_box_with_check:` | :radio_button: `:radio_button:` | :link: `:link:` |
+| :curly_loop: `:curly_loop:` | :wavy_dash: `:wavy_dash:` | :part_alternation_mark: `:part_alternation_mark:` |
+| :trident: `:trident:` | :black_square: `:black_square:` | :white_square: `:white_square:` |
+| :white_check_mark: `:white_check_mark:` | :black_square_button: `:black_square_button:` | :white_square_button: `:white_square_button:` |
+| :black_circle: `:black_circle:` | :white_circle: `:white_circle:` | :red_circle: `:red_circle:` |
+| :large_blue_circle: `:large_blue_circle:` | :large_blue_diamond: `:large_blue_diamond:` | :large_orange_diamond: `:large_orange_diamond:` |
+| :small_blue_diamond: `:small_blue_diamond:` | :small_orange_diamond: `:small_orange_diamond:` | :small_red_triangle: `:small_red_triangle:` |
+| :small_red_triangle_down: `:small_red_triangle_down:` | :shipit: `:shipit:` |

+ 131 - 0
src/pages/index.md

@@ -0,0 +1,131 @@
+---
+title: TIL | Today I Learned
+---
+
+# TIL (Today I Learned)
+* March 2021
+	* [When Redd Foxx died, everyone laughed because they thought it was a reference to Fred Sanford](https://en.wikipedia.org/wiki/Redd_Foxx#Death)
+	* [Woozer data center migration lost the php7.4-fpm sock](https://davidawindham.com/til/projects/woozer.html)
+	* [Gotta Migrate this TIL because Gitbook doesn't play nicely with Node.js v14](https://davidawindham.com/til/help.html)
+* September 2020
+	* [The U.S. now ranks 28th in the Global Social Progress rankings](https://www.socialprogress.org/index/global/results)
+	* [Eisegesis - v. is the process of interpreting text in such a way as to introduce one's own presuppositions](https://en.wikipedia.org/wiki/Eisegesis)
+* August 2020
+	* [Meetings, Bloody Meetings](https://en.wikipedia.org/wiki/Meetings,_Bloody_Meetings)
+* March 2020  
+	* [Zeke](https://davidawindham.com/til/projects/zeke.html)
+	* [Migrate Gitbook to Docsify](https://davidawindham.com/til/help.html)
+	* [Kubernetes Commands](https://davidawindham.com/til/server/kube.html)
+	* [Pandoc is the way to convert doc types](https://github.com/jgm/pandoc)
+	* [Shall We Play a Game? - DDOS Notes](https://davidawindham.com/til/saas/linode.html)
+* February 2020
+	* [Xiph Icecast2 GPG Key expired](https://davidawindham.com/til/host/icecast.html)
+	* [Woozer Ubuntu 18.04 Upgrade](https://davidawindham.com/til/saas/linode.html?h=woozer)
+	* [Jo Harvey Allen is who says "It was love that killed John F. Kennedy. He should have never messed with me. They want me to speak on 60 Minutes. Mike Wallace wants my body" in True Stories](https://davidawindham.com/true-stories-2/)
+* January 2020  
+	* [Annual overhaul of the machines](https://davidawindham.com/late-adopter/)
+	* [MacOS 10.15](https://davidawindham.com/til/localhost/_localhost.html)
+	* [PHP 7.4.2](https://davidawindham.com/til/lang/php.html)
+	* [MySQL 8.0.19](https://davidawindham.com/til/db/mysql.html)
+	* [Ruby 2.7.0](https://davidawindham.com/til/lang/ruby.html)
+	* [Rails 5.2.4.1](https://davidawindham.com/til/lang/rails.html)
+	* [Homebrew 2.2.5](https://davidawindham.com/til/localhost/brew.html)
+	* [Node 2.2.5](https://davidawindham.com/til/localhost/brew.html)
+	* [NPM 6.9.2](https://davidawindham.com/til/lang/npm.html)
+	* [Node 10.16.3](https://davidawindham.com/til/lang/nodejs.html)
+	* [Golang 1.13.7](https://davidawindham.com/til/lang/golang.html)
+* September 2019
+	* [PHP 7.3 updates](/docs/lang/php)
+* January 2019
+	* [LetsEncrypt Certbot TLS-SNI-01 deprecated](https://davidawindham.com/til/server/letsencrypt.html)
+	* [Groucho Marx told Warner Brothers that he owned 'brothers'](https://en.wikipedia.org/wiki/A_Night_in_Casablanca)
+* November 2018   
+	* [Update MongoDB to 4.0.2](https://davidawindham.com/til/db/mongodb.html)  
+	* [Icecast Update Overwrite](https://davidawindham.com/til/host/icecast.html)   
+
+
+* November 2017
+	* [Benchmarking Sites with Firefox, Siege, and Sproxy](https://davidawindham.com/til/host/siege-sproxy.html)
+	* [The Word Disinformation is a translation of a the Russian word dezinformatsiya, which is derived from KGB propaganda](https://en.wikipedia.org/wiki/Disinformation)
+
+* October 2017
+	* [Eliminative materialism](https://en.wikipedia.org/wiki/Eliminative_materialism)
+	* [List of Pantheists](https://en.wikipedia.org/wiki/List_of_pantheists)
+	* [Metcalfe's law](https://en.wikipedia.org/wiki/Metcalfe%27s_law)
+	* [Regulatory Capture](https://en.wikipedia.org/wiki/Regulatory_capture)  
+	* [Woody Harrelson's Father was a hit man](https://en.wikipedia.org/wiki/Charles_Harrelson)
+	* [Epic of Gilgamesh](https://en.wikipedia.org/wiki/Epic_of_Gilgamesh)
+	* [Whip It (Devo song) intended to satirize American optimism](https://www.salon.com/2017/09/16/33-13-devo-excerpt/)
+
+
+* August 2017
+	* [Gaslighting (term)](https://en.wikipedia.org/wiki/Gaslighting)
+	* [Bookshelf.js](http://bookshelfjs.org/)
+	* [Knex.js](http://knexjs.org/)
+	* [JSON MariaDB 10.2](https://mariadb.com/resources/blog/json-mariadb-102)
+	* [JSON MySQL Data Type](https://dev.mysql.com/doc/refman/5.7/en/json.html)
+		* [JSON Function Reference](https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html)
+		* [Working with JSON in MySQL](https://scotch.io/tutorials/working-with-json-in-mysql)
+	* [Expo](https://expo.io/)
+	* [Helmet - Express.js security with HTTP headers](https://helmetjs.github.io/)
+	* [ECMAScript 6 features](https://github.com/lukehoban/es6features)  
+	* [Prettier - code formatter](https://github.com/prettier/prettier)  
+
+* July 2017
+	- [Transmit 5 SSH key handling](https://library.panic.com/transmit5/sftp-authentication/)
+	- [BMW i3 - ( https://davidawindham.com/its-electric/ ) ](https://davidawindham.com/its-electric/)  
+	- [Siemens VersiCharge - 220V](https://w3.usa.siemens.com/powerdistribution/us/en/product-portfolio/electricvehicle/versicharge/pages/ev-charging-station.aspx)
+	- [Netflix Stock Valuation](https://seekingalpha.com/article/4089390-netflix-growth-justify-valuation)  
+
+
+* June 2017
+	- [H.265 - (HVEC)](https://en.wikipedia.org/wiki/High_Efficiency_Video_Coding)
+	- [High Efficiency Image File Format(HEIF)](https://nokiatech.github.io/heif/)
+		- [https://github.com/nokiatech/heif](https://github.com/nokiatech/heif)
+	- [babili - ES6 minifier](https://github.com/babel/babili)
+	- [k6 load testing](http://www.muse-ui.org/#/index)
+		- [https://github.com/loadimpact/k6](https://github.com/loadimpact/k6)
+	- [Muse UI - Vuejs Material Design](http://www.muse-ui.org/#/index)
+	- [The Moby Project (docker blog)](https://blog.docker.com/2017/04/introducing-the-moby-project/)
+		- [https://mobyproject.org/](https://mobyproject.org/)
+	- [Docker Ubuntu 16.04 Linode issue](/docs/server/docker) and [Linode Kernel](/docs/saas/linode)  
+
+
+* May 2017
+	* [Node 8.x (Carbon) LTS release in October](https://github.com/nodejs/node/blob/master/doc/changelogs/CHANGELOG_V8.md#8.0.0)
+	* [NPM v5.0.1 release](/docs/waf/npm)
+		- [npm@5 is now `npm@latest`](https://medium.com/npm-inc/npm-5-is-now-npm-latest-d674e9e3b0ec)
+	* [Zammad](/docs/host/zammad)
+	* [WordPress - Determine Current Taxonmy and List Children](/docs/host/wordpress)
+	* [Render React compaonents to Sketch](https://github.com/airbnb/react-sketchapp)
+	* [Atom Nuclide for React Debugging](https://nuclide.io/docs/features/debugger/)
+		* [Nuclide Flow](https://nuclide.io/docs/languages/flow/)
+		* [Flow Static Type Checker](https://flow.org/en/docs/)
+		* [Nuclide Server](https://nuclide.io/docs/features/remote/#nuclide-server)
+	* [HTTP/2 Server Push](https://en.wikipedia.org/wiki/HTTP/2_Server_Push)
+	* [Homebrew PHP7 to PHP7.1 Upgrade](/docs/localhost/brew)
+		* [http://php.net/manual/en/migration71.php](http://php.net/manual/en/migration71.php)
+		* [mcrypt is deprecated](http://php.net/manual/en/migration71.deprecated.php)
+	* [Searching for the Seventies - U.S. National Archives](https://www.google.com/culturalinstitute/beta/exhibit/AQfyFcoI)
+		* [Yoichi Okamoto - Photographer (son, Philip, of Greenville, S.C)](https://www.google.com/culturalinstitute/beta/asset/yoichi-okamoto-washington-dc-may-1973/XgFH0-MGK4AKmw)
+			* [Photographer Yoichi Okamoto Dies at 69](https://www.washingtonpost.com/archive/local/1985/04/25/photographer-yoichi-okamoto-dies-at-69/49e170df-c57b-420e-b6b9-6963f3fd66b4/?utm_term=.7d2f0d0b339a)
+			* [PAULA OKAMOTO, BROADCASTER FOR VOA, DIES](https://www.washingtonpost.com/archive/local/1992/05/21/paula-okamoto-broadcaster-for-voa-dies/02b93dc7-ff3f-4df3-bbf8-3edbf68de527/?utm_term=.fc1a7d820c0f)
+	* [How Four Native Developers Wrote An Electron App](https://githubengineering.com/how-four-native-developers-wrote-an-electron-app/)
+	* [Fixing Chrome 58+ [missing_subjectAltName] with openssl when using self signed certificates](https://alexanderzeitler.com/articles/Fixing-Chrome-missing_subjectAltName-selfsigned-cert-openssl/)
+	* [Chrome: Invalid self signed SSL cert - “Subject Alternative Name Missing”](http://stackoverflow.com/questions/43665243/chrome-invalid-self-signed-ssl-cert-subject-alternative-name-missing)
+	* [Getting Started - Yarn package manager](https://yarnpkg.com/en/docs/getting-started)
+	* [How Flexbox works — explained with big, colorful, animated gifs](https://medium.freecodecamp.com/an-animated-guide-to-flexbox-d280cf6afc35)
+	* [React Native Animation Book](https://github.com/browniefed/react-native-animation-book)
+	* [Integrating Nuxt into your Feathers application](https://blog.feathersjs.com/ssr-vuejs-app-with-feathers-and-nuxt-bb7dfd3e6397)
+	* [Gitbook Search any character](https://github.com/lwdgit/gitbook-plugin-search-plus)
+	* [NeDB - Javascript Database](https://github.com/louischatriot/nedb)
+	* [rollup.js](https://rollupjs.org/)
+		* [Webpack and Rollup: the same but different](https://medium.com/webpack/webpack-and-rollup-the-same-but-different-a41ad427058c)
+	* [Nuxt.js](https://nuxtjs.org/)
+	* [Psychological JuJitsu - Card game](http://www.icynic.com/~don/psych.html)
+
+
+* April 2017
+	* [JavaScript Start-up Performance - Addy Osmani](https://medium.com/reloading/javascript-start-up-performance-69200f43b201)
+	* [Upgrading Ele.me to Progressive Web App](https://medium.com/elemefe/upgrading-ele-me-to-progressive-web-app-2a446832e509)
+	* [Introducing Create React Native App](https://github.com/react-community/create-react-native-app)

+ 8 - 0
src/pages/styles.module.css

@@ -0,0 +1,8 @@
+/* stylelint-disable docusaurus/copyright-header */
+
+/**
+ * CSS files with the .module.css suffix will be treated as CSS modules
+ * and scoped locally.
+ */
+
+

File diff suppressed because it is too large
+ 521 - 0
src/theme/SearchBar/algolia.css


+ 106 - 0
src/theme/SearchBar/index.js

@@ -0,0 +1,106 @@
+/**
+ * Copyright (c) 2017-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+import React, { useRef, useCallback } from "react";
+import classnames from "classnames";
+import { useHistory } from "@docusaurus/router";
+import useDocusaurusContext from "@docusaurus/useDocusaurusContext";
+const Search = props => {
+  const initialized = useRef(false);
+  const searchBarRef = useRef(null);
+  const history = useHistory();
+  const { siteConfig = {} } = useDocusaurusContext();
+  const { baseUrl } = siteConfig;
+  const initAlgolia = (searchDocs, searchIndex, DocSearch) => {
+      new DocSearch({
+        searchDocs,
+        searchIndex,
+        inputSelector: "#search_input_react",
+        // Override algolia's default selection event, allowing us to do client-side
+        // navigation and avoiding a full page refresh.
+        handleSelected: (_input, _event, suggestion) => {
+          const url = baseUrl + suggestion.url;
+          // Use an anchor tag to parse the absolute url into a relative url
+          // Alternatively, we can use new URL(suggestion.url) but its not supported in IE
+          const a = document.createElement("a");
+          a.href = url;
+          // Algolia use closest parent element id #__docusaurus when a h1 page title does not have an id
+          // So, we can safely remove it. See https://github.com/facebook/docusaurus/issues/1828 for more details.
+
+          history.push(url);
+        }
+      });
+  };
+
+  const getSearchDoc = () =>
+    process.env.NODE_ENV === "production"
+      ? fetch(`${baseUrl}search-doc.json`).then((content) => content.json())
+      : Promise.resolve([]);
+
+  const getLunrIndex = () =>
+    process.env.NODE_ENV === "production"
+      ? fetch(`${baseUrl}lunr-index.json`).then((content) => content.json())
+      : Promise.resolve([]);
+
+  const loadAlgolia = () => {
+    if (!initialized.current) {
+      Promise.all([
+        getSearchDoc(),
+        getLunrIndex(),
+        import("./lib/DocSearch"),
+        import("./algolia.css")
+      ]).then(([searchDocs, searchIndex, { default: DocSearch }]) => {
+        initAlgolia(searchDocs, searchIndex, DocSearch);
+      });
+      initialized.current = true;
+    }
+  };
+
+  const toggleSearchIconClick = useCallback(
+    e => {
+      if (!searchBarRef.current.contains(e.target)) {
+        searchBarRef.current.focus();
+      }
+
+      props.handleSearchBarToggle(!props.isSearchBarExpanded);
+    },
+    [props.isSearchBarExpanded]
+  );
+
+  return (
+    <div className="navbar__search" key="search-box">
+      <span
+        aria-label="expand searchbar"
+        role="button"
+        className={classnames("search-icon", {
+          "search-icon-hidden": props.isSearchBarExpanded
+        })}
+        onClick={toggleSearchIconClick}
+        onKeyDown={toggleSearchIconClick}
+        tabIndex={0}
+      />
+      <input
+        id="search_input_react"
+        type="search"
+        placeholder="Search"
+        aria-label="Search"
+        className={classnames(
+          "navbar__search-input",
+          { "search-bar-expanded": props.isSearchBarExpanded },
+          { "search-bar": !props.isSearchBarExpanded }
+        )}
+        onClick={loadAlgolia}
+        onMouseOver={loadAlgolia}
+        onFocus={toggleSearchIconClick}
+        onBlur={toggleSearchIconClick}
+        ref={searchBarRef}
+      />
+    </div>
+  );
+};
+
+export default Search;

+ 306 - 0
src/theme/SearchBar/lib/DocSearch.js

@@ -0,0 +1,306 @@
+import Hogan from "hogan.js";
+import LunrSearchAdapter from "./lunar-search";
+import autocomplete from "autocomplete.js";
+import templates from "./templates";
+import utils from "./utils";
+import $ from "autocomplete.js/zepto";
+
+/**
+ * Adds an autocomplete dropdown to an input field
+ * @function DocSearch
+ * @param  {Object} options.searchDocs Search Documents
+ * @param  {Object} options.searchIndex Lune searchIndexes
+ * @param  {string} options.inputSelector  CSS selector that targets the input
+ * value.
+ * @param  {Object} [options.autocompleteOptions] Options to pass to the underlying autocomplete instance
+ * @return {Object}
+ */
+class DocSearch {
+    constructor({
+        searchDocs,
+        searchIndex,
+        inputSelector,
+        debug = false,
+        queryDataCallback = null,
+        autocompleteOptions = {
+            debug: false,
+            hint: false,
+            autoselect: true
+        },
+        transformData = false,
+        queryHook = false,
+        handleSelected = false,
+        enhancedSearchInput = false,
+        layout = "collumns"
+    }) {
+        this.input = DocSearch.getInputFromSelector(inputSelector);
+        this.queryDataCallback = queryDataCallback || null;
+        const autocompleteOptionsDebug =
+            autocompleteOptions && autocompleteOptions.debug
+                ? autocompleteOptions.debug
+                : false;
+        // eslint-disable-next-line no-param-reassign
+        autocompleteOptions.debug = debug || autocompleteOptionsDebug;
+        this.autocompleteOptions = autocompleteOptions;
+        this.autocompleteOptions.cssClasses =
+            this.autocompleteOptions.cssClasses || {};
+        this.autocompleteOptions.cssClasses.prefix =
+            this.autocompleteOptions.cssClasses.prefix || "ds";
+        const inputAriaLabel =
+            this.input &&
+            typeof this.input.attr === "function" &&
+            this.input.attr("aria-label");
+        this.autocompleteOptions.ariaLabel =
+            this.autocompleteOptions.ariaLabel || inputAriaLabel || "search input";
+
+        this.isSimpleLayout = layout === "simple";
+
+        this.client = new LunrSearchAdapter(searchDocs, searchIndex);
+
+        if (enhancedSearchInput) {
+            this.input = DocSearch.injectSearchBox(this.input);
+        }
+        this.autocomplete = autocomplete(this.input, autocompleteOptions, [
+            {
+                source: this.getAutocompleteSource(transformData, queryHook),
+                templates: {
+                    suggestion: DocSearch.getSuggestionTemplate(this.isSimpleLayout),
+                    footer: templates.footer,
+                    empty: DocSearch.getEmptyTemplate()
+                }
+            }
+        ]);
+
+        const customHandleSelected = handleSelected;
+        this.handleSelected = customHandleSelected || this.handleSelected;
+
+        // We prevent default link clicking if a custom handleSelected is defined
+        if (customHandleSelected) {
+            $(".algolia-autocomplete").on("click", ".ds-suggestions a", event => {
+                event.preventDefault();
+            });
+        }
+
+        this.autocomplete.on(
+            "autocomplete:selected",
+            this.handleSelected.bind(null, this.autocomplete.autocomplete)
+        );
+
+        this.autocomplete.on(
+            "autocomplete:shown",
+            this.handleShown.bind(null, this.input)
+        );
+
+        if (enhancedSearchInput) {
+            DocSearch.bindSearchBoxEvent();
+        }
+    }
+
+    static injectSearchBox(input) {
+        input.before(templates.searchBox);
+        const newInput = input
+            .prev()
+            .prev()
+            .find("input");
+        input.remove();
+        return newInput;
+    }
+
+    static bindSearchBoxEvent() {
+        $('.searchbox [type="reset"]').on("click", function () {
+            $("input#docsearch").focus();
+            $(this).addClass("hide");
+            autocomplete.autocomplete.setVal("");
+        });
+
+        $("input#docsearch").on("keyup", () => {
+            const searchbox = document.querySelector("input#docsearch");
+            const reset = document.querySelector('.searchbox [type="reset"]');
+            reset.className = "searchbox__reset";
+            if (searchbox.value.length === 0) {
+                reset.className += " hide";
+            }
+        });
+    }
+
+    /**
+     * Returns the matching input from a CSS selector, null if none matches
+     * @function getInputFromSelector
+     * @param  {string} selector CSS selector that matches the search
+     * input of the page
+     * @returns {void}
+     */
+    static getInputFromSelector(selector) {
+        const input = $(selector).filter("input");
+        return input.length ? $(input[0]) : null;
+    }
+
+    /**
+     * Returns the `source` method to be passed to autocomplete.js. It will query
+     * the Algolia index and call the callbacks with the formatted hits.
+     * @function getAutocompleteSource
+     * @param  {function} transformData An optional function to transform the hits
+     * @param {function} queryHook An optional function to transform the query
+     * @returns {function} Method to be passed as the `source` option of
+     * autocomplete
+     */
+    getAutocompleteSource(transformData, queryHook) {
+        return (query, callback) => {
+            if (queryHook) {
+                // eslint-disable-next-line no-param-reassign
+                query = queryHook(query) || query;
+            }
+            this.client.search(query).then(hits => {
+                if (
+                    this.queryDataCallback &&
+                    typeof this.queryDataCallback == "function"
+                ) {
+                    this.queryDataCallback(hits);
+                }
+                if (transformData) {
+                    hits = transformData(hits) || hits;
+                }
+                callback(DocSearch.formatHits(hits));
+            });
+        };
+    }
+
+    // Given a list of hits returned by the API, will reformat them to be used in
+    // a Hogan template
+    static formatHits(receivedHits) {
+        const clonedHits = utils.deepClone(receivedHits);
+        const hits = clonedHits.map(hit => {
+            if (hit._highlightResult) {
+                // eslint-disable-next-line no-param-reassign
+                hit._highlightResult = utils.mergeKeyWithParent(
+                    hit._highlightResult,
+                    "hierarchy"
+                );
+            }
+            return utils.mergeKeyWithParent(hit, "hierarchy");
+        });
+
+        // Group hits by category / subcategory
+        let groupedHits = utils.groupBy(hits, "lvl0");
+        $.each(groupedHits, (level, collection) => {
+            const groupedHitsByLvl1 = utils.groupBy(collection, "lvl1");
+            const flattenedHits = utils.flattenAndFlagFirst(
+                groupedHitsByLvl1,
+                "isSubCategoryHeader"
+            );
+            groupedHits[level] = flattenedHits;
+        });
+        groupedHits = utils.flattenAndFlagFirst(groupedHits, "isCategoryHeader");
+
+        // Translate hits into smaller objects to be send to the template
+        return groupedHits.map(hit => {
+            const url = DocSearch.formatURL(hit);
+            const category = utils.getHighlightedValue(hit, "lvl0");
+            const subcategory = utils.getHighlightedValue(hit, "lvl1") || category;
+            const displayTitle = utils
+                .compact([
+                    utils.getHighlightedValue(hit, "lvl2") || subcategory,
+                    utils.getHighlightedValue(hit, "lvl3"),
+                    utils.getHighlightedValue(hit, "lvl4"),
+                    utils.getHighlightedValue(hit, "lvl5"),
+                    utils.getHighlightedValue(hit, "lvl6")
+                ])
+                .join(
+                    '<span class="aa-suggestion-title-separator" aria-hidden="true"> › </span>'
+                );
+            const text = utils.getSnippetedValue(hit, "content");
+            const isTextOrSubcategoryNonEmpty =
+                (subcategory && subcategory !== "") ||
+                (displayTitle && displayTitle !== "");
+            const isLvl1EmptyOrDuplicate =
+                !subcategory || subcategory === "" || subcategory === category;
+            const isLvl2 =
+                displayTitle && displayTitle !== "" && displayTitle !== subcategory;
+            const isLvl1 =
+                !isLvl2 &&
+                (subcategory && subcategory !== "" && subcategory !== category);
+            const isLvl0 = !isLvl1 && !isLvl2;
+
+            return {
+                isLvl0,
+                isLvl1,
+                isLvl2,
+                isLvl1EmptyOrDuplicate,
+                isCategoryHeader: hit.isCategoryHeader,
+                isSubCategoryHeader: hit.isSubCategoryHeader,
+                isTextOrSubcategoryNonEmpty,
+                category,
+                subcategory,
+                title: displayTitle,
+                text,
+                url
+            };
+        });
+    }
+
+    static formatURL(hit) {
+        const { url, anchor } = hit;
+        if (url) {
+            const containsAnchor = url.indexOf("#") !== -1;
+            if (containsAnchor) return url;
+            else if (anchor) return `${hit.url}#${hit.anchor}`;
+            return url;
+        } else if (anchor) return `#${hit.anchor}`;
+        /* eslint-disable */
+        console.warn("no anchor nor url for : ", JSON.stringify(hit));
+        /* eslint-enable */
+        return null;
+    }
+
+    static getEmptyTemplate() {
+        return args => Hogan.compile(templates.empty).render(args);
+    }
+
+    static getSuggestionTemplate(isSimpleLayout) {
+        const stringTemplate = isSimpleLayout
+            ? templates.suggestionSimple
+            : templates.suggestion;
+        const template = Hogan.compile(stringTemplate);
+        return suggestion => template.render(suggestion);
+    }
+
+    handleSelected(input, event, suggestion, datasetNumber, context = {}) {
+        // Do nothing if click on the suggestion, as it's already a <a href>, the
+        // browser will take care of it. This allow Ctrl-Clicking on results and not
+        // having the main window being redirected as well
+        if (context.selectionMethod === "click") {
+            return;
+        }
+
+        input.setVal("");
+        window.location.assign(suggestion.url);
+    }
+
+    handleShown(input) {
+        const middleOfInput = input.offset().left + input.width() / 2;
+        let middleOfWindow = $(document).width() / 2;
+
+        if (isNaN(middleOfWindow)) {
+            middleOfWindow = 900;
+        }
+
+        const alignClass =
+            middleOfInput - middleOfWindow >= 0
+                ? "algolia-autocomplete-right"
+                : "algolia-autocomplete-left";
+        const otherAlignClass =
+            middleOfInput - middleOfWindow < 0
+                ? "algolia-autocomplete-right"
+                : "algolia-autocomplete-left";
+        const autocompleteWrapper = $(".algolia-autocomplete");
+        if (!autocompleteWrapper.hasClass(alignClass)) {
+            autocompleteWrapper.addClass(alignClass);
+        }
+
+        if (autocompleteWrapper.hasClass(otherAlignClass)) {
+            autocompleteWrapper.removeClass(otherAlignClass);
+        }
+    }
+}
+
+export default DocSearch;

+ 146 - 0
src/theme/SearchBar/lib/lunar-search.js

@@ -0,0 +1,146 @@
+import lunr from "@generated/lunr.client";
+lunr.tokenizer.separator = /[\s\-/]+/;
+
+class LunrSearchAdapter {
+    constructor(searchDocs, searchIndex) {
+        this.searchDocs = searchDocs;
+        this.lunrIndex = lunr.Index.load(searchIndex);
+    }
+
+    getLunrResult(input) {
+        return this.lunrIndex.query(function (query) {
+            const tokens = lunr.tokenizer(input);
+            query.term(tokens, {
+                boost: 10
+            });
+            query.term(tokens, {
+                wildcard: lunr.Query.wildcard.TRAILING
+            });
+        });
+    }
+
+    getHit(doc, formattedTitle, formattedContent) {
+        return {
+            hierarchy: {
+                lvl0: doc.pageTitle || doc.title,
+                lvl1: doc.type === 0 ? null : doc.title
+            },
+            url: doc.url,
+            _snippetResult: formattedContent ? {
+                content: {
+                    value: formattedContent,
+                    matchLevel: "full"
+                }
+            } : null,
+            _highlightResult: {
+                hierarchy: {
+                    lvl0: {
+                        value: doc.type === 0 ? formattedTitle || doc.title : doc.pageTitle,
+                    },
+                    lvl1:
+                        doc.type === 0
+                            ? null
+                            : {
+                                value: formattedTitle || doc.title
+                            }
+                }
+            }
+        };
+    }
+    getTitleHit(doc, position, length) {
+        const start = position[0];
+        const end = position[0] + length;
+        let formattedTitle = doc.title.substring(0, start) + '<span class="algolia-docsearch-suggestion--highlight">' + doc.title.substring(start, end) + '</span>' + doc.title.substring(end, doc.title.length);
+        return this.getHit(doc, formattedTitle)
+    }
+
+    getKeywordHit(doc, position, length) {
+        const start = position[0];
+        const end = position[0] + length;
+        let formattedTitle = doc.title + '<br /><i>Keywords: ' + doc.keywords.substring(0, start) + '<span class="algolia-docsearch-suggestion--highlight">' + doc.keywords.substring(start, end) + '</span>' + doc.keywords.substring(end, doc.keywords.length) + '</i>'
+        return this.getHit(doc, formattedTitle)
+    }
+
+    getContentHit(doc, position) {
+        const start = position[0];
+        const end = position[0] + position[1];
+        let previewStart = start;
+        let previewEnd = end;
+        let ellipsesBefore = true;
+        let ellipsesAfter = true;
+        for (let k = 0; k < 3; k++) {
+            const nextSpace = doc.content.lastIndexOf(' ', previewStart - 2);
+            const nextDot = doc.content.lastIndexOf('.', previewStart - 2);
+            if ((nextDot > 0) && (nextDot > nextSpace)) {
+                previewStart = nextDot + 1;
+                ellipsesBefore = false;
+                break;
+            }
+            if (nextSpace < 0) {
+                previewStart = 0;
+                ellipsesBefore = false;
+                break;
+            }
+            previewStart = nextSpace + 1;
+        }
+        for (let k = 0; k < 10; k++) {
+            const nextSpace = doc.content.indexOf(' ', previewEnd + 1);
+            const nextDot = doc.content.indexOf('.', previewEnd + 1);
+            if ((nextDot > 0) && (nextDot < nextSpace)) {
+                previewEnd = nextDot;
+                ellipsesAfter = false;
+                break;
+            }
+            if (nextSpace < 0) {
+                previewEnd = doc.content.length;
+                ellipsesAfter = false;
+                break;
+            }
+            previewEnd = nextSpace;
+        }
+        let preview = doc.content.substring(previewStart, start);
+        if (ellipsesBefore) {
+            preview = '... ' + preview;
+        }
+        preview += '<span class="algolia-docsearch-suggestion--highlight">' + doc.content.substring(start, end) + '</span>';
+        preview += doc.content.substring(end, previewEnd);
+        if (ellipsesAfter) {
+            preview += ' ...';
+        }
+        return this.getHit(doc, null, preview);
+
+    }
+    search(input) {
+        return new Promise((resolve, rej) => {
+            const results = this.getLunrResult(input);
+            const hits = [];
+            results.length > 5 && (results.length = 5);
+            this.titleHitsRes = []
+            this.contentHitsRes = []
+            results.forEach(result => {
+                const doc = this.searchDocs[result.ref];
+                const { metadata } = result.matchData;
+                for (let i in metadata) {
+                    if (metadata[i].title) {
+                        if (!this.titleHitsRes.includes(result.ref)) {
+                            const position = metadata[i].title.position[0]
+                            hits.push(this.getTitleHit(doc, position, input.length));
+                            this.titleHitsRes.push(result.ref);
+                        }
+                    } else if (metadata[i].content) {
+                        const position = metadata[i].content.position[0]
+                        hits.push(this.getContentHit(doc, position))
+                    } else if (metadata[i].keywords) {
+                        const position = metadata[i].keywords.position[0]
+                        hits.push(this.getKeywordHit(doc, position, input.length));
+                        this.titleHitsRes.push(result.ref);
+                    }
+                }
+            });
+            hits.length > 5 && (hits.length = 5);
+            resolve(hits);
+        });
+    }
+}
+
+export default LunrSearchAdapter;

+ 114 - 0
src/theme/SearchBar/lib/templates.js

@@ -0,0 +1,114 @@
+const prefix = 'algolia-docsearch';
+const suggestionPrefix = `${prefix}-suggestion`;
+const footerPrefix = `${prefix}-footer`;
+
+/* eslint-disable max-len */
+
+const templates = {
+  suggestion: `
+  <a class="${suggestionPrefix}
+    {{#isCategoryHeader}}${suggestionPrefix}__main{{/isCategoryHeader}}
+    {{#isSubCategoryHeader}}${suggestionPrefix}__secondary{{/isSubCategoryHeader}}
+    "
+    aria-label="Link to the result"
+    href="{{{url}}}"
+    >
+    <div class="${suggestionPrefix}--category-header">
+        <span class="${suggestionPrefix}--category-header-lvl0">{{{category}}}</span>
+    </div>
+    <div class="${suggestionPrefix}--wrapper">
+      <div class="${suggestionPrefix}--subcategory-column">
+        <span class="${suggestionPrefix}--subcategory-column-text">{{{subcategory}}}</span>
+      </div>
+      {{#isTextOrSubcategoryNonEmpty}}
+      <div class="${suggestionPrefix}--content">
+        <div class="${suggestionPrefix}--subcategory-inline">{{{subcategory}}}</div>
+        <div class="${suggestionPrefix}--title">{{{title}}}</div>
+        {{#text}}<div class="${suggestionPrefix}--text">{{{text}}}</div>{{/text}}
+      </div>
+      {{/isTextOrSubcategoryNonEmpty}}
+    </div>
+  </a>
+  `,
+  suggestionSimple: `
+  <div class="${suggestionPrefix}
+    {{#isCategoryHeader}}${suggestionPrefix}__main{{/isCategoryHeader}}
+    {{#isSubCategoryHeader}}${suggestionPrefix}__secondary{{/isSubCategoryHeader}}
+    suggestion-layout-simple
+  ">
+    <div class="${suggestionPrefix}--category-header">
+        {{^isLvl0}}
+        <span class="${suggestionPrefix}--category-header-lvl0 ${suggestionPrefix}--category-header-item">{{{category}}}</span>
+          {{^isLvl1}}
+          {{^isLvl1EmptyOrDuplicate}}
+          <span class="${suggestionPrefix}--category-header-lvl1 ${suggestionPrefix}--category-header-item">
+              {{{subcategory}}}
+          </span>
+          {{/isLvl1EmptyOrDuplicate}}
+          {{/isLvl1}}
+        {{/isLvl0}}
+        <div class="${suggestionPrefix}--title ${suggestionPrefix}--category-header-item">
+            {{#isLvl2}}
+                {{{title}}}
+            {{/isLvl2}}
+            {{#isLvl1}}
+                {{{subcategory}}}
+            {{/isLvl1}}
+            {{#isLvl0}}
+                {{{category}}}
+            {{/isLvl0}}
+        </div>
+    </div>
+    <div class="${suggestionPrefix}--wrapper">
+      {{#text}}
+      <div class="${suggestionPrefix}--content">
+        <div class="${suggestionPrefix}--text">{{{text}}}</div>
+      </div>
+      {{/text}}
+    </div>
+  </div>
+  `,
+  footer: `
+    <div class="${footerPrefix}">
+    </div>
+  `,
+  empty: `
+  <div class="${suggestionPrefix}">
+    <div class="${suggestionPrefix}--wrapper">
+        <div class="${suggestionPrefix}--content ${suggestionPrefix}--no-results">
+            <div class="${suggestionPrefix}--title">
+                <div class="${suggestionPrefix}--text">
+                    No results found for query <b>"{{query}}"</b>
+                </div>
+            </div>
+        </div>
+    </div>
+  </div>
+  `,
+  searchBox: `
+  <form novalidate="novalidate" onsubmit="return false;" class="searchbox">
+    <div role="search" class="searchbox__wrapper">
+      <input id="docsearch" type="search" name="search" placeholder="Search the docs" autocomplete="off" required="required" class="searchbox__input"/>
+      <button type="submit" title="Submit your search query." class="searchbox__submit" >
+        <svg width=12 height=12 role="img" aria-label="Search">
+          <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-search-13"></use>
+        </svg>
+      </button>
+      <button type="reset" title="Clear the search query." class="searchbox__reset hide">
+        <svg width=12 height=12 role="img" aria-label="Reset">
+          <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#sbx-icon-clear-3"></use>
+        </svg>
+      </button>
+    </div>
+</form>
+
+<div class="svg-icons" style="height: 0; width: 0; position: absolute; visibility: hidden">
+  <svg xmlns="http://www.w3.org/2000/svg">
+    <symbol id="sbx-icon-clear-3" viewBox="0 0 40 40"><path d="M16.228 20L1.886 5.657 0 3.772 3.772 0l1.885 1.886L20 16.228 34.343 1.886 36.228 0 40 3.772l-1.886 1.885L23.772 20l14.342 14.343L40 36.228 36.228 40l-1.885-1.886L20 23.772 5.657 38.114 3.772 40 0 36.228l1.886-1.885L16.228 20z" fill-rule="evenodd"></symbol>
+    <symbol id="sbx-icon-search-13" viewBox="0 0 40 40"><path d="M26.806 29.012a16.312 16.312 0 0 1-10.427 3.746C7.332 32.758 0 25.425 0 16.378 0 7.334 7.333 0 16.38 0c9.045 0 16.378 7.333 16.378 16.38 0 3.96-1.406 7.593-3.746 10.426L39.547 37.34c.607.608.61 1.59-.004 2.203a1.56 1.56 0 0 1-2.202.004L26.807 29.012zm-10.427.627c7.322 0 13.26-5.938 13.26-13.26 0-7.324-5.938-13.26-13.26-13.26-7.324 0-13.26 5.936-13.26 13.26 0 7.322 5.936 13.26 13.26 13.26z" fill-rule="evenodd"></symbol>
+  </svg>
+</div>
+  `,
+};
+
+export default templates;

+ 270 - 0
src/theme/SearchBar/lib/utils.js

@@ -0,0 +1,270 @@
+import $ from "autocomplete.js/zepto";
+
+const utils = {
+  /*
+  * Move the content of an object key one level higher.
+  * eg.
+  * {
+  *   name: 'My name',
+  *   hierarchy: {
+  *     lvl0: 'Foo',
+  *     lvl1: 'Bar'
+  *   }
+  * }
+  * Will be converted to
+  * {
+  *   name: 'My name',
+  *   lvl0: 'Foo',
+  *   lvl1: 'Bar'
+  * }
+  * @param {Object} object Main object
+  * @param {String} property Main object key to move up
+  * @return {Object}
+  * @throws Error when key is not an attribute of Object or is not an object itself
+  */
+  mergeKeyWithParent(object, property) {
+    if (object[property] === undefined) {
+      return object;
+    }
+    if (typeof object[property] !== 'object') {
+      return object;
+    }
+    const newObject = $.extend({}, object, object[property]);
+    delete newObject[property];
+    return newObject;
+  },
+  /*
+  * Group all objects of a collection by the value of the specified attribute
+  * If the attribute is a string, use the lowercase form.
+  *
+  * eg.
+  * groupBy([
+  *   {name: 'Tim', category: 'dev'},
+  *   {name: 'Vincent', category: 'dev'},
+  *   {name: 'Ben', category: 'sales'},
+  *   {name: 'Jeremy', category: 'sales'},
+  *   {name: 'AlexS', category: 'dev'},
+  *   {name: 'AlexK', category: 'sales'}
+  * ], 'category');
+  * =>
+  * {
+  *   'devs': [
+  *     {name: 'Tim', category: 'dev'},
+  *     {name: 'Vincent', category: 'dev'},
+  *     {name: 'AlexS', category: 'dev'}
+  *   ],
+  *   'sales': [
+  *     {name: 'Ben', category: 'sales'},
+  *     {name: 'Jeremy', category: 'sales'},
+  *     {name: 'AlexK', category: 'sales'}
+  *   ]
+  * }
+  * @param {array} collection Array of objects to group
+  * @param {String} property The attribute on which apply the grouping
+  * @return {array}
+  * @throws Error when one of the element does not have the specified property
+  */
+  groupBy(collection, property) {
+    const newCollection = {};
+    $.each(collection, (index, item) => {
+      if (item[property] === undefined) {
+        throw new Error(`[groupBy]: Object has no key ${property}`);
+      }
+      let key = item[property];
+      if (typeof key === 'string') {
+        key = key.toLowerCase();
+      }
+      // fix #171 the given data type of docsearch hits might be conflict with the properties of the native Object,
+      // such as the constructor, so we need to do this check.
+      if (!Object.prototype.hasOwnProperty.call(newCollection, key)) {
+        newCollection[key] = [];
+      }
+      newCollection[key].push(item);
+    });
+    return newCollection;
+  },
+  /*
+  * Return an array of all the values of the specified object
+  * eg.
+  * values({
+  *   foo: 42,
+  *   bar: true,
+  *   baz: 'yep'
+  * })
+  * =>
+  * [42, true, yep]
+  * @param {object} object Object to extract values from
+  * @return {array}
+  */
+  values(object) {
+    return Object.keys(object).map(key => object[key]);
+  },
+  /*
+  * Flattens an array
+  * eg.
+  * flatten([1, 2, [3, 4], [5, 6]])
+  * =>
+  * [1, 2, 3, 4, 5, 6]
+  * @param {array} array Array to flatten
+  * @return {array}
+  */
+  flatten(array) {
+    const results = [];
+    array.forEach(value => {
+      if (!Array.isArray(value)) {
+        results.push(value);
+        return;
+      }
+      value.forEach(subvalue => {
+        results.push(subvalue);
+      });
+    });
+    return results;
+  },
+  /*
+  * Flatten all values of an object into an array, marking each first element of
+  * each group with a specific flag
+  * eg.
+  * flattenAndFlagFirst({
+  *   'devs': [
+  *     {name: 'Tim', category: 'dev'},
+  *     {name: 'Vincent', category: 'dev'},
+  *     {name: 'AlexS', category: 'dev'}
+  *   ],
+  *   'sales': [
+  *     {name: 'Ben', category: 'sales'},
+  *     {name: 'Jeremy', category: 'sales'},
+  *     {name: 'AlexK', category: 'sales'}
+  *   ]
+  * , 'isTop');
+  * =>
+  * [
+  *     {name: 'Tim', category: 'dev', isTop: true},
+  *     {name: 'Vincent', category: 'dev', isTop: false},
+  *     {name: 'AlexS', category: 'dev', isTop: false},
+  *     {name: 'Ben', category: 'sales', isTop: true},
+  *     {name: 'Jeremy', category: 'sales', isTop: false},
+  *     {name: 'AlexK', category: 'sales', isTop: false}
+  * ]
+  * @param {object} object Object to flatten
+  * @param {string} flag Flag to set to true on first element of each group
+  * @return {array}
+  */
+  flattenAndFlagFirst(object, flag) {
+    const values = this.values(object).map(collection =>
+      collection.map((item, index) => {
+        // eslint-disable-next-line no-param-reassign
+        item[flag] = index === 0;
+        return item;
+      })
+    );
+    return this.flatten(values);
+  },
+  /*
+  * Removes all empty strings, null, false and undefined elements array
+  * eg.
+  * compact([42, false, null, undefined, '', [], 'foo']);
+  * =>
+  * [42, [], 'foo']
+  * @param {array} array Array to compact
+  * @return {array}
+  */
+  compact(array) {
+    const results = [];
+    array.forEach(value => {
+      if (!value) {
+        return;
+      }
+      results.push(value);
+    });
+    return results;
+  },
+  /*
+   * Returns the highlighted value of the specified key in the specified object.
+   * If no highlighted value is available, will return the key value directly
+   * eg.
+   * getHighlightedValue({
+   *    _highlightResult: {
+   *      text: {
+   *        value: '<mark>foo</mark>'
+   *      }
+   *    },
+   *    text: 'foo'
+   * }, 'text');
+   * =>
+   * '<mark>foo</mark>'
+   * @param {object} object Hit object returned by the Algolia API
+   * @param {string} property Object key to look for
+   * @return {string}
+   **/
+  getHighlightedValue(object, property) {
+    if (
+      object._highlightResult &&
+      object._highlightResult.hierarchy_camel &&
+      object._highlightResult.hierarchy_camel[property] &&
+      object._highlightResult.hierarchy_camel[property].matchLevel &&
+      object._highlightResult.hierarchy_camel[property].matchLevel !== 'none' &&
+      object._highlightResult.hierarchy_camel[property].value
+    ) {
+      return object._highlightResult.hierarchy_camel[property].value;
+    }
+    if (
+      object._highlightResult &&
+      object._highlightResult &&
+      object._highlightResult[property] &&
+      object._highlightResult[property].value
+    ) {
+      return object._highlightResult[property].value;
+    }
+    return object[property];
+  },
+  /*
+   * Returns the snippeted value of the specified key in the specified object.
+   * If no highlighted value is available, will return the key value directly.
+   * Will add starting and ending ellipsis (…) if we detect that a sentence is
+   * incomplete
+   * eg.
+   * getSnippetedValue({
+   *    _snippetResult: {
+   *      text: {
+   *        value: '<mark>This is an unfinished sentence</mark>'
+   *      }
+   *    },
+   *    text: 'This is an unfinished sentence'
+   * }, 'text');
+   * =>
+   * '<mark>This is an unfinished sentence</mark>…'
+   * @param {object} object Hit object returned by the Algolia API
+   * @param {string} property Object key to look for
+   * @return {string}
+   **/
+  getSnippetedValue(object, property) {
+    if (
+      !object._snippetResult ||
+      !object._snippetResult[property] ||
+      !object._snippetResult[property].value
+    ) {
+      return object[property];
+    }
+    let snippet = object._snippetResult[property].value;
+
+    if (snippet[0] !== snippet[0].toUpperCase()) {
+      snippet = `…${snippet}`;
+    }
+    if (['.', '!', '?'].indexOf(snippet[snippet.length - 1]) === -1) {
+      snippet = `${snippet}…`;
+    }
+    return snippet;
+  },
+  /*
+  * Deep clone an object.
+  * Note: This will not clone functions and dates
+  * @param {object} object Object to clone
+  * @return {object}
+  */
+  deepClone(object) {
+    return JSON.parse(JSON.stringify(object));
+  },
+};
+
+export default utils;

Some files were not shown because too many files changed in this diff