From 2f525c0f6e44d320bff16e22c223481923ba683e Mon Sep 17 00:00:00 2001
From: Yassine Doghri <yassine@doghri.fr>
Date: Fri, 2 Apr 2021 17:20:02 +0000
Subject: [PATCH] feat(fediverse): implement activitypub protocols + update
 user interface

- add "ActivityPub" library to handle server to server federation and basic
  client to server protocols using activitypub:
  - add webfinger endpoint to look for actor
  - add actor definition with inbox / outbox / followers
  - remote follow an actor
  - create notes with possible preview cards
  - interract with favourites, reblogs and replies
  - block incoming actors and/or domains
  - broadcast/schedule activities to fediverse followers using a cron task
- For castopod, the podcast is the actor:
  - overwrite the activitypub library for castopod's specific needs
  - perform basic interactions administrating a podcast to interact with fediverse users:
    - create notes with episode attachment
    - favourite and share a note + reply
    - add specific castopod_namespaces for podcasts and episodes definitions
- overwrite CodeIgniter's Route service to include alternate-content option for
  activitystream requests
- update episode publication logic:
  - remove publication inputs in create / edit episode form
  - publish / schedule or unpublish an episode after creation
  - the podcaster publishes a note when publishing an episode
- Javascript / Typescript modules:
  - fix Dropdown.ts to keep dropdown menu in foreground
  - add Modal.ts for funding links modal
  - add Toggler.ts to toggle various css states in ui
- User Interface:
  - update tailwindcss to v2
  - use castopod's pine and rose colors
  - update public layout to a 3 column layout
  - add pages in public for podcast activity, episode list and notes
  - update episode page to include linked notes
  - remove previous and next episodes from episode pages
  - show different public views depending on whether user is authenticated or not
  - use Kumbh Sans and Montserrat fonts
- update CodeIgniter's config files
- with CodeIgniter's new requirements, update docker environments are now based on
  php v7.3 image
- move Image entity to Libraries
- update composer and npm packages to latest versions

closes #69 #65 #85, fixes #51 #91 #92 #88
---
 .devcontainer/Dockerfile                      |     4 +-
 .gitignore                                    |    11 +-
 .prettierrc.json                              |     2 +-
 .rsync-filter                                 |     2 +-
 .stylelintrc.json                             |     3 +-
 .svgo.icons.js                                |    17 +
 .svgo.icons.yml                               |     9 -
 .svgo.js                                      |    12 +
 .svgo.yml                                     |     5 -
 DEPENDENCIES.md                               |    16 +-
 Dockerfile                                    |     8 +-
 INSTALL.md                                    |    25 +-
 LICENSE                                       |   661 -
 LICENSE.md                                    |   598 +
 README.md                                     |    12 +-
 app/Config/ActivityPub.php                    |    14 +
 app/Config/App.php                            |   688 +-
 app/Config/Autoload.php                       |   118 +-
 app/Config/Boot/development.php               |    45 +-
 app/Config/Boot/production.php                |    31 +-
 app/Config/Boot/testing.php                   |    45 +-
 app/Config/Cache.php                          |   202 +-
 app/Config/Constants.php                      |   116 +-
 app/Config/ContentSecurityPolicy.php          |   136 +-
 app/Config/Database.php                       |    32 +-
 app/Config/DocTypes.php                       |    11 +-
 app/Config/Encryption.php                     |    63 +-
 app/Config/Events.php                         |   102 +-
 app/Config/Exceptions.php                     |    59 +-
 app/Config/Filters.php                        |    55 +-
 app/Config/ForeignCharacters.php              |     4 +-
 app/Config/Format.php                         |    95 +-
 app/Config/Generators.php                     |    44 +
 app/Config/Honeypot.php                       |     8 +
 app/Config/Images.php                         |    34 +-
 app/Config/Kint.php                           |    47 +-
 app/Config/Logger.php                         |   138 +-
 app/Config/Migrations.php                     |    78 +-
 app/Config/Mimes.php                          |    84 +-
 app/Config/Modules.php                        |    76 +-
 app/Config/Pager.php                          |    44 +-
 app/Config/Paths.php                          |    48 +-
 app/Config/Routes.php                         |   262 +-
 app/Config/Security.php                       |    92 +
 app/Config/Services.php                       |    63 +-
 app/Config/Toolbar.php                        |   124 +-
 app/Config/UserAgents.php                     |    57 +-
 app/Config/Validation.php                     |    25 +-
 app/Config/View.php                           |    10 +-
 app/Controllers/Actor.php                     |    22 +
 app/Controllers/Admin/BaseController.php      |    22 +-
 app/Controllers/Admin/Episode.php             |   309 +-
 app/Controllers/Admin/Fediverse.php           |    41 +
 app/Controllers/Admin/Person.php              |     2 +-
 app/Controllers/Admin/Podcast.php             |    27 +-
 app/Controllers/Admin/PodcastImport.php       |   107 +-
 app/Controllers/Auth.php                      |    26 +-
 app/Controllers/BaseController.php            |    29 +-
 app/Controllers/Episode.php                   |   123 +-
 app/Controllers/Home.php                      |     4 +-
 app/Controllers/Install.php                   |     1 +
 app/Controllers/Note.php                      |   212 +
 app/Controllers/Page.php                      |    44 +-
 app/Controllers/Podcast.php                   |    85 +-
 .../2020-05-29-152000_add_categories.php      |     2 +-
 .../2020-05-30-101000_add_languages.php       |     2 +-
 .../2020-05-30-101500_add_podcasts.php        |    28 +-
 .../2020-06-05-170000_add_episodes.php        |    32 +-
 .../2020-06-05-180000_add_soundbites.php      |    16 +-
 .../2020-06-05-190000_add_platforms.php       |     2 +-
 ...20-06-08-120000_add_analytics_podcasts.php |     6 +-
 ...0000_add_analytics_podcasts_by_episode.php |     7 +-
 ...-130000_add_analytics_podcasts_by_hour.php |     6 +-
 ...40000_add_analytics_podcasts_by_player.php |     6 +-
 ...0000_add_analytics_podcasts_by_country.php |     6 +-
 ...60000_add_analytics_podcasts_by_region.php |     6 +-
 ...20-06-08-160000_add_podcasts_platforms.php |     2 -
 ...70000_add_analytics_website_by_browser.php |     6 +-
 ...80000_add_analytics_website_by_referer.php |     6 +-
 ...00_add_analytics_website_by_entry_page.php |     6 +-
 ...10000_add_analytics_unknown_useragents.php |     4 +-
 ...10000_add_analytics_podcasts_procedure.php |   103 +-
 ...analytics_unknown_useragents_procedure.php |    17 +-
 ...210000_add_analytics_website_procedure.php |    35 +-
 .../2020-07-03-191500_add_podcasts_users.php  |    22 +-
 .../2020-08-17-150000_add_pages.php           |     6 +-
 ...0-09-29-150000_add_podcasts_categories.php |    16 +-
 .../2020-12-25-120000_add_persons.php         |     6 +
 ...2020-12-25-130000_add_podcasts_persons.php |    16 +-
 ...2020-12-25-140000_add_episodes_persons.php |    24 +-
 .../2020-12-25-150000_add_credit_view.php     |    20 +-
 ...1-02-23-100000_add_episode_id_to_notes.php |    38 +
 ...1-03-09-113000_add_created_by_to_notes.php |    38 +
 app/Database/Seeds/AuthSeeder.php             |    38 +-
 app/Database/Seeds/PlatformSeeder.php         |     5 +-
 app/Entities/Credit.php                       |    51 +-
 app/Entities/Episode.php                      |   136 +-
 app/Entities/Image.php                        |   151 -
 app/Entities/Note.php                         |    56 +
 app/Entities/Person.php                       |    22 +-
 app/Entities/Podcast.php                      |   134 +-
 app/Entities/Soundbite.php                    |     7 -
 .../{Permission.php => PermissionFilter.php}  |     2 +-
 app/Helpers/analytics_helper.php              |    36 +-
 app/Helpers/auth_helper.php                   |    89 +
 app/Helpers/components_helper.php             |   129 +-
 app/Helpers/media_helper.php                  |    28 +-
 app/Helpers/misc_helper.php                   |     2 +
 app/Helpers/persons_helper.php                |    85 +-
 app/Helpers/rss_helper.php                    |     4 +-
 app/Helpers/svg_helper.php                    |    33 +-
 app/Helpers/url_helper.php                    |    31 +
 app/Language/en/ActivityPub.php               |    34 +
 app/Language/en/Admin.php                     |     1 +
 app/Language/en/AdminNavigation.php           |     3 +
 app/Language/en/Breadcrumb.php                |     5 +
 app/Language/en/Common.php                    |     4 +
 app/Language/en/Episode.php                   |    78 +-
 app/Language/en/Fediverse.php                 |    23 +
 app/Language/en/Note.php                      |    38 +
 app/Language/en/Page.php                      |     3 +-
 app/Language/en/Podcast.php                   |    21 +-
 app/Language/en/PodcastNavigation.php         |     2 +
 app/Language/fr/ActivityPub.php               |    35 +
 app/Language/fr/AdminNavigation.php           |     3 +
 app/Language/fr/Breadcrumb.php                |     5 +
 app/Language/fr/Common.php                    |     4 +
 app/Language/fr/Episode.php                   |    80 +-
 app/Language/fr/Fediverse.php                 |    20 +
 app/Language/fr/Note.php                      |    39 +
 app/Language/fr/Page.php                      |     1 +
 app/Language/fr/Podcast.php                   |    21 +-
 app/Language/fr/PodcastNavigation.php         |     2 +
 .../ActivityPub/Activities/AcceptActivity.php |    24 +
 .../Activities/AnnounceActivity.php           |    37 +
 .../ActivityPub/Activities/CreateActivity.php |    24 +
 .../ActivityPub/Activities/DeleteActivity.php |    24 +
 .../ActivityPub/Activities/FollowActivity.php |    24 +
 .../ActivityPub/Activities/LikeActivity.php   |    24 +
 .../ActivityPub/Activities/UndoActivity.php   |    24 +
 app/Libraries/ActivityPub/ActivityRequest.php |   119 +
 .../ActivityPub/Config/ActivityPub.php        |    22 +
 app/Libraries/ActivityPub/Config/Routes.php   |   106 +
 .../Controllers/ActorController.php           |   376 +
 .../Controllers/BlockController.php           |   105 +
 .../Controllers/NoteController.php            |   278 +
 .../Controllers/SchedulerController.php       |    36 +
 .../Controllers/WebFingerController.php       |    28 +
 .../ActivityPub/Core/AbstractObject.php       |    50 +
 app/Libraries/ActivityPub/Core/Activity.php   |    32 +
 app/Libraries/ActivityPub/Core/ObjectType.php |    52 +
 .../2018-01-01-010000_add_actors.php          |   120 +
 .../2018-01-01-020000_add_notes.php           |   108 +
 .../2018-01-01-100000_add_activities.php      |    90 +
 .../2018-01-01-100000_add_favourites.php      |    55 +
 .../2018-01-01-100000_add_follows.php         |    57 +
 .../2018-01-01-100000_add_preview_cards.php   |    82 +
 ...8-01-01-110000_add_notes_preview_cards.php |    53 +
 .../2018-01-01-120000_add_blocked_domains.php |    37 +
 .../ActivityPub/Entities/Activity.php         |    99 +
 app/Libraries/ActivityPub/Entities/Actor.php  |    84 +
 .../ActivityPub/Entities/BlockedDomain.php    |    18 +
 .../ActivityPub/Entities/Favourite.php        |    21 +
 app/Libraries/ActivityPub/Entities/Follow.php |    19 +
 app/Libraries/ActivityPub/Entities/Note.php   |   200 +
 .../ActivityPub/Entities/PreviewCard.php      |    29 +
 .../ActivityPub/Filters/ActivityPubFilter.php |    99 +
 .../Helpers/activitypub_helper.php            |   513 +
 app/Libraries/ActivityPub/HttpSignature.php   |   170 +
 .../ActivityPub/Models/ActivityModel.php      |    83 +
 .../ActivityPub/Models/ActorModel.php         |   125 +
 .../ActivityPub/Models/BlockedDomainModel.php |    79 +
 .../ActivityPub/Models/FavouriteModel.php     |   178 +
 .../ActivityPub/Models/FollowModel.php        |   148 +
 .../ActivityPub/Models/NoteModel.php          |   548 +
 .../ActivityPub/Models/PreviewCardModel.php   |    56 +
 .../ActivityPub/Models/UuidModel.php          |   206 +
 .../ActivityPub/Objects/ActorObject.php       |   113 +
 .../ActivityPub/Objects/NoteObject.php        |    61 +
 .../Objects/OrderedCollectionObject.php       |    66 +
 .../Objects/OrderedCollectionPage.php         |    55 +
 .../ActivityPub/Objects/TombstoneObject.php   |    19 +
 app/Libraries/ActivityPub/WebFinger.php       |   126 +
 app/Libraries/Breadcrumb.php                  |     2 +-
 app/Libraries/Image.php                       |   153 +
 app/Libraries/Negotiate.php                   |    14 +
 app/Libraries/NoteObject.php                  |    30 +
 app/Libraries/PodcastActor.php                |    31 +
 app/Libraries/Router.php                      |   205 +
 app/Libraries/SimpleRSSElement.php            |     2 +-
 app/Models/AnalyticsPodcastByCountryModel.php |    32 +-
 app/Models/AnalyticsPodcastByEpisodeModel.php |    60 +-
 app/Models/AnalyticsPodcastByHourModel.php    |    14 +-
 app/Models/AnalyticsPodcastByPlayerModel.php  |    98 +-
 app/Models/AnalyticsPodcastByRegionModel.php  |    20 +-
 app/Models/AnalyticsPodcastByServiceModel.php |    20 +-
 app/Models/AnalyticsPodcastModel.php          |    86 +-
 app/Models/AnalyticsWebsiteByBrowserModel.php |    15 +-
 .../AnalyticsWebsiteByEntryPageModel.php      |    14 +-
 app/Models/AnalyticsWebsiteByRefererModel.php |    42 +-
 app/Models/EpisodeModel.php                   |   158 +-
 app/Models/NoteModel.php                      |    45 +
 app/Models/PersonModel.php                    |     5 +-
 app/Models/PodcastModel.php                   |   135 +-
 app/Models/UserModel.php                      |     4 +-
 app/Views/_assets/admin.ts                    |     2 +-
 .../fonts/kumbh-sans/kumbh-sans-700.woff      |   Bin 0 -> 21208 bytes
 .../fonts/kumbh-sans/kumbh-sans-700.woff2     |   Bin 0 -> 17060 bytes
 .../fonts/kumbh-sans/kumbh-sans-regular.woff  |   Bin 0 -> 21772 bytes
 .../fonts/kumbh-sans/kumbh-sans-regular.woff2 |   Bin 0 -> 17624 bytes
 .../fonts/montserrat/montserrat-600.woff      |   Bin 0 -> 23628 bytes
 .../fonts/montserrat/montserrat-600.woff2     |   Bin 0 -> 19264 bytes
 .../fonts/montserrat/montserrat-regular.woff  |   Bin 0 -> 23480 bytes
 .../fonts/montserrat/montserrat-regular.woff2 |   Bin 0 -> 19172 bytes
 app/Views/_assets/icons/add-box.svg           |     7 +-
 app/Views/_assets/icons/add.svg               |     0
 app/Views/_assets/icons/alert.svg             |     2 +-
 app/Views/_assets/icons/bookmark.svg          |     7 +-
 app/Views/_assets/icons/chat.svg              |     6 +
 app/Views/_assets/icons/cloud-off.svg         |     6 +
 app/Views/_assets/icons/dashboard.svg         |     2 +-
 app/Views/_assets/icons/delete-bin.svg        |     2 +-
 app/Views/_assets/icons/download.svg          |     2 +-
 app/Views/_assets/icons/edit.svg              |     2 +-
 app/Views/_assets/icons/external-link.svg     |     2 +-
 app/Views/_assets/icons/eye.svg               |     2 +-
 app/Views/_assets/icons/file-copy.svg         |     7 +-
 app/Views/_assets/icons/file.svg              |     7 +-
 app/Views/_assets/icons/folder-user.svg       |     7 +-
 app/Views/_assets/icons/funding/gofundme.svg  |     1 +
 app/Views/_assets/icons/funding/helloasso.svg |     1 +
 app/Views/_assets/icons/funding/indiegogo.svg |     1 +
 .../_assets/icons/funding/kickstarter.svg     |     1 +
 .../icons/funding/kisskissbankbank.svg        |     1 +
 app/Views/_assets/icons/funding/liberapay.svg |     1 +
 app/Views/_assets/icons/funding/patreon.svg   |     1 +
 app/Views/_assets/icons/funding/paypal.svg    |     1 +
 app/Views/_assets/icons/funding/tipeee.svg    |     1 +
 app/Views/_assets/icons/funding/ulule.svg     |     1 +
 app/Views/_assets/icons/group.svg             |     2 +-
 app/Views/_assets/icons/heart.svg             |     6 +
 app/Views/_assets/icons/line-chart.svg        |     2 +-
 app/Views/_assets/icons/link.svg              |     6 +
 app/Views/_assets/icons/links.svg             |     1 -
 app/Views/_assets/icons/map-pin.svg           |     7 +-
 app/Views/_assets/icons/menu.svg              |     0
 app/Views/_assets/icons/mic.svg               |     2 +-
 app/Views/_assets/icons/more.svg              |     2 +-
 app/Views/_assets/icons/movie.svg             |     7 +-
 app/Views/_assets/icons/pages.svg             |     2 +-
 app/Views/_assets/icons/podcasting/amazon.svg |     1 +
 .../_assets/icons/podcasting/antennapod.svg   |     1 +
 app/Views/_assets/icons/podcasting/apple.svg  |     1 +
 .../_assets/icons/podcasting/blubrry.svg      |     1 +
 .../_assets/icons/podcasting/breaker.svg      |     1 +
 .../_assets/icons/podcasting/castbox.svg      |     1 +
 .../_assets/icons/podcasting/castopod.svg     |     1 +
 app/Views/_assets/icons/podcasting/castro.svg |     1 +
 .../_assets/icons/podcasting/chartable.svg    |     1 +
 app/Views/_assets/icons/podcasting/deezer.svg |     1 +
 app/Views/_assets/icons/podcasting/fyyd.svg   |     1 +
 app/Views/_assets/icons/podcasting/google.svg |     1 +
 app/Views/_assets/icons/podcasting/ivoox.svg  |     1 +
 .../_assets/icons/podcasting/listennotes.svg  |     1 +
 .../_assets/icons/podcasting/overcast.svg     |     1 +
 .../_assets/icons/podcasting/playerfm.svg     |     1 +
 .../_assets/icons/podcasting/pocketcasts.svg  |     1 +
 .../_assets/icons/podcasting/podbean.svg      |     1 +
 .../icons/podcasting/podcastaddict.svg        |     1 +
 .../_assets/icons/podcasting/podcastindex.svg |     1 +
 .../_assets/icons/podcasting/podchaser.svg    |     1 +
 .../_assets/icons/podcasting/podcloud.svg     |     1 +
 .../_assets/icons/podcasting/podfriend.svg    |     1 +
 .../_assets/icons/podcasting/podinstall.svg   |     1 +
 .../_assets/icons/podcasting/podlink.svg      |     1 +
 .../_assets/icons/podcasting/podtail.svg      |     1 +
 .../_assets/icons/podcasting/podverse.svg     |     1 +
 .../_assets/icons/podcasting/radiopublic.svg  |     1 +
 .../_assets/icons/podcasting/spotify.svg      |     1 +
 .../_assets/icons/podcasting/spreaker.svg     |     1 +
 .../_assets/icons/podcasting/stitcher.svg     |     1 +
 app/Views/_assets/icons/podcasting/tunein.svg |     1 +
 app/Views/_assets/icons/question.svg          |     2 +-
 app/Views/_assets/icons/repeat.svg            |     6 +
 app/Views/_assets/icons/rss.svg               |     2 +-
 app/Views/_assets/icons/scales.svg            |     2 +-
 app/Views/_assets/icons/settings.svg          |     2 +-
 app/Views/_assets/icons/social/castopod.svg   |     1 +
 app/Views/_assets/icons/social/discord.svg    |     1 +
 app/Views/_assets/icons/social/facebook.svg   |     1 +
 app/Views/_assets/icons/social/funkwhale.svg  |     1 +
 app/Views/_assets/icons/social/instagram.svg  |     1 +
 app/Views/_assets/icons/social/linkedin.svg   |     1 +
 app/Views/_assets/icons/social/mastodon.svg   |     1 +
 app/Views/_assets/icons/social/mobilizon.svg  |     1 +
 app/Views/_assets/icons/social/peertube.svg   |     1 +
 app/Views/_assets/icons/social/pixelfed.svg   |     1 +
 app/Views/_assets/icons/social/plume.svg      |     1 +
 app/Views/_assets/icons/social/reddit.svg     |     1 +
 app/Views/_assets/icons/social/slack.svg      |     1 +
 app/Views/_assets/icons/social/tiktok.svg     |     1 +
 app/Views/_assets/icons/social/twitch.svg     |     1 +
 app/Views/_assets/icons/social/twitter.svg    |     1 +
 .../_assets/icons/social/writefreely.svg      |     1 +
 app/Views/_assets/icons/social/youtube.svg    |     1 +
 app/Views/_assets/icons/star-smile.svg        |     6 +
 app/Views/_assets/icons/timer.svg             |     7 +-
 app/Views/_assets/icons/upload-cloud.svg      |     6 +
 app/Views/_assets/icons/user-add.svg          |     2 +-
 app/Views/_assets/icons/user.svg              |     2 +-
 .../_assets/images/castopod-cover-default.jpg |   Bin 0 -> 13020 bytes
 .../{logo-castopod.svg => castopod-logo.svg}  |     1 -
 .../_assets/images/logo-castopod-circle.svg   |    26 -
 .../_assets/images/platforms/_default.svg     |    11 -
 .../images/platforms/funding/gofundme.svg     |    19 -
 .../images/platforms/funding/helloasso.svg    |    19 -
 .../images/platforms/funding/indiegogo.svg    |    16 -
 .../images/platforms/funding/kickstarter.svg  |     4 -
 .../platforms/funding/kisskissbankbank.svg    |     4 -
 .../images/platforms/funding/liberapay.svg    |    20 -
 .../images/platforms/funding/patreon.svg      |    24 -
 .../images/platforms/funding/paypal.svg       |    11 -
 .../images/platforms/funding/tipeee.svg       |    14 -
 .../images/platforms/funding/ulule.svg        |    37 -
 .../images/platforms/podcasting/amazon.svg    |     9 -
 .../platforms/podcasting/antennapod.svg       |    14 -
 .../images/platforms/podcasting/apple.svg     |    14 -
 .../images/platforms/podcasting/blubrry.svg   |     6 -
 .../images/platforms/podcasting/breaker.svg   |    11 -
 .../images/platforms/podcasting/castbox.svg   |    17 -
 .../images/platforms/podcasting/castopod.svg  |    12 -
 .../images/platforms/podcasting/castro.svg    |    17 -
 .../images/platforms/podcasting/chartable.svg |     5 -
 .../images/platforms/podcasting/deezer.svg    |    54 -
 .../images/platforms/podcasting/fyyd.svg      |     6 -
 .../images/platforms/podcasting/google.svg    |    14 -
 .../images/platforms/podcasting/ivoox.svg     |     7 -
 .../platforms/podcasting/listennotes.svg      |    10 -
 .../images/platforms/podcasting/overcast.svg  |     6 -
 .../images/platforms/podcasting/playerfm.svg  |     9 -
 .../platforms/podcasting/pocketcasts.svg      |     6 -
 .../images/platforms/podcasting/podbean.svg   |     9 -
 .../platforms/podcasting/podcastaddict.svg    |    13 -
 .../platforms/podcasting/podcastindex.svg     |     4 -
 .../images/platforms/podcasting/podchaser.svg |     8 -
 .../images/platforms/podcasting/podcloud.svg  |     8 -
 .../images/platforms/podcasting/podfriend.svg |    20 -
 .../platforms/podcasting/podinstall.svg       |     4 -
 .../images/platforms/podcasting/podlink.svg   |     1 -
 .../images/platforms/podcasting/podtail.svg   |    13 -
 .../images/platforms/podcasting/podverse.svg  |     4 -
 .../platforms/podcasting/radiopublic.svg      |     8 -
 .../images/platforms/podcasting/spotify.svg   |     6 -
 .../images/platforms/podcasting/spreaker.svg  |     6 -
 .../images/platforms/podcasting/stitcher.svg  |    10 -
 .../images/platforms/podcasting/tunein.svg    |     8 -
 .../images/platforms/social/castopod.svg      |     1 -
 .../images/platforms/social/discord.svg       |     1 -
 .../images/platforms/social/facebook.svg      |     1 -
 .../images/platforms/social/funkwhale.svg     |     1 -
 .../images/platforms/social/instagram.svg     |     1 -
 .../images/platforms/social/linkedin.svg      |     1 -
 .../images/platforms/social/mastodon.svg      |     1 -
 .../images/platforms/social/mobilizon.svg     |     1 -
 .../images/platforms/social/peertube.svg      |     1 -
 .../images/platforms/social/pixelfed.svg      |     1 -
 .../_assets/images/platforms/social/plume.svg |     1 -
 .../_assets/images/platforms/social/slack.svg |     1 -
 .../images/platforms/social/twitch.svg        |     1 -
 .../images/platforms/social/twitter.svg       |     1 -
 .../images/platforms/social/writefreely.svg   |     1 -
 .../images/platforms/social/youtube.svg       |     1 -
 app/Views/_assets/modules/Clipboard.ts        |     6 +-
 app/Views/_assets/modules/Dropdown.ts         |   113 +-
 app/Views/_assets/modules/MarkdownEditor.ts   |     8 +-
 app/Views/_assets/modules/Modal.ts            |    34 +
 app/Views/_assets/modules/Soundbites.ts       |    12 +-
 app/Views/_assets/modules/ThemePicker.ts      |     6 +-
 app/Views/_assets/modules/Toggler.ts          |    31 +
 app/Views/_assets/podcast.ts                  |     6 +
 app/Views/_assets/styles/dropdown.css         |     8 +
 app/Views/_assets/styles/fonts.css            |    41 +
 app/Views/_assets/styles/index.css            |     5 +
 app/Views/_assets/styles/layout.css           |     3 +-
 app/Views/_assets/styles/multiSelect.css      |   276 +-
 app/Views/_assets/styles/note.css             |    22 +
 app/Views/_assets/styles/radioBtn.css         |    34 +-
 app/Views/_assets/styles/radioToggler.css     |     9 +
 app/Views/_assets/styles/switch.css           |    38 +-
 app/Views/_assets/styles/tabs.css             |    37 +
 app/Views/admin/_layout.php                   |    19 +-
 app/Views/admin/_sidebar.php                  |    77 +-
 app/Views/admin/contributor/list.php          |     2 +-
 app/Views/admin/episode/create.php            |   138 +-
 app/Views/admin/episode/edit.php              |   146 +-
 app/Views/admin/episode/embeddable_player.php |    93 +-
 app/Views/admin/episode/list.php              |   108 +-
 app/Views/admin/episode/publish.php           |   171 +
 app/Views/admin/episode/publish_edit.php      |   186 +
 app/Views/admin/episode/unpublish.php         |    53 +
 app/Views/admin/episode/view.php              |    60 +-
 app/Views/admin/fediverse/blocked_actors.php  |    83 +
 app/Views/admin/fediverse/blocked_domains.php |    80 +
 app/Views/admin/page/list.php                 |     2 +-
 app/Views/admin/page/view.php                 |     2 +-
 app/Views/admin/podcast/_sidebar.php          |    61 +-
 app/Views/admin/podcast/edit.php              |    85 +-
 app/Views/admin/podcast/import.php            |    44 +-
 app/Views/admin/podcast/latest_episodes.php   |   102 +-
 app/Views/admin/podcast/list.php              |    34 +-
 app/Views/admin/podcast/platforms.php         |    29 +-
 app/Views/admin/podcast/view.php              |    11 +-
 app/Views/admin/user/list.php                 |     2 +-
 app/Views/auth/_layout.php                    |    10 +-
 app/Views/credits.php                         |    50 +-
 app/Views/embeddable_player.php               |   245 +-
 app/Views/episode.php                         |   149 -
 app/Views/errors/cli/error_exception.php      |   101 +-
 app/Views/errors/html/debug.css               |     1 +
 app/Views/errors/html/error_404.php           |     4 +-
 app/Views/errors/html/error_exception.php     |   938 +-
 app/Views/errors/html/production.php          |     2 +-
 app/Views/home.php                            |    75 +-
 app/Views/install/_layout.php                 |     2 +-
 app/Views/install/cache_config.php            |    10 +-
 app/Views/install/create_superadmin.php       |     6 +-
 app/Views/install/database_config.php         |    10 +-
 app/Views/install/instance_config.php         |    21 +-
 app/Views/install/manual_config.php           |     6 +-
 app/Views/page.php                            |    43 +-
 app/Views/pager/default_full.php              |     2 +-
 app/Views/podcast.php                         |   261 -
 app/Views/podcast/_layout.php                 |   120 +
 app/Views/podcast/_layout_authenticated.php   |   147 +
 app/Views/podcast/_partials/episode_card.php  |    36 +
 app/Views/podcast/_partials/header.php        |    95 +
 app/Views/podcast/_partials/note.php          |    41 +
 app/Views/podcast/_partials/note_actions.php  |    36 +
 .../_partials/note_actions_authenticated.php  |    89 +
 .../podcast/_partials/note_authenticated.php  |    41 +
 .../podcast/_partials/note_with_replies.php   |    21 +
 .../note_with_replies_authenticated.php       |    45 +
 app/Views/podcast/_partials/preview_card.php  |    45 +
 app/Views/podcast/_partials/reblog.php        |    48 +
 .../_partials/reblog_authenticated.php        |    48 +
 app/Views/podcast/_partials/reply.php         |    29 +
 app/Views/podcast/_partials/reply_actions.php |    36 +
 .../_partials/reply_actions_authenticated.php |    89 +
 .../podcast/_partials/reply_authenticated.php |    29 +
 app/Views/podcast/_partials/sidebar.php       |    91 +
 app/Views/podcast/activity.php                |    53 +
 app/Views/podcast/activity_authenticated.php  |    99 +
 app/Views/podcast/episode.php                 |   186 +
 app/Views/podcast/episode_authenticated.php   |   220 +
 app/Views/podcast/episodes.php                |   171 +
 app/Views/podcast/episodes_authenticated.php  |   171 +
 app/Views/podcast/follow.php                  |    91 +
 app/Views/podcast/note.php                    |    38 +
 app/Views/podcast/note_authenticated.php      |    40 +
 app/Views/podcast/note_remote_action.php      |    69 +
 castopod_namespace.json                       |    31 +
 composer.json                                 |    34 +-
 composer.lock                                 |  1744 +-
 crontab                                       |     1 +
 docker-compose.yml                            |     3 +-
 docs/setup-development.md                     |    20 +-
 env                                           |    38 +-
 package-lock.json                             | 14211 ++++++++++------
 package.json                                  |    95 +-
 phpunit.xml.dist                              |    69 +-
 public/.htaccess                              |     2 +-
 public/index.php                              |    23 +-
 public/media/persons/index.html               |     0
 public/media/podcasts/index.html              |     9 +
 spark                                         |    31 +-
 tailwind.config.js                            |    53 +-
 476 files changed, 26120 insertions(+), 11160 deletions(-)
 create mode 100644 .svgo.icons.js
 delete mode 100644 .svgo.icons.yml
 create mode 100644 .svgo.js
 delete mode 100644 .svgo.yml
 delete mode 100644 LICENSE
 create mode 100644 LICENSE.md
 create mode 100644 app/Config/ActivityPub.php
 create mode 100644 app/Config/Generators.php
 create mode 100644 app/Config/Security.php
 create mode 100644 app/Controllers/Actor.php
 create mode 100644 app/Controllers/Admin/Fediverse.php
 create mode 100644 app/Controllers/Note.php
 create mode 100644 app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php
 create mode 100644 app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php
 delete mode 100644 app/Entities/Image.php
 create mode 100644 app/Entities/Note.php
 rename app/Filters/{Permission.php => PermissionFilter.php} (98%)
 create mode 100644 app/Helpers/auth_helper.php
 create mode 100644 app/Language/en/ActivityPub.php
 create mode 100644 app/Language/en/Fediverse.php
 create mode 100644 app/Language/en/Note.php
 create mode 100644 app/Language/fr/ActivityPub.php
 create mode 100644 app/Language/fr/Fediverse.php
 create mode 100644 app/Language/fr/Note.php
 create mode 100644 app/Libraries/ActivityPub/Activities/AcceptActivity.php
 create mode 100644 app/Libraries/ActivityPub/Activities/AnnounceActivity.php
 create mode 100644 app/Libraries/ActivityPub/Activities/CreateActivity.php
 create mode 100644 app/Libraries/ActivityPub/Activities/DeleteActivity.php
 create mode 100644 app/Libraries/ActivityPub/Activities/FollowActivity.php
 create mode 100644 app/Libraries/ActivityPub/Activities/LikeActivity.php
 create mode 100644 app/Libraries/ActivityPub/Activities/UndoActivity.php
 create mode 100644 app/Libraries/ActivityPub/ActivityRequest.php
 create mode 100644 app/Libraries/ActivityPub/Config/ActivityPub.php
 create mode 100644 app/Libraries/ActivityPub/Config/Routes.php
 create mode 100644 app/Libraries/ActivityPub/Controllers/ActorController.php
 create mode 100644 app/Libraries/ActivityPub/Controllers/BlockController.php
 create mode 100644 app/Libraries/ActivityPub/Controllers/NoteController.php
 create mode 100644 app/Libraries/ActivityPub/Controllers/SchedulerController.php
 create mode 100644 app/Libraries/ActivityPub/Controllers/WebFingerController.php
 create mode 100644 app/Libraries/ActivityPub/Core/AbstractObject.php
 create mode 100644 app/Libraries/ActivityPub/Core/Activity.php
 create mode 100644 app/Libraries/ActivityPub/Core/ObjectType.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php
 create mode 100644 app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php
 create mode 100644 app/Libraries/ActivityPub/Entities/Activity.php
 create mode 100644 app/Libraries/ActivityPub/Entities/Actor.php
 create mode 100644 app/Libraries/ActivityPub/Entities/BlockedDomain.php
 create mode 100644 app/Libraries/ActivityPub/Entities/Favourite.php
 create mode 100644 app/Libraries/ActivityPub/Entities/Follow.php
 create mode 100644 app/Libraries/ActivityPub/Entities/Note.php
 create mode 100644 app/Libraries/ActivityPub/Entities/PreviewCard.php
 create mode 100644 app/Libraries/ActivityPub/Filters/ActivityPubFilter.php
 create mode 100644 app/Libraries/ActivityPub/Helpers/activitypub_helper.php
 create mode 100644 app/Libraries/ActivityPub/HttpSignature.php
 create mode 100644 app/Libraries/ActivityPub/Models/ActivityModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/ActorModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/BlockedDomainModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/FavouriteModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/FollowModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/NoteModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/PreviewCardModel.php
 create mode 100644 app/Libraries/ActivityPub/Models/UuidModel.php
 create mode 100644 app/Libraries/ActivityPub/Objects/ActorObject.php
 create mode 100644 app/Libraries/ActivityPub/Objects/NoteObject.php
 create mode 100644 app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php
 create mode 100644 app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php
 create mode 100644 app/Libraries/ActivityPub/Objects/TombstoneObject.php
 create mode 100644 app/Libraries/ActivityPub/WebFinger.php
 create mode 100644 app/Libraries/Image.php
 create mode 100644 app/Libraries/Negotiate.php
 create mode 100644 app/Libraries/NoteObject.php
 create mode 100644 app/Libraries/PodcastActor.php
 create mode 100644 app/Libraries/Router.php
 create mode 100644 app/Models/NoteModel.php
 create mode 100644 app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff
 create mode 100644 app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff2
 create mode 100644 app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff
 create mode 100644 app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff2
 create mode 100644 app/Views/_assets/fonts/montserrat/montserrat-600.woff
 create mode 100644 app/Views/_assets/fonts/montserrat/montserrat-600.woff2
 create mode 100644 app/Views/_assets/fonts/montserrat/montserrat-regular.woff
 create mode 100644 app/Views/_assets/fonts/montserrat/montserrat-regular.woff2
 mode change 100644 => 100755 app/Views/_assets/icons/add-box.svg
 mode change 100644 => 100755 app/Views/_assets/icons/add.svg
 mode change 100644 => 100755 app/Views/_assets/icons/alert.svg
 mode change 100644 => 100755 app/Views/_assets/icons/bookmark.svg
 create mode 100755 app/Views/_assets/icons/chat.svg
 create mode 100755 app/Views/_assets/icons/cloud-off.svg
 mode change 100644 => 100755 app/Views/_assets/icons/dashboard.svg
 mode change 100644 => 100755 app/Views/_assets/icons/delete-bin.svg
 mode change 100644 => 100755 app/Views/_assets/icons/download.svg
 mode change 100644 => 100755 app/Views/_assets/icons/edit.svg
 mode change 100644 => 100755 app/Views/_assets/icons/external-link.svg
 mode change 100644 => 100755 app/Views/_assets/icons/eye.svg
 mode change 100644 => 100755 app/Views/_assets/icons/file-copy.svg
 mode change 100644 => 100755 app/Views/_assets/icons/file.svg
 mode change 100644 => 100755 app/Views/_assets/icons/folder-user.svg
 create mode 100755 app/Views/_assets/icons/funding/gofundme.svg
 create mode 100755 app/Views/_assets/icons/funding/helloasso.svg
 create mode 100755 app/Views/_assets/icons/funding/indiegogo.svg
 create mode 100755 app/Views/_assets/icons/funding/kickstarter.svg
 create mode 100755 app/Views/_assets/icons/funding/kisskissbankbank.svg
 create mode 100755 app/Views/_assets/icons/funding/liberapay.svg
 create mode 100755 app/Views/_assets/icons/funding/patreon.svg
 create mode 100755 app/Views/_assets/icons/funding/paypal.svg
 create mode 100755 app/Views/_assets/icons/funding/tipeee.svg
 create mode 100755 app/Views/_assets/icons/funding/ulule.svg
 mode change 100644 => 100755 app/Views/_assets/icons/group.svg
 create mode 100755 app/Views/_assets/icons/heart.svg
 mode change 100644 => 100755 app/Views/_assets/icons/line-chart.svg
 create mode 100755 app/Views/_assets/icons/link.svg
 delete mode 100644 app/Views/_assets/icons/links.svg
 mode change 100644 => 100755 app/Views/_assets/icons/menu.svg
 mode change 100644 => 100755 app/Views/_assets/icons/mic.svg
 mode change 100644 => 100755 app/Views/_assets/icons/more.svg
 mode change 100644 => 100755 app/Views/_assets/icons/movie.svg
 mode change 100644 => 100755 app/Views/_assets/icons/pages.svg
 create mode 100755 app/Views/_assets/icons/podcasting/amazon.svg
 create mode 100755 app/Views/_assets/icons/podcasting/antennapod.svg
 create mode 100755 app/Views/_assets/icons/podcasting/apple.svg
 create mode 100755 app/Views/_assets/icons/podcasting/blubrry.svg
 create mode 100755 app/Views/_assets/icons/podcasting/breaker.svg
 create mode 100755 app/Views/_assets/icons/podcasting/castbox.svg
 create mode 100755 app/Views/_assets/icons/podcasting/castopod.svg
 create mode 100755 app/Views/_assets/icons/podcasting/castro.svg
 create mode 100755 app/Views/_assets/icons/podcasting/chartable.svg
 create mode 100755 app/Views/_assets/icons/podcasting/deezer.svg
 create mode 100755 app/Views/_assets/icons/podcasting/fyyd.svg
 create mode 100755 app/Views/_assets/icons/podcasting/google.svg
 create mode 100755 app/Views/_assets/icons/podcasting/ivoox.svg
 create mode 100755 app/Views/_assets/icons/podcasting/listennotes.svg
 create mode 100755 app/Views/_assets/icons/podcasting/overcast.svg
 create mode 100755 app/Views/_assets/icons/podcasting/playerfm.svg
 create mode 100755 app/Views/_assets/icons/podcasting/pocketcasts.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podbean.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podcastaddict.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podcastindex.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podchaser.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podcloud.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podfriend.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podinstall.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podlink.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podtail.svg
 create mode 100755 app/Views/_assets/icons/podcasting/podverse.svg
 create mode 100755 app/Views/_assets/icons/podcasting/radiopublic.svg
 create mode 100755 app/Views/_assets/icons/podcasting/spotify.svg
 create mode 100755 app/Views/_assets/icons/podcasting/spreaker.svg
 create mode 100755 app/Views/_assets/icons/podcasting/stitcher.svg
 create mode 100755 app/Views/_assets/icons/podcasting/tunein.svg
 mode change 100644 => 100755 app/Views/_assets/icons/question.svg
 create mode 100644 app/Views/_assets/icons/repeat.svg
 mode change 100644 => 100755 app/Views/_assets/icons/rss.svg
 mode change 100644 => 100755 app/Views/_assets/icons/scales.svg
 mode change 100644 => 100755 app/Views/_assets/icons/settings.svg
 create mode 100755 app/Views/_assets/icons/social/castopod.svg
 create mode 100755 app/Views/_assets/icons/social/discord.svg
 create mode 100755 app/Views/_assets/icons/social/facebook.svg
 create mode 100755 app/Views/_assets/icons/social/funkwhale.svg
 create mode 100755 app/Views/_assets/icons/social/instagram.svg
 create mode 100755 app/Views/_assets/icons/social/linkedin.svg
 create mode 100755 app/Views/_assets/icons/social/mastodon.svg
 create mode 100755 app/Views/_assets/icons/social/mobilizon.svg
 create mode 100755 app/Views/_assets/icons/social/peertube.svg
 create mode 100755 app/Views/_assets/icons/social/pixelfed.svg
 create mode 100755 app/Views/_assets/icons/social/plume.svg
 create mode 100755 app/Views/_assets/icons/social/reddit.svg
 create mode 100755 app/Views/_assets/icons/social/slack.svg
 create mode 100755 app/Views/_assets/icons/social/tiktok.svg
 create mode 100755 app/Views/_assets/icons/social/twitch.svg
 create mode 100755 app/Views/_assets/icons/social/twitter.svg
 create mode 100755 app/Views/_assets/icons/social/writefreely.svg
 create mode 100755 app/Views/_assets/icons/social/youtube.svg
 create mode 100755 app/Views/_assets/icons/star-smile.svg
 mode change 100644 => 100755 app/Views/_assets/icons/timer.svg
 create mode 100755 app/Views/_assets/icons/upload-cloud.svg
 mode change 100644 => 100755 app/Views/_assets/icons/user-add.svg
 mode change 100644 => 100755 app/Views/_assets/icons/user.svg
 create mode 100644 app/Views/_assets/images/castopod-cover-default.jpg
 rename app/Views/_assets/images/{logo-castopod.svg => castopod-logo.svg} (96%)
 delete mode 100644 app/Views/_assets/images/logo-castopod-circle.svg
 delete mode 100644 app/Views/_assets/images/platforms/_default.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/gofundme.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/helloasso.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/indiegogo.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/kickstarter.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/kisskissbankbank.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/liberapay.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/patreon.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/paypal.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/tipeee.svg
 delete mode 100644 app/Views/_assets/images/platforms/funding/ulule.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/amazon.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/antennapod.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/apple.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/blubrry.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/breaker.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/castbox.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/castopod.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/castro.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/chartable.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/deezer.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/fyyd.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/google.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/ivoox.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/listennotes.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/overcast.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/playerfm.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/pocketcasts.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podbean.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podcastaddict.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podcastindex.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podchaser.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podcloud.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podfriend.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podinstall.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podlink.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podtail.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/podverse.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/radiopublic.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/spotify.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/spreaker.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/stitcher.svg
 delete mode 100644 app/Views/_assets/images/platforms/podcasting/tunein.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/castopod.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/discord.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/facebook.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/funkwhale.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/instagram.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/linkedin.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/mastodon.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/mobilizon.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/peertube.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/pixelfed.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/plume.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/slack.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/twitch.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/twitter.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/writefreely.svg
 delete mode 100644 app/Views/_assets/images/platforms/social/youtube.svg
 create mode 100644 app/Views/_assets/modules/Modal.ts
 create mode 100644 app/Views/_assets/modules/Toggler.ts
 create mode 100644 app/Views/_assets/styles/dropdown.css
 create mode 100644 app/Views/_assets/styles/fonts.css
 create mode 100644 app/Views/_assets/styles/note.css
 create mode 100644 app/Views/_assets/styles/radioToggler.css
 create mode 100644 app/Views/_assets/styles/tabs.css
 create mode 100644 app/Views/admin/episode/publish.php
 create mode 100644 app/Views/admin/episode/publish_edit.php
 create mode 100644 app/Views/admin/episode/unpublish.php
 create mode 100644 app/Views/admin/fediverse/blocked_actors.php
 create mode 100644 app/Views/admin/fediverse/blocked_domains.php
 delete mode 100644 app/Views/episode.php
 delete mode 100644 app/Views/podcast.php
 create mode 100644 app/Views/podcast/_layout.php
 create mode 100644 app/Views/podcast/_layout_authenticated.php
 create mode 100644 app/Views/podcast/_partials/episode_card.php
 create mode 100644 app/Views/podcast/_partials/header.php
 create mode 100644 app/Views/podcast/_partials/note.php
 create mode 100644 app/Views/podcast/_partials/note_actions.php
 create mode 100644 app/Views/podcast/_partials/note_actions_authenticated.php
 create mode 100644 app/Views/podcast/_partials/note_authenticated.php
 create mode 100644 app/Views/podcast/_partials/note_with_replies.php
 create mode 100644 app/Views/podcast/_partials/note_with_replies_authenticated.php
 create mode 100644 app/Views/podcast/_partials/preview_card.php
 create mode 100644 app/Views/podcast/_partials/reblog.php
 create mode 100644 app/Views/podcast/_partials/reblog_authenticated.php
 create mode 100644 app/Views/podcast/_partials/reply.php
 create mode 100644 app/Views/podcast/_partials/reply_actions.php
 create mode 100644 app/Views/podcast/_partials/reply_actions_authenticated.php
 create mode 100644 app/Views/podcast/_partials/reply_authenticated.php
 create mode 100644 app/Views/podcast/_partials/sidebar.php
 create mode 100644 app/Views/podcast/activity.php
 create mode 100644 app/Views/podcast/activity_authenticated.php
 create mode 100644 app/Views/podcast/episode.php
 create mode 100644 app/Views/podcast/episode_authenticated.php
 create mode 100644 app/Views/podcast/episodes.php
 create mode 100644 app/Views/podcast/episodes_authenticated.php
 create mode 100644 app/Views/podcast/follow.php
 create mode 100644 app/Views/podcast/note.php
 create mode 100644 app/Views/podcast/note_authenticated.php
 create mode 100644 app/Views/podcast/note_remote_action.php
 create mode 100644 castopod_namespace.json
 create mode 100644 crontab
 create mode 100644 public/media/persons/index.html
 create mode 100644 public/media/podcasts/index.html

diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 1fd510e768..aa74483c2a 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,8 +1,8 @@
-FROM php:7.2-fpm
+FROM php:7.3-fpm
 
 COPY --from=composer /usr/bin/composer /usr/bin/composer
 
-RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
+RUN curl -fsSL https://deb.nodesource.com/setup_lts.x | bash -
 
 RUN apt-get update && \
     apt-get install -y nodejs
diff --git a/.gitignore b/.gitignore
index 1baa8fe3b4..d66b6f23af 100644
--- a/.gitignore
+++ b/.gitignore
@@ -138,7 +138,6 @@ node_modules
 # public folder
 public/*
 !public/media
-!public/media/~person
 !public/.htaccess
 !public/favicon.ico
 !public/index.php
@@ -147,10 +146,14 @@ public/*
 # public media folder
 public/media/*
 !public/media/index.html
+!public/media/podcasts
+!public/media/persons
 
-# public person folder
-public/media/~person/*
-!public/media/~person/index.html
+public/media/podcasts/*
+!public/media/podcasts/index.html
+
+public/media/persons/*
+!public/media/persons/index.html
 
 # Generated files
 app/Language/en/PersonsTaxonomy.php
diff --git a/.prettierrc.json b/.prettierrc.json
index 194ebab74c..a766ac8d82 100644
--- a/.prettierrc.json
+++ b/.prettierrc.json
@@ -4,7 +4,7 @@
     {
       "files": "*.php",
       "options": {
-        "phpVersion": "7.2",
+        "phpVersion": "7.3",
         "singleQuote": true
       }
     },
diff --git a/.rsync-filter b/.rsync-filter
index 606c8a9106..f466ad22e9 100644
--- a/.rsync-filter
+++ b/.rsync-filter
@@ -7,7 +7,7 @@
 + writable/***
 + .env.example
 + DEPENDENCIES.md
-+ LICENSE
++ LICENSE.md
 + README.md
 + INSTALL.md
 - **
diff --git a/.stylelintrc.json b/.stylelintrc.json
index 97675e6da9..2cd0132cf2 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -9,7 +9,8 @@
           "apply",
           "responsive",
           "variants",
-          "screen"
+          "screen",
+          "layer"
         ]
       }
     ],
diff --git a/.svgo.icons.js b/.svgo.icons.js
new file mode 100644
index 0000000000..05d1589713
--- /dev/null
+++ b/.svgo.icons.js
@@ -0,0 +1,17 @@
+module.exports = {
+  plugins: [
+    "removeXMLNS",
+    "removeDimensions",
+    "sortAttrs",
+    {
+      name: "addAttributesToSVGElement",
+      params: {
+        attributes: [
+          { fill: "currentColor" },
+          { width: "1em" },
+          { height: "1em" },
+        ],
+      },
+    },
+  ],
+};
diff --git a/.svgo.icons.yml b/.svgo.icons.yml
deleted file mode 100644
index 32c60fea5c..0000000000
--- a/.svgo.icons.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-plugins:
-  - removeXMLNS: true
-  - removeDimensions: true
-  - addAttributesToSVGElement:
-      attributes:
-        - fill: currentColor
-        - width: "1em"
-        - height: "1em"
-  - sortAttrs: true
diff --git a/.svgo.js b/.svgo.js
new file mode 100644
index 0000000000..c6a27c953b
--- /dev/null
+++ b/.svgo.js
@@ -0,0 +1,12 @@
+module.exports = {
+  plugins: [
+    {
+      name: "removeViewBox",
+      active: false,
+    },
+    "removeXMLNS",
+    "removeDimensions",
+    "sortAttrs",
+    "prefixIds",
+  ],
+};
diff --git a/.svgo.yml b/.svgo.yml
deleted file mode 100644
index b4177b4f84..0000000000
--- a/.svgo.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-plugins:
-  - removeXMLNS: true
-  - removeDimensions: true
-  - sortAttrs: true
-  - prefixIds: true
diff --git a/DEPENDENCIES.md b/DEPENDENCIES.md
index f987fd2785..325e823b2f 100644
--- a/DEPENDENCIES.md
+++ b/DEPENDENCIES.md
@@ -4,7 +4,7 @@ Castopod uses the following components:
 
 PHP Dependencies:
 
-- [Code Igniter 4](https://codeigniter.com)
+- [CodeIgniter 4](https://codeigniter.com)
   ([MIT License](https://codeigniter.com/user_guide/license.html))
 - [WhichBrowser/Parser-PHP](https://github.com/WhichBrowser/Parser-PHP)
   ([MIT License](https://github.com/WhichBrowser/Parser-PHP/blob/master/LICENSE))
@@ -24,6 +24,14 @@ PHP Dependencies:
   ([MIT License](https://github.com/podlibre/user-agents-php/blob/main/LICENSE))
 - [podlibre/ipcat](https://github.com/podlibre/ipcat)
   ([GNU General Public License v3.0](https://github.com/podlibre/ipcat/blob/master/LICENSE))
+- [podlibre/podcast-namespace](https://code.podlibre.org/podlibre/podcastnamespace)
+  ([MIT License](https://code.podlibre.org/podlibre/podcastnamespace/-/blob/master/LICENSE))
+- [phpseclib](https://phpseclib.com/)
+  ([MIT License](https://github.com/phpseclib/phpseclib/blob/master/LICENSE))
+- [codeigniter4-uuid](https://github.com/michalsn/codeigniter4-uuid)
+  ([MIT License](https://github.com/michalsn/codeigniter4-uuid/blob/develop/LICENSE))
+- [essence](https://github.com/essence/essence)
+  ([The FreeBSD License](https://github.com/essence/essence/blob/master/LICENSE.txt))
 
 Javascript dependencies:
 
@@ -39,9 +47,15 @@ Javascript dependencies:
   ([MIT License](https://github.com/jshjohnson/Choices/blob/master/LICENSE))
 - [flatpickr](https://flatpickr.js.org/)
   ([MIT License](https://github.com/flatpickr/flatpickr/blob/master/LICENSE.md))
+- [popperjs](https://popper.js.org/)
+  ([MIT License](https://github.com/popperjs/popper-core/blob/master/LICENSE.md))
 
 Other:
 
+- [Kumbh Sans](https://fonts.google.com/specimen/Kumbh+Sans)
+  ([Open Font License](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL))
+- [Montserrat](https://fonts.google.com/specimen/Montserrat)
+  ([Open Font License](https://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&id=OFL))
 - [RemixIcon](https://remixicon.com/)
   ([Apache License 2.0](https://github.com/Remix-Design/RemixIcon/blob/master/License))
 - [OPAWG/User agent list](https://github.com/opawg/user-agents)
diff --git a/Dockerfile b/Dockerfile
index a2123509c1..01ab228ea6 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM php:7.2-fpm
+FROM php:7.3-fpm
 
 COPY . /castopod
 WORKDIR /castopod
@@ -25,3 +25,9 @@ RUN echo "file_uploads = On\n" \
          "post_max_size = 120M\n" \
          "max_execution_time = 300\n" \
          > /usr/local/etc/php/conf.d/uploads.ini
+
+# install cron
+RUN apt-get update && \
+    apt-get install -y cron
+
+RUN crontab /castopod/crontab
diff --git a/INSTALL.md b/INSTALL.md
index 71ad0e629f..efc5f99592 100644
--- a/INSTALL.md
+++ b/INSTALL.md
@@ -1,13 +1,16 @@
-# How to install Castopod
+# How to install Castopod <!-- omit in toc -->
 
 Castopod was thought to be easy to install. Whether using dedicated or shared
 hosting, you can install it on most PHP-MySQL compatible web servers.
 
+## Table of contents <!-- omit in toc -->
+
 - [Install instructions](#install-instructions)
   - [(optional) Manual configuration](#optional-manual-configuration)
 - [Web Server Requirements](#web-server-requirements)
-  - [PHP v7.2 or higher](#php-v72-or-higher)
+  - [PHP v7.3 or higher](#php-v73-or-higher)
   - [MySQL compatible database](#mysql-compatible-database)
+    - [Privileges](#privileges)
   - [(Optional) Other recommendations](#optional-other-recommendations)
 - [Security concerns](#security-concerns)
 
@@ -19,9 +22,16 @@ hosting, you can install it on most PHP-MySQL compatible web servers.
 1. Download and unzip the Castopod package onto the web server if you haven’t
    already.
    - ⚠️ Set the web server document root to the `public/` sub-folder.
-2. Run the Castopod install script by going to the install wizard page
+2. ⚠️ For broadcasting social activities to the fediverse, add a cron task on
+   your web server to run every minute (replace the paths accordingly):
+
+   ```php
+      * * * * * /path/to/php /path/to/castopod/public/index.php scheduled-activities
+   ```
+
+3. Run the Castopod install script by going to the install wizard page
    (`https://your_domain_name.com/cp-install`) in your favorite web browser.
-3. Follow the instructions on your screen.
+4. Follow the instructions on your screen.
 
 All done, start podcasting!
 
@@ -36,13 +46,12 @@ Before uploading Castopod files to your web server:
 
 ## Web Server Requirements
 
-### PHP v7.2 or higher
+### PHP v7.3 or higher
 
-PHP version 7.2 or higher is required, with the following extensions installed:
+PHP version 7.3 or higher is required, with the following extensions installed:
 
 - [intl](http://php.net/manual/en/intl.requirements.php)
-- [libcurl](http://php.net/manual/en/curl.requirements.php) if you plan to use
-  the HTTP\CURLRequest library
+- [libcurl](http://php.net/manual/en/curl.requirements.php)
 - [mbstring](http://php.net/manual/en/mbstring.installation.php)
 
 Additionally, make sure that the following extensions are enabled in your PHP:
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index d0829d8297..0000000000
--- a/LICENSE
+++ /dev/null
@@ -1,661 +0,0 @@
-                    GNU AFFERO GENERAL PUBLIC LICENSE
-                       Version 3, 19 November 2007
-
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-                            Preamble
-
-  The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
-  The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works.  By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
-  When we speak of free software, we are referring to freedom, not
-price.  Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
-  Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
-  A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate.  Many developers of free software are heartened and
-encouraged by the resulting cooperation.  However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
-  The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community.  It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server.  Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
-  An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals.  This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.
-
-                       TERMS AND CONDITIONS
-
-  0. Definitions.
-
-  "This License" refers to version 3 of the GNU Affero General Public License.
-
-  "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
-  "The Program" refers to any copyrightable work licensed under this
-License.  Each licensee is addressed as "you".  "Licensees" and
-"recipients" may be individuals or organizations.
-
-  To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy.  The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
-  A "covered work" means either the unmodified Program or a work based
-on the Program.
-
-  To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy.  Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
-  To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies.  Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
-  An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License.  If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
-  1. Source Code.
-
-  The "source code" for a work means the preferred form of the work
-for making modifications to it.  "Object code" means any non-source
-form of a work.
-
-  A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
-  The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form.  A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
-  The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities.  However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work.  For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
-  The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
-  The Corresponding Source for a work in source code form is that
-same work.
-
-  2. Basic Permissions.
-
-  All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met.  This License explicitly affirms your unlimited
-permission to run the unmodified Program.  The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work.  This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
-  You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force.  You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright.  Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
-  Conveying under any other circumstances is permitted solely under
-the conditions stated below.  Sublicensing is not allowed; section 10
-makes it unnecessary.
-
-  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
-  No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
-  When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
-  4. Conveying Verbatim Copies.
-
-  You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
-  You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
-  5. Conveying Modified Source Versions.
-
-  You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
-    a) The work must carry prominent notices stating that you modified
-    it, and giving a relevant date.
-
-    b) The work must carry prominent notices stating that it is
-    released under this License and any conditions added under section
-    7.  This requirement modifies the requirement in section 4 to
-    "keep intact all notices".
-
-    c) You must license the entire work, as a whole, under this
-    License to anyone who comes into possession of a copy.  This
-    License will therefore apply, along with any applicable section 7
-    additional terms, to the whole of the work, and all its parts,
-    regardless of how they are packaged.  This License gives no
-    permission to license the work in any other way, but it does not
-    invalidate such permission if you have separately received it.
-
-    d) If the work has interactive user interfaces, each must display
-    Appropriate Legal Notices; however, if the Program has interactive
-    interfaces that do not display Appropriate Legal Notices, your
-    work need not make them do so.
-
-  A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit.  Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
-  6. Conveying Non-Source Forms.
-
-  You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
-    a) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by the
-    Corresponding Source fixed on a durable physical medium
-    customarily used for software interchange.
-
-    b) Convey the object code in, or embodied in, a physical product
-    (including a physical distribution medium), accompanied by a
-    written offer, valid for at least three years and valid for as
-    long as you offer spare parts or customer support for that product
-    model, to give anyone who possesses the object code either (1) a
-    copy of the Corresponding Source for all the software in the
-    product that is covered by this License, on a durable physical
-    medium customarily used for software interchange, for a price no
-    more than your reasonable cost of physically performing this
-    conveying of source, or (2) access to copy the
-    Corresponding Source from a network server at no charge.
-
-    c) Convey individual copies of the object code with a copy of the
-    written offer to provide the Corresponding Source.  This
-    alternative is allowed only occasionally and noncommercially, and
-    only if you received the object code with such an offer, in accord
-    with subsection 6b.
-
-    d) Convey the object code by offering access from a designated
-    place (gratis or for a charge), and offer equivalent access to the
-    Corresponding Source in the same way through the same place at no
-    further charge.  You need not require recipients to copy the
-    Corresponding Source along with the object code.  If the place to
-    copy the object code is a network server, the Corresponding Source
-    may be on a different server (operated by you or a third party)
-    that supports equivalent copying facilities, provided you maintain
-    clear directions next to the object code saying where to find the
-    Corresponding Source.  Regardless of what server hosts the
-    Corresponding Source, you remain obligated to ensure that it is
-    available for as long as needed to satisfy these requirements.
-
-    e) Convey the object code using peer-to-peer transmission, provided
-    you inform other peers where the object code and Corresponding
-    Source of the work are being offered to the general public at no
-    charge under subsection 6d.
-
-  A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
-  A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling.  In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage.  For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product.  A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
-  "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source.  The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
-  If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information.  But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
-  The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed.  Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
-  Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
-  7. Additional Terms.
-
-  "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law.  If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
-  When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it.  (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.)  You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
-  Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
-    a) Disclaiming warranty or limiting liability differently from the
-    terms of sections 15 and 16 of this License; or
-
-    b) Requiring preservation of specified reasonable legal notices or
-    author attributions in that material or in the Appropriate Legal
-    Notices displayed by works containing it; or
-
-    c) Prohibiting misrepresentation of the origin of that material, or
-    requiring that modified versions of such material be marked in
-    reasonable ways as different from the original version; or
-
-    d) Limiting the use for publicity purposes of names of licensors or
-    authors of the material; or
-
-    e) Declining to grant rights under trademark law for use of some
-    trade names, trademarks, or service marks; or
-
-    f) Requiring indemnification of licensors and authors of that
-    material by anyone who conveys the material (or modified versions of
-    it) with contractual assumptions of liability to the recipient, for
-    any liability that these contractual assumptions directly impose on
-    those licensors and authors.
-
-  All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10.  If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term.  If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
-  If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
-  Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
-  8. Termination.
-
-  You may not propagate or modify a covered work except as expressly
-provided under this License.  Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
-  However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
-  Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
-  Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License.  If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
-  9. Acceptance Not Required for Having Copies.
-
-  You are not required to accept this License in order to receive or
-run a copy of the Program.  Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance.  However,
-nothing other than this License grants you permission to propagate or
-modify any covered work.  These actions infringe copyright if you do
-not accept this License.  Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
-  10. Automatic Licensing of Downstream Recipients.
-
-  Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License.  You are not responsible
-for enforcing compliance by third parties with this License.
-
-  An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations.  If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
-  You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License.  For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
-  11. Patents.
-
-  A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based.  The
-work thus licensed is called the contributor's "contributor version".
-
-  A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version.  For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
-  Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
-  In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement).  To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
-  If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients.  "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
-  If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
-  A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License.  You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
-  Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
-  12. No Surrender of Others' Freedom.
-
-  If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all.  For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
-  13. Remote Network Interaction; Use with the GNU General Public License.
-
-  Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software.  This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
-  Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work.  The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
-  14. Revised Versions of this License.
-
-  The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time.  Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-  Each version is given a distinguishing version number.  If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation.  If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
-  If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
-  Later license versions may give you additional or different
-permissions.  However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
-  15. Disclaimer of Warranty.
-
-  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. Limitation of Liability.
-
-  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
-  17. Interpretation of Sections 15 and 16.
-
-  If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
-                     END OF TERMS AND CONDITIONS
-
-            How to Apply These Terms to Your New Programs
-
-  If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
-  To do so, attach the following notices to the program.  It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
-    Castopod
-    Copyright (C) 2020  Podlibre
-
-    This program is free software: you can redistribute it and/or modify
-    it under the terms of the GNU Affero General Public License as published
-    by the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU Affero General Public License for more details.
-
-    You should have received a copy of the GNU Affero General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
-  If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source.  For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code.  There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
-  You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-<http://www.gnu.org/licenses/>.
diff --git a/LICENSE.md b/LICENSE.md
new file mode 100644
index 0000000000..9b0be861e0
--- /dev/null
+++ b/LICENSE.md
@@ -0,0 +1,598 @@
+# GNU Affero General Public License
+
+_Version 3, 19 November 2007_ _Copyright © 2007 Free Software Foundation, Inc.
+&lt;<http://fsf.org/>&gt;_
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+## Preamble
+
+The GNU Affero General Public License is a free, copyleft license for software
+and other kinds of works, specifically designed to ensure cooperation with the
+community in the case of network server software.
+
+The licenses for most software and other practical works are designed to take
+away your freedom to share and change the works. By contrast, our General Public
+Licenses are intended to guarantee your freedom to share and change all versions
+of a program--to make sure it remains free software for all its users.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom to
+distribute copies of free software (and charge for them if you wish), that you
+receive source code or can get it if you want it, that you can change the
+software or use pieces of it in new free programs, and that you know you can do
+these things.
+
+Developers that use our General Public Licenses protect your rights with two
+steps: **(1)** assert copyright on the software, and **(2)** offer you this
+License which gives you legal permission to copy, distribute and/or modify the
+software.
+
+A secondary benefit of defending all users' freedom is that improvements made in
+alternate versions of the program, if they receive widespread use, become
+available for other developers to incorporate. Many developers of free software
+are heartened and encouraged by the resulting cooperation. However, in the case
+of software used on network servers, this result may fail to come about. The GNU
+General Public License permits making a modified version and letting the public
+access it on a server without ever releasing its source code to the public.
+
+The GNU Affero General Public License is designed specifically to ensure that,
+in such cases, the modified source code becomes available to the community. It
+requires the operator of a network server to provide the source code of the
+modified version running there to the users of that server. Therefore, public
+use of a modified version, on a publicly accessible server, gives the public
+access to the source code of the modified version.
+
+An older license, called the Affero General Public License and published by
+Affero, was designed to accomplish similar goals. This is a different license,
+not a version of the Affero GPL, but Affero has released a new version of the
+Affero GPL which permits relicensing under this license.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+## TERMS AND CONDITIONS
+
+### 0. Definitions
+
+“This License” refers to version 3 of the GNU Affero General Public License.
+
+“Copyright” also means copyright-like laws that apply to other kinds of works,
+such as semiconductor masks.
+
+“The Program” refers to any copyrightable work licensed under this License. Each
+licensee is addressed as “you”. “Licensees” and “recipients” may be individuals
+or organizations.
+
+To “modify” a work means to copy from or adapt all or part of the work in a
+fashion requiring copyright permission, other than the making of an exact copy.
+The resulting work is called a “modified version” of the earlier work or a work
+“based on” the earlier work.
+
+A “covered work” means either the unmodified Program or a work based on the
+Program.
+
+To “propagate” a work means to do anything with it that, without permission,
+would make you directly or secondarily liable for infringement under applicable
+copyright law, except executing it on a computer or modifying a private copy.
+Propagation includes copying, distribution (with or without modification),
+making available to the public, and in some countries other activities as well.
+
+To “convey” a work means any kind of propagation that enables other parties to
+make or receive copies. Mere interaction with a user through a computer network,
+with no transfer of a copy, is not conveying.
+
+An interactive user interface displays “Appropriate Legal Notices” to the extent
+that it includes a convenient and prominently visible feature that **(1)**
+displays an appropriate copyright notice, and **(2)** tells the user that there
+is no warranty for the work (except to the extent that warranties are provided),
+that licensees may convey the work under this License, and how to view a copy of
+this License. If the interface presents a list of user commands or options, such
+as a menu, a prominent item in the list meets this criterion.
+
+### 1. Source Code
+
+The “source code” for a work means the preferred form of the work for making
+modifications to it. “Object code” means any non-source form of a work.
+
+A “Standard Interface” means an interface that either is an official standard
+defined by a recognized standards body, or, in the case of interfaces specified
+for a particular programming language, one that is widely used among developers
+working in that language.
+
+The “System Libraries” of an executable work include anything, other than the
+work as a whole, that **(a)** is included in the normal form of packaging a
+Major Component, but which is not part of that Major Component, and **(b)**
+serves only to enable use of the work with that Major Component, or to implement
+a Standard Interface for which an implementation is available to the public in
+source code form. A “Major Component”, in this context, means a major essential
+component (kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to produce the
+work, or an object code interpreter used to run it.
+
+The “Corresponding Source” for a work in object code form means all the source
+code needed to generate, install, and (for an executable work) run the object
+code and to modify the work, including scripts to control those activities.
+However, it does not include the work's System Libraries, or general-purpose
+tools or generally available free programs which are used unmodified in
+performing those activities but which are not part of the work. For example,
+Corresponding Source includes interface definition files associated with source
+files for the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require, such as by
+intimate data communication or control flow between those subprograms and other
+parts of the work.
+
+The Corresponding Source need not include anything that users can regenerate
+automatically from other parts of the Corresponding Source.
+
+The Corresponding Source for a work in source code form is that same work.
+
+### 2. Basic Permissions
+
+All rights granted under this License are granted for the term of copyright on
+the Program, and are irrevocable provided the stated conditions are met. This
+License explicitly affirms your unlimited permission to run the unmodified
+Program. The output from running a covered work is covered by this License only
+if the output, given its content, constitutes a covered work. This License
+acknowledges your rights of fair use or other equivalent, as provided by
+copyright law.
+
+You may make, run and propagate covered works that you do not convey, without
+conditions so long as your license otherwise remains in force. You may convey
+covered works to others for the sole purpose of having them make modifications
+exclusively for you, or provide you with facilities for running those works,
+provided that you comply with the terms of this License in conveying all
+material for which you do not control copyright. Those thus making or running
+the covered works for you must do so exclusively on your behalf, under your
+direction and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+Conveying under any other circumstances is permitted solely under the conditions
+stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
+
+### 3. Protecting Users' Legal Rights From Anti-Circumvention Law
+
+No covered work shall be deemed part of an effective technological measure under
+any applicable law fulfilling obligations under article 11 of the WIPO copyright
+treaty adopted on 20 December 1996, or similar laws prohibiting or restricting
+circumvention of such measures.
+
+When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention is
+effected by exercising rights under this License with respect to the covered
+work, and you disclaim any intention to limit operation or modification of the
+work as a means of enforcing, against the work's users, your or third parties'
+legal rights to forbid circumvention of technological measures.
+
+### 4. Conveying Verbatim Copies
+
+You may convey verbatim copies of the Program's source code as you receive it,
+in any medium, provided that you conspicuously and appropriately publish on each
+copy an appropriate copyright notice; keep intact all notices stating that this
+License and any non-permissive terms added in accord with section 7 apply to the
+code; keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+You may charge any price or no price for each copy that you convey, and you may
+offer support or warranty protection for a fee.
+
+### 5. Conveying Modified Source Versions
+
+You may convey a work based on the Program, or the modifications to produce it
+from the Program, in the form of source code under the terms of section 4,
+provided that you also meet all of these conditions:
+
+- **a)** The work must carry prominent notices stating that you modified it, and
+  giving a relevant date.
+- **b)** The work must carry prominent notices stating that it is released under
+  this License and any conditions added under section 7. This requirement
+  modifies the requirement in section 4 to “keep intact all notices”.
+- **c)** You must license the entire work, as a whole, under this License to
+  anyone who comes into possession of a copy. This License will therefore apply,
+  along with any applicable section 7 additional terms, to the whole of the
+  work, and all its parts, regardless of how they are packaged. This License
+  gives no permission to license the work in any other way, but it does not
+  invalidate such permission if you have separately received it.
+- **d)** If the work has interactive user interfaces, each must display
+  Appropriate Legal Notices; however, if the Program has interactive interfaces
+  that do not display Appropriate Legal Notices, your work need not make them do
+  so.
+
+A compilation of a covered work with other separate and independent works, which
+are not by their nature extensions of the covered work, and which are not
+combined with it such as to form a larger program, in or on a volume of a
+storage or distribution medium, is called an “aggregate” if the compilation and
+its resulting copyright are not used to limit the access or legal rights of the
+compilation's users beyond what the individual works permit. Inclusion of a
+covered work in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+### 6. Conveying Non-Source Forms
+
+You may convey a covered work in object code form under the terms of sections 4
+and 5, provided that you also convey the machine-readable Corresponding Source
+under the terms of this License, in one of these ways:
+
+- **a)** Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by the Corresponding
+  Source fixed on a durable physical medium customarily used for software
+  interchange.
+- **b)** Convey the object code in, or embodied in, a physical product
+  (including a physical distribution medium), accompanied by a written offer,
+  valid for at least three years and valid for as long as you offer spare parts
+  or customer support for that product model, to give anyone who possesses the
+  object code either **(1)** a copy of the Corresponding Source for all the
+  software in the product that is covered by this License, on a durable physical
+  medium customarily used for software interchange, for a price no more than
+  your reasonable cost of physically performing this conveying of source, or
+  **(2)** access to copy the Corresponding Source from a network server at no
+  charge.
+- **c)** Convey individual copies of the object code with a copy of the written
+  offer to provide the Corresponding Source. This alternative is allowed only
+  occasionally and noncommercially, and only if you received the object code
+  with such an offer, in accord with subsection 6b.
+- **d)** Convey the object code by offering access from a designated place
+  (gratis or for a charge), and offer equivalent access to the Corresponding
+  Source in the same way through the same place at no further charge. You need
+  not require recipients to copy the Corresponding Source along with the object
+  code. If the place to copy the object code is a network server, the
+  Corresponding Source may be on a different server (operated by you or a third
+  party) that supports equivalent copying facilities, provided you maintain
+  clear directions next to the object code saying where to find the
+  Corresponding Source. Regardless of what server hosts the Corresponding
+  Source, you remain obligated to ensure that it is available for as long as
+  needed to satisfy these requirements.
+- **e)** Convey the object code using peer-to-peer transmission, provided you
+  inform other peers where the object code and Corresponding Source of the work
+  are being offered to the general public at no charge under subsection 6d.
+
+A separable portion of the object code, whose source code is excluded from the
+Corresponding Source as a System Library, need not be included in conveying the
+object code work.
+
+A “User Product” is either **(1)** a “consumer product”, which means any
+tangible personal property which is normally used for personal, family, or
+household purposes, or **(2)** anything designed or sold for incorporation into
+a dwelling. In determining whether a product is a consumer product, doubtful
+cases shall be resolved in favor of coverage. For a particular product received
+by a particular user, “normally used” refers to a typical or common use of that
+class of product, regardless of the status of the particular user or of the way
+in which the particular user actually uses, or expects or is expected to use,
+the product. A product is a consumer product regardless of whether the product
+has substantial commercial, industrial or non-consumer uses, unless such uses
+represent the only significant mode of use of the product.
+
+“Installation Information” for a User Product means any methods, procedures,
+authorization keys, or other information required to install and execute
+modified versions of a covered work in that User Product from a modified version
+of its Corresponding Source. The information must suffice to ensure that the
+continued functioning of the modified object code is in no case prevented or
+interfered with solely because modification has been made.
+
+If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as part of a
+transaction in which the right of possession and use of the User Product is
+transferred to the recipient in perpetuity or for a fixed term (regardless of
+how the transaction is characterized), the Corresponding Source conveyed under
+this section must be accompanied by the Installation Information. But this
+requirement does not apply if neither you nor any third party retains the
+ability to install modified object code on the User Product (for example, the
+work has been installed in ROM).
+
+The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates for a
+work that has been modified or installed by the recipient, or for the User
+Product in which it has been modified or installed. Access to a network may be
+denied when the modification itself materially and adversely affects the
+operation of the network or violates the rules and protocols for communication
+across the network.
+
+Corresponding Source conveyed, and Installation Information provided, in accord
+with this section must be in a format that is publicly documented (and with an
+implementation available to the public in source code form), and must require no
+special password or key for unpacking, reading or copying.
+
+### 7. Additional Terms
+
+“Additional permissions” are terms that supplement the terms of this License by
+making exceptions from one or more of its conditions. Additional permissions
+that are applicable to the entire Program shall be treated as though they were
+included in this License, to the extent that they are valid under applicable
+law. If additional permissions apply only to part of the Program, that part may
+be used separately under those permissions, but the entire Program remains
+governed by this License without regard to the additional permissions.
+
+When you convey a copy of a covered work, you may at your option remove any
+additional permissions from that copy, or from any part of it. (Additional
+permissions may be written to require their own removal in certain cases when
+you modify the work.) You may place additional permissions on material, added by
+you to a covered work, for which you have or can give appropriate copyright
+permission.
+
+Notwithstanding any other provision of this License, for material you add to a
+covered work, you may (if authorized by the copyright holders of that material)
+supplement the terms of this License with terms:
+
+- **a)** Disclaiming warranty or limiting liability differently from the terms
+  of sections 15 and 16 of this License; or
+- **b)** Requiring preservation of specified reasonable legal notices or author
+  attributions in that material or in the Appropriate Legal Notices displayed by
+  works containing it; or
+- **c)** Prohibiting misrepresentation of the origin of that material, or
+  requiring that modified versions of such material be marked in reasonable ways
+  as different from the original version; or
+- **d)** Limiting the use for publicity purposes of names of licensors or
+  authors of the material; or
+- **e)** Declining to grant rights under trademark law for use of some trade
+  names, trademarks, or service marks; or
+- **f)** Requiring indemnification of licensors and authors of that material by
+  anyone who conveys the material (or modified versions of it) with contractual
+  assumptions of liability to the recipient, for any liability that these
+  contractual assumptions directly impose on those licensors and authors.
+
+All other non-permissive additional terms are considered “further restrictions”
+within the meaning of section 10. If the Program as you received it, or any part
+of it, contains a notice stating that it is governed by this License along with
+a term that is a further restriction, you may remove that term. If a license
+document contains a further restriction but permits relicensing or conveying
+under this License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does not survive
+such relicensing or conveying.
+
+If you add terms to a covered work in accord with this section, you must place,
+in the relevant source files, a statement of the additional terms that apply to
+those files, or a notice indicating where to find the applicable terms.
+
+Additional terms, permissive or non-permissive, may be stated in the form of a
+separately written license, or stated as exceptions; the above requirements
+apply either way.
+
+### 8. Termination
+
+You may not propagate or modify a covered work except as expressly provided
+under this License. Any attempt otherwise to propagate or modify it is void, and
+will automatically terminate your rights under this License (including any
+patent licenses granted under the third paragraph of section 11).
+
+However, if you cease all violation of this License, then your license from a
+particular copyright holder is reinstated **(a)** provisionally, unless and
+until the copyright holder explicitly and finally terminates your license, and
+**(b)** permanently, if the copyright holder fails to notify you of the
+violation by some reasonable means prior to 60 days after the cessation.
+
+Moreover, your license from a particular copyright holder is reinstated
+permanently if the copyright holder notifies you of the violation by some
+reasonable means, this is the first time you have received notice of violation
+of this License (for any work) from that copyright holder, and you cure the
+violation prior to 30 days after your receipt of the notice.
+
+Termination of your rights under this section does not terminate the licenses of
+parties who have received copies or rights from you under this License. If your
+rights have been terminated and not permanently reinstated, you do not qualify
+to receive new licenses for the same material under section 10.
+
+### 9. Acceptance Not Required for Having Copies
+
+You are not required to accept this License in order to receive or run a copy of
+the Program. Ancillary propagation of a covered work occurring solely as a
+consequence of using peer-to-peer transmission to receive a copy likewise does
+not require acceptance. However, nothing other than this License grants you
+permission to propagate or modify any covered work. These actions infringe
+copyright if you do not accept this License. Therefore, by modifying or
+propagating a covered work, you indicate your acceptance of this License to do
+so.
+
+### 10. Automatic Licensing of Downstream Recipients
+
+Each time you convey a covered work, the recipient automatically receives a
+license from the original licensors, to run, modify and propagate that work,
+subject to this License. You are not responsible for enforcing compliance by
+third parties with this License.
+
+An “entity transaction” is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered work results
+from an entity transaction, each party to that transaction who receives a copy
+of the work also receives whatever licenses to the work the party's predecessor
+in interest had or could give under the previous paragraph, plus a right to
+possession of the Corresponding Source of the work from the predecessor in
+interest, if the predecessor has it or can get it with reasonable efforts.
+
+You may not impose any further restrictions on the exercise of the rights
+granted or affirmed under this License. For example, you may not impose a
+license fee, royalty, or other charge for exercise of rights granted under this
+License, and you may not initiate litigation (including a cross-claim or
+counterclaim in a lawsuit) alleging that any patent claim is infringed by
+making, using, selling, offering for sale, or importing the Program or any
+portion of it.
+
+### 11. Patents
+
+A “contributor” is a copyright holder who authorizes use under this License of
+the Program or a work on which the Program is based. The work thus licensed is
+called the contributor's “contributor version”.
+
+A contributor's “essential patent claims” are all patent claims owned or
+controlled by the contributor, whether already acquired or hereafter acquired,
+that would be infringed by some manner, permitted by this License, of making,
+using, or selling its contributor version, but do not include claims that would
+be infringed only as a consequence of further modification of the contributor
+version. For purposes of this definition, “control” includes the right to grant
+patent sublicenses in a manner consistent with the requirements of this License.
+
+Each contributor grants you a non-exclusive, worldwide, royalty-free patent
+license under the contributor's essential patent claims, to make, use, sell,
+offer for sale, import and otherwise run, modify and propagate the contents of
+its contributor version.
+
+In the following three paragraphs, a “patent license” is any express agreement
+or commitment, however denominated, not to enforce a patent (such as an express
+permission to practice a patent or covenant not to sue for patent infringement).
+To “grant” such a patent license to a party means to make such an agreement or
+commitment not to enforce a patent against the party.
+
+If you convey a covered work, knowingly relying on a patent license, and the
+Corresponding Source of the work is not available for anyone to copy, free of
+charge and under the terms of this License, through a publicly available network
+server or other readily accessible means, then you must either **(1)** cause the
+Corresponding Source to be so available, or **(2)** arrange to deprive yourself
+of the benefit of the patent license for this particular work, or **(3)**
+arrange, in a manner consistent with the requirements of this License, to extend
+the patent license to downstream recipients. “Knowingly relying” means you have
+actual knowledge that, but for the patent license, your conveying the covered
+work in a country, or your recipient's use of the covered work in a country,
+would infringe one or more identifiable patents in that country that you have
+reason to believe are valid.
+
+If, pursuant to or in connection with a single transaction or arrangement, you
+convey, or propagate by procuring conveyance of, a covered work, and grant a
+patent license to some of the parties receiving the covered work authorizing
+them to use, propagate, modify or convey a specific copy of the covered work,
+then the patent license you grant is automatically extended to all recipients of
+the covered work and works based on it.
+
+A patent license is “discriminatory” if it does not include within the scope of
+its coverage, prohibits the exercise of, or is conditioned on the non-exercise
+of one or more of the rights that are specifically granted under this License.
+You may not convey a covered work if you are a party to an arrangement with a
+third party that is in the business of distributing software, under which you
+make payment to the third party based on the extent of your activity of
+conveying the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory patent
+license **(a)** in connection with copies of the covered work conveyed by you
+(or copies made from those copies), or **(b)** primarily for and in connection
+with specific products or compilations that contain the covered work, unless you
+entered into that arrangement, or that patent license was granted, prior to 28
+March 2007.
+
+Nothing in this License shall be construed as excluding or limiting any implied
+license or other defenses to infringement that may otherwise be available to you
+under applicable patent law.
+
+### 12. No Surrender of Others' Freedom
+
+If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not excuse
+you from the conditions of this License. If you cannot convey a covered work so
+as to satisfy simultaneously your obligations under this License and any other
+pertinent obligations, then as a consequence you may not convey it at all. For
+example, if you agree to terms that obligate you to collect a royalty for
+further conveying from those to whom you convey the Program, the only way you
+could satisfy both those terms and this License would be to refrain entirely
+from conveying the Program.
+
+### 13. Remote Network Interaction; Use with the GNU General Public License
+
+Notwithstanding any other provision of this License, if you modify the Program,
+your modified version must prominently offer all users interacting with it
+remotely through a computer network (if your version supports such interaction)
+an opportunity to receive the Corresponding Source of your version by providing
+access to the Corresponding Source from a network server at no charge, through
+some standard or customary means of facilitating copying of software. This
+Corresponding Source shall include the Corresponding Source for any work covered
+by version 3 of the GNU General Public License that is incorporated pursuant to
+the following paragraph.
+
+Notwithstanding any other provision of this License, you have permission to link
+or combine any covered work with a work licensed under version 3 of the GNU
+General Public License into a single combined work, and to convey the resulting
+work. The terms of this License will continue to apply to the part which is the
+covered work, but the work with which it is combined will remain governed by
+version 3 of the GNU General Public License.
+
+### 14. Revised Versions of this License
+
+The Free Software Foundation may publish revised and/or new versions of the GNU
+Affero General Public License from time to time. Such new versions will be
+similar in spirit to the present version, but may differ in detail to address
+new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies
+that a certain numbered version of the GNU Affero General Public License “or any
+later version” applies to it, you have the option of following the terms and
+conditions either of that numbered version or of any later version published by
+the Free Software Foundation. If the Program does not specify a version number
+of the GNU Affero General Public License, you may choose any version ever
+published by the Free Software Foundation.
+
+If the Program specifies that a proxy can decide which future versions of the
+GNU Affero General Public License can be used, that proxy's public statement of
+acceptance of a version permanently authorizes you to choose that version for
+the Program.
+
+Later license versions may give you additional or different permissions.
+However, no additional obligations are imposed on any author or copyright holder
+as a result of your choosing to follow a later version.
+
+### 15. Disclaimer of Warranty
+
+THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
+PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER
+EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE
+QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE
+DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+### 16. Limitation of Liability
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY
+COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS
+PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
+INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
+THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE
+PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY
+HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+### 17. Interpretation of Sections 15 and 16
+
+If the disclaimer of warranty and limitation of liability provided above cannot
+be given local legal effect according to their terms, reviewing courts shall
+apply local law that most closely approximates an absolute waiver of all civil
+liability in connection with the Program, unless a warranty or assumption of
+liability accompanies a copy of the Program in return for a fee.
+
+_END OF TERMS AND CONDITIONS_
+
+## How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use
+to the public, the best way to achieve this is to make it free software which
+everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach
+them to the start of each source file to most effectively state the exclusion of
+warranty; and each file should have at least the “copyright” line and a pointer
+to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU Affero General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If your software can interact with users remotely through a computer network,
+you should also make sure that it provides a way for users to get its source.
+For example, if your program is a web application, its interface could display a
+“Source” link that leads users to an archive of the code. There are many ways
+you could offer source, and different solutions will be better for different
+programs; see section 13 for the specific requirements.
+
+You should also get your employer (if you work as a programmer) or school, if
+any, to sign a “copyright disclaimer” for the program, if necessary. For more
+information on this, and how to apply and follow the GNU AGPL, see
+&lt;<http://www.gnu.org/licenses/>&gt;.
diff --git a/README.md b/README.md
index 1ca335e1f5..4449f42207 100644
--- a/README.md
+++ b/README.md
@@ -3,12 +3,12 @@
 Castopod is an open-source podcast hosting solution for everyone.\
 Whether you are a beginner, an amateur or a professional, you will get everything
 you need:\
-Create, upload, publish, and get comprehensive audience measurement that respects your
-listeners privacy.
+Create, upload, publish, and get comprehensive audience measurement that
+respects your listeners privacy.
 
 Castopod is a free and open-source solution (AGPL v3).\
-Whether you choose to install it on your own server or have it hosted by a
-professional, all your data and analytics belong to you and you only.
+Whether you choose to install it on your own server or have it hosted by a professional,
+all your data and analytics belong to you and you only.
 
 ![Castopod Logo](https://podlibre.org/static/images/Castopod-Mascot-Server.svg)
 
@@ -18,7 +18,9 @@ Castopod can be hosted on any PHP/MySQL server:\
 Unzip it and you are ready to broadcast.
 
 To install Castopod on your server:
-- Download [Castopod latest Package (zip or tar.gz)](https://code.podlibre.org/podlibre/castopod/-/releases),
+
+- Download
+  [Castopod latest Package (zip or tar.gz)](https://code.podlibre.org/podlibre/castopod/-/releases),
 - Follow the procedure “[How to install Castopod](./INSTALL.md)”.
 
 ## Documentation
diff --git a/app/Config/ActivityPub.php b/app/Config/ActivityPub.php
new file mode 100644
index 0000000000..7f2ea61c18
--- /dev/null
+++ b/app/Config/ActivityPub.php
@@ -0,0 +1,14 @@
+<?php namespace Config;
+
+use ActivityPub\Config\ActivityPub as ActivityPubBase;
+
+class ActivityPub extends ActivityPubBase
+{
+    /**
+     * --------------------------------------------------------------------
+     * ActivityPub Objects
+     * --------------------------------------------------------------------
+     */
+    public $actorObject = 'App\Libraries\PodcastActor';
+    public $noteObject = 'App\Libraries\NoteObject';
+}
diff --git a/app/Config/App.php b/app/Config/App.php
index ffad1a4188..5e9e88b849 100644
--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -6,309 +6,487 @@ use CodeIgniter\Config\BaseConfig;
 
 class App extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Base Site URL
-    |--------------------------------------------------------------------------
-    |
-    | URL to your CodeIgniter root. Typically this will be your base URL,
-    | WITH a trailing slash:
-    |
-    |   http://example.com/
-    |
-    | If this is not set then CodeIgniter will try guess the protocol, domain
-    | and path to your installation. However, you should always configure this
-    | explicitly and never rely on auto-guessing, especially in production
-    | environments.
-    |
-    */
-    public $baseURL = 'http://127.0.0.1:8080/';
-
-    /*
-    |--------------------------------------------------------------------------
-    | Media Base URL
-    |--------------------------------------------------------------------------
-    |
-    | URL to your media root. Typically this will be your base URL,
-    | WITH a trailing slash:
-    |
-    |   http://cdn.example.com/
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Base Site URL
+     * --------------------------------------------------------------------------
+     *
+     * URL to your CodeIgniter root. Typically this will be your base URL,
+     * WITH a trailing slash:
+     *
+     *    http://example.com/
+     *
+     * If this is not set then CodeIgniter will try guess the protocol, domain
+     * and path to your installation. However, you should always configure this
+     * explicitly and never rely on auto-guessing, especially in production
+     * environments.
+     *
+     * @var string
+     */
+    public $baseURL = 'http://localhost:8080/';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Media Base URL
+     * --------------------------------------------------------------------------
+     *
+     * URL to your media root. Typically this will be your base URL,
+     * WITH a trailing slash:
+     *
+     *    http://cdn.example.com/
+     */
     public $mediaBaseURL = 'http://127.0.0.2:8080/';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Index File
-    |--------------------------------------------------------------------------
-    |
-    | Typically this will be your index.php file, unless you've renamed it to
-    | something else. If you are using mod_rewrite to remove the page set this
-    | variable so that it is blank.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Index File
+     * --------------------------------------------------------------------------
+     *
+     * Typically this will be your index.php file, unless you've renamed it to
+     * something else. If you are using mod_rewrite to remove the page set this
+     * variable so that it is blank.
+     *
+     * @var string
+     */
     public $indexPage = '';
 
-    /*
-    |--------------------------------------------------------------------------
-    | URI PROTOCOL
-    |--------------------------------------------------------------------------
-    |
-    | This item determines which getServer global should be used to retrieve the
-    | URI string.  The default setting of 'REQUEST_URI' works for most servers.
-    | If your links do not seem to work, try one of the other delicious flavors:
-    |
-    | 'REQUEST_URI'    Uses $_SERVER['REQUEST_URI']
-    | 'QUERY_STRING'   Uses $_SERVER['QUERY_STRING']
-    | 'PATH_INFO'      Uses $_SERVER['PATH_INFO']
-    |
-    | WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * URI PROTOCOL
+     * --------------------------------------------------------------------------
+     *
+     * This item determines which getServer global should be used to retrieve the
+     * URI string.  The default setting of 'REQUEST_URI' works for most servers.
+     * If your links do not seem to work, try one of the other delicious flavors:
+     *
+     * 'REQUEST_URI'    Uses $_SERVER['REQUEST_URI']
+     * 'QUERY_STRING'   Uses $_SERVER['QUERY_STRING']
+     * 'PATH_INFO'      Uses $_SERVER['PATH_INFO']
+     *
+     * WARNING: If you set this to 'PATH_INFO', URIs will always be URL-decoded!
+     *
+     * @var string
+     */
     public $uriProtocol = 'REQUEST_URI';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Default Locale
-    |--------------------------------------------------------------------------
-    |
-    | The Locale roughly represents the language and location that your visitor
-    | is viewing the site from. It affects the language strings and other
-    | strings (like currency markers, numbers, etc), that your program
-    | should run under for this request.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Default Locale
+     * --------------------------------------------------------------------------
+     *
+     * The Locale roughly represents the language and location that your visitor
+     * is viewing the site from. It affects the language strings and other
+     * strings (like currency markers, numbers, etc), that your program
+     * should run under for this request.
+     *
+     * @var string
+     */
     public $defaultLocale = 'en';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Negotiate Locale
-    |--------------------------------------------------------------------------
-    |
-    | If true, the current Request object will automatically determine the
-    | language to use based on the value of the Accept-Language header.
-    |
-    | If false, no automatic detection will be performed.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Negotiate Locale
+     * --------------------------------------------------------------------------
+     *
+     * If true, the current Request object will automatically determine the
+     * language to use based on the value of the Accept-Language header.
+     *
+     * If false, no automatic detection will be performed.
+     *
+     * @var boolean
+     */
     public $negotiateLocale = true;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Supported Locales
-    |--------------------------------------------------------------------------
-    |
-    | If $negotiateLocale is true, this array lists the locales supported
-    | by the application in descending order of priority. If no match is
-    | found, the first locale will be used.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Supported Locales
+     * --------------------------------------------------------------------------
+     *
+     * If $negotiateLocale is true, this array lists the locales supported
+     * by the application in descending order of priority. If no match is
+     * found, the first locale will be used.
+     *
+     * @var string[]
+     */
     public $supportedLocales = ['en', 'fr'];
 
-    /*
-    |--------------------------------------------------------------------------
-    | Application Timezone
-    |--------------------------------------------------------------------------
-    |
-    | The default timezone that will be used in your application to display
-    | dates with the date helper, and can be retrieved through app_timezone()
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Application Timezone
+     * --------------------------------------------------------------------------
+     *
+     * The default timezone that will be used in your application to display
+     * dates with the date helper, and can be retrieved through app_timezone()
+     *
+     * @var string
+     */
     public $appTimezone = 'UTC';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Default Character Set
-    |--------------------------------------------------------------------------
-    |
-    | This determines which character set is used by default in various methods
-    | that require a character set to be provided.
-    |
-    | See http://php.net/htmlspecialchars for a list of supported charsets.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Default Character Set
+     * --------------------------------------------------------------------------
+     *
+     * This determines which character set is used by default in various methods
+     * that require a character set to be provided.
+     *
+     * @see http://php.net/htmlspecialchars for a list of supported charsets.
+     *
+     * @var string
+     */
     public $charset = 'UTF-8';
 
-    /*
-    |--------------------------------------------------------------------------
-    | URI PROTOCOL
-    |--------------------------------------------------------------------------
-    |
-    | If true, this will force every request made to this application to be
-    | made via a secure connection (HTTPS). If the incoming request is not
-    | secure, the user will be redirected to a secure version of the page
-    | and the HTTP Strict Transport Security header will be set.
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * URI PROTOCOL
+     * --------------------------------------------------------------------------
+     *
+     * If true, this will force every request made to this application to be
+     * made via a secure connection (HTTPS). If the incoming request is not
+     * secure, the user will be redirected to a secure version of the page
+     * and the HTTP Strict Transport Security header will be set.
+     *
+     * @var boolean
+     */
     public $forceGlobalSecureRequests = false;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Session Variables
-    |--------------------------------------------------------------------------
-    |
-    | 'sessionDriver'
-    |
-    |   The storage driver to use: files, database, redis, memcached
-    |       - CodeIgniter\Session\Handlers\FileHandler
-    |       - CodeIgniter\Session\Handlers\DatabaseHandler
-    |       - CodeIgniter\Session\Handlers\MemcachedHandler
-    |       - CodeIgniter\Session\Handlers\RedisHandler
-    |
-    | 'sessionCookieName'
-    |
-    |   The session cookie name, must contain only [0-9a-z_-] characters
-    |
-    | 'sessionExpiration'
-    |
-    |   The number of SECONDS you want the session to last.
-    |   Setting to 0 (zero) means expire when the browser is closed.
-    |
-    | 'sessionSavePath'
-    |
-    |   The location to save sessions to, driver dependent.
-    |
-    |   For the 'files' driver, it's a path to a writable directory.
-    |   WARNING: Only absolute paths are supported!
-    |
-    |   For the 'database' driver, it's a table name.
-    |   Please read up the manual for the format with other session drivers.
-    |
-    |   IMPORTANT: You are REQUIRED to set a valid save path!
-    |
-    | 'sessionMatchIP'
-    |
-    |   Whether to match the user's IP address when reading the session data.
-    |
-    |   WARNING: If you're using the database driver, don't forget to update
-    |            your session table's PRIMARY KEY when changing this setting.
-    |
-    | 'sessionTimeToUpdate'
-    |
-    |   How many seconds between CI regenerating the session ID.
-    |
-    | 'sessionRegenerateDestroy'
-    |
-    |   Whether to destroy session data associated with the old session ID
-    |   when auto-regenerating the session ID. When set to FALSE, the data
-    |   will be later deleted by the garbage collector.
-    |
-    | Other session cookie settings are shared with the rest of the application,
-    | except for 'cookie_prefix' and 'cookie_httponly', which are ignored here.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Session Driver
+     * --------------------------------------------------------------------------
+     *
+     * The session storage driver to use:
+     * - `CodeIgniter\Session\Handlers\FileHandler`
+     * - `CodeIgniter\Session\Handlers\DatabaseHandler`
+     * - `CodeIgniter\Session\Handlers\MemcachedHandler`
+     * - `CodeIgniter\Session\Handlers\RedisHandler`
+     *
+     * @var string
+     */
     public $sessionDriver = 'CodeIgniter\Session\Handlers\FileHandler';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Cookie Name
+     * --------------------------------------------------------------------------
+     *
+     * The session cookie name, must contain only [0-9a-z_-] characters
+     *
+     * @var string
+     */
     public $sessionCookieName = 'ci_session';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Expiration
+     * --------------------------------------------------------------------------
+     *
+     * The number of SECONDS you want the session to last.
+     * Setting to 0 (zero) means expire when the browser is closed.
+     *
+     * @var integer
+     */
     public $sessionExpiration = 7200;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Save Path
+     * --------------------------------------------------------------------------
+     *
+     * The location to save sessions to and is driver dependent.
+     *
+     * For the 'files' driver, it's a path to a writable directory.
+     * WARNING: Only absolute paths are supported!
+     *
+     * For the 'database' driver, it's a table name.
+     * Please read up the manual for the format with other session drivers.
+     *
+     * IMPORTANT: You are REQUIRED to set a valid save path!
+     *
+     * @var string
+     */
     public $sessionSavePath = WRITEPATH . 'session';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Match IP
+     * --------------------------------------------------------------------------
+     *
+     * Whether to match the user's IP address when reading the session data.
+     *
+     * WARNING: If you're using the database driver, don't forget to update
+     *          your session table's PRIMARY KEY when changing this setting.
+     *
+     * @var boolean
+     */
     public $sessionMatchIP = false;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Time to Update
+     * --------------------------------------------------------------------------
+     *
+     * How many seconds between CI regenerating the session ID.
+     *
+     * @var integer
+     */
     public $sessionTimeToUpdate = 300;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Session Regenerate Destroy
+     * --------------------------------------------------------------------------
+     *
+     * Whether to destroy session data associated with the old session ID
+     * when auto-regenerating the session ID. When set to FALSE, the data
+     * will be later deleted by the garbage collector.
+     *
+     * @var boolean
+     */
     public $sessionRegenerateDestroy = false;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Cookie Related Variables
-    |--------------------------------------------------------------------------
-    |
-    | 'cookiePrefix'   = Set a cookie name prefix if you need to avoid collisions
-    | 'cookieDomain'   = Set to .your-domain.com for site-wide cookies
-    | 'cookiePath'     = Typically will be a forward slash
-    | 'cookieSecure'   = Cookie will only be set if a secure HTTPS connection exists.
-    | 'cookieHTTPOnly' = Cookie will only be accessible via HTTP(S) (no javascript)
-    |
-    | Note: These settings (with the exception of 'cookie_prefix' and
-    |       'cookie_httponly') will also affect sessions.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Cookie Prefix
+     * --------------------------------------------------------------------------
+     *
+     * Set a cookie name prefix if you need to avoid collisions.
+     *
+     * @var string
+     */
     public $cookiePrefix = '';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Cookie Domain
+     * --------------------------------------------------------------------------
+     *
+     * Set to `.your-domain.com` for site-wide cookies.
+     *
+     * @var string
+     */
     public $cookieDomain = '';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Cookie Path
+     * --------------------------------------------------------------------------
+     *
+     * Typically will be a forward slash.
+     *
+     * @var string
+     */
     public $cookiePath = '/';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Cookie Secure
+     * --------------------------------------------------------------------------
+     *
+     * Cookie will only be set if a secure HTTPS connection exists.
+     *
+     * @var boolean
+     */
     public $cookieSecure = false;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Cookie HTTP Only
+     * --------------------------------------------------------------------------
+     *
+     * Cookie will only be accessible via HTTP(S) (no JavaScript).
+     *
+     * @var boolean
+     */
     public $cookieHTTPOnly = false;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Reverse Proxy IPs
-    |--------------------------------------------------------------------------
-    |
-    | If your server is behind a reverse proxy, you must whitelist the proxy
-    | IP addresses from which CodeIgniter should trust headers such as
-    | HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
-    | the visitor's IP address.
-    |
-    | You can use both an array or a comma-separated list of proxy addresses,
-    | as well as specifying whole subnets. Here are a few examples:
-    |
-    | Comma-separated:  '10.0.1.200,192.168.5.0/24'
-    | Array:        array('10.0.1.200', '192.168.5.0/24')
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Cookie SameSite
+     * --------------------------------------------------------------------------
+     *
+     * Configure cookie SameSite setting. Allowed values are:
+     * - None
+     * - Lax
+     * - Strict
+     * - ''
+     *
+     * Defaults to `Lax` for compatibility with modern browsers. Setting `''`
+     * (empty string) means no SameSite attribute will be set on cookies. If
+     * set to `None`, `$cookieSecure` must also be set.
+     *
+     * @var string 'Lax'|'None'|'Strict'
+     */
+    public $cookieSameSite = 'Lax';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Reverse Proxy IPs
+     * --------------------------------------------------------------------------
+     *
+     * If your server is behind a reverse proxy, you must whitelist the proxy
+     * IP addresses from which CodeIgniter should trust headers such as
+     * HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify
+     * the visitor's IP address.
+     *
+     * You can use both an array or a comma-separated list of proxy addresses,
+     * as well as specifying whole subnets. Here are a few examples:
+     *
+     * Comma-separated:	'10.0.1.200,192.168.5.0/24'
+     * Array: ['10.0.1.200', '192.168.5.0/24']
+     *
+     * @var string|string[]
+     */
     public $proxyIPs = '';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Cross Site Request Forgery
-    |--------------------------------------------------------------------------
-    | Enables a CSRF cookie token to be set. When set to TRUE, token will be
-    | checked on a submitted form. If you are accepting user data, it is strongly
-    | recommended CSRF protection be enabled.
-    |
-    | CSRFTokenName   = The token name
-    | CSRFHeaderName  = The header name
-    | CSRFCookieName  = The cookie name
-    | CSRFExpire      = The number in seconds the token should expire.
-    | CSRFRegenerate  = Regenerate token on every submission
-    | CSRFRedirect    = Redirect to previous page with error on failure
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Token Name
+     * --------------------------------------------------------------------------
+     *
+     * The token name.
+     *
+     * @deprecated Use `Config\Security` $tokenName property instead of using this property.
+     *
+     * @var string
+     */
     public $CSRFTokenName = 'csrf_test_name';
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Header Name
+     * --------------------------------------------------------------------------
+     *
+     * The header name.
+     *
+     * @deprecated Use `Config\Security` $headerName property instead of using this property.
+     *
+     * @var string
+     */
     public $CSRFHeaderName = 'X-CSRF-TOKEN';
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Cookie Name
+     * --------------------------------------------------------------------------
+     *
+     * The cookie name.
+     *
+     * @deprecated Use `Config\Security` $cookieName property instead of using this property.
+     *
+     * @var string
+     */
     public $CSRFCookieName = 'csrf_cookie_name';
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Expire
+     * --------------------------------------------------------------------------
+     *
+     * The number in seconds the token should expire.
+     *
+     * @deprecated Use `Config\Security` $expire property instead of using this property.
+     *
+     * @var integer
+     */
     public $CSRFExpire = 7200;
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Regenerate
+     * --------------------------------------------------------------------------
+     *
+     * Regenerate token on every submission?
+     *
+     * @deprecated Use `Config\Security` $regenerate property instead of using this property.
+     *
+     * @var boolean
+     */
     public $CSRFRegenerate = true;
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Redirect
+     * --------------------------------------------------------------------------
+     *
+     * Redirect to previous page with error on failure?
+     *
+     * @deprecated Use `Config\Security` $redirect property instead of using this property.
+     *
+     * @var boolean
+     */
     public $CSRFRedirect = true;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Content Security Policy
-    |--------------------------------------------------------------------------
-    | Enables the Response's Content Secure Policy to restrict the sources that
-    | can be used for images, scripts, CSS files, audio, video, etc. If enabled,
-    | the Response object will populate default values for the policy from the
-    | ContentSecurityPolicy.php file. Controllers can always add to those
-    | restrictions at run time.
-    |
-    | For a better understanding of CSP, see these documents:
-    |   - http://www.html5rocks.com/en/tutorials/security/content-security-policy/
-    |   - http://www.w3.org/TR/CSP/
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF SameSite
+     * --------------------------------------------------------------------------
+     *
+     * Setting for CSRF SameSite cookie token. Allowed values are:
+     * - None
+     * - Lax
+     * - Strict
+     * - ''
+     *
+     * Defaults to `Lax` as recommended in this link:
+     *
+     * @see https://portswigger.net/web-security/csrf/samesite-cookies
+     *
+     * @deprecated Use `Config\Security` $samesite property instead of using this property.
+     *
+     * @var string
+     */
+    public $CSRFSameSite = 'Lax';
+
+    /**
+     * --------------------------------------------------------------------------
+     * Content Security Policy
+     * --------------------------------------------------------------------------
+     *
+     * Enables the Response's Content Secure Policy to restrict the sources that
+     * can be used for images, scripts, CSS files, audio, video, etc. If enabled,
+     * the Response object will populate default values for the policy from the
+     * `ContentSecurityPolicy.php` file. Controllers can always add to those
+     * restrictions at run time.
+     *
+     * For a better understanding of CSP, see these documents:
+     *
+     * @see http://www.html5rocks.com/en/tutorials/security/content-security-policy/
+     * @see http://www.w3.org/TR/CSP/
+     *
+     * @var boolean
+     */
     public $CSPEnabled = false;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Media root folder
-    |--------------------------------------------------------------------------
-    | Defines the root folder for media files storage
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Media root folder
+     * --------------------------------------------------------------------------
+     * Defines the root folder for media files storage
+     */
     public $mediaRoot = 'media';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Admin gateway
-    |--------------------------------------------------------------------------
-    | Defines a base route for all admin pages
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Admin gateway
+     * --------------------------------------------------------------------------
+     * Defines a base route for all admin pages
+     */
     public $adminGateway = 'cp-admin';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Auth gateway
-    |--------------------------------------------------------------------------
-    | Defines a base route for all authentication related pages
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Auth gateway
+     * --------------------------------------------------------------------------
+     * Defines a base route for all authentication related pages
+     */
     public $authGateway = 'cp-auth';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Install gateway
-    |--------------------------------------------------------------------------
-    | Defines a base route for instance installation
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Install gateway
+     * --------------------------------------------------------------------------
+     * Defines a base route for instance installation
+     */
     public $installGateway = 'cp-install';
 }
diff --git a/app/Config/Autoload.php b/app/Config/Autoload.php
index fe07d52e6b..de861bdb00 100644
--- a/app/Config/Autoload.php
+++ b/app/Config/Autoload.php
@@ -2,90 +2,66 @@
 
 namespace Config;
 
-require_once SYSTEMPATH . 'Config/AutoloadConfig.php';
+use CodeIgniter\Config\AutoloadConfig;
 
 /**
  * -------------------------------------------------------------------
  * AUTO-LOADER
  * -------------------------------------------------------------------
+ *
  * This file defines the namespaces and class maps so the Autoloader
  * can find the files as needed.
+ *
+ * NOTE: If you use an identical key in $psr4 or $classmap, then
+ * the values in this file will overwrite the framework's values.
  */
-class Autoload extends \CodeIgniter\Config\AutoloadConfig
+class Autoload extends AutoloadConfig
 {
+    /**
+     * -------------------------------------------------------------------
+     * Namespaces
+     * -------------------------------------------------------------------
+     * This maps the locations of any namespaces in your application to
+     * their location on the file system. These are used by the autoloader
+     * to locate files the first time they have been instantiated.
+     *
+     * The '/app' and '/system' directories are already mapped for you.
+     * you may change the name of the 'App' namespace if you wish,
+     * but this should be done prior to creating any namespaced classes,
+     * else you will need to modify all of those classes for this to work.
+     *
+     * Prototype:
+     *
+     *   $psr4 = [
+     *       'CodeIgniter' => SYSTEMPATH,
+     *       'App'	       => APPPATH
+     *   ];
+     *
+     * @var array<string, string>
+     */
     public $psr4 = [
-        'App' => APPPATH,
+        APP_NAMESPACE => APPPATH, // For custom app namespace
+        'Config' => APPPATH . 'Config',
+        'ActivityPub' => APPPATH . 'Libraries/ActivityPub',
     ];
 
-    public $classmap = [];
-
-    //--------------------------------------------------------------------
-
     /**
-     * Collects the application-specific autoload settings and merges
-     * them with the framework's required settings.
+     * -------------------------------------------------------------------
+     * Class Map
+     * -------------------------------------------------------------------
+     * The class map provides a map of class names and their exact
+     * location on the drive. Classes loaded in this manner will have
+     * slightly faster performance because they will not have to be
+     * searched for within one or more directories as they would if they
+     * were being autoloaded through a namespace.
      *
-     * NOTE: If you use an identical key in $psr4 or $classmap, then
-     * the values in this file will overwrite the framework's values.
+     * Prototype:
+     *
+     *   $classmap = [
+     *       'MyClass'   => '/path/to/class/file.php'
+     *   ];
+     *
+     * @var array<string, string>
      */
-    public function __construct()
-    {
-        parent::__construct();
-
-        /**
-         * -------------------------------------------------------------------
-         * Namespaces
-         * -------------------------------------------------------------------
-         * This maps the locations of any namespaces in your application
-         * to their location on the file system. These are used by the
-         * Autoloader to locate files the first time they have been instantiated.
-         *
-         * The '/app' and '/system' directories are already mapped for
-         * you. You may change the name of the 'App' namespace if you wish,
-         * but this should be done prior to creating any namespaced classes,
-         * else you will need to modify all of those classes for this to work.
-         *
-         * DO NOT change the name of the CodeIgniter namespace or your application
-         * WILL break. *
-         * Prototype:
-         *
-         *   $Config['psr4'] = [
-         *       'CodeIgniter' => SYSPATH
-         *   `];
-         */
-        $psr4 = [
-            'App' => APPPATH, // To ensure filters, etc still found,
-            APP_NAMESPACE => APPPATH, // For custom namespace
-            'Config' => APPPATH . 'Config',
-        ];
-
-        /**
-         * -------------------------------------------------------------------
-         * Class Map
-         * -------------------------------------------------------------------
-         * The class map provides a map of class names and their exact
-         * location on the drive. Classes loaded in this manner will have
-         * slightly faster performance because they will not have to be
-         * searched for within one or more directories as they would if they
-         * were being autoloaded through a namespace.
-         *
-         * Prototype:
-         *
-         *   $Config['classmap'] = [
-         *       'MyClass'   => '/path/to/class/file.php'
-         *   ];
-         */
-        $classmap = [];
-
-        //--------------------------------------------------------------------
-        // Do Not Edit Below This Line
-        //--------------------------------------------------------------------
-
-        $this->psr4 = array_merge($this->psr4, $psr4);
-        $this->classmap = array_merge($this->classmap, $classmap);
-
-        unset($psr4, $classmap);
-    }
-
-    //--------------------------------------------------------------------
+    public $classmap = [];
 }
diff --git a/app/Config/Boot/development.php b/app/Config/Boot/development.php
index 59c9732a82..036960ed11 100644
--- a/app/Config/Boot/development.php
+++ b/app/Config/Boot/development.php
@@ -1,33 +1,32 @@
 <?php
 
-/*
-  |--------------------------------------------------------------------------
-  | ERROR DISPLAY
-  |--------------------------------------------------------------------------
-  | In development, we want to show as many errors as possible to help
-  | make sure they don't make it to production. And save us hours of
-  | painful debugging.
+/**
+ * --------------------------------------------------------------------------
+ * ERROR DISPLAY
+ * --------------------------------------------------------------------------
+ * In development, we want to show as many errors as possible to help
+ * make sure they don't make it to production. And save us hours of
+ * painful debugging.
  */
 error_reporting(-1);
 ini_set('display_errors', '1');
 
-/*
-  |--------------------------------------------------------------------------
-  | DEBUG BACKTRACES
-  |--------------------------------------------------------------------------
-  | If true, this constant will tell the error screens to display debug
-  | backtraces along with the other error information. If you would
-  | prefer to not see this, set this value to false.
+/**
+ * --------------------------------------------------------------------------
+ * DEBUG BACKTRACES
+ * --------------------------------------------------------------------------
+ * If true, this constant will tell the error screens to display debug
+ * backtraces along with the other error information. If you would
+ * prefer to not see this, set this value to false.
  */
 defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true);
 
-/*
-  |--------------------------------------------------------------------------
-  | DEBUG MODE
-  |--------------------------------------------------------------------------
-  | Debug mode is an experimental flag that can allow changes throughout
-  | the system. This will control whether Kint is loaded, and a few other
-  | items. It can always be used within your own application too.
+/**
+ * --------------------------------------------------------------------------
+ * DEBUG MODE
+ * --------------------------------------------------------------------------
+ * Debug mode is an experimental flag that can allow changes throughout
+ * the system. This will control whether Kint is loaded, and a few other
+ * items. It can always be used within your own application too.
  */
-
-defined('CI_DEBUG') || define('CI_DEBUG', 1);
+defined('CI_DEBUG') || define('CI_DEBUG', true);
diff --git a/app/Config/Boot/production.php b/app/Config/Boot/production.php
index c852b03e07..60c8888e42 100644
--- a/app/Config/Boot/production.php
+++ b/app/Config/Boot/production.php
@@ -1,11 +1,11 @@
 <?php
 
-/*
-  |--------------------------------------------------------------------------
-  | ERROR DISPLAY
-  |--------------------------------------------------------------------------
-  | Don't show ANY in production environments. Instead, let the system catch
-  | it and display a generic error message.
+/**
+ * --------------------------------------------------------------------------
+ * ERROR DISPLAY
+ * --------------------------------------------------------------------------
+ * Don't show ANY in production environments. Instead, let the system catch
+ * it and display a generic error message.
  */
 ini_set('display_errors', '0');
 error_reporting(
@@ -14,16 +14,15 @@ error_reporting(
         ~E_DEPRECATED &
         ~E_STRICT &
         ~E_USER_NOTICE &
-        ~E_USER_DEPRECATED
+        ~E_USER_DEPRECATED,
 );
 
-/*
-  |--------------------------------------------------------------------------
-  | DEBUG MODE
-  |--------------------------------------------------------------------------
-  | Debug mode is an experimental flag that can allow changes throughout
-  | the system. It's not widely used currently, and may not survive
-  | release of the framework.
+/**
+ * --------------------------------------------------------------------------
+ * DEBUG MODE
+ * --------------------------------------------------------------------------
+ * Debug mode is an experimental flag that can allow changes throughout
+ * the system. It's not widely used currently, and may not survive
+ * release of the framework.
  */
-
-defined('CI_DEBUG') || define('CI_DEBUG', 0);
+defined('CI_DEBUG') || define('CI_DEBUG', false);
diff --git a/app/Config/Boot/testing.php b/app/Config/Boot/testing.php
index e6c94d7172..a5e9b5e1c6 100644
--- a/app/Config/Boot/testing.php
+++ b/app/Config/Boot/testing.php
@@ -1,33 +1,32 @@
 <?php
 
-/*
-  |--------------------------------------------------------------------------
-  | ERROR DISPLAY
-  |--------------------------------------------------------------------------
-  | In development, we want to show as many errors as possible to help
-  | make sure they don't make it to production. And save us hours of
-  | painful debugging.
+/**
+ * --------------------------------------------------------------------------
+ * ERROR DISPLAY
+ * --------------------------------------------------------------------------
+ * In development, we want to show as many errors as possible to help
+ * make sure they don't make it to production. And save us hours of
+ * painful debugging.
  */
 error_reporting(-1);
 ini_set('display_errors', '1');
 
-/*
-  |--------------------------------------------------------------------------
-  | DEBUG BACKTRACES
-  |--------------------------------------------------------------------------
-  | If true, this constant will tell the error screens to display debug
-  | backtraces along with the other error information. If you would
-  | prefer to not see this, set this value to false.
+/**
+ * --------------------------------------------------------------------------
+ * DEBUG BACKTRACES
+ * --------------------------------------------------------------------------
+ * If true, this constant will tell the error screens to display debug
+ * backtraces along with the other error information. If you would
+ * prefer to not see this, set this value to false.
  */
 defined('SHOW_DEBUG_BACKTRACE') || define('SHOW_DEBUG_BACKTRACE', true);
 
-/*
-  |--------------------------------------------------------------------------
-  | DEBUG MODE
-  |--------------------------------------------------------------------------
-  | Debug mode is an experimental flag that can allow changes throughout
-  | the system. It's not widely used currently, and may not survive
-  | release of the framework.
+/**
+ * --------------------------------------------------------------------------
+ * DEBUG MODE
+ * --------------------------------------------------------------------------
+ * Debug mode is an experimental flag that can allow changes throughout
+ * the system. It's not widely used currently, and may not survive
+ * release of the framework.
  */
-
-defined('CI_DEBUG') || define('CI_DEBUG', 1);
+defined('CI_DEBUG') || define('CI_DEBUG', true);
diff --git a/app/Config/Cache.php b/app/Config/Cache.php
index 8aeec9642b..c26c1cc460 100644
--- a/app/Config/Cache.php
+++ b/app/Config/Cache.php
@@ -2,83 +2,111 @@
 
 namespace Config;
 
+use CodeIgniter\Cache\Handlers\DummyHandler;
+use CodeIgniter\Cache\Handlers\FileHandler;
+use CodeIgniter\Cache\Handlers\MemcachedHandler;
+use CodeIgniter\Cache\Handlers\PredisHandler;
+use CodeIgniter\Cache\Handlers\RedisHandler;
+use CodeIgniter\Cache\Handlers\WincacheHandler;
 use CodeIgniter\Config\BaseConfig;
 
 class Cache extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Primary Handler
-    |--------------------------------------------------------------------------
-    |
-    | The name of the preferred handler that should be used. If for some reason
-    | it is not available, the $backupHandler will be used in its place.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Primary Handler
+     * --------------------------------------------------------------------------
+     *
+     * The name of the preferred handler that should be used. If for some reason
+     * it is not available, the $backupHandler will be used in its place.
+     *
+     * @var string
+     */
     public $handler = 'file';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Backup Handler
-    |--------------------------------------------------------------------------
-    |
-    | The name of the handler that will be used in case the first one is
-    | unreachable. Often, 'file' is used here since the filesystem is
-    | always available, though that's not always practical for the app.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Backup Handler
+     * --------------------------------------------------------------------------
+     *
+     * The name of the handler that will be used in case the first one is
+     * unreachable. Often, 'file' is used here since the filesystem is
+     * always available, though that's not always practical for the app.
+     *
+     * @var string
+     */
     public $backupHandler = 'dummy';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Cache Directory Path
-    |--------------------------------------------------------------------------
-    |
-    | The path to where cache files should be stored, if using a file-based
-    | system.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Cache Directory Path
+     * --------------------------------------------------------------------------
+     *
+     * The path to where cache files should be stored, if using a file-based
+     * system.
+     *
+     * @var string
+     *
+     * @deprecated Use the driver-specific variant under $file
+     */
     public $storePath = WRITEPATH . 'cache/';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Cache Include Query String
-    |--------------------------------------------------------------------------
-    |
-    | Whether to take the URL query string into consideration when generating
-    | output cache files. Valid options are:
-    |
-    |   false      = Disabled
-    |   true       = Enabled, take all query parameters into account.
-    |                Please be aware that this may result in numerous cache
-    |                files generated for the same page over and over again.
-    |   array('q') = Enabled, but only take into account the specified list
-    |                of query parameters.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Cache Include Query String
+     * --------------------------------------------------------------------------
+     *
+     * Whether to take the URL query string into consideration when generating
+     * output cache files. Valid options are:
+     *
+     *    false      = Disabled
+     *    true       = Enabled, take all query parameters into account.
+     *                 Please be aware that this may result in numerous cache
+     *                 files generated for the same page over and over again.
+     *    array('q') = Enabled, but only take into account the specified list
+     *                 of query parameters.
+     *
+     * @var boolean|string[]
+     */
     public $cacheQueryString = false;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Key Prefix
-    |--------------------------------------------------------------------------
-    |
-    | This string is added to all cache item names to help avoid collisions
-    | if you run multiple applications with the same cache engine.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Key Prefix
+     * --------------------------------------------------------------------------
+     *
+     * This string is added to all cache item names to help avoid collisions
+     * if you run multiple applications with the same cache engine.
+     *
+     * @var string
+     */
     public $prefix = '';
 
-    /*
-    | -------------------------------------------------------------------------
-    | Memcached settings
-    | -------------------------------------------------------------------------
-    | Your Memcached servers can be specified below, if you are using
-    | the Memcached drivers.
-    |
-    |   See: https://codeigniter.com/user_guide/libraries/caching.html#memcached
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * File settings
+     * --------------------------------------------------------------------------
+     * Your file storage preferences can be specified below, if you are using
+     * the File driver.
+     *
+     * @var array<string, string|int|null>
+     */
+    public $file = [
+        'storePath' => WRITEPATH . 'cache/',
+        'mode' => 0640,
+    ];
+
+    /**
+     * -------------------------------------------------------------------------
+     * Memcached settings
+     * -------------------------------------------------------------------------
+     * Your Memcached servers can be specified below, if you are using
+     * the Memcached drivers.
+     *
+     * @see https://codeigniter.com/user_guide/libraries/caching.html#memcached
+     *
+     * @var array<string, string|int|boolean>
+     */
     public $memcached = [
         'host' => '127.0.0.1',
         'port' => 11211,
@@ -86,14 +114,15 @@ class Cache extends BaseConfig
         'raw' => false,
     ];
 
-    /*
-    | -------------------------------------------------------------------------
-    | Redis settings
-    | -------------------------------------------------------------------------
-    | Your Redis server can be specified below, if you are using
-    | the Redis or Predis drivers.
-    |
-    */
+    /**
+     * -------------------------------------------------------------------------
+     * Redis settings
+     * -------------------------------------------------------------------------
+     * Your Redis server can be specified below, if you are using
+     * the Redis or Predis drivers.
+     *
+     * @var array<string, string|int|null>
+     */
     public $redis = [
         'host' => '127.0.0.1',
         'password' => null,
@@ -102,21 +131,22 @@ class Cache extends BaseConfig
         'database' => 0,
     ];
 
-    /*
-    |--------------------------------------------------------------------------
-    | Available Cache Handlers
-    |--------------------------------------------------------------------------
-    |
-    | This is an array of cache engine alias' and class names. Only engines
-    | that are listed here are allowed to be used.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Available Cache Handlers
+     * --------------------------------------------------------------------------
+     *
+     * This is an array of cache engine alias' and class names. Only engines
+     * that are listed here are allowed to be used.
+     *
+     * @var array<string, string>
+     */
     public $validHandlers = [
-        'dummy' => \CodeIgniter\Cache\Handlers\DummyHandler::class,
-        'file' => \CodeIgniter\Cache\Handlers\FileHandler::class,
-        'memcached' => \CodeIgniter\Cache\Handlers\MemcachedHandler::class,
-        'predis' => \CodeIgniter\Cache\Handlers\PredisHandler::class,
-        'redis' => \CodeIgniter\Cache\Handlers\RedisHandler::class,
-        'wincache' => \CodeIgniter\Cache\Handlers\WincacheHandler::class,
+        'dummy' => DummyHandler::class,
+        'file' => FileHandler::class,
+        'memcached' => MemcachedHandler::class,
+        'predis' => PredisHandler::class,
+        'redis' => RedisHandler::class,
+        'wincache' => WincacheHandler::class,
     ];
 }
diff --git a/app/Config/Constants.php b/app/Config/Constants.php
index 75f0069245..80c4d755c5 100644
--- a/app/Config/Constants.php
+++ b/app/Config/Constants.php
@@ -1,46 +1,50 @@
 <?php
 
-//--------------------------------------------------------------------------
-// Castopod Version
-//--------------------------------------------------------------------------
-// The Castopod version number to display.
-//
-// NOTE: this constant is updated upon release with Continuous Integration.
-//
+/*
+ | --------------------------------------------------------------------
+ | Castopod Version
+ | --------------------------------------------------------------------
+ |
+ | The Castopod version number to display.
+ |
+ | NOTE: this constant is updated upon release with Continuous Integration.
+ */
 defined('CP_VERSION') || define('CP_VERSION', '1.0.0-alpha.41');
 
-//--------------------------------------------------------------------
-// App Namespace
-//--------------------------------------------------------------------
-// This defines the default Namespace that is used throughout
-// CodeIgniter to refer to the Application directory. Change
-// this constant to change the namespace that all application
-// classes should use.
-//
-// NOTE: changing this will require manually modifying the
-// existing namespaces of App\* namespaced-classes.
-//
+/*
+ | --------------------------------------------------------------------
+ | App Namespace
+ | --------------------------------------------------------------------
+ |
+ | This defines the default Namespace that is used throughout
+ | CodeIgniter to refer to the Application directory. Change
+ | this constant to change the namespace that all application
+ | classes should use.
+ |
+ | NOTE: changing this will require manually modifying the
+ | existing namespaces of App\* namespaced-classes.
+ */
 defined('APP_NAMESPACE') || define('APP_NAMESPACE', 'App');
 
 /*
-|--------------------------------------------------------------------------
-| Composer Path
-|--------------------------------------------------------------------------
-|
-| The path that Composer's autoload file is expected to live. By default,
-| the vendor folder is in the Root directory, but you can customize that here.
-*/
+ | --------------------------------------------------------------------------
+ | Composer Path
+ | --------------------------------------------------------------------------
+ |
+ | The path that Composer's autoload file is expected to live. By default,
+ | the vendor folder is in the Root directory, but you can customize that here.
+ */
 defined('COMPOSER_PATH') ||
     define('COMPOSER_PATH', ROOTPATH . 'vendor/autoload.php');
 
 /*
-|--------------------------------------------------------------------------
-| Timing Constants
-|--------------------------------------------------------------------------
-|
-| Provide simple ways to work with the myriad of PHP functions that
-| require information to be in seconds.
-*/
+ |--------------------------------------------------------------------------
+ | Timing Constants
+ |--------------------------------------------------------------------------
+ |
+ | Provide simple ways to work with the myriad of PHP functions that
+ | require information to be in seconds.
+ */
 defined('SECOND') || define('SECOND', 1);
 defined('MINUTE') || define('MINUTE', 60);
 defined('HOUR') || define('HOUR', 3600);
@@ -51,30 +55,30 @@ defined('YEAR') || define('YEAR', 31536000);
 defined('DECADE') || define('DECADE', 315360000);
 
 /*
-|--------------------------------------------------------------------------
-| Exit Status Codes
-|--------------------------------------------------------------------------
-|
-| Used to indicate the conditions under which the script is exit()ing.
-| While there is no universal standard for error codes, there are some
-| broad conventions.  Three such conventions are mentioned below, for
-| those who wish to make use of them.  The CodeIgniter defaults were
-| chosen for the least overlap with these conventions, while still
-| leaving room for others to be defined in future versions and user
-| applications.
-|
-| The three main conventions used for determining exit status codes
-| are as follows:
-|
-|    Standard C/C++ Library (stdlibc):
-|       http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
-|       (This link also contains other GNU-specific conventions)
-|    BSD sysexits.h:
-|       http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
-|    Bash scripting:
-|       http://tldp.org/LDP/abs/html/exitcodes.html
-|
-*/
+ | --------------------------------------------------------------------------
+ | Exit Status Codes
+ | --------------------------------------------------------------------------
+ |
+ | Used to indicate the conditions under which the script is exit()ing.
+ | While there is no universal standard for error codes, there are some
+ | broad conventions.  Three such conventions are mentioned below, for
+ | those who wish to make use of them.  The CodeIgniter defaults were
+ | chosen for the least overlap with these conventions, while still
+ | leaving room for others to be defined in future versions and user
+ | applications.
+ |
+ | The three main conventions used for determining exit status codes
+ | are as follows:
+ |
+ |    Standard C/C++ Library (stdlibc):
+ |       http://www.gnu.org/software/libc/manual/html_node/Exit-Status.html
+ |       (This link also contains other GNU-specific conventions)
+ |    BSD sysexits.h:
+ |       http://www.gsp.com/cgi-bin/man.cgi?section=3&topic=sysexits
+ |    Bash scripting:
+ |       http://tldp.org/LDP/abs/html/exitcodes.html
+ |
+ */
 defined('EXIT_SUCCESS') || define('EXIT_SUCCESS', 0); // no errors
 defined('EXIT_ERROR') || define('EXIT_ERROR', 1); // generic error
 defined('EXIT_CONFIG') || define('EXIT_CONFIG', 3); // configuration error
diff --git a/app/Config/ContentSecurityPolicy.php b/app/Config/ContentSecurityPolicy.php
index 2ff4a68a5b..7caa542270 100644
--- a/app/Config/ContentSecurityPolicy.php
+++ b/app/Config/ContentSecurityPolicy.php
@@ -5,45 +5,155 @@ namespace Config;
 use CodeIgniter\Config\BaseConfig;
 
 /**
- * Class ContentSecurityPolicyConfig
- *
  * Stores the default settings for the ContentSecurityPolicy, if you
  * choose to use it. The values here will be read in and set as defaults
  * for the site. If needed, they can be overridden on a page-by-page basis.
  *
  * Suggested reference for explanations:
- *    https://www.html5rocks.com/en/tutorials/security/content-security-policy/
  *
- * @package Config
+ * @see https://www.html5rocks.com/en/tutorials/security/content-security-policy/
  */
 class ContentSecurityPolicy extends BaseConfig
 {
-    // broadbrush CSP management
+    //-------------------------------------------------------------------------
+    // Broadbrush CSP management
+    //-------------------------------------------------------------------------
+
+    /**
+     * Default CSP report context
+     *
+     * @var boolean
+     */
+    public $reportOnly = false;
 
-    public $reportOnly = false; // default CSP report context
-    public $reportURI = null; // URL to send violation reports to
-    public $upgradeInsecureRequests = false; // toggle for forcing https
+    /**
+     * Specifies a URL where a browser will send reports
+     * when a content security policy is violated.
+     *
+     * @var string|null
+     */
+    public $reportURI = null;
 
-    // sources allowed; string or array of strings
+    /**
+     * Instructs user agents to rewrite URL schemes, changing
+     * HTTP to HTTPS. This directive is for websites with
+     * large numbers of old URLs that need to be rewritten.
+     *
+     * @var boolean
+     */
+    public $upgradeInsecureRequests = false;
+
+    //-------------------------------------------------------------------------
+    // Sources allowed
     // Note: once you set a policy to 'none', it cannot be further restricted
+    //-------------------------------------------------------------------------
+
+    /**
+     * Will default to self if not overridden
+     *
+     * @var string|string[]|null
+     */
+    public $defaultSrc = null;
 
-    public $defaultSrc = null; // will default to self if not over-ridden
+    /**
+     * Lists allowed scripts' URLs.
+     *
+     * @var string|string[]
+     */
     public $scriptSrc = 'self';
+
+    /**
+     * Lists allowed stylesheets' URLs.
+     *
+     * @var string|string[]
+     */
     public $styleSrc = 'self';
+
+    /**
+     * Defines the origins from which images can be loaded.
+     *
+     * @var string|string[]
+     */
     public $imageSrc = 'self';
-    public $baseURI = null; // will default to self if not over-ridden
+
+    /**
+     * Restricts the URLs that can appear in a page's `<base>` element.
+     *
+     * Will default to self if not overridden
+     *
+     * @var string|string[]|null
+     */
+    public $baseURI = null;
+
+    /**
+     * Lists the URLs for workers and embedded frame contents
+     *
+     * @var string|string[]
+     */
     public $childSrc = 'self';
+
+    /**
+     * Limits the origins that you can connect to (via XHR,
+     * WebSockets, and EventSource).
+     *
+     * @var string|string[]
+     */
     public $connectSrc = 'self';
+
+    /**
+     * Specifies the origins that can serve web fonts.
+     *
+     * @var string|string[]
+     */
     public $fontSrc = null;
+
+    /**
+     * Lists valid endpoints for submission from `<form>` tags.
+     *
+     * @var string|string[]
+     */
     public $formAction = 'self';
+
+    /**
+     * Specifies the sources that can embed the current page.
+     * This directive applies to `<frame>`, `<iframe>`, `<embed>`,
+     * and `<applet>` tags. This directive can't be used in
+     * `<meta>` tags and applies only to non-HTML resources.
+     *
+     * @var string|string[]|null
+     */
     public $frameAncestors = null;
+
+    /**
+     * Restricts the origins allowed to deliver video and audio.
+     *
+     * @var string|string[]|null
+     */
     public $mediaSrc = null;
+
+    /**
+     * Allows control over Flash and other plugins.
+     *
+     * @var string|string[]
+     */
     public $objectSrc = 'self';
+
+    /**
+     * @var string|string[]|null
+     */
     public $manifestSrc = null;
 
-    // mime types allowed; string or array of strings
+    /**
+     * Limits the kinds of plugins a page may invoke.
+     *
+     * @var string|string[]|null
+     */
     public $pluginTypes = null;
 
-    // list of actions allowed; string or array of strings
+    /**
+     * List of actions allowed.
+     *
+     * @var string|string[]|null
+     */
     public $sandbox = null;
 }
diff --git a/app/Config/Database.php b/app/Config/Database.php
index 4085367592..f655132c29 100644
--- a/app/Config/Database.php
+++ b/app/Config/Database.php
@@ -2,13 +2,12 @@
 
 namespace Config;
 
+use CodeIgniter\Database\Config;
+
 /**
  * Database Configuration
- *
- * @package Config
  */
-
-class Database extends \CodeIgniter\Database\Config
+class Database extends Config
 {
     /**
      * The directory that holds the Migrations
@@ -16,7 +15,7 @@ class Database extends \CodeIgniter\Database\Config
      *
      * @var string
      */
-    public $filesPath = APPPATH . 'Database/';
+    public $filesPath = APPPATH . 'Database' . DIRECTORY_SEPARATOR;
 
     /**
      * Lets you choose which connection group to
@@ -41,10 +40,8 @@ class Database extends \CodeIgniter\Database\Config
         'DBPrefix' => 'cp_',
         'pConnect' => false,
         'DBDebug' => ENVIRONMENT !== 'production',
-        'cacheOn' => false,
-        'cacheDir' => '',
-        'charset' => 'utf8',
-        'DBCollat' => 'utf8_general_ci',
+        'charset' => 'utf8mb4',
+        'DBCollat' => 'utf8mb4_unicode_ci',
         'swapPre' => '',
         'encrypt' => false,
         'compress' => false,
@@ -69,8 +66,6 @@ class Database extends \CodeIgniter\Database\Config
         'DBPrefix' => 'db_', // Needed to ensure we're working correctly with prefixes live. DO NOT REMOVE FOR CI DEVS
         'pConnect' => false,
         'DBDebug' => ENVIRONMENT !== 'production',
-        'cacheOn' => false,
-        'cacheDir' => '',
         'charset' => 'utf8',
         'DBCollat' => 'utf8_general_ci',
         'swapPre' => '',
@@ -92,21 +87,6 @@ class Database extends \CodeIgniter\Database\Config
         // we don't overwrite live data on accident.
         if (ENVIRONMENT === 'testing') {
             $this->defaultGroup = 'tests';
-
-            // Under Travis-CI, we can set an ENV var named 'DB_GROUP'
-            // so that we can test against multiple databases.
-            if ($group = getenv('DB')) {
-                if (is_file(TESTPATH . 'travis/Database.php')) {
-                    require TESTPATH . 'travis/Database.php';
-
-                    if (
-                        !empty($dbconfig) &&
-                        array_key_exists($group, $dbconfig)
-                    ) {
-                        $this->tests = $dbconfig[$group];
-                    }
-                }
-            }
         }
     }
 
diff --git a/app/Config/DocTypes.php b/app/Config/DocTypes.php
index 7ce591b59f..d29036f089 100644
--- a/app/Config/DocTypes.php
+++ b/app/Config/DocTypes.php
@@ -2,14 +2,13 @@
 
 namespace Config;
 
-/**
- * DocTypes
- *
- * @package Config
- */
-
 class DocTypes
 {
+    /**
+     * List of valid document types.
+     *
+     * @var array<string, string>
+     */
     public $list = [
         'xhtml11' =>
             '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">',
diff --git a/app/Config/Encryption.php b/app/Config/Encryption.php
index 7beac59d9c..51f8d01a59 100644
--- a/app/Config/Encryption.php
+++ b/app/Config/Encryption.php
@@ -12,25 +12,56 @@ use CodeIgniter\Config\BaseConfig;
  */
 class Encryption extends BaseConfig
 {
-    /*
-      |--------------------------------------------------------------------------
-      | Encryption Key Starter
-      |--------------------------------------------------------------------------
-      |
-      | If you use the Encryption class you must set an encryption key (seed).
-      | You need to ensure it is long enough for the cipher and mode you plan to use.
-      | See the user guide for more info.
+    /**
+     * --------------------------------------------------------------------------
+     * Encryption Key Starter
+     * --------------------------------------------------------------------------
+     *
+     * If you use the Encryption class you must set an encryption key (seed).
+     * You need to ensure it is long enough for the cipher and mode you plan to use.
+     * See the user guide for more info.
+     *
+     * @var string
      */
-
     public $key = '';
 
-    /*
-      |--------------------------------------------------------------------------
-      | Encryption driver to use
-      |--------------------------------------------------------------------------
-      |
-      | One of the supported drivers, eg 'OpenSSL' or 'Sodium'.
-      | The default driver, if you don't specify one, is 'OpenSSL'.
+    /**
+     * --------------------------------------------------------------------------
+     * Encryption Driver to Use
+     * --------------------------------------------------------------------------
+     *
+     * One of the supported encryption drivers.
+     *
+     * Available drivers:
+     * - OpenSSL
+     * - Sodium
+     *
+     * @var string
      */
     public $driver = 'OpenSSL';
+
+    /**
+     * --------------------------------------------------------------------------
+     * SodiumHandler's Padding Length in Bytes
+     * --------------------------------------------------------------------------
+     *
+     * This is the number of bytes that will be padded to the plaintext message
+     * before it is encrypted. This value should be greater than zero.
+     *
+     * See the user guide for more information on padding.
+     *
+     * @var integer
+     */
+    public $blockSize = 16;
+
+    /**
+     * --------------------------------------------------------------------------
+     * Encryption digest
+     * --------------------------------------------------------------------------
+     *
+     * HMAC digest to use, e.g. 'SHA512' or 'SHA256'. Default value is 'SHA512'.
+     *
+     * @var string
+     */
+    public $digest = 'SHA512';
 }
diff --git a/app/Config/Events.php b/app/Config/Events.php
index ce8331e9f0..bfc80658ec 100644
--- a/app/Config/Events.php
+++ b/app/Config/Events.php
@@ -3,6 +3,7 @@
 namespace Config;
 
 use CodeIgniter\Events\Events;
+use CodeIgniter\Exceptions\FrameworkException;
 
 /*
  * --------------------------------------------------------------------
@@ -23,11 +24,15 @@ use CodeIgniter\Events\Events;
 
 Events::on('pre_system', function () {
     if (ENVIRONMENT !== 'testing') {
-        while (\ob_get_level() > 0) {
-            \ob_end_flush();
+        if (ini_get('zlib.output_compression')) {
+            throw FrameworkException::forEnabledZlibOutputCompression();
         }
 
-        \ob_start(function ($buffer) {
+        while (ob_get_level() > 0) {
+            ob_end_flush();
+        }
+
+        ob_start(function ($buffer) {
             return $buffer;
         });
     }
@@ -38,11 +43,98 @@ Events::on('pre_system', function () {
      * --------------------------------------------------------------------
      * If you delete, they will no longer be collected.
      */
-    if (ENVIRONMENT !== 'production') {
+    if (CI_DEBUG) {
         Events::on(
             'DBQuery',
-            'CodeIgniter\Debug\Toolbar\Collectors\Database::collect'
+            'CodeIgniter\Debug\Toolbar\Collectors\Database::collect',
         );
         Services::toolbar()->respond();
     }
 });
+
+Events::on('login', function ($user) {
+    helper('auth');
+
+    // set interact_as_actor_id value
+    $userPodcasts = $user->podcasts;
+    if ($userPodcasts = $user->podcasts) {
+        set_interact_as_actor($userPodcasts[0]->id);
+    }
+});
+
+Events::on('logout', function ($user) {
+    helper('auth');
+
+    // remove user's interact_as_actor session
+    remove_interact_as_actor($user->id);
+});
+
+/*
+ * --------------------------------------------------------------------
+ * ActivityPub events
+ * --------------------------------------------------------------------
+ * Update episode metadata counts
+ */
+Events::on('on_note_add', function ($note) {
+    if ($note->episode_id) {
+        model('EpisodeModel')
+            ->where('id', $note->episode_id)
+            ->increment('notes_total');
+    }
+});
+
+Events::on('on_note_remove', function ($note) {
+    if ($note->episode_id) {
+        model('EpisodeModel')
+            ->where('id', $note->episode_id)
+            ->decrement('notes_total', 1 + $note->reblogs_count);
+
+        model('EpisodeModel')
+            ->where('id', $note->episode_id)
+            ->decrement('reblogs_total', $note->reblogs_count);
+
+        model('EpisodeModel')
+            ->where('id', $note->episode_id)
+            ->decrement('favourites_total', $note->favourites_count);
+    }
+});
+
+Events::on('on_note_reblog', function ($actor, $note) {
+    if ($episodeId = $note->episode_id) {
+        model('EpisodeModel')
+            ->where('id', $episodeId)
+            ->increment('reblogs_total');
+
+        model('EpisodeModel')
+            ->where('id', $episodeId)
+            ->increment('notes_total');
+    }
+});
+
+Events::on('on_note_undo_reblog', function ($reblogNote) {
+    if ($episodeId = $reblogNote->reblog_of_note->episode_id) {
+        model('EpisodeModel')
+            ->where('id', $episodeId)
+            ->decrement('reblogs_total');
+
+        model('EpisodeModel')
+            ->where('id', $episodeId)
+            ->decrement('notes_total');
+    }
+});
+
+Events::on('on_note_favourite', function ($actor, $note) {
+    if ($note->episode_id) {
+        model('EpisodeModel')
+            ->where('id', $note->episode_id)
+            ->increment('favourites_total');
+    }
+});
+
+Events::on('on_note_undo_favourite', function ($actor, $note) {
+    if ($note->episode_id) {
+        model('EpisodeModel')
+            ->where('id', $note->episode_id)
+            ->decrement('favourites_total');
+    }
+});
diff --git a/app/Config/Exceptions.php b/app/Config/Exceptions.php
index 90f43581ad..b3bef25c53 100644
--- a/app/Config/Exceptions.php
+++ b/app/Config/Exceptions.php
@@ -2,42 +2,47 @@
 
 namespace Config;
 
+use CodeIgniter\Config\BaseConfig;
+
 /**
  * Setup how the exception handler works.
- *
- * @package Config
  */
-
-class Exceptions
+class Exceptions extends BaseConfig
 {
-    /*
-     |--------------------------------------------------------------------------
-     | LOG EXCEPTIONS?
-     |--------------------------------------------------------------------------
-     | If true, then exceptions will be logged
-     | through Services::Log.
-     |
-     | Default: true
+    /**
+     * --------------------------------------------------------------------------
+     * LOG EXCEPTIONS?
+     * --------------------------------------------------------------------------
+     * If true, then exceptions will be logged
+     * through Services::Log.
+     *
+     * Default: true
+     *
+     * @var boolean
      */
     public $log = true;
 
-    /*
-     |--------------------------------------------------------------------------
-     | DO NOT LOG STATUS CODES
-     |--------------------------------------------------------------------------
-     | Any status codes here will NOT be logged if logging is turned on.
-     | By default, only 404 (Page Not Found) exceptions are ignored.
+    /**
+     * --------------------------------------------------------------------------
+     * DO NOT LOG STATUS CODES
+     * --------------------------------------------------------------------------
+     * Any status codes here will NOT be logged if logging is turned on.
+     * By default, only 404 (Page Not Found) exceptions are ignored.
+     *
+     * @var array
      */
     public $ignoreCodes = [404];
 
-    /*
-    |--------------------------------------------------------------------------
-    | Error Views Path
-    |--------------------------------------------------------------------------
-    | This is the path to the directory that contains the 'cli' and 'html'
-    | directories that hold the views used to generate errors.
-    |
-    | Default: APPPATH.'Views/errors'
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Error Views Path
+     * --------------------------------------------------------------------------
+     * This is the path to the directory that contains the 'cli' and 'html'
+     * directories that hold the views used to generate errors.
+     *
+     * Default: APPPATH.'Views/errors'
+     *
+     * @var string
+     */
     public $errorViewPath = APPPATH . 'Views/errors';
 }
diff --git a/app/Config/Filters.php b/app/Config/Filters.php
index bb46e71695..45a9ac6153 100644
--- a/app/Config/Filters.php
+++ b/app/Config/Filters.php
@@ -3,40 +3,65 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Filters\CSRF;
+use CodeIgniter\Filters\DebugToolbar;
+use CodeIgniter\Filters\Honeypot;
 
 class Filters extends BaseConfig
 {
-    // Makes reading things below nicer,
-    // and simpler to change out script that's used.
+    /**
+     * Configures aliases for Filter classes to
+     * make reading things nicer and simpler.
+     *
+     * @var array
+     */
     public $aliases = [
-        'csrf' => \CodeIgniter\Filters\CSRF::class,
-        'toolbar' => \CodeIgniter\Filters\DebugToolbar::class,
-        'honeypot' => \CodeIgniter\Filters\Honeypot::class,
+        'csrf' => CSRF::class,
+        'toolbar' => DebugToolbar::class,
+        'honeypot' => Honeypot::class,
         'login' => \Myth\Auth\Filters\LoginFilter::class,
         'role' => \Myth\Auth\Filters\RoleFilter::class,
-        'permission' => \App\Filters\Permission::class,
+        'permission' => \App\Filters\PermissionFilter::class,
+        'activity-pub' => \ActivityPub\Filters\ActivityPubFilter::class,
     ];
 
-    // Always applied before every request
+    /**
+     * List of filter aliases that are always
+     * applied before and after every request.
+     *
+     * @var array
+     */
     public $globals = [
         'before' => [
-            //'honeypot'
+            // 'honeypot',
             // 'csrf',
         ],
         'after' => [
             'toolbar',
-            //'honeypot'
+            // 'honeypot',
         ],
     ];
 
-    // Works on all of a particular HTTP method
-    // (GET, POST, etc) as BEFORE filters only
-    //     like: 'post' => ['CSRF', 'throttle'],
+    /**
+     * List of filter aliases that works on a
+     * particular HTTP method (GET, POST, etc.).
+     *
+     * Example:
+     * 'post' => ['csrf', 'throttle']
+     *
+     * @var array
+     */
     public $methods = [];
 
-    // List filter aliases and any before/after uri patterns
-    // that they should run on, like:
-    //    'isLoggedIn' => ['before' => ['account/*', 'profiles/*']],
+    /**
+     * List of filter aliases that should run on any
+     * before or after URI patterns.
+     *
+     * Example:
+     * 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']]
+     *
+     * @var array
+     */
     public $filters = [];
 
     public function __construct()
diff --git a/app/Config/ForeignCharacters.php b/app/Config/ForeignCharacters.php
index acb06ddbf5..174ddb16a8 100644
--- a/app/Config/ForeignCharacters.php
+++ b/app/Config/ForeignCharacters.php
@@ -2,6 +2,8 @@
 
 namespace Config;
 
-class ForeignCharacters extends \CodeIgniter\Config\ForeignCharacters
+use CodeIgniter\Config\ForeignCharacters as BaseForeignCharacters;
+
+class ForeignCharacters extends BaseForeignCharacters
 {
 }
diff --git a/app/Config/Format.php b/app/Config/Format.php
index e732d07f61..e772f6ad00 100644
--- a/app/Config/Format.php
+++ b/app/Config/Format.php
@@ -3,43 +3,62 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Format\FormatterInterface;
 
 class Format extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Available Response Formats
-    |--------------------------------------------------------------------------
-    |
-    | When you perform content negotiation with the request, these are the
-    | available formats that your application supports. This is currently
-    | only used with the API\ResponseTrait. A valid Formatter must exist
-    | for the specified format.
-    |
-    | These formats are only checked when the data passed to the respond()
-    | method is an array.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Available Response Formats
+     * --------------------------------------------------------------------------
+     *
+     * When you perform content negotiation with the request, these are the
+     * available formats that your application supports. This is currently
+     * only used with the API\ResponseTrait. A valid Formatter must exist
+     * for the specified format.
+     *
+     * These formats are only checked when the data passed to the respond()
+     * method is an array.
+     *
+     * @var string[]
+     */
     public $supportedResponseFormats = [
         'application/json',
         'application/xml', // machine-readable XML
         'text/xml', // human-readable XML
     ];
 
-    /*
-    |--------------------------------------------------------------------------
-    | Formatters
-    |--------------------------------------------------------------------------
-    |
-    | Lists the class to use to format responses with of a particular type.
-    | For each mime type, list the class that should be used. Formatters
-    | can be retrieved through the getFormatter() method.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Formatters
+     * --------------------------------------------------------------------------
+     *
+     * Lists the class to use to format responses with of a particular type.
+     * For each mime type, list the class that should be used. Formatters
+     * can be retrieved through the getFormatter() method.
+     *
+     * @var array<string, string>
+     */
     public $formatters = [
-        'application/json' => \CodeIgniter\Format\JSONFormatter::class,
-        'application/xml' => \CodeIgniter\Format\XMLFormatter::class,
-        'text/xml' => \CodeIgniter\Format\XMLFormatter::class,
+        'application/json' => 'CodeIgniter\Format\JSONFormatter',
+        'application/xml' => 'CodeIgniter\Format\XMLFormatter',
+        'text/xml' => 'CodeIgniter\Format\XMLFormatter',
+    ];
+
+    /**
+     * --------------------------------------------------------------------------
+     * Formatters Options
+     * --------------------------------------------------------------------------
+     *
+     * Additional Options to adjust default formatters behaviour.
+     * For each mime type, list the additional options that should be used.
+     *
+     * @var array<string, int>
+     */
+    public $formatterOptions = [
+        'application/json' => JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES,
+        'application/xml' => 0,
+        'text/xml' => 0,
     ];
 
     //--------------------------------------------------------------------
@@ -49,26 +68,12 @@ class Format extends BaseConfig
      *
      * @param string $mime
      *
-     * @return \CodeIgniter\Format\FormatterInterface
+     * @return FormatterInterface
+     *
+     * @deprecated This is an alias of `\CodeIgniter\Format\Format::getFormatter`. Use that instead.
      */
     public function getFormatter(string $mime)
     {
-        if (!array_key_exists($mime, $this->formatters)) {
-            throw new \InvalidArgumentException(
-                'No Formatter defined for mime type: ' . $mime
-            );
-        }
-
-        $class = $this->formatters[$mime];
-
-        if (!class_exists($class)) {
-            throw new \BadMethodCallException(
-                $class . ' is not a valid Formatter.'
-            );
-        }
-
-        return new $class();
+        return Services::format()->getFormatter($mime);
     }
-
-    //--------------------------------------------------------------------
 }
diff --git a/app/Config/Generators.php b/app/Config/Generators.php
new file mode 100644
index 0000000000..1f32e4bbb2
--- /dev/null
+++ b/app/Config/Generators.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Config;
+
+use CodeIgniter\Config\BaseConfig;
+
+class Generators extends BaseConfig
+{
+    /**
+     * --------------------------------------------------------------------------
+     * Generator Commands' Views
+     * --------------------------------------------------------------------------
+     *
+     * This array defines the mapping of generator commands to the view files
+     * they are using. If you need to customize them for your own, copy these
+     * view files in your own folder and indicate the location here.
+     *
+     * You will notice that the views have special placeholders enclosed in
+     * curly braces `{...}`. These placeholders are used internally by the
+     * generator commands in processing replacements, thus you are warned
+     * not to delete them or modify the names. If you will do so, you may
+     * end up disrupting the scaffolding process and throw errors.
+     *
+     * YOU HAVE BEEN WARNED!
+     *
+     * @var array<string, string>
+     */
+    public $views = [
+        'make:command' =>
+            'CodeIgniter\Commands\Generators\Views\command.tpl.php',
+        'make:controller' =>
+            'CodeIgniter\Commands\Generators\Views\controller.tpl.php',
+        'make:entity' => 'CodeIgniter\Commands\Generators\Views\entity.tpl.php',
+        'make:filter' => 'CodeIgniter\Commands\Generators\Views\filter.tpl.php',
+        'make:migration' =>
+            'CodeIgniter\Commands\Generators\Views\migration.tpl.php',
+        'make:model' => 'CodeIgniter\Commands\Generators\Views\model.tpl.php',
+        'make:seeder' => 'CodeIgniter\Commands\Generators\Views\seeder.tpl.php',
+        'make:validation' =>
+            'CodeIgniter\Commands\Generators\Views\validation.tpl.php',
+        'session:migration' =>
+            'CodeIgniter\Commands\Generators\Views\migration.tpl.php',
+    ];
+}
diff --git a/app/Config/Honeypot.php b/app/Config/Honeypot.php
index fe99eb2b16..84f2a85400 100644
--- a/app/Config/Honeypot.php
+++ b/app/Config/Honeypot.php
@@ -12,6 +12,7 @@ class Honeypot extends BaseConfig
      * @var boolean
      */
     public $hidden = true;
+
     /**
      * Honeypot Label Content
      *
@@ -32,4 +33,11 @@ class Honeypot extends BaseConfig
      * @var string
      */
     public $template = '<label>{label}</label><input type="text" name="{name}" value=""/>';
+
+    /**
+     * Honeypot container
+     *
+     * @var string
+     */
+    public $container = '<div style="display:none">{template}</div>';
 }
diff --git a/app/Config/Images.php b/app/Config/Images.php
index bcbaa83a65..db5ef18519 100644
--- a/app/Config/Images.php
+++ b/app/Config/Images.php
@@ -3,6 +3,8 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Images\Handlers\GDHandler;
+use CodeIgniter\Images\Handlers\ImageMagickHandler;
 
 class Images extends BaseConfig
 {
@@ -24,20 +26,20 @@ class Images extends BaseConfig
     /**
      * The available handler classes.
      *
-     * @var array
+     * @var array<string, string>
      */
     public $handlers = [
-        'gd' => \CodeIgniter\Images\Handlers\GDHandler::class,
-        'imagick' => \CodeIgniter\Images\Handlers\ImageMagickHandler::class,
+        'gd' => GDHandler::class,
+        'imagick' => ImageMagickHandler::class,
     ];
 
-    /**
-     * --------------------------------------------------------------------------
-     * Uploaded images resizing sizes (in px)
-     * --------------------------------------------------------------------------
-     * The sizes listed below determine the resizing of images when uploaded.
-     * All uploaded images are of 1:1 ratio (width and height are the same).
-     */
+    /*
+	|--------------------------------------------------------------------------
+	| Uploaded images resizing sizes (in px)
+    |--------------------------------------------------------------------------
+    | The sizes listed below determine the resizing of images when uploaded.
+    | All uploaded images are of 1:1 ratio (width and height are the same).
+	*/
 
     /**
      * @var integer
@@ -68,12 +70,12 @@ class Images extends BaseConfig
      */
     public $id3Size = 500;
 
-    /**
-     * --------------------------------------------------------------------------
-     * Uploaded images naming extensions
-     * --------------------------------------------------------------------------
-     * The properties listed below set the name extensions for the resized images
-     */
+    /*
+	|--------------------------------------------------------------------------
+	| Uploaded images naming extensions
+    |--------------------------------------------------------------------------
+    | The properties listed below set the name extensions for the resized images
+	*/
 
     /**
      * @var string
diff --git a/app/Config/Kint.php b/app/Config/Kint.php
index df20e85751..0a4301c9c7 100644
--- a/app/Config/Kint.php
+++ b/app/Config/Kint.php
@@ -5,26 +5,23 @@ namespace Config;
 use CodeIgniter\Config\BaseConfig;
 use Kint\Renderer\Renderer;
 
+/**
+ * --------------------------------------------------------------------------
+ * Kint
+ * --------------------------------------------------------------------------
+ *
+ * We use Kint's `RichRenderer` and `CLIRenderer`. This area contains options
+ * that you can set to customize how Kint works for you.
+ *
+ * @see https://kint-php.github.io/kint/ for details on these settings.
+ */
 class Kint extends BaseConfig
 {
     /*
-    |--------------------------------------------------------------------------
-    | Kint
-    |--------------------------------------------------------------------------
-    |
-    | We use Kint's RichRenderer and CLIRenderer. This area contains options
-    | that you can set to customize how Kint works for you.
-    |
-    | For details on these settings, see Kint's docs:
-    |   https://kint-php.github.io/kint/
-    |
-    */
-
-    /*
-    |--------------------------------------------------------------------------
-    | Global Settings
-    |--------------------------------------------------------------------------
-    */
+	|--------------------------------------------------------------------------
+	| Global Settings
+	|--------------------------------------------------------------------------
+	*/
 
     public $plugins = null;
 
@@ -35,10 +32,10 @@ class Kint extends BaseConfig
     public $expanded = false;
 
     /*
-    |--------------------------------------------------------------------------
-    | RichRenderer Settings
-    |--------------------------------------------------------------------------
-    */
+	|--------------------------------------------------------------------------
+	| RichRenderer Settings
+	|--------------------------------------------------------------------------
+	*/
     public $richTheme = 'aante-light.css';
 
     public $richFolder = false;
@@ -50,10 +47,10 @@ class Kint extends BaseConfig
     public $richTabPlugins = null;
 
     /*
-    |--------------------------------------------------------------------------
-    | CLI Settings
-    |--------------------------------------------------------------------------
-    */
+	|--------------------------------------------------------------------------
+	| CLI Settings
+	|--------------------------------------------------------------------------
+	*/
     public $cliColors = true;
 
     public $cliForceUTF8 = false;
diff --git a/app/Config/Logger.php b/app/Config/Logger.php
index b6c5ca4b41..a1d60a1d0b 100644
--- a/app/Config/Logger.php
+++ b/app/Config/Logger.php
@@ -6,76 +6,82 @@ use CodeIgniter\Config\BaseConfig;
 
 class Logger extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Error Logging Threshold
-    |--------------------------------------------------------------------------
-    |
-    | You can enable error logging by setting a threshold over zero. The
-    | threshold determines what gets logged. Any values below or equal to the
-    | threshold will be logged. Threshold options are:
-    |
-    |   0 = Disables logging, Error logging TURNED OFF
-    |   1 = Emergency Messages  - System is unusable
-    |   2 = Alert Messages      - Action Must Be Taken Immediately
-    |   3 = Critical Messages   - Application component unavailable, unexpected exception.
-    |   4 = Runtime Errors      - Don't need immediate action, but should be monitored.
-    |   5 = Warnings               - Exceptional occurrences that are not errors.
-    |   6 = Notices            - Normal but significant events.
-    |   7 = Info             - Interesting events, like user logging in, etc.
-    |   8 = Debug                - Detailed debug information.
-    |   9 = All Messages
-    |
-    | You can also pass an array with threshold levels to show individual error types
-    |
-    |   array(1, 2, 3, 8) = Emergency, Alert, Critical, and Debug messages
-    |
-    | For a live site you'll usually enable Critical or higher (3) to be logged otherwise
-    | your log files will fill up very fast.
-    |
-    */
-    public $threshold = 3;
+    /**
+     * --------------------------------------------------------------------------
+     * Error Logging Threshold
+     * --------------------------------------------------------------------------
+     *
+     * You can enable error logging by setting a threshold over zero. The
+     * threshold determines what gets logged. Any values below or equal to the
+     * threshold will be logged.
+     *
+     * Threshold options are:
+     *
+     * - 0 = Disables logging, Error logging TURNED OFF
+     * - 1 = Emergency Messages - System is unusable
+     * - 2 = Alert Messages - Action Must Be Taken Immediately
+     * - 3 = Critical Messages - Application component unavailable, unexpected exception.
+     * - 4 = Runtime Errors - Don't need immediate action, but should be monitored.
+     * - 5 = Warnings - Exceptional occurrences that are not errors.
+     * - 6 = Notices - Normal but significant events.
+     * - 7 = Info - Interesting events, like user logging in, etc.
+     * - 8 = Debug - Detailed debug information.
+     * - 9 = All Messages
+     *
+     * You can also pass an array with threshold levels to show individual error types
+     *
+     *     array(1, 2, 3, 8) = Emergency, Alert, Critical, and Debug messages
+     *
+     * For a live site you'll usually enable Critical or higher (3) to be logged otherwise
+     * your log files will fill up very fast.
+     *
+     * @var integer|array
+     */
+    public $threshold = 4;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Date Format for Logs
-    |--------------------------------------------------------------------------
-    |
-    | Each item that is logged has an associated date. You can use PHP date
-    | codes to set your own date formatting
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Date Format for Logs
+     * --------------------------------------------------------------------------
+     *
+     * Each item that is logged has an associated date. You can use PHP date
+     * codes to set your own date formatting
+     *
+     * @var string
+     */
     public $dateFormat = 'Y-m-d H:i:s';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Log Handlers
-    |--------------------------------------------------------------------------
-    |
-    | The logging system supports multiple actions to be taken when something
-    | is logged. This is done by allowing for multiple Handlers, special classes
-    | designed to write the log to their chosen destinations, whether that is
-    | a file on the getServer, a cloud-based service, or even taking actions such
-    | as emailing the dev team.
-    |
-    | Each handler is defined by the class name used for that handler, and it
-    | MUST implement the CodeIgniter\Log\Handlers\HandlerInterface interface.
-    |
-    | The value of each key is an array of configuration items that are sent
-    | to the constructor of each handler. The only required configuration item
-    | is the 'handles' element, which must be an array of integer log levels.
-    | This is most easily handled by using the constants defined in the
-    | Psr\Log\LogLevel class.
-    |
-    | Handlers are executed in the order defined in this array, starting with
-    | the handler on top and continuing down.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Log Handlers
+     * --------------------------------------------------------------------------
+     *
+     * The logging system supports multiple actions to be taken when something
+     * is logged. This is done by allowing for multiple Handlers, special classes
+     * designed to write the log to their chosen destinations, whether that is
+     * a file on the getServer, a cloud-based service, or even taking actions such
+     * as emailing the dev team.
+     *
+     * Each handler is defined by the class name used for that handler, and it
+     * MUST implement the `CodeIgniter\Log\Handlers\HandlerInterface` interface.
+     *
+     * The value of each key is an array of configuration items that are sent
+     * to the constructor of each handler. The only required configuration item
+     * is the 'handles' element, which must be an array of integer log levels.
+     * This is most easily handled by using the constants defined in the
+     * `Psr\Log\LogLevel` class.
+     *
+     * Handlers are executed in the order defined in this array, starting with
+     * the handler on top and continuing down.
+     *
+     * @var array
+     */
     public $handlers = [
-        //--------------------------------------------------------------------
-        // File Handler
-        //--------------------------------------------------------------------
-
+        /*
+         * --------------------------------------------------------------------
+         * File Handler
+         * --------------------------------------------------------------------
+         */
         'CodeIgniter\Log\Handlers\FileHandler' => [
             /*
              * The log levels that this handler will handle.
diff --git a/app/Config/Migrations.php b/app/Config/Migrations.php
index 36b9900b10..2913c4ca85 100644
--- a/app/Config/Migrations.php
+++ b/app/Config/Migrations.php
@@ -6,46 +6,50 @@ use CodeIgniter\Config\BaseConfig;
 
 class Migrations extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Enable/Disable Migrations
-    |--------------------------------------------------------------------------
-    |
-    | Migrations are enabled by default for security reasons.
-    | You should enable migrations whenever you intend to do a schema migration
-    | and disable it back when you're done.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Enable/Disable Migrations
+     * --------------------------------------------------------------------------
+     *
+     * Migrations are enabled by default.
+     *
+     * You should enable migrations whenever you intend to do a schema migration
+     * and disable it back when you're done.
+     *
+     * @var boolean
+     */
     public $enabled = true;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Migrations table
-    |--------------------------------------------------------------------------
-    |
-    | This is the name of the table that will store the current migrations state.
-    | When migrations runs it will store in a database table which migration
-    | level the system is at. It then compares the migration level in this
-    | table to the $config['migration_version'] if they are not the same it
-    | will migrate up. This must be set.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Migrations Table
+     * --------------------------------------------------------------------------
+     *
+     * This is the name of the table that will store the current migrations state.
+     * When migrations runs it will store in a database table which migration
+     * level the system is at. It then compares the migration level in this
+     * table to the $config['migration_version'] if they are not the same it
+     * will migrate up. This must be set.
+     *
+     * @var string
+     */
     public $table = 'migrations';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Timestamp Format
-    |--------------------------------------------------------------------------
-    |
-    | This is the format that will be used when creating new migrations
-    | using the cli command:
-    |   > php spark migrate:create
-    |
-    | Typical formats:
-    |   YmdHis_
-    |   Y-m-d-His_
-    |   Y_m_d_His_
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Timestamp Format
+     * --------------------------------------------------------------------------
+     *
+     * This is the format that will be used when creating new migrations
+     * using the CLI command:
+     *   > php spark migrate:create
+     *
+     * Typical formats:
+     * - YmdHis_
+     * - Y-m-d-His_
+     * - Y_m_d_His_
+     *
+     * @var string
+     */
     public $timestampFormat = 'Y-m-d-His_';
 }
diff --git a/app/Config/Mimes.php b/app/Config/Mimes.php
index da0cd335ee..574db6d829 100644
--- a/app/Config/Mimes.php
+++ b/app/Config/Mimes.php
@@ -2,19 +2,21 @@
 
 namespace Config;
 
-/*
-| -------------------------------------------------------------------
-| MIME TYPES
-| -------------------------------------------------------------------
-| This file contains an array of mime types.  It is used by the
-| Upload class to help identify allowed file types.
-|
-| When more than one variation for an extension exist (like jpg, jpeg, etc)
-| the most common one should be first in the array to aid the guess*
-| methods. The same applies when more than one mime-type exists for a
-| single extension.
-|
-*/
+/**
+ * Mimes
+ *
+ * This file contains an array of mime types.  It is used by the
+ * Upload class to help identify allowed file types.
+ *
+ * When more than one variation for an extension exist (like jpg, jpeg, etc)
+ * the most common one should be first in the array to aid the guess*
+ * methods. The same applies when more than one mime-type exists for a
+ * single extension.
+ *
+ * When working with mime types, please make sure you have the ´fileinfo´
+ * extension enabled to reliably detect the media types.
+ */
+
 class Mimes
 {
     /**
@@ -34,7 +36,6 @@ class Mimes
             'text/csv',
             'text/x-comma-separated-values',
             'text/comma-separated-values',
-            'application/octet-stream',
             'application/vnd.ms-excel',
             'application/x-csv',
             'text/x-csv',
@@ -64,7 +65,6 @@ class Mimes
             'application/pdf',
             'application/force-download',
             'application/x-download',
-            'binary/octet-stream',
         ],
         'ai' => ['application/pdf', 'application/postscript'],
         'eps' => 'application/postscript',
@@ -134,6 +134,7 @@ class Mimes
             'multipart/x-zip',
         ],
         'rar' => [
+            'application/vnd.rar',
             'application/x-rar',
             'application/rar',
             'application/x-rar-compressed',
@@ -305,15 +306,18 @@ class Mimes
             'application/x-jar',
             'application/x-compressed',
         ],
-        'svg' => ['image/svg+xml', 'application/xml', 'text/xml'],
+        'svg' => ['image/svg+xml', 'image/svg', 'application/xml', 'text/xml'],
         'vcf' => 'text/x-vcard',
         'srt' => ['text/srt', 'text/plain', 'application/octet-stream'],
         'vtt' => ['text/vtt', 'text/plain'],
         'ico' => ['image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'],
+        'stl' => [
+            'application/sla',
+            'application/vnd.ms-pki.stl',
+            'application/x-navistyle',
+        ],
     ];
 
-    //--------------------------------------------------------------------
-
     /**
      * Attempts to determine the best mime type for the given file extension.
      *
@@ -334,41 +338,47 @@ class Mimes
             : static::$mimes[$extension];
     }
 
-    //--------------------------------------------------------------------
-
     /**
      * Attempts to determine the best file extension for a given mime type.
      *
-     * @param string $type
-     * @param string $proposed_extension - default extension (in case there is more than one with the same mime type)
+     * @param string      $type
+     * @param string|null $proposedExtension - default extension (in case there is more than one with the same mime type)
      *
      * @return string|null The extension determined, or null if unable to match.
      */
     public static function guessExtensionFromType(
         string $type,
-        ?string $proposed_extension = null
+        string $proposedExtension = null
     ) {
         $type = trim(strtolower($type), '. ');
 
-        $proposed_extension = trim(strtolower($proposed_extension));
+        $proposedExtension = trim(strtolower($proposedExtension));
 
-        if (
-            !is_null($proposed_extension) &&
-            array_key_exists($proposed_extension, static::$mimes) &&
-            in_array(
-                $type,
-                is_string(static::$mimes[$proposed_extension])
-                    ? [static::$mimes[$proposed_extension]]
-                    : static::$mimes[$proposed_extension]
-            )
-        ) {
-            return $proposed_extension;
+        if ($proposedExtension !== '') {
+            if (
+                array_key_exists($proposedExtension, static::$mimes) &&
+                in_array(
+                    $type,
+                    is_string(static::$mimes[$proposedExtension])
+                        ? [static::$mimes[$proposedExtension]]
+                        : static::$mimes[$proposedExtension],
+                    true,
+                )
+            ) {
+                // The detected mime type matches with the proposed extension.
+                return $proposedExtension;
+            }
+
+            // An extension was proposed, but the media type does not match the mime type list.
+            return null;
         }
 
+        // Reverse check the mime type list if no extension was proposed.
+        // This search is order sensitive!
         foreach (static::$mimes as $ext => $types) {
             if (
                 (is_string($types) && $types === $type) ||
-                (is_array($types) && in_array($type, $types))
+                (is_array($types) && in_array($type, $types, true))
             ) {
                 return $ext;
             }
@@ -376,6 +386,4 @@ class Mimes
 
         return null;
     }
-
-    //--------------------------------------------------------------------
 }
diff --git a/app/Config/Modules.php b/app/Config/Modules.php
index 8e4c1273f0..c87ce57158 100644
--- a/app/Config/Modules.php
+++ b/app/Config/Modules.php
@@ -2,62 +2,46 @@
 
 namespace Config;
 
-// Cannot extend BaseConfig or looping resources occurs.
-class Modules
+use CodeIgniter\Modules\Modules as BaseModules;
+
+class Modules extends BaseModules
 {
-    /*
-     |--------------------------------------------------------------------------
-     | Auto-Discovery Enabled?
-     |--------------------------------------------------------------------------
-     |
-     | If true, then auto-discovery will happen across all elements listed in
-     | $activeExplorers below. If false, no auto-discovery will happen at all,
-     | giving a slight performance boost.
+    /**
+     * --------------------------------------------------------------------------
+     * Enable Auto-Discovery?
+     * --------------------------------------------------------------------------
+     *
+     * If true, then auto-discovery will happen across all elements listed in
+     * $activeExplorers below. If false, no auto-discovery will happen at all,
+     * giving a slight performance boost.
+     *
+     * @var boolean
      */
     public $enabled = true;
 
-    /*
-     |--------------------------------------------------------------------------
-     | Auto-Discovery Within Composer Packages Enabled?
-     |--------------------------------------------------------------------------
-     |
-     | If true, then auto-discovery will happen across all namespaces loaded
-     | by Composer, as well as the namespaces configured locally.
+    /**
+     * --------------------------------------------------------------------------
+     * Enable Auto-Discovery Within Composer Packages?
+     * --------------------------------------------------------------------------
+     *
+     * If true, then auto-discovery will happen across all namespaces loaded
+     * by Composer, as well as the namespaces configured locally.
+     *
+     * @var boolean
      */
     public $discoverInComposer = true;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Auto-discover Rules
-    |--------------------------------------------------------------------------
-    |
-    | Lists the aliases of all discovery classes that will be active
-    | and used during the current application request. If it is not
-    | listed here, only the base application elements will be used.
-    */
-    public $activeExplorers = ['events', 'registrars', 'routes', 'services'];
-
     /**
-     * Should the application auto-discover the requested resources.
+     * --------------------------------------------------------------------------
+     * Auto-Discovery Rules
+     * --------------------------------------------------------------------------
      *
-     * Valid values are:
-     *  - events
-     *  - registrars
-     *  - routes
-     *  - services
+     * Aliases list of all discovery classes that will be active and used during
+     * the current application request.
      *
-     * @param string $alias
+     * If it is not listed, only the base application elements will be used.
      *
-     * @return boolean
+     * @var string[]
      */
-    public function shouldDiscover(string $alias)
-    {
-        if (!$this->enabled) {
-            return false;
-        }
-
-        $alias = strtolower($alias);
-
-        return in_array($alias, $this->activeExplorers);
-    }
+    public $aliases = ['events', 'filters', 'registrars', 'routes', 'services'];
 }
diff --git a/app/Config/Pager.php b/app/Config/Pager.php
index 699ab90782..8f38d983d3 100644
--- a/app/Config/Pager.php
+++ b/app/Config/Pager.php
@@ -6,32 +6,34 @@ use CodeIgniter\Config\BaseConfig;
 
 class Pager extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Templates
-    |--------------------------------------------------------------------------
-    |
-    | Pagination links are rendered out using views to configure their
-    | appearance. This array contains aliases and the view names to
-    | use when rendering the links.
-    |
-    | Within each view, the Pager object will be available as $pager,
-    | and the desired group as $pagerGroup;
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Templates
+     * --------------------------------------------------------------------------
+     *
+     * Pagination links are rendered out using views to configure their
+     * appearance. This array contains aliases and the view names to
+     * use when rendering the links.
+     *
+     * Within each view, the Pager object will be available as $pager,
+     * and the desired group as $pagerGroup;
+     *
+     * @var array<string, string>
+     */
     public $templates = [
         'default_full' => 'App\Views\pager\default_full',
         'default_simple' => 'CodeIgniter\Pager\Views\default_simple',
         'default_head' => 'CodeIgniter\Pager\Views\default_head',
     ];
 
-    /*
-    |--------------------------------------------------------------------------
-    | Items Per Page
-    |--------------------------------------------------------------------------
-    |
-    | The default number of results shown in a single page.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Items Per Page
+     * --------------------------------------------------------------------------
+     *
+     * The default number of results shown in a single page.
+     *
+     * @var integer
+     */
     public $perPage = 20;
 }
diff --git a/app/Config/Paths.php b/app/Config/Paths.php
index 79c3408fa5..38eb3057f8 100644
--- a/app/Config/Paths.php
+++ b/app/Config/Paths.php
@@ -3,9 +3,12 @@
 namespace Config;
 
 /**
+ * Paths
+ *
  * Holds the paths that are used by the system to
  * locate the main directories, app, system, etc.
- * Modifying these allows you to re-structure your application,
+ *
+ * Modifying these allows you to restructure your application,
  * share a system folder between multiple applications, and more.
  *
  * All paths are relative to the project's root folder.
@@ -13,34 +16,35 @@ namespace Config;
 
 class Paths
 {
-    /*
-     *---------------------------------------------------------------
+    /**
+     * ---------------------------------------------------------------
      * SYSTEM FOLDER NAME
-     *---------------------------------------------------------------
+     * ---------------------------------------------------------------
      *
-     * This variable must contain the name of your "system" folder.
-     * Include the path if the folder is not in the same directory
-     * as this file.
+     * This must contain the name of your "system" folder. Include
+     * the path if the folder is not in the same directory as this file.
+     *
+     * @var string
      */
     public $systemDirectory =
         __DIR__ . '/../../vendor/codeigniter4/codeigniter4/system';
-
-    /*
-     *---------------------------------------------------------------
+    /**
+     * ---------------------------------------------------------------
      * APPLICATION FOLDER NAME
-     *---------------------------------------------------------------
+     * ---------------------------------------------------------------
      *
      * If you want this front controller to use a different "app"
      * folder than the default one you can set its name here. The folder
      * can also be renamed or relocated anywhere on your getServer. If
-     * you do, use a full getServer path. For more info please see the user guide:
-     * http://codeigniter.com/user_guide/general/managing_apps.html
+     * you do, use a full getServer path.
      *
-     * NO TRAILING SLASH!
+     * @see http://codeigniter.com/user_guide/general/managing_apps.html
+     *
+     * @var string
      */
     public $appDirectory = __DIR__ . '/..';
 
-    /*
+    /**
      * ---------------------------------------------------------------
      * WRITABLE DIRECTORY NAME
      * ---------------------------------------------------------------
@@ -50,23 +54,23 @@ class Paths
      * need write permission to a single place that can be tucked away
      * for maximum security, keeping it out of the app and/or
      * system directories.
+     *
+     * @var string
      */
     public $writableDirectory = __DIR__ . '/../../writable';
 
-    /*
+    /**
      * ---------------------------------------------------------------
      * TESTS DIRECTORY NAME
      * ---------------------------------------------------------------
      *
      * This variable must contain the name of your "tests" directory.
-     * The writable directory allows you to group all directories that
-     * need write permission to a single place that can be tucked away
-     * for maximum security, keeping it out of the app and/or
-     * system directories.
+     *
+     * @var string
      */
     public $testsDirectory = __DIR__ . '/../../tests';
 
-    /*
+    /**
      * ---------------------------------------------------------------
      * VIEW DIRECTORY NAME
      * ---------------------------------------------------------------
@@ -75,6 +79,8 @@ class Paths
      * contains the view files used by your application. By
      * default this is in `app/Views`. This value
      * is used when no value is provided to `Services::renderer()`.
+     *
+     * @var string
      */
     public $viewDirectory = __DIR__ . '/../Views';
 }
diff --git a/app/Config/Routes.php b/app/Config/Routes.php
index bd50617eb8..2d986c4026 100644
--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -29,10 +29,19 @@ $routes->setAutoRoute(false);
  * --------------------------------------------------------------------
  */
 
-$routes->addPlaceholder('podcastName', '[a-zA-Z0-9\_]{1,191}');
+$routes->addPlaceholder('podcastName', '[a-zA-Z0-9\_]{1,32}');
 $routes->addPlaceholder('slug', '[a-zA-Z0-9\-]{1,191}');
 $routes->addPlaceholder('base64', '[A-Za-z0-9\.\_]+\-{0,2}');
 $routes->addPlaceholder('platformType', '\bpodcasting|\bsocial|\bfunding');
+$routes->addPlaceholder('noteAction', '\bfavourite|\breblog|\breply');
+$routes->addPlaceholder(
+    'embeddablePlayerTheme',
+    '\blight|\bdark|\blight-transparent|\bdark-transparent',
+);
+$routes->addPlaceholder(
+    'uuid',
+    '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}',
+);
 
 /**
  * --------------------------------------------------------------------
@@ -62,7 +71,7 @@ $routes->group(config('App')->installGateway, function ($routes) {
 });
 
 // Route for podcast audio file analytics (/audio/pack(podcast_id,episode_id,bytes_threshold,filesize,duration,date)/podcast_folder/filename.mp3)
-$routes->add('audio/(:base64)/(:any)', 'Analytics::hit/$1/$2', [
+$routes->get('audio/(:base64)/(:any)', 'Analytics::hit/$1/$2', [
     'as' => 'analytics_hit',
 ]);
 
@@ -150,7 +159,7 @@ $routes->group(
                 $routes->post('edit', 'Podcast::attemptEdit/$1', [
                     'filter' => 'permission:podcast-edit',
                 ]);
-                $routes->add('delete', 'Podcast::delete/$1', [
+                $routes->get('delete', 'Podcast::delete/$1', [
                     'as' => 'podcast-delete',
                     'filter' => 'permission:podcasts-delete',
                 ]);
@@ -170,7 +179,7 @@ $routes->group(
                         [
                             'as' => 'podcast-person-remove',
                             'filter' => 'permission:podcast-edit',
-                        ]
+                        ],
                     );
                 });
 
@@ -185,7 +194,7 @@ $routes->group(
                         [
                             'as' => 'podcast-analytics-webpages',
                             'filter' => 'permission:podcasts-view,podcast-view',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'locations',
@@ -193,7 +202,7 @@ $routes->group(
                         [
                             'as' => 'podcast-analytics-locations',
                             'filter' => 'permission:podcasts-view,podcast-view',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'unique-listeners',
@@ -201,7 +210,7 @@ $routes->group(
                         [
                             'as' => 'podcast-analytics-unique-listeners',
                             'filter' => 'permission:podcasts-view,podcast-view',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'listening-time',
@@ -209,7 +218,7 @@ $routes->group(
                         [
                             'as' => 'podcast-analytics-listening-time',
                             'filter' => 'permission:podcasts-view,podcast-view',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'time-periods',
@@ -217,7 +226,7 @@ $routes->group(
                         [
                             'as' => 'podcast-analytics-time-periods',
                             'filter' => 'permission:podcasts-view,podcast-view',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'players',
@@ -225,7 +234,7 @@ $routes->group(
                         [
                             'as' => 'podcast-analytics-players',
                             'filter' => 'permission:podcasts-view,podcast-view',
-                        ]
+                        ],
                     );
                 });
 
@@ -235,7 +244,7 @@ $routes->group(
                     [
                         'as' => 'analytics-full-data',
                         'filter' => 'permission:podcasts-view,podcast-view',
-                    ]
+                    ],
                 );
                 $routes->get(
                     'analytics-data/(:segment)/(:segment)',
@@ -243,7 +252,7 @@ $routes->group(
                     [
                         'as' => 'analytics-data',
                         'filter' => 'permission:podcasts-view,podcast-view',
-                    ]
+                    ],
                 );
                 $routes->get(
                     'analytics-data/(:segment)/(:segment)/(:num)',
@@ -251,7 +260,7 @@ $routes->group(
                     [
                         'as' => 'analytics-filtered-data',
                         'filter' => 'permission:podcasts-view,podcast-view',
-                    ]
+                    ],
                 );
 
                 // Podcast episodes
@@ -283,7 +292,50 @@ $routes->group(
                         $routes->post('edit', 'Episode::attemptEdit/$1/$2', [
                             'filter' => 'permission:podcast_episodes-edit',
                         ]);
-                        $routes->add('delete', 'Episode::delete/$1/$2', [
+                        $routes->get('publish', 'Episode::publish/$1/$2', [
+                            'as' => 'episode-publish',
+                            'filter' =>
+                                'permission:podcast-manage_publications',
+                        ]);
+                        $routes->post(
+                            'publish',
+                            'Episode::attemptPublish/$1/$2',
+                            [
+                                'filter' =>
+                                    'permission:podcast-manage_publications',
+                            ],
+                        );
+                        $routes->get(
+                            'publish-edit',
+                            'Episode::publishEdit/$1/$2',
+                            [
+                                'as' => 'episode-publish_edit',
+                                'filter' =>
+                                    'permission:podcast-manage_publications',
+                            ],
+                        );
+                        $routes->post(
+                            'publish-edit',
+                            'Episode::attemptPublishEdit/$1/$2',
+                            [
+                                'filter' =>
+                                    'permission:podcast-manage_publications',
+                            ],
+                        );
+                        $routes->get('unpublish', 'Episode::unpublish/$1/$2', [
+                            'as' => 'episode-unpublish',
+                            'filter' =>
+                                'permission:podcast-manage_publications',
+                        ]);
+                        $routes->post(
+                            'unpublish',
+                            'Episode::attemptUnpublish/$1/$2',
+                            [
+                                'filter' =>
+                                    'permission:podcast-manage_publications',
+                            ],
+                        );
+                        $routes->get('delete', 'Episode::delete/$1/$2', [
                             'as' => 'episode-delete',
                             'filter' => 'permission:podcast_episodes-delete',
                         ]);
@@ -293,7 +345,7 @@ $routes->group(
                             [
                                 'as' => 'transcript-delete',
                                 'filter' => 'permission:podcast_episodes-edit',
-                            ]
+                            ],
                         );
                         $routes->get(
                             'chapters-delete',
@@ -301,7 +353,7 @@ $routes->group(
                             [
                                 'as' => 'chapters-delete',
                                 'filter' => 'permission:podcast_episodes-edit',
-                            ]
+                            ],
                         );
                         $routes->get(
                             'soundbites',
@@ -309,22 +361,22 @@ $routes->group(
                             [
                                 'as' => 'soundbites-edit',
                                 'filter' => 'permission:podcast_episodes-edit',
-                            ]
+                            ],
                         );
                         $routes->post(
                             'soundbites',
                             'Episode::soundbitesAttemptEdit/$1/$2',
                             [
                                 'filter' => 'permission:podcast_episodes-edit',
-                            ]
+                            ],
                         );
-                        $routes->add(
+                        $routes->get(
                             'soundbites/(:num)/delete',
                             'Episode::soundbiteDelete/$1/$2/$3',
                             [
                                 'as' => 'soundbite-delete',
                                 'filter' => 'permission:podcast_episodes-edit',
-                            ]
+                            ],
                         );
                         $routes->get(
                             'embeddable-player',
@@ -332,7 +384,7 @@ $routes->group(
                             [
                                 'as' => 'embeddable-player-add',
                                 'filter' => 'permission:podcast_episodes-edit',
-                            ]
+                            ],
                         );
 
                         $routes->group('persons', function ($routes) {
@@ -346,7 +398,7 @@ $routes->group(
                                 [
                                     'filter' =>
                                         'permission:podcast_episodes-edit',
-                                ]
+                                ],
                             );
                             $routes->get(
                                 '(:num)/remove',
@@ -355,7 +407,7 @@ $routes->group(
                                     'as' => 'episode-person-remove',
                                     'filter' =>
                                         'permission:podcast_episodes-edit',
-                                ]
+                                ],
                             );
                         });
                     });
@@ -394,9 +446,9 @@ $routes->group(
                             [
                                 'filter' =>
                                     'permission:podcast-manage_contributors',
-                            ]
+                            ],
                         );
-                        $routes->add('remove', 'Contributor::remove/$1/$2', [
+                        $routes->get('remove', 'Contributor::remove/$1/$2', [
                             'as' => 'contributor-remove',
                             'filter' =>
                                 'permission:podcast-manage_contributors',
@@ -411,7 +463,7 @@ $routes->group(
                         [
                             'as' => 'platforms-podcasting',
                             'filter' => 'permission:podcast-manage_platforms',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'social',
@@ -419,7 +471,7 @@ $routes->group(
                         [
                             'as' => 'platforms-social',
                             'filter' => 'permission:podcast-manage_platforms',
-                        ]
+                        ],
                     );
                     $routes->get(
                         'funding',
@@ -427,7 +479,7 @@ $routes->group(
                         [
                             'as' => 'platforms-funding',
                             'filter' => 'permission:podcast-manage_platforms',
-                        ]
+                        ],
                     );
                     $routes->post(
                         'save/(:platformType)',
@@ -435,20 +487,35 @@ $routes->group(
                         [
                             'as' => 'platforms-save',
                             'filter' => 'permission:podcast-manage_platforms',
-                        ]
+                        ],
                     );
-                    $routes->add(
+                    $routes->get(
                         '(:slug)/podcast-platform-remove',
                         'PodcastPlatform::removePodcastPlatform/$1/$2',
                         [
                             'as' => 'podcast-platform-remove',
                             'filter' => 'permission:podcast-manage_platforms',
-                        ]
+                        ],
                     );
                 });
             });
         });
 
+        // Instance wide Fediverse config
+        $routes->group('fediverse', function ($routes) {
+            $routes->get('/', 'Fediverse::dashboard', [
+                'as' => 'fediverse-dashboard',
+            ]);
+            $routes->get('blocked-actors', 'Fediverse::blockedActors', [
+                'as' => 'fediverse-blocked-actors',
+                'filter' => 'permission:fediverse-block_actors',
+            ]);
+            $routes->get('blocked-domains', 'Fediverse::blockedDomains', [
+                'as' => 'fediverse-blocked-domains',
+                'filter' => 'permission:fediverse-block_domains',
+            ]);
+        });
+
         // Pages
         $routes->group('pages', function ($routes) {
             $routes->get('/', 'Page::list', ['as' => 'page-list']);
@@ -470,7 +537,7 @@ $routes->group(
                     'filter' => 'permission:pages-manage',
                 ]);
 
-                $routes->add('delete', 'Page::delete/$1', [
+                $routes->get('delete', 'Page::delete/$1', [
                     'as' => 'page-delete',
                     'filter' => 'permission:pages-manage',
                 ]);
@@ -504,19 +571,19 @@ $routes->group(
                 $routes->post('edit', 'User::attemptEdit/$1', [
                     'filter' => 'permission:users-manage_authorizations',
                 ]);
-                $routes->add('ban', 'User::ban/$1', [
+                $routes->get('ban', 'User::ban/$1', [
                     'as' => 'user-ban',
                     'filter' => 'permission:users-manage_bans',
                 ]);
-                $routes->add('unban', 'User::unBan/$1', [
+                $routes->get('unban', 'User::unBan/$1', [
                     'as' => 'user-unban',
                     'filter' => 'permission:users-manage_bans',
                 ]);
-                $routes->add('force-pass-reset', 'User::forcePassReset/$1', [
+                $routes->get('force-pass-reset', 'User::forcePassReset/$1', [
                     'as' => 'user-force_pass_reset',
                     'filter' => 'permission:users-force_pass_reset',
                 ]);
-                $routes->add('delete', 'User::delete/$1', [
+                $routes->get('delete', 'User::delete/$1', [
                     'as' => 'user-delete',
                     'filter' => 'permission:users-delete',
                 ]);
@@ -533,7 +600,7 @@ $routes->group(
             ]);
             $routes->post('change-password', 'MyAccount::attemptChange/$1');
         });
-    }
+    },
 );
 
 /**
@@ -570,35 +637,142 @@ $routes->group(config('App')->authGateway, function ($routes) {
     $routes->post('reset-password', 'Auth::attemptReset');
 });
 
-// Public routes
+// Podcast's Public routes
 $routes->group('@(:podcastName)', function ($routes) {
-    $routes->get('/', 'Podcast/$1', ['as' => 'podcast']);
-    $routes->group('(:slug)', function ($routes) {
+    $routes->get('/', 'Podcast::activity/$1', [
+        'as' => 'podcast-activity',
+    ]);
+    // override default ActivityPub Library's actor route
+    $routes->get('/', 'Podcast::activity/$1', [
+        'as' => 'actor',
+        'alternate-content' => [
+            'application/activity+json' => [
+                'namespace' => 'ActivityPub\Controllers',
+                'controller-method' => 'ActorController/$1',
+            ],
+            'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [
+                'namespace' => 'ActivityPub\Controllers',
+                'controller-method' => 'ActorController/$1',
+            ],
+        ],
+    ]);
+    $routes->get('episodes', 'Podcast::episodes/$1', [
+        'as' => 'podcast-episodes',
+    ]);
+    $routes->group('episodes/(:slug)', function ($routes) {
         $routes->get('/', 'Episode/$1/$2', [
             'as' => 'episode',
         ]);
+        $routes->get('oembed.json', 'Episode::oembedJSON/$1/$2', [
+            'as' => 'episode-oembed-json',
+        ]);
+        $routes->get('oembed.xml', 'Episode::oembedXML/$1/$2', [
+            'as' => 'episode-oembed-xml',
+        ]);
         $routes->group('embeddable-player', function ($routes) {
             $routes->get('/', 'Episode::embeddablePlayer/$1/$2', [
                 'as' => 'embeddable-player',
             ]);
-            $routes->get('(:slug)', 'Episode::embeddablePlayer/$1/$2/$3', [
-                'as' => 'embeddable-player-theme',
-            ]);
+            $routes->get(
+                '(:embeddablePlayerTheme)',
+                'Episode::embeddablePlayer/$1/$2/$3',
+                [
+                    'as' => 'embeddable-player-theme',
+                ],
+            );
         });
     });
+
     $routes->head('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']);
     $routes->get('feed.xml', 'Feed/$1', ['as' => 'podcast_feed']);
 });
+
+// Other pages
 $routes->get('/credits', 'Page::credits', ['as' => 'credits']);
 $routes->get('/(:slug)', 'Page/$1', ['as' => 'page']);
 
+// interacting as an actor
+$routes->post('interact-as-actor', 'Auth::attemptInteractAsActor', [
+    'as' => 'interact-as-actor',
+]);
+
 /**
+ * Overwriting ActivityPub routes file
+ */
+$routes->group('@(:podcastName)', function ($routes) {
+    $routes->post('notes/new', 'Note::attemptCreate/$1', [
+        'as' => 'note-attempt-create',
+        'filter' => 'permission:podcast-manage_publications',
+    ]);
+    // Note
+    $routes->group('notes/(:uuid)', function ($routes) {
+        $routes->get('/', 'Note/$1/$2', [
+            'as' => 'note',
+            'alternate-content' => [
+                'application/activity+json' => [
+                    'namespace' => 'ActivityPub\Controllers',
+                    'controller-method' => 'NoteController/$2',
+                ],
+                'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [
+                    'namespace' => 'ActivityPub\Controllers',
+                    'controller-method' => 'NoteController/$2',
+                ],
+            ],
+        ]);
+        $routes->get('replies', 'Note/$1/$2', [
+            'as' => 'note-replies',
+            'alternate-content' => [
+                'application/activity+json' => [
+                    'namespace' => 'ActivityPub\Controllers',
+                    'controller-method' => 'NoteController::replies/$2',
+                ],
+                'application/ld+json; profile="https://www.w3.org/ns/activitystreams' => [
+                    'namespace' => 'ActivityPub\Controllers',
+                    'controller-method' => 'NoteController::replies/$2',
+                ],
+            ],
+        ]);
+
+        // Actions
+        $routes->post('action', 'Note::attemptAction/$1/$2', [
+            'as' => 'note-attempt-action',
+            'filter' => 'permission:podcast-interact_as',
+        ]);
+
+        $routes->post('block-actor', 'Note::attemptBlockActor/$1/$2', [
+            'as' => 'note-attempt-block-actor',
+            'filter' => 'permission:fediverse-block_actors',
+        ]);
+        $routes->post('block-domain', 'Note::attemptBlockDomain/$1/$2', [
+            'as' => 'note-attempt-block-domain',
+            'filter' => 'permission:fediverse-block_domains',
+        ]);
+        $routes->post('delete', 'Note::attemptDelete/$1/$2', [
+            'as' => 'note-attempt-delete',
+            'filter' => 'permission:podcast-manage_publications',
+        ]);
+
+        $routes->get('remote/(:noteAction)', 'Note::remoteAction/$1/$2/$3', [
+            'as' => 'note-remote-action',
+        ]);
+    });
+
+    $routes->get('follow', 'Actor::follow/$1', [
+        'as' => 'follow',
+    ]);
+    $routes->get('outbox', 'Actor::outbox/$1', [
+        'as' => 'outbox',
+        'filter' => 'activity-pub:verify-activitystream',
+    ]);
+});
+
+/*
  * --------------------------------------------------------------------
  * Additional Routing
  * --------------------------------------------------------------------
  *
  * There will often be times that you need additional routing and you
- * need to it be able to override any defaults in this file. Environment
+ * need it to be able to override any defaults in this file. Environment
  * based routes is one such time. require() additional route files here
  * to make that happen.
  *
diff --git a/app/Config/Security.php b/app/Config/Security.php
new file mode 100644
index 0000000000..ba00bd0868
--- /dev/null
+++ b/app/Config/Security.php
@@ -0,0 +1,92 @@
+<?php
+
+namespace Config;
+
+use CodeIgniter\Config\BaseConfig;
+
+class Security extends BaseConfig
+{
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Token Name
+     * --------------------------------------------------------------------------
+     *
+     * Token name for Cross Site Request Forgery protection cookie.
+     *
+     * @var string
+     */
+    public $tokenName = 'csrf_test_name';
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Header Name
+     * --------------------------------------------------------------------------
+     *
+     * Token name for Cross Site Request Forgery protection cookie.
+     *
+     * @var string
+     */
+    public $headerName = 'X-CSRF-TOKEN';
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Cookie Name
+     * --------------------------------------------------------------------------
+     *
+     * Cookie name for Cross Site Request Forgery protection cookie.
+     *
+     * @var string
+     */
+    public $cookieName = 'csrf_cookie_name';
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Expires
+     * --------------------------------------------------------------------------
+     *
+     * Expiration time for Cross Site Request Forgery protection cookie.
+     *
+     * Defaults to two hours (in seconds).
+     *
+     * @var integer
+     */
+    public $expires = 7200;
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Regenerate
+     * --------------------------------------------------------------------------
+     *
+     * Regenerate CSRF Token on every request.
+     *
+     * @var boolean
+     */
+    public $regenerate = true;
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF Redirect
+     * --------------------------------------------------------------------------
+     *
+     * Redirect to previous page with error on failure.
+     *
+     * @var boolean
+     */
+    public $redirect = true;
+
+    /**
+     * --------------------------------------------------------------------------
+     * CSRF SameSite
+     * --------------------------------------------------------------------------
+     *
+     * Setting for CSRF SameSite cookie token.
+     *
+     * Allowed values are: None - Lax - Strict - ''.
+     *
+     * Defaults to `Lax` as recommended in this link:
+     * @see https://portswigger.net/web-security/csrf/samesite-cookies
+     *
+     * @var string 'Lax'|'None'|'Strict'
+     */
+    public $samesite = 'Lax';
+}
diff --git a/app/Config/Services.php b/app/Config/Services.php
index 27d601fae5..d6c711bdd5 100644
--- a/app/Config/Services.php
+++ b/app/Config/Services.php
@@ -2,17 +2,20 @@
 
 namespace Config;
 
-use CodeIgniter\Config\Services as CoreServices;
+use CodeIgniter\Config\BaseService;
 use CodeIgniter\Model;
 use App\Authorization\FlatAuthorization;
 use App\Authorization\PermissionModel;
 use App\Authorization\GroupModel;
 use App\Libraries\Breadcrumb;
+use App\Libraries\Negotiate;
+use App\Libraries\Router;
 use App\Models\UserModel;
+use CodeIgniter\HTTP\Request;
+use CodeIgniter\HTTP\RequestInterface;
+use CodeIgniter\Router\RouteCollectionInterface;
 use Myth\Auth\Models\LoginModel;
 
-require_once SYSTEMPATH . 'Config/Services.php';
-
 /**
  * Services Configuration file.
  *
@@ -26,8 +29,56 @@ require_once SYSTEMPATH . 'Config/Services.php';
  * method format you should use for your service methods. For more examples,
  * see the core Services file at system/Config/Services.php.
  */
-class Services extends CoreServices
+class Services extends BaseService
 {
+    /**
+     * The Router class uses a RouteCollection's array of routes, and determines
+     * the correct Controller and Method to execute.
+     *
+     * @param RouteCollectionInterface|null $routes
+     * @param Request|null                  $request
+     * @param boolean                       $getShared
+     *
+     * @return Router
+     */
+    public static function router(
+        RouteCollectionInterface $routes = null,
+        Request $request = null,
+        bool $getShared = true
+    ) {
+        if ($getShared) {
+            return static::getSharedInstance('router', $routes, $request);
+        }
+
+        $routes = $routes ?? static::routes();
+        $request = $request ?? static::request();
+
+        return new Router($routes, $request);
+    }
+
+    /**
+     * The Negotiate class provides the content negotiation features for
+     * working the request to determine correct language, encoding, charset,
+     * and more.
+     *
+     * @param RequestInterface|null $request
+     * @param boolean               $getShared
+     *
+     * @return Negotiate
+     */
+    public static function negotiator(
+        RequestInterface $request = null,
+        bool $getShared = true
+    ) {
+        if ($getShared) {
+            return static::getSharedInstance('negotiator', $request);
+        }
+
+        $request = $request ?? static::request();
+
+        return new Negotiate($request);
+    }
+
     public static function authentication(
         string $lib = 'local',
         Model $userModel = null,
@@ -39,7 +90,7 @@ class Services extends CoreServices
                 'authentication',
                 $lib,
                 $userModel,
-                $loginModel
+                $loginModel,
             );
         }
 
@@ -72,7 +123,7 @@ class Services extends CoreServices
                 'authorization',
                 $groupModel,
                 $permissionModel,
-                $userModel
+                $userModel,
             );
         }
 
diff --git a/app/Config/Toolbar.php b/app/Config/Toolbar.php
index d2b4082550..5d7596d92f 100644
--- a/app/Config/Toolbar.php
+++ b/app/Config/Toolbar.php
@@ -3,69 +3,85 @@
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Debug\Toolbar\Collectors\Database;
+use CodeIgniter\Debug\Toolbar\Collectors\Events;
+use CodeIgniter\Debug\Toolbar\Collectors\Files;
+use CodeIgniter\Debug\Toolbar\Collectors\Logs;
+use CodeIgniter\Debug\Toolbar\Collectors\Routes;
+use CodeIgniter\Debug\Toolbar\Collectors\Timers;
+use CodeIgniter\Debug\Toolbar\Collectors\Views;
 
+/**
+ * --------------------------------------------------------------------------
+ * Debug Toolbar
+ * --------------------------------------------------------------------------
+ *
+ * The Debug Toolbar provides a way to see information about the performance
+ * and state of your application during that page display. By default it will
+ * NOT be displayed under production environments, and will only display if
+ * `CI_DEBUG` is true, since if it's not, there's not much to display anyway.
+ */
 class Toolbar extends BaseConfig
 {
-    /*
-    |--------------------------------------------------------------------------
-    | Debug Toolbar
-    |--------------------------------------------------------------------------
-    | The Debug Toolbar provides a way to see information about the performance
-    | and state of your application during that page display. By default it will
-    | NOT be displayed under production environments, and will only display if
-    | CI_DEBUG is true, since if it's not, there's not much to display anyway.
-    |
-    | toolbarMaxHistory = Number of history files, 0 for none or -1 for unlimited
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Toolbar Collectors
+     * --------------------------------------------------------------------------
+     *
+     * List of toolbar collectors that will be called when Debug Toolbar
+     * fires up and collects data from.
+     *
+     * @var string[]
+     */
     public $collectors = [
-        \CodeIgniter\Debug\Toolbar\Collectors\Timers::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Database::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Logs::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Views::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Cache::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Files::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Routes::class,
-        \CodeIgniter\Debug\Toolbar\Collectors\Events::class,
-        \Myth\Auth\Collectors\Auth::class,
+        Timers::class,
+        Database::class,
+        Logs::class,
+        Views::class,
+        // Cache::class,
+        Files::class,
+        Routes::class,
+        Events::class,
     ];
 
-    /*
-    |--------------------------------------------------------------------------
-    | Max History
-    |--------------------------------------------------------------------------
-    | The Toolbar allows you to view recent requests that have been made to
-    | the application while the toolbar is active. This allows you to quickly
-    | view and compare multiple requests.
-    |
-    | $maxHistory sets a limit on the number of past requests that are stored,
-    | helping to conserve file space used to store them. You can set it to
-    | 0 (zero) to not have any history stored, or -1 for unlimited history.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Max History
+     * --------------------------------------------------------------------------
+     *
+     * `$maxHistory` sets a limit on the number of past requests that are stored,
+     * helping to conserve file space used to store them. You can set it to
+     * 0 (zero) to not have any history stored, or -1 for unlimited history.
+     *
+     * @var integer
+     */
     public $maxHistory = 20;
 
-    /*
-    |--------------------------------------------------------------------------
-    | Toolbar Views Path
-    |--------------------------------------------------------------------------
-    | The full path to the the views that are used by the toolbar.
-    | MUST have a trailing slash.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Toolbar Views Path
+     * --------------------------------------------------------------------------
+     *
+     * The full path to the the views that are used by the toolbar.
+     * This MUST have a trailing slash.
+     *
+     * @var string
+     */
     public $viewsPath = SYSTEMPATH . 'Debug/Toolbar/Views/';
 
-    /*
-    |--------------------------------------------------------------------------
-    | Max Queries
-    |--------------------------------------------------------------------------
-    | If the Database Collector is enabled, it will log every query that the
-    | the system generates so they can be displayed on the toolbar's timeline
-    | and in the query log. This can lead to memory issues in some instances
-    | with hundreds of queries.
-    |
-    | $maxQueries defines the maximum amount of queries that will be stored.
-    |
-    */
+    /**
+     * --------------------------------------------------------------------------
+     * Max Queries
+     * --------------------------------------------------------------------------
+     *
+     * If the Database Collector is enabled, it will log every query that the
+     * the system generates so they can be displayed on the toolbar's timeline
+     * and in the query log. This can lead to memory issues in some instances
+     * with hundreds of queries.
+     *
+     * `$maxQueries` defines the maximum amount of queries that will be stored.
+     *
+     * @var integer
+     */
     public $maxQueries = 100;
 }
diff --git a/app/Config/UserAgents.php b/app/Config/UserAgents.php
index fab20be24e..18ad6c41fa 100644
--- a/app/Config/UserAgents.php
+++ b/app/Config/UserAgents.php
@@ -1,20 +1,27 @@
 <?php
-
 namespace Config;
 
 use CodeIgniter\Config\BaseConfig;
 
+/**
+ * -------------------------------------------------------------------
+ * User Agents
+ * -------------------------------------------------------------------
+ *
+ * This file contains four arrays of user agent data. It is used by the
+ * User Agent Class to help identify browser, platform, robot, and
+ * mobile device data. The array keys are used to identify the device
+ * and the array values are used to set the actual name of the item.
+ */
 class UserAgents extends BaseConfig
 {
-    /*
-    | -------------------------------------------------------------------
-    | USER AGENT TYPES
-    | -------------------------------------------------------------------
-    | This file contains four arrays of user agent data. It is used by the
-    | User Agent Class to help identify browser, platform, robot, and
-    | mobile device data. The array keys are used to identify the device
-    | and the array values are used to set the actual name of the item.
-    */
+    /**
+     * -------------------------------------------------------------------
+     * OS Platforms
+     * -------------------------------------------------------------------
+     *
+     * @var array<string, string>
+     */
     public $platforms = [
         'windows nt 10.0' => 'Windows 10',
         'windows nt 6.3' => 'Windows 8.1',
@@ -60,12 +67,21 @@ class UserAgents extends BaseConfig
         'symbian' => 'Symbian OS',
     ];
 
-    // The order of this array should NOT be changed. Many browsers return
-    // multiple browser types so we want to identify the sub-type first.
+    /**
+     * -------------------------------------------------------------------
+     * Browsers
+     * -------------------------------------------------------------------
+     *
+     * The order of this array should NOT be changed. Many browsers return
+     * multiple browser types so we want to identify the subtype first.
+     *
+     * @var array<string, string>
+     */
     public $browsers = [
         'OPR' => 'Opera',
         'Flock' => 'Flock',
         'Edge' => 'Spartan',
+        'Edg' => 'Edge',
         'Chrome' => 'Chrome',
         // Opera 10+ always reports Opera/9.80 and appends Version/<real version> to the user agent string
         'Opera.*?Version' => 'Opera',
@@ -95,6 +111,13 @@ class UserAgents extends BaseConfig
         'Vivaldi' => 'Vivaldi',
     ];
 
+    /**
+     * -------------------------------------------------------------------
+     * Mobiles
+     * -------------------------------------------------------------------
+     *
+     * @var array<string, string>
+     */
     public $mobiles = [
         // legacy array, old values commented out
         'mobileexplorer' => 'Mobile Explorer',
@@ -195,7 +218,15 @@ class UserAgents extends BaseConfig
         'cellphone' => 'Generic Mobile',
     ];
 
-    // There are hundreds of bots but these are the most common.
+    /**
+     * -------------------------------------------------------------------
+     * Robots
+     * -------------------------------------------------------------------
+     *
+     * There are hundred of bots but these are the most common.
+     *
+     * @var array<string, string>
+     */
     public $robots = [
         'googlebot' => 'Googlebot',
         'msnbot' => 'MSNBot',
diff --git a/app/Config/Validation.php b/app/Config/Validation.php
index 8ebd77c485..0db23ed239 100644
--- a/app/Config/Validation.php
+++ b/app/Config/Validation.php
@@ -2,6 +2,14 @@
 
 namespace Config;
 
+use App\Validation\FileRules as AppFileRules;
+use App\Validation\Rules as AppRules;
+use CodeIgniter\Validation\CreditCardRules;
+use CodeIgniter\Validation\FileRules;
+use CodeIgniter\Validation\FormatRules;
+use CodeIgniter\Validation\Rules;
+use Myth\Auth\Authentication\Passwords\ValidationRules as PasswordRules;
+
 class Validation
 {
     //--------------------------------------------------------------------
@@ -12,22 +20,23 @@ class Validation
      * Stores the classes that contain the
      * rules that are available.
      *
-     * @var array
+     * @var string[]
      */
     public $ruleSets = [
-        \CodeIgniter\Validation\Rules::class,
-        \CodeIgniter\Validation\FormatRules::class,
-        \CodeIgniter\Validation\CreditCardRules::class,
-        \App\Validation\Rules::class,
-        \App\Validation\FileRules::class,
-        \Myth\Auth\Authentication\Passwords\ValidationRules::class,
+        Rules::class,
+        FormatRules::class,
+        FileRules::class,
+        CreditCardRules::class,
+        AppRules::class,
+        AppFileRules::class,
+        PasswordRules::class,
     ];
 
     /**
      * Specifies the views that are used to display the
      * errors.
      *
-     * @var array
+     * @var array<string, string>
      */
     public $templates = [
         'list' => 'CodeIgniter\Validation\Views\list',
diff --git a/app/Config/View.php b/app/Config/View.php
index ceec2776ae..7697cfc927 100644
--- a/app/Config/View.php
+++ b/app/Config/View.php
@@ -2,7 +2,9 @@
 
 namespace Config;
 
-class View extends \CodeIgniter\Config\View
+use CodeIgniter\Config\View as BaseView;
+
+class View extends BaseView
 {
     /**
      * When false, the view method will clear the data between each
@@ -11,6 +13,8 @@ class View extends \CodeIgniter\Config\View
      * to each view. You might prefer to have the data stick around between
      * calls so that it is available to all views. If that is the case,
      * set $saveData to true.
+     *
+     * @var boolean
      */
     public $saveData = true;
 
@@ -24,6 +28,8 @@ class View extends \CodeIgniter\Config\View
      * Examples:
      *  { title|esc(js) }
      *  { created_on|date(Y-m-d)|esc(attr) }
+     *
+     * @var array
      */
     public $filters = [];
 
@@ -31,6 +37,8 @@ class View extends \CodeIgniter\Config\View
      * Parser Plugins provide a way to extend the functionality provided
      * by the core Parser by creating aliases that will be replaced with
      * any callable. Can be single or tag pair.
+     *
+     * @var array
      */
     public $plugins = [];
 }
diff --git a/app/Controllers/Actor.php b/app/Controllers/Actor.php
new file mode 100644
index 0000000000..6c91eda9c9
--- /dev/null
+++ b/app/Controllers/Actor.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Controllers;
+
+class Actor extends \ActivityPub\Controllers\ActorController
+{
+    public function follow()
+    {
+        helper(['form', 'components', 'svg']);
+        $data = [
+            'actor' => $this->actor,
+        ];
+
+        return view('podcast/follow', $data);
+    }
+}
diff --git a/app/Controllers/Admin/BaseController.php b/app/Controllers/Admin/BaseController.php
index 6bc9ff8567..a349ac6f5c 100644
--- a/app/Controllers/Admin/BaseController.php
+++ b/app/Controllers/Admin/BaseController.php
@@ -2,6 +2,11 @@
 
 namespace App\Controllers\Admin;
 
+use CodeIgniter\Controller;
+use CodeIgniter\HTTP\RequestInterface;
+use CodeIgniter\HTTP\ResponseInterface;
+use Psr\Log\LoggerInterface;
+
 /**
  * Class BaseController
  *
@@ -11,12 +16,8 @@ namespace App\Controllers\Admin;
  *     class Home extends BaseController
  *
  * For security be sure to declare any new methods as protected or private.
- *
- * @package CodeIgniter
  */
 
-use CodeIgniter\Controller;
-
 class BaseController extends Controller
 {
     /**
@@ -30,11 +31,15 @@ class BaseController extends Controller
 
     /**
      * Constructor.
+     *
+     * @param RequestInterface  $request
+     * @param ResponseInterface $response
+     * @param LoggerInterface   $logger
      */
     public function initController(
-        \CodeIgniter\HTTP\RequestInterface $request,
-        \CodeIgniter\HTTP\ResponseInterface $response,
-        \Psr\Log\LoggerInterface $logger
+        RequestInterface $request,
+        ResponseInterface $response,
+        LoggerInterface $logger
     ) {
         // Do Not Edit This Line
         parent::initController($request, $response, $logger);
@@ -42,7 +47,6 @@ class BaseController extends Controller
         //--------------------------------------------------------------------
         // Preload any models, libraries, etc, here.
         //--------------------------------------------------------------------
-        // E.g.:
-        // $this->session = \Config\Services::session();
+        // E.g.: $this->session = \Config\Services::session();
     }
 }
diff --git a/app/Controllers/Admin/Episode.php b/app/Controllers/Admin/Episode.php
index 0ab9a8e55b..a2742d48f5 100644
--- a/app/Controllers/Admin/Episode.php
+++ b/app/Controllers/Admin/Episode.php
@@ -8,7 +8,9 @@
 
 namespace App\Controllers\Admin;
 
+use App\Entities\Note;
 use App\Models\EpisodeModel;
+use App\Models\NoteModel;
 use App\Models\PodcastModel;
 use App\Models\SoundbiteModel;
 use CodeIgniter\I18n\Time;
@@ -32,7 +34,11 @@ class Episode extends BaseController
 
     public function _remap($method, ...$params)
     {
-        $this->podcast = (new PodcastModel())->getPodcastById($params[0]);
+        if (
+            !($this->podcast = (new PodcastModel())->getPodcastById($params[0]))
+        ) {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
 
         if (count($params) > 1) {
             if (
@@ -107,7 +113,6 @@ class Episode extends BaseController
                 'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]',
             'transcript' => 'ext_in[transcript,txt,html,srt,json]',
             'chapters' => 'ext_in[chapters,json]',
-            'publication_date' => 'valid_date[Y-m-d H:i]|permit_empty',
         ];
 
         if (!$this->validate($rules)) {
@@ -117,7 +122,6 @@ class Episode extends BaseController
                 ->with('errors', $this->validator->getErrors());
         }
 
-        $publicationDate = $this->request->getPost('publication_date');
         $newEpisode = new \App\Entities\Episode([
             'podcast_id' => $this->podcast->id,
             'title' => $this->request->getPost('title'),
@@ -142,15 +146,9 @@ class Episode extends BaseController
             'type' => $this->request->getPost('type'),
             'is_blocked' => $this->request->getPost('block') == 'yes',
             'custom_rss_string' => $this->request->getPost('custom_rss'),
-            'created_by' => user(),
-            'updated_by' => user(),
-            'published_at' => $publicationDate
-                ? Time::createFromFormat(
-                    'Y-m-d H:i',
-                    $publicationDate,
-                    $this->request->getPost('client_timezone')
-                )->setTimezone('UTC')
-                : null,
+            'created_by' => user()->id,
+            'updated_by' => user()->id,
+            'published_at' => null,
         ]);
 
         $episodeModel = new EpisodeModel();
@@ -167,7 +165,7 @@ class Episode extends BaseController
 
         if ($this->podcast->hasChanged('episode_description_footer_markdown')) {
             $this->podcast->episode_description_footer_markdown = $this->request->getPost(
-                'description_footer'
+                'description_footer',
             );
 
             if (!$podcastModel->update($this->podcast->id, $this->podcast)) {
@@ -209,7 +207,6 @@ class Episode extends BaseController
                 'is_image[image]|ext_in[image,jpg,png]|min_dims[image,1400,1400]|is_image_squared[image]',
             'transcript' => 'ext_in[transcript,txt,html,srt,json]',
             'chapters' => 'ext_in[chapters,json]',
-            'publication_date' => 'valid_date[Y-m-d H:i]|permit_empty',
         ];
 
         if (!$this->validate($rules)) {
@@ -222,7 +219,7 @@ class Episode extends BaseController
         $this->episode->title = $this->request->getPost('title');
         $this->episode->slug = $this->request->getPost('slug');
         $this->episode->description_markdown = $this->request->getPost(
-            'description'
+            'description',
         );
         $this->episode->location = $this->request->getPost('location_name');
         $this->episode->parental_advisory =
@@ -238,19 +235,10 @@ class Episode extends BaseController
         $this->episode->type = $this->request->getPost('type');
         $this->episode->is_blocked = $this->request->getPost('block') == 'yes';
         $this->episode->custom_rss_string = $this->request->getPost(
-            'custom_rss'
+            'custom_rss',
         );
 
-        $publicationDate = $this->request->getPost('publication_date');
-        $this->episode->published_at = $publicationDate
-            ? Time::createFromFormat(
-                'Y-m-d H:i',
-                $publicationDate,
-                $this->request->getPost('client_timezone')
-            )->setTimezone('UTC')
-            : null;
-
-        $this->episode->updated_by = user();
+        $this->episode->updated_by = user()->id;
 
         $enclosure = $this->request->getFile('enclosure');
         if ($enclosure->isValid()) {
@@ -280,7 +268,7 @@ class Episode extends BaseController
 
         // update podcast's episode_description_footer_markdown if changed
         $this->podcast->episode_description_footer_markdown = $this->request->getPost(
-            'description_footer'
+            'description_footer',
         );
 
         if ($this->podcast->hasChanged('episode_description_footer_markdown')) {
@@ -333,6 +321,271 @@ class Episode extends BaseController
         return redirect()->back();
     }
 
+    public function publish()
+    {
+        if ($this->episode->publication_status === 'not_published') {
+            helper(['form']);
+
+            $data = [
+                'podcast' => $this->podcast,
+                'episode' => $this->episode,
+            ];
+
+            replace_breadcrumb_params([
+                0 => $this->podcast->title,
+                1 => $this->episode->title,
+            ]);
+            return view('admin/episode/publish', $data);
+        } else {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+    }
+
+    public function attemptPublish()
+    {
+        $rules = [
+            'publication_method' => 'required',
+            'scheduled_publication_date' =>
+                'valid_date[Y-m-d H:i]|permit_empty',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $db = \Config\Database::connect();
+        $db->transStart();
+
+        $newNote = new Note([
+            'actor_id' => $this->podcast->actor_id,
+            'episode_id' => $this->episode->id,
+            'message' => $this->request->getPost('message'),
+            'created_by' => user_id(),
+        ]);
+
+        $publishMethod = $this->request->getPost('publication_method');
+        if ($publishMethod === 'schedule') {
+            $scheduledPublicationDate = $this->request->getPost(
+                'scheduled_publication_date',
+            );
+            if ($scheduledPublicationDate) {
+                $scheduledDateUTC = Time::createFromFormat(
+                    'Y-m-d H:i',
+                    $scheduledPublicationDate,
+                    $this->request->getPost('client_timezone'),
+                )->setTimezone('UTC');
+                $this->episode->published_at = $scheduledDateUTC;
+                $newNote->published_at = $scheduledDateUTC;
+            } else {
+                $db->transRollback();
+                return redirect()
+                    ->back()
+                    ->withInput()
+                    ->with('error', 'Schedule date must be set!');
+            }
+        } else {
+            $dateNow = Time::now();
+            $this->episode->published_at = $dateNow;
+            $newNote->published_at = $dateNow;
+        }
+
+        $noteModel = new NoteModel();
+        if (!$noteModel->addNote($newNote)) {
+            $db->transRollback();
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $noteModel->errors());
+        }
+
+        $episodeModel = new EpisodeModel();
+        if (!$episodeModel->update($this->episode->id, $this->episode)) {
+            $db->transRollback();
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $episodeModel->errors());
+        }
+
+        $db->transComplete();
+
+        return redirect()->route('episode-view', [
+            $this->podcast->id,
+            $this->episode->id,
+        ]);
+    }
+
+    public function publishEdit()
+    {
+        if ($this->episode->publication_status === 'scheduled') {
+            helper(['form']);
+
+            $data = [
+                'podcast' => $this->podcast,
+                'episode' => $this->episode,
+                'note' => (new NoteModel())
+                    ->where([
+                        'actor_id' => $this->podcast->actor_id,
+                        'episode_id' => $this->episode->id,
+                    ])
+                    ->first(),
+            ];
+
+            replace_breadcrumb_params([
+                0 => $this->podcast->title,
+                1 => $this->episode->title,
+            ]);
+            return view('admin/episode/publish_edit', $data);
+        } else {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+    }
+
+    public function attemptPublishEdit()
+    {
+        $rules = [
+            'note_id' => 'required',
+            'publication_method' => 'required',
+            'scheduled_publication_date' =>
+                'valid_date[Y-m-d H:i]|permit_empty',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $db = \Config\Database::connect();
+        $db->transStart();
+
+        $note = (new NoteModel())->getNoteById(
+            $this->request->getPost('note_id'),
+        );
+        $note->message = $this->request->getPost('message');
+
+        $publishMethod = $this->request->getPost('publication_method');
+        if ($publishMethod === 'schedule') {
+            $scheduledPublicationDate = $this->request->getPost(
+                'scheduled_publication_date',
+            );
+            if ($scheduledPublicationDate) {
+                $scheduledDateUTC = Time::createFromFormat(
+                    'Y-m-d H:i',
+                    $scheduledPublicationDate,
+                    $this->request->getPost('client_timezone'),
+                )->setTimezone('UTC');
+                $this->episode->published_at = $scheduledDateUTC;
+                $note->published_at = $scheduledDateUTC;
+            } else {
+                $db->transRollback();
+                return redirect()
+                    ->back()
+                    ->withInput()
+                    ->with('error', 'Schedule date must be set!');
+            }
+        } else {
+            $dateNow = Time::now();
+            $this->episode->published_at = $dateNow;
+            $note->published_at = $dateNow;
+        }
+
+        $noteModel = new NoteModel();
+        if (!$noteModel->editNote($note)) {
+            $db->transRollback();
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $noteModel->errors());
+        }
+
+        $episodeModel = new EpisodeModel();
+        if (!$episodeModel->update($this->episode->id, $this->episode)) {
+            $db->transRollback();
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $episodeModel->errors());
+        }
+
+        $db->transComplete();
+
+        return redirect()->route('episode-view', [
+            $this->podcast->id,
+            $this->episode->id,
+        ]);
+    }
+
+    public function unpublish()
+    {
+        if ($this->episode->publication_status === 'published') {
+            helper(['form']);
+
+            $data = [
+                'podcast' => $this->podcast,
+                'episode' => $this->episode,
+            ];
+
+            replace_breadcrumb_params([
+                0 => $this->podcast->title,
+                1 => $this->episode->title,
+            ]);
+            return view('admin/episode/unpublish', $data);
+        } else {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+    }
+
+    public function attemptUnpublish()
+    {
+        $rules = [
+            'understand' => 'required',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $db = \Config\Database::connect();
+
+        $db->transStart();
+
+        $allNotesLinkedToEpisode = (new NoteModel())
+            ->where([
+                'episode_id' => $this->episode->id,
+            ])
+            ->findAll();
+        foreach ($allNotesLinkedToEpisode as $note) {
+            (new NoteModel())->removeNote($note);
+        }
+
+        // set episode published_at to null to unpublish
+        $this->episode->published_at = null;
+
+        $episodeModel = new EpisodeModel();
+        if (!$episodeModel->update($this->episode->id, $this->episode)) {
+            $db->transRollback();
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $episodeModel->errors());
+        }
+
+        $db->transComplete();
+
+        return redirect()->route('episode-view', [
+            $this->podcast->id,
+            $this->episode->id,
+        ]);
+    }
+
     public function delete()
     {
         (new EpisodeModel())->delete($this->episode->id);
@@ -416,7 +669,7 @@ class Episode extends BaseController
         (new SoundbiteModel())->deleteSoundbite(
             $this->podcast->id,
             $this->episode->id,
-            $soundbiteId
+            $soundbiteId,
         );
 
         return redirect()->route('soundbites-edit', [
diff --git a/app/Controllers/Admin/Fediverse.php b/app/Controllers/Admin/Fediverse.php
new file mode 100644
index 0000000000..184a52ff26
--- /dev/null
+++ b/app/Controllers/Admin/Fediverse.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Controllers\Admin;
+
+use ActivityPub\Models\BlockedDomainModel;
+
+class Fediverse extends BaseController
+{
+    public function dashboard()
+    {
+        return view('admin/fediverse/dashboard');
+    }
+
+    public function blockedActors()
+    {
+        helper(['form']);
+
+        $blockedActors = model('ActorModel')->getBlockedActors();
+
+        return view('admin/fediverse/blocked_actors', [
+            'blockedActors' => $blockedActors,
+        ]);
+    }
+
+    public function blockedDomains()
+    {
+        helper(['form']);
+
+        $blockedDomains = model('BlockedDomainModel')->getBlockedDomains();
+
+        return view('admin/fediverse/blocked_domains', [
+            'blockedDomains' => $blockedDomains,
+        ]);
+    }
+}
diff --git a/app/Controllers/Admin/Person.php b/app/Controllers/Admin/Person.php
index f78631ff5e..f3dea00e4b 100644
--- a/app/Controllers/Admin/Person.php
+++ b/app/Controllers/Admin/Person.php
@@ -125,7 +125,7 @@ class Person extends BaseController
             $this->person->image = $image;
         }
 
-        $this->updated_by = user();
+        $this->updated_by = user()->id;
 
         $personModel = new PersonModel();
         if (!$personModel->update($this->person->id, $this->person)) {
diff --git a/app/Controllers/Admin/Podcast.php b/app/Controllers/Admin/Podcast.php
index 22a5b79e9c..fcd7550006 100644
--- a/app/Controllers/Admin/Podcast.php
+++ b/app/Controllers/Admin/Podcast.php
@@ -26,7 +26,7 @@ class Podcast extends BaseController
         if (count($params) > 0) {
             if (
                 !($this->podcast = (new PodcastModel())->getPodcastById(
-                    $params[0]
+                    $params[0],
                 ))
             ) {
                 throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
@@ -124,7 +124,7 @@ class Podcast extends BaseController
             'languageOptions' => $languageOptions,
             'categoryOptions' => $categoryOptions,
             'browserLang' => get_browser_language(
-                $this->request->getServer('HTTP_ACCEPT_LANGUAGE')
+                $this->request->getServer('HTTP_ACCEPT_LANGUAGE'),
             ),
         ];
 
@@ -170,8 +170,8 @@ class Podcast extends BaseController
             'is_blocked' => $this->request->getPost('block') === 'yes',
             'is_completed' => $this->request->getPost('complete') === 'yes',
             'is_locked' => $this->request->getPost('lock') === 'yes',
-            'created_by' => user(),
-            'updated_by' => user(),
+            'created_by' => user()->id,
+            'updated_by' => user()->id,
         ]);
 
         $podcastModel = new PodcastModel();
@@ -193,15 +193,19 @@ class Podcast extends BaseController
         $podcastModel->addPodcastContributor(
             user()->id,
             $newPodcastId,
-            $podcastAdminGroup->id
+            $podcastAdminGroup->id,
         );
 
         // set Podcast categories
         (new CategoryModel())->setPodcastCategories(
             $newPodcastId,
-            $this->request->getPost('other_categories')
+            $this->request->getPost('other_categories'),
         );
 
+        // set interact as the newly created podcast actor
+        $createdPodcast = (new PodcastModel())->getPodcastById($newPodcastId);
+        set_interact_as_actor($createdPodcast->actor_id);
+
         $db->transComplete();
 
         return redirect()->route('podcast-view', [$newPodcastId]);
@@ -239,9 +243,8 @@ class Podcast extends BaseController
         }
 
         $this->podcast->title = $this->request->getPost('title');
-        $this->podcast->name = $this->request->getPost('name');
         $this->podcast->description_markdown = $this->request->getPost(
-            'description'
+            'description',
         );
 
         $image = $this->request->getFile('image');
@@ -261,10 +264,10 @@ class Podcast extends BaseController
         $this->podcast->copyright = $this->request->getPost('copyright');
         $this->podcast->location = $this->request->getPost('location_name');
         $this->podcast->payment_pointer = $this->request->getPost(
-            'payment_pointer'
+            'payment_pointer',
         );
         $this->podcast->custom_rss_string = $this->request->getPost(
-            'custom_rss'
+            'custom_rss',
         );
         $this->podcast->partner_id = $this->request->getPost('partner_id');
         $this->podcast->partner_link_url = $this->request->getPost(
@@ -277,7 +280,7 @@ class Podcast extends BaseController
         $this->podcast->is_completed =
             $this->request->getPost('complete') === 'yes';
         $this->podcast->is_locked = $this->request->getPost('lock') === 'yes';
-        $this->updated_by = user();
+        $this->updated_by = user()->id;
 
         $db = \Config\Database::connect();
         $db->transStart();
@@ -294,7 +297,7 @@ class Podcast extends BaseController
         // set Podcast categories
         (new CategoryModel())->setPodcastCategories(
             $this->podcast->id,
-            $this->request->getPost('other_categories')
+            $this->request->getPost('other_categories'),
         );
 
         $db->transComplete();
diff --git a/app/Controllers/Admin/PodcastImport.php b/app/Controllers/Admin/PodcastImport.php
index cfea7a4397..daad6c4234 100644
--- a/app/Controllers/Admin/PodcastImport.php
+++ b/app/Controllers/Admin/PodcastImport.php
@@ -31,7 +31,7 @@ class PodcastImport extends BaseController
         if (count($params) > 0) {
             if (
                 !($this->podcast = (new PodcastModel())->getPodcastById(
-                    $params[0]
+                    $params[0],
                 ))
             ) {
                 throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
@@ -52,7 +52,7 @@ class PodcastImport extends BaseController
             'languageOptions' => $languageOptions,
             'categoryOptions' => $categoryOptions,
             'browserLang' => get_browser_language(
-                $this->request->getServer('HTTP_ACCEPT_LANGUAGE')
+                $this->request->getServer('HTTP_ACCEPT_LANGUAGE'),
             ),
         ];
 
@@ -78,7 +78,7 @@ class PodcastImport extends BaseController
         try {
             ini_set('user_agent', 'Castopod/' . CP_VERSION);
             $feed = simplexml_load_file(
-                $this->request->getPost('imported_feed_url')
+                $this->request->getPost('imported_feed_url'),
             );
         } catch (\ErrorException $ex) {
             return redirect()
@@ -94,13 +94,13 @@ class PodcastImport extends BaseController
                 ]);
         }
         $nsItunes = $feed->channel[0]->children(
-            'http://www.itunes.com/dtds/podcast-1.0.dtd'
+            'http://www.itunes.com/dtds/podcast-1.0.dtd',
         );
         $nsPodcast = $feed->channel[0]->children(
-            'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md'
+            'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md',
         );
         $nsContent = $feed->channel[0]->children(
-            'http://purl.org/rss/1.0/modules/content/'
+            'http://purl.org/rss/1.0/modules/content/',
         );
 
         if ((string) $nsPodcast->locked === 'yes') {
@@ -112,28 +112,30 @@ class PodcastImport extends BaseController
 
         $converter = new HtmlConverter();
 
-        $channelDescriptionHtml = $feed->channel[0]->description;
+        $channelDescriptionHtml = (string) $feed->channel[0]->description;
 
         try {
             $podcast = new \App\Entities\Podcast([
                 'name' => $this->request->getPost('name'),
                 'imported_feed_url' => $this->request->getPost(
-                    'imported_feed_url'
+                    'imported_feed_url',
                 ),
                 'new_feed_url' => base_url(
-                    route_to('podcast_feed', $this->request->getPost('name'))
+                    route_to('podcast_feed', $this->request->getPost('name')),
                 ),
-                'title' => $feed->channel[0]->title,
+                'title' => (string) $feed->channel[0]->title,
                 'description_markdown' => $converter->convert(
-                    $channelDescriptionHtml
+                    $channelDescriptionHtml,
                 ),
                 'description_html' => $channelDescriptionHtml,
                 'image' =>
                     $nsItunes->image && !empty($nsItunes->image->attributes())
-                        ? download_file($nsItunes->image->attributes())
+                        ? download_file((string) $nsItunes->image->attributes())
                         : ($feed->channel[0]->image &&
                         !empty($feed->channel[0]->image->url)
-                            ? download_file($feed->channel[0]->image->url)
+                            ? download_file(
+                                (string) $feed->channel[0]->image->url,
+                            )
                             : null),
                 'language_code' => $this->request->getPost('language'),
                 'category_id' => $this->request->getPost('category'),
@@ -144,11 +146,11 @@ class PodcastImport extends BaseController
                         : (in_array($nsItunes->explicit, ['no', 'false'])
                             ? 'clean'
                             : null)),
-                'owner_name' => $nsItunes->owner->name,
-                'owner_email' => $nsItunes->owner->email,
-                'publisher' => $nsItunes->author,
+                'owner_name' => (string) $nsItunes->owner->name,
+                'owner_email' => (string) $nsItunes->owner->email,
+                'publisher' => (string) $nsItunes->author,
                 'type' => empty($nsItunes->type) ? 'episodic' : $nsItunes->type,
-                'copyright' => $feed->channel[0]->copyright,
+                'copyright' => (string) $feed->channel[0]->copyright,
                 'is_blocked' => empty($nsItunes->block)
                     ? false
                     : $nsItunes->block === 'yes',
@@ -157,19 +159,19 @@ class PodcastImport extends BaseController
                     : $nsItunes->complete === 'yes',
                 'location_name' => !$nsPodcast->location
                     ? null
-                    : $nsPodcast->location,
+                    : (string) $nsPodcast->location,
                 'location_geo' =>
                     !$nsPodcast->location ||
                     empty($nsPodcast->location->attributes()['geo'])
                         ? null
-                        : $nsPodcast->location->attributes()['geo'],
+                        : (string) $nsPodcast->location->attributes()['geo'],
                 'location_osmid' =>
                     !$nsPodcast->location ||
                     empty($nsPodcast->location->attributes()['osm'])
                         ? null
-                        : $nsPodcast->location->attributes()['osm'],
-                'created_by' => user(),
-                'updated_by' => user(),
+                        : (string) $nsPodcast->location->attributes()['osm'],
+                'created_by' => user()->id,
+                'updated_by' => user()->id,
             ]);
         } catch (\ErrorException $ex) {
             return redirect()
@@ -204,7 +206,7 @@ class PodcastImport extends BaseController
         $podcastModel->addPodcastContributor(
             user()->id,
             $newPodcastId,
-            $podcastAdminGroup->id
+            $podcastAdminGroup->id,
         );
 
         $podcastsPlatformsData = [];
@@ -218,34 +220,21 @@ class PodcastImport extends BaseController
             foreach ($platformType['elements'] as $platform) {
                 $platformLabel = $platform->attributes()['platform'];
                 $platformSlug = slugify($platformLabel);
-                if (!$platformModel->getPlatform($platformSlug)) {
-                    if (
-                        !$platformModel->createPlatform(
-                            $platformSlug,
-                            $platformType['name'],
-                            $platformLabel,
-                            ''
-                        )
-                    ) {
-                        return redirect()
-                            ->back()
-                            ->withInput()
-                            ->with('errors', $platformModel->errors());
-                    }
+                if ($platformModel->getPlatform($platformSlug)) {
+                    array_push($podcastsPlatformsData, [
+                        'platform_slug' => $platformSlug,
+                        'podcast_id' => $newPodcastId,
+                        'link_url' => $platform->attributes()['url'],
+                        'link_content' => $platform->attributes()['id'],
+                        'is_visible' => false,
+                    ]);
                 }
-                array_push($podcastsPlatformsData, [
-                    'platform_slug' => $platformSlug,
-                    'podcast_id' => $newPodcastId,
-                    'link_url' => $platform->attributes()['url'],
-                    'link_content' => $platform->attributes()['id'],
-                    'is_visible' => false,
-                ]);
             }
         }
         if (count($podcastsPlatformsData) > 1) {
             $platformModel->createPodcastPlatforms(
                 $newPodcastId,
-                $podcastsPlatformsData
+                $podcastsPlatformsData,
             );
         }
 
@@ -259,7 +248,7 @@ class PodcastImport extends BaseController
                     !($newPersonId = $personModel->createPerson(
                         $podcastPerson,
                         $podcastPerson->attributes()['href'],
-                        $podcastPerson->attributes()['img']
+                        $podcastPerson->attributes()['img'],
                     ))
                 ) {
                     return redirect()
@@ -312,19 +301,19 @@ class PodcastImport extends BaseController
             $item = $feed->channel[0]->item[$numberItems - $itemNumber];
 
             $nsItunes = $item->children(
-                'http://www.itunes.com/dtds/podcast-1.0.dtd'
+                'http://www.itunes.com/dtds/podcast-1.0.dtd',
             );
             $nsPodcast = $item->children(
-                'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md'
+                'https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md',
             );
             $nsContent = $item->children(
-                'http://purl.org/rss/1.0/modules/content/'
+                'http://purl.org/rss/1.0/modules/content/',
             );
 
             $slug = slugify(
                 $this->request->getPost('slug_field') === 'title'
                     ? $item->title
-                    : basename($item->link)
+                    : basename($item->link),
             );
             if (in_array($slug, $slugs)) {
                 $slugNumber = 2;
@@ -358,13 +347,15 @@ class PodcastImport extends BaseController
                 'slug' => $slug,
                 'enclosure' => download_file($item->enclosure->attributes()),
                 'description_markdown' => $converter->convert(
-                    $itemDescriptionHtml
+                    $itemDescriptionHtml,
                 ),
                 'description_html' => $itemDescriptionHtml,
                 'image' =>
                     !$nsItunes->image || empty($nsItunes->image->attributes())
                         ? null
-                        : download_file($nsItunes->image->attributes()),
+                        : download_file(
+                            (string) $nsItunes->image->attributes(),
+                        ),
                 'parental_advisory' => empty($nsItunes->explicit)
                     ? null
                     : (in_array($nsItunes->explicit, ['yes', 'true'])
@@ -404,8 +395,8 @@ class PodcastImport extends BaseController
                     empty($nsPodcast->location->attributes()['osm'])
                         ? null
                         : $nsPodcast->location->attributes()['osm'],
-                'created_by' => user(),
-                'updated_by' => user(),
+                'created_by' => user()->id,
+                'updated_by' => user()->id,
                 'published_at' => strtotime($item->pubDate),
             ]);
 
@@ -429,7 +420,7 @@ class PodcastImport extends BaseController
                         !($newPersonId = $personModel->createPerson(
                             $episodePerson,
                             $episodePerson->attributes()['href'],
-                            $episodePerson->attributes()['img']
+                            $episodePerson->attributes()['img'],
                         ))
                     ) {
                         return redirect()
@@ -458,8 +449,8 @@ class PodcastImport extends BaseController
                     'person_group' => $personGroup['slug'],
                     'person_role' => $personRole['slug'],
                 ]);
-                $episodePersonModel = new EpisodePersonModel();
 
+                $episodePersonModel = new EpisodePersonModel();
                 if (!$episodePersonModel->insert($newEpisodePerson)) {
                     return redirect()
                         ->back()
@@ -469,6 +460,10 @@ class PodcastImport extends BaseController
             }
         }
 
+        // set interact as the newly imported podcast actor
+        $importedPodcast = (new PodcastModel())->getPodcastById($newPodcastId);
+        set_interact_as_actor($importedPodcast->actor_id);
+
         $db->transComplete();
 
         return redirect()->route('podcast-view', [$newPodcastId]);
diff --git a/app/Controllers/Auth.php b/app/Controllers/Auth.php
index 1a36daf16f..6dc477542d 100644
--- a/app/Controllers/Auth.php
+++ b/app/Controllers/Auth.php
@@ -55,7 +55,7 @@ class Auth extends \Myth\Auth\Controllers\AuthController
         $allowedPostFields = array_merge(
             ['password'],
             $this->config->validFields,
-            $this->config->personalFields
+            $this->config->personalFields,
         );
         $user = new User($this->request->getPost($allowedPostFields));
 
@@ -85,7 +85,7 @@ class Auth extends \Myth\Auth\Controllers\AuthController
                     ->withInput()
                     ->with(
                         'error',
-                        $activator->error() ?? lang('Auth.unknownError')
+                        $activator->error() ?? lang('Auth.unknownError'),
                     );
             }
 
@@ -122,7 +122,7 @@ class Auth extends \Myth\Auth\Controllers\AuthController
             $this->request->getPost('email'),
             $this->request->getPost('token'),
             $this->request->getIPAddress(),
-            (string) $this->request->getUserAgent()
+            (string) $this->request->getUserAgent(),
         );
 
         $rules = [
@@ -172,4 +172,24 @@ class Auth extends \Myth\Auth\Controllers\AuthController
             ->route('login')
             ->with('message', lang('Auth.resetSuccess'));
     }
+
+    public function attemptInteractAsActor()
+    {
+        $rules = [
+            'actor_id' => 'required|numeric',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', service('validation')->getErrors());
+        }
+
+        helper('auth');
+
+        set_interact_as_actor($this->request->getPost('actor_id'));
+
+        return redirect()->back();
+    }
 }
diff --git a/app/Controllers/BaseController.php b/app/Controllers/BaseController.php
index ab249c803d..126b71009d 100644
--- a/app/Controllers/BaseController.php
+++ b/app/Controllers/BaseController.php
@@ -1,5 +1,12 @@
 <?php
 
+namespace App\Controllers;
+
+use CodeIgniter\Controller;
+use CodeIgniter\HTTP\RequestInterface;
+use CodeIgniter\HTTP\ResponseInterface;
+use Psr\Log\LoggerInterface;
+
 /**
  * Class BaseController
  *
@@ -9,14 +16,7 @@
  *     class Home extends BaseController
  *
  * For security be sure to declare any new methods as protected or private.
- *
- * @package CodeIgniter
  */
-
-namespace App\Controllers;
-
-use CodeIgniter\Controller;
-
 class BaseController extends Controller
 {
     /**
@@ -26,15 +26,19 @@ class BaseController extends Controller
      *
      * @var array
      */
-    protected $helpers = ['analytics', 'svg', 'components', 'misc'];
+    protected $helpers = ['auth', 'analytics', 'svg', 'components', 'misc'];
 
     /**
      * Constructor.
+     *
+     * @param RequestInterface  $request
+     * @param ResponseInterface $response
+     * @param LoggerInterface   $logger
      */
     public function initController(
-        \CodeIgniter\HTTP\RequestInterface $request,
-        \CodeIgniter\HTTP\ResponseInterface $response,
-        \Psr\Log\LoggerInterface $logger
+        RequestInterface $request,
+        ResponseInterface $response,
+        LoggerInterface $logger
     ) {
         // Do Not Edit This Line
         parent::initController($request, $response, $logger);
@@ -42,8 +46,7 @@ class BaseController extends Controller
         //--------------------------------------------------------------------
         // Preload any models, libraries, etc, here.
         //--------------------------------------------------------------------
-        // E.g.:
-        // $this->session = \Config\Services::session();
+        // E.g.: $this->session = \Config\Services::session();
 
         set_user_session_deny_list_ip();
         set_user_session_browser();
diff --git a/app/Controllers/Episode.php b/app/Controllers/Episode.php
index a4a8ce2102..31eee58fa0 100644
--- a/app/Controllers/Episode.php
+++ b/app/Controllers/Episode.php
@@ -10,6 +10,7 @@ namespace App\Controllers;
 
 use App\Models\EpisodeModel;
 use App\Models\PodcastModel;
+use SimpleXMLElement;
 
 class Episode extends BaseController
 {
@@ -31,7 +32,7 @@ class Episode extends BaseController
             count($params) > 1 &&
             !($this->episode = (new EpisodeModel())->getEpisodeBySlug(
                 $this->podcast->id,
-                $params[1]
+                $params[1],
             ))
         ) {
             throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
@@ -43,44 +44,49 @@ class Episode extends BaseController
 
     public function index()
     {
-        self::triggerWebpageHit($this->episode->podcast_id);
+        $episodeModel = new EpisodeModel();
+
+        self::triggerWebpageHit($this->podcast->id);
 
         $locale = service('request')->getLocale();
         $cacheName = "page_podcast{$this->episode->podcast_id}_episode{$this->episode->id}_{$locale}";
 
         if (!($cachedView = cache($cacheName))) {
-            $episodeModel = new EpisodeModel();
-            $previousNextEpisodes = $episodeModel->getPreviousNextEpisodes(
-                $this->episode,
-                $this->podcast->type
-            );
-
-            helper(['persons']);
-            $persons = [];
-            construct_episode_person_array(
-                $this->episode->episode_persons,
-                $persons
-            );
+            helper('persons');
+            $episodePersons = [];
+            construct_person_array($this->episode->persons, $episodePersons);
+            $podcastPersons = [];
+            construct_person_array($this->podcast->persons, $podcastPersons);
 
             $data = [
-                'previousEpisode' => $previousNextEpisodes['previous'],
-                'nextEpisode' => $previousNextEpisodes['next'],
                 'podcast' => $this->podcast,
                 'episode' => $this->episode,
-                'persons' => $persons,
+                'episodePersons' => $episodePersons,
+                'persons' => $podcastPersons,
             ];
 
             $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode(
-                $this->podcast->id
+                $this->podcast->id,
             );
 
-            // The page cache is set to a decade so it is deleted manually upon podcast update
-            return view('episode', $data, [
-                'cache' => $secondsToNextUnpublishedEpisode
-                    ? $secondsToNextUnpublishedEpisode
-                    : DECADE,
-                'cache_name' => $cacheName,
-            ]);
+            if (can_user_interact()) {
+                helper('form');
+                // The page cache is set to a decade so it is deleted manually upon podcast update
+                return view('podcast/episode_authenticated', $data, [
+                    'cache' => $secondsToNextUnpublishedEpisode
+                        ? $secondsToNextUnpublishedEpisode
+                        : DECADE,
+                    'cache_name' => $cacheName . '_authenticated',
+                ]);
+            } else {
+                // The page cache is set to a decade so it is deleted manually upon podcast update
+                return view('podcast/episode', $data, [
+                    'cache' => $secondsToNextUnpublishedEpisode
+                        ? $secondsToNextUnpublishedEpisode
+                        : DECADE,
+                    'cache_name' => $cacheName,
+                ]);
+            }
         }
 
         return $cachedView;
@@ -97,7 +103,7 @@ class Episode extends BaseController
         if (isset($_SERVER['HTTP_REFERER'])) {
             $session->set(
                 'embeddable_player_domain',
-                parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)
+                parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST),
             );
         }
 
@@ -108,26 +114,15 @@ class Episode extends BaseController
         if (!($cachedView = cache($cacheName))) {
             $episodeModel = new EpisodeModel();
             $theme = EpisodeModel::$themes[$theme];
-            helper(['persons']);
-            $persons = [];
-            construct_episode_person_array(
-                $this->episode->episode_persons,
-                $persons
-            );
-            constructs_podcast_person_array(
-                $this->podcast->podcast_persons,
-                $persons
-            );
 
             $data = [
                 'podcast' => $this->podcast,
                 'episode' => $this->episode,
-                'persons' => $persons,
                 'theme' => $theme,
             ];
 
             $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode(
-                $this->podcast->id
+                $this->podcast->id,
             );
 
             // The page cache is set to a decade so it is deleted manually upon podcast update
@@ -141,4 +136,56 @@ class Episode extends BaseController
 
         return $cachedView;
     }
+
+    public function oembedJSON()
+    {
+        return $this->response->setJSON([
+            'type' => 'rich',
+            'version' => '1.0',
+            'title' => $this->episode->title,
+            'provider_name' => $this->podcast->title,
+            'provider_url' => $this->podcast->link,
+            'author_name' => $this->podcast->title,
+            'author_url' => $this->podcast->link,
+            'html' =>
+                '<iframe src="' .
+                $this->episode->embeddable_player .
+                '" width="100%" height="200" frameborder="0" scrolling="no"></iframe>',
+            'width' => 600,
+            'height' => 200,
+            'thumbnail_url' => $this->episode->image->large_url,
+            'thumbnail_width' => config('Images')->largeSize,
+            'thumbnail_height' => config('Images')->largeSize,
+        ]);
+    }
+
+    public function oembedXML()
+    {
+        $oembed = new SimpleXMLElement(
+            "<?xml version='1.0' encoding='utf-8' standalone='yes'?><oembed></oembed>",
+        );
+
+        $oembed->addChild('type', 'rich');
+        $oembed->addChild('version', '1.0');
+        $oembed->addChild('title', $this->episode->title);
+        $oembed->addChild('provider_name', $this->podcast->title);
+        $oembed->addChild('provider_url', $this->podcast->link);
+        $oembed->addChild('author_name', $this->podcast->title);
+        $oembed->addChild('author_url', $this->podcast->link);
+        $oembed->addChild('thumbnail', $this->episode->image->large_url);
+        $oembed->addChild('thumbnail_width', config('Images')->largeSize);
+        $oembed->addChild('thumbnail_height', config('Images')->largeSize);
+        $oembed->addChild(
+            'html',
+            htmlentities(
+                '<iframe src="' .
+                    $this->episode->embeddable_player .
+                    '" width="100%" height="200" frameborder="0" scrolling="no"></iframe>',
+            ),
+        );
+        $oembed->addChild('width', 600);
+        $oembed->addChild('height', 200);
+
+        return $this->response->setXML($oembed);
+    }
 }
diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php
index 7f8aad52b6..ef8b0bb00e 100644
--- a/app/Controllers/Home.php
+++ b/app/Controllers/Home.php
@@ -20,7 +20,9 @@ class Home extends BaseController
 
         // check if there's only one podcast to redirect user to it
         if (count($allPodcasts) == 1) {
-            return redirect()->route('podcast', [$allPodcasts[0]->name]);
+            return redirect()->route('podcast-activity', [
+                $allPodcasts[0]->name,
+            ]);
         }
 
         // default behavior: list all podcasts on home page
diff --git a/app/Controllers/Install.php b/app/Controllers/Install.php
index 1d53f7247f..d612b9194c 100644
--- a/app/Controllers/Install.php
+++ b/app/Controllers/Install.php
@@ -257,6 +257,7 @@ class Install extends Controller
         $migrations = \Config\Services::migrations();
 
         !$migrations->setNamespace('Myth\Auth')->latest();
+        !$migrations->setNamespace('ActivityPub')->latest();
         !$migrations->setNamespace(APP_NAMESPACE)->latest();
     }
 
diff --git a/app/Controllers/Note.php b/app/Controllers/Note.php
new file mode 100644
index 0000000000..c685a690e0
--- /dev/null
+++ b/app/Controllers/Note.php
@@ -0,0 +1,212 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Controllers;
+
+use App\Models\EpisodeModel;
+use App\Models\PodcastModel;
+use CodeIgniter\HTTP\URI;
+use CodeIgniter\I18n\Time;
+
+class Note extends \ActivityPub\Controllers\NoteController
+{
+    /**
+     * @var \App\Entities\Podcast
+     */
+    protected $podcast;
+
+    protected $helpers = ['auth', 'activitypub', 'svg', 'components', 'misc'];
+
+    public function _remap($method, ...$params)
+    {
+        if (
+            !($this->podcast = (new PodcastModel())->getPodcastByName(
+                $params[0],
+            ))
+        ) {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+
+        $this->actor = $this->podcast->actor;
+
+        if (count($params) > 1) {
+            if (!($this->note = model('NoteModel')->getNoteById($params[1]))) {
+                throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+            }
+        }
+        unset($params[0]);
+        unset($params[1]);
+
+        return $this->$method(...$params);
+    }
+
+    public function index()
+    {
+        helper('persons');
+        $persons = [];
+        construct_person_array($this->podcast->persons, $persons);
+
+        $data = [
+            'podcast' => $this->podcast,
+            'actor' => $this->actor,
+            'note' => $this->note,
+            'persons' => $persons,
+        ];
+
+        // if user is logged in then send to the authenticated activity view
+        if (can_user_interact()) {
+            helper('form');
+            return view('podcast/note_authenticated', $data);
+        } else {
+            return view('podcast/note', $data);
+        }
+    }
+
+    public function attemptCreate()
+    {
+        $rules = [
+            'message' => 'required|max_length[500]',
+            'episode_url' => 'valid_url|permit_empty',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $message = $this->request->getPost('message');
+
+        $newNote = new \App\Entities\Note([
+            'actor_id' => interact_as_actor_id(),
+            'published_at' => Time::now(),
+            'created_by' => user_id(),
+        ]);
+
+        // get episode if episodeUrl has been set
+        $episodeUri = $this->request->getPost('episode_url');
+        if (
+            $episodeUri &&
+            ($params = extract_params_from_episode_uri(new URI($episodeUri)))
+        ) {
+            if (
+                $episode = (new EpisodeModel())->getEpisodeBySlug(
+                    $params['podcastName'],
+                    $params['episodeSlug'],
+                )
+            ) {
+                $newNote->episode_id = $episode->id;
+            }
+        }
+
+        $newNote->message = $message;
+
+        if (
+            !model('NoteModel')->addNote(
+                $newNote,
+                $newNote->episode_id ? false : true,
+                true,
+            )
+        ) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', model('NoteModel')->errors());
+        }
+
+        // Note has been successfully created
+        return redirect()->back();
+    }
+
+    public function attemptReply()
+    {
+        $rules = [
+            'message' => 'required|max_length[500]',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $newNote = new \ActivityPub\Entities\Note([
+            'actor_id' => interact_as_actor_id(),
+            'in_reply_to_id' => $this->note->id,
+            'message' => $this->request->getPost('message'),
+            'published_at' => Time::now(),
+            'created_by' => user_id(),
+        ]);
+
+        if (!model('NoteModel')->addReply($newNote)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', model('NoteModel')->errors());
+        }
+
+        // Reply note without preview card has been successfully created
+        return redirect()->back();
+    }
+
+    public function attemptFavourite()
+    {
+        model('FavouriteModel')->toggleFavourite(
+            interact_as_actor(),
+            $this->note,
+        );
+
+        return redirect()->back();
+    }
+
+    public function attemptReblog()
+    {
+        model('NoteModel')->toggleReblog(interact_as_actor(), $this->note);
+
+        return redirect()->back();
+    }
+
+    public function attemptAction()
+    {
+        $rules = [
+            'action' => 'required|in_list[favourite,reblog,reply]',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        switch ($this->request->getPost('action')) {
+            case 'favourite':
+                return $this->attemptFavourite();
+            case 'reblog':
+                return $this->attemptReblog();
+            case 'reply':
+                return $this->attemptReply();
+        }
+    }
+
+    public function remoteAction($action)
+    {
+        $data = [
+            'podcast' => $this->podcast,
+            'actor' => $this->actor,
+            'note' => $this->note,
+            'action' => $action,
+        ];
+
+        helper('form');
+
+        return view('podcast/note_remote_action', $data);
+    }
+}
diff --git a/app/Controllers/Page.php b/app/Controllers/Page.php
index 74735dee6a..46d28d22da 100644
--- a/app/Controllers/Page.php
+++ b/app/Controllers/Page.php
@@ -85,14 +85,23 @@ class Page extends BaseController
                                         'role_label' => $credit->role_label,
                                         'is_in' => [
                                             [
-                                                'link' => $credit->episode
+                                                'link' => $credit->episode_id
                                                     ? $credit->episode->link
                                                     : $credit->podcast->link,
-                                                'title' => $credit->episode
+                                                'title' => $credit->episode_id
                                                     ? (count($allPodcasts) > 1
                                                             ? "{$credit->podcast->title} ▸ "
                                                             : '') .
-                                                        "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}"
+                                                        $credit->episode
+                                                            ->title .
+                                                        episode_numbering(
+                                                            $credit->episode
+                                                                ->number,
+                                                            $credit->episode
+                                                                ->season_number,
+                                                            'text-xs ml-2',
+                                                            true,
+                                                        )
                                                     : $credit->podcast->title,
                                             ],
                                         ],
@@ -114,14 +123,21 @@ class Page extends BaseController
                                 'role_label' => $credit->role_label,
                                 'is_in' => [
                                     [
-                                        'link' => $credit->episode
+                                        'link' => $credit->episode_id
                                             ? $credit->episode->link
                                             : $credit->podcast->link,
-                                        'title' => $credit->episode
+                                        'title' => $credit->episode_id
                                             ? (count($allPodcasts) > 1
                                                     ? "{$credit->podcast->title} ▸ "
                                                     : '') .
-                                                "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}"
+                                                $credit->episode->title .
+                                                episode_numbering(
+                                                    $credit->episode->number,
+                                                    $credit->episode
+                                                        ->season_number,
+                                                    'text-xs ml-2',
+                                                    true,
+                                                )
                                             : $credit->podcast->title,
                                     ],
                                 ],
@@ -143,7 +159,13 @@ class Page extends BaseController
                                     ? (count($allPodcasts) > 1
                                             ? "{$credit->podcast->title} ▸ "
                                             : '') .
-                                        "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}"
+                                        $credit->episode->title .
+                                        episode_numbering(
+                                            $credit->episode->number,
+                                            $credit->episode->season_number,
+                                            'text-xs ml-2',
+                                            true,
+                                        )
                                     : $credit->podcast->title,
                             ],
                         ],
@@ -159,7 +181,13 @@ class Page extends BaseController
                             ? (count($allPodcasts) > 1
                                     ? "{$credit->podcast->title} ▸ "
                                     : '') .
-                                "(S{$credit->episode->season_number}E{$credit->episode->number}) {$credit->episode->title}"
+                                $credit->episode->title .
+                                episode_numbering(
+                                    $credit->episode->number,
+                                    $credit->episode->season_number,
+                                    'text-xs ml-2',
+                                    true,
+                                )
                             : $credit->podcast->title,
                     ];
                 }
diff --git a/app/Controllers/Podcast.php b/app/Controllers/Podcast.php
index d7a80a6ee3..56a23e3618 100644
--- a/app/Controllers/Podcast.php
+++ b/app/Controllers/Podcast.php
@@ -10,6 +10,7 @@ namespace App\Controllers;
 
 use App\Models\EpisodeModel;
 use App\Models\PodcastModel;
+use App\Models\NoteModel;
 
 class Podcast extends BaseController
 {
@@ -23,17 +24,41 @@ class Podcast extends BaseController
         if (count($params) > 0) {
             if (
                 !($this->podcast = (new PodcastModel())->getPodcastByName(
-                    $params[0]
+                    $params[0],
                 ))
             ) {
                 throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
             }
+            unset($params[0]);
         }
 
-        return $this->$method();
+        return $this->$method(...$params);
     }
 
-    public function index()
+    public function activity()
+    {
+        helper('persons');
+        $persons = [];
+        construct_person_array($this->podcast->persons, $persons);
+
+        $data = [
+            'podcast' => $this->podcast,
+            'notes' => (new NoteModel())->getActorNotes(
+                $this->podcast->actor_id,
+            ),
+            'persons' => $persons,
+        ];
+
+        // if user is logged in then send to the authenticated activity view
+        if (can_user_interact()) {
+            helper('form');
+            return view('podcast/activity_authenticated', $data);
+        } else {
+            return view('podcast/activity', $data);
+        }
+    }
+
+    public function episodes()
     {
         self::triggerWebpageHit($this->podcast->id);
 
@@ -42,7 +67,7 @@ class Podcast extends BaseController
 
         if (!$yearQuery and !$seasonQuery) {
             $defaultQuery = (new EpisodeModel())->getDefaultQuery(
-                $this->podcast->id
+                $this->podcast->id,
             );
             if ($defaultQuery['type'] == 'season') {
                 $seasonQuery = $defaultQuery['data']['season_number'];
@@ -59,7 +84,7 @@ class Podcast extends BaseController
                 $yearQuery,
                 $seasonQuery ? 'season' . $seasonQuery : null,
                 service('request')->getLocale(),
-            ])
+            ]),
         );
 
         if (!($found = cache($cacheName))) {
@@ -73,14 +98,19 @@ class Podcast extends BaseController
             foreach ($years as $year) {
                 $isActive = $yearQuery == $year['year'];
                 if ($isActive) {
-                    $activeQuery = ['type' => 'year', 'value' => $year['year']];
+                    $activeQuery = [
+                        'type' => 'year',
+                        'value' => $year['year'],
+                        'label' => $year['year'],
+                        'number_of_episodes' => $year['number_of_episodes'],
+                    ];
                 }
 
                 array_push($episodesNavigation, [
                     'label' => $year['year'],
                     'number_of_episodes' => $year['number_of_episodes'],
                     'route' =>
-                        route_to('podcast', $this->podcast->name) .
+                        route_to('podcast-episodes', $this->podcast->name) .
                         '?year=' .
                         $year['year'],
                     'is_active' => $isActive,
@@ -93,6 +123,10 @@ class Podcast extends BaseController
                     $activeQuery = [
                         'type' => 'season',
                         'value' => $season['season_number'],
+                        'label' => lang('Podcast.season', [
+                            'seasonNumber' => $season['season_number'],
+                        ]),
+                        'number_of_episodes' => $season['number_of_episodes'],
                     ];
                 }
 
@@ -102,19 +136,16 @@ class Podcast extends BaseController
                     ]),
                     'number_of_episodes' => $season['number_of_episodes'],
                     'route' =>
-                        route_to('podcast', $this->podcast->name) .
+                        route_to('podcast-episodes', $this->podcast->name) .
                         '?season=' .
                         $season['season_number'],
                     'is_active' => $isActive,
                 ]);
             }
 
-            helper(['persons']);
+            helper('persons');
             $persons = [];
-            constructs_podcast_person_array(
-                $this->podcast->podcast_persons,
-                $persons
-            );
+            construct_person_array($this->podcast->persons, $persons);
 
             $data = [
                 'podcast' => $this->podcast,
@@ -124,21 +155,31 @@ class Podcast extends BaseController
                     $this->podcast->id,
                     $this->podcast->type,
                     $yearQuery,
-                    $seasonQuery
+                    $seasonQuery,
                 ),
-                'personArray' => $persons,
+                'persons' => $persons,
             ];
 
             $secondsToNextUnpublishedEpisode = $episodeModel->getSecondsToNextUnpublishedEpisode(
-                $this->podcast->id
+                $this->podcast->id,
             );
 
-            return view('podcast', $data, [
-                'cache' => $secondsToNextUnpublishedEpisode
-                    ? $secondsToNextUnpublishedEpisode
-                    : DECADE,
-                'cache_name' => $cacheName,
-            ]);
+            // if user is logged in then send to the authenticated episodes view
+            if (can_user_interact()) {
+                return view('podcast/episodes_authenticated', $data, [
+                    'cache' => $secondsToNextUnpublishedEpisode
+                        ? $secondsToNextUnpublishedEpisode
+                        : DECADE,
+                    'cache_name' => $cacheName . '_authenticated',
+                ]);
+            } else {
+                return view('podcast/episodes', $data, [
+                    'cache' => $secondsToNextUnpublishedEpisode
+                        ? $secondsToNextUnpublishedEpisode
+                        : DECADE,
+                    'cache_name' => $cacheName,
+                ]);
+            }
         }
 
         return $found;
diff --git a/app/Database/Migrations/2020-05-29-152000_add_categories.php b/app/Database/Migrations/2020-05-29-152000_add_categories.php
index 2fa255a3a5..900f5b246e 100644
--- a/app/Database/Migrations/2020-05-29-152000_add_categories.php
+++ b/app/Database/Migrations/2020-05-29-152000_add_categories.php
@@ -39,7 +39,7 @@ class AddCategories extends Migration
                 'constraint' => 32,
             ],
         ]);
-        $this->forge->addKey('id', true);
+        $this->forge->addPrimaryKey('id');
         $this->forge->addUniqueKey('code');
         $this->forge->addForeignKey('parent_id', 'categories', 'id');
         $this->forge->createTable('categories');
diff --git a/app/Database/Migrations/2020-05-30-101000_add_languages.php b/app/Database/Migrations/2020-05-30-101000_add_languages.php
index cc58df49f8..6568990681 100644
--- a/app/Database/Migrations/2020-05-30-101000_add_languages.php
+++ b/app/Database/Migrations/2020-05-30-101000_add_languages.php
@@ -28,7 +28,7 @@ class AddLanguages extends Migration
                 'constraint' => 128,
             ],
         ]);
-        $this->forge->addKey('code', true);
+        $this->forge->addPrimaryKey('code');
         $this->forge->createTable('languages');
     }
 
diff --git a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php b/app/Database/Migrations/2020-05-30-101500_add_podcasts.php
index 2351f51a3e..0eddb82f05 100644
--- a/app/Database/Migrations/2020-05-30-101500_add_podcasts.php
+++ b/app/Database/Migrations/2020-05-30-101500_add_podcasts.php
@@ -23,14 +23,17 @@ class AddPodcasts extends Migration
                 'unsigned' => true,
                 'auto_increment' => true,
             ],
-            'title' => [
-                'type' => 'VARCHAR',
-                'constraint' => 128,
+            'actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
             ],
             'name' => [
                 'type' => 'VARCHAR',
                 'constraint' => 32,
-                'unique' => true,
+            ],
+            'title' => [
+                'type' => 'VARCHAR',
+                'constraint' => 128,
             ],
             'description_markdown' => [
                 'type' => 'TEXT',
@@ -42,6 +45,12 @@ class AddPodcasts extends Migration
                 'type' => 'VARCHAR',
                 'constraint' => 255,
             ],
+            // constraint is 13 because the longest safe mimetype for images is image/svg+xml,
+            // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
+            'image_mimetype' => [
+                'type' => 'VARCHAR',
+                'constraint' => 13,
+            ],
             'language_code' => [
                 'type' => 'VARCHAR',
                 'constraint' => 2,
@@ -140,6 +149,7 @@ class AddPodcasts extends Migration
             ],
             'custom_rss' => [
                 'type' => 'JSON',
+                'null' => true,
             ],
             'partner_id' => [
                 'type' => 'VARCHAR',
@@ -176,7 +186,15 @@ class AddPodcasts extends Migration
             ],
         ]);
 
-        $this->forge->addKey('id', true);
+        $this->forge->addPrimaryKey('id');
+        $this->forge->addUniqueKey('name');
+        $this->forge->addForeignKey(
+            'actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->addForeignKey('category_id', 'categories', 'id');
         $this->forge->addForeignKey('language_code', 'languages', 'code');
         $this->forge->addForeignKey('created_by', 'users', 'id');
diff --git a/app/Database/Migrations/2020-06-05-170000_add_episodes.php b/app/Database/Migrations/2020-06-05-170000_add_episodes.php
index 72f7f1994d..775e64c12d 100644
--- a/app/Database/Migrations/2020-06-05-170000_add_episodes.php
+++ b/app/Database/Migrations/2020-06-05-170000_add_episodes.php
@@ -73,6 +73,13 @@ class AddEpisodes extends Migration
                 'constraint' => 255,
                 'null' => true,
             ],
+            // constraint is 13 because the longest safe mimetype for images is image/svg+xml,
+            // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
+            'image_mimetype' => [
+                'type' => 'VARCHAR',
+                'constraint' => 13,
+                'null' => true,
+            ],
             'transcript_uri' => [
                 'type' => 'VARCHAR',
                 'constraint' => 255,
@@ -128,6 +135,21 @@ class AddEpisodes extends Migration
                 'type' => 'JSON',
                 'null' => true,
             ],
+            'favourites_total' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'reblogs_total' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'notes_total' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
             'created_by' => [
                 'type' => 'INT',
                 'unsigned' => true,
@@ -151,9 +173,15 @@ class AddEpisodes extends Migration
                 'null' => true,
             ],
         ]);
-        $this->forge->addKey('id', true);
+        $this->forge->addPrimaryKey('id');
         $this->forge->addUniqueKey(['podcast_id', 'slug']);
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
+        $this->forge->addForeignKey(
+            'podcast_id',
+            'podcasts',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->addForeignKey('created_by', 'users', 'id');
         $this->forge->addForeignKey('updated_by', 'users', 'id');
         $this->forge->createTable('episodes');
diff --git a/app/Database/Migrations/2020-06-05-180000_add_soundbites.php b/app/Database/Migrations/2020-06-05-180000_add_soundbites.php
index 57af8f3176..1f1aec5373 100644
--- a/app/Database/Migrations/2020-06-05-180000_add_soundbites.php
+++ b/app/Database/Migrations/2020-06-05-180000_add_soundbites.php
@@ -63,8 +63,20 @@ class AddSoundbites extends Migration
         ]);
         $this->forge->addKey('id', true);
         $this->forge->addUniqueKey(['episode_id', 'start_time', 'duration']);
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('episode_id', 'episodes', 'id');
+        $this->forge->addForeignKey(
+            'podcast_id',
+            'podcasts',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'episode_id',
+            'episodes',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->addForeignKey('created_by', 'users', 'id');
         $this->forge->addForeignKey('updated_by', 'users', 'id');
         $this->forge->createTable('soundbites');
diff --git a/app/Database/Migrations/2020-06-05-190000_add_platforms.php b/app/Database/Migrations/2020-06-05-190000_add_platforms.php
index b79e7939da..fb82e82489 100644
--- a/app/Database/Migrations/2020-06-05-190000_add_platforms.php
+++ b/app/Database/Migrations/2020-06-05-190000_add_platforms.php
@@ -45,7 +45,7 @@ class AddPlatforms extends Migration
         $this->forge->addField(
             '`updated_at` timestamp NOT NULL DEFAULT NOW() ON UPDATE NOW()'
         );
-        $this->forge->addKey('slug', true);
+        $this->forge->addPrimaryKey('slug');
         $this->forge->createTable('platforms');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php b/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php
index 96b1419fcb..35821439f1 100644
--- a/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php
+++ b/app/Database/Migrations/2020-06-08-120000_add_analytics_podcasts.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcasts
  * Creates analytics_podcasts table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -45,12 +46,11 @@ class AddAnalyticsPodcasts extends Migration
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'date']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_podcasts');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php
index 546e918127..39dba61062 100644
--- a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php
+++ b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_episode.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcastsByEpisode
  * Creates analytics_episodes_by_episode table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -41,13 +42,11 @@ class AddAnalyticsPodcastsByEpisode extends Migration
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'date', 'episode_id']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('episode_id', 'episodes', 'id');
         $this->forge->createTable('analytics_podcasts_by_episode');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php
index 828e306619..ae2d85e3c0 100644
--- a/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php
+++ b/app/Database/Migrations/2020-06-08-130000_add_analytics_podcasts_by_hour.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcastsByHour
  * Creates analytics_podcasts_by_hour table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -36,12 +37,11 @@ class AddAnalyticsPodcastsByHour extends Migration
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'date', 'hour']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_podcasts_by_hour');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php b/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php
index a05d73526d..a1ab3174c3 100644
--- a/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php
+++ b/app/Database/Migrations/2020-06-08-140000_add_analytics_podcasts_by_player.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcastsByPlayer
  * Creates analytics_podcasts_by_player table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -61,12 +62,11 @@ class AddAnalyticsPodcastsByPlayer extends Migration
             'is_bot',
         ]);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_podcasts_by_player');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php b/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php
index 4fae6c03b6..ce728e9671 100644
--- a/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php
+++ b/app/Database/Migrations/2020-06-08-150000_add_analytics_podcasts_by_country.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcastsByCountry
  * Creates analytics_podcasts_by_country table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -37,12 +38,11 @@ class AddAnalyticsPodcastsByCountry extends Migration
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'date', 'country_code']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_podcasts_by_country');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php b/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php
index 3b7d48160d..009894fdf0 100644
--- a/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php
+++ b/app/Database/Migrations/2020-06-08-160000_add_analytics_podcasts_by_region.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcastsByRegion
  * Creates analytics_podcasts_by_region table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -55,12 +56,11 @@ class AddAnalyticsPodcastsByRegion extends Migration
             'region_code',
         ]);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_podcasts_by_region');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php b/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php
index 4b2a9f9efd..68df0a8130 100644
--- a/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php
+++ b/app/Database/Migrations/2020-06-08-160000_add_podcasts_platforms.php
@@ -48,8 +48,6 @@ class AddPodcastsPlatforms extends Migration
         ]);
 
         $this->forge->addPrimaryKey(['podcast_id', 'platform_slug']);
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('platform_slug', 'platforms', 'slug');
         $this->forge->createTable('podcasts_platforms');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php b/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php
index cc2e7467c0..891a76e729 100644
--- a/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php
+++ b/app/Database/Migrations/2020-06-08-170000_add_analytics_website_by_browser.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsWebsiteByBrowser
  * Creates analytics_website_by_browser table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -37,12 +38,11 @@ class AddAnalyticsWebsiteByBrowser extends Migration
 
         $this->forge->addPrimaryKey(['podcast_id', 'date', 'browser']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_website_by_browser');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php b/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php
index ca761a5634..0fa2fa707c 100644
--- a/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php
+++ b/app/Database/Migrations/2020-06-08-180000_add_analytics_website_by_referer.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsWebsiteByReferer
  * Creates analytics_website_by_referer table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -46,12 +47,11 @@ class AddAnalyticsWebsiteByReferer extends Migration
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'date', 'referer_url']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_website_by_referer');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php b/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php
index 2203d17fb9..366b75af08 100644
--- a/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php
+++ b/app/Database/Migrations/2020-06-08-190000_add_analytics_website_by_entry_page.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsWebsiteByEntryPage
  * Creates analytics_website_by_entry_page table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -36,12 +37,11 @@ class AddAnalyticsWebsiteByEntryPage extends Migration
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'date', 'entry_page_url']);
         $this->forge->addField(
-            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
         );
         $this->forge->addField(
-            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()'
+            '`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()',
         );
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
         $this->forge->createTable('analytics_website_by_entry_page');
     }
 
diff --git a/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php
index 1f57fd7c5e..fcce6f4966 100644
--- a/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php
+++ b/app/Database/Migrations/2020-06-08-210000_add_analytics_unknown_useragents.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsUnknownUseragents
  * Creates analytics_unknown_useragents table in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -33,7 +34,8 @@ class AddAnalyticsUnknownUseragents extends Migration
                 'default' => 1,
             ],
         ]);
-        $this->forge->addKey('id', true);
+
+        $this->forge->addPrimaryKey('id');
         // `created_at` and `updated_at` are created with SQL because Model class won’t be used for insertion (Procedure will be used instead)
         $this->forge->addField(
             '`created_at` timestamp NOT NULL DEFAULT current_timestamp()'
diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php
index d77a5d1910..f1792a6ced 100644
--- a/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php
+++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_podcasts_procedure.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsPodcastsProcedure
  * Creates analytics_podcasts procedure in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -21,58 +22,58 @@ class AddAnalyticsPodcastsProcedure extends Migration
         $prefix = $this->db->getPrefix();
 
         $createQuery = <<<EOD
-CREATE PROCEDURE `{$prefix}analytics_podcasts` (
-    IN `p_podcast_id` INT UNSIGNED,
-    IN `p_episode_id` INT UNSIGNED,
-    IN `p_country_code` VARCHAR(3) CHARSET utf8mb4,
-    IN `p_region_code` VARCHAR(3) CHARSET utf8mb4,
-    IN `p_latitude` FLOAT,
-    IN `p_longitude` FLOAT,
-    IN `p_service` VARCHAR(128) CHARSET utf8mb4,
-    IN `p_app` VARCHAR(128) CHARSET utf8mb4,
-    IN `p_device` VARCHAR(32) CHARSET utf8mb4,
-    IN `p_os` VARCHAR(32) CHARSET utf8mb4,
-    IN `p_bot` TINYINT(1) UNSIGNED,
-    IN `p_filesize` INT UNSIGNED,
-    IN `p_duration` INT UNSIGNED,
-    IN `p_age` INT UNSIGNED,
-    IN `p_new_listener` TINYINT(1) UNSIGNED
-    )  MODIFIES SQL DATA
-DETERMINISTIC
-SQL SECURITY INVOKER
-COMMENT 'Add one hit in podcast logs tables.'
-BEGIN
+        CREATE PROCEDURE `{$prefix}analytics_podcasts` (
+            IN `p_podcast_id` INT UNSIGNED,
+            IN `p_episode_id` INT UNSIGNED,
+            IN `p_country_code` VARCHAR(3) CHARSET utf8mb4,
+            IN `p_region_code` VARCHAR(3) CHARSET utf8mb4,
+            IN `p_latitude` FLOAT,
+            IN `p_longitude` FLOAT,
+            IN `p_service` VARCHAR(128) CHARSET utf8mb4,
+            IN `p_app` VARCHAR(128) CHARSET utf8mb4,
+            IN `p_device` VARCHAR(32) CHARSET utf8mb4,
+            IN `p_os` VARCHAR(32) CHARSET utf8mb4,
+            IN `p_bot` TINYINT(1) UNSIGNED,
+            IN `p_filesize` INT UNSIGNED,
+            IN `p_duration` INT UNSIGNED,
+            IN `p_age` INT UNSIGNED,
+            IN `p_new_listener` TINYINT(1) UNSIGNED
+            )  MODIFIES SQL DATA
+        DETERMINISTIC
+        SQL SECURITY INVOKER
+        COMMENT 'Add one hit in podcast logs tables.'
+        BEGIN
 
-SET @current_datetime = NOW();
-SET @current_date = DATE(@current_datetime);
-SET @current_hour = HOUR(@current_datetime);
+        SET @current_datetime = NOW();
+        SET @current_date = DATE(@current_datetime);
+        SET @current_hour = HOUR(@current_datetime);
 
-IF NOT `p_bot` THEN
-    INSERT INTO `{$prefix}analytics_podcasts`(`podcast_id`, `date`)
-        VALUES (p_podcast_id, @current_date)
-        ON DUPLICATE KEY UPDATE
-            `duration`=`duration`+`p_duration`,
-            `bandwidth`=`bandwidth`+`p_filesize`,
-            `hits`=`hits`+1,
-            `unique_listeners`=`unique_listeners`+`p_new_listener`;
-    INSERT INTO `{$prefix}analytics_podcasts_by_hour`(`podcast_id`, `date`, `hour`)
-        VALUES (p_podcast_id, @current_date, @current_hour)
-        ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-    INSERT INTO `{$prefix}analytics_podcasts_by_episode`(`podcast_id`, `episode_id`, `date`, `age`) 
-        VALUES (p_podcast_id, p_episode_id, @current_date, p_age)
-        ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-    INSERT INTO `{$prefix}analytics_podcasts_by_country`(`podcast_id`, `country_code`, `date`) 
-        VALUES (p_podcast_id, p_country_code, @current_date) 
-        ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-    INSERT INTO `{$prefix}analytics_podcasts_by_region`(`podcast_id`, `country_code`, `region_code`, `latitude`, `longitude`, `date`) 
-        VALUES (p_podcast_id, p_country_code, p_region_code, p_latitude, p_longitude, @current_date) 
-        ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-END IF;
-INSERT INTO `{$prefix}analytics_podcasts_by_player`(`podcast_id`, `service`, `app`, `device`, `os`, `is_bot`, `date`) 
-    VALUES (p_podcast_id, p_service, p_app, p_device, p_os, p_bot, @current_date) 
-    ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-END
-EOD;
+        IF NOT `p_bot` THEN
+            INSERT INTO `{$prefix}analytics_podcasts`(`podcast_id`, `date`)
+                VALUES (p_podcast_id, @current_date)
+                ON DUPLICATE KEY UPDATE
+                    `duration`=`duration`+`p_duration`,
+                    `bandwidth`=`bandwidth`+`p_filesize`,
+                    `hits`=`hits`+1,
+                    `unique_listeners`=`unique_listeners`+`p_new_listener`;
+            INSERT INTO `{$prefix}analytics_podcasts_by_hour`(`podcast_id`, `date`, `hour`)
+                VALUES (p_podcast_id, @current_date, @current_hour)
+                ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+            INSERT INTO `{$prefix}analytics_podcasts_by_episode`(`podcast_id`, `episode_id`, `date`, `age`)
+                VALUES (p_podcast_id, p_episode_id, @current_date, p_age)
+                ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+            INSERT INTO `{$prefix}analytics_podcasts_by_country`(`podcast_id`, `country_code`, `date`)
+                VALUES (p_podcast_id, p_country_code, @current_date)
+                ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+            INSERT INTO `{$prefix}analytics_podcasts_by_region`(`podcast_id`, `country_code`, `region_code`, `latitude`, `longitude`, `date`)
+                VALUES (p_podcast_id, p_country_code, p_region_code, p_latitude, p_longitude, @current_date)
+                ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+        END IF;
+        INSERT INTO `{$prefix}analytics_podcasts_by_player`(`podcast_id`, `service`, `app`, `device`, `os`, `is_bot`, `date`)
+            VALUES (p_podcast_id, p_service, p_app, p_device, p_os, p_bot, @current_date)
+            ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+        END
+        EOD;
         $this->db->query($createQuery);
     }
 
@@ -80,7 +81,7 @@ EOD;
     {
         $prefix = $this->db->getPrefix();
         $this->db->query(
-            "DROP PROCEDURE IF EXISTS `{$prefix}analytics_podcasts`"
+            "DROP PROCEDURE IF EXISTS `{$prefix}analytics_podcasts`",
         );
     }
 }
diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php
index 6b05164dda..39e8d3aa28 100644
--- a/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php
+++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_unknown_useragents_procedure.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsUnknownUseragentsProcedure
  * Creates analytics_unknown_useragents procedure in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -20,14 +21,14 @@ class AddAnalyticsUnknownUseragentsProcedure extends Migration
         // Example: CALL analytics_unknown_useragents('Podcasts/1430.46 CFNetwork/1125.2 Darwin/19.4.0');
         $procedureName = $this->db->prefixTable('analytics_unknown_useragents');
         $createQuery = <<<EOD
-CREATE PROCEDURE `$procedureName` (IN `p_useragent` VARCHAR(191) CHARSET utf8mb4)  MODIFIES SQL DATA
-DETERMINISTIC
-SQL SECURITY INVOKER
-COMMENT 'Add an unknown useragent to table $procedureName.'
-INSERT INTO `$procedureName`(`useragent`) 
-VALUES (p_useragent) 
-ON DUPLICATE KEY UPDATE `hits`=`hits`+1
-EOD;
+        CREATE PROCEDURE `$procedureName` (IN `p_useragent` VARCHAR(191) CHARSET utf8mb4)  MODIFIES SQL DATA
+        DETERMINISTIC
+        SQL SECURITY INVOKER
+        COMMENT 'Add an unknown useragent to table $procedureName.'
+        INSERT INTO `$procedureName`(`useragent`)
+        VALUES (p_useragent)
+        ON DUPLICATE KEY UPDATE `hits`=`hits`+1
+        EOD;
         $this->db->query($createQuery);
     }
 
diff --git a/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php
index 8d46ad7ff9..01e89391f8 100644
--- a/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php
+++ b/app/Database/Migrations/2020-06-11-210000_add_analytics_website_procedure.php
@@ -3,6 +3,7 @@
 /**
  * Class AddAnalyticsWebsiteProcedure
  * Creates analytics_website stored procedure in database
+ *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
@@ -20,25 +21,25 @@ class AddAnalyticsWebsiteProcedure extends Migration
         // Example: CALL analytics_website(1,'FR','Firefox');
         $procedureName = $this->db->prefixTable('analytics_website');
         $createQuery = <<<EOD
-CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` INT UNSIGNED, IN `p_browser` VARCHAR(191) CHARSET utf8mb4, IN `p_entry_page` VARCHAR(512) CHARSET utf8mb4, IN `p_referer_url` VARCHAR(512) CHARSET utf8mb4, IN `p_domain` VARCHAR(128) CHARSET utf8mb4, IN `p_keywords` VARCHAR(384) CHARSET utf8mb4)  MODIFIES SQL DATA
-DETERMINISTIC
-SQL SECURITY INVOKER
-COMMENT 'Add one hit in website logs tables.'
-BEGIN
+        CREATE PROCEDURE `$procedureName` (IN `p_podcast_id` INT UNSIGNED, IN `p_browser` VARCHAR(191) CHARSET utf8mb4, IN `p_entry_page` VARCHAR(512) CHARSET utf8mb4, IN `p_referer_url` VARCHAR(512) CHARSET utf8mb4, IN `p_domain` VARCHAR(128) CHARSET utf8mb4, IN `p_keywords` VARCHAR(384) CHARSET utf8mb4)  MODIFIES SQL DATA
+        DETERMINISTIC
+        SQL SECURITY INVOKER
+        COMMENT 'Add one hit in website logs tables.'
+        BEGIN
 
-SET @current_date = DATE(NOW());
+        SET @current_date = DATE(NOW());
 
-INSERT INTO {$procedureName}_by_browser(`podcast_id`, `browser`, `date`) 
-    VALUES (p_podcast_id, p_browser, @current_date) 
-    ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-INSERT INTO {$procedureName}_by_referer(`podcast_id`, `referer_url`, `domain`, `keywords`, `date`) 
-    VALUES (p_podcast_id, p_referer_url, p_domain, p_keywords, @current_date) 
-    ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-INSERT INTO {$procedureName}_by_entry_page(`podcast_id`, `entry_page_url`, `date`) 
-    VALUES (p_podcast_id, p_entry_page, @current_date) 
-    ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
-END
-EOD;
+        INSERT INTO {$procedureName}_by_browser(`podcast_id`, `browser`, `date`)
+            VALUES (p_podcast_id, p_browser, @current_date)
+            ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+        INSERT INTO {$procedureName}_by_referer(`podcast_id`, `referer_url`, `domain`, `keywords`, `date`)
+            VALUES (p_podcast_id, p_referer_url, p_domain, p_keywords, @current_date)
+            ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+        INSERT INTO {$procedureName}_by_entry_page(`podcast_id`, `entry_page_url`, `date`)
+            VALUES (p_podcast_id, p_entry_page, @current_date)
+            ON DUPLICATE KEY UPDATE `hits`=`hits`+1;
+        END
+        EOD;
         $this->db->query($createQuery);
     }
 
diff --git a/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php b/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php
index 3884d57a43..37bb9d5646 100644
--- a/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php
+++ b/app/Database/Migrations/2020-07-03-191500_add_podcasts_users.php
@@ -1,8 +1,8 @@
 <?php
 
 /**
- * Class AddLanguages
- * Creates languages table in database
+ * Class AddPodcastUsers
+ * Creates podcast_users table in database
  *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -32,9 +32,21 @@ class AddPodcastsUsers extends Migration
             ],
         ]);
         $this->forge->addPrimaryKey(['user_id', 'podcast_id']);
-        $this->forge->addForeignKey('user_id', 'users', 'id');
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('group_id', 'auth_groups', 'id');
+        $this->forge->addForeignKey('user_id', 'users', 'id', false, 'CASCADE');
+        $this->forge->addForeignKey(
+            'podcast_id',
+            'podcasts',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'group_id',
+            'auth_groups',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->createTable('podcasts_users');
     }
 
diff --git a/app/Database/Migrations/2020-08-17-150000_add_pages.php b/app/Database/Migrations/2020-08-17-150000_add_pages.php
index b35cd443d6..cd271ab50c 100644
--- a/app/Database/Migrations/2020-08-17-150000_add_pages.php
+++ b/app/Database/Migrations/2020-08-17-150000_add_pages.php
@@ -1,8 +1,8 @@
 <?php
 
 /**
- * Class AddLanguages
- * Creates languages table in database
+ * Class AddPages
+ * Creates pages table in database
  *
  * @copyright  2020 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
@@ -46,7 +46,7 @@ class AddPages extends Migration
                 'null' => true,
             ],
         ]);
-        $this->forge->addKey('id', true);
+        $this->forge->addPrimaryKey('id');
         $this->forge->createTable('pages');
     }
 
diff --git a/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php b/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php
index 6c0bd50464..17c60b7145 100644
--- a/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php
+++ b/app/Database/Migrations/2020-09-29-150000_add_podcasts_categories.php
@@ -28,8 +28,20 @@ class AddPodcastsCategories extends Migration
             ],
         ]);
         $this->forge->addPrimaryKey(['podcast_id', 'category_id']);
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('category_id', 'categories', 'id');
+        $this->forge->addForeignKey(
+            'podcast_id',
+            'podcasts',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'category_id',
+            'categories',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->createTable('podcasts_categories');
     }
 
diff --git a/app/Database/Migrations/2020-12-25-120000_add_persons.php b/app/Database/Migrations/2020-12-25-120000_add_persons.php
index bacdafcc07..f993360479 100644
--- a/app/Database/Migrations/2020-12-25-120000_add_persons.php
+++ b/app/Database/Migrations/2020-12-25-120000_add_persons.php
@@ -45,6 +45,12 @@ class AddPersons extends Migration
                 'type' => 'VARCHAR',
                 'constraint' => 255,
             ],
+            // constraint is 13 because the longest safe mimetype for images is image/svg+xml,
+            // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
+            'image_mimetype' => [
+                'type' => 'VARCHAR',
+                'constraint' => 13,
+            ],
             'created_by' => [
                 'type' => 'INT',
                 'unsigned' => true,
diff --git a/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php b/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php
index 1e7bc16b2d..af6c7ee57a 100644
--- a/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php
+++ b/app/Database/Migrations/2020-12-25-130000_add_podcasts_persons.php
@@ -47,8 +47,20 @@ class AddPodcastsPersons extends Migration
             'person_group',
             'person_role',
         ]);
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('person_id', 'persons', 'id');
+        $this->forge->addForeignKey(
+            'podcast_id',
+            'podcasts',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'person_id',
+            'persons',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->createTable('podcasts_persons');
     }
 
diff --git a/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php b/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php
index 4c1c6383f7..7cc3091418 100644
--- a/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php
+++ b/app/Database/Migrations/2020-12-25-140000_add_episodes_persons.php
@@ -52,9 +52,27 @@ class AddEpisodesPersons extends Migration
             'person_group',
             'person_role',
         ]);
-        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id');
-        $this->forge->addForeignKey('episode_id', 'episodes', 'id');
-        $this->forge->addForeignKey('person_id', 'persons', 'id');
+        $this->forge->addForeignKey(
+            'podcast_id',
+            'podcasts',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'episode_id',
+            'episodes',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'person_id',
+            'persons',
+            'id',
+            false,
+            'CASCADE',
+        );
         $this->forge->createTable('episodes_persons');
     }
 
diff --git a/app/Database/Migrations/2020-12-25-150000_add_credit_view.php b/app/Database/Migrations/2020-12-25-150000_add_credit_view.php
index 42731dfcba..68dfd05f79 100644
--- a/app/Database/Migrations/2020-12-25-150000_add_credit_view.php
+++ b/app/Database/Migrations/2020-12-25-150000_add_credit_view.php
@@ -22,16 +22,16 @@ class AddCreditView extends Migration
         $podcastPersonTable = $this->db->prefixTable('podcasts_persons');
         $episodePersonTable = $this->db->prefixTable('episodes_persons');
         $createQuery = <<<EOD
-CREATE VIEW `$viewName` AS
-    SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, NULL AS `episode_id` FROM `$podcastPersonTable`
-        INNER JOIN `$personTable`
-            ON (`person_id`=`$personTable`.`id`)
-    UNION
-    SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, `episode_id` FROM `$episodePersonTable`
-        INNER JOIN `$personTable`
-            ON (`person_id`=`$personTable`.`id`)
-    ORDER BY `person_group`, `full_name`, `person_role`, `podcast_id`, `episode_id`;
-EOD;
+        CREATE VIEW `$viewName` AS
+            SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, NULL AS `episode_id` FROM `$podcastPersonTable`
+                INNER JOIN `$personTable`
+                    ON (`person_id`=`$personTable`.`id`)
+            UNION
+            SELECT `person_group`, `person_id`, `full_name`, `person_role`, `podcast_id`, `episode_id` FROM `$episodePersonTable`
+                INNER JOIN `$personTable`
+                    ON (`person_id`=`$personTable`.`id`)
+            ORDER BY `person_group`, `full_name`, `person_role`, `podcast_id`, `episode_id`;
+        EOD;
         $this->db->query($createQuery);
     }
 
diff --git a/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php b/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php
new file mode 100644
index 0000000000..8278f5a9fb
--- /dev/null
+++ b/app/Database/Migrations/2021-02-23-100000_add_episode_id_to_notes.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Class AddEpisodeIdToNotes
+ * Adds episode_id field to activitypub_notes table in database
+ *
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddEpisodeIdToNotes extends Migration
+{
+    public function up()
+    {
+        $prefix = $this->db->getPrefix();
+
+        $createQuery = <<<SQL
+            ALTER TABLE ${prefix}activitypub_notes
+            ADD COLUMN `episode_id` INT UNSIGNED NULL AFTER `replies_count`,
+            ADD FOREIGN KEY ${prefix}activitypub_notes_episode_id_foreign(episode_id) REFERENCES ${prefix}episodes(id) ON DELETE CASCADE;
+        SQL;
+        $this->db->query($createQuery);
+    }
+
+    public function down()
+    {
+        $this->forge->dropForeignKey(
+            'activitypub_notes',
+            'activitypub_notes_episode_id_foreign',
+        );
+        $this->forge->dropColumn('activitypub_notes', 'episode_id');
+    }
+}
diff --git a/app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php b/app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php
new file mode 100644
index 0000000000..6751254279
--- /dev/null
+++ b/app/Database/Migrations/2021-03-09-113000_add_created_by_to_notes.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * Class AddCreatedByToNotes
+ * Adds created_by field to activitypub_notes table in database
+ *
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddCreatedByToNotes extends Migration
+{
+    public function up()
+    {
+        $prefix = $this->db->getPrefix();
+
+        $createQuery = <<<SQL
+            ALTER TABLE ${prefix}activitypub_notes
+            ADD COLUMN `created_by` INT UNSIGNED AFTER `episode_id`,
+            ADD FOREIGN KEY ${prefix}activitypub_notes_created_by_foreign(created_by) REFERENCES ${prefix}users(id) ON DELETE CASCADE;
+        SQL;
+        $this->db->query($createQuery);
+    }
+
+    public function down()
+    {
+        $this->forge->dropForeignKey(
+            'activitypub_notes',
+            'activitypub_notes_created_by_foreign',
+        );
+        $this->forge->dropColumn('activitypub_notes', 'created_by');
+    }
+}
diff --git a/app/Database/Seeds/AuthSeeder.php b/app/Database/Seeds/AuthSeeder.php
index eb567ad091..455040f11c 100644
--- a/app/Database/Seeds/AuthSeeder.php
+++ b/app/Database/Seeds/AuthSeeder.php
@@ -158,6 +158,18 @@ class AuthSeeder extends Seeder
                 'description' => 'Set / remove platform links of a podcast',
                 'has_permission' => ['podcast_admin'],
             ],
+            [
+                'name' => 'manage_publications',
+                'description' =>
+                    'Publish / unpublish episodes & notes of a podcast',
+                'has_permission' => ['podcast_admin'],
+            ],
+            [
+                'name' => 'interact_as',
+                'description' =>
+                    'Interact as the podcast to favourite / share or reply to notes.',
+                'has_permission' => ['podcast_admin'],
+            ],
         ],
         'podcast_episodes' => [
             [
@@ -192,11 +204,6 @@ class AuthSeeder extends Seeder
                     'Delete all occurrences of an episode of a podcast from the database',
                 'has_permission' => ['podcast_admin'],
             ],
-            [
-                'name' => 'manage_publications',
-                'description' => 'Publish / unpublish episodes of a podcast',
-                'has_permission' => ['podcast_admin'],
-            ],
         ],
         'person' => [
             [
@@ -220,8 +227,23 @@ class AuthSeeder extends Seeder
                 'has_permission' => ['superadmin'],
             ],
             [
-                'name' => 'delete_permanently',
-                'description' => 'Delete any person from the database',
+                'name' => 'delete',
+                'description' =>
+                    'Delete permanently any person from the database',
+                'has_permission' => ['superadmin'],
+            ],
+        ],
+        'fediverse' => [
+            [
+                'name' => 'block_actors',
+                'description' =>
+                    'Block an activitypub actors from interacting with the instance.',
+                'has_permission' => ['superadmin'],
+            ],
+            [
+                'name' => 'block_domains',
+                'description' =>
+                    'Block an activitypub domains from interacting with the instance.',
                 'has_permission' => ['superadmin'],
             ],
         ],
@@ -266,7 +288,7 @@ class AuthSeeder extends Seeder
                     array_push($dataGroupsPermissions, [
                         'group_id' => $this->getGroupIdByName(
                             $role,
-                            $dataGroups
+                            $dataGroups,
                         ),
                         'permission_id' => $permissionId,
                     ]);
diff --git a/app/Database/Seeds/PlatformSeeder.php b/app/Database/Seeds/PlatformSeeder.php
index 9eaf24e101..309b767caf 100644
--- a/app/Database/Seeds/PlatformSeeder.php
+++ b/app/Database/Seeds/PlatformSeeder.php
@@ -98,7 +98,6 @@ class PlatformSeeder extends Seeder
                 'home_url' => 'https://fyyd.de/',
                 'submit_url' => 'https://fyyd.de/add-feed',
             ],
-
             [
                 'slug' => 'google',
                 'type' => 'podcasting',
@@ -249,7 +248,6 @@ class PlatformSeeder extends Seeder
                 'submit_url' =>
                     'https://help.tunein.com/contact/add-podcast-S19TR3Sdf',
             ],
-
             [
                 'slug' => 'paypal',
                 'type' => 'funding',
@@ -257,7 +255,6 @@ class PlatformSeeder extends Seeder
                 'home_url' => 'https://www.paypal.com/',
                 'submit_url' => 'https://www.paypal.com/paypalme/my/grab',
             ],
-
             [
                 'slug' => 'gofundme',
                 'type' => 'funding',
@@ -322,7 +319,6 @@ class PlatformSeeder extends Seeder
                 'home_url' => 'https://www.ulule.com/',
                 'submit_url' => 'https://www.ulule.com/projects/create/#/',
             ],
-
             [
                 'slug' => 'discord',
                 'type' => 'social',
@@ -431,6 +427,7 @@ class PlatformSeeder extends Seeder
                 'submit_url' => 'https://creatoracademy.youtube.com/page/home',
             ],
         ];
+
         $this->db
             ->table('platforms')
             ->ignore(true)
diff --git a/app/Entities/Credit.php b/app/Entities/Credit.php
index 0988e7ca15..94dd5f4a94 100644
--- a/app/Entities/Credit.php
+++ b/app/Entities/Credit.php
@@ -27,7 +27,7 @@ class Credit extends Entity
     protected $podcast;
 
     /**
-     * @var \App\Entities\Episode
+     * @var \App\Entities\Episode|null
      */
     protected $episode;
 
@@ -44,50 +44,61 @@ class Credit extends Entity
     public function getPodcast()
     {
         return (new PodcastModel())->getPodcastById(
-            $this->attributes['podcast_id']
+            $this->attributes['podcast_id'],
         );
     }
 
     public function getEpisode()
     {
-        if (empty($this->attributes['episode_id'])) {
-            return null;
-        } else {
-            return (new EpisodeModel())->getEpisodeById(
-                $this->attributes['podcast_id'],
-                $this->attributes['episode_id']
+        if (empty($this->episode_id)) {
+            throw new \RuntimeException(
+                'Credit must have episode_id before getting episode.',
+            );
+        }
+
+        if (empty($this->episode)) {
+            $this->episode = (new EpisodeModel())->getPublishedEpisodeById(
+                $this->episode_id,
+                $this->podcast_id,
             );
         }
+
+        return $this->episode;
     }
 
     public function getPerson()
     {
-        return (new PersonModel())->getPersonById(
-            $this->attributes['person_id']
-        );
+        if (empty($this->person_id)) {
+            throw new \RuntimeException(
+                'Credit must have person_id before getting person.',
+            );
+        }
+
+        if (empty($this->person)) {
+            $this->person = (new PersonModel())->getPersonById(
+                $this->person_id,
+            );
+        }
+
+        return $this->person;
     }
 
     public function getGroupLabel()
     {
-        if (empty($this->attributes['person_group'])) {
+        if (empty($this->person_group)) {
             return null;
         } else {
-            return lang(
-                "PersonsTaxonomy.persons.{$this->attributes['person_group']}.label"
-            );
+            return lang("PersonsTaxonomy.persons.{$this->person_group}.label");
         }
     }
 
     public function getRoleLabel()
     {
-        if (
-            empty($this->attributes['person_group']) ||
-            empty($this->attributes['person_role'])
-        ) {
+        if (empty($this->person_group) || empty($this->person_role)) {
             return null;
         } else {
             return lang(
-                "PersonsTaxonomy.persons.{$this->attributes['person_group']}.roles.{$this->attributes['person_role']}.label"
+                "PersonsTaxonomy.persons.{$this->person_group}.roles.{$this->person_role}.label",
             );
         }
     }
diff --git a/app/Entities/Episode.php b/app/Entities/Episode.php
index 6d3042ddb5..ced727ebd5 100644
--- a/app/Entities/Episode.php
+++ b/app/Entities/Episode.php
@@ -11,6 +11,7 @@ namespace App\Entities;
 use App\Models\PodcastModel;
 use App\Models\SoundbiteModel;
 use App\Models\EpisodePersonModel;
+use App\Models\NoteModel;
 use CodeIgniter\Entity;
 use CodeIgniter\I18n\Time;
 use League\CommonMark\CommonMarkConverter;
@@ -28,7 +29,7 @@ class Episode extends Entity
     protected $link;
 
     /**
-     * @var \App\Entities\Image
+     * @var \App\Libraries\Image
      */
     protected $image;
 
@@ -80,13 +81,18 @@ class Episode extends Entity
     /**
      * @var \App\Entities\EpisodePerson[]
      */
-    protected $episode_persons;
+    protected $persons;
 
     /**
      * @var \App\Entities\Soundbite[]
      */
     protected $soundbites;
 
+    /**
+     * @var \App\Entities\Note[]
+     */
+    protected $notes;
+
     /**
      * Holds text only description, striped of any markdown or html special characters
      *
@@ -122,6 +128,7 @@ class Episode extends Entity
 
     protected $casts = [
         'id' => 'integer',
+        'podcast_id' => 'integer',
         'guid' => 'string',
         'slug' => 'string',
         'title' => 'string',
@@ -133,6 +140,7 @@ class Episode extends Entity
         'description_markdown' => 'string',
         'description_html' => 'string',
         'image_uri' => '?string',
+        'image_mimetype' => '?string',
         'transcript_uri' => '?string',
         'chapters_uri' => '?string',
         'parental_advisory' => '?string',
@@ -144,6 +152,9 @@ class Episode extends Entity
         'location_geo' => '?string',
         'location_osmid' => '?string',
         'custom_rss' => '?json-array',
+        'favourites_total' => 'integer',
+        'reblogs_total' => 'integer',
+        'notes_total' => 'integer',
         'created_by' => 'integer',
         'updated_by' => 'integer',
     ];
@@ -163,15 +174,16 @@ class Episode extends Entity
         ) {
             helper('media');
 
-            // check whether the user has inputted an image and store it
-            $this->attributes['image_uri'] = save_podcast_media(
+            // check whether the user has inputted an image and store
+            $this->attributes['image_mimetype'] = $image->getMimeType();
+            $this->attributes['image_uri'] = save_media(
                 $image,
-                $this->getPodcast()->name,
-                $this->attributes['slug']
+                'podcasts/' . $this->getPodcast()->name,
+                $this->attributes['slug'],
             );
-
-            $this->image = new \App\Entities\Image(
-                $this->attributes['image_uri']
+            $this->image = new \App\Libraries\Image(
+                $this->attributes['image_uri'],
+                $this->attributes['image_mimetype'],
             );
             $this->image->saveSizes();
         }
@@ -179,10 +191,13 @@ class Episode extends Entity
         return $this;
     }
 
-    public function getImage(): \App\Entities\Image
+    public function getImage(): \App\Libraries\Image
     {
         if ($image_uri = $this->attributes['image_uri']) {
-            return new \App\Entities\Image($image_uri);
+            return new \App\Libraries\Image(
+                $image_uri,
+                $this->attributes['image_mimetype'],
+            );
         }
         return $this->getPodcast()->image;
     }
@@ -204,13 +219,13 @@ class Episode extends Entity
 
             $enclosure_metadata = get_file_tags($enclosure);
 
-            $this->attributes['enclosure_uri'] = save_podcast_media(
+            $this->attributes['enclosure_uri'] = save_media(
                 $enclosure,
-                $this->getPodcast()->name,
-                $this->attributes['slug']
+                'podcasts/' . $this->getPodcast()->name,
+                $this->attributes['slug'],
             );
             $this->attributes['enclosure_duration'] = round(
-                $enclosure_metadata['playtime_seconds']
+                $enclosure_metadata['playtime_seconds'],
             );
             $this->attributes['enclosure_mimetype'] =
                 $enclosure_metadata['mime_type'];
@@ -238,10 +253,10 @@ class Episode extends Entity
         ) {
             helper('media');
 
-            $this->attributes['transcript_uri'] = save_podcast_media(
+            $this->attributes['transcript_uri'] = save_media(
                 $transcript,
                 $this->getPodcast()->name,
-                $this->attributes['slug'] . '-transcript'
+                $this->attributes['slug'] . '-transcript',
             );
         }
 
@@ -263,10 +278,10 @@ class Episode extends Entity
         ) {
             helper('media');
 
-            $this->attributes['chapters_uri'] = save_podcast_media(
+            $this->attributes['chapters_uri'] = save_media(
                 $chapters,
                 $this->getPodcast()->name,
-                $this->attributes['slug'] . '-chapters'
+                $this->attributes['slug'] . '-chapters',
             );
         }
 
@@ -343,15 +358,15 @@ class Episode extends Entity
                                         $this->attributes[
                                             'enclosure_duration'
                                         ]) *
-                                        60
+                                        60,
                                 ),
                         $this->attributes['enclosure_filesize'],
                         $this->attributes['enclosure_duration'],
-                        strtotime($this->attributes['published_at'])
-                    )
+                        strtotime($this->attributes['published_at']),
+                    ),
                 ),
-                $this->attributes['enclosure_uri']
-            )
+                $this->attributes['enclosure_uri'],
+            ),
         );
     }
 
@@ -384,22 +399,22 @@ class Episode extends Entity
      *
      * @return \App\Entities\EpisodePerson[]
      */
-    public function getEpisodePersons()
+    public function getPersons()
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Episode must be created before getting persons.'
+                'Episode must be created before getting persons.',
             );
         }
 
-        if (empty($this->episode_persons)) {
-            $this->episode_persons = (new EpisodePersonModel())->getPersonsByEpisodeId(
+        if (empty($this->persons)) {
+            $this->persons = (new EpisodePersonModel())->getPersonsByEpisodeId(
                 $this->podcast_id,
-                $this->id
+                $this->id,
             );
         }
 
-        return $this->episode_persons;
+        return $this->persons;
     }
 
     /**
@@ -411,28 +426,43 @@ class Episode extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Episode must be created before getting soundbites.'
+                'Episode must be created before getting soundbites.',
             );
         }
 
         if (empty($this->soundbites)) {
             $this->soundbites = (new SoundbiteModel())->getEpisodeSoundbites(
                 $this->getPodcast()->id,
-                $this->id
+                $this->id,
             );
         }
 
         return $this->soundbites;
     }
 
+    public function getNotes()
+    {
+        if (empty($this->id)) {
+            throw new \RuntimeException(
+                'Episode must be created before getting soundbites.',
+            );
+        }
+
+        if (empty($this->notes)) {
+            $this->notes = (new NoteModel())->getEpisodeNotes($this->id);
+        }
+
+        return $this->notes;
+    }
+
     public function getLink()
     {
         return base_url(
             route_to(
                 'episode',
                 $this->getPodcast()->name,
-                $this->attributes['slug']
-            )
+                $this->attributes['slug'],
+            ),
         );
     }
 
@@ -444,13 +474,13 @@ class Episode extends Entity
                     'embeddable-player-theme',
                     $this->getPodcast()->name,
                     $this->attributes['slug'],
-                    $theme
+                    $theme,
                 )
                 : route_to(
                     'embeddable-player',
                     $this->getPodcast()->name,
-                    $this->attributes['slug']
-                )
+                    $this->attributes['slug'],
+                ),
         );
     }
 
@@ -464,7 +494,7 @@ class Episode extends Entity
     public function getPodcast()
     {
         return (new PodcastModel())->getPodcastById(
-            $this->attributes['podcast_id']
+            $this->attributes['podcast_id'],
         );
     }
 
@@ -477,7 +507,7 @@ class Episode extends Entity
 
         $this->attributes['description_markdown'] = $descriptionMarkdown;
         $this->attributes['description_html'] = $converter->convertToHtml(
-            $descriptionMarkdown
+            $descriptionMarkdown,
         );
 
         return $this;
@@ -510,25 +540,11 @@ class Episode extends Entity
             preg_replace(
                 '/\s+/',
                 ' ',
-                strip_tags($this->attributes['description_html'])
-            )
+                strip_tags($this->attributes['description_html']),
+            ),
         );
     }
 
-    public function setCreatedBy(\App\Entities\User $user)
-    {
-        $this->attributes['created_by'] = $user->id;
-
-        return $this;
-    }
-
-    public function setUpdatedBy(\App\Entities\User $user)
-    {
-        $this->attributes['updated_by'] = $user->id;
-
-        return $this;
-    }
-
     public function getPublicationStatus()
     {
         if ($this->publication_status) {
@@ -588,7 +604,7 @@ class Episode extends Entity
             return '';
         } else {
             $xmlNode = (new \App\Libraries\SimpleRSSElement(
-                '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>'
+                '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>',
             ))
                 ->addChild('channel')
                 ->addChild('item');
@@ -596,7 +612,7 @@ class Episode extends Entity
                 [
                     'elements' => $this->custom_rss,
                 ],
-                $xmlNode
+                $xmlNode,
             );
             return str_replace(['<item>', '</item>'], '', $xmlNode->asXML());
         }
@@ -615,12 +631,12 @@ class Episode extends Entity
             simplexml_load_string(
                 '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel><item>' .
                     $customRssString .
-                    '</item></channel></rss>'
-            )
+                    '</item></channel></rss>',
+            ),
         )['elements'][0]['elements'][0];
         if (array_key_exists('elements', $customRssArray)) {
             $this->attributes['custom_rss'] = json_encode(
-                $customRssArray['elements']
+                $customRssArray['elements'],
             );
         } else {
             $this->attributes['custom_rss'] = null;
diff --git a/app/Entities/Image.php b/app/Entities/Image.php
deleted file mode 100644
index 0f64b16cb8..0000000000
--- a/app/Entities/Image.php
+++ /dev/null
@@ -1,151 +0,0 @@
-<?php
-
-/**
- * @copyright  2020 Podlibre
- * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
- * @link       https://castopod.org/
- */
-
-namespace App\Entities;
-
-use CodeIgniter\Entity;
-
-class Image extends Entity
-{
-    /**
-     * @var string
-     */
-    protected $original_path;
-
-    /**
-     * @var string
-     */
-    protected $original_url;
-
-    /**
-     * @var string
-     */
-    protected $thumbnail_path;
-
-    /**
-     * @var string
-     */
-    protected $thumbnail_url;
-
-    /**
-     * @var string
-     */
-    protected $medium_path;
-
-    /**
-     * @var string
-     */
-    protected $medium_url;
-
-    /**
-     * @var string
-     */
-    protected $large_path;
-
-    /**
-     * @var string
-     */
-    protected $large_url;
-
-    /**
-     * @var string
-     */
-    protected $feed_path;
-
-    /**
-     * @var string
-     */
-    protected $feed_url;
-
-    /**
-     * @var string
-     */
-    protected $id3_path;
-
-    public function __construct($originalUri)
-    {
-        helper('media');
-
-        $originalPath = media_path($originalUri);
-
-        [
-            'filename' => $filename,
-            'dirname' => $dirname,
-            'extension' => $extension,
-        ] = pathinfo($originalPath);
-
-        // load images extensions from config
-        $imageConfig = config('Images');
-        $thumbnailExtension = $imageConfig->thumbnailExtension;
-        $mediumExtension = $imageConfig->mediumExtension;
-        $largeExtension = $imageConfig->largeExtension;
-        $feedExtension = $imageConfig->feedExtension;
-        $id3Extension = $imageConfig->id3Extension;
-
-        $thumbnail =
-            $dirname . '/' . $filename . $thumbnailExtension . '.' . $extension;
-        $medium =
-            $dirname . '/' . $filename . $mediumExtension . '.' . $extension;
-        $large =
-            $dirname . '/' . $filename . $largeExtension . '.' . $extension;
-        $feed = $dirname . '/' . $filename . $feedExtension . '.' . $extension;
-        $id3 = $dirname . '/' . $filename . $id3Extension . '.' . $extension;
-
-        parent::__construct([
-            'original_path' => $originalPath,
-            'original_url' => media_url($originalUri),
-            'thumbnail_path' => $thumbnail,
-            'thumbnail_url' => base_url($thumbnail),
-            'medium_path' => $medium,
-            'medium_url' => base_url($medium),
-            'large_path' => $large,
-            'large_url' => base_url($large),
-            'feed_path' => $feed,
-            'feed_url' => base_url($feed),
-            'id3_path' => $id3,
-        ]);
-    }
-
-    public function saveSizes()
-    {
-        // load images sizes from config
-        $imageConfig = config('Images');
-        $thumbnailSize = $imageConfig->thumbnailSize;
-        $mediumSize = $imageConfig->mediumSize;
-        $largeSize = $imageConfig->largeSize;
-        $feedSize = $imageConfig->feedSize;
-        $id3Size = $imageConfig->id3Size;
-
-        $imageService = \Config\Services::image();
-
-        $imageService
-            ->withFile($this->attributes['original_path'])
-            ->resize($thumbnailSize, $thumbnailSize)
-            ->save($this->attributes['thumbnail_path']);
-
-        $imageService
-            ->withFile($this->attributes['original_path'])
-            ->resize($mediumSize, $mediumSize)
-            ->save($this->attributes['medium_path']);
-
-        $imageService
-            ->withFile($this->attributes['original_path'])
-            ->resize($largeSize, $largeSize)
-            ->save($this->attributes['large_path']);
-
-        $imageService
-            ->withFile($this->attributes['original_path'])
-            ->resize($feedSize, $feedSize)
-            ->save($this->attributes['feed_path']);
-
-        $imageService
-            ->withFile($this->attributes['original_path'])
-            ->resize($id3Size, $id3Size)
-            ->save($this->attributes['id3_path']);
-    }
-}
diff --git a/app/Entities/Note.php b/app/Entities/Note.php
new file mode 100644
index 0000000000..6ec4802990
--- /dev/null
+++ b/app/Entities/Note.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Entities;
+
+use App\Models\EpisodeModel;
+
+class Note extends \ActivityPub\Entities\Note
+{
+    /**
+     * @var \App\Entities\Episode|null
+     */
+    protected $episode;
+
+    protected $casts = [
+        'id' => 'string',
+        'uri' => 'string',
+        'actor_id' => 'integer',
+        'in_reply_to_id' => '?string',
+        'reblog_of_id' => '?string',
+        'episode_id' => '?integer',
+        'message' => 'string',
+        'message_html' => 'string',
+        'favourites_count' => 'integer',
+        'reblogs_count' => 'integer',
+        'replies_count' => 'integer',
+        'created_by' => 'integer',
+    ];
+
+    /**
+     * Returns the note's attached episode
+     *
+     * @return \App\Entities\Episode
+     */
+    public function getEpisode()
+    {
+        if (empty($this->episode_id)) {
+            throw new \RuntimeException(
+                'Note must have an episode_id before getting episode.',
+            );
+        }
+
+        if (empty($this->episode)) {
+            $this->episode = (new EpisodeModel())->getEpisodeById(
+                $this->episode_id,
+            );
+        }
+
+        return $this->episode;
+    }
+}
diff --git a/app/Entities/Person.php b/app/Entities/Person.php
index 8f20885c37..222aa56fbb 100644
--- a/app/Entities/Person.php
+++ b/app/Entities/Person.php
@@ -13,7 +13,7 @@ use CodeIgniter\Entity;
 class Person extends Entity
 {
     /**
-     * @var \App\Entities\Image
+     * @var \App\Libraries\Image
      */
     protected $image;
 
@@ -23,12 +23,13 @@ class Person extends Entity
         'unique_name' => 'string',
         'information_url' => '?string',
         'image_uri' => 'string',
+        'image_mimetype' => 'string',
         'created_by' => 'integer',
         'updated_by' => 'integer',
     ];
 
     /**
-     * Saves a picture in `public/media/~person/`
+     * Saves a picture in `public/media/persons/`
      *
      * @param \CodeIgniter\HTTP\Files\UploadedFile|\CodeIgniter\Files\File $image
      *
@@ -38,13 +39,15 @@ class Person extends Entity
         if ($image) {
             helper('media');
 
-            $this->attributes['image_uri'] = save_podcast_media(
+            $this->attributes['image_mimetype'] = $image->getMimeType();
+            $this->attributes['image_uri'] = save_media(
                 $image,
-                '~person',
-                $this->attributes['unique_name']
+                'persons',
+                $this->attributes['unique_name'],
             );
-            $this->image = new \App\Entities\Image(
-                $this->attributes['image_uri']
+            $this->image = new \App\Libraries\Image(
+                $this->attributes['image_uri'],
+                $this->attributes['image_mimetype'],
             );
             $this->image->saveSizes();
         }
@@ -54,6 +57,9 @@ class Person extends Entity
 
     public function getImage()
     {
-        return new \App\Entities\Image($this->attributes['image_uri']);
+        return new \App\Libraries\Image(
+            $this->attributes['image_uri'],
+            $this->attributes['image_mimetype'],
+        );
     }
 }
diff --git a/app/Entities/Podcast.php b/app/Entities/Podcast.php
index ec6c8e3f06..82922b2dd5 100644
--- a/app/Entities/Podcast.php
+++ b/app/Entities/Podcast.php
@@ -8,6 +8,7 @@
 
 namespace App\Entities;
 
+use ActivityPub\Models\ActorModel;
 use App\Models\CategoryModel;
 use App\Models\EpisodeModel;
 use App\Models\PlatformModel;
@@ -24,7 +25,12 @@ class Podcast extends Entity
     protected $link;
 
     /**
-     * @var \App\Entities\Image
+     * @var \ActivityPub\Entities\Actor
+     */
+    protected $actor;
+
+    /**
+     * @var \App\Libraries\Image
      */
     protected $image;
 
@@ -36,7 +42,7 @@ class Podcast extends Entity
     /**
      * @var \App\Entities\PodcastPerson[]
      */
-    protected $podcast_persons;
+    protected $persons;
 
     /**
      * @var \App\Entities\Category
@@ -89,11 +95,13 @@ class Podcast extends Entity
 
     protected $casts = [
         'id' => 'integer',
-        'title' => 'string',
+        'actor_id' => 'integer',
         'name' => 'string',
+        'title' => 'string',
         'description_markdown' => 'string',
         'description_html' => 'string',
         'image_uri' => 'string',
+        'image_mimetype' => 'string',
         'language_code' => 'string',
         'category_id' => 'integer',
         'parental_advisory' => '?string',
@@ -121,6 +129,26 @@ class Podcast extends Entity
         'updated_by' => 'integer',
     ];
 
+    /**
+     * Returns the podcast actor
+     *
+     * @return \App\Entities\Actor
+     */
+    public function getActor()
+    {
+        if (!$this->attributes['actor_id']) {
+            throw new \RuntimeException(
+                'Podcast must have an actor_id before getting actor.',
+            );
+        }
+
+        if (empty($this->actor)) {
+            $this->actor = (new ActorModel())->getActorById($this->actor_id);
+        }
+
+        return $this->actor;
+    }
+
     /**
      * Saves a cover image to the corresponding podcast folder in `public/media/podcast_name/`
      *
@@ -132,13 +160,16 @@ class Podcast extends Entity
         if ($image) {
             helper('media');
 
-            $this->attributes['image_uri'] = save_podcast_media(
+            $this->attributes['image_mimetype'] = $image->getMimeType();
+            $this->attributes['image_uri'] = save_media(
                 $image,
-                $this->attributes['name'],
-                'cover'
+                'podcasts/' . $this->attributes['name'],
+                'cover',
             );
-            $this->image = new \App\Entities\Image(
-                $this->attributes['image_uri']
+
+            $this->image = new \App\Libraries\Image(
+                $this->attributes['image_uri'],
+                $this->attributes['image_mimetype'],
             );
             $this->image->saveSizes();
         }
@@ -148,17 +179,20 @@ class Podcast extends Entity
 
     public function getImage()
     {
-        return new \App\Entities\Image($this->attributes['image_uri']);
+        return new \App\Libraries\Image(
+            $this->attributes['image_uri'],
+            $this->attributes['image_mimetype'],
+        );
     }
 
     public function getLink()
     {
-        return base_url(route_to('podcast', $this->attributes['name']));
+        return url_to('podcast-activity', $this->attributes['name']);
     }
 
     public function getFeedUrl()
     {
-        return base_url(route_to('podcast_feed', $this->attributes['name']));
+        return url_to('podcast_feed', $this->attributes['name']);
     }
 
     /**
@@ -170,14 +204,14 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting episodes.'
+                'Podcast must be created before getting episodes.',
             );
         }
 
         if (empty($this->episodes)) {
             $this->episodes = (new EpisodeModel())->getPodcastEpisodes(
                 $this->id,
-                $this->type
+                $this->type,
             );
         }
 
@@ -189,21 +223,21 @@ class Podcast extends Entity
      *
      * @return \App\Entities\PodcastPerson[]
      */
-    public function getPodcastPersons()
+    public function getPersons()
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting persons.'
+                'Podcast must be created before getting persons.',
             );
         }
 
-        if (empty($this->podcast_persons)) {
-            $this->podcast_persons = (new PodcastPersonModel())->getPersonsByPodcastId(
-                $this->id
+        if (empty($this->persons)) {
+            $this->persons = (new PodcastPersonModel())->getPersonsByPodcastId(
+                $this->id,
             );
         }
 
-        return $this->podcast_persons;
+        return $this->persons;
     }
 
     /**
@@ -215,7 +249,7 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting category.'
+                'Podcast must be created before getting category.',
             );
         }
 
@@ -235,13 +269,13 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcasts must be created before getting contributors.'
+                'Podcasts must be created before getting contributors.',
             );
         }
 
         if (empty($this->contributors)) {
             $this->contributors = (new UserModel())->getPodcastContributors(
-                $this->id
+                $this->id,
             );
         }
 
@@ -257,7 +291,7 @@ class Podcast extends Entity
 
         $this->attributes['description_markdown'] = $descriptionMarkdown;
         $this->attributes['description_html'] = $converter->convertToHtml(
-            $descriptionMarkdown
+            $descriptionMarkdown,
         );
 
         return $this;
@@ -293,25 +327,11 @@ class Podcast extends Entity
             preg_replace(
                 '/\s+/',
                 ' ',
-                strip_tags($this->attributes['description_html'])
-            )
+                strip_tags($this->attributes['description_html']),
+            ),
         );
     }
 
-    public function setCreatedBy(\App\Entities\User $user)
-    {
-        $this->attributes['created_by'] = $user->id;
-
-        return $this;
-    }
-
-    public function setUpdatedBy(\App\Entities\User $user)
-    {
-        $this->attributes['updated_by'] = $user->id;
-
-        return $this;
-    }
-
     /**
      * Returns the podcast's podcasting platform links
      *
@@ -321,14 +341,14 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting podcasting platform links.'
+                'Podcast must be created before getting podcasting platform links.',
             );
         }
 
         if (empty($this->podcastingPlatforms)) {
             $this->podcastingPlatforms = (new PlatformModel())->getPodcastPlatforms(
                 $this->id,
-                'podcasting'
+                'podcasting',
             );
         }
 
@@ -342,7 +362,7 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting podcasting platform.'
+                'Podcast must be created before getting podcasting platform.',
             );
         }
         foreach ($this->getPodcastingPlatforms() as $podcastingPlatform) {
@@ -362,14 +382,14 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting social platform links.'
+                'Podcast must be created before getting social platform links.',
             );
         }
 
         if (empty($this->socialPlatforms)) {
             $this->socialPlatforms = (new PlatformModel())->getPodcastPlatforms(
                 $this->id,
-                'social'
+                'social',
             );
         }
 
@@ -383,7 +403,7 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting social platform.'
+                'Podcast must be created before getting social platform.',
             );
         }
         foreach ($this->getSocialPlatforms() as $socialPlatform) {
@@ -403,14 +423,14 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting funding platform links.'
+                'Podcast must be created before getting funding platform links.',
             );
         }
 
         if (empty($this->fundingPlatforms)) {
             $this->fundingPlatforms = (new PlatformModel())->getPodcastPlatforms(
                 $this->id,
-                'funding'
+                'funding',
             );
         }
 
@@ -424,7 +444,7 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting Funding platform.'
+                'Podcast must be created before getting Funding platform.',
             );
         }
         foreach ($this->getFundingPlatforms() as $fundingPlatform) {
@@ -439,13 +459,13 @@ class Podcast extends Entity
     {
         if (empty($this->id)) {
             throw new \RuntimeException(
-                'Podcast must be created before getting other categories.'
+                'Podcast must be created before getting other categories.',
             );
         }
 
         if (empty($this->other_categories)) {
             $this->other_categories = (new CategoryModel())->getPodcastCategories(
-                $this->id
+                $this->id,
             );
         }
 
@@ -457,7 +477,7 @@ class Podcast extends Entity
         if (empty($this->other_categories_ids)) {
             $this->other_categories_ids = array_column(
                 $this->getOtherCategories(),
-                'id'
+                'id',
             );
         }
 
@@ -505,18 +525,18 @@ class Podcast extends Entity
             return '';
         } else {
             $xmlNode = (new \App\Libraries\SimpleRSSElement(
-                '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>'
+                '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"/>',
             ))->addChild('channel');
             array_to_rss(
                 [
                     'elements' => $this->custom_rss,
                 ],
-                $xmlNode
+                $xmlNode,
             );
             return str_replace(
                 ['<channel>', '</channel>'],
                 '',
-                $xmlNode->asXML()
+                $xmlNode->asXML(),
             );
         }
     }
@@ -534,12 +554,12 @@ class Podcast extends Entity
             simplexml_load_string(
                 '<?xml version="1.0" encoding="utf-8"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:podcast="https://github.com/Podcastindex-org/podcast-namespace/blob/main/docs/1.0.md" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0"><channel>' .
                     $customRssString .
-                    '</channel></rss>'
-            )
+                    '</channel></rss>',
+            ),
         )['elements'][0];
         if (array_key_exists('elements', $customRssArray)) {
             $this->attributes['custom_rss'] = json_encode(
-                $customRssArray['elements']
+                $customRssArray['elements'],
             );
         } else {
             $this->attributes['custom_rss'] = null;
diff --git a/app/Entities/Soundbite.php b/app/Entities/Soundbite.php
index 33373c8bde..04d8f29396 100644
--- a/app/Entities/Soundbite.php
+++ b/app/Entities/Soundbite.php
@@ -23,13 +23,6 @@ class Soundbite extends Entity
         'updated_by' => 'integer',
     ];
 
-    public function setCreatedBy(\App\Entities\User $user)
-    {
-        $this->attributes['created_by'] = $user->id;
-
-        return $this;
-    }
-
     public function setUpdatedBy(\App\Entities\User $user)
     {
         $this->attributes['updated_by'] = $user->id;
diff --git a/app/Filters/Permission.php b/app/Filters/PermissionFilter.php
similarity index 98%
rename from app/Filters/Permission.php
rename to app/Filters/PermissionFilter.php
index 462257b9f1..f40c6a499b 100644
--- a/app/Filters/Permission.php
+++ b/app/Filters/PermissionFilter.php
@@ -9,7 +9,7 @@ use CodeIgniter\HTTP\ResponseInterface;
 use CodeIgniter\Filters\FilterInterface;
 use Myth\Auth\Exceptions\PermissionException;
 
-class Permission implements FilterInterface
+class PermissionFilter implements FilterInterface
 {
     /**
      * Do whatever processing this filter needs to do.
diff --git a/app/Helpers/analytics_helper.php b/app/Helpers/analytics_helper.php
index 3360de8335..e7b393dbaa 100644
--- a/app/Helpers/analytics_helper.php
+++ b/app/Helpers/analytics_helper.php
@@ -6,30 +6,6 @@
  * @link       https://castopod.org/
  */
 
-/**
- * For compatibility with PHP-FPM v7.2 and below:
- */
-if (!function_exists('getallheaders')) {
-    function getallheaders()
-    {
-        $headers = [];
-        foreach ($_SERVER as $name => $value) {
-            if (substr($name, 0, 5) == 'HTTP_') {
-                $headers[
-                    str_replace(
-                        ' ',
-                        '-',
-                        ucwords(
-                            strtolower(str_replace('_', ' ', substr($name, 5)))
-                        )
-                    )
-                ] = $value;
-            }
-        }
-        return $headers;
-    }
-}
-
 /**
  * Encode Base64 for URLs
  */
@@ -57,7 +33,7 @@ function set_user_session_deny_list_ip()
     if (!$session->has('denyListIp')) {
         $session->set(
             'denyListIp',
-            \Podlibre\Ipcat\IpDb::find($_SERVER['REMOTE_ADDR']) != null
+            \Podlibre\Ipcat\IpDb::find($_SERVER['REMOTE_ADDR']) != null,
         );
     }
 }
@@ -81,7 +57,7 @@ function set_user_session_location()
     if (!$session->has('location')) {
         try {
             $cityReader = new \GeoIp2\Database\Reader(
-                WRITEPATH . 'uploads/GeoLite2-City/GeoLite2-City.mmdb'
+                WRITEPATH . 'uploads/GeoLite2-City/GeoLite2-City.mmdb',
             );
             $city = $cityReader->city($_SERVER['REMOTE_ADDR']);
 
@@ -132,7 +108,7 @@ function set_user_session_player()
             try {
                 $db = \Config\Database::connect();
                 $procedureNameAnalyticsUnknownUseragents = $db->prefixTable(
-                    'analytics_unknown_useragents'
+                    'analytics_unknown_useragents',
                 );
                 $db->query("CALL $procedureNameAnalyticsUnknownUseragents(?)", [
                     $userAgent,
@@ -283,7 +259,7 @@ function podcast_hit(
                     '_' .
                     $_SERVER['HTTP_USER_AGENT'] .
                     '_' .
-                    $episodeId
+                    $episodeId,
             );
         // Was this episode downloaded in the past 24h:
         $downloadedBytes = cache($episodeHashId);
@@ -335,7 +311,7 @@ function podcast_hit(
                             '_' .
                             $_SERVER['HTTP_USER_AGENT'] .
                             '_' .
-                            $podcastId
+                            $podcastId,
                     );
                 $newListener = 1;
                 // Has this listener already downloaded an episode today:
@@ -370,7 +346,7 @@ function podcast_hit(
                         $duration,
                         $age,
                         $newListener,
-                    ]
+                    ],
                 );
             }
         }
diff --git a/app/Helpers/auth_helper.php b/app/Helpers/auth_helper.php
new file mode 100644
index 0000000000..d1d095baaf
--- /dev/null
+++ b/app/Helpers/auth_helper.php
@@ -0,0 +1,89 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+use ActivityPub\Models\ActorModel;
+use CodeIgniter\Database\Exceptions\DataException;
+use Config\Services;
+
+if (!function_exists('set_interact_as_actor')) {
+    /**
+     * Sets the actor id of which the user is acting as
+     *
+     * @return void
+     */
+    function set_interact_as_actor($actorId)
+    {
+        $authenticate = Services::authentication();
+        $authenticate->check();
+
+        $session = session();
+        $session->set('interact_as_actor_id', $actorId);
+    }
+}
+
+if (!function_exists('remove_interact_as_actor')) {
+    /**
+     * Removes the actor id of which the user is acting as
+     *
+     * @return void
+     */
+    function remove_interact_as_actor()
+    {
+        $session = session();
+        $session->remove('interact_as_actor_id');
+    }
+}
+
+if (!function_exists('interact_as_actor_id')) {
+    /**
+     * Sets the podcast id of which the user is acting as
+     *
+     * @return integer
+     */
+    function interact_as_actor_id()
+    {
+        $authenticate = Services::authentication();
+        $authenticate->check();
+
+        $session = session();
+        return $session->get('interact_as_actor_id');
+    }
+}
+
+if (!function_exists('interact_as_actor')) {
+    /**
+     * Get the actor the user is currently interacting as
+     *
+     * @return \ActivityPub\Entities\Actor|false
+     */
+    function interact_as_actor()
+    {
+        $authenticate = Services::authentication();
+        $authenticate->check();
+
+        $session = session();
+        if ($session->has('interact_as_actor_id')) {
+            return (new ActorModel())->getActorById(
+                $session->get('interact_as_actor_id'),
+            );
+        }
+
+        return false;
+    }
+}
+
+if (!function_exists('can_user_interact')) {
+    /**
+     * @return bool
+     * @throws DataException
+     */
+    function can_user_interact()
+    {
+        return interact_as_actor() ? true : false;
+    }
+}
diff --git a/app/Helpers/components_helper.php b/app/Helpers/components_helper.php
index 78b1516e42..7c85e95136 100644
--- a/app/Helpers/components_helper.php
+++ b/app/Helpers/components_helper.php
@@ -30,34 +30,34 @@ if (!function_exists('button')) {
             'size' => 'base',
             'iconLeft' => null,
             'iconRight' => null,
-            'isRoundedFull' => false,
             'isSquared' => false,
         ];
         $options = array_merge($defaultOptions, $customOptions);
 
         $baseClass =
-            'inline-flex items-center shadow-xs outline-none focus:shadow-outline';
+            'inline-flex items-center font-semibold shadow-xs rounded-full focus:outline-none focus:ring';
 
         $variantClass = [
-            'default' => 'bg-gray-300 hover:bg-gray-400',
-            'primary' => 'text-white bg-green-500 hover:bg-green-600',
+            'default' => 'text-black bg-gray-300 hover:bg-gray-400',
+            'primary' => 'text-white bg-pine-700 hover:bg-pine-800',
             'secondary' => 'text-white bg-gray-700 hover:bg-gray-800',
+            'accent' => 'text-white bg-rose-600 hover:bg-rose-800',
             'success' => 'text-white bg-green-600 hover:bg-green-700',
             'danger' => 'text-white bg-red-600 hover:bg-red-700',
             'warning' => 'text-black bg-yellow-500 hover:bg-yellow-600',
-            'info' => 'text-white bg-teal-500 hover:bg-teal-600',
+            'info' => 'text-white bg-blue-500 hover:bg-blue-600',
         ];
 
         $sizeClass = [
-            'small' => 'text-xs md:text-sm ',
+            'small' => 'text-xs md:text-sm',
             'base' => 'text-sm md:text-base',
             'large' => 'text-lg md:text-xl',
         ];
 
         $basePaddings = [
-            'small' => 'px-1 md:px-2 md:py-1',
-            'base' => 'px-2 py-1 md:px-3 md:py-2',
-            'large' => 'px-3 py-2 md:px-4 md:py-2',
+            'small' => 'px-2 md:px-3 md:py-1',
+            'base' => 'px-3 py-1 md:px-4 md:py-2',
+            'large' => 'px-3 py-2 md:px-5',
         ];
 
         $squaredPaddings = [
@@ -66,20 +66,9 @@ if (!function_exists('button')) {
             'large' => 'p-3',
         ];
 
-        $roundedClass = [
-            'full' => 'rounded-full',
-            'small' => 'rounded-sm md:rounded',
-            'base' => 'rounded md:rounded-md',
-            'large' => 'rounded-md md:rounded-lg',
-        ];
-
         $buttonClass =
             $baseClass .
             ' ' .
-            ($options['isRoundedFull']
-                ? $roundedClass['full']
-                : $roundedClass[$options['size']]) .
-            ' ' .
             ($options['isSquared']
                 ? $squaredPaddings[$options['size']]
                 : $basePaddings[$options['size']]) .
@@ -109,23 +98,23 @@ if (!function_exists('button')) {
                     [
                         'class' => $buttonClass,
                     ],
-                    $customAttributes
-                )
+                    $customAttributes,
+                ),
             );
         }
 
         $defaultButtonAttributes = [
             'type' => 'button',
         ];
-        $attributes = array_merge($defaultButtonAttributes, $customAttributes);
+        $attributes = stringify_attributes(
+            array_merge($defaultButtonAttributes, $customAttributes),
+        );
 
-        return '<button class="' .
-            $buttonClass .
-            '"' .
-            stringify_attributes($attributes) .
-            '>' .
-            $label .
-            '</button>';
+        return <<<HTML
+            <button class="$buttonClass" $attributes>
+            $label
+            </button>
+        HTML;
     }
 }
 
@@ -152,7 +141,6 @@ if (!function_exists('icon_button')) {
         $customAttributes = []
     ): string {
         $defaultOptions = [
-            'isRoundedFull' => true,
             'isSquared' => true,
         ];
         $options = array_merge($defaultOptions, $customOptions);
@@ -185,7 +173,7 @@ if (!function_exists('hint_tooltip')) {
         $tooltip =
             '<span data-toggle="tooltip" data-placement="bottom" tabindex="0" title="' .
             $hintText .
-            '" class="inline-block align-middle outline-none focus:shadow-outline';
+            '" class="inline-block text-gray-500 align-middle outline-none focus:ring';
 
         if ($class !== '') {
             $tooltip .= ' ' . $class;
@@ -223,8 +211,8 @@ if (!function_exists('data_table')) {
             'cell_start' => '<td class="px-4 py-2">',
             'cell_alt_start' => '<td class="px-4 py-2">',
 
-            'row_start' => '<tr class="bg-gray-100 hover:bg-green-100">',
-            'row_alt_start' => '<tr class="hover:bg-green-100">',
+            'row_start' => '<tr class="bg-gray-100 hover:bg-pine-100">',
+            'row_alt_start' => '<tr class="hover:bg-pine-100">',
         ];
 
         $table->setTemplate($template);
@@ -276,8 +264,8 @@ if (!function_exists('publication_pill')) {
     ): string {
         $class =
             $publicationStatus === 'published'
-                ? 'text-green-500 border-green-500'
-                : 'text-orange-600 border-orange-600';
+                ? 'text-pine-500 border-pine-500'
+                : 'text-red-600 border-red-600';
 
         $transParam = [];
         if ($publicationDate) {
@@ -294,10 +282,10 @@ if (!function_exists('publication_pill')) {
 
         $label = lang(
             'Episode.publication_status.' . $publicationStatus,
-            $transParam
+            $transParam,
         );
 
-        return '<span class="px-1 border ' .
+        return '<span class="px-1 font-semibold border ' .
             $class .
             ' ' .
             $customClass .
@@ -309,6 +297,56 @@ if (!function_exists('publication_pill')) {
 
 // ------------------------------------------------------------------------
 
+if (!function_exists('publication_button')) {
+    /**
+     * Publication button component
+     *
+     * Displays the appropriate publication button depending on the publication status.
+     *
+     * @param integer   $podcastId
+     * @param integer   $episodeId
+     * @param boolean   $publicationStatus the episode's publication status     *
+     * @return string
+     */
+    function publication_button(
+        $podcastId,
+        $episodeId,
+        $publicationStatus
+    ): string {
+        switch ($publicationStatus) {
+            case 'not_published':
+                $label = lang('Episode.publish');
+                $route = route_to('episode-publish', $podcastId, $episodeId);
+                $variant = 'primary';
+                $iconLeft = 'upload-cloud';
+                break;
+            case 'scheduled':
+                $label = lang('Episode.publish_edit');
+                $route = route_to(
+                    'episode-publish_edit',
+                    $podcastId,
+                    $episodeId,
+                );
+                $variant = 'accent';
+                $iconLeft = 'upload-cloud';
+                break;
+            case 'published':
+                $label = lang('Episode.unpublish');
+                $route = route_to('episode-unpublish', $podcastId, $episodeId);
+                $variant = 'danger';
+                $iconLeft = 'cloud-off';
+                break;
+        }
+
+        return button($label, $route, [
+            'variant' => $variant,
+            'iconLeft' => $iconLeft,
+        ]);
+    }
+}
+
+// ------------------------------------------------------------------------
+
 if (!function_exists('episode_numbering')) {
     /**
      * Returns relevant translated episode numbering.
@@ -387,21 +425,16 @@ if (!function_exists('location_link')) {
         $link = '';
 
         if (!empty($locationName)) {
-            $link = button(
-                $locationName,
+            $link = anchor(
                 location_url($locationName, $locationGeo, $locationOsmid),
-                [
-                    'variant' => 'default',
-                    'size' => 'small',
-                    'isRoundedFull' => true,
-                    'iconLeft' => 'map-pin',
-                ],
+                icon('map-pin', 'mr-2') . $locationName,
                 [
                     'class' =>
-                        'text-gray-800' . (empty($class) ? '' : " $class"),
+                        'inline-flex items-baseline hover:underline' .
+                        (empty($class) ? '' : " $class"),
                     'target' => '_blank',
                     'rel' => 'noreferrer noopener',
-                ]
+                ],
             );
         }
 
diff --git a/app/Helpers/media_helper.php b/app/Helpers/media_helper.php
index 8db7a66396..88e494c7f9 100644
--- a/app/Helpers/media_helper.php
+++ b/app/Helpers/media_helper.php
@@ -6,6 +6,8 @@
  * @link       https://castopod.org/
  */
 
+use CodeIgniter\Files\File;
+use CodeIgniter\HTTP\Exceptions\HTTPException;
 use CodeIgniter\HTTP\ResponseInterface;
 
 /**
@@ -17,25 +19,31 @@ use CodeIgniter\HTTP\ResponseInterface;
  *
  * @return string The episode's file path in media root
  */
-function save_podcast_media($file, $podcast_name, $media_name)
+function save_media($file, $folder, $mediaName)
 {
-    $file_name = $media_name . '.' . $file->getExtension();
+    $file_name = $mediaName . '.' . $file->getExtension();
 
-    $mediaRoot = config('App')->mediaRoot;
+    $mediaRoot = config('App')->mediaRoot . '/' . $folder;
 
-    if (!file_exists($mediaRoot . '/' . $podcast_name)) {
-        mkdir($mediaRoot . '/' . $podcast_name, 0777, true);
-        touch($mediaRoot . '/' . $podcast_name . '/index.html');
+    if (!file_exists($mediaRoot)) {
+        mkdir($mediaRoot, 0777, true);
+        touch($mediaRoot . '/index.html');
     }
 
     // move to media folder and overwrite file if already existing
-    $file->move($mediaRoot . '/' . $podcast_name . '/', $file_name, true);
+    $file->move($mediaRoot . '/', $file_name, true);
 
-    return $podcast_name . '/' . $file_name;
+    return $folder . '/' . $file_name;
 }
 
+/**
+ * @param string $fileUrl
+ * @return File
+ */
 function download_file($fileUrl)
 {
+    var_dump($fileUrl);
+
     $client = \Config\Services::curlrequest();
     $uri = new \CodeIgniter\HTTP\URI($fileUrl);
 
@@ -58,11 +66,11 @@ function download_file($fileUrl)
                 ResponseInterface::HTTP_TEMPORARY_REDIRECT,
                 ResponseInterface::HTTP_PERMANENT_REDIRECT,
             ],
-            true
+            true,
         )
     ) {
         $newFileUrl = (string) trim(
-            $response->getHeader('location')->getValue()
+            $response->getHeader('location')->getValue(),
         );
         $newLocation = new \CodeIgniter\HTTP\URI($newFileUrl);
         $response = $client->get($newLocation, [
diff --git a/app/Helpers/misc_helper.php b/app/Helpers/misc_helper.php
index b87051c479..92c16ffa44 100644
--- a/app/Helpers/misc_helper.php
+++ b/app/Helpers/misc_helper.php
@@ -167,3 +167,5 @@ if (!function_exists('format_duration')) {
         );
     }
 }
+
+//--------------------------------------------------------------------
diff --git a/app/Helpers/persons_helper.php b/app/Helpers/persons_helper.php
index 5fe79d763b..62dd6b1264 100644
--- a/app/Helpers/persons_helper.php
+++ b/app/Helpers/persons_helper.php
@@ -9,87 +9,40 @@
 /**
  * Fetches persons from an episode
  *
- * @param array  $podcast_persons
- * @param array    &$persons
+ * @param array  $persons
+ * @param array    &$personsArray
  */
-function constructs_podcast_person_array($podcast_persons, &$persons)
+function construct_person_array($persons, &$personsArray)
 {
-    foreach ($podcast_persons as $podcastPerson) {
-        if (array_key_exists($podcastPerson->person->id, $persons)) {
-            $persons[$podcastPerson->person->id]['roles'] .=
-                empty($podcastPerson->person_group) ||
-                empty($podcastPerson->person_role)
+    foreach ($persons as $person) {
+        if (array_key_exists($person->person->id, $personsArray)) {
+            $personsArray[$person->person->id]['roles'] .=
+                empty($person->person_group) || empty($person->person_role)
                     ? ''
-                    : (empty($persons[$podcastPerson->person->id]['roles'])
+                    : (empty($personsArray[$person->person->id]['roles'])
                             ? ''
                             : ', ') .
                         lang(
                             'PersonsTaxonomy.persons.' .
-                                $podcastPerson->person_group .
+                                $person->person_group .
                                 '.roles.' .
-                                $podcastPerson->person_role .
-                                '.label'
+                                $person->person_role .
+                                '.label',
                         );
         } else {
-            $persons[$podcastPerson->person->id] = [
-                'full_name' => $podcastPerson->person->full_name,
-                'information_url' => $podcastPerson->person->information_url,
-                'thumbnail_url' => $podcastPerson->person->image->thumbnail_url,
+            $personsArray[$person->person->id] = [
+                'full_name' => $person->person->full_name,
+                'information_url' => $person->person->information_url,
+                'thumbnail_url' => $person->person->image->thumbnail_url,
                 'roles' =>
-                    empty($podcastPerson->person_group) ||
-                    empty($podcastPerson->person_role)
+                    empty($person->person_group) || empty($person->person_role)
                         ? ''
                         : lang(
                             'PersonsTaxonomy.persons.' .
-                                $podcastPerson->person_group .
+                                $person->person_group .
                                 '.roles.' .
-                                $podcastPerson->person_role .
-                                '.label'
-                        ),
-            ];
-        }
-    }
-}
-
-/**
- * Fetches persons from an episode
- *
- * @param array  $episode_persons
- * @param array  &$persons
- */
-function construct_episode_person_array($episode_persons, &$persons)
-{
-    foreach ($episode_persons as $episodePerson) {
-        if (array_key_exists($episodePerson->person->id, $persons)) {
-            $persons[$episodePerson->person->id]['roles'] .=
-                empty($episodePerson->person_group) ||
-                empty($episodePerson->person_role)
-                    ? ''
-                    : (empty($persons[$episodePerson->person->id]['roles'])
-                            ? ''
-                            : ', ') .
-                        lang(
-                            'PersonsTaxonomy.persons.' .
-                                $episodePerson->person_group .
-                                '.roles.' .
-                                $episodePerson->person_role .
-                                '.label'
-                        );
-        } else {
-            $persons[$episodePerson->person->id] = [
-                'full_name' => $episodePerson->person->full_name,
-                'information_url' => $episodePerson->person->information_url,
-                'thumbnail_url' => $episodePerson->person->image->thumbnail_url,
-                'roles' =>
-                    empty($episodePerson->person_group) ||
-                    empty($episodePerson->person_role)
-                        ? ''
-                        : lang(
-                            'PersonsTaxonomy.persons.' .
-                                $episodePerson->person_group .
-                                '.roles.' .
-                                $episodePerson->person_role .
-                                '.label'
+                                $person->person_role .
+                                '.label',
                         ),
             ];
         }
diff --git a/app/Helpers/rss_helper.php b/app/Helpers/rss_helper.php
index 0da88a191a..90767aae86 100644
--- a/app/Helpers/rss_helper.php
+++ b/app/Helpers/rss_helper.php
@@ -165,7 +165,7 @@ function get_rss_feed($podcast, $serviceSlug = '')
         }
     }
 
-    foreach ($podcast->podcast_persons as $podcastPerson) {
+    foreach ($podcast->persons as $podcastPerson) {
         $podcastPersonElement = $channel->addChild(
             'person',
             htmlspecialchars($podcastPerson->person->full_name),
@@ -358,7 +358,7 @@ function get_rss_feed($podcast, $serviceSlug = '')
             $soundbiteElement->addAttribute('duration', $soundbite->duration);
         }
 
-        foreach ($episode->episode_persons as $episodePerson) {
+        foreach ($episode->persons as $episodePerson) {
             $episodePersonElement = $item->addChild(
                 'person',
                 htmlspecialchars($episodePerson->person->full_name),
diff --git a/app/Helpers/svg_helper.php b/app/Helpers/svg_helper.php
index 9474c4a08c..56e36ccfaa 100644
--- a/app/Helpers/svg_helper.php
+++ b/app/Helpers/svg_helper.php
@@ -20,7 +20,7 @@ function icon(string $name, string $class = '')
         $svg_contents = str_replace(
             '<svg',
             '<svg class="' . $class . '"',
-            $svg_contents
+            $svg_contents,
         );
     }
 
@@ -41,36 +41,7 @@ function svg($name, $class = null)
         $svg_contents = str_replace(
             '<svg',
             '<svg class="' . $class . '"',
-            $svg_contents
-        );
-    }
-    return $svg_contents;
-}
-
-/**
- * Returns the inline svg platform icon. Returns the default icon if not found.
- *
- * @param  string $name name of the image file without the .svg extension
- * @param  string $class to be added to the svg string
- * @return string svg contents
- */
-function platform_icon($type, $name, $class = null)
-{
-    try {
-        $svg_contents = file_get_contents(
-            'assets/images/platforms/' . $type . '/' . $name . '.svg'
-        );
-    } catch (\Exception $e) {
-        $svg_contents = file_get_contents(
-            'assets/images/platforms/_default.svg'
-        );
-    }
-
-    if ($class) {
-        $svg_contents = str_replace(
-            '<svg',
-            '<svg class="' . $class . '"',
-            $svg_contents
+            $svg_contents,
         );
     }
     return $svg_contents;
diff --git a/app/Helpers/url_helper.php b/app/Helpers/url_helper.php
index 6fa434aefd..43e287f992 100644
--- a/app/Helpers/url_helper.php
+++ b/app/Helpers/url_helper.php
@@ -74,3 +74,34 @@ if (!function_exists('location_url')) {
         return $uri;
     }
 }
+//--------------------------------------------------------------------
+
+if (!function_exists('extract_params_from_episode_uri')) {
+    /**
+     * Returns podcast name and episode slug from episode string uri
+     *
+     * @param URI $episodeUri
+     * @return string|null
+     */
+    function extract_params_from_episode_uri($episodeUri)
+    {
+        preg_match(
+            '/@(?P<podcastName>[a-zA-Z0-9\_]{1,32})\/episodes\/(?P<episodeSlug>[a-zA-Z0-9\-]{1,191})/',
+            $episodeUri->getPath(),
+            $matches
+        );
+
+        if (
+            $matches &&
+            array_key_exists('podcastName', $matches) &&
+            array_key_exists('episodeSlug', $matches)
+        ) {
+            return [
+                'podcastName' => $matches['podcastName'],
+                'episodeSlug' => $matches['episodeSlug'],
+            ];
+        }
+
+        return null;
+    }
+}
diff --git a/app/Language/en/ActivityPub.php b/app/Language/en/ActivityPub.php
new file mode 100644
index 0000000000..38b9573dd0
--- /dev/null
+++ b/app/Language/en/ActivityPub.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Your handle',
+    'your_handle_hint' => 'Enter the @username@domain you want to act from.',
+    'follow' => [
+        'label' => 'Follow',
+        'title' => 'Follow {actorDisplayName}',
+        'subtitle' => 'You are going to follow:',
+        'accountNotFound' => 'The account could not be found.',
+        'submit' => 'Proceed to follow',
+    ],
+    'favourite' => [
+        'title' => 'Favourite {actorDisplayName}\'s note',
+        'subtitle' => 'You are going to favourite:',
+        'submit' => 'Proceed to favourite',
+    ],
+    'reblog' => [
+        'title' => 'Share {actorDisplayName}\'s note',
+        'subtitle' => 'You are going to share:',
+        'submit' => 'Proceed to share',
+    ],
+    'reply' => [
+        'title' => 'Reply to {actorDisplayName}\'s note',
+        'subtitle' => 'You are going to reply to:',
+        'submit' => 'Proceed to reply',
+    ],
+];
diff --git a/app/Language/en/Admin.php b/app/Language/en/Admin.php
index 62a75a8e29..5585b4ff2f 100644
--- a/app/Language/en/Admin.php
+++ b/app/Language/en/Admin.php
@@ -9,4 +9,5 @@
 return [
     'dashboard' => 'Admin dashboard',
     'welcome_message' => 'Welcome to the admin area!',
+    'choose_interact' => 'Choose how to interact',
 ];
diff --git a/app/Language/en/AdminNavigation.php b/app/Language/en/AdminNavigation.php
index aa36aabfd2..820767f4dd 100644
--- a/app/Language/en/AdminNavigation.php
+++ b/app/Language/en/AdminNavigation.php
@@ -17,6 +17,9 @@ return [
     'persons' => 'Persons',
     'person-list' => 'All persons',
     'person-create' => 'New person',
+    'fediverse' => 'Fediverse',
+    'fediverse-blocked-actors' => 'Blocked accounts',
+    'fediverse-blocked-domains' => 'Blocked domains',
     'users' => 'Users',
     'user-list' => 'All users',
     'user-create' => 'New user',
diff --git a/app/Language/en/Breadcrumb.php b/app/Language/en/Breadcrumb.php
index ab1e511c9c..68f510f2d0 100644
--- a/app/Language/en/Breadcrumb.php
+++ b/app/Language/en/Breadcrumb.php
@@ -17,6 +17,11 @@ return [
     'new' => 'new',
     'edit' => 'edit',
     'persons' => 'persons',
+    'publish' => 'publish',
+    'publish-edit' => 'edit publication',
+    'unpublish' => 'unpublish',
+    'fediverse' => 'fediverse',
+    'block-lists' => 'block lists',
     'users' => 'users',
     'my-account' => 'my account',
     'change-password' => 'change password',
diff --git a/app/Language/en/Common.php b/app/Language/en/Common.php
index f1d101e1e6..d2a5966c16 100644
--- a/app/Language/en/Common.php
+++ b/app/Language/en/Common.php
@@ -9,14 +9,18 @@
 return [
     'yes' => 'Yes',
     'no' => 'No',
+    'cancel' => 'Cancel',
     'optional' => 'Optional',
+    'more' => 'More',
     'no_data' => 'No data found!',
+    'close' => 'Close',
     'home' => 'Home',
     'explicit' => 'Explicit',
     'mediumDate' => '{0,date,medium}',
     'powered_by' => 'Powered by {castopod}.',
     'actions' => 'Actions',
     'pageInfo' => 'Page {currentPage} out of {pageCount}',
+    'go_back' => 'Go back',
     'forms' => [
         'multiSelect' => [
             'selectText' => 'Press to select',
diff --git a/app/Language/en/Episode.php b/app/Language/en/Episode.php
index 27f448e193..457df6fe7b 100644
--- a/app/Language/en/Episode.php
+++ b/app/Language/en/Episode.php
@@ -7,19 +7,33 @@
  */
 
 return [
-    'previous_episode' => 'Previous episode',
-    'previous_season' => 'Previous season',
-    'next_episode' => 'Next episode',
-    'next_season' => 'Next season',
     'season' => 'Season {seasonNumber}',
     'season_abbr' => 'S{seasonNumber}',
     'number' => 'Episode {episodeNumber}',
     'number_abbr' => 'Ep. {episodeNumber}',
     'season_episode' => 'Season {seasonNumber} episode {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'back_to_episodes' => 'Back to episodes of {podcast}',
+    'activity' => 'Activity',
+    'description' => 'Description',
+    'total_favourites' => '{numberOfTotalFavourites, plural,
+        one {# total favourite}
+        other {# total favourites}
+    }',
+    'total_reblogs' => '{numberOfTotalReblogs, plural,
+        one {# total share}
+        other {# total shares}
+    }',
+    'total_notes' => '{numberOfTotalNotes, plural,
+        one {# note}
+        other {# total notes}
+    }',
     'all_podcast_episodes' => 'All podcast episodes',
     'back_to_podcast' => 'Go back to podcast',
     'edit' => 'Edit',
+    'publish' => 'Publish',
+    'publish_edit' => 'Edit publication',
+    'unpublish' => 'Unpublish',
     'delete' => 'Delete',
     'go_to_page' => 'Go to page',
     'create' => 'Add an episode',
@@ -51,19 +65,6 @@ return [
             'trailer' => 'Trailer',
             'bonus' => 'Bonus',
         ],
-        'show_notes_section_title' => 'Show notes',
-        'show_notes_section_subtitle' =>
-            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
-        'description' => 'Description',
-        'description_footer' => 'Description footer',
-        'description_footer_hint' =>
-            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
-        'publication_section_title' => 'Publication info',
-        'publication_section_subtitle' => '',
-        'publication_date' => 'Publication date',
-        'publication_date_clear' => 'Clear publication date',
-        'publication_date_hint' =>
-            'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
         'parental_advisory' => [
             'label' => 'Parental advisory',
             'hint' => 'Does the episode contain explicit content?',
@@ -71,30 +72,59 @@ return [
             'clean' => 'Clean',
             'explicit' => 'Explicit',
         ],
-        'block' => 'Episode should be hidden from all platforms',
-        'block_hint' =>
-            'The episode show or hide status. If you want this episode removed from the Apple directory, toggle this on.',
+        'show_notes_section_title' => 'Show notes',
+        'show_notes_section_subtitle' =>
+            'Up to 4000 characters, be clear and concise. Show notes help potential listeners in finding the episode.',
+        'description' => 'Description',
+        'description_footer' => 'Description footer',
+        'description_footer_hint' =>
+            'This text is added at the end of each episode description, it is a good place to input your social links for example.',
         'additional_files_section_title' => 'Additional files',
         'additional_files_section_subtitle' =>
             'These files may be used by other platforms to provide better experience to your audience.<br />See the {podcastNamespaceLink} for more information.',
+        'location_section_title' => 'Location',
+        'location_section_subtitle' => 'What place is this episode about?',
+        'location_name' => 'Location name or address',
+        'location_name_hint' => 'This can be a real or fictional location',
         'transcript' => 'Transcript or closed captions',
         'transcript_hint' => 'Allowed formats are txt, html, srt or json.',
         'transcript_delete' => 'Delete transcript',
         'chapters' => 'Chapters',
         'chapters_hint' => 'File should be in JSON Chapters Format.',
         'chapters_delete' => 'Delete chapters',
-        'location_section_title' => 'Location',
-        'location_section_subtitle' => 'What place is this episode about?',
-        'location_name' => 'Location name or address',
-        'location_name_hint' => 'This can be a real place or fictional',
         'advanced_section_title' => 'Advanced Parameters',
         'advanced_section_subtitle' =>
             'If you need RSS tags that Castopod does not handle, set them here.',
         'custom_rss' => 'Custom RSS tags for the episode',
         'custom_rss_hint' => 'This will be injected within the ❬item❭ tag.',
+        'block' => 'Episode should be hidden from all platforms',
+        'block_hint' =>
+            'The episode show or hide status. If you want this episode removed from the Apple directory, toggle this on.',
         'submit_create' => 'Create episode',
         'submit_edit' => 'Save episode',
     ],
+    'publish_form' => [
+        'note' => 'Your note',
+        'note_hint' =>
+            'The message you write will be broadcasted to all your followers in the fediverse.',
+        'publication_date' => 'Publication date',
+        'publication_method' => [
+            'now' => 'Now',
+            'schedule' => 'Schedule',
+        ],
+        'scheduled_publication_date' => 'Scheduled publication date',
+        'scheduled_publication_date_clear' => 'Clear publication date',
+        'scheduled_publication_date_hint' =>
+            'You can schedule the episode release by setting a future publication date. This field must be formatted as YYYY-MM-DD HH:mm',
+        'submit' => 'Publish',
+        'submit_edit' => 'Edit publication',
+    ],
+    'unpublish_form' => [
+        'disclaimer' =>
+            'Unpublishing the episode will delete all the notes associated with the episode and remove it from the podcast\'s RSS feed.',
+        'understand' => 'I understand, I want to unpublish the episode',
+        'submit' => 'Unpublish',
+    ],
     'soundbites' => 'Soundbites',
     'soundbites_form' => [
         'title' => 'Edit soundbites',
diff --git a/app/Language/en/Fediverse.php b/app/Language/en/Fediverse.php
new file mode 100644
index 0000000000..17cd0d0b76
--- /dev/null
+++ b/app/Language/en/Fediverse.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'blocked_actors' => 'Blocked accounts',
+    'blocked_domains' => 'Blocked domains',
+    'block_lists_form' => [
+        'handle' => 'Account handle',
+        'handle_hint' => 'Input @username@domain account.',
+        'domain' => 'Domain name',
+        'submit' => 'Block!',
+    ],
+    'list' => [
+        'actor' => 'Account',
+        'domain' => 'Domain name',
+        'unblock' => 'Unblock',
+    ],
+];
diff --git a/app/Language/en/Note.php b/app/Language/en/Note.php
new file mode 100644
index 0000000000..ba75903229
--- /dev/null
+++ b/app/Language/en/Note.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => '{actorDisplayName}\'s Note',
+    'back_to_actor_notes' => 'Back to {actor} notes',
+    'actor_shared' => '{actor} shared',
+    'reply_to' => 'Reply to @{actorUsername}',
+    'form' => [
+        'message_placeholder' => 'Write a message...',
+        'episode_message_placeholder' => 'Write a message for the episode...',
+        'episode_url_placeholder' => 'Episode URL',
+        'reply_to_placeholder' => 'Reply to @{actorUsername}',
+        'submit' => 'Send!',
+        'submit_reply' => 'Reply',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favourite}
+        other {# favourites}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# share}
+        other {# shares}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# reply}
+        other {# replies}
+    }',
+    'expand' => 'Expand note',
+    'block_actor' => 'Block user @{actorUsername}',
+    'block_domain' => 'Block domain @{actorDomain}',
+    'delete' => 'Delete note',
+];
diff --git a/app/Language/en/Page.php b/app/Language/en/Page.php
index c15145b1ef..4ddf960222 100644
--- a/app/Language/en/Page.php
+++ b/app/Language/en/Page.php
@@ -7,6 +7,7 @@
  */
 
 return [
+    'back_to_home' => 'Back to home',
     'page' => 'Page',
     'all_pages' => 'All pages',
     'create' => 'New page',
@@ -21,6 +22,6 @@ return [
         'submit_edit' => 'Save',
     ],
     'messages' => [
-        'createSuccess' => 'The {pageTitle} page was created successfully!',
+        'createSuccess' => 'The page "{pageTitle}" was created successfully!',
     ],
 ];
diff --git a/app/Language/en/Podcast.php b/app/Language/en/Podcast.php
index 67f135b26b..a80477b755 100644
--- a/app/Language/en/Podcast.php
+++ b/app/Language/en/Podcast.php
@@ -209,9 +209,26 @@ return [
     ],
     'by' => 'By {publisher}',
     'season' => 'Season {seasonNumber}',
-    'list_of_episodes_year' => '{year} episodes',
-    'list_of_episodes_season' => 'Season {seasonNumber} episodes',
+    'list_of_episodes_year' => '{year} episodes ({episodeCount})',
+    'list_of_episodes_season' =>
+        'Season {seasonNumber} episodes ({episodeCount})',
     'no_episode' => 'No episode found!',
     'no_episode_hint' =>
         'Navigate the podcast episodes with the navigation bar above.',
+    'follow' => 'Follow',
+    'followers' => '{numberOfFollowers, plural,
+        one {<span class="font-semibold">#</span> follower}
+        other {<span class="font-semibold">#</span> followers}
+    }',
+    'notes' => '{numberOfNotes, plural,
+        one {<span class="font-semibold">#</span> note}
+        other {<span class="font-semibold">#</span> notes}
+    }',
+    'activity' => 'Activity',
+    'episodes' => 'Episodes',
+    'sponsor_title' => 'Enjoying the show?',
+    'sponsor' => 'Sponsor',
+    'funding_links' => 'Funding links for {podcastTitle}',
+    'find_on' => 'Find {podcastTitle} on',
+    'listen_on' => 'Listen on',
 ];
diff --git a/app/Language/en/PodcastNavigation.php b/app/Language/en/PodcastNavigation.php
index 49062fe30e..f577326d4d 100644
--- a/app/Language/en/PodcastNavigation.php
+++ b/app/Language/en/PodcastNavigation.php
@@ -14,6 +14,8 @@ return [
     'episodes' => 'Episodes',
     'episode-list' => 'All episodes',
     'episode-create' => 'New episode',
+    'fediverse' => 'Fediverse',
+    'fediverse-block_lists' => 'Block lists',
     'analytics' => 'Analytics',
     'persons' => 'Persons',
     'podcast-person-manage' => 'Manage persons',
diff --git a/app/Language/fr/ActivityPub.php b/app/Language/fr/ActivityPub.php
new file mode 100644
index 0000000000..b60d822d96
--- /dev/null
+++ b/app/Language/fr/ActivityPub.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'your_handle' => 'Votre pseudonyme',
+    'your_handle_hint' =>
+        'Entrez le @utilisateur@domaine avec lequel vous voulez interagir.',
+    'follow' => [
+        'label' => 'Suivre',
+        'title' => 'Suivre {actorDisplayName}',
+        'subtitle' => 'Vous allez suivre :',
+        'accountNotFound' => 'Le compte n’a pas pu être trouvé.',
+        'submit' => 'Poursuivre',
+    ],
+    'favourite' => [
+        'title' => 'Mettez la note de {actorDisplayName} en favori',
+        'subtitle' => 'Vous allez mettre en favori :',
+        'submit' => 'Poursuivre',
+    ],
+    'reblog' => [
+        'title' => 'Partagez la note de {actorDisplayName}',
+        'subtitle' => 'Vous allez partager :',
+        'submit' => 'Poursuivre',
+    ],
+    'reply' => [
+        'title' => 'Répondre à la note de {actorDisplayName}',
+        'subtitle' => 'Vous allez répondre à :',
+        'submit' => 'Poursuivre',
+    ],
+];
diff --git a/app/Language/fr/AdminNavigation.php b/app/Language/fr/AdminNavigation.php
index b22523f359..011880451a 100644
--- a/app/Language/fr/AdminNavigation.php
+++ b/app/Language/fr/AdminNavigation.php
@@ -17,6 +17,9 @@ return [
     'persons' => 'Intervenants',
     'person-list' => 'Tous les intervenants',
     'person-create' => 'Nouvel intervenant',
+    'fediverse' => 'Fédiverse',
+    'fediverse-blocked_actors' => 'Utilisateurs blockés',
+    'fediverse-blocked_domains' => 'Domaines blockés',
     'users' => 'Utilisateurs',
     'user-list' => 'Tous les utilisateurs',
     'user-create' => 'Créer un utilisateur',
diff --git a/app/Language/fr/Breadcrumb.php b/app/Language/fr/Breadcrumb.php
index 179238e9f1..ba60f46f66 100644
--- a/app/Language/fr/Breadcrumb.php
+++ b/app/Language/fr/Breadcrumb.php
@@ -17,6 +17,11 @@ return [
     'new' => 'créer',
     'edit' => 'modifier',
     'persons' => 'intervenants',
+    'publish' => 'publier',
+    'publish-edit' => 'modifier la publication',
+    'unpublish' => 'dépublier',
+    'fediverse' => 'fédiverse',
+    'block-lists' => 'listes de blocage',
     'users' => 'utilisateurs',
     'my-account' => 'mon compte',
     'change-password' => 'changer le mot de passe',
diff --git a/app/Language/fr/Common.php b/app/Language/fr/Common.php
index 59a9514eca..48b599e0fd 100644
--- a/app/Language/fr/Common.php
+++ b/app/Language/fr/Common.php
@@ -9,14 +9,18 @@
 return [
     'yes' => 'Oui',
     'no' => 'Non',
+    'cancel' => 'Annuler',
     'optional' => 'Optionnel',
+    'more' => 'Plus',
     'no_data' => 'Aucune donnée trouvée !',
+    'close' => 'Fermer',
     'home' => 'Accueil',
     'explicit' => 'Explicite',
     'mediumDate' => '{0,date,medium}',
     'powered_by' => 'Propulsé par {castopod}.',
     'actions' => 'Actions',
     'pageInfo' => 'Page {currentPage} sur {pageCount}',
+    'go_back' => 'Retour en arrière',
     'forms' => [
         'multiSelect' => [
             'selectText' => 'Cliquez pour selectionner',
diff --git a/app/Language/fr/Episode.php b/app/Language/fr/Episode.php
index 70f233af72..f9d3868496 100644
--- a/app/Language/fr/Episode.php
+++ b/app/Language/fr/Episode.php
@@ -7,19 +7,33 @@
  */
 
 return [
-    'previous_episode' => 'Épisode précédent',
-    'previous_season' => 'Saison précédente',
-    'next_episode' => 'Épisode suivant',
-    'next_season' => 'Saison suivante',
     'season' => 'Saison {seasonNumber}',
     'season_abbr' => 'S{seasonNumber}',
     'number' => 'Épisode {episodeNumber}',
     'number_abbr' => 'Ep. {episodeNumber}',
     'season_episode' => 'Saison {seasonNumber} épisode {episodeNumber}',
     'season_episode_abbr' => 'S{seasonNumber}E{episodeNumber}',
+    'back_to_episodes' => 'Retour aux épisodes de {podcast}',
+    'activity' => 'Activité',
+    'description' => 'Description',
+    'total_favourites' => '{numberOfTotalFavourites, plural,
+        one {# favori en tout}
+        other {# favoris en tout}
+    }',
+    'total_reblogs' => '{numberOfTotalReblogs, plural,
+        one {# partage en tout}
+        other {# partages en tout}
+    }',
+    'total_notes' => '{numberOfTotalNotes, plural,
+        one {# note}
+        other {# notes}
+    }',
     'all_podcast_episodes' => 'Tous les épisodes du podcast',
     'back_to_podcast' => 'Revenir au podcast',
     'edit' => 'Modifier',
+    'publish' => 'Publier',
+    'publish_edit' => 'Modifier la publication',
+    'unpublish' => 'Dépublier',
     'delete' => 'Supprimer',
     'go_to_page' => 'Voir',
     'create' => 'Ajouter un épisode',
@@ -51,19 +65,6 @@ return [
             'trailer' => 'Bande-annonce',
             'bonus' => 'Bonus',
         ],
-        'show_notes_section_title' => 'Notes d’épisode (Show Notes)',
-        'show_notes_section_subtitle' =>
-            'Jusque 4000 caractères, soyez clairs et concis. Les notes d’épisode aident les auditeurs potentiels à le trouver.',
-        'description' => 'Description',
-        'description_footer' => 'Pied de description',
-        'description_footer_hint' =>
-            'Ce texte est ajouté à la fin de chaque description d’épisode, c’est un bon endroit pour placer vos liens sociaux par exemple.',
-        'publication_section_title' => 'Information de publication',
-        'publication_section_subtitle' => '',
-        'publication_date' => 'Date de publication',
-        'publication_date_clear' => 'Effacer la date de publication',
-        'publication_date_hint' =>
-            'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm',
         'parental_advisory' => [
             'label' => 'Avertissement parental',
             'hint' => 'L’épisode contient-il un contenu explicite ?',
@@ -71,12 +72,20 @@ return [
             'clean' => 'Convenable',
             'explicit' => 'Explicite',
         ],
-        'block' => 'L’épisode doit être masqué de toutes les plateformes',
-        'block_hint' =>
-            'La visibilité de l’épisode. Si vous souhaitez retirer cet épisode de l’index Apple, activez ce champ.',
+        'show_notes_section_title' => 'Notes d’épisode (Show Notes)',
+        'show_notes_section_subtitle' =>
+            'Jusque 4000 caractères, soyez clairs et concis. Les notes d’épisode aident les auditeurs potentiels à le trouver.',
+        'description' => 'Description',
+        'description_footer' => 'Pied de description',
+        'description_footer_hint' =>
+            'Ce texte est ajouté à la fin de chaque description d’épisode, c’est un bon endroit pour placer vos liens sociaux par exemple.',
         'additional_files_section_title' => 'Fichiers additionels',
         'additional_files_section_subtitle' =>
             'Ces fichiers pourront être utilisées par d’autres plate-formes pour procurer une meilleure expérience à vos auditeurs.<br />Consulter le {podcastNamespaceLink} pour plus d’informations.',
+        'location_section_title' => 'Localisation',
+        'location_section_subtitle' => 'De quel lieu cet épisode parle-t-il ?',
+        'location_name' => 'Nom ou adresse du lieu',
+        'location_name_hint' => 'Ce lieu peut être réel ou fictif',
         'transcript' => 'Transcription ou sous-titrage',
         'transcript_hint' =>
             'Les formats autorisés sont txt, html, srt ou json.',
@@ -84,18 +93,39 @@ return [
         'chapters' => 'Chapitrage',
         'chapters_hint' => 'Le fichier doit être en "JSON Chapters Format".',
         'chapters_delete' => 'Supprimer le chapitrage',
-        'location_section_title' => 'Localisation',
-        'location_section_subtitle' => 'De quel lieu cet épisode parle-t-il ?',
-        'location_name' => 'Nom ou adresse du lieu',
-        'location_name_hint' => 'Ce lieu peut être réel ou fictif',
         'advanced_section_title' => 'Paramètres avancés',
         'advanced_section_subtitle' =>
-            'Si vous avez besoin d’une balise que nous n’avons pas couverte, définissez-la ici.',
+            'Si vous avez besoin d’une balise que Castopod ne couvre pas, définissez-la ici.',
         'custom_rss' => 'Balises RSS personnalisées pour l’épisode',
         'custom_rss_hint' => 'Ceci sera injecté dans la balise ❬item❭.',
+        'block' => 'L’épisode doit être masqué de toutes les plateformes',
+        'block_hint' =>
+            'La visibilité de l’épisode. Si vous souhaitez retirer cet épisode de l’index Apple, activez ce champ.',
         'submit_create' => 'Créer l’épisode',
         'submit_edit' => 'Enregistrer l’épisode',
     ],
+    'publish_form' => [
+        'publication_date' => 'Date de publication',
+        'publication_date_clear' => 'Effacer la date de publication',
+        'publication_date_hint' =>
+            'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm',
+    ],
+    'publish_form' => [
+        'note' => 'Votre note',
+        'note_hint' =>
+            'Le message que vous écrirez sera diffusé à toutes les personnes qui vous suivent dans le fédiverse.',
+        'publication_date' => 'Date de publication',
+        'publication_method' => [
+            'now' => 'Maintenant',
+            'schedule' => 'Planifier',
+        ],
+        'scheduled_publication_date' => 'Date de publication programmée',
+        'scheduled_publication_date_clear' => 'Effacer la date de publication',
+        'scheduled_publication_date_hint' =>
+            'Vous pouvez planifier la sortie de l’épisode en saisissant une date de publication future. Ce champ doit être au format YYYY-MM-DD HH:mm',
+        'submit' => 'Publier',
+        'submit_edit' => 'Modifier la publication',
+    ],
     'soundbites' => 'Extraits sonores',
     'soundbites_form' => [
         'title' => 'Modifier les extraits sonores',
diff --git a/app/Language/fr/Fediverse.php b/app/Language/fr/Fediverse.php
new file mode 100644
index 0000000000..3d7da1af9e
--- /dev/null
+++ b/app/Language/fr/Fediverse.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'block_lists' => 'Listes de blocage',
+    'block_lists_form' => [
+        'blocked_users' => 'Utilisateurs bloqués',
+        'blocked_users_hint' =>
+            'Entrez les pseudonymes @utilisateur@domaine séparés par une virgule.',
+        'blocked_domains' => 'Domaines bloqués',
+        'blocked_domains_hint' =>
+            'Entrez les noms de domaine séparés par une virgule.',
+        'submit' => 'Sauvegarder les listes',
+    ],
+];
diff --git a/app/Language/fr/Note.php b/app/Language/fr/Note.php
new file mode 100644
index 0000000000..fe97031c05
--- /dev/null
+++ b/app/Language/fr/Note.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+return [
+    'title' => 'Note de {actorDisplayName}',
+    'back_to_actor_notes' => 'Retour aux notes de {actor}',
+    'actor_shared' => '{actor} a partagé',
+    'reply_to' => 'Répondre à @{actorUsername}',
+    'form' => [
+        'message_placeholder' => 'Écrivez votre message...',
+        'episode_message_placeholder' =>
+            'Écrivez votre message pour l’épisode...',
+        'episode_url_placeholder' => 'URL de l’épisode',
+        'reply_to_placeholder' => 'Répondre à @{actorUsername}',
+        'submit' => 'Envoyer!',
+        'submit_reply' => 'Répondre',
+    ],
+    'favourites' => '{numberOfFavourites, plural,
+        one {# favori}
+        other {# favoris}
+    }',
+    'reblogs' => '{numberOfReblogs, plural,
+        one {# partage}
+        other {# partages}
+    }',
+    'replies' => '{numberOfReplies, plural,
+        one {# réponse}
+        other {# réponses}
+    }',
+    'expand' => 'Ouvrir la note',
+    'block_actor' => 'Bloquer l’utilisateur @{actorUsername}',
+    'block_domain' => 'Bloquer le domaine @{actorDomain}',
+    'delete' => 'Supprimer la note',
+];
diff --git a/app/Language/fr/Page.php b/app/Language/fr/Page.php
index adc10995cb..0514060255 100644
--- a/app/Language/fr/Page.php
+++ b/app/Language/fr/Page.php
@@ -7,6 +7,7 @@
  */
 
 return [
+    'back_to_home' => 'Retour à l’accueil',
     'page' => 'Page',
     'all_pages' => 'Toutes les pages',
     'create' => 'Créer une page',
diff --git a/app/Language/fr/Podcast.php b/app/Language/fr/Podcast.php
index 7daaf77149..3c4ef20447 100644
--- a/app/Language/fr/Podcast.php
+++ b/app/Language/fr/Podcast.php
@@ -211,9 +211,26 @@ return [
     ],
     'by' => 'Par {publisher}',
     'season' => 'Saison {seasonNumber}',
-    'list_of_episodes_year' => 'épisodes {year}',
-    'list_of_episodes_season' => 'Épisodes de la saison {seasonNumber}',
+    'list_of_episodes_year' => 'Épisodes de {year} (episodeCount)',
+    'list_of_episodes_season' =>
+        'Épisodes de la saison {seasonNumber} (episodeCount)',
     'no_episode' => 'Aucun épisode trouvé !',
     'no_episode_hint' =>
         'Naviguez au sein des épisodes du podcast episodes grâce à la barre de navigation ci-dessus.',
+    'follow' => 'Suivre',
+    'followers' => '{numberOfFollowers, plural,
+        one {<span class="font-semibold">#</span> abonné·e}
+        other {<span class="font-semibold">#</span> abonné·e·s}
+    }',
+    'notes' => '{numberOfNotes, plural,
+        one {<span class="font-semibold">#</span> note}
+        other {<span class="font-semibold">#</span> notes}
+    }',
+    'activity' => 'Activité',
+    'episodes' => 'Épisodes',
+    'sponsor_title' => 'Vous aimez le podcast ?',
+    'sponsor' => 'Soutenez-nous',
+    'funding_links' => 'Liens de financement pour {podcastTitle}',
+    'find_on' => 'Trouvez {podcastTitle} sur',
+    'listen_on' => 'Écoutez sur',
 ];
diff --git a/app/Language/fr/PodcastNavigation.php b/app/Language/fr/PodcastNavigation.php
index 1b5414bc69..77bf5041ad 100644
--- a/app/Language/fr/PodcastNavigation.php
+++ b/app/Language/fr/PodcastNavigation.php
@@ -14,6 +14,8 @@ return [
     'episodes' => 'Épisodes',
     'episode-list' => 'Tous les épisodes',
     'episode-create' => 'Créer un épisode',
+    'fediverse' => 'Fédiverse',
+    'fediverse-block_lists' => 'Listes de blocage',
     'analytics' => 'Mesures d’audience',
     'persons' => 'Intervenants',
     'podcast-person-manage' => 'Gestion des intervenants',
diff --git a/app/Libraries/ActivityPub/Activities/AcceptActivity.php b/app/Libraries/ActivityPub/Activities/AcceptActivity.php
new file mode 100644
index 0000000000..13c18021f2
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/AcceptActivity.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class AcceptActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Accept';
+}
diff --git a/app/Libraries/ActivityPub/Activities/AnnounceActivity.php b/app/Libraries/ActivityPub/Activities/AnnounceActivity.php
new file mode 100644
index 0000000000..30dcf4d292
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/AnnounceActivity.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class AnnounceActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Announce';
+
+    public function __construct($reblogNote)
+    {
+        $this->actor = $reblogNote->actor->uri;
+        $this->object = $reblogNote->reblog_of_note->uri;
+
+        $this->published = $reblogNote->published_at->format(DATE_W3C);
+
+        $this->cc = [
+            $reblogNote->actor->uri,
+            $reblogNote->actor->followers_url,
+        ];
+    }
+}
diff --git a/app/Libraries/ActivityPub/Activities/CreateActivity.php b/app/Libraries/ActivityPub/Activities/CreateActivity.php
new file mode 100644
index 0000000000..bb479e0424
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/CreateActivity.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class CreateActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Create';
+}
diff --git a/app/Libraries/ActivityPub/Activities/DeleteActivity.php b/app/Libraries/ActivityPub/Activities/DeleteActivity.php
new file mode 100644
index 0000000000..58483f6e21
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/DeleteActivity.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class DeleteActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Delete';
+}
diff --git a/app/Libraries/ActivityPub/Activities/FollowActivity.php b/app/Libraries/ActivityPub/Activities/FollowActivity.php
new file mode 100644
index 0000000000..b78e091204
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/FollowActivity.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class FollowActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Follow';
+}
diff --git a/app/Libraries/ActivityPub/Activities/LikeActivity.php b/app/Libraries/ActivityPub/Activities/LikeActivity.php
new file mode 100644
index 0000000000..df21cc42f4
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/LikeActivity.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class LikeActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Like';
+}
diff --git a/app/Libraries/ActivityPub/Activities/UndoActivity.php b/app/Libraries/ActivityPub/Activities/UndoActivity.php
new file mode 100644
index 0000000000..aa21fd34a2
--- /dev/null
+++ b/app/Libraries/ActivityPub/Activities/UndoActivity.php
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Activities;
+
+use ActivityPub\Core\Activity;
+
+class UndoActivity extends Activity
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Undo';
+}
diff --git a/app/Libraries/ActivityPub/ActivityRequest.php b/app/Libraries/ActivityPub/ActivityRequest.php
new file mode 100644
index 0000000000..3386dc77c9
--- /dev/null
+++ b/app/Libraries/ActivityPub/ActivityRequest.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub;
+
+use CodeIgniter\I18n\Time;
+use phpseclib\Crypt\RSA;
+
+class ActivityRequest
+{
+    /**
+     * @var \CodeIgniter\HTTP\CURLRequest
+     */
+    protected $request;
+
+    /**
+     * @var \CodeIgniter\HTTP\URI
+     */
+    protected $uri;
+
+    /**
+     * @var \ActivityPub\Core\Activity|null
+     */
+    protected $activity;
+
+    /**
+     * @var array
+     */
+    protected $options = [
+        'headers' => [
+            'Content-Type' => 'application/activity+json',
+            'Accept' => 'application/activity+json', // TODO: outgoing and incoming requests
+        ],
+    ];
+
+    /**
+     * @param string $uri
+     * @param string $activityPayload
+     */
+    public function __construct($uri, $activityPayload = null)
+    {
+        $this->request = \Config\Services::curlrequest();
+
+        if ($activityPayload) {
+            $this->request->setBody($activityPayload);
+        }
+
+        $this->uri = new \CodeIgniter\HTTP\URI($uri);
+    }
+
+    public function post()
+    {
+        // send Message to Fediverse instance
+        $this->request->post($this->uri, $this->options);
+    }
+
+    public function get()
+    {
+        return $this->request->get($this->uri, $this->options);
+    }
+
+    public function getDomain()
+    {
+        return $this->uri->getHost() .
+            ($this->uri->getPort() ? ':' . $this->uri->getPort() : '');
+    }
+
+    public function sign($keyId, $privateKey)
+    {
+        $rsa = new RSA();
+        $rsa->loadKey($privateKey); // private key
+        $rsa->setHash('sha256');
+        $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
+
+        $path =
+            $this->uri->getPath() .
+            ($this->uri->getQuery() ? "?{$this->uri->getQuery()}" : '');
+        $host = $this->uri->getHost();
+        $date = Time::now('GMT')->format('D, d M Y H:i:s T');
+        $digest = 'SHA-256=' . base64_encode($this->getBodyDigest());
+        $contentType = $this->options['headers']['Content-Type'];
+        $contentLength = strval(strlen($this->request->getBody()));
+        $userAgent = 'Castopod';
+
+        $plainText = "(request-target): post $path\nhost: $host\ndate: $date\ndigest: $digest\ncontent-type: $contentType\ncontent-length: $contentLength\nuser-agent: $userAgent";
+
+        $signature = $rsa->sign($plainText);
+
+        $signatureHeader =
+            'keyId="' .
+            $keyId .
+            '",algorithm="rsa-sha256",headers="(request-target) host date digest content-type content-length user-agent",signature="' .
+            base64_encode($signature) .
+            '"';
+
+        $this->options = [
+            'headers' => [
+                'Content-Type' => $contentType,
+                'Content-Length' => $contentLength,
+                'Authorization' => "Signature $signatureHeader",
+                'Signature' => $signatureHeader,
+                'Host' => $host,
+                'Date' => $date,
+                'User-Agent' => $userAgent,
+                'Digest' => $digest,
+            ],
+        ];
+    }
+
+    protected function getBodyDigest()
+    {
+        return hash('sha256', $this->request->getBody(), true);
+    }
+}
diff --git a/app/Libraries/ActivityPub/Config/ActivityPub.php b/app/Libraries/ActivityPub/Config/ActivityPub.php
new file mode 100644
index 0000000000..199817af0f
--- /dev/null
+++ b/app/Libraries/ActivityPub/Config/ActivityPub.php
@@ -0,0 +1,22 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Config;
+
+use CodeIgniter\Config\BaseConfig;
+
+class ActivityPub extends BaseConfig
+{
+    /**
+     * --------------------------------------------------------------------
+     * ActivityPub Objects
+     * --------------------------------------------------------------------
+     */
+    public $actorObject = 'ActivityPub\Objects\ActorObject';
+    public $noteObject = 'ActivityPub\Objects\NoteObject';
+}
diff --git a/app/Libraries/ActivityPub/Config/Routes.php b/app/Libraries/ActivityPub/Config/Routes.php
new file mode 100644
index 0000000000..9f68c1a986
--- /dev/null
+++ b/app/Libraries/ActivityPub/Config/Routes.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+$routes->addPlaceholder('actorUsername', '[a-zA-Z0-9\_]{1,32}');
+$routes->addPlaceholder(
+    'uuid',
+    '[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-4[0-9A-Fa-f]{3}-[89ABab][0-9A-Fa-f]{3}-[0-9A-Fa-f]{12}',
+);
+$routes->addPlaceholder('noteAction', '\bfavourite|\breblog|\breply');
+
+/**
+ * ActivityPub routes file
+ */
+
+$routes->group('', ['namespace' => 'ActivityPub\Controllers'], function (
+    $routes
+) {
+    // webfinger
+    $routes->get('.well-known/webfinger', 'WebFingerController', [
+        'as' => 'webfinger',
+    ]);
+
+    // Actor
+    $routes->group('@(:actorUsername)', function ($routes) {
+        // Actor
+        $routes->get('/', 'ActorController/$1', [
+            'as' => 'actor',
+        ]);
+        $routes->post('inbox', 'ActorController::inbox/$1', [
+            'as' => 'inbox',
+            'filter' =>
+                'activity-pub:verify-activitystream,verify-blocks,verify-signature',
+        ]);
+        $routes->get('outbox', 'ActorController::outbox/$1', [
+            'as' => 'outbox',
+            'filter' => 'activity-pub:verify-activitystream',
+        ]);
+        $routes->get('followers', 'ActorController::followers/$1', [
+            'as' => 'followers',
+            'filter' => 'activity-pub::activity-stream',
+        ]);
+        $routes->post('follow', 'ActorController::attemptFollow/$1', [
+            'as' => 'attempt-follow',
+        ]);
+        $routes->get('activities/(:uuid)', 'ActorController::activity/$1/$2', [
+            'as' => 'activity',
+        ]);
+    });
+
+    // Note
+    $routes->post('notes/new', 'NoteController::attemptCreate/$1', [
+        'as' => 'note-attempt-create',
+    ]);
+
+    $routes->get('notes/(:uuid)', 'NoteController/$1', [
+        'as' => 'note',
+    ]);
+
+    $routes->get('notes/(:uuid)/replies', 'NoteController/$1', [
+        'as' => 'note-replies',
+    ]);
+
+    $routes->post(
+        'notes/(:uuid)/remote/(:noteAction)',
+        'NoteController::attemptRemoteAction/$1/$2/$3',
+        [
+            'as' => 'note-attempt-remote-action',
+        ],
+    );
+
+    // Blocking actors and domains
+    $routes->post(
+        'fediverse-block-actor',
+        'BlockController::attemptBlockActor',
+        ['as' => 'fediverse-attempt-block-actor'],
+    );
+
+    $routes->post(
+        'fediverse-block-domain',
+        'BlockController::attemptBlockDomain',
+        ['as' => 'fediverse-attempt-block-domain'],
+    );
+
+    $routes->post(
+        'fediverse-unblock-actor',
+        'BlockController::attemptUnblockActor',
+        [
+            'as' => 'fediverse-attempt-unblock-actor',
+        ],
+    );
+
+    $routes->post(
+        'fediverse-unblock-domain',
+        'BlockController::attemptUnblockDomain',
+        [
+            'as' => 'fediverse-attempt-unblock-domain',
+        ],
+    );
+
+    $routes->cli('scheduled-activities', 'SchedulerController::activity');
+});
diff --git a/app/Libraries/ActivityPub/Controllers/ActorController.php b/app/Libraries/ActivityPub/Controllers/ActorController.php
new file mode 100644
index 0000000000..e6cdc3a284
--- /dev/null
+++ b/app/Libraries/ActivityPub/Controllers/ActorController.php
@@ -0,0 +1,376 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Controllers;
+
+use ActivityPub\Objects\OrderedCollectionObject;
+use ActivityPub\Objects\OrderedCollectionPage;
+use CodeIgniter\Controller;
+use CodeIgniter\I18n\Time;
+
+class ActorController extends Controller
+{
+    protected $helpers = ['activitypub'];
+
+    /**
+     * @var \ActivityPub\Entities\Actor
+     */
+    protected $actor;
+
+    /**
+     * @var \ActivityPub\Config\ActivityPub
+     */
+    protected $config;
+
+    public function __construct()
+    {
+        $this->config = config('ActivityPub');
+    }
+
+    public function _remap($method, ...$params)
+    {
+        if (count($params) > 0) {
+            if (
+                !($this->actor = model('ActorModel')->getActorByUsername(
+                    $params[0],
+                ))
+            ) {
+                throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+            }
+        }
+        unset($params[0]);
+
+        return $this->$method(...$params);
+    }
+
+    public function index()
+    {
+        $actorObjectClass = $this->config->actorObject;
+        $actorObject = new $actorObjectClass($this->actor);
+
+        return $this->response
+            ->setContentType('application/activity+json')
+            ->setBody($actorObject->toJSON());
+    }
+
+    /**
+     * Handles incoming requests from fediverse servers
+     */
+    public function inbox()
+    {
+        // get json body and parse it
+        $payload = $this->request->getJSON();
+
+        // retrieve payload actor from database or create it if it doesn't exist
+        $payloadActor = get_or_create_actor_from_uri($payload->actor);
+
+        // store activity to database
+        $activityId = model('ActivityModel')->newActivity(
+            $payload->type,
+            $payloadActor->id,
+            $this->actor->id,
+            null,
+            json_encode($payload),
+        );
+
+        // switch/case on activity type
+        switch ($payload->type) {
+            case 'Create':
+                switch ($payload->object->type) {
+                    case 'Note':
+                        if (!$payload->object->inReplyTo) {
+                            return $this->response
+                                ->setStatusCode(501)
+                                ->setJSON([]);
+                        }
+
+                        $replyToNote = model('NoteModel')->getNoteByUri(
+                            $payload->object->inReplyTo,
+                        );
+
+                        // TODO: strip content from html to retrieve message
+                        // remove all html tags and reconstruct message with mentions?
+                        extract_text_from_html($payload->object->content);
+
+                        $reply = new \ActivityPub\Entities\Note([
+                            'uri' => $payload->object->id,
+                            'actor_id' => $payloadActor->id,
+                            'in_reply_to_id' => $replyToNote->id,
+                            'message' => $payload->object->content,
+                            'published_at' => Time::parse(
+                                $payload->object->published,
+                            ),
+                        ]);
+
+                        $noteId = model('NoteModel')->addReply(
+                            $reply,
+                            true,
+                            false,
+                        );
+
+                        model('ActivityModel')->update($activityId, [
+                            'note_id' => service('uuid')
+                                ->fromBytes($noteId)
+                                ->getString(),
+                        ]);
+
+                        return $this->response->setStatusCode(200)->setJSON([]);
+                    default:
+                        // return not handled undo error (501 = not implemented)
+                        return $this->response->setStatusCode(501)->setJSON([]);
+                }
+                break;
+            case 'Delete':
+                $noteToDelete = model('NoteModel')->getNoteByUri(
+                    $payload->object->id,
+                );
+
+                model('NoteModel')->removeNote($noteToDelete, false);
+
+                return $this->response->setStatusCode(200)->setJSON([]);
+            case 'Follow':
+                // add to followers table
+                model('FollowModel')->addFollower(
+                    $payloadActor,
+                    $this->actor,
+                    false,
+                );
+
+                // Automatically accept follow by returning accept activity
+                accept_follow($this->actor, $payloadActor, $payload->id);
+
+                // TODO: return 202 (Accepted) followed!
+                return $this->response->setStatusCode(202)->setJSON([]);
+
+            case 'Like':
+                // get favourited note
+                $note = model('NoteModel')->getNoteByUri($payload->object);
+
+                // Like side-effect
+                model('FavouriteModel')->addFavourite(
+                    $payloadActor,
+                    $note,
+                    false,
+                );
+
+                model('ActivityModel')->update($activityId, [
+                    'note_id' => $note->id,
+                ]);
+
+                return $this->response->setStatusCode(200)->setJSON([]);
+            case 'Announce':
+                $note = model('NoteModel')->getNoteByUri($payload->object);
+
+                model('ActivityModel')->update($activityId, [
+                    'note_id' => $note->id,
+                ]);
+
+                model('NoteModel')->reblog($payloadActor, $note, false);
+
+                return $this->response->setStatusCode(200)->setJSON([]);
+            case 'Undo':
+                // switch/case on the type of activity to undo
+                switch ($payload->object->type) {
+                    case 'Follow':
+                        // revert side-effect by removing follow from database
+                        model('FollowModel')->removeFollower(
+                            $payloadActor,
+                            $this->actor,
+                            false,
+                        );
+
+                        // TODO: undo has been accepted! (202 - Accepted)
+                        return $this->response->setStatusCode(202)->setJSON([]);
+                    case 'Like':
+                        $note = model('NoteModel')->getNoteByUri(
+                            $payload->object->object,
+                        );
+
+                        // revert side-effect by removing favourite from database
+                        model('FavouriteModel')->removeFavourite(
+                            $payloadActor,
+                            $note,
+                            false,
+                        );
+
+                        model('ActivityModel')->update($activityId, [
+                            'note_id' => $note->id,
+                        ]);
+
+                        return $this->response->setStatusCode(200)->setJSON([]);
+                    case 'Announce':
+                        $note = model('NoteModel')->getNoteByUri(
+                            $payload->object->object,
+                        );
+
+                        $reblogNote = model('NoteModel')
+                            ->where([
+                                'actor_id' => $payloadActor->id,
+                                'reblog_of_id' => service('uuid')
+                                    ->fromString($note->id)
+                                    ->getBytes(),
+                            ])
+                            ->first();
+
+                        model('NoteModel')->undoReblog($reblogNote, false);
+
+                        model('ActivityModel')->update($activityId, [
+                            'note_id' => $note->id,
+                        ]);
+
+                        return $this->response->setStatusCode(200)->setJSON([]);
+                    default:
+                        // return not handled undo error (501 = not implemented)
+                        return $this->response->setStatusCode(501)->setJSON([]);
+                }
+            default:
+                // return not handled activity error (501 = not implemented)
+                return $this->response->setStatusCode(501)->setJSON([]);
+        }
+    }
+
+    public function outbox()
+    {
+        // get published activities by publication date
+        $actorActivity = model('ActivityModel')
+            ->where('actor_id', $this->actor->id)
+            ->where('`created_at` <= NOW()', null, false)
+            ->orderBy('created_at', 'DESC');
+
+        $pageNumber = $this->request->getGet('page');
+
+        if (!isset($pageNumber)) {
+            $actorActivity->paginate(12);
+            $pager = $actorActivity->pager;
+            $collection = new OrderedCollectionObject(null, $pager);
+        } else {
+            $paginatedActivity = $actorActivity->paginate(
+                12,
+                'default',
+                $pageNumber,
+            );
+            $pager = $actorActivity->pager;
+            $orderedItems = [];
+            foreach ($paginatedActivity as $activity) {
+                array_push($orderedItems, $activity->payload);
+            }
+            $collection = new OrderedCollectionPage($pager, $orderedItems);
+        }
+
+        return $this->response
+            ->setContentType('application/activity+json')
+            ->setBody($collection->toJSON());
+    }
+
+    public function followers()
+    {
+        // get followers for a specific actor
+        $followers = model('ActorModel')
+            ->join(
+                'activitypub_follows',
+                'activitypub_follows.actor_id = id',
+                'inner',
+            )
+            ->where('activitypub_follows.target_actor_id', $this->actor->id)
+            ->orderBy('activitypub_follows.created_at', 'DESC');
+
+        $pageNumber = $this->request->getGet('page');
+
+        if (!isset($pageNumber)) {
+            $followers->paginate(12);
+            $pager = $followers->pager;
+            $followersCollection = new OrderedCollectionObject(null, $pager);
+        } else {
+            $paginatedFollowers = $followers->paginate(
+                12,
+                'default',
+                $pageNumber,
+            );
+            $pager = $followers->pager;
+
+            $orderedItems = [];
+            foreach ($paginatedFollowers as $follower) {
+                array_push($orderedItems, $follower->uri);
+            }
+            $followersCollection = new OrderedCollectionPage(
+                $pager,
+                $orderedItems,
+            );
+        }
+
+        return $this->response
+            ->setContentType('application/activity+json')
+            ->setBody($followersCollection->toJSON());
+    }
+
+    public function attemptFollow()
+    {
+        $rules = [
+            'handle' =>
+                'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        helper('text');
+
+        // get webfinger data from actor
+        // parse activityPub id to get actor and domain
+        // check if actor and domain exist
+
+        try {
+            if ($parts = split_handle($this->request->getPost('handle'))) {
+                extract($parts);
+
+                $data = get_webfinger_data($username, $domain);
+            }
+        } catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('error', lang('ActivityPub.follow.accountNotFound'));
+        }
+
+        $ostatusKey = array_search(
+            'http://ostatus.org/schema/1.0/subscribe',
+            array_column($data->links, 'rel'),
+        );
+
+        if (!$ostatusKey) {
+            // TODO: error, couldn't subscribe to activitypub account
+            // The instance doesn't allow its users to follow others
+            return $this->response->setJSON([]);
+        }
+
+        return redirect()->to(
+            str_replace(
+                '{uri}',
+                urlencode($this->actor->uri),
+                $data->links[$ostatusKey]->template,
+            ),
+        );
+    }
+
+    public function activity($activityId)
+    {
+        if (
+            !($activity = model('ActivityModel')->getActivityById($activityId))
+        ) {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+
+        return $this->response
+            ->setContentType('application/activity+json')
+            ->setBody(json_encode($activity->payload));
+    }
+}
diff --git a/app/Libraries/ActivityPub/Controllers/BlockController.php b/app/Libraries/ActivityPub/Controllers/BlockController.php
new file mode 100644
index 0000000000..87ffe0bbc8
--- /dev/null
+++ b/app/Libraries/ActivityPub/Controllers/BlockController.php
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Controllers;
+
+use CodeIgniter\Controller;
+
+class BlockController extends Controller
+{
+    protected $helpers = ['activitypub'];
+
+    public function attemptBlockActor()
+    {
+        $rules = [
+            'handle' => 'required',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $handle = $this->request->getPost('handle');
+
+        if ($parts = split_handle($handle)) {
+            extract($parts);
+
+            if (!($actor = get_or_create_actor($username, $domain))) {
+                return redirect()
+                    ->back()
+                    ->withInput()
+                    ->with('error', 'Actor not found.');
+            }
+
+            model('ActorModel')->blockActor($actor->id);
+        }
+
+        return redirect()->back();
+    }
+
+    function attemptBlockDomain()
+    {
+        $rules = [
+            'domain' => 'required',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        model('BlockedDomainModel')->blockDomain(
+            $this->request->getPost('domain'),
+        );
+
+        return redirect()->back();
+    }
+
+    function attemptUnblockActor()
+    {
+        $rules = [
+            'actor_id' => 'required',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        model('ActorModel')->unblockActor($this->request->getPost('actor_id'));
+
+        return redirect()->back();
+    }
+
+    function attemptUnblockDomain()
+    {
+        $rules = [
+            'domain' => 'required',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        model('BlockedDomainModel')->unblockDomain(
+            $this->request->getPost('domain'),
+        );
+
+        return redirect()->back();
+    }
+}
diff --git a/app/Libraries/ActivityPub/Controllers/NoteController.php b/app/Libraries/ActivityPub/Controllers/NoteController.php
new file mode 100644
index 0000000000..048beaa059
--- /dev/null
+++ b/app/Libraries/ActivityPub/Controllers/NoteController.php
@@ -0,0 +1,278 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Controllers;
+
+use ActivityPub\Config\ActivityPub;
+use ActivityPub\Objects\OrderedCollectionObject;
+use ActivityPub\Objects\OrderedCollectionPage;
+use CodeIgniter\Controller;
+use CodeIgniter\I18n\Time;
+
+class NoteController extends Controller
+{
+    protected $helpers = ['activitypub'];
+
+    /**
+     * @var \ActivityPub\Entities\Note|null
+     */
+    protected $note;
+
+    /**
+     * @var \ActivityPub\Config\ActivityPub
+     */
+    protected $config;
+
+    public function __construct()
+    {
+        $this->config = config('ActivityPub');
+    }
+
+    public function _remap($method, ...$params)
+    {
+        if (!($this->note = model('NoteModel')->getNoteById($params[0]))) {
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+        unset($params[0]);
+
+        return $this->$method(...$params);
+    }
+
+    public function index()
+    {
+        $noteObjectClass = $this->config->noteObject;
+        $noteObject = new $noteObjectClass($this->note);
+
+        return $this->response
+            ->setContentType('application/activity+json')
+            ->setBody($noteObject->toJSON());
+    }
+
+    public function replies()
+    {
+        // get note replies
+        $noteReplies = model('NoteModel')
+            ->where(
+                'in_reply_to_id',
+                service('uuid')
+                    ->fromString($this->note->id)
+                    ->getBytes(),
+            )
+            ->where('`published_at` <= NOW()', null, false)
+            ->orderBy('published_at', 'ASC');
+
+        $pageNumber = $this->request->getGet('page');
+
+        if (!isset($pageNumber)) {
+            $noteReplies->paginate(12);
+            $pager = $noteReplies->pager;
+            $collection = new OrderedCollectionObject(null, $pager);
+        } else {
+            $paginatedReplies = $noteReplies->paginate(
+                12,
+                'default',
+                $pageNumber,
+            );
+            $pager = $noteReplies->pager;
+
+            $orderedItems = [];
+            $noteObjectClass = $this->config->noteObject;
+            foreach ($paginatedReplies as $reply) {
+                $replyObject = new $noteObjectClass($reply);
+                array_push($orderedItems, $replyObject->toJSON());
+            }
+            $collection = new OrderedCollectionPage($pager, $orderedItems);
+        }
+
+        return $this->response
+            ->setContentType('application/activity+json')
+            ->setBody($collection->toJSON());
+    }
+
+    public function attemptCreate()
+    {
+        $rules = [
+            'actor_id' => 'required|is_natural_no_zero',
+            'message' => 'required|max_length[500]',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $newNote = new \ActivityPub\Entities\Note([
+            'actor_id' => $this->request->getPost('actor_id'),
+            'message' => $this->request->getPost('message'),
+            'published_at' => Time::now(),
+        ]);
+
+        if (!model('NoteModel')->addNote($newNote)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                // TODO: translate
+                ->with('error', 'Couldn\'t create Note');
+        }
+
+        // Note without preview card has been successfully created
+        return redirect()->back();
+    }
+
+    public function attemptFavourite()
+    {
+        $rules = [
+            'actor_id' => 'required|is_natural_no_zero',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $actor = model('ActorModel')->getActorById(
+            $this->request->getPost('actor_id'),
+        );
+
+        model('FavouriteModel')->toggleFavourite($actor, $this->note->id);
+
+        return redirect()->back();
+    }
+
+    public function attemptReblog()
+    {
+        $rules = [
+            'actor_id' => 'required|is_natural_no_zero',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $actor = model('ActorModel')->getActorById(
+            $this->request->getPost('actor_id'),
+        );
+
+        model('NoteModel')->toggleReblog($actor, $this->note);
+
+        return redirect()->back();
+    }
+
+    public function attemptReply()
+    {
+        $rules = [
+            'actor_id' => 'required|is_natural_no_zero',
+            'message' => 'required|max_length[500]',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        $newReplyNote = new \ActivityPub\Entities\Note([
+            'actor_id' => $this->request->getPost('actor_id'),
+            'in_reply_to_id' => $this->note->id,
+            'message' => $this->request->getPost('message'),
+            'published_at' => Time::now(),
+        ]);
+
+        if (!model('NoteModel')->addReply($newReplyNote)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                // TODO: translate
+                ->with('error', 'Couldn\'t create Reply');
+        }
+
+        // Reply note without preview card has been successfully created
+        return redirect()->back();
+    }
+
+    public function attemptRemoteAction($action)
+    {
+        $rules = [
+            'handle' =>
+                'regex_match[/^@?(?P<username>[\w\.\-]+)@(?P<host>[\w\.\-]+)(?P<port>:[\d]+)?$/]',
+        ];
+
+        if (!$this->validate($rules)) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('errors', $this->validator->getErrors());
+        }
+
+        helper('text');
+
+        // get webfinger data from actor
+        // parse activityPub id to get actor and domain
+        // check if actor and domain exist
+        try {
+            if ($parts = split_handle($this->request->getPost('handle'))) {
+                extract($parts);
+
+                $data = get_webfinger_data($username, $domain);
+            }
+        } catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) {
+            return redirect()
+                ->back()
+                ->withInput()
+                ->with('error', lang('ActivityPub.follow.accountNotFound'));
+        }
+
+        $ostatusKey = array_search(
+            'http://ostatus.org/schema/1.0/subscribe',
+            array_column($data->links, 'rel'),
+        );
+
+        if (!$ostatusKey) {
+            // TODO: error, couldn't remote favourite/share/reply to note
+            // The instance doesn't allow its users remote actions on notes
+            return $this->response->setJSON([]);
+        }
+
+        return redirect()->to(
+            str_replace(
+                '{uri}',
+                urlencode($this->note->uri),
+                $data->links[$ostatusKey]->template,
+            ),
+        );
+    }
+
+    public function attemptBlockActor()
+    {
+        model('ActorModel')->blockActor($this->note->actor->id);
+
+        return redirect()->back();
+    }
+
+    public function attemptBlockDomain()
+    {
+        model('BlockedDomainModel')->blockDomain($this->note->actor->domain);
+
+        return redirect()->back();
+    }
+
+    public function attemptDelete()
+    {
+        model('NoteModel', false)->removeNote($this->note);
+
+        return redirect()->back();
+    }
+}
diff --git a/app/Libraries/ActivityPub/Controllers/SchedulerController.php b/app/Libraries/ActivityPub/Controllers/SchedulerController.php
new file mode 100644
index 0000000000..617290ae0c
--- /dev/null
+++ b/app/Libraries/ActivityPub/Controllers/SchedulerController.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Controllers;
+
+use CodeIgniter\Controller;
+
+class SchedulerController extends Controller
+{
+    protected $helpers = ['activitypub'];
+
+    public function activity()
+    {
+        // retrieve scheduled activities from database
+        $scheduledActivities = model('ActivityModel')->getScheduledActivities();
+
+        // Send activity to all followers
+        foreach ($scheduledActivities as $scheduledActivity) {
+            // send activity to all actor followers
+            send_activity_to_followers(
+                $scheduledActivity->actor,
+                json_encode($scheduledActivity->payload),
+            );
+
+            // set activity status to delivered
+            model('ActivityModel')->update($scheduledActivity->id, [
+                'status' => 'delivered',
+            ]);
+        }
+    }
+}
diff --git a/app/Libraries/ActivityPub/Controllers/WebFingerController.php b/app/Libraries/ActivityPub/Controllers/WebFingerController.php
new file mode 100644
index 0000000000..df671370d7
--- /dev/null
+++ b/app/Libraries/ActivityPub/Controllers/WebFingerController.php
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Controllers;
+
+use ActivityPub\WebFinger;
+use CodeIgniter\Controller;
+use Exception;
+
+class WebFingerController extends Controller
+{
+    public function index()
+    {
+        try {
+            $webfinger = new WebFinger($this->request->getGet('resource'));
+        } catch (Exception $e) {
+            // return 404, actor not found
+            throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+        }
+
+        return $this->response->setJSON($webfinger->toArray());
+    }
+}
diff --git a/app/Libraries/ActivityPub/Core/AbstractObject.php b/app/Libraries/ActivityPub/Core/AbstractObject.php
new file mode 100644
index 0000000000..d25c9db60e
--- /dev/null
+++ b/app/Libraries/ActivityPub/Core/AbstractObject.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * This class defines the Object which is the
+ * primary base type for the Activity Streams vocabulary.
+ *
+ * Object is a reserved word in php, so the class is named ObjectType.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Core;
+
+abstract class AbstractObject
+{
+    public function set($property, $value)
+    {
+        $this->$property = $value;
+
+        return $this;
+    }
+
+    public function toArray()
+    {
+        $objectVars = get_object_vars($this);
+        $array = [];
+        foreach ($objectVars as $key => $value) {
+            if ($key === 'context') {
+                $key = '@context';
+            }
+            if (is_object($value) && $value instanceof self) {
+                $array[$key] = $value->toArray();
+            } else {
+                $array[$key] = $value;
+            }
+        }
+
+        // removes all NULL, FALSE and Empty Strings but leaves 0 (zero) values
+        return array_filter($array, function ($value) {
+            return $value !== null && $value !== false && $value !== '';
+        });
+    }
+
+    public function toJSON()
+    {
+        return json_encode($this->toArray(), JSON_UNESCAPED_UNICODE);
+    }
+}
diff --git a/app/Libraries/ActivityPub/Core/Activity.php b/app/Libraries/ActivityPub/Core/Activity.php
new file mode 100644
index 0000000000..5219bbfcdb
--- /dev/null
+++ b/app/Libraries/ActivityPub/Core/Activity.php
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Activity objects are specializations of the base Object type
+ * that provide information about actions that have either
+ * already occurred, are in the process of occurring,
+ * or may occur in the future.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Core;
+
+class Activity extends ObjectType
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Activity';
+
+    /**
+     * @var string
+     */
+    protected $actor;
+
+    /**
+     * @var string|\ActivityPub\Core\ObjectType
+     */
+    protected $object;
+}
diff --git a/app/Libraries/ActivityPub/Core/ObjectType.php b/app/Libraries/ActivityPub/Core/ObjectType.php
new file mode 100644
index 0000000000..53b865aca5
--- /dev/null
+++ b/app/Libraries/ActivityPub/Core/ObjectType.php
@@ -0,0 +1,52 @@
+<?php
+
+/**
+ * This class defines the Object which is the
+ * primary base type for the Activity Streams vocabulary.
+ *
+ * Object is a reserved word in php, so the class is named ObjectType.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Core;
+
+class ObjectType extends AbstractObject
+{
+    /**
+     * @var array|string
+     */
+    protected $context = 'https://www.w3.org/ns/activitystreams';
+
+    /**
+     * @var string
+     */
+    protected $id;
+
+    /**
+     * @var string
+     */
+    protected $type = 'Object';
+
+    /**
+     * @var string
+     */
+    protected $content;
+
+    /**
+     * @var string
+     */
+    protected $published;
+
+    /**
+     * @var array
+     */
+    protected $to = ['https://www.w3.org/ns/activitystreams#Public'];
+
+    /**
+     * @var array
+     */
+    protected $cc;
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php
new file mode 100644
index 0000000000..9e6ab14cbe
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-010000_add_actors.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * Class AddActors
+ * Creates activitypub_actors table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddActors extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'auto_increment' => true,
+            ],
+            'uri' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+            ],
+            'username' => [
+                'type' => 'VARCHAR',
+                'constraint' => 32,
+            ],
+            'domain' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+            ],
+            'private_key' => [
+                'type' => 'TEXT',
+                'null' => true,
+            ],
+            'public_key' => [
+                'type' => 'TEXT',
+                'null' => true,
+            ],
+            'display_name' => [
+                'type' => 'VARCHAR',
+                'constraint' => 128,
+            ],
+            'summary' => [
+                'type' => 'TEXT',
+                'null' => true,
+            ],
+            'avatar_image_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+            ],
+            // constraint is 13 because the longest safe mimetype for images is image/svg+xml,
+            // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
+            'avatar_image_mimetype' => [
+                'type' => 'VARCHAR',
+                'constraint' => 13,
+            ],
+            'cover_image_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+                'null' => true,
+            ],
+            'cover_image_mimetype' => [
+                'type' => 'VARCHAR',
+                'constraint' => 13,
+                'null' => true,
+            ],
+            'inbox_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+            ],
+            'outbox_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+                'null' => true,
+            ],
+            'followers_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+                'null' => true,
+            ],
+            'followers_count' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'notes_count' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'is_blocked' => [
+                'type' => 'TINYINT',
+                'constraint' => 1,
+                'default' => 0,
+            ],
+            'created_at' => [
+                'type' => 'DATETIME',
+            ],
+            'updated_at' => [
+                'type' => 'DATETIME',
+            ],
+        ]);
+        $this->forge->addPrimaryKey('id');
+        $this->forge->addUniqueKey('uri');
+        $this->forge->addUniqueKey(['username', 'domain']);
+        $this->forge->createTable('activitypub_actors');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_actors');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php
new file mode 100644
index 0000000000..22f42938c4
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-020000_add_notes.php
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * Class AddNotes
+ * Creates activitypub_notes table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddNotes extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+            ],
+            'uri' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+            ],
+            'actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+            ],
+            'in_reply_to_id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+                'null' => true,
+            ],
+            'reblog_of_id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+                'null' => true,
+            ],
+            'message' => [
+                'type' => 'VARCHAR',
+                'constraint' => 500,
+                'null' => true,
+            ],
+            'message_html' => [
+                'type' => 'VARCHAR',
+                'constraint' => 600,
+                'null' => true,
+            ],
+            'favourites_count' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'reblogs_count' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'replies_count' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'default' => 0,
+            ],
+            'published_at' => [
+                'type' => 'DATETIME',
+                'null' => true,
+            ],
+            'created_at' => [
+                'type' => 'DATETIME',
+            ],
+        ]);
+        $this->forge->addPrimaryKey('id');
+        $this->forge->addUniqueKey('uri');
+        // FIXME: an actor must reblog a note only once
+        // $this->forge->addUniqueKey(['actor_id', 'reblog_of_id']);
+        $this->forge->addForeignKey(
+            'actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'in_reply_to_id',
+            'activitypub_notes',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'reblog_of_id',
+            'activitypub_notes',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->createTable('activitypub_notes');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_notes');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php
new file mode 100644
index 0000000000..11555bf1a0
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_activities.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Class AddActivities
+ * Creates activitypub_activities table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddActivities extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+            ],
+            'actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+            ],
+            'target_actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'null' => true,
+            ],
+            'note_id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+                'null' => true,
+            ],
+            'type' => [
+                'type' => 'VARCHAR',
+                'constraint' => 100,
+            ],
+            'payload' => [
+                'type' => 'JSON',
+            ],
+            'status' => [
+                'type' => 'ENUM',
+                'constraint' => ['queued', 'delivered'],
+                'null' => true,
+                'default' => null,
+            ],
+            'scheduled_at' => [
+                'type' => 'DATETIME',
+                'null' => true,
+                'default' => null,
+            ],
+            'created_at' => [
+                'type' => 'DATETIME',
+            ],
+        ]);
+        $this->forge->addPrimaryKey('id');
+        $this->forge->addForeignKey(
+            'actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'target_actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'note_id',
+            'activitypub_notes',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->createTable('activitypub_activities');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_activities');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php
new file mode 100644
index 0000000000..d76d54523a
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_favourites.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Class AddFavourites
+ * Creates activitypub_favourites table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddFavourites extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+            ],
+            'note_id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+            ],
+        ]);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
+        );
+        $this->forge->addPrimaryKey(['actor_id', 'note_id']);
+        $this->forge->addForeignKey(
+            'actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'note_id',
+            'activitypub_notes',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->createTable('activitypub_favourites');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_favourites');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php
new file mode 100644
index 0000000000..f3145f4f3c
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_follows.php
@@ -0,0 +1,57 @@
+<?php
+
+/**
+ * Class AddFollowers
+ * Creates activitypub_followers table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddFollowers extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'comment' => 'Actor that is following',
+            ],
+            'target_actor_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'comment' => 'Actor that is followed',
+            ],
+        ]);
+        $this->forge->addField(
+            '`created_at` timestamp NOT NULL DEFAULT current_timestamp()',
+        );
+        $this->forge->addPrimaryKey(['actor_id', 'target_actor_id']);
+        $this->forge->addForeignKey(
+            'actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'target_actor_id',
+            'activitypub_actors',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->createTable('activitypub_follows');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_follows');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php
new file mode 100644
index 0000000000..eaa07eb47c
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-100000_add_preview_cards.php
@@ -0,0 +1,82 @@
+<?php
+
+/**
+ * Class AddPreviewCards
+ * Creates activitypub_preview_cards table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddPreviewCards extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+                'auto_increment' => true,
+            ],
+            'url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 512,
+            ],
+            'title' => [
+                'type' => 'VARCHAR',
+                'constraint' => 128,
+            ],
+            'description' => ['type' => 'TEXT'],
+            'type' => [
+                'type' => 'ENUM',
+                'constraint' => ['link', 'video', 'image', 'rich'],
+                'default' => 'link',
+            ],
+            'author_name' => [
+                'type' => 'VARCHAR',
+                'constraint' => 64,
+                'null' => true,
+            ],
+            'author_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+                'null' => true,
+            ],
+            'provider_name' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+            ],
+            'provider_url' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+            ],
+            'image' => [
+                'type' => 'VARCHAR',
+                'constraint' => 255,
+            ],
+            'html' => [
+                'type' => 'TEXT',
+            ],
+            'updated_at' => [
+                'type' => 'DATETIME',
+            ],
+            'created_at' => [
+                'type' => 'DATETIME',
+            ],
+        ]);
+
+        $this->forge->addPrimaryKey('id');
+        $this->forge->addUniqueKey('url');
+        $this->forge->createTable('activitypub_preview_cards');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_preview_cards');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php
new file mode 100644
index 0000000000..25fd22f9f7
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-110000_add_notes_preview_cards.php
@@ -0,0 +1,53 @@
+<?php
+
+/**
+ * Class AddNotePreviewCards
+ * Creates activitypub_notes_preview_cards table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddNotesPreviewCards extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'note_id' => [
+                'type' => 'BINARY',
+                'constraint' => 16,
+            ],
+            'preview_card_id' => [
+                'type' => 'INT',
+                'unsigned' => true,
+            ],
+        ]);
+
+        $this->forge->addPrimaryKey(['note_id', 'preview_card_id']);
+        $this->forge->addForeignKey(
+            'note_id',
+            'activitypub_notes',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->addForeignKey(
+            'preview_card_id',
+            'activitypub_preview_cards',
+            'id',
+            false,
+            'CASCADE',
+        );
+        $this->forge->createTable('activitypub_notes_preview_cards');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_notes_preview_cards');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php
new file mode 100644
index 0000000000..3b136dca55
--- /dev/null
+++ b/app/Libraries/ActivityPub/Database/Migrations/2018-01-01-120000_add_blocked_domains.php
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Class AddBlockedDomains
+ * Creates activitypub_blocked_domains table in database
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Database\Migrations;
+
+use CodeIgniter\Database\Migration;
+
+class AddBlockedDomains extends Migration
+{
+    public function up()
+    {
+        $this->forge->addField([
+            'name' => [
+                'type' => 'VARCHAR',
+                'constraint' => 191,
+            ],
+            'created_at' => [
+                'type' => 'DATETIME',
+            ],
+        ]);
+        $this->forge->addPrimaryKey('name');
+        $this->forge->createTable('activitypub_blocked_domains');
+    }
+
+    public function down()
+    {
+        $this->forge->dropTable('activitypub_blocked_domains');
+    }
+}
diff --git a/app/Libraries/ActivityPub/Entities/Activity.php b/app/Libraries/ActivityPub/Entities/Activity.php
new file mode 100644
index 0000000000..14a7ed0dd4
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/Activity.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use Michalsn\Uuid\UuidEntity;
+
+class Activity extends UuidEntity
+{
+    protected $uuids = ['id', 'note_id'];
+
+    /**
+     * @var \ActivityPub\Entities\Actor
+     */
+    protected $actor;
+
+    /**
+     * @var \ActivityPub\Entities\Actor
+     */
+    protected $target_actor;
+
+    /**
+     * @var \ActivityPub\Entities\Note
+     */
+    protected $note;
+
+    protected $dates = ['scheduled_at', 'created_at'];
+
+    protected $casts = [
+        'id' => 'string',
+        'actor_id' => 'integer',
+        'target_actor_id' => '?integer',
+        'note_id' => '?string',
+        'type' => 'string',
+        'payload' => 'json',
+        'status' => '?string',
+    ];
+
+    /**
+     * @return \ActivityPub\Entities\Actor
+     */
+    public function getActor()
+    {
+        if (empty($this->actor_id)) {
+            throw new \RuntimeException(
+                'Activity must have an actor_id before getting the actor.',
+            );
+        }
+
+        if (empty($this->actor)) {
+            $this->actor = model('ActorModel')->getActorById($this->actor_id);
+        }
+
+        return $this->actor;
+    }
+
+    /**
+     * @return \ActivityPub\Entities\Actor
+     */
+    public function getTargetActor()
+    {
+        if (empty($this->target_actor_id)) {
+            throw new \RuntimeException(
+                'Activity must have a target_actor_id before getting the target actor.',
+            );
+        }
+
+        if (empty($this->target_actor)) {
+            $this->target_actor = model('ActorModel')->getActorById(
+                $this->target_actor_id,
+            );
+        }
+
+        return $this->target_actor;
+    }
+
+    /**
+     * @return \ActivityPub\Entities\Note
+     */
+    public function getNote()
+    {
+        if (empty($this->note_id)) {
+            throw new \RuntimeException(
+                'Activity must have a note_id before getting note.',
+            );
+        }
+
+        if (empty($this->note)) {
+            $this->note = model('NoteModel')->getNoteById($this->note_id);
+        }
+
+        return $this->note;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Entities/Actor.php b/app/Libraries/ActivityPub/Entities/Actor.php
new file mode 100644
index 0000000000..2d8d769dfa
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/Actor.php
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use CodeIgniter\Entity;
+
+class Actor extends Entity
+{
+    /**
+     * @var string
+     */
+    protected $key_id;
+
+    /**
+     * @var \ActivityPub\Entities\Actor[]
+     */
+    protected $followers;
+
+    /**
+     * @var boolean
+     */
+    protected $is_local;
+
+    protected $casts = [
+        'id' => 'integer',
+        'uri' => 'string',
+        'username' => 'string',
+        'domain' => 'string',
+        'display_name' => 'string',
+        'summary' => '?string',
+        'private_key' => '?string',
+        'public_key' => '?string',
+        'avatar_image_url' => 'string',
+        'avatar_image_mimetype' => 'string',
+        'cover_image_url' => '?string',
+        'cover_image_mimetype' => '?string',
+        'inbox_url' => 'string',
+        'outbox_url' => '?string',
+        'followers_url' => '?string',
+        'followers_count' => 'integer',
+        'notes_count' => 'integer',
+        'is_blocked' => 'boolean',
+    ];
+
+    public function getKeyId()
+    {
+        return $this->uri . '#main-key';
+    }
+
+    public function getIsLocal()
+    {
+        if (!$this->is_local) {
+            $uri = current_url(true);
+
+            $this->is_local =
+                $this->domain ===
+                $uri->getHost() .
+                    ($uri->getPort() ? ':' . $uri->getPort() : '');
+        }
+
+        return $this->is_local;
+    }
+
+    public function getFollowers()
+    {
+        if (empty($this->id)) {
+            throw new \RuntimeException(
+                'Actor must be created before getting followers.',
+            );
+        }
+
+        if (empty($this->followers)) {
+            $this->followers = model('ActorModel')->getFollowers($this->id);
+        }
+
+        return $this->followers;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Entities/BlockedDomain.php b/app/Libraries/ActivityPub/Entities/BlockedDomain.php
new file mode 100644
index 0000000000..bf609e7cb4
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/BlockedDomain.php
@@ -0,0 +1,18 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use CodeIgniter\Entity;
+
+class BlockedDomain extends Entity
+{
+    protected $casts = [
+        'name' => 'string',
+    ];
+}
diff --git a/app/Libraries/ActivityPub/Entities/Favourite.php b/app/Libraries/ActivityPub/Entities/Favourite.php
new file mode 100644
index 0000000000..759448d433
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/Favourite.php
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use Michalsn\Uuid\UuidEntity;
+
+class Favourite extends UuidEntity
+{
+    protected $uuids = ['note_id'];
+
+    protected $casts = [
+        'actor_id' => 'integer',
+        'note_id' => 'integer',
+    ];
+}
diff --git a/app/Libraries/ActivityPub/Entities/Follow.php b/app/Libraries/ActivityPub/Entities/Follow.php
new file mode 100644
index 0000000000..dea45eed6c
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/Follow.php
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use CodeIgniter\Entity;
+
+class Follow extends Entity
+{
+    protected $casts = [
+        'actor_id' => 'integer',
+        'target_actor_id' => 'integer',
+    ];
+}
diff --git a/app/Libraries/ActivityPub/Entities/Note.php b/app/Libraries/ActivityPub/Entities/Note.php
new file mode 100644
index 0000000000..9e1736d0c2
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/Note.php
@@ -0,0 +1,200 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use Michalsn\Uuid\UuidEntity;
+
+class Note extends UuidEntity
+{
+    protected $uuids = ['id', 'in_reply_to_id', 'reblog_of_id'];
+
+    /**
+     * @var \ActivityPub\Entities\Actor
+     */
+    protected $actor;
+
+    /**
+     * @var boolean
+     */
+    protected $is_reply;
+
+    /**
+     * @var \ActivityPub\Entities\Note
+     */
+    protected $reply_to_note;
+
+    /**
+     * @var boolean
+     */
+    protected $is_reblog;
+
+    /**
+     * @var \ActivityPub\Entities\Note
+     */
+    protected $reblog_of_note;
+
+    /**
+     * @var \ActivityPub\Entities\PreviewCard
+     */
+    protected $preview_card;
+
+    /**
+     * @var \ActivityPub\Entities\Note[]
+     */
+    protected $replies;
+
+    /**
+     * @var \ActivityPub\Entities\Note[]
+     */
+    protected $reblogs;
+
+    protected $dates = ['published_at', 'created_at'];
+
+    protected $casts = [
+        'id' => 'string',
+        'uri' => 'string',
+        'actor_id' => 'integer',
+        'in_reply_to_id' => '?string',
+        'reblog_of_id' => '?string',
+        'message' => 'string',
+        'message_html' => 'string',
+        'favourites_count' => 'integer',
+        'reblogs_count' => 'integer',
+        'replies_count' => 'integer',
+    ];
+
+    /**
+     * Returns the note's actor
+     *
+     * @return \ActivityPub\Entities\Actor
+     */
+    public function getActor()
+    {
+        if (empty($this->actor_id)) {
+            throw new \RuntimeException(
+                'Note must have an actor_id before getting actor.',
+            );
+        }
+
+        if (empty($this->actor)) {
+            $this->actor = model('ActorModel')->getActorById($this->actor_id);
+        }
+
+        return $this->actor;
+    }
+
+    public function getPreviewCard()
+    {
+        if (empty($this->id)) {
+            throw new \RuntimeException(
+                'Note must be created before getting preview_card.',
+            );
+        }
+
+        if (empty($this->preview_card)) {
+            $this->preview_card = model('PreviewCardModel')->getNotePreviewCard(
+                $this->id,
+            );
+        }
+
+        return $this->preview_card;
+    }
+
+    public function getReplies()
+    {
+        if (empty($this->id)) {
+            throw new \RuntimeException(
+                'Note must be created before getting replies.',
+            );
+        }
+
+        if (empty($this->replies)) {
+            $this->replies = model('NoteModel')->getNoteReplies($this->id);
+        }
+
+        return $this->replies;
+    }
+
+    public function getIsReply()
+    {
+        $this->is_reply = $this->in_reply_to_id !== null;
+
+        return $this->is_reply;
+    }
+
+    public function getReplyToNote()
+    {
+        if (empty($this->in_reply_to_id)) {
+            throw new \RuntimeException('Note is not a reply.');
+        }
+
+        if (empty($this->reply_to_note)) {
+            $this->reply_to_note = model('NoteModel')->getNoteById(
+                $this->in_reply_to_id,
+            );
+        }
+
+        return $this->reply_to_note;
+    }
+
+    public function getReblogs()
+    {
+        if (empty($this->id)) {
+            throw new \RuntimeException(
+                'Note must be created before getting reblogs.',
+            );
+        }
+
+        if (empty($this->reblogs)) {
+            $this->reblogs = model('NoteModel')->getNoteReblogs(
+                service('uuid')
+                    ->fromString($this->id)
+                    ->getBytes(),
+            );
+        }
+
+        return $this->reblogs;
+    }
+
+    public function getIsReblog()
+    {
+        return $this->reblog_of_id != null;
+    }
+
+    public function getReblogOfNote()
+    {
+        if (empty($this->reblog_of_id)) {
+            throw new \RuntimeException('Note is not a reblog.');
+        }
+
+        if (empty($this->reblog_of_note)) {
+            $this->reblog_of_note = model('NoteModel')->getNoteById(
+                $this->reblog_of_id,
+            );
+        }
+
+        return $this->reblog_of_note;
+    }
+
+    public function setMessage(string $message)
+    {
+        helper('activitypub');
+
+        $messageWithoutTags = strip_tags($message);
+
+        $this->attributes['message'] = $messageWithoutTags;
+        $this->attributes['message_html'] = str_replace(
+            "\n",
+            '<br />',
+            linkify($messageWithoutTags),
+        );
+
+        return $this;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Entities/PreviewCard.php b/app/Libraries/ActivityPub/Entities/PreviewCard.php
new file mode 100644
index 0000000000..cd3523c460
--- /dev/null
+++ b/app/Libraries/ActivityPub/Entities/PreviewCard.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Entities;
+
+use CodeIgniter\Entity;
+
+class PreviewCard extends Entity
+{
+    protected $casts = [
+        'id' => 'integer',
+        'note_id' => 'string',
+        'url' => 'string',
+        'title' => 'string',
+        'description' => 'string',
+        'type' => 'string',
+        'author_name' => '?string',
+        'author_url' => '?string',
+        'provider_name' => '?string',
+        'provider_url' => '?string',
+        'image' => '?string',
+        'html' => '?string',
+    ];
+}
diff --git a/app/Libraries/ActivityPub/Filters/ActivityPubFilter.php b/app/Libraries/ActivityPub/Filters/ActivityPubFilter.php
new file mode 100644
index 0000000000..bf9d870838
--- /dev/null
+++ b/app/Libraries/ActivityPub/Filters/ActivityPubFilter.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace ActivityPub\Filters;
+
+use ActivityPub\HttpSignature;
+use CodeIgniter\HTTP\RequestInterface;
+use CodeIgniter\HTTP\ResponseInterface;
+use CodeIgniter\Filters\FilterInterface;
+use CodeIgniter\HTTP\URI;
+
+class ActivityPubFilter implements FilterInterface
+{
+    /**
+     * Do whatever processing this filter needs to do.
+     * By default it should not return anything during
+     * normal execution. However, when an abnormal state
+     * is found, it should return an instance of
+     * CodeIgniter\HTTP\Response. If it does, script
+     * execution will end and that Response will be
+     * sent back to the client, allowing for error pages,
+     * redirects, etc.
+     *
+     * @param \CodeIgniter\HTTP\RequestInterface $request
+     * @param array|null                         $params
+     *
+     * @return mixed
+     */
+    public function before(RequestInterface $request, $params = null)
+    {
+        if (empty($params)) {
+            return;
+        }
+
+        if (in_array('verify-activitystream', $params)) {
+            $negotiate = \Config\Services::negotiator();
+
+            $allowedContentTypes = [
+                'application/ld+json; profile="https://www.w3.org/ns/activitystreams',
+                'application/activity+json',
+            ];
+
+            if (empty($negotiate->media($allowedContentTypes))) {
+                // return $this->response->setStatusCode(415)->setJSON([]);
+                throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+            }
+        }
+
+        if (in_array('verify-blocks', $params)) {
+            $payload = $request->getJSON();
+
+            $actorUri = $payload->actor;
+            $domain = (new URI($actorUri))->getHost();
+
+            // check first if domain is blocked
+            if (model('BlockedDomainModel')->isDomainBlocked($domain)) {
+                throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+            }
+
+            // check if actor is blocked
+            if (model('ActorModel')->isActorBlocked($actorUri)) {
+                throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound();
+            }
+        }
+
+        if (in_array('verify-signature', $params)) {
+            try {
+                // securityCheck: check activity signature before handling it
+                (new HttpSignature())->verify();
+            } catch (\Exception $e) {
+                // Invalid HttpSignature (401 = unauthorized)
+                // TODO: show error message?
+                return service('response')->setStatusCode(401);
+            }
+        }
+    }
+
+    //--------------------------------------------------------------------
+
+    /**
+     * Allows After filters to inspect and modify the response
+     * object as needed. This method does not allow any way
+     * to stop execution of other after filters, short of
+     * throwing an Exception or Error.
+     *
+     * @param \CodeIgniter\HTTP\RequestInterface  $request
+     * @param \CodeIgniter\HTTP\ResponseInterface $response
+     * @param array|null                          $arguments
+     *
+     * @return void
+     */
+    public function after(
+        RequestInterface $request,
+        ResponseInterface $response,
+        $arguments = null
+    ) {
+    }
+
+    //--------------------------------------------------------------------
+}
diff --git a/app/Libraries/ActivityPub/Helpers/activitypub_helper.php b/app/Libraries/ActivityPub/Helpers/activitypub_helper.php
new file mode 100644
index 0000000000..b42273718c
--- /dev/null
+++ b/app/Libraries/ActivityPub/Helpers/activitypub_helper.php
@@ -0,0 +1,513 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+use ActivityPub\Activities\AcceptActivity;
+use ActivityPub\ActivityRequest;
+use CodeIgniter\HTTP\Exceptions\HTTPException;
+
+if (!function_exists('get_webfinger_data')) {
+    /**
+     * Retrieve actor webfinger data from username and domain
+     *
+     * @param string $username
+     * @param string $domain
+     * @return mixed
+     * @throws HTTPException
+     * @throws InvalidArgumentException
+     */
+    function get_webfinger_data($username, $domain)
+    {
+        $webfingerUri = new \CodeIgniter\HTTP\URI();
+        $webfingerUri->setScheme('https');
+        $webfingerUri->setHost($domain);
+        isset($port) && $webfingerUri->setPort((int) $port);
+        $webfingerUri->setPath('/.well-known/webfinger');
+        $webfingerUri->setQuery("resource=acct:{$username}@{$domain}");
+
+        $webfingerRequest = new ActivityRequest($webfingerUri);
+        $webfingerResponse = $webfingerRequest->get();
+
+        return json_decode($webfingerResponse->getBody());
+    }
+}
+
+if (!function_exists('split_handle')) {
+    /**
+     * Splits handle into its parts (username, host and port)
+     *
+     * @param  string $handle
+     * @return bool|array
+     */
+    function split_handle(string $handle)
+    {
+        if (
+            !preg_match(
+                '/^@?(?P<username>[\w\.\-]+)@(?P<domain>[\w\.\-]+)(?P<port>:[\d]+)?$/',
+                $handle,
+                $matches,
+            )
+        ) {
+            return false;
+        }
+
+        return $matches;
+    }
+}
+
+if (!function_exists('accept_follow')) {
+    /**
+     * Sends an accept activity to the targetActor's inbox
+     *
+     * @param \ActivityPub\Entities\Actor $actor Actor which accepts the follow
+     * @param \ActivityPub\Entities\Actor $targetActor Actor which receives the accept follow
+     * @param string $objectId
+     * @return void
+     */
+    function accept_follow($actor, $targetActor, $objectId)
+    {
+        $acceptActivity = new AcceptActivity();
+        $acceptActivity->set('actor', $actor->uri)->set('object', $objectId);
+
+        $db = \Config\Database::connect();
+        $db->transStart();
+
+        $activityModel = model('ActivityModel');
+        $activityId = $activityModel->newActivity(
+            'Accept',
+            $actor->id,
+            $targetActor->id,
+            null,
+            $acceptActivity->toJSON(),
+        );
+
+        $acceptActivity->set(
+            'id',
+            url_to('activity', $actor->username, $activityId),
+        );
+
+        $activityModel->update($activityId, [
+            'payload' => $acceptActivity->toJSON(),
+        ]);
+
+        try {
+            $acceptRequest = new ActivityRequest(
+                $targetActor->inbox_url,
+                $acceptActivity->toJSON(),
+            );
+            $acceptRequest->sign($actor->key_id, $actor->private_key);
+            $acceptRequest->post();
+        } catch (\Exception $e) {
+            $db->transRollback();
+        }
+
+        $db->transComplete();
+    }
+}
+
+if (!function_exists('send_activity_to_followers')) {
+    /**
+     * Sends an activity to all actor followers
+     *
+     * @param \ActivityPub\Entities\Actor $actor
+     * @param string $activity
+     * @return void
+     */
+    function send_activity_to_followers($actor, $activityPayload)
+    {
+        foreach ($actor->followers as $follower) {
+            try {
+                $acceptRequest = new ActivityRequest(
+                    $follower->inbox_url,
+                    $activityPayload,
+                );
+                $acceptRequest->sign($actor->key_id, $actor->private_key);
+                $acceptRequest->post();
+            } catch (\Exception $e) {
+                // log error
+                log_message('critical', $e);
+            }
+        }
+    }
+}
+
+if (!function_exists('extract_urls_from_message')) {
+    /**
+     * Returns an array of all urls from a string
+     *
+     * @param mixed $message
+     * @return string[]
+     */
+    function extract_urls_from_message($message)
+    {
+        preg_match_all(
+            '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i',
+            $message,
+            $match,
+        );
+
+        return $match[0];
+    }
+}
+
+if (!function_exists('create_preview_card_from_url')) {
+    /**
+     * Extract open graph metadata from given url and create preview card
+     *
+     * @param \CodeIgniter\HTTP\URI $url
+     * @return \ActivityPub\Entities\PreviewCard|null
+     */
+    function create_preview_card_from_url($url)
+    {
+        $essence = new \Essence\Essence([
+            'filters' => [
+                'OEmbedProvider' => '//',
+                'OpenGraphProvider' => '//',
+                'TwitterCardsProvider' => '//',
+            ],
+        ]);
+        $media = $essence->extract((string) $url);
+
+        if ($media) {
+            $typeMapping = [
+                'photo' => 'image',
+                'video' => 'video',
+                'website' => 'link',
+                'rich' => 'rich',
+            ];
+
+            // Check that, at least, the url and title are set
+            if ($media->url && $media->title) {
+                $preview_card = new \ActivityPub\Entities\PreviewCard([
+                    'url' => (string) $url,
+                    'title' => $media->title,
+                    'description' => $media->description,
+                    'type' => isset($typeMapping[$media->type])
+                        ? $typeMapping[$media->type]
+                        : 'link',
+                    'author_name' => $media->authorName,
+                    'author_url' => $media->authorUrl,
+                    'provider_name' => $media->providerName,
+                    'provider_url' => $media->providerUrl,
+                    'image' => $media->thumbnailUrl,
+                    'html' => $media->html,
+                ]);
+
+                if (
+                    !($newPreviewCardId = model('PreviewCardModel')->insert(
+                        $preview_card,
+                        true,
+                    ))
+                ) {
+                    return null;
+                }
+
+                $preview_card->id = $newPreviewCardId;
+                return $preview_card;
+            }
+        }
+
+        return null;
+    }
+}
+
+if (!function_exists('get_or_create_preview_card_from_url')) {
+    /**
+     * Extract open graph metadata from given url and create preview card
+     *
+     * @param \CodeIgniter\HTTP\URI $url
+     * @return \ActivityPub\Entities\PreviewCard|null
+     */
+    function get_or_create_preview_card_from_url($url)
+    {
+        // check if preview card has already been generated
+        if (
+            $previewCard = model('PreviewCardModel')->getPreviewCardFromUrl(
+                (string) $url,
+            )
+        ) {
+            return $previewCard;
+        }
+
+        // create preview card
+        return create_preview_card_from_url($url);
+    }
+}
+
+if (!function_exists('get_or_create_actor_from_uri')) {
+    /**
+     * Retrieves actor from database using the actor uri
+     * If Actor is not present, it creates the record in the database and returns it.
+     *
+     * @param string $actorUri
+     * @return \ActivityPub\Entities\Actor|null
+     */
+    function get_or_create_actor_from_uri($actorUri)
+    {
+        // check if actor exists in database already and return it
+        if ($actor = model('ActorModel')->getActorByUri($actorUri)) {
+            return $actor;
+        }
+
+        // if the actor doesn't exist, request actorUri to create it
+        return create_actor_from_uri($actorUri);
+    }
+}
+
+if (!function_exists('get_or_create_actor')) {
+    /**
+     * Retrieves actor from database using the actor username and domain
+     * If actor is not present, it creates the record in the database and returns it.
+     *
+     * @param string $username
+     * @param string $domain
+     * @return \ActivityPub\Entities\Actor|null
+     */
+    function get_or_create_actor($username, $domain)
+    {
+        // check if actor exists in database already and return it
+        if (
+            $actor = model('ActorModel')->getActorByUsername($username, $domain)
+        ) {
+            return $actor;
+        }
+
+        // get actorUri with webfinger request
+        $webfingerData = get_webfinger_data($username, $domain);
+        $actorUriKey = array_search(
+            'self',
+            array_column($webfingerData->links, 'rel'),
+        );
+
+        return create_actor_from_uri($webfingerData->links[$actorUriKey]->href);
+    }
+}
+
+if (!function_exists('create_actor_from_uri')) {
+    /**
+     * Creates actor record in database using
+     * the info gathered from the actorUri parameter
+     *
+     * @param string $actorUri
+     * @return \ActivityPub\Entities\Actor|null
+     */
+    function create_actor_from_uri($actorUri)
+    {
+        $activityRequest = new ActivityRequest($actorUri);
+        $actorResponse = $activityRequest->get();
+        $actorPayload = json_decode($actorResponse->getBody());
+
+        $newActor = new \ActivityPub\Entities\Actor();
+        $newActor->uri = $actorUri;
+        $newActor->username = $actorPayload->preferredUsername;
+        $newActor->domain = $activityRequest->getDomain();
+        $newActor->public_key = $actorPayload->publicKey->publicKeyPem;
+        $newActor->private_key = null;
+        $newActor->display_name = $actorPayload->name;
+        $newActor->summary = $actorPayload->summary;
+        if (property_exists($actorPayload, 'icon')) {
+            $newActor->avatar_image_url = $actorPayload->icon->url;
+            $newActor->avatar_image_mimetype = $actorPayload->icon->mediaType;
+        }
+
+        if (property_exists($actorPayload, 'image')) {
+            $newActor->cover_image_url = $actorPayload->image->url;
+            $newActor->cover_image_mimetype = $actorPayload->image->mediaType;
+        }
+        $newActor->inbox_url = $actorPayload->inbox;
+        $newActor->outbox_url = $actorPayload->outbox;
+        $newActor->followers_url = $actorPayload->followers;
+
+        if (!($newActorId = model('ActorModel')->insert($newActor, true))) {
+            return null;
+        }
+
+        $newActor->id = $newActorId;
+        return $newActor;
+    }
+}
+
+if (!function_exists('get_current_domain')) {
+    /**
+     * Returns instance's domain name
+     *
+     * @return string
+     * @throws HTTPException
+     */
+    function get_current_domain()
+    {
+        $uri = current_url(true);
+        return $uri->getHost() . ($uri->getPort() ? ':' . $uri->getPort() : '');
+    }
+}
+
+if (!function_exists('extract_text_from_html')) {
+    /**
+     * Extracts the text from html content
+     *
+     * @param mixed $content
+     * @return string|string[]|null
+     */
+    function extract_text_from_html($content)
+    {
+        return preg_replace('/\s+/', ' ', strip_tags($content));
+    }
+}
+
+if (!function_exists('linkify')) {
+    /**
+     * Turn all link elements in clickable links.
+     * Transforms urls and handles
+     *
+     * @param string $value
+     * @param array  $protocols  http/https, ftp, mail, twitter
+     * @param array  $attributes
+     * @return string
+     */
+    function linkify($text, $protocols = ['http', 'handle'])
+    {
+        $links = [];
+
+        // Extract text links for each protocol
+        foreach ((array) $protocols as $protocol) {
+            switch ($protocol) {
+                case 'http':
+                case 'https':
+                    $text = preg_replace_callback(
+                        '~(?:(https?)://([^\s<]+)|(www\.[^\s<]+?\.[^\s<]+))(?<![\.,:])~i',
+                        function ($match) use ($protocol, &$links) {
+                            if ($match[1]) {
+                                $protocol = $match[1];
+                            }
+                            $link = $match[2] ?: $match[3];
+
+                            helper('text');
+
+                            $link = preg_replace(
+                                '#^www\.(.+\.)#i',
+                                '$1',
+                                $link,
+                            );
+
+                            return '<' .
+                                array_push(
+                                    $links,
+                                    anchor(
+                                        "$protocol://$link",
+                                        ellipsize(rtrim($link, '/'), 30),
+                                        [
+                                            'target' => '_blank',
+                                            'rel' => 'noopener noreferrer',
+                                        ],
+                                    ),
+                                ) .
+                                '>';
+                        },
+                        $text,
+                    );
+                    break;
+                case 'handle':
+                    $text = preg_replace_callback(
+                        '~(?<!\w)@(?<username>\w++)(?:@(?<domain>(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]))?~',
+                        function ($match) use (&$links) {
+                            // check if host is set and look for actor in database
+                            if (isset($match['host'])) {
+                                if (
+                                    $actor = model(
+                                        'ActorModel',
+                                    )->getActorByUsername(
+                                        $match['username'],
+                                        $match['domain'],
+                                    )
+                                ) {
+                                    // TODO: check that host is local to remove target blank?
+                                    return '<' .
+                                        array_push(
+                                            $links,
+                                            anchor($actor->uri, $match[0], [
+                                                'target' => '_blank',
+                                                'rel' => 'noopener noreferrer',
+                                            ]),
+                                        ) .
+                                        '>';
+                                } else {
+                                    try {
+                                        $actor = get_or_create_actor(
+                                            $match['username'],
+                                            $match['domain'],
+                                        );
+                                        return '<' .
+                                            array_push(
+                                                $links,
+                                                anchor($actor->uri, $match[0], [
+                                                    'target' => '_blank',
+                                                    'rel' =>
+                                                        'noopener noreferrer',
+                                                ]),
+                                            ) .
+                                            '>';
+                                    } catch (\CodeIgniter\HTTP\Exceptions\HTTPException $e) {
+                                        // Couldn't retrieve actor, do not wrap the text in link
+                                        return '<' .
+                                            array_push($links, $match[0]) .
+                                            '>';
+                                    }
+                                }
+                            } else {
+                                if (
+                                    $actor = model(
+                                        'ActorModel',
+                                    )->getActorByUsername($match['username'])
+                                ) {
+                                    return '<' .
+                                        array_push(
+                                            $links,
+                                            anchor($actor->uri, $match[0]),
+                                        ) .
+                                        '>';
+                                }
+
+                                return '<' .
+                                    array_push($links, $match[0]) .
+                                    '>';
+                            }
+                        },
+                        $text,
+                    );
+                    break;
+                default:
+                    $text = preg_replace_callback(
+                        '~' .
+                            preg_quote($protocol, '~') .
+                            '://([^\s<]+?)(?<![\.,:])~i',
+                        function ($match) use ($protocol, &$links) {
+                            return '<' .
+                                array_push(
+                                    $links,
+                                    anchor("$protocol://$match[1]", $match[1], [
+                                        'target' => '_blank',
+                                        'rel' => 'noopener noreferrer',
+                                    ]),
+                                ) .
+                                '>';
+                        },
+                        $text,
+                    );
+                    break;
+            }
+        }
+
+        // Insert all links
+        return preg_replace_callback(
+            '/<(\d+)>/',
+            function ($match) use (&$links) {
+                return $links[$match[1] - 1];
+            },
+            $text,
+        );
+    }
+}
diff --git a/app/Libraries/ActivityPub/HttpSignature.php b/app/Libraries/ActivityPub/HttpSignature.php
new file mode 100644
index 0000000000..8b1bde6dbe
--- /dev/null
+++ b/app/Libraries/ActivityPub/HttpSignature.php
@@ -0,0 +1,170 @@
+<?php
+
+/**
+ * This file is based on the HttpSignature file from the ActivityPhp package.
+ * It is adapted to work with CodeIgniter4
+ *
+ * More info: https://github.com/landrok/activitypub
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub;
+
+use CodeIgniter\HTTP\IncomingRequest;
+use CodeIgniter\I18n\Time;
+use Config\Services;
+use Exception;
+use phpseclib\Crypt\RSA;
+
+/**
+ * HTTP signatures tool
+ */
+class HttpSignature
+{
+    const SIGNATURE_PATTERN = '/^
+        keyId="(?P<keyId>
+            (https?:\/\/[\w\-\.]+[\w]+)
+            (:[\d]+)?
+            ([\w\-\.#\/@]+)
+        )",
+        algorithm="(?P<algorithm>[\w\-]+)",
+        (headers="\(request-target\) (?P<headers>[\w\-\s]+)",)?
+        signature="(?P<signature>[\w+\/]+={0,2})"
+    /x';
+
+    /**
+     * @var \CodeIgniter\HTTP\IncomingRequest
+     */
+    protected $request;
+
+    /**
+     * @param \CodeIgniter\HTTP\IncomingRequest $request
+     */
+    public function __construct(IncomingRequest $request = null)
+    {
+        if (is_null($request)) {
+            $request = Services::request();
+        }
+
+        $this->request = $request;
+    }
+
+    /**
+     * Verify an incoming message based upon its HTTP signature
+     *
+     * @return bool True if signature has been verified. Otherwise false
+     */
+    public function verify()
+    {
+        if (!($dateHeader = $this->request->header('date'))) {
+            throw new Exception('Request must include a date header.');
+        }
+
+        // verify that request has been made within the last hour
+        $currentTime = Time::now();
+        $requestTime = Time::createFromFormat(
+            'D, d M Y H:i:s T',
+            $dateHeader->getValue(),
+        );
+
+        $diff = $requestTime->difference($currentTime);
+        if ($diff->getSeconds() > 3600) {
+            throw new Exception('Request must be made within the last hour.');
+        }
+
+        // check that digest header is set
+        if (!($digestHeader = $this->request->header('digest'))) {
+            throw new Exception('Request must include a digest header');
+        }
+        // compute body digest and compare with header digest
+        $bodyDigest = hash('sha256', $this->request->getBody(), true);
+        $digest = 'SHA-256=' . base64_encode($bodyDigest);
+        if ($digest !== $digestHeader->getValue()) {
+            throw new Exception('Request digest is incorrect.');
+        }
+
+        // read the Signature header
+        if (!($signature = $this->request->getHeaderLine('signature'))) {
+            // Signature header not found
+            throw new Exception('Request must include a signature header');
+        }
+
+        // Split it into its parts (keyId, headers and signature)
+        if (!($parts = $this->splitSignature($signature))) {
+            throw new Exception('Malformed signature string.');
+        }
+
+        // extract parts as $keyId, $headers and $signature variables
+        extract($parts);
+
+        // Fetch the public key linked from keyId
+        $actorRequest = new ActivityRequest($keyId);
+        $actorResponse = $actorRequest->get();
+        $actor = json_decode($actorResponse->getBody());
+
+        $publicKeyPem = $actor->publicKey->publicKeyPem;
+
+        // Create a comparison string from the plaintext headers we got
+        // in the same order as was given in the signature header,
+        $data = $this->getPlainText(explode(' ', trim($headers)));
+
+        // Verify that string using the public key and the original signature.
+        $rsa = new RSA();
+        $rsa->setHash('sha256');
+        $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
+        $rsa->loadKey($publicKeyPem);
+
+        return $rsa->verify($data, base64_decode($signature, true));
+    }
+
+    /**
+     * Split HTTP signature into its parts (keyId, headers and signature)
+     *
+     * @param string $signature
+     * @return bool|array
+     */
+    private function splitSignature(string $signature)
+    {
+        if (!preg_match(self::SIGNATURE_PATTERN, $signature, $matches)) {
+            // Signature pattern failed
+            return false;
+        }
+
+        // Headers are optional
+        if (!isset($matches['headers']) || $matches['headers'] == '') {
+            $matches['headers'] = 'date';
+        }
+
+        return $matches;
+    }
+
+    /**
+     * Get plain text that has been originally signed
+     *
+     * @param  array $headers HTTP header keys
+     * @return string
+     */
+    private function getPlainText(array $headers)
+    {
+        $strings = [];
+        $strings[] = sprintf(
+            '(request-target): %s %s%s',
+            $this->request->getMethod(),
+            '/' . $this->request->uri->getPath(),
+            $this->request->uri->getQuery()
+                ? '?' . $this->request->uri->getQuery()
+                : '',
+        );
+
+        foreach ($headers as $key) {
+            if ($this->request->hasHeader($key)) {
+                $strings[] = "$key: {$this->request->getHeaderLine($key)}";
+            }
+        }
+
+        return implode("\n", $strings);
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/ActivityModel.php b/app/Libraries/ActivityPub/Models/ActivityModel.php
new file mode 100644
index 0000000000..33c7f45e41
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/ActivityModel.php
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+class ActivityModel extends UuidModel
+{
+    protected $table = 'activitypub_activities';
+    protected $primaryKey = 'id';
+
+    protected $uuidFields = ['id', 'note_id'];
+
+    protected $allowedFields = [
+        'id',
+        'actor_id',
+        'target_actor_id',
+        'note_id',
+        'type',
+        'payload',
+        'status',
+        'scheduled_at',
+    ];
+
+    protected $returnType = \ActivityPub\Entities\Activity::class;
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = true;
+    protected $updatedField = null;
+
+    public function getActivityById($activityId)
+    {
+        return $this->find($activityId);
+    }
+
+    /**
+     * Inserts a new activity record in the database
+     *
+     * @param string $type
+     * @param integer $actorId
+     * @param integer $targetActorId
+     * @param integer $noteId
+     * @param string $payload
+     * @param \CodeIgniter\I18n\Time $scheduledAt
+     * @param string $status
+     *
+     * @return Michalsn\Uuid\BaseResult|int|string|false
+     */
+    public function newActivity(
+        $type,
+        $actorId,
+        $targetActorId,
+        $noteId,
+        $payload,
+        $scheduledAt = null,
+        $status = null
+    ) {
+        return $this->insert(
+            [
+                'actor_id' => $actorId,
+                'target_actor_id' => $targetActorId,
+                'note_id' => $noteId,
+                'type' => $type,
+                'payload' => $payload,
+                'scheduled_at' => $scheduledAt,
+                'status' => $status,
+            ],
+            true,
+        );
+    }
+
+    public function getScheduledActivities()
+    {
+        return $this->where('`scheduled_at` <= NOW()', null, false)
+            ->where('status', 'queued')
+            ->orderBy('scheduled_at', 'ASC')
+            ->findAll();
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/ActorModel.php b/app/Libraries/ActivityPub/Models/ActorModel.php
new file mode 100644
index 0000000000..deed724ef5
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/ActorModel.php
@@ -0,0 +1,125 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use CodeIgniter\Model;
+
+class ActorModel extends Model
+{
+    protected $table = 'activitypub_actors';
+
+    protected $allowedFields = [
+        'id',
+        'uri',
+        'username',
+        'domain',
+        'display_name',
+        'summary',
+        'private_key',
+        'public_key',
+        'avatar_image_url',
+        'avatar_image_mimetype',
+        'cover_image_url',
+        'cover_image_mimetype',
+        'inbox_url',
+        'outbox_url',
+        'followers_url',
+        'followers_count',
+        'notes_count',
+        'is_blocked',
+    ];
+
+    protected $returnType = \ActivityPub\Entities\Actor::class;
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = true;
+
+    public function getActorById($id)
+    {
+        return $this->find($id);
+    }
+
+    /**
+     * Looks for actor with username and domain,
+     * if no domain has been specified, the current host will be used
+     *
+     * @param mixed $username
+     * @param mixed|null $domain
+     * @return mixed
+     */
+    public function getActorByUsername($username, $domain = null)
+    {
+        // TODO: is there a better way?
+        helper('activitypub');
+
+        if (!$domain) {
+            $domain = get_current_domain();
+        }
+
+        if (!($found = cache("actor@{$username}@{$domain}"))) {
+            $found = $this->where([
+                'username' => $username,
+                'domain' => $domain,
+            ])->first();
+
+            cache()->save("actor@{$username}@{$domain}", $found, DECADE);
+        }
+
+        return $found;
+    }
+
+    public function getActorByUri($actorUri)
+    {
+        return $this->where('uri', $actorUri)->first();
+    }
+
+    public function getFollowers($actorId)
+    {
+        return $this->join(
+            'activitypub_follows',
+            'activitypub_follows.actor_id = id',
+            'inner',
+        )
+            ->where('activitypub_follows.target_actor_id', $actorId)
+            ->findAll();
+    }
+
+    /**
+     * Check if an actor is blocked using its uri
+     *
+     * @param mixed $actorUri
+     * @return boolean
+     */
+    public function isActorBlocked($actorUri)
+    {
+        return $this->where(['uri' => $actorUri, 'is_blocked' => true])->first()
+            ? true
+            : false;
+    }
+
+    /**
+     * Retrieves all blocked actors.
+     *
+     * @return \ActivityPub\Entities\Actor[]
+     */
+    public function getBlockedActors()
+    {
+        return $this->where('is_blocked', 1)->findAll();
+    }
+
+    public function blockActor($actorId)
+    {
+        $this->update($actorId, ['is_blocked' => 1]);
+    }
+
+    public function unblockActor($actorId)
+    {
+        $this->update($actorId, ['is_blocked' => 0]);
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/BlockedDomainModel.php b/app/Libraries/ActivityPub/Models/BlockedDomainModel.php
new file mode 100644
index 0000000000..482ef77c49
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/BlockedDomainModel.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use CodeIgniter\Model;
+
+class BlockedDomainModel extends Model
+{
+    protected $table = 'activitypub_blocked_domains';
+    protected $primaryKey = 'name';
+
+    protected $allowedFields = ['name'];
+
+    protected $returnType = \ActivityPub\Entities\BlockedDomain::class;
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = true;
+    protected $updatedField = null;
+
+    /**
+     * Retrieves instance or podcast domain blocks depending on whether or not $podcastId param is set.
+     *
+     * @param integer|null $podcastId
+     */
+    public function getBlockedDomains()
+    {
+        return $this->findAll();
+    }
+
+    public function isDomainBlocked($domain)
+    {
+        if ($this->find($domain)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public function blockDomain($name)
+    {
+        $this->db->transStart();
+
+        // set all actors from the domain as blocked
+        model('ActorModel')
+            ->where('domain', $name)
+            ->set('is_blocked', 1)
+            ->update();
+
+        $result = $this->insert([
+            'name' => $name,
+        ]);
+
+        $this->db->transComplete();
+
+        return $result;
+    }
+
+    public function unblockDomain($name)
+    {
+        $this->db->transStart();
+        // unblock all actors from the domain
+        model('ActorModel')
+            ->where('domain', $name)
+            ->set('is_blocked', 0)
+            ->update();
+
+        $result = $this->delete($name);
+
+        $this->db->transComplete();
+
+        return $result;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/FavouriteModel.php b/app/Libraries/ActivityPub/Models/FavouriteModel.php
new file mode 100644
index 0000000000..8a5d781e48
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/FavouriteModel.php
@@ -0,0 +1,178 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use ActivityPub\Activities\LikeActivity;
+use ActivityPub\Activities\UndoActivity;
+use CodeIgniter\Events\Events;
+
+class FavouriteModel extends UuidModel
+{
+    protected $table = 'activitypub_favourites';
+    protected $uuidFields = ['note_id'];
+
+    protected $allowedFields = ['actor_id', 'note_id'];
+
+    protected $returnType = \ActivityPub\Entities\Favourite::class;
+
+    protected $useTimestamps = true;
+    protected $updatedField = null;
+
+    /**
+     *
+     * @param \ActivityPub\Entities\Actor $actor
+     * @param \ActivityPub\Entities\Note $note
+     * @param bool $registerActivity
+     * @return void
+     */
+    public function addFavourite($actor, $note, $registerActivity = true)
+    {
+        $this->db->transStart();
+
+        $this->insert([
+            'actor_id' => $actor->id,
+            'note_id' => $note->id,
+        ]);
+
+        model('NoteModel')
+            ->where(
+                'id',
+                service('uuid')
+                    ->fromString($note->id)
+                    ->getBytes(),
+            )
+            ->increment('favourites_count');
+
+        Events::trigger('on_note_favourite', $actor, $note);
+
+        if ($registerActivity) {
+            $likeActivity = new LikeActivity();
+            $likeActivity->set('actor', $actor->uri)->set('object', $note->uri);
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Like',
+                $actor->id,
+                null,
+                $note->id,
+                $likeActivity->toJSON(),
+                $note->published_at,
+                'queued',
+            );
+
+            $likeActivity->set(
+                'id',
+                url_to('activity', $actor->username, $activityId),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $likeActivity->toJSON(),
+            ]);
+        }
+
+        $this->db->transComplete();
+    }
+
+    public function removeFavourite($actor, $note, $registerActivity = true)
+    {
+        $this->db->transStart();
+
+        model('NoteModel')
+            ->where(
+                'id',
+                service('uuid')
+                    ->fromString($note->id)
+                    ->getBytes(),
+            )
+            ->decrement('favourites_count');
+
+        $this->table('activitypub_favourites')
+            ->where([
+                'actor_id' => $actor->id,
+                'note_id' => service('uuid')
+                    ->fromString($note->id)
+                    ->getBytes(),
+            ])
+            ->delete();
+
+        Events::trigger('on_note_undo_favourite', $actor, $note);
+
+        if ($registerActivity) {
+            $undoActivity = new UndoActivity();
+            // get like activity
+            $activity = model('ActivityModel')
+                ->where([
+                    'type' => 'Like',
+                    'actor_id' => $actor->id,
+                    'note_id' => service('uuid')
+                        ->fromString($note->id)
+                        ->getBytes(),
+                ])
+                ->first();
+
+            $likeActivity = new LikeActivity();
+            $likeActivity
+                ->set(
+                    'id',
+                    base_url(
+                        route_to('activity', $actor->username, $activity->id),
+                    ),
+                )
+                ->set('actor', $actor->uri)
+                ->set('object', $note->uri);
+
+            $undoActivity
+                ->set('actor', $actor->uri)
+                ->set('object', $likeActivity);
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Undo',
+                $actor->id,
+                null,
+                $note->id,
+                $undoActivity->toJSON(),
+                $note->published_at,
+                'queued',
+            );
+
+            $undoActivity->set(
+                'id',
+                url_to('activity', $actor->username, $activityId),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $undoActivity->toJSON(),
+            ]);
+        }
+
+        $this->db->transComplete();
+    }
+
+    /**
+     * Adds or removes favourite from database and increments count
+     *
+     * @param \ActivityPub\Entities\Actor $actor
+     * @param \ActivityPub\Entities\Note $note
+     * @return void
+     */
+    public function toggleFavourite($actor, $note)
+    {
+        if (
+            $this->where([
+                'actor_id' => $actor->id,
+                'note_id' => service('uuid')
+                    ->fromString($note->id)
+                    ->getBytes(),
+            ])->first()
+        ) {
+            $this->removeFavourite($actor, $note);
+        } else {
+            $this->addFavourite($actor, $note);
+        }
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/FollowModel.php b/app/Libraries/ActivityPub/Models/FollowModel.php
new file mode 100644
index 0000000000..89831855d4
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/FollowModel.php
@@ -0,0 +1,148 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use ActivityPub\Activities\FollowActivity;
+use ActivityPub\Activities\UndoActivity;
+use CodeIgniter\Database\Exceptions\DatabaseException;
+use CodeIgniter\I18n\Time;
+use CodeIgniter\Model;
+use InvalidArgumentException;
+
+class FollowModel extends Model
+{
+    protected $table = 'activitypub_follows';
+
+    protected $allowedFields = ['actor_id', 'target_actor_id'];
+
+    protected $returnType = \ActivityPub\Entities\Follow::class;
+
+    protected $useTimestamps = true;
+    protected $updatedField = null;
+
+    /**
+     *
+     * @param \ActivityPub\Entities\Actor $actor
+     * @param \ActivityPub\Entities\Actor $targetActor
+     * @param bool $registerActivity
+     * @return void
+     * @throws DatabaseException
+     */
+    public function addFollower($actor, $targetActor, $registerActivity = true)
+    {
+        try {
+            $this->db->transStart();
+
+            $this->insert([
+                'actor_id' => $actor->id,
+                'target_actor_id' => $targetActor->id,
+            ]);
+
+            // increment followers_count for target actor
+            model('ActorModel')
+                ->where('id', $targetActor->id)
+                ->increment('followers_count');
+
+            if ($registerActivity) {
+                $followActivity = new FollowActivity();
+
+                $followActivity
+                    ->set('actor', $actor->uri)
+                    ->set('object', $targetActor->uri);
+
+                $activityId = model('ActivityModel')->newActivity(
+                    'Follow',
+                    $actor->id,
+                    $targetActor->id,
+                    null,
+                    $followActivity->toJSON(),
+                    Time::now(),
+                    'queued',
+                );
+
+                $followActivity->set(
+                    'id',
+                    base_url(
+                        route_to('activity', $actor->username, $activityId),
+                    ),
+                );
+
+                model('ActivityModel')->update($activityId, [
+                    'payload' => $followActivity->toJSON(),
+                ]);
+            }
+
+            $this->db->transComplete();
+        } catch (\Exception $e) {
+            // follow already exists, do nothing
+        }
+    }
+
+    /**
+     * @param \ActivityPub\Entities\Actor $actor
+     * @param \ActivityPub\Entities\Actor $targetActor
+     * @return void
+     * @throws InvalidArgumentException
+     * @throws DatabaseException
+     */
+    public function removeFollower(
+        $actor,
+        $targetActor,
+        $registerActivity = true
+    ) {
+        $this->db->transStart();
+
+        $this->where([
+            'actor_id' => $actor->id,
+            'target_actor_id' => $targetActor->id,
+        ])->delete();
+
+        // decrement followers_count for target actor
+        model('ActorModel')
+            ->where('id', $targetActor->id)
+            ->decrement('followers_count');
+
+        if ($registerActivity) {
+            $undoActivity = new UndoActivity();
+            // get follow activity from database
+            $followActivity = model('ActivityModel')
+                ->where([
+                    'type' => 'Follow',
+                    'actor_id' => $actor->id,
+                    'target_actor_id' => $targetActor->id,
+                ])
+                ->first();
+
+            $undoActivity
+                ->set('actor', $actor->uri)
+                ->set('object', $followActivity->payload);
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Undo',
+                $actor->id,
+                $targetActor->id,
+                null,
+                $undoActivity->toJSON(),
+                Time::now(),
+                'queued',
+            );
+
+            $undoActivity->set(
+                'id',
+                url_to('activity', $actor->username, $activityId),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $undoActivity->toJSON(),
+            ]);
+        }
+
+        $this->db->transComplete();
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/NoteModel.php b/app/Libraries/ActivityPub/Models/NoteModel.php
new file mode 100644
index 0000000000..f0914542d6
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/NoteModel.php
@@ -0,0 +1,548 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use ActivityPub\Entities\Note;
+use ActivityPub\Activities\AnnounceActivity;
+use ActivityPub\Activities\CreateActivity;
+use ActivityPub\Activities\DeleteActivity;
+use ActivityPub\Activities\UndoActivity;
+use ActivityPub\Objects\TombstoneObject;
+use CodeIgniter\Events\Events;
+use CodeIgniter\HTTP\URI;
+use CodeIgniter\I18n\Time;
+
+class NoteModel extends UuidModel
+{
+    protected $table = 'activitypub_notes';
+    protected $primaryKey = 'id';
+
+    protected $uuidFields = ['id', 'in_reply_to_id', 'reblog_of_id'];
+
+    protected $allowedFields = [
+        'id',
+        'uri',
+        'actor_id',
+        'in_reply_to_id',
+        'reblog_of_id',
+        'message',
+        'message_html',
+        'favourites_count',
+        'reblogs_count',
+        'replies_count',
+        'published_at',
+    ];
+
+    protected $returnType = \ActivityPub\Entities\Note::class;
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = true;
+    protected $updatedField = null;
+
+    protected $validationRules = [
+        'actor_id' => 'required',
+        'message_html' => 'required_without[reblog_of_id]|max_length[500]',
+    ];
+
+    protected $beforeInsert = ['setNoteId'];
+
+    public function getNoteById($noteId)
+    {
+        return $this->find($noteId);
+    }
+
+    public function getNoteByUri($noteUri)
+    {
+        return $this->where('uri', $noteUri)->first();
+    }
+
+    /**
+     * Retrieves all published notes for a given actor ordered by publication date
+     *
+     * @return \ActivityPub\Entities\Note[]
+     */
+    public function getActorNotes($actorId)
+    {
+        return $this->where([
+            'actor_id' => $actorId,
+            'in_reply_to_id' => null,
+        ])
+            ->where('`published_at` <= NOW()', null, false)
+            ->orderBy('published_at', 'DESC')
+            ->findAll();
+    }
+
+    /**
+     * Retrieves all published replies for a given note.
+     * By default, it does not get replies from blocked actors.
+     *
+     * @param mixed $noteId
+     * @param boolean $withBlocked false by default
+     * @return array
+     */
+    public function getNoteReplies($noteId, $withBlocked = false)
+    {
+        if (!$withBlocked) {
+            $this->select('activitypub_notes.*')
+                ->join(
+                    'activitypub_actors',
+                    'activitypub_actors.id = activitypub_notes.actor_id',
+                    'inner',
+                )
+                ->where('activitypub_actors.is_blocked', 0);
+        }
+
+        $this->where(
+            'in_reply_to_id',
+            service('uuid')
+                ->fromString($noteId)
+                ->getBytes(),
+        )
+            ->where('`published_at` <= NOW()', null, false)
+            ->orderBy('published_at', 'ASC');
+
+        return $this->findAll();
+    }
+
+    /**
+     * Retrieves all published reblogs for a given note
+     */
+    public function getNoteReblogs($noteId)
+    {
+        return $this->where('reblog_of_id', $noteId)
+            ->where('`published_at` <= NOW()', null, false)
+            ->orderBy('published_at', 'ASC')
+            ->findAll();
+    }
+
+    public function addPreviewCard($noteId, $previewCardId)
+    {
+        return $this->db->table('activitypub_notes_preview_cards')->insert([
+            'note_id' => $noteId,
+            'preview_card_id' => $previewCardId,
+        ]);
+    }
+
+    /**
+     * Adds note in database along preview card if relevant
+     *
+     * @param \ActivityPub\Entities\Note $note
+     * @param boolean $registerActivity
+     * @param boolean $createPreviewCard
+     * @return string|false returns the new note id if success or false otherwise
+     */
+    public function addNote(
+        $note,
+        $createPreviewCard = true,
+        $registerActivity = true
+    ) {
+        helper('activitypub');
+
+        $this->db->transStart();
+
+        if (!($newNoteId = $this->insert($note, true))) {
+            $this->db->transRollback();
+
+            // Couldn't insert note
+            return false;
+        }
+
+        if ($createPreviewCard) {
+            // parse message
+            $messageUrls = extract_urls_from_message($note->message);
+
+            if (
+                !empty($messageUrls) &&
+                ($previewCard = get_or_create_preview_card_from_url(
+                    new URI($messageUrls[0]),
+                ))
+            ) {
+                if (!$this->addPreviewCard($newNoteId, $previewCard->id)) {
+                    $this->db->transRollback();
+
+                    // problem when linking note to preview card
+                    return false;
+                }
+
+                $this->db->transComplete();
+
+                return $newNoteId;
+            }
+        }
+
+        model('ActorModel')
+            ->where('id', $note->actor_id)
+            ->increment('notes_count');
+
+        Events::trigger('on_note_add', $note);
+
+        if ($registerActivity) {
+            $noteUuid = service('uuid')
+                ->fromBytes($newNoteId)
+                ->toString();
+
+            // set note id and uri to construct NoteObject
+            $note->id = $noteUuid;
+            $note->uri = base_url(
+                route_to('note', $note->actor->username, $noteUuid),
+            );
+
+            $createActivity = new CreateActivity();
+            $noteObjectClass = config('ActivityPub')->noteObject;
+            $createActivity
+                ->set('actor', $note->actor->uri)
+                ->set('object', new $noteObjectClass($note));
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Create',
+                $note->actor_id,
+                null,
+                $noteUuid,
+                $createActivity->toJSON(),
+                $note->published_at,
+                'queued',
+            );
+
+            $createActivity->set(
+                'id',
+                base_url(
+                    route_to('activity', $note->actor->username, $activityId),
+                ),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $createActivity->toJSON(),
+            ]);
+        }
+
+        $this->db->transComplete();
+
+        return $newNoteId;
+    }
+
+    public function editNote($updatedNote)
+    {
+        $this->db->transStart();
+
+        // update note create activity schedule in database
+        $scheduledActivity = model('ActivityModel')
+            ->where([
+                'type' => 'Create',
+                'note_id' => service('uuid')
+                    ->fromString($updatedNote->id)
+                    ->getBytes(),
+            ])
+            ->first();
+
+        // update published date in payload
+        $newPayload = $scheduledActivity->payload;
+        $newPayload->object->published = $updatedNote->published_at->format(
+            DATE_W3C,
+        );
+        model('ActivityModel')->update($scheduledActivity->id, [
+            'payload' => json_encode($newPayload),
+            'scheduled_at' => $updatedNote->published_at,
+        ]);
+
+        // update note
+        $updateResult = $this->update($updatedNote->id, $updatedNote);
+
+        $this->db->transComplete();
+
+        return $updateResult;
+    }
+
+    /**
+     * Removes a note from the database and decrements meta data
+     *
+     * @param \ActivityPub\Entities\Note $note
+     * @return mixed
+     */
+    public function removeNote($note, $registerActivity = true)
+    {
+        $this->db->transStart();
+
+        model('ActorModel')
+            ->where('id', $note->actor_id)
+            ->decrement('notes_count');
+
+        if ($note->in_reply_to_id) {
+            // Note to remove is a reply
+            model('NoteModel')
+                ->where(
+                    'id',
+                    service('uuid')
+                        ->fromString($note->in_reply_to_id)
+                        ->getBytes(),
+                )
+                ->decrement('replies_count');
+        }
+
+        // remove all reblogs
+        foreach ($note->reblogs as $reblog) {
+            $this->removeNote($reblog);
+        }
+
+        // remove all replies
+        foreach ($note->replies as $reply) {
+            $this->removeNote($reply);
+        }
+
+        Events::trigger('on_note_remove', $note);
+
+        if ($registerActivity) {
+            $deleteActivity = new DeleteActivity();
+            $tombstoneObject = new TombstoneObject();
+            $tombstoneObject->set('id', $note->uri);
+            $deleteActivity
+                ->set('actor', $note->actor->uri)
+                ->set('object', $tombstoneObject);
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Delete',
+                $note->actor_id,
+                null,
+                null,
+                $deleteActivity->toJSON(),
+                Time::now(),
+                'queued',
+            );
+
+            $deleteActivity->set(
+                'id',
+                base_url(
+                    route_to('activity', $note->actor->username, $activityId),
+                ),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $deleteActivity->toJSON(),
+            ]);
+        }
+
+        $result = model('NoteModel', false)->delete($note->id);
+
+        $this->db->transComplete();
+
+        return $result;
+    }
+
+    public function addReply(
+        $reply,
+        $createPreviewCard = true,
+        $registerActivity = true
+    ) {
+        if (!$reply->in_reply_to_id) {
+            throw new \Exception('Passed note is not a reply!');
+        }
+
+        $this->db->transStart();
+
+        $noteId = $this->addNote($reply, $createPreviewCard, $registerActivity);
+
+        model('NoteModel')
+            ->where(
+                'id',
+                service('uuid')
+                    ->fromString($reply->in_reply_to_id)
+                    ->getBytes(),
+            )
+            ->increment('replies_count');
+
+        Events::trigger('on_note_reply', $reply);
+
+        $this->db->transComplete();
+
+        return $noteId;
+    }
+
+    /**
+     *
+     * @param \ActivityPub\Entities\Actor $actor
+     * @param \ActivityPub\Entities\Note $note
+     * @return ActivityPub\Models\BaseResult|int|string|false
+     */
+    public function reblog($actor, $note, $registerActivity = true)
+    {
+        $this->db->transStart();
+
+        $reblog = new Note([
+            'actor_id' => $actor->id,
+            'reblog_of_id' => $note->id,
+            'published_at' => Time::now(),
+        ]);
+
+        // add reblog
+        $reblogId = $this->insert($reblog, true);
+
+        model('ActorModel')
+            ->where('id', $actor->id)
+            ->increment('notes_count');
+
+        model('NoteModel')
+            ->where(
+                'id',
+                service('uuid')
+                    ->fromString($note->id)
+                    ->getBytes(),
+            )
+            ->increment('reblogs_count');
+
+        Events::trigger('on_note_reblog', $actor, $note);
+
+        if ($registerActivity) {
+            $announceActivity = new AnnounceActivity($reblog);
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Announce',
+                $actor->id,
+                null,
+                $note->id,
+                $announceActivity->toJSON(),
+                $reblog->published_at,
+                'queued',
+            );
+
+            $announceActivity->set(
+                'id',
+                base_url(
+                    route_to('activity', $note->actor->username, $activityId),
+                ),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $announceActivity->toJSON(),
+            ]);
+        }
+
+        $this->db->transComplete();
+
+        return $reblogId;
+    }
+
+    /**
+     * @param \ActivityPub\Entities\Note $reblogNote
+     * @return mixed
+     */
+    public function undoReblog($reblogNote, $registerActivity = true)
+    {
+        $this->db->transStart();
+
+        model('ActorModel')
+            ->where('id', $reblogNote->actor_id)
+            ->decrement('notes_count');
+
+        model('NoteModel')
+            ->where(
+                'id',
+                service('uuid')
+                    ->fromString($reblogNote->reblog_of_id)
+                    ->getBytes(),
+            )
+            ->decrement('reblogs_count');
+
+        Events::trigger('on_note_undo_reblog', $reblogNote);
+
+        if ($registerActivity) {
+            $undoActivity = new UndoActivity();
+            // get like activity
+            $activity = model('ActivityModel')
+                ->where([
+                    'type' => 'Announce',
+                    'actor_id' => $reblogNote->actor_id,
+                    'note_id' => service('uuid')
+                        ->fromString($reblogNote->reblog_of_id)
+                        ->getBytes(),
+                ])
+                ->first();
+
+            $announceActivity = new AnnounceActivity($reblogNote);
+            $announceActivity->set(
+                'id',
+                base_url(
+                    route_to(
+                        'activity',
+                        $reblogNote->actor->username,
+                        $activity->id,
+                    ),
+                ),
+            );
+
+            $undoActivity
+                ->set('actor', $reblogNote->actor->uri)
+                ->set('object', $announceActivity);
+
+            $activityId = model('ActivityModel')->newActivity(
+                'Undo',
+                $reblogNote->actor_id,
+                null,
+                $reblogNote->reblog_of_id,
+                $undoActivity->toJSON(),
+                Time::now(),
+                'queued',
+            );
+
+            $undoActivity->set(
+                'id',
+                base_url(
+                    route_to(
+                        'activity',
+                        $reblogNote->actor->username,
+                        $activityId,
+                    ),
+                ),
+            );
+
+            model('ActivityModel')->update($activityId, [
+                'payload' => $undoActivity->toJSON(),
+            ]);
+        }
+
+        $result = model('NoteModel', false)->delete($reblogNote->id);
+
+        $this->db->transComplete();
+
+        return $result;
+    }
+
+    public function toggleReblog($actor, $note)
+    {
+        if (
+            !($reblogNote = $this->where([
+                'actor_id' => $actor->id,
+                'reblog_of_id' => service('uuid')
+                    ->fromString($note->id)
+                    ->getBytes(),
+            ])->first())
+        ) {
+            $this->reblog($actor, $note);
+        } else {
+            $this->undoReblog($reblogNote);
+        }
+    }
+
+    protected function setNoteId($data)
+    {
+        $uuid4 = service('uuid')->uuid4();
+        $data['id'] = $uuid4->toString();
+        $data['data']['id'] = $uuid4->getBytes();
+
+        if (!isset($data['data']['uri'])) {
+            $actor = model('ActorModel')->getActorById(
+                $data['data']['actor_id'],
+            );
+
+            $data['data']['uri'] = base_url(
+                route_to('note', $actor->username, $uuid4->toString()),
+            );
+        }
+
+        return $data;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/PreviewCardModel.php b/app/Libraries/ActivityPub/Models/PreviewCardModel.php
new file mode 100644
index 0000000000..874fe11518
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/PreviewCardModel.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use CodeIgniter\Model;
+
+class PreviewCardModel extends Model
+{
+    protected $table = 'activitypub_preview_cards';
+
+    protected $allowedFields = [
+        'id',
+        'url',
+        'title',
+        'description',
+        'type',
+        'author_name',
+        'author_url',
+        'provider_name',
+        'provider_url',
+        'image',
+        'html',
+    ];
+
+    protected $returnType = \ActivityPub\Entities\PreviewCard::class;
+    protected $useSoftDeletes = false;
+
+    protected $useTimestamps = true;
+
+    public function getPreviewCardFromUrl($url)
+    {
+        return $this->where('url', $url)->first();
+    }
+
+    public function getNotePreviewCard($noteId)
+    {
+        return $this->join(
+            'activitypub_notes_preview_cards',
+            'activitypub_notes_preview_cards.preview_card_id = id',
+            'inner',
+        )
+            ->where(
+                'note_id',
+                service('uuid')
+                    ->fromString($noteId)
+                    ->getBytes(),
+            )
+            ->first();
+    }
+}
diff --git a/app/Libraries/ActivityPub/Models/UuidModel.php b/app/Libraries/ActivityPub/Models/UuidModel.php
new file mode 100644
index 0000000000..2029a846f7
--- /dev/null
+++ b/app/Libraries/ActivityPub/Models/UuidModel.php
@@ -0,0 +1,206 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Models;
+
+use CodeIgniter\Database\Exceptions\DataException;
+use stdClass;
+
+class UuidModel extends \Michalsn\Uuid\UuidModel
+{
+    /**
+     * This insert overwrite is added as a means to FIX some bugs
+     * from the extended Uuid package. See: https://github.com/michalsn/codeigniter4-uuid/issues/2
+     *
+     * Inserts data into the current table. If an object is provided,
+     * it will attempt to convert it to an array.
+     *
+     * @param array|object $data
+     * @param boolean      $returnID Whether insert ID should be returned or not.
+     *
+     * @return BaseResult|integer|string|false
+     * @throws \ReflectionException
+     */
+    public function insert($data = null, bool $returnID = true)
+    {
+        $escape = null;
+
+        $this->insertID = 0;
+
+        if (empty($data)) {
+            $data = $this->tempData['data'] ?? null;
+            $escape = $this->tempData['escape'] ?? null;
+            $this->tempData = [];
+        }
+
+        if (empty($data)) {
+            throw DataException::forEmptyDataset('insert');
+        }
+
+        // If $data is using a custom class with public or protected
+        // properties representing the table elements, we need to grab
+        // them as an array.
+        if (is_object($data) && !$data instanceof stdClass) {
+            $data = static::classToArray(
+                $data,
+                $this->primaryKey,
+                $this->dateFormat,
+                false,
+            );
+        }
+
+        // If it's still a stdClass, go ahead and convert to
+        // an array so doProtectFields and other model methods
+        // don't have to do special checks.
+        if (is_object($data)) {
+            $data = (array) $data;
+        }
+
+        if (empty($data)) {
+            throw DataException::forEmptyDataset('insert');
+        }
+
+        // Validate data before saving.
+        if ($this->skipValidation === false) {
+            if ($this->cleanRules()->validate($data) === false) {
+                return false;
+            }
+        }
+
+        // Must be called first so we don't
+        // strip out created_at values.
+        $data = $this->doProtectFields($data);
+
+        // Set created_at and updated_at with same time
+        $date = $this->setDate();
+
+        if (
+            $this->useTimestamps &&
+            !empty($this->createdField) &&
+            !array_key_exists($this->createdField, $data)
+        ) {
+            $data[$this->createdField] = $date;
+        }
+
+        if (
+            $this->useTimestamps &&
+            !empty($this->updatedField) &&
+            !array_key_exists($this->updatedField, $data)
+        ) {
+            $data[$this->updatedField] = $date;
+        }
+
+        $eventData = ['data' => $data];
+        if ($this->tempAllowCallbacks) {
+            $eventData = $this->trigger('beforeInsert', $eventData);
+        }
+
+        // Require non empty primaryKey when
+        // not using auto-increment feature
+        if (
+            !$this->useAutoIncrement &&
+            empty($eventData['data'][$this->primaryKey])
+        ) {
+            throw DataException::forEmptyPrimaryKey('insert');
+        }
+
+        if (!empty($this->uuidFields)) {
+            foreach ($this->uuidFields as $field) {
+                if ($field === $this->primaryKey) {
+                    $this->uuidTempData[
+                        $field
+                    ] = $this->uuid->{$this->uuidVersion}();
+
+                    if ($this->uuidUseBytes === true) {
+                        $this->builder()->set(
+                            $field,
+                            $this->uuidTempData[$field]->getBytes(),
+                        );
+                    } else {
+                        $this->builder()->set(
+                            $field,
+                            $this->uuidTempData[$field]->toString(),
+                        );
+                    }
+                } else {
+                    if (
+                        $this->uuidUseBytes === true &&
+                        !empty($eventData['data'][$field])
+                    ) {
+                        $this->uuidTempData[$field] = $this->uuid->fromString(
+                            $eventData['data'][$field],
+                        );
+                        $this->builder()->set(
+                            $field,
+                            $this->uuidTempData[$field]->getBytes(),
+                        );
+                        unset($eventData['data'][$field]);
+                    }
+                }
+            }
+        }
+
+        // Must use the set() method to ensure objects get converted to arrays
+        $result = $this->builder()
+            ->set($eventData['data'], '', $escape)
+            ->insert();
+
+        // If insertion succeeded then save the insert ID
+        if ($result) {
+            if (
+                !$this->useAutoIncrement ||
+                isset($eventData['data'][$this->primaryKey])
+            ) {
+                $this->insertID = $eventData['data'][$this->primaryKey];
+            } else {
+                if (in_array($this->primaryKey, $this->uuidFields)) {
+                    $this->insertID = $this->uuidTempData[
+                        $this->primaryKey
+                    ]->toString();
+                } else {
+                    $this->insertID = $this->db->insertID();
+                }
+            }
+        }
+
+        // Cleanup data before event trigger
+        if (!empty($this->uuidFields) && $this->uuidUseBytes === true) {
+            foreach ($this->uuidFields as $field) {
+                if (
+                    $field === $this->primaryKey ||
+                    empty($this->uuidTempData[$field])
+                ) {
+                    continue;
+                }
+
+                $eventData['data'][$field] = $this->uuidTempData[
+                    $field
+                ]->toString();
+            }
+        }
+
+        $eventData = [
+            'id' => $this->insertID,
+            'data' => $eventData['data'],
+            'result' => $result,
+        ];
+        if ($this->tempAllowCallbacks) {
+            // Trigger afterInsert events with the inserted data and new ID
+            $this->trigger('afterInsert', $eventData);
+        }
+        $this->tempAllowCallbacks = $this->allowCallbacks;
+
+        // If insertion failed, get out of here
+        if (!$result) {
+            return $result;
+        }
+
+        // otherwise return the insertID, if requested.
+        return $returnID ? $this->insertID : $result;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Objects/ActorObject.php b/app/Libraries/ActivityPub/Objects/ActorObject.php
new file mode 100644
index 0000000000..5d9f07ee85
--- /dev/null
+++ b/app/Libraries/ActivityPub/Objects/ActorObject.php
@@ -0,0 +1,113 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Objects;
+
+use ActivityPub\Core\ObjectType;
+
+class ActorObject extends ObjectType
+{
+    /**
+     * @var array|string
+     */
+    protected $context = [
+        'https://www.w3.org/ns/activitystreams',
+        'https://w3id.org/security/v1',
+    ];
+
+    /**
+     * @var string
+     */
+    protected $type = 'Person';
+
+    /**
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * @var string
+     */
+    protected $preferredUsername;
+
+    /**
+     * @var string
+     */
+    protected $summary;
+
+    /**
+     * @var string
+     */
+    protected $inbox;
+
+    /**
+     * @var string
+     */
+    protected $outbox;
+
+    /**
+     * @var string
+     */
+    protected $followers;
+
+    /**
+     * @var string
+     */
+    protected $url;
+
+    /**
+     * @var array|null
+     */
+    protected $image;
+
+    /**
+     * @var array
+     */
+    protected $icon;
+
+    /**
+     * @var object
+     */
+    protected $publicKey;
+
+    /**
+     * @param \ActivityPub\Entities\Actor $podcast
+     */
+    public function __construct($actor)
+    {
+        $this->id = $actor->uri;
+
+        $this->name = $actor->display_name;
+        $this->preferredUsername = $actor->username;
+        $this->summary = $actor->summary;
+        $this->url = $actor->uri;
+
+        $this->inbox = $actor->inbox_url;
+        $this->outbox = $actor->outbox_url;
+        $this->followers = $actor->followers_url;
+
+        if ($actor->cover_image_url) {
+            $this->image = [
+                'type' => 'Image',
+                'mediaType' => $actor->cover_image_mimetype,
+                'url' => $actor->cover_image_url,
+            ];
+        }
+        $this->icon = [
+            'type' => 'Image',
+            'mediaType' => $actor->avatar_image_mimetype,
+            'url' => $actor->avatar_image_url,
+        ];
+
+        $this->publicKey = [
+            'id' => $actor->key_id,
+            'owner' => $actor->uri,
+            'publicKeyPem' => $actor->public_key,
+        ];
+    }
+}
diff --git a/app/Libraries/ActivityPub/Objects/NoteObject.php b/app/Libraries/ActivityPub/Objects/NoteObject.php
new file mode 100644
index 0000000000..92a83c53fb
--- /dev/null
+++ b/app/Libraries/ActivityPub/Objects/NoteObject.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * This class defines the Object which is the
+ * primary base type for the Activity Streams vocabulary.
+ *
+ * Object is a reserved word in php, so the class is named ObjectType.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Objects;
+
+use ActivityPub\Core\ObjectType;
+
+class NoteObject extends ObjectType
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Note';
+
+    /**
+     * @var string
+     */
+    protected $attributedTo;
+
+    /**
+     * @var string
+     */
+    protected $inReplyTo;
+
+    /**
+     * @var array
+     */
+    protected $replies;
+
+    /**
+     * @param \ActivityPub\Entities\Note $note
+     */
+    public function __construct($note)
+    {
+        $this->id = $note->uri;
+
+        $this->content = $note->message_html;
+        $this->published = $note->published_at->format(DATE_W3C);
+        $this->attributedTo = $note->actor->uri;
+
+        if ($note->is_reply) {
+            $this->inReplyTo = $note->reply_to_note->uri;
+        }
+
+        $this->replies = base_url(
+            route_to('note-replies', $note->actor->username, $note->id),
+        );
+
+        $this->cc = [$note->actor->followers_url];
+    }
+}
diff --git a/app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php b/app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php
new file mode 100644
index 0000000000..faabb78b1e
--- /dev/null
+++ b/app/Libraries/ActivityPub/Objects/OrderedCollectionObject.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * This class defines a Paginated OrderedCollection
+ * based on CodeIgniter4 Pager to get the pagination metadata
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Objects;
+
+use ActivityPub\Core\ObjectType;
+
+class OrderedCollectionObject extends ObjectType
+{
+    protected $type = 'OrderedCollection';
+
+    /**
+     * @var integer
+     */
+    protected $totalItems;
+
+    /**
+     * @var integer|null
+     */
+    protected $first;
+
+    /**
+     * @var integer|null
+     */
+    protected $current;
+
+    /**
+     * @var integer|null
+     */
+    protected $last;
+
+    /**
+     * @var array|null
+     */
+    protected $orderedItems;
+
+    /**
+     * @param \ActivityPub\Libraries\ActivityPub\Activity[] $orderedItems
+     * @param \CodeIgniter\Pager\Pager $pager
+     */
+    public function __construct($orderedItems, $pager = null)
+    {
+        $this->id = current_url();
+
+        if ($pager) {
+            $totalItems = $pager->getTotal();
+            $this->totalItems = $totalItems;
+
+            if ($totalItems) {
+                $this->first = $pager->getPageURI($pager->getFirstPage());
+                $this->current = $pager->getPageURI();
+                $this->last = $pager->getPageURI($pager->getLastPage());
+            }
+        }
+
+        $this->orderedItems = $orderedItems;
+    }
+}
diff --git a/app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php b/app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php
new file mode 100644
index 0000000000..98eba8f257
--- /dev/null
+++ b/app/Libraries/ActivityPub/Objects/OrderedCollectionPage.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * This class defines a Paginated OrderedCollection
+ * based on CodeIgniter4 Pager to get the pagination metadata
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Objects;
+
+class OrderedCollectionPage extends OrderedCollectionObject
+{
+    /**
+     * @var string
+     */
+    protected $type = 'OrderedCollectionPage';
+
+    /**
+     * @var string
+     */
+    protected $partOf;
+
+    /**
+     * @var integer
+     */
+    protected $prev;
+
+    /**
+     * @var integer
+     */
+    protected $next;
+
+    /**
+     * @param \CodeIgniter\Pager\Pager $pager
+     * @param \ActivityPub\Libraries\ActivityPub\Activity[] $orderedItems
+     */
+    public function __construct($pager, $orderedItems)
+    {
+        parent::__construct($orderedItems, $pager);
+
+        $isFirstPage = $pager->getCurrentPage() === $pager->getFirstPage();
+        $isLastPage = $pager->getCurrentPage() === $pager->getLastPage();
+        $isFirstPage && ($this->first = null);
+        $isLastPage && ($this->last = null);
+
+        $this->id = $pager->getPageURI($pager->getCurrentPage());
+        $this->partOf = $pager->getPageURI();
+        $this->prev = $pager->getPreviousPageURI();
+        $this->current = $pager->getPageURI($pager->getCurrentPage());
+        $this->next = $pager->getNextPageURI();
+    }
+}
diff --git a/app/Libraries/ActivityPub/Objects/TombstoneObject.php b/app/Libraries/ActivityPub/Objects/TombstoneObject.php
new file mode 100644
index 0000000000..a29bdd7a07
--- /dev/null
+++ b/app/Libraries/ActivityPub/Objects/TombstoneObject.php
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub\Objects;
+
+use ActivityPub\Core\ObjectType;
+
+class TombstoneObject extends ObjectType
+{
+    /**
+     * @var string
+     */
+    protected $type = 'Tombstone';
+}
diff --git a/app/Libraries/ActivityPub/WebFinger.php b/app/Libraries/ActivityPub/WebFinger.php
new file mode 100644
index 0000000000..58f6ce4b88
--- /dev/null
+++ b/app/Libraries/ActivityPub/WebFinger.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace ActivityPub;
+
+use Exception;
+
+class WebFinger
+{
+    const RESOURCE_PATTERN = '/^acct:(?P<username>([\w_]+))@(?P<domain>([\w\-\.]+[\w]+)(:[\d]+)?)$/x';
+
+    /**
+     * @var string
+     */
+    protected $username;
+
+    /**
+     * @var string
+     */
+    protected $host;
+
+    /**
+     * @var string
+     */
+    protected $port;
+
+    /**
+     * @var string
+     */
+    protected $subject;
+
+    /**
+     * @var array
+     */
+    protected $aliases;
+
+    /**
+     * @var string
+     */
+    protected $links;
+
+    /**
+     * @param string $resource
+     */
+    public function __construct($resource)
+    {
+        $this->subject = $resource;
+
+        // Split resource into its parts (username, domain)
+        $parts = $this->splitResource($resource);
+        if (!$parts) {
+            throw new Exception('Wrong WebFinger resource pattern.');
+        }
+        extract($parts);
+
+        $this->username = $username;
+        $this->domain = $domain;
+
+        $currentUrl = current_url(true);
+        $currentDomain =
+            $currentUrl->getHost() .
+            ($currentUrl->getPort() ? ':' . $currentUrl->getPort() : '');
+        if ($currentDomain !== $domain) {
+            // TODO: return error code
+            throw new Exception('Domain does not correspond to Instance.');
+        }
+
+        if (
+            !($actor = model('ActorModel')->getActorByUsername(
+                $username,
+                $domain,
+            ))
+        ) {
+            throw new Exception('Could not find actor');
+        }
+
+        $this->aliases = [$actor->id];
+        $this->links = [
+            [
+                'rel' => 'self',
+                'type' => 'application/activity+json',
+                'href' => $actor->uri,
+            ],
+            [
+                'rel' => 'http://webfinger.net/rel/profile-page',
+                'type' => 'text/html',
+                'href' => $actor->uri, # TODO: should there be 2 values? @actorUsername
+            ],
+        ];
+    }
+
+    /**
+     * Split resource into its parts (username, domain)
+     *
+     * @param string $resource
+     * @return bool|array
+     */
+    private function splitResource(string $resource)
+    {
+        if (!preg_match(self::RESOURCE_PATTERN, $resource, $matches)) {
+            // Resource pattern failed
+            return false;
+        }
+
+        return $matches;
+    }
+
+    /**
+     * Get WebFinger response as an array
+     *
+     * @return array
+     */
+    public function toArray()
+    {
+        return [
+            'subject' => $this->subject,
+            'aliases' => $this->aliases,
+            'links' => $this->links,
+        ];
+    }
+}
diff --git a/app/Libraries/Breadcrumb.php b/app/Libraries/Breadcrumb.php
index 816f61eb3e..5f5bea273a 100644
--- a/app/Libraries/Breadcrumb.php
+++ b/app/Libraries/Breadcrumb.php
@@ -3,7 +3,7 @@
 /**
  * Generates and renders a breadcrumb based on the current url segments
  *
- * @copyright  2020 Podlibre
+ * @copyright  2021 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
  */
diff --git a/app/Libraries/Image.php b/app/Libraries/Image.php
new file mode 100644
index 0000000000..c713393709
--- /dev/null
+++ b/app/Libraries/Image.php
@@ -0,0 +1,153 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Libraries;
+
+class Image
+{
+    /**
+     * @var \Config\Images
+     */
+    protected $config;
+
+    /**
+     * @var string
+     */
+    protected $original_path;
+
+    /**
+     * @var string
+     */
+    public $original_url;
+
+    /**
+     * @var string
+     */
+    protected $thumbnail_path;
+
+    /**
+     * @var string
+     */
+    public $thumbnail_url;
+
+    /**
+     * @var string
+     */
+    protected $medium_path;
+
+    /**
+     * @var string
+     */
+    public $medium_url;
+
+    /**
+     * @var string
+     */
+    protected $large_path;
+
+    /**
+     * @var string
+     */
+    public $large_url;
+
+    /**
+     * @var string
+     */
+    public $feed_path;
+
+    /**
+     * @var string
+     */
+    public $feed_url;
+
+    /**
+     * @var string
+     */
+    public $id3_path;
+
+    public function __construct($originalUri, $mimetype)
+    {
+        helper('media');
+
+        $originalPath = media_path($originalUri);
+
+        [
+            'filename' => $filename,
+            'dirname' => $dirname,
+            'extension' => $extension,
+        ] = pathinfo($originalPath);
+
+        // load images extensions from config
+        $this->config = config('Images');
+
+        $thumbnailExtension = $this->config->thumbnailExtension;
+        $mediumExtension = $this->config->mediumExtension;
+        $largeExtension = $this->config->largeExtension;
+        $feedExtension = $this->config->feedExtension;
+        $id3Extension = $this->config->id3Extension;
+
+        $thumbnail =
+            $dirname . '/' . $filename . $thumbnailExtension . '.' . $extension;
+        $medium =
+            $dirname . '/' . $filename . $mediumExtension . '.' . $extension;
+        $large =
+            $dirname . '/' . $filename . $largeExtension . '.' . $extension;
+        $feed = $dirname . '/' . $filename . $feedExtension . '.' . $extension;
+        $id3 = $dirname . '/' . $filename . $id3Extension . '.' . $extension;
+
+        $this->original_path = $originalPath;
+        $this->original_url = media_url($originalUri);
+        $this->thumbnail_path = $thumbnail;
+        $this->thumbnail_url = base_url($thumbnail);
+        $this->medium_path = $medium;
+        $this->medium_url = base_url($medium);
+        $this->large_path = $large;
+        $this->large_url = base_url($large);
+        $this->feed_path = $feed;
+        $this->feed_url = base_url($feed);
+        $this->id3_path = $id3;
+
+        $this->mimetype = $mimetype;
+    }
+
+    public function saveSizes()
+    {
+        $thumbnailSize = $this->config->thumbnailSize;
+        $mediumSize = $this->config->mediumSize;
+        $largeSize = $this->config->largeSize;
+        $feedSize = $this->config->feedSize;
+        $id3Size = $this->config->id3Size;
+
+        $imageService = \Config\Services::image();
+
+        $imageService
+            ->withFile($this->original_path)
+            ->resize($thumbnailSize, $thumbnailSize)
+            ->save($this->thumbnail_path);
+
+        $imageService
+            ->withFile($this->original_path)
+            ->resize($mediumSize, $mediumSize)
+            ->save($this->medium_path);
+
+        $imageService
+            ->withFile($this->original_path)
+            ->resize($largeSize, $largeSize)
+            ->save($this->large_path);
+
+        $imageService
+            ->withFile($this->original_path)
+            ->resize($feedSize, $feedSize)
+            ->save($this->feed_path);
+
+        $imageService
+            ->withFile($this->original_path)
+            ->resize($id3Size, $id3Size)
+            ->save($this->id3_path);
+    }
+}
diff --git a/app/Libraries/Negotiate.php b/app/Libraries/Negotiate.php
new file mode 100644
index 0000000000..8e52ca036e
--- /dev/null
+++ b/app/Libraries/Negotiate.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Libraries;
+
+class Negotiate extends \CodeIgniter\HTTP\Negotiate
+{
+    public function callMatch(
+        array $acceptable,
+        string $supported,
+        bool $enforceTypes = false
+    ): bool {
+        return $this->match($acceptable, $supported, $enforceTypes);
+    }
+}
diff --git a/app/Libraries/NoteObject.php b/app/Libraries/NoteObject.php
new file mode 100644
index 0000000000..4602784e25
--- /dev/null
+++ b/app/Libraries/NoteObject.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Libraries;
+
+class NoteObject extends \ActivityPub\Objects\NoteObject
+{
+    /**
+     * @param \App\Entities\Note $note
+     */
+    public function __construct($note)
+    {
+        parent::__construct($note);
+
+        if ($note->episode_id) {
+            $this->content =
+                '<a href="' .
+                $note->episode->link .
+                '" target="_blank" rel="noopener noreferrer">' .
+                $note->episode->title .
+                '</a><br/>' .
+                $note->message_html;
+        }
+    }
+}
diff --git a/app/Libraries/PodcastActor.php b/app/Libraries/PodcastActor.php
new file mode 100644
index 0000000000..acc55e2ce4
--- /dev/null
+++ b/app/Libraries/PodcastActor.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Libraries;
+
+use App\Models\PodcastModel;
+
+class PodcastActor extends \ActivityPub\Objects\ActorObject
+{
+    /**
+     * @var string
+     */
+    protected $rss;
+
+    /**
+     * @param \App\Entities\Actor $actor
+     */
+    public function __construct($actor)
+    {
+        parent::__construct($actor);
+
+        $podcast = (new PodcastModel())->where('actor_id', $actor->id)->first();
+
+        $this->rss = $podcast->feed_url;
+    }
+}
diff --git a/app/Libraries/Router.php b/app/Libraries/Router.php
new file mode 100644
index 0000000000..fddaa2ba4f
--- /dev/null
+++ b/app/Libraries/Router.php
@@ -0,0 +1,205 @@
+<?php
+
+/**
+ * This file extends the Router class from the CodeIgniter 4 framework.
+ *
+ * It introduces the alternate-content option for a route.
+ *
+ * @copyright  2021 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Libraries;
+
+use Config\Services;
+use CodeIgniter\Router\Exceptions\RedirectException;
+
+class Router extends \CodeIgniter\Router\Router
+{
+    /**
+     * Compares the uri string against the routes that the
+     * RouteCollection class defined for us, attempting to find a match.
+     * This method will modify $this->controller, etal as needed.
+     *
+     * @param string $uri The URI path to compare against the routes
+     *
+     * @return boolean Whether the route was matched or not.
+     * @throws RedirectException
+     */
+    protected function checkRoutes(string $uri): bool
+    {
+        $routes = $this->collection->getRoutes(
+            $this->collection->getHTTPVerb(),
+        );
+
+        // Don't waste any time
+        if (empty($routes)) {
+            return false;
+        }
+
+        $uri = $uri === '/' ? $uri : ltrim($uri, '/ ');
+
+        // Loop through the route array looking for wildcards
+        foreach ($routes as $key => $val) {
+            // Reset localeSegment
+            $localeSegment = null;
+
+            $key = $key === '/' ? $key : ltrim($key, '/ ');
+
+            $matchedKey = $key;
+
+            // Are we dealing with a locale?
+            if (strpos($key, '{locale}') !== false) {
+                $localeSegment = array_search(
+                    '{locale}',
+                    preg_split(
+                        '/[\/]*((^[a-zA-Z0-9])|\(([^()]*)\))*[\/]+/m',
+                        $key,
+                    ),
+                    true,
+                );
+
+                // Replace it with a regex so it
+                // will actually match.
+                $key = str_replace('/', '\/', $key);
+                $key = str_replace('{locale}', '[^\/]+', $key);
+            }
+
+            // Does the RegEx match?
+            if (preg_match('#^' . $key . '$#u', $uri, $matches)) {
+                $this->matchedRouteOptions = $this->collection->getRoutesOptions(
+                    $matchedKey,
+                );
+
+                // Is this route supposed to redirect to another?
+                if ($this->collection->isRedirect($key)) {
+                    throw new RedirectException(
+                        is_array($val) ? key($val) : $val,
+                        $this->collection->getRedirectCode($key),
+                    );
+                }
+                // Store our locale so CodeIgniter object can
+                // assign it to the Request.
+                if (isset($localeSegment)) {
+                    // The following may be inefficient, but doesn't upset NetBeans :-/
+                    $temp = explode('/', $uri);
+                    $this->detectedLocale = $temp[$localeSegment];
+                }
+
+                // Are we using Closures? If so, then we need
+                // to collect the params into an array
+                // so it can be passed to the controller method later.
+                if (!is_string($val) && is_callable($val)) {
+                    $this->controller = $val;
+
+                    // Remove the original string from the matches array
+                    array_shift($matches);
+
+                    $this->params = $matches;
+
+                    $this->matchedRoute = [$matchedKey, $val];
+
+                    return true;
+                }
+
+                // Is there an alternate content for the matchedRoute?
+
+                // check if the alternate-content has been requested in the accept
+                // header and overwrite the $val with the matching controller method
+                if (
+                    array_key_exists(
+                        'alternate-content',
+                        $this->matchedRouteOptions,
+                    ) &&
+                    is_array($this->matchedRouteOptions['alternate-content'])
+                ) {
+                    $request = Services::request();
+                    $negotiate = Services::negotiator();
+
+                    $acceptHeader = $request->getHeader('Accept')->getValue();
+                    $parsedHeader = $negotiate->parseHeader($acceptHeader);
+
+                    $supported = array_keys(
+                        $this->matchedRouteOptions['alternate-content'],
+                    );
+
+                    $expectedContentType = $parsedHeader[0];
+                    foreach ($supported as $available) {
+                        if (
+                            $negotiate->callMatch(
+                                $expectedContentType,
+                                $available,
+                                true,
+                            )
+                        ) {
+                            if (
+                                array_key_exists(
+                                    'namespace',
+                                    $this->matchedRouteOptions[
+                                        'alternate-content'
+                                    ][$available],
+                                )
+                            ) {
+                                $this->collection->setDefaultNamespace(
+                                    $this->matchedRouteOptions[
+                                        'alternate-content'
+                                    ][$available]['namespace'],
+                                );
+                            }
+                            $val =
+                                $this->collection->getDefaultNamespace() .
+                                $this->directory .
+                                $this->matchedRouteOptions['alternate-content'][
+                                    $available
+                                ]['controller-method'];
+
+                            // no need to continue loop as $val has been overwritten
+                            break;
+                        }
+                    }
+                }
+
+                // Are we using the default method for back-references?
+
+                // Support resource route when function with subdirectory
+                // ex: $routes->resource('Admin/Admins');
+                if (
+                    strpos($val, '$') !== false &&
+                    strpos($key, '(') !== false &&
+                    strpos($key, '/') !== false
+                ) {
+                    $replacekey = str_replace('/(.*)', '', $key);
+                    $val = preg_replace('#^' . $key . '$#u', $val, $uri);
+                    $val = str_replace(
+                        $replacekey,
+                        str_replace('/', '\\', $replacekey),
+                        $val,
+                    );
+                } elseif (
+                    strpos($val, '$') !== false &&
+                    strpos($key, '(') !== false
+                ) {
+                    $val = preg_replace('#^' . $key . '$#u', $val, $uri);
+                } elseif (strpos($val, '/') !== false) {
+                    [$controller, $method] = explode('::', $val);
+
+                    // Only replace slashes in the controller, not in the method.
+                    $controller = str_replace('/', '\\', $controller);
+
+                    $val = $controller . '::' . $method;
+                }
+
+                $this->setRequest(explode('/', $val));
+
+                $this->matchedRoute = [$matchedKey, $val];
+
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    //--------------------------------------------------------------------
+}
diff --git a/app/Libraries/SimpleRSSElement.php b/app/Libraries/SimpleRSSElement.php
index 3aad896505..f37453c17a 100644
--- a/app/Libraries/SimpleRSSElement.php
+++ b/app/Libraries/SimpleRSSElement.php
@@ -1,7 +1,7 @@
 <?php
 
 /**
- * @copyright  2020 Podlibre
+ * @copyright  2021 Podlibre
  * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
  * @link       https://castopod.org/
  */
diff --git a/app/Models/AnalyticsPodcastByCountryModel.php b/app/Models/AnalyticsPodcastByCountryModel.php
index 413da94348..af76704cf3 100644
--- a/app/Models/AnalyticsPodcastByCountryModel.php
+++ b/app/Models/AnalyticsPodcastByCountryModel.php
@@ -34,24 +34,24 @@ class AnalyticsPodcastByCountryModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_by_country_weekly"
+                "{$podcastId}_analytics_podcast_by_country_weekly",
             ))
         ) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`country_code` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('country_code as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_by_country_weekly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -68,24 +68,24 @@ class AnalyticsPodcastByCountryModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_by_country_yearly"
+                "{$podcastId}_analytics_podcast_by_country_yearly",
             ))
         ) {
             $oneYearAgo = date('Y-m-d', strtotime('-1 year'));
-            $found = $this->select('`country_code` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('country_code as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneYearAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneYearAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_by_country_yearly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsPodcastByEpisodeModel.php b/app/Models/AnalyticsPodcastByEpisodeModel.php
index fce1544546..15725032d5 100644
--- a/app/Models/AnalyticsPodcastByEpisodeModel.php
+++ b/app/Models/AnalyticsPodcastByEpisodeModel.php
@@ -33,25 +33,25 @@ class AnalyticsPodcastByEpisodeModel extends Model
         if (!$episodeId) {
             if (
                 !($found = cache(
-                    "{$podcastId}_analytics_podcast_by_episode_by_day"
+                    "{$podcastId}_analytics_podcast_by_episode_by_day",
                 ))
             ) {
                 $lastEpisodes = (new EpisodeModel())
-                    ->select('`id`, `season_number`, `number`, `title`')
-                    ->orderBy('`id`', 'DESC')
-                    ->where(['`podcast_id`' => $podcastId])
+                    ->select('id, season_number, number, title')
+                    ->orderBy('id', 'DESC')
+                    ->where(['podcast_id' => $podcastId])
                     ->findAll(5);
 
-                $found = $this->select('`age` AS `X`');
+                $found = $this->select('age AS X');
 
                 $letter = 97;
                 foreach ($lastEpisodes as $episode) {
                     $found = $found
                         ->selectSum(
-                            '(CASE WHEN `episode_id`=' .
+                            '(CASE WHEN episode_id=' .
                                 $episode->id .
-                                ' THEN `hits` END)',
-                            '`' . chr($letter) . 'Y`'
+                                ' THEN hits END)',
+                            '' . chr($letter) . 'Y',
                         )
                         ->select(
                             '"' .
@@ -62,50 +62,50 @@ class AnalyticsPodcastByEpisodeModel extends Model
                                     ? ''
                                     : '-' . $episode->number . '/ ') .
                                 $episode->title .
-                                '" AS `' .
+                                '" AS ' .
                                 chr($letter) .
-                                'Value`'
+                                'Value',
                         );
                     $letter++;
                 }
 
                 $found = $found
                     ->where([
-                        '`podcast_id`' => $podcastId,
-                        '`age` <' => 60,
+                        'podcast_id' => $podcastId,
+                        'age <' => 60,
                     ])
-                    ->groupBy('`X`')
-                    ->orderBy('`X`', 'ASC')
+                    ->groupBy('X')
+                    ->orderBy('X', 'ASC')
                     ->findAll();
 
                 cache()->save(
                     "{$podcastId}_analytics_podcast_by_episode_by_day",
                     $found,
-                    600
+                    600,
                 );
             }
             return $found;
         } else {
             if (
                 !($found = cache(
-                    "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day"
+                    "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day",
                 ))
             ) {
-                $found = $this->select('`date as `labels`')
-                    ->selectSum('`hits`', '`values`')
+                $found = $this->select('date as labels')
+                    ->selectSum('hits', 'values')
                     ->where([
-                        '`episode_id`' => $episodeId,
-                        '`podcast_id`' => $podcastId,
-                        '`age` <' => 60,
+                        'episode_id' => $episodeId,
+                        'podcast_id' => $podcastId,
+                        'age <' => 60,
                     ])
-                    ->groupBy('`labels`')
-                    ->orderBy('`labels`', 'ASC')
+                    ->groupBy('labels')
+                    ->orderBy('labels', 'ASC')
                     ->findAll();
 
                 cache()->save(
                     "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_day",
                     $found,
-                    600
+                    600,
                 );
             }
             return $found;
@@ -121,23 +121,23 @@ class AnalyticsPodcastByEpisodeModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month"
+                "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month",
             ))
         ) {
-            $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels')
+                ->selectSum('hits', 'values')
                 ->where([
                     'episode_id' => $episodeId,
                     'podcast_id' => $podcastId,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`labels`', 'ASC')
+                ->groupBy('labels')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_{$episodeId}_analytics_podcast_by_episode_by_month",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsPodcastByHourModel.php b/app/Models/AnalyticsPodcastByHourModel.php
index 2d65209db0..df43d0383e 100644
--- a/app/Models/AnalyticsPodcastByHourModel.php
+++ b/app/Models/AnalyticsPodcastByHourModel.php
@@ -34,21 +34,21 @@ class AnalyticsPodcastByHourModel extends Model
     {
         if (!($found = cache("{$podcastId}_analytics_podcasts_by_hour"))) {
             $found = $this->select(
-                'right(concat(\'0\',`hour`,\'h\'),3) as `labels`'
+                'right(concat(\'0\',hour,\'h\'),3) as labels',
             )
-                ->selectSum('`hits`', '`values`')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => date('Y-m-d', strtotime('-60 days')),
+                    'podcast_id' => $podcastId,
+                    'date >' => date('Y-m-d', strtotime('-60 days')),
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`labels`', 'ASC')
+                ->groupBy('labels')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_hour",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsPodcastByPlayerModel.php b/app/Models/AnalyticsPodcastByPlayerModel.php
index 39359b8ccd..668ca123e9 100644
--- a/app/Models/AnalyticsPodcastByPlayerModel.php
+++ b/app/Models/AnalyticsPodcastByPlayerModel.php
@@ -34,25 +34,25 @@ class AnalyticsPodcastByPlayerModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcasts_by_player_by_app_weekly"
+                "{$podcastId}_analytics_podcasts_by_player_by_app_weekly",
             ))
         ) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`app` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('app as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`app` !=' => '',
-                    '`is_bot`' => 0,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'app !=' => '',
+                    'is_bot' => 0,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_player_by_app_weekly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -69,25 +69,25 @@ class AnalyticsPodcastByPlayerModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcasts_by_player_by_app_yearly"
+                "{$podcastId}_analytics_podcasts_by_player_by_app_yearly",
             ))
         ) {
             $oneYearAgo = date('Y-m-d', strtotime('-1 year'));
-            $found = $this->select('`app` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('app as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`app` !=' => '',
-                    '`is_bot`' => 0,
-                    '`date` >' => $oneYearAgo,
+                    'podcast_id' => $podcastId,
+                    'app !=' => '',
+                    'is_bot' => 0,
+                    'date >' => $oneYearAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_player_by_app_yearly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -104,26 +104,26 @@ class AnalyticsPodcastByPlayerModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcasts_by_player_by_os_weekly"
+                "{$podcastId}_analytics_podcasts_by_player_by_os_weekly",
             ))
         ) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`os` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('os as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`app` !=' => '',
-                    '`os` !=' => '',
-                    '`is_bot`' => 0,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'app !=' => '',
+                    'os !=' => '',
+                    'is_bot' => 0,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_player_by_os_weekly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -140,25 +140,25 @@ class AnalyticsPodcastByPlayerModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcasts_by_player_by_device_weekly"
+                "{$podcastId}_analytics_podcasts_by_player_by_device_weekly",
             ))
         ) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`device` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('device as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`device` !=' => '',
-                    '`is_bot`' => 0,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'device !=' => '',
+                    'is_bot' => 0,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_player_by_device_weekly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -177,21 +177,21 @@ class AnalyticsPodcastByPlayerModel extends Model
             !($found = cache("{$podcastId}_analytics_podcasts_by_player_bots"))
         ) {
             $oneYearAgo = date('Y-m-d', strtotime('-1 year'));
-            $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`is_bot`' => 1,
-                    '`date` >' => $oneYearAgo,
+                    'podcast_id' => $podcastId,
+                    'is_bot' => 1,
+                    'date >' => $oneYearAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`labels`', 'ASC')
+                ->groupBy('labels')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_player_bots",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsPodcastByRegionModel.php b/app/Models/AnalyticsPodcastByRegionModel.php
index 511a0769b1..be9a81c076 100644
--- a/app/Models/AnalyticsPodcastByRegionModel.php
+++ b/app/Models/AnalyticsPodcastByRegionModel.php
@@ -35,25 +35,25 @@ class AnalyticsPodcastByRegionModel extends Model
         $locale = service('request')->getLocale();
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_by_region_{$locale}"
+                "{$podcastId}_analytics_podcast_by_region_{$locale}",
             ))
         ) {
-            $found = $this->select('`country_code`, `region_code`')
-                ->selectSum('`hits`', '`value`')
-                ->selectAvg('`latitude`')
-                ->selectAvg('`longitude`')
-                ->groupBy('`country_code`, `region_code`')
+            $found = $this->select('country_code, region_code')
+                ->selectSum('hits', 'value')
+                ->selectAvg('latitude')
+                ->selectAvg('longitude')
+                ->groupBy('country_code, region_code')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => date('Y-m-d', strtotime('-1 week')),
+                    'podcast_id' => $podcastId,
+                    'date >' => date('Y-m-d', strtotime('-1 week')),
                 ])
-                ->orderBy('`value`', 'DESC')
+                ->orderBy('value', 'DESC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_by_region_{$locale}",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsPodcastByServiceModel.php b/app/Models/AnalyticsPodcastByServiceModel.php
index d65531a053..9170f8618f 100644
--- a/app/Models/AnalyticsPodcastByServiceModel.php
+++ b/app/Models/AnalyticsPodcastByServiceModel.php
@@ -34,25 +34,25 @@ class AnalyticsPodcastByServiceModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcasts_by_service_weekly"
+                "{$podcastId}_analytics_podcasts_by_service_weekly",
             ))
         ) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`service` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('service as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`service` !=' => '',
-                    '`is_bot`' => 0,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'service !=' => '',
+                    'is_bot' => 0,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_service_weekly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsPodcastModel.php b/app/Models/AnalyticsPodcastModel.php
index 1d44a55150..b8e84fb114 100644
--- a/app/Models/AnalyticsPodcastModel.php
+++ b/app/Models/AnalyticsPodcastModel.php
@@ -33,12 +33,12 @@ class AnalyticsPodcastModel extends Model
     public function getDataByDay(int $podcastId): array
     {
         if (!($found = cache("{$podcastId}_analytics_podcast_by_day"))) {
-            $found = $this->select('`date` as `labels`, `hits` as `values`')
+            $found = $this->select('date as labels, hits as values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => date('Y-m-d', strtotime('-60 days')),
+                    'podcast_id' => $podcastId,
+                    'date >' => date('Y-m-d', strtotime('-60 days')),
                 ])
-                ->orderBy('`labels`', 'ASC')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save("{$podcastId}_analytics_podcast_by_day", $found, 600);
@@ -57,21 +57,21 @@ class AnalyticsPodcastModel extends Model
     {
         if (!($found = cache("{$podcastId}_analytics_podcasts_by_weekday"))) {
             $found = $this->select(
-                'LEFT(DAYNAME(`date`),3) as `labels`, WEEKDAY(`date`) as `sort_labels`'
+                'LEFT(DAYNAME(date),3) as labels, WEEKDAY(date) as sort_labels',
             )
-                ->selectSum('`hits`', '`values`')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => date('Y-m-d', strtotime('-60 days')),
+                    'podcast_id' => $podcastId,
+                    'date >' => date('Y-m-d', strtotime('-60 days')),
                 ])
-                ->groupBy('`labels`, `sort_labels`')
-                ->orderBy('`sort_labels`', 'ASC')
+                ->groupBy('labels, sort_labels')
+                ->orderBy('sort_labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcasts_by_weekday",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -88,19 +88,19 @@ class AnalyticsPodcastModel extends Model
     {
         if (!($found = cache("{$podcastId}_analytics_podcast_by_bandwidth"))) {
             $found = $this->select(
-                '`date` as `labels`, round(`bandwidth` / 1048576, 1) as `values`'
+                'date as labels, round(bandwidth / 1048576, 1) as `values`',
             )
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => date('Y-m-d', strtotime('-60 days')),
+                    'podcast_id' => $podcastId,
+                    'date >' => date('Y-m-d', strtotime('-60 days')),
                 ])
-                ->orderBy('`labels`', 'ASC')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_by_bandwidth",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -116,19 +116,19 @@ class AnalyticsPodcastModel extends Model
     public function getDataByMonth(int $podcastId): array
     {
         if (!($found = cache("{$podcastId}_analytics_podcast_by_month"))) {
-            $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
+                    'podcast_id' => $podcastId,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`labels`', 'ASC')
+                ->groupBy('labels')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_by_month",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -145,23 +145,21 @@ class AnalyticsPodcastModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_unique_listeners_by_day"
+                "{$podcastId}_analytics_podcast_unique_listeners_by_day",
             ))
         ) {
-            $found = $this->select(
-                '`date` as `labels`, `unique_listeners` as `values`'
-            )
+            $found = $this->select('date as labels, unique_listeners as values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => date('Y-m-d', strtotime('-60 days')),
+                    'podcast_id' => $podcastId,
+                    'date >' => date('Y-m-d', strtotime('-60 days')),
                 ])
-                ->orderBy('`labels`', 'ASC')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_unique_listeners_by_day",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -178,22 +176,22 @@ class AnalyticsPodcastModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_unique_listeners_by_month"
+                "{$podcastId}_analytics_podcast_unique_listeners_by_month",
             ))
         ) {
-            $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`')
-                ->selectSum('`unique_listeners`', '`values`')
+            $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels')
+                ->selectSum('unique_listeners', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
+                    'podcast_id' => $podcastId,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`labels`', 'ASC')
+                ->groupBy('labels')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_unique_listeners_by_month",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -210,7 +208,7 @@ class AnalyticsPodcastModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_listening_time_by_day"
+                "{$podcastId}_analytics_podcast_listening_time_by_day",
             ))
         ) {
             $found = $this->select('date as labels')
@@ -226,7 +224,7 @@ class AnalyticsPodcastModel extends Model
             cache()->save(
                 "{$podcastId}_analytics_podcast_listening_time_by_day",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -243,22 +241,22 @@ class AnalyticsPodcastModel extends Model
     {
         if (
             !($found = cache(
-                "{$podcastId}_analytics_podcast_listening_time_by_month"
+                "{$podcastId}_analytics_podcast_listening_time_by_month",
             ))
         ) {
-            $found = $this->select('DATE_FORMAT(`date`,"%Y-%m-01") as `labels`')
+            $found = $this->select('DATE_FORMAT(date,"%Y-%m-01") as labels')
                 ->selectSum('duration', 'values')
                 ->where([
                     $this->table . '.podcast_id' => $podcastId,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`labels`', 'ASC')
+                ->groupBy('labels')
+                ->orderBy('labels', 'ASC')
                 ->findAll();
 
             cache()->save(
                 "{$podcastId}_analytics_podcast_listening_time_by_month",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsWebsiteByBrowserModel.php b/app/Models/AnalyticsWebsiteByBrowserModel.php
index d2da9b3ac8..b7b7c13263 100644
--- a/app/Models/AnalyticsWebsiteByBrowserModel.php
+++ b/app/Models/AnalyticsWebsiteByBrowserModel.php
@@ -34,19 +34,20 @@ class AnalyticsWebsiteByBrowserModel extends Model
     {
         if (!($found = cache("{$podcastId}_analytics_website_by_browser"))) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`browser` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('browser as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
+
             cache()->save(
                 "{$podcastId}_analytics_website_by_browser",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsWebsiteByEntryPageModel.php b/app/Models/AnalyticsWebsiteByEntryPageModel.php
index ad19f6a698..220719d409 100644
--- a/app/Models/AnalyticsWebsiteByEntryPageModel.php
+++ b/app/Models/AnalyticsWebsiteByEntryPageModel.php
@@ -35,20 +35,20 @@ class AnalyticsWebsiteByEntryPageModel extends Model
         if (!($found = cache("{$podcastId}_analytics_website_by_entry_page"))) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
             $found = $this->select(
-                'IF(`entry_page_url`=\'/\',\'/\',SUBSTRING_INDEX(`entry_page_url`,\'/\',-1)) as `labels`'
+                'IF(entry_page_url=\'/\',\'/\',SUBSTRING_INDEX(entry_page_url,\'/\',-1)) as labels',
             )
-                ->selectSum('`hits`', '`values`')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_website_by_entry_page",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/AnalyticsWebsiteByRefererModel.php b/app/Models/AnalyticsWebsiteByRefererModel.php
index 570f2ec8e5..aed2f46bc6 100644
--- a/app/Models/AnalyticsWebsiteByRefererModel.php
+++ b/app/Models/AnalyticsWebsiteByRefererModel.php
@@ -34,19 +34,19 @@ class AnalyticsWebsiteByRefererModel extends Model
     {
         if (!($found = cache("{$podcastId}_analytics_website_by_referer"))) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
-            $found = $this->select('`referer_url` as `labels`')
-                ->selectSum('`hits`', '`values`')
+            $found = $this->select('referer_url as labels')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_website_by_referer",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -66,20 +66,20 @@ class AnalyticsWebsiteByRefererModel extends Model
         ) {
             $oneWeekAgo = date('Y-m-d', strtotime('-1 week'));
             $found = $this->select(
-                'SUBSTRING_INDEX(`domain`, \'.\', -2) as `labels`'
+                'SUBSTRING_INDEX(domain, \'.\', -2) as labels',
             )
-                ->selectSum('`hits`', '`values`')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneWeekAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneWeekAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_website_by_domain_weekly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
@@ -99,20 +99,20 @@ class AnalyticsWebsiteByRefererModel extends Model
         ) {
             $oneYearAgo = date('Y-m-d', strtotime('-1 year'));
             $found = $this->select(
-                'SUBSTRING_INDEX(`domain`, \'.\', -2) as `labels`'
+                'SUBSTRING_INDEX(domain, \'.\', -2) as labels',
             )
-                ->selectSum('`hits`', '`values`')
+                ->selectSum('hits', 'values')
                 ->where([
-                    '`podcast_id`' => $podcastId,
-                    '`date` >' => $oneYearAgo,
+                    'podcast_id' => $podcastId,
+                    'date >' => $oneYearAgo,
                 ])
-                ->groupBy('`labels`')
-                ->orderBy('`values`', 'DESC')
+                ->groupBy('labels')
+                ->orderBy('values', 'DESC')
                 ->findAll();
             cache()->save(
                 "{$podcastId}_analytics_website_by_domain_yearly",
                 $found,
-                600
+                600,
             );
         }
         return $found;
diff --git a/app/Models/EpisodeModel.php b/app/Models/EpisodeModel.php
index 6a071434d4..429ac67630 100644
--- a/app/Models/EpisodeModel.php
+++ b/app/Models/EpisodeModel.php
@@ -16,6 +16,7 @@ class EpisodeModel extends Model
     protected $primaryKey = 'id';
 
     protected $allowedFields = [
+        'id',
         'podcast_id',
         'guid',
         'title',
@@ -28,6 +29,7 @@ class EpisodeModel extends Model
         'description_markdown',
         'description_html',
         'image_uri',
+        'image_mimetype',
         'transcript_uri',
         'chapters_uri',
         'parental_advisory',
@@ -39,6 +41,9 @@ class EpisodeModel extends Model
         'location_geo',
         'location_osmid',
         'custom_rss',
+        'favourites_total',
+        'reblogs_total',
+        'notes_total',
         'published_at',
         'created_by',
         'updated_by',
@@ -70,6 +75,7 @@ class EpisodeModel extends Model
     protected $afterUpdate = ['writeEnclosureMetadata'];
     protected $beforeDelete = ['clearCache'];
 
+    // TODO: remove
     public static $themes = [
         'light-transparent' => [
             'style' =>
@@ -99,87 +105,77 @@ class EpisodeModel extends Model
         ],
     ];
 
+    /**
+     *
+     * @param int|string $podcastId Podcast Id or name
+     * @param mixed $episodeSlug
+     * @return mixed
+     */
     public function getEpisodeBySlug($podcastId, $episodeSlug)
     {
-        if (!($found = cache("podcast{$podcastId}_episode@{$episodeSlug}"))) {
-            $found = $this->where([
-                'podcast_id' => $podcastId,
-                'slug' => $episodeSlug,
-            ])
-                ->where('`published_at` <= NOW()', null, false)
-                ->first();
+        if (!($found = cache("podcast@{$podcastId}_episode@{$episodeSlug}"))) {
+            $builder = $this->select('episodes.*')
+                ->where('slug', $episodeSlug)
+                ->where('`published_at` <= NOW()', null, false);
+
+            if (is_numeric($podcastId)) {
+                // passed argument is the podcast id
+                $builder->where('podcast_id', $podcastId);
+            } else {
+                // passed argument is the podcast name, must perform join
+                $builder
+                    ->join('podcasts', 'podcasts.id = episodes.podcast_id')
+                    ->where('podcasts.name', $podcastId);
+            }
+
+            $found = $builder->first();
 
             cache()->save(
                 "podcast{$podcastId}_episode@{$episodeSlug}",
                 $found,
-                DECADE
+                DECADE,
             );
         }
 
         return $found;
     }
 
-    public function getEpisodeById($podcastId, $episodeId)
+    public function getEpisodeById($episodeId)
     {
-        if (!($found = cache("podcast{$podcastId}_episode{$episodeId}"))) {
-            $found = $this->where([
-                'podcast_id' => $podcastId,
+        if (!($found = cache("podcast_episode{$episodeId}"))) {
+            $builder = $this->where([
                 'id' => $episodeId,
-            ])
-                ->where('published_at <=', 'NOW()')
-                ->first();
+            ]);
 
-            cache()->save(
-                "podcast{$podcastId}_episode{$episodeId}",
-                $found,
-                DECADE
-            );
+            $found = $builder->first();
+
+            cache()->save("podcast_episode{$episodeId}", $found, DECADE);
         }
 
         return $found;
     }
 
-    /**
-     * Returns the previous episode based on episode ordering
-     */
-    public function getPreviousNextEpisodes($episode, $podcastType)
+    public function getPublishedEpisodeById($episodeId, $podcastId = null)
     {
-        $sortNumberField =
-            $podcastType == 'serial'
-                ? 'if(isnull(season_number),0,season_number)*1000+number'
-                : 'if(isnull(season_number),0,season_number)*100000000000000+published_at';
-        $sortNumberValue =
-            $podcastType == 'serial'
-                ? (empty($episode->season_number)
-                        ? 0
-                        : $episode->season_number) *
-                        1000 +
-                    $episode->number
-                : (empty($episode->season_number)
-                        ? ''
-                        : $episode->season_number) .
-                    date('YmdHis', strtotime($episode->published_at));
-
-        $previousData = $this->orderBy('(' . $sortNumberField . ') DESC')
-            ->where([
-                'podcast_id' => $episode->podcast_id,
-                $sortNumberField . ' <' => $sortNumberValue,
-            ])
-            ->where('`published_at` <= NOW()', null, false)
-            ->first();
+        if (!($found = cache("podcast{$podcastId}_episode{$episodeId}"))) {
+            $builder = $this->where([
+                'id' => $episodeId,
+            ])->where('`published_at` <= NOW()', null, false);
 
-        $nextData = $this->orderBy('(' . $sortNumberField . ') ASC')
-            ->where([
-                'podcast_id' => $episode->podcast_id,
-                $sortNumberField . ' >' => $sortNumberValue,
-            ])
-            ->where('`published_at` <= NOW()', null, false)
-            ->first();
+            if ($podcastId) {
+                $builder->where('podcast_id', $podcastId);
+            }
+
+            $found = $builder->first();
 
-        return [
-            'previous' => $previousData,
-            'next' => $nextData,
-        ];
+            cache()->save(
+                "podcast{$podcastId}_episode{$episodeId}",
+                $found,
+                DECADE,
+            );
+        }
+
+        return $found;
     }
 
     /**
@@ -203,7 +199,7 @@ class EpisodeModel extends Model
                 $year,
                 $season ? 'season' . $season : null,
                 'episodes',
-            ])
+            ]),
         );
 
         if (!($found = cache($cacheName))) {
@@ -232,7 +228,7 @@ class EpisodeModel extends Model
             }
 
             $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode(
-                $podcastId
+                $podcastId,
             );
 
             cache()->save(
@@ -240,7 +236,7 @@ class EpisodeModel extends Model
                 $found,
                 $secondsToNextUnpublishedEpisode
                     ? $secondsToNextUnpublishedEpisode
-                    : DECADE
+                    : DECADE,
             );
         }
 
@@ -251,7 +247,7 @@ class EpisodeModel extends Model
     {
         if (!($found = cache("podcast{$podcastId}_years"))) {
             $found = $this->select(
-                'YEAR(published_at) as year, count(*) as number_of_episodes'
+                'YEAR(published_at) as year, count(*) as number_of_episodes',
             )
                 ->where([
                     'podcast_id' => $podcastId,
@@ -265,7 +261,7 @@ class EpisodeModel extends Model
                 ->getResultArray();
 
             $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode(
-                $podcastId
+                $podcastId,
             );
 
             cache()->save(
@@ -273,7 +269,7 @@ class EpisodeModel extends Model
                 $found,
                 $secondsToNextUnpublishedEpisode
                     ? $secondsToNextUnpublishedEpisode
-                    : DECADE
+                    : DECADE,
             );
         }
 
@@ -284,7 +280,7 @@ class EpisodeModel extends Model
     {
         if (!($found = cache("podcast{$podcastId}_seasons"))) {
             $found = $this->select(
-                'season_number, count(*) as number_of_episodes'
+                'season_number, count(*) as number_of_episodes',
             )
                 ->where([
                     'podcast_id' => $podcastId,
@@ -298,7 +294,7 @@ class EpisodeModel extends Model
                 ->getResultArray();
 
             $secondsToNextUnpublishedEpisode = $this->getSecondsToNextUnpublishedEpisode(
-                $podcastId
+                $podcastId,
             );
 
             cache()->save(
@@ -306,7 +302,7 @@ class EpisodeModel extends Model
                 $found,
                 $secondsToNextUnpublishedEpisode
                     ? $secondsToNextUnpublishedEpisode
-                    : DECADE
+                    : DECADE,
             );
         }
 
@@ -341,7 +337,7 @@ class EpisodeModel extends Model
             cache()->save(
                 "podcast{$podcastId}_defaultQuery",
                 $defaultQuery,
-                DECADE
+                DECADE,
             );
         }
         return $defaultQuery;
@@ -358,7 +354,7 @@ class EpisodeModel extends Model
     public function getSecondsToNextUnpublishedEpisode(int $podcastId)
     {
         $result = $this->select(
-            'TIMESTAMPDIFF(SECOND, NOW(), `published_at`) as timestamp_diff'
+            'TIMESTAMPDIFF(SECOND, NOW(), `published_at`) as timestamp_diff',
         )
             ->where([
                 'podcast_id' => $podcastId,
@@ -376,7 +372,7 @@ class EpisodeModel extends Model
         helper('id3');
 
         $episode = (new EpisodeModel())->find(
-            is_array($data['id']) ? $data['id'][0] : $data['id']
+            is_array($data['id']) ? $data['id'][0] : $data['id'],
         );
 
         write_enclosure_tags($episode);
@@ -386,16 +382,15 @@ class EpisodeModel extends Model
 
     public function clearCache(array $data)
     {
-        $episodeModel = new EpisodeModel();
         $episode = (new EpisodeModel())->find(
-            is_array($data['id']) ? $data['id'][0] : $data['id']
+            is_array($data['id']) ? $data['id'][0] : $data['id'],
         );
 
         // delete cache for rss feed
         cache()->delete("podcast{$episode->podcast_id}_feed");
         foreach (\Opawg\UserAgentsPhp\UserAgentsRSS::$db as $service) {
             cache()->delete(
-                "podcast{$episode->podcast_id}_feed_{$service['slug']}"
+                "podcast{$episode->podcast_id}_feed_{$service['slug']}",
             );
         }
 
@@ -403,40 +398,43 @@ class EpisodeModel extends Model
         cache()->delete("podcast{$episode->podcast_id}_episodes");
 
         cache()->delete(
-            "podcast{$episode->podcast_id}_episode@{$episode->slug}"
+            "podcast{$episode->podcast_id}_episode@{$episode->slug}",
         );
 
+        cache()->delete("podcast_episode{$episode->id}");
+
         // delete episode lists cache per year / season for a podcast
         // and localized pages
+        $episodeModel = new EpisodeModel();
         $years = $episodeModel->getYears($episode->podcast_id);
         $seasons = $episodeModel->getSeasons($episode->podcast_id);
         $supportedLocales = config('App')->supportedLocales;
 
         foreach ($supportedLocales as $locale) {
             cache()->delete(
-                "page_podcast{$episode->podcast->id}_episode{$episode->id}_{$locale}"
+                "page_podcast{$episode->podcast->id}_episode{$episode->id}_{$locale}",
             );
             cache()->delete("credits_{$locale}");
         }
 
         foreach ($years as $year) {
             cache()->delete(
-                "podcast{$episode->podcast_id}_{$year['year']}_episodes"
+                "podcast{$episode->podcast_id}_{$year['year']}_episodes",
             );
             foreach ($supportedLocales as $locale) {
                 cache()->delete(
-                    "page_podcast{$episode->podcast_id}_{$year['year']}_{$locale}"
+                    "page_podcast{$episode->podcast_id}_{$year['year']}_{$locale}",
                 );
             }
         }
 
         foreach ($seasons as $season) {
             cache()->delete(
-                "podcast{$episode->podcast_id}_season{$season['season_number']}_episodes"
+                "podcast{$episode->podcast_id}_season{$season['season_number']}_episodes",
             );
             foreach ($supportedLocales as $locale) {
                 cache()->delete(
-                    "page_podcast{$episode->podcast_id}_season{$season['season_number']}_{$locale}"
+                    "page_podcast{$episode->podcast_id}_season{$season['season_number']}_{$locale}",
                 );
             }
         }
@@ -444,7 +442,7 @@ class EpisodeModel extends Model
         foreach (array_keys(self::$themes) as $themeKey) {
             foreach ($supportedLocales as $locale) {
                 cache()->delete(
-                    "page_podcast{$episode->podcast_id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}"
+                    "page_podcast{$episode->podcast_id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}",
                 );
             }
         }
diff --git a/app/Models/NoteModel.php b/app/Models/NoteModel.php
new file mode 100644
index 0000000000..5a95a16ecd
--- /dev/null
+++ b/app/Models/NoteModel.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @copyright  2020 Podlibre
+ * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
+ * @link       https://castopod.org/
+ */
+
+namespace App\Models;
+
+class NoteModel extends \ActivityPub\Models\NoteModel
+{
+    protected $returnType = \App\Entities\Note::class;
+
+    protected $allowedFields = [
+        'id',
+        'uri',
+        'actor_id',
+        'in_reply_to_id',
+        'reblog_of_id',
+        'episode_id',
+        'message',
+        'message_html',
+        'favourites_count',
+        'reblogs_count',
+        'replies_count',
+        'created_by',
+        'published_at',
+    ];
+
+    /**
+     * Retrieves all published notes for a given episode ordered by publication date
+     *
+     * @return \App\Entities\Note[]
+     */
+    public function getEpisodeNotes($episodeId)
+    {
+        return $this->where([
+            'episode_id' => $episodeId,
+        ])
+            ->where('`published_at` <= NOW()', null, false)
+            ->orderBy('published_at', 'DESC')
+            ->findAll();
+    }
+}
diff --git a/app/Models/PersonModel.php b/app/Models/PersonModel.php
index ac8661c8d1..e1812cf47e 100644
--- a/app/Models/PersonModel.php
+++ b/app/Models/PersonModel.php
@@ -21,6 +21,7 @@ class PersonModel extends Model
         'unique_name',
         'information_url',
         'image_uri',
+        'image_mimetype',
         'created_by',
         'updated_by',
     ];
@@ -86,7 +87,7 @@ class PersonModel extends Model
                     $result[$person->id] = $person->full_name;
                     return $result;
                 },
-                []
+                [],
             );
             cache()->save('person_options', $options, DECADE);
         }
@@ -116,7 +117,7 @@ class PersonModel extends Model
     protected function clearCache(array $data)
     {
         $person = (new PersonModel())->getPersonById(
-            is_array($data['id']) ? $data['id'][0] : $data['id']
+            is_array($data['id']) ? $data['id'][0] : $data['id'],
         );
 
         cache()->delete('person_options');
diff --git a/app/Models/PodcastModel.php b/app/Models/PodcastModel.php
index ffdcbfe7c6..dfd4044de8 100644
--- a/app/Models/PodcastModel.php
+++ b/app/Models/PodcastModel.php
@@ -8,7 +8,10 @@
 
 namespace App\Models;
 
+use ActivityPub\Models\ActorModel;
+use CodeIgniter\HTTP\URI;
 use CodeIgniter\Model;
+use phpseclib\Crypt\RSA;
 
 class PodcastModel extends Model
 {
@@ -24,6 +27,7 @@ class PodcastModel extends Model
         'episode_description_footer_markdown',
         'episode_description_footer_html',
         'image_uri',
+        'image_mimetype',
         'language_code',
         'category_id',
         'parental_advisory',
@@ -69,6 +73,10 @@ class PodcastModel extends Model
     ];
     protected $validationMessages = [];
 
+    protected $beforeInsert = ['createPodcastActor'];
+    protected $afterInsert = ['setAvatarImageUrl'];
+    protected $afterUpdate = ['updatePodcastActor'];
+
     // clear cache before update if by any chance, the podcast name changes, so will the podcast link
     protected $beforeUpdate = ['clearCache'];
     protected $beforeDelete = ['clearCache'];
@@ -107,7 +115,7 @@ class PodcastModel extends Model
             $found = $this->select('podcasts.*')
                 ->join(
                     'podcasts_users',
-                    'podcasts_users.podcast_id = podcasts.id'
+                    'podcasts_users.podcast_id = podcasts.id',
                 )
                 ->where('podcasts_users.user_id', $userId)
                 ->findAll();
@@ -159,15 +167,29 @@ class PodcastModel extends Model
 
     public function getContributorGroupId($userId, $podcastId)
     {
-        $user_podcast = $this->db
-            ->table('podcasts_users')
-            ->select('group_id')
-            ->where([
-                'user_id' => $userId,
-                'podcast_id' => $podcastId,
-            ])
-            ->get()
-            ->getResultObject();
+        if (!is_numeric($podcastId)) {
+            // identifier is the podcast name, request must be a join
+            $user_podcast = $this->db
+                ->table('podcasts_users')
+                ->select('group_id', 'user_id')
+                ->join('podcasts', 'podcasts.id = podcasts_users.podcast_id')
+                ->where([
+                    'user_id' => $userId,
+                    'name' => $podcastId,
+                ])
+                ->get()
+                ->getResultObject();
+        } else {
+            $user_podcast = $this->db
+                ->table('podcasts_users')
+                ->select('group_id')
+                ->where([
+                    'user_id' => $userId,
+                    'podcast_id' => $podcastId,
+                ])
+                ->get()
+                ->getResultObject();
+        }
 
         return (int) count($user_podcast) > 0
             ? $user_podcast[0]->group_id
@@ -177,7 +199,7 @@ class PodcastModel extends Model
     public function clearCache(array $data)
     {
         $podcast = (new PodcastModel())->getPodcastById(
-            is_array($data['id']) ? $data['id'][0] : $data['id']
+            is_array($data['id']) ? $data['id'][0] : $data['id'],
         );
         $supportedLocales = config('App')->supportedLocales;
 
@@ -195,14 +217,14 @@ class PodcastModel extends Model
         foreach ($podcast->episodes as $episode) {
             foreach ($supportedLocales as $locale) {
                 cache()->delete(
-                    "page_podcast{$podcast->id}_episode{$episode->id}_{$locale}"
+                    "page_podcast{$podcast->id}_episode{$episode->id}_{$locale}",
                 );
                 foreach (
                     array_keys(\App\Models\EpisodeModel::$themes)
                     as $themeKey
                 ) {
                     cache()->delete(
-                        "page_podcast{$podcast->id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}"
+                        "page_podcast{$podcast->id}_episode{$episode->id}_embeddable_player_{$themeKey}_{$locale}",
                     );
                 }
             }
@@ -222,17 +244,17 @@ class PodcastModel extends Model
             cache()->delete("podcast{$podcast->id}_{$year['year']}_episodes");
             foreach ($supportedLocales as $locale) {
                 cache()->delete(
-                    "page_podcast{$podcast->id}_{$year['year']}_{$locale}"
+                    "page_podcast{$podcast->id}_{$year['year']}_{$locale}",
                 );
             }
         }
         foreach ($seasons as $season) {
             cache()->delete(
-                "podcast{$podcast->id}_season{$season['season_number']}_episodes"
+                "podcast{$podcast->id}_season{$season['season_number']}_episodes",
             );
             foreach ($supportedLocales as $locale) {
                 cache()->delete(
-                    "page_podcast{$podcast->id}_season{$season['season_number']}_{$locale}"
+                    "page_podcast{$podcast->id}_season{$season['season_number']}_{$locale}",
                 );
             }
         }
@@ -244,4 +266,85 @@ class PodcastModel extends Model
 
         return $data;
     }
+
+    /**
+     * Creates an actor linked to the podcast
+     * (Triggered before insert)
+     *
+     * @param array $data
+     */
+    protected function createPodcastActor(array $data)
+    {
+        $rsa = new RSA();
+        $rsa->setHash('sha256');
+
+        // extracts $privatekey and $publickey variables
+        extract($rsa->createKey(2048));
+
+        $url = new URI(base_url());
+        $username = $data['data']['name'];
+        $domain =
+            $url->getHost() . ($url->getPort() ? ':' . $url->getPort() : '');
+
+        $actorId = (new ActorModel())->insert(
+            [
+                'uri' => url_to('actor', $username),
+                'username' => $username,
+                'domain' => $domain,
+                'private_key' => $privatekey,
+                'public_key' => $publickey,
+                'display_name' => $data['data']['title'],
+                'summary' => $data['data']['description_html'],
+                'avatar_image_url' => '',
+                'avatar_image_mimetype' => '',
+                'cover_image_url' => base_url(
+                    'assets/images/castopod-cover-default.jpg',
+                ),
+                'cover_image_mimetype' => 'image/jpeg',
+                'inbox_url' => url_to('inbox', $username),
+                'outbox_url' => url_to('outbox', $username),
+                'followers_url' => url_to('followers', $username),
+            ],
+            true,
+        );
+
+        $data['data']['actor_id'] = $actorId;
+
+        return $data;
+    }
+
+    protected function setAvatarImageUrl($data)
+    {
+        $podcast = (new PodcastModel())->getPodcastById(
+            is_array($data['id']) ? $data['id'][0] : $data['id'],
+        );
+
+        $podcast->actor->avatar_image_url = $podcast->image->thumbnail_url;
+        $podcast->actor->avatar_image_mimetype = $podcast->image_mimetype;
+
+        (new ActorModel())->update($podcast->actor->id, $podcast->actor);
+
+        return $data;
+    }
+
+    protected function updatePodcastActor(array $data)
+    {
+        $podcast = (new PodcastModel())->getPodcastById(
+            is_array($data['id']) ? $data['id'][0] : $data['id'],
+        );
+
+        $actorModel = new ActorModel();
+        $actor = $actorModel->find($podcast->actor_id);
+
+        // update values
+        $actor->display_name = $podcast->title;
+        $actor->summary = $podcast->description_html;
+        $actor->avatar_image_url = $podcast->image->thumbnail_url;
+
+        if ($actor->hasChanged()) {
+            $actorModel->update($actor->id, $actor);
+        }
+
+        return $data;
+    }
 }
diff --git a/app/Models/UserModel.php b/app/Models/UserModel.php
index af71d7a15a..4a03446129 100644
--- a/app/Models/UserModel.php
+++ b/app/Models/UserModel.php
@@ -19,7 +19,7 @@ class UserModel extends \Myth\Auth\Models\UserModel
                 ->join('podcasts_users', 'podcasts_users.user_id = users.id')
                 ->join(
                     'auth_groups',
-                    'auth_groups.id = podcasts_users.group_id'
+                    'auth_groups.id = podcasts_users.group_id',
                 )
                 ->where('podcasts_users.podcast_id', $podcastId)
                 ->findAll();
@@ -33,7 +33,7 @@ class UserModel extends \Myth\Auth\Models\UserModel
     public function getPodcastContributor($user_id, $podcast_id)
     {
         return $this->select(
-            'users.*, podcasts_users.podcast_id as podcast_id, auth_groups.name as podcast_role'
+            'users.*, podcasts_users.podcast_id as podcast_id, auth_groups.name as podcast_role',
         )
             ->join('podcasts_users', 'podcasts_users.user_id = users.id')
             ->join('auth_groups', 'auth_groups.id = podcasts_users.group_id')
diff --git a/app/Views/_assets/admin.ts b/app/Views/_assets/admin.ts
index 8cb179e001..be73152409 100644
--- a/app/Views/_assets/admin.ts
+++ b/app/Views/_assets/admin.ts
@@ -1,6 +1,5 @@
 import ClientTimezone from "./modules/ClientTimezone";
 import Clipboard from "./modules/Clipboard";
-import ThemePicker from "./modules/ThemePicker";
 import DateTimePicker from "./modules/DateTimePicker";
 import Dropdown from "./modules/Dropdown";
 import MarkdownEditor from "./modules/MarkdownEditor";
@@ -8,6 +7,7 @@ import MultiSelect from "./modules/MultiSelect";
 import SidebarToggler from "./modules/SidebarToggler";
 import Slugify from "./modules/Slugify";
 import Soundbites from "./modules/Soundbites";
+import ThemePicker from "./modules/ThemePicker";
 import Time from "./modules/Time";
 import Tooltip from "./modules/Tooltip";
 
diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff
new file mode 100644
index 0000000000000000000000000000000000000000..468422fe537a00b04a15e4d033e667568dcbe350
GIT binary patch
literal 21208
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

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff2 b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-700.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..4312f3d1a34dd865724c73068da4d57ae44d99d2
GIT binary patch
literal 17060
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
ZzfkqLd&>3l<^|M;?t3af^Cyc>6aWNk%%T7Q

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..e3c9edce6977c9ae42fe1b33007f25f5e1b57668
GIT binary patch
literal 21772
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

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff2 b/app/Views/_assets/fonts/kumbh-sans/kumbh-sans-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..69b6584a65724b22d6c9f6792ae62a92b0e5c539
GIT binary patch
literal 17624
zcmXT-cQayOWME)maJj)C0HS9FFfh23LBv3OR4moVA$`z?ErFp`hNF>%a}JLn2Up`Z
zm&OHb+|3>gjAl$K%<ViZ3al*}>@Bf8jkeOJJ>oaEi6qr+Xa1e(*ZJFL$%aCM8-~?8
zg!6dz-ewdvT`QRO|Ns2SAt`5;TwapRt{`WbQn-xS_h93So>y9H=1tj?`2I=nC5v;O
zelm%B-ygsDly86amHMtz3%>>2QRhluQM}tdpVwUPuJ8UQiyk%0u6McA=bCq}vE7%?
zXAzIdzl7tD<XL8_2z9G^mA$$Cb%mSE&#Uu)T>Ncjma5dg{^f<PPxlY1uuA*;#jFsO
zXp4w&|5#GA_@b><yLe;oX^BYnlcx`V{{8#Ed~xFY&mLR8A7oo_a-xTRt(H=X(O<T^
zyW0|G%L-XNn={)m_e`!?M{k#qnAfTZjjpByCM_$&fSeqIF4k9vBBm7I)VsC*=>F*c
zyK8fP|9|-U%WU&53r6*8OA0ovxTI;nY0Y_V#qCw0j-C&1C$6mz%}p!&Ue7Sa^{I!|
z>m%JOC$XF?JG#89O_--#JliVv=966(n{%AY?559odbU7&Wo8vm%xSeP2W~1a`ZDve
zm*3a9iiuo#C)gJ3<GcOFe#TUu#szPkgqo(T%bNG&<Lie-cfOuB)YTL!GIw3j_`qJW
zdCn`>9p{8jYaU!Rp`cNm;je#C{EbD@jr$yGWR7$4*dITBxNuL6O#gvTA3kM?Y_itr
zKfajb%h@R_=ZI7&U7D-K{^j&HRwnC$>fJqe)pQ#E|M|{taVhfLsY!`$KLm8Nn^+IZ
z-u}Z9<*R(Z^a?A-sv1!S1C>7y>|X`REt?Wr@#=la118p(Nh?#Idj$oavNS(qe&*IP
z_11+6*>A7#&1w0P#neCJ^7YAzMVHiA8*=Zl+dZ;u`@epx|Lo1Oi}<vpBo!WB=;XM$
ze|h${cl+MXYIx;p%l)RwdxA!ZnUP+h(V=Led(YqdhA-V8efR=T`jMix;<QyWiq+=N
zE%r-~dA9iWsr~o<|GnLOg|{c;phA?vjk^;inWgglvRJfPvfD}zNIoyyd%?mjd+qKM
zKi)LuZ00`X?fkgeWbYd##uX*XyEm7MPYP=+5W2*o!PYu)etVX2)@t^1N4Tf)wIvG(
z3Lbube~FP#)p`57xz>N%6j?YGE0i2vnrgp&H=f;^Y`(luhvnS)eR_v~-d}E3oi$lY
zj!89l<{jB>smHTk-|-gVj>=fTdD5q(?ELmvEr!Lp`_CT{;bLQAWIWWM$f5k&F=q)&
z#AT*8Ga2;OG_2jjAYaGeCeR?t_M@B0!eYUvCyfFE4MJKBs;aD^>tsTDr2+&Fc&zJs
zA#3NA$hdg*x#?nz$_5SBI0U||+Y=GP((`Y>_<=7e5B^1Q*mhXXKdDfc`lKb_;Sj?C
zhV935=5%@sPdc&tW4-?l(fG>=hh0sKHmXlK9k;jq&*LSs`xAboJKC8x9?N^e|MUH)
z0^OHu)V3Vh)B85bI&8V*3_iP_3Y#FCP03HTa-P`Qy!e>=+5RdEDG5CpU&*;9R@o&#
zC9cd+PX2Rz!;gvFk4;y<*?4K=++^|N_hie{YP|m}i<jbWDgOANe-&$TPxQPsjd3*`
z`Z5(V-<s<W>k3bh_M7M_Ub*Ry!|8=_&))AY<+c5A^~HAuS$U45IgdWtR6f+MR=@CS
zn$lHI-=n{_AAj`lQju2R+}P;(|Nm458b#i@5%%fk^!4?>bC3GlhyMHLt~7Pg?&?*)
z)w9ym@6Wkkk^Oy*?cXnQaotYZ`(!icvaC?m+4f9JbWPYw_qA(!V<$^DZSdW?WS+vA
zS_|%)$aN{_&uyG*7A`vd^v4y#g{LA*&*t$so5;>~dbs(GuwuU9)RP$^51l8unX>Ep
zUOul}6a3`T%7_J~>JKIDgjSj_@7>&<6K^whddL!Q2B}FVlY-b^omqE%?SDV!g9^?(
z#*2Knu-<;N;k0h~ozDl9{ad{+s66@o?aA)v?MlnLcCOxdW!<7B_p^TeR%dGb%CqX}
z+T|+dpJXE|CaDIpi_P_&wdz+ebJ_&OHp!n=kv^M^CvP%-9X+EZ<(~UZ&81yYU)M!d
z+;a}I*p*(mtiYL7@mP!HZH;9&t1H)?Ppg&t74}Q^UqF8N{WYQ+Pf5Mb*>K#BU8X4H
z^19Tc63KTWMeZdYYE-XNaOjZWT;{g+T-kv*o3L35OAMB+*u0cExu>wfciW9?ej859
z{gx>>anY+SLVmNeU&L*THBxThFBD$T{9D#^!D(&yUExR#%T*W8%1qlB_^Kp-Z%>%|
zezQrsep$Et)V)vLjN{bame$zLyyoBvZB9lxmyLaE%}yEy9SxtdN-NZy@Bfnx%c^|x
zE3Nl*c1A>7MDKj|{{0>8BNusH61c)OocWjZOv{{ZVkEal#p&S$W9#eFXTOk3cb<A8
zwKHFVLpH&gp&_BRFe&~O*TS_$a|-;X@49OcEFZex@BldQr=DANEn#kNXsl<o_S<e|
zKFd{ot-^kmtIv7P;t`LzHP!wz+p6e-<F@=ZpRNS$OUSu@_uf4PCQY83KU|_DOTKh(
zYDqHD<CR$A?-jdwS8P?tjw^q5iXBn%mVP9Ecc&_^q~4AvUD<i7qHB+XjM!p&yn_FI
zW~otT?WL_1cYitr@BA9jQD&sv7X4CR;<V0Ezs1LEvx8UFUu%#|=}2_j^5^;W{2Nt)
zLDgE1uif)wKkU{ZuyLl$CH4Fm2`+6z?UhNkp1;>ge*Ab*@kMlDSd?A5>*}Q5QnMS$
z^O^bHo)A5G;Iu{l$KHi*meEleY8+-le^j<~hDk^YRWI3|Gc|JViZ@5DizNMC;2PtZ
zc;bZ3Z0Ex({yt{>ZDsbo%yOT>%G`+6*-P`(zezmiPkN@ko?~wLQr|Xiy|-D0hZ-6=
z%;cv!tBXHv@5+0&IfcKHOPDLfa4F9$mEI(I1(_K-e(De7U0y$3IK@afHGh7=h3Dm~
zH?3MTO;&Tqo*a>5=h%ebay@B0KR0TPp;;v35>|`(7I%-#)Jb>w@n^HgLeckCs;j+J
z7iy{U*9Dxm-M;Pm<3R0$;B*#P`nn7pm{*dN^pc|__S`=;U1{<aO{>lT9dXtqeOHN{
zC7Zrj>-42AE<L$$t|xcDf_~N#@6#uDUQ#>EIz7hp-ZiCprW52pJv+F^N9wy!^t03=
zO)gcfOowj2CtQcO1j>1vOqXYETF`n$ZpFX1sf&9I&#_GQF+9stY}IZeskh@!)z^Cp
zi^IORUMk{w{AT$lj`R@Ea~C%jo^Zc3F~K>>_ip*|q<`1$+_=y_RoPise91JQX_G~c
zwV&Pm%T}~cO>WES+BavfE!1aVU{Ki5`C3}>ik8>9OyB-ZH}8K{)o)K-Xr#F@wYZye
zpU<10Jg=hnOD2GFccpvswU_QcteAHH)O8e`;Ca$VX~~Mf*rR*IE+lPO@>KM>*K8i~
zn4+nI-Kxx~Y`zaJJPT7}-EcEsWNQ1#=hf#uvo`(wa^1pYQ_AmI%0iMn+);h+r9+?p
zi1S{wQl>>pG&O<sy3@b-IYHr>GNu9S=g$Q>`TKs8O319~-LO~Q%%mo7>;8Ve%Z$+y
z-~1xlPq$2d*S#P`P}{Uk?v#J^+RcZSF`i9b>K3~pfWh8fxaNq)i#pBi7jD&P*KKO|
z%vQ17SndBd=iRruB@_GPm(RPyuE)3XmDl~Ot-F;^ga;jITmR+AJT1lF9vs{FGWFkG
z3|nU{c{o>i#UxV)>uRnmZ8}ri<h3TA{qLcpXryMQGg<IoB8$|i>W>lXg=aY?#l-Zm
zxi<>F)c?HFNBOxz;)(YY4SCWPrwFY-r+o6)tj2hwxoYgmJPex`Sz9~WY9HPBq$};R
zTDaQk{3mmrZ%Ot~o%?=Mnwo)-pZkTa|JVLHeoy#H%_81^s}2{)1W44azW;A${)HWj
z-{idHIWMfNc(?r5><r;|o0I1&ZtGTjcp@TA*M6qb`W%k_y35gXv~Cn`3(UVOJGIX3
z&4(?F>uzRFOWx+2FBqoZwsS^`VpeHb$#&)IMc!srp40lT|I4pFVAOSMeQ<`F`N<Dc
zYj|%+nN2+9nZ3W0PwM^Sj|H*OXWViNHW$9RbU^)Ubi?bi{r#IJueYs#F7)?*set32
z#z#J4vkyP*=G^JD^4crU%|{=W?6kdSAlf@s^~Lj($DU2Qw(Y##|3|0u>;EfXy=!k^
zVPa!sWoBn+y??`wEqiut+qZG|_WFW~lA5BbvU%rXV&Y=&-??|!-p1~rNS9IJoZ~5n
zbi~@vvdQordYbj4W?jS?1&$Csb8Qiwr9#203)fy-aecLCP?p(iU9p{q50>q0$=iP5
zvErUMXNxn-H9SqU`i_RArmk{nT9SG5^YcY1LDz0*WakBL*`{g#JLdb*>9_Lti~jxB
zt}#_<_wI}T1Zzr|X3sS}tKaxE_2etIJ-biewN9EdfAgjA7hiineDe%-ddb<|*zDk7
zkaD15Ukl&H8waf17CaK2a`Ls{GN%72t_?G-8EV2<b<#F2WG-s7Ji*)-cj!r=-pmQX
zc@;go#Xo$gnJ4$KbbVXAz=PL`5$7N0CpFGJ5oy7l{?=#iM&r_D=kDYdg`K-3Y5h29
zEi=FAgReamGdP<)&dtgbJ7UAe*sdYHHo@TG-hIM+Rr+UK!w<xkR^|QO%a+iP5D<Ab
zVBUrsD<7XXZf}_2!ML)>RKaX^NaX!%Qzj^#IFpsJ@9pHqiJh%ix41ZD-I*80c3|Ew
z)~M*j%^N>k-L4ZznQ&w7e)IFi|L!pD4?pJYZ(dVZ8kqO3KlU3#T=9`b#p`xF-M74s
z?a!mR_6+sRg>(NeVi4HuXeg8<^GrXQ^Y{&+xW?WG3hZ`fE}U)~nuYfWJTesjtGiL;
z>OzJ`jW1XpU6kO{6;N-i(BwO^(Sr5J@j~5cj}!&s89y=$>}OPBz2bjgD=IYg>HC_l
znVjm1e2fRWXMPQs8rlDS)k&!XpWHVe%fI}Cw{!mPXon!PD-o<(m(B0Kn^*Gb$Lp62
z%TG;NI5qL-<*?G1YyZzZ$uM=UPkda#1Ub1qUH;roDUqrRMN{_O>6&*hN+9g;w30Nn
z1*&QHavbNZ+OkTO=dth>lVe`2>iZ689o4@jvO>9lXRqF|3yZq)3KryPnKSyoFM3p*
z+L`<NfOSLaxoyRKfx-tQ7x0!oy}$op0>jla>=%?7es15zGlQRPT}+soIq#<Mg)5&<
z{BK}mA(7A{HT~|#)&2ka%MC6s{bHhf{<?FoL$8ysTjatw0eu?bQ}neYT-SK5{%z&n
zK5t!rZi&h7^^#c($qW8G@7i7WS<{SV@!?{%g*pLd@447SO=i4hSUdNB^KZ#gdCB&+
zHn(=GeUroM_x`$kRjA?puGQ+{_WPuFSyg`h^8d~MtN%CuKmX_W?xQ!wxbzhj81C0T
zFJz2UKG43cziIozAOF{BDo!{NXt=R(${ZCb>qgN@Q|C^P4~P&EjPdmKKbIi1wv=mU
zkgJy|+kP=+Wu}D+r%pfPc3+WEs-$eyx>>B*v*BdV<4F>0tK{r9db~*7Xz`YB_UXT6
zSz_NS69Wr9S1$313XBZ>?h&T&F4&|at9o~q)YMPU-qoegesna#H(|!DB!e`c`4^<*
zm+@bA>)R&hyzz1PmE6bEcqAsat4qhPGnu{bV|V2KRh98u$`7|OH@^>;X?i1gso~nj
zkFNq5)+JQiox1O@)&4K7_D%fdq))ex{V+UV!>V-0>&oq8jPmCW?*HTP_}BEOMZI_3
z_dERg=kV&`AtCQ~&x#goQHv8WTxr~3^EJ(jDeUy2tiTR2TXp6(WwZLqqai*5c7G;y
zo(osoI%{J^U3AmDQ1_)=%s-DBU3P1}x4~@B%IrtQ8#Y803H#2OF~>v5-Y-Uai*1SJ
z+=SGQ;~NvYrWIOwb@!@=B{IlYfBK_cF5G{1&%%w_rZacn%$Js2|49Go^6t%xv?kwv
z|L^T$=cKoZ3Db|*$~;>BYKwSP&q1b-3)h_p{NuXz+Uj%W``unQl-FvyzWQRJo~09b
zFYuy!q+q<Cj(q!Pk7sKq7AtOFY3N*_lDO#WiMbBTG>`deHn2UBW4n-&pE+yc(z9N#
ze`L(ObU@0u>t4z?9w~-Z>wMbFeY&Tm`CYuKKCk2IdV9@FC0Cs0eP8=NbcUt2pLIZN
zbl8>pLuYQ>n4*?ZJcqGeB68z4NyfnaAqsDGJ$_lJU6|X&86hQIP<QU>wtxfMwAS7H
zRJu=<{pP&M%X=kXu5ipt6L~qWB~9p2_k`W{Ir7q?%$L-z96TUB@0Dnjq7nbAtv@<{
zI5+3)dti{$$i!fLeWJZ`&i3t5on^|p%uXt|Zal5^`aMOEOERIo#{P!=<BZ#ew;pHh
z;BXE|QtUX>S*%ySF;MfR;QFf{lqXpx*ZfEmmcQ~&?(ae!eT|D7^X+TyvP{*p>AdBs
z((yC4@3_dMERDklUoOoH+VOM|qe?fE(fX?`u?>H6j<bi}lq=m@bGWYbYTJtVld)@(
zPxJ}?u+?ikrB=f}n?ZGrnquGw@1R?AQ#IG99N2wdC)qedV#dP!l%ogcr%n%7)QnE*
zDU?&?o_uA>oPv+#YwnhcOm<@uY%{WPjGVVf=6t}s=PM3yhdkj8dE^`NOgH4=+f?R`
z_uZE?<o887I)1VWE|_PXqv3!4cSKFdy?Nh%Dz8pzP26$AG05NSfKiP1>WQVf8Nt!F
zuJx5|U0%!D)z@egby4M>adg1RxYdU`dF>fvnS-Yki4>LpoOp(zM8ebk&^Db{H@B}k
zRcNw2Tb(s|cgk&n^t&pToRZ}&*uS!x-Q4az{Xp>Q=<tZd$8TQEo~iOCp;T4zH#^IN
zo8CA5PP^>*sT|3yYIWP$Md$EC=8Wb?S(Z<?Nt?a-dYtc$VxXrrSGw@BnV0_R*}b`a
zK{|my<dAHJTE1|^4wFScY&mY0FXJuxuNwQzZ=TJ<(;pLMqyvt<Juk$^tC7N*5fkAr
zy~j^o_3BdFN4q>%DbF(xJ*RThuDzr89%JTdPhP*!tLj!&j<Z@X^E(|hm|`?vWa~=1
zlRLlV^EDlrp_6+fto7}Ny%7&PGj90yJ54XqlGbHe6j>2)ozJY&tf9QMH%Z9%vhwb2
z?_RL8&U2d>>2d1q?@yCmm;2^1iX7s&Hup8Bz^l}n%9U2p3q;o5aBKBt%jc1*llc5@
zTPs^Z#G-EHrBQpX$I2c2{KoHVxcRz*$ck!FmR9zS=jJYad-Y7@lyx4LRb<(>)qeeE
ze6|07i~j3-_df*}$e#+D-`L&}s{3-Q_2X^PGQ47QgsSo!-F$7UZAD&86*0SWTIhbK
z)3(&(`yGnh?i^Tg{PTQQ_k;rWpc~hxZCYy*Dz$a9;NF<FIUhPcy=qwPrn~e-2h05G
zwZg&o&dj*`X_|jTdHh`SyZI9t${h0|>cqp!gsb*jo+x8wy>(;7JR^IBSs$D0dw+NE
zaD2EX>wHAxmVn{nA6lg<J(GAR8vW0d@zkC=fpf~+j+h01)Yb-ZguLkpDwzKD<>JEB
z^C7t%vjS_U-n(RwW#)4F%r@UE?__rFlD){CHvesp<AOx@o~HW}o@y1vo4#L)FZL=p
zFJNzUsJM>%$9X078K=KFt@aO7dc7s*lHKi|0P6$k_EM!9C4Ziz6nY)El$~A@!+v?~
zg}poEHdNSLemqs~{g)p+%kme-KXi8gulex$-j%%zH%_Zew#?Cv%6xui#<dAKyW{7r
z)IYUyH$#KTFNQjn4u8garsRI+V0*?-J^_DtbzU*bFfcm3k392A(S1$Z-ep^R8{ef)
z_Y{&Wo;;O%>U{orpQ~=xr5SDC6|=X?*1xrB=kvV9`VyNHpUk}$l=o}Ri=P%hbx-ST
zPCcH^%`hXwx^mTxY>$V_<1^Rs&RumcTz=0X<7M0j4~lA?(N=Gp=#n<)$Whl=ckv`q
zS6<iCjniMra$ohWdXjbc)~w6|3GP3S8uWi`pZfBRjgy6_ftm`#mrM@9b=SpqshbxT
z>?*I0%HDfe%f@8Mt-|@w&#8yjTvT20y=1mk!<##`c@hGPqCQW*aroRq3GXfwCI2pK
z)%>EbZu2<z<$2xPm^|mkjKdS9O4}ZPOOOyPcKq$txpGR?#mAEG=Xw5SO67T1=&w7+
zXgSA~Ir7yi4-c4Cx6c(?Z8q=D>)8n_B45{R&a9g%_Mz*=vO?V%99>0f(>-@<3i+E0
zx+b>m*zbB(Sy)yq^-5mg=Z3|;pJHu41Yfk$-oM$1ef87Zx>;IgQDHY-qf7GK3{$zc
zoLO<)b#CVIJ1X;)#1xgSW4<hF+qz@ToHHwyratpu;Ci^C>+=6qSCv<H?U<6!DlM*4
zc&B3C_fIPxaqm1aZEd{IZ1t&W79S<nEi721o5f@*>>rx*W}W}sU5cHoAJwnS`mOEu
zFEuOp1e2;dWAv0Gd(v(zT7Np;=l@GaCalK#>E6Tj|MN_Ha>JN;6j_oujCfg&Xial?
z;nH=d>aT9kkrYGzV86vSWgF%dZad+g?4NbyVBNvs;)Y36_<z4)QNAy*MSj`)veW0S
z!ot)<E(*VAP>B}#dGveYCR6@h@^MSQr7wxw^QkiU>C?zxA`k4Fg#_M6q&c=sw$4wK
z=1)Fgx-s-{`GK|8&v!G%J+oUD$Ilx4dE@aKhr5E`mNrke`}!|uZMV<jau;6P<yLAT
zT|0OEYnmRKzb>p#d3WKBXMx61pDON}hv&F2*dx=$vFNPa)cBi|A8fMV+UMUiZ82Ne
zof`kGG0V88Kl6?~zSyn8?UUpEyFB9FZ5wS5ebnTPoXGN^`op{HI$J6%o}J#Ks<}Z~
z|K6qbRX>G#)wq}+D<1amyyV({nx$_-a-qo`PaV_$vYo-3YaV!<{`CKSXXN=WyqUJ%
z2lm}Hv%es*qHCtujK4BB3}p)c#lF5}V)}Phvxb<Gn94<6wamH|uNQ|*aFEIQa=-7p
zOI&31-9G=%*Ct!KutXYdi|<!ha`<M6>0Iy7+|-}Na|1877V<u1@p>|0@u^VDl@qTg
zt1@TiTy9BQr_Us>vi<f}AI;l`HIDw7&em}%!DOP?gkv-PGL9KJJYmR*^18a_$Dd2R
zn~rU%ZfN7GEeZ&T@)g<}@#E7k)$7MgQ$M|m|GQZE%bJG)jt)X*v0(?p>t4$#3Vpin
z>9BD|$%Ouu49l-SzhqS{Te-1uN?87#MK@+<bz0Tv?{@$9WXH+Uxf=XIoYJfx!X8D&
z+&H%Gv)B5~$zjtc3MrbH@BV5cF-`hM?3}bM-*bYx+~yx;w21CrtIu@q;g3o6Cw(0j
zAO9`8;ILOp#M|exIeTU;b@XGXpXjhM=HU#MM_0r)`)dAj72SU>AZmq5Xo0H5@--aO
zwA>tX6BaQ&>$+^oAHTH!&g=&kYn^N~ZXc}pbtCs*hPv&GUPql|pT|vyc=j*waFVc7
zt1D-@pzPqCX5?SGG1aWtYx`9;`R-$^684w$86~r-9v5xVaO5@JU&;FVpjE{jp|b&}
z6)!7s)V+1zR52?c$?`4Z&)Y^hdfG;e@BW3g9$|d^*Oh~7SKZ5_?lS_P*V@eb6#Vd0
z!^)^;oA6oBHt#;!wq1R7W#yc8Rc(wG0a7xN2V7>%W0t52nbfT~#fekoereJF?a9?%
z_PateT_P)8m}@jvPMpCs@5*I)-tvDJ9tZDwoWAs8-27d}Ig1;krLQk7ycPM?TkC?@
z)k$-UCeF~d_#FF)>-&Yv*H|T=ajV;=_Z`eufAT^8%zgb=qTx?IHte$f@>^c(|B){{
zuOD@kd^0)IGW+ZqX`yId&xl8s{>ymc*B151++Xr+?$;v+-FDcCFPXXDra@s@g|b1}
zC8PdHOBxpCIh8rgu2TE*<CR7+kEeQ7U4D<&lZ0nUftt0F`yE2cFN=wOy}fmx!~|yr
z1xr)5+RM@_^8CN;wmQ%^OEyh@g|PYZwr|F=;%p0Nw6p&GEB_`wO(-CX;oV2|5c}zZ
z^Rzmy95(#Fz)I}X<~7%<lHRNHh^`J2zj$$bx6jhh`7u#%H5vMsT5mY9!Y_M$#k`Uu
z9N~BVmp}1%x8Y<6pMyGQ{RE*{&oXtbGfJ+jvuaMw`~4?zOWN9lF^T_c70-Q|`ujp<
zRMugS(9liJvpKBGf4y7meCns3@<aK(iQKom)WW~CZ0rua-2UEpeUqf;_k@PX>s3#4
zBeaz^B+NVb>*$t4J1)#!&6KrGc#(Wlq+;`4k<Y<OOp%|{|6NGQTmA0aktZzQZmpZs
z7;7dVp5i=v{*$>!o@t!@@Z7&y@9yTy)ra@B-!5C__^wLb|3vN2zC+s#j1y!6_&=B5
ze$I63Q1qOAccs2)Rxi(0bUp5?$ML>Y<jT?Ro$<Q-OgXw==I=j0y>Hox0{^NB;mdAW
zpRk_%pSgGM;p9_oPPWpgJ*D~1Yox0cdAmoRTz7HBx(v<skojSu)}Jk6Pujhl_RuqI
z^0pPRi?aAVxim8W?5kMjy{6eJFWN81JI(j>(d|p6UcRo7vz6nFH`}l~A-(*BAAiE>
z;`?tBIyRS`WBY$DH*v<7Jvl*pE@p`2$C-VdGB3^bn8cQqv-`BqCLCV=x&KkppO<S@
zWB;vTH@Cab;XcVfK>Ta#%HZUgJ9j3}Tp8>X`0B~~g+5`54^QvnVybM6y7JpeX4}1c
zmx6VeX2-1Gw_R;g(c$NlUhNmi5bNFk?aL+pwxbg^Z4+H$r}pICk84+c)@_L2`6=q=
z{r^sp|8Mb6HOO3Mv1heoWzr>eb?tp?mG)1aCnPQve|UlA-qk89A7+NKo6Ox<8+~QT
zt(zv^J~c%v@>f`xoijYNP0wtjN$cE2GJU7h-t(5ue$hSe^lQPtHT(80{1{^^`tIcH
z?tQo4rtkTE<|Xg$xA$91--ew%^=Ij_UAk?hdu>a<&N?z7Os;G>`|~rWuZs&^VXJ-7
zviHrUx!0fhwP{veiWJF|ntoT#dAfQ;c%I&6rku#@0xmQCo`mapw3<(ikX=>&CBb*m
zB*FDw#h*<Q*D0K8{_xmv&Lzu*{OSgOD;gt=;!o_p;c%_;S@5kC6{i%{&P#eF|GPu`
z+S@PsZVy@!8z{}ga{1dbuA}E13qSsiD`}GQTz7#n$MR+MHrHcw(x$eRIjJ8uYm8x9
zp)liSf4R!_mYqUhOIv0HuL-&qxWz#=;={@XHJ|0!IfBAWee>^`98EqtZS~K)w!5#+
zdbY{D;d%0h3KKP^en)qg0Ku9TIh%siqNA?f8R=G)Rqu+|{d@B7?3M4kRn5xZ-S8-T
z@5WPc_`#-n6+S<CiER<<=gu^|)E6ORVX^5Xhha`ah48tM?J_-k3mkcB3abyDW1P_W
zt9|2#C7R~%Jzsz1yk};weL7d--s?dBUu_FcdDYF!ojI#x?UeK1zh4xpKNEE7D*vn3
zVgF93DoR`KmHQR7GIUnV^|0K()~~ZRZ>#)1XY$I;c|X^<iLuXqw)2|W<iE~qZwN)R
z9JI=wCaUf7Jn>iRO(Xkl5mM7@${(MLQhIn&{Z09kovmF-viBDsbl!TS@a#XkFJ_;(
z-=#mF*STtwkxiwoz@r!Ensa-3*`v$ZZawf(Ph@C+%V=@t`1?oU!Rf2@y%TIs=iJC%
zBK!BJZhubH?%Jvc&d%@iv#-9pwLFjUo3hf8pPM}<mR)k%^yHboQ{RuD8*&y1CRjgb
zFxy=6dHVThjlW_Stl0H4v3K2N?X15A-#ZQzeVS38;VIi$VzkeM>B*(X_a=2DeLUTk
zpcSh3DJIML1h+X$<HC!&tCshfv=+!-J{-+IiPLlE7FXw9Md#xjM(?73uKJy|#&Da3
zS*B{ndpWiB-``z%(H2`eYr&C{qZWZb7frRV+xhd3>+{=tJj>+bp4Sw~zCYP&8hK*P
zX3PFiH}Q*EJ-^o2wrnUW@ZH<!{L1h~VfD1@vvx_IzB<)3`^C?xH}}`eCOzL*`{V!N
z9WQ@AIDWQg?w5bRqt02)oUvv>l^egW^K#>>zUH3uC0uTsE3@tkzSH{nS61b>YpZ;h
zS$RFa)Uz*bU1aXfRk4BVC0&D$Z|bt)HRD}ZnlHU$S>y8;nuSqa-^?WLtT|@ACR~3p
zAM?AL(>hO2f3U)8MqT8()87<V-Y~D*6u9e|ifvoWW&U@|+zyCxy379Z{eS*-=HLDM
zYLm|^?tjp+Cbn8lgtz)wx!}7$6`OWF{CPF-?%YP*t<BfHv;Mw%wr1uE<>gURd)1@+
zlyVFhKdd+GU1FbK9@<#5diAwjj@Qm}rR6K{D4f_h!Ae-=rM>9t(8DuDPqbWj?#roq
zy8UJMeSUfOoc&j)r?yr8xBeXa{)=o(xzw%uadv{{d!Fcad+Y5>J1xJ<?}~0UN9NCK
zPnpg6=9KQ59%dh&Fa4cCTtoJ1=IgBnD)HX8a`@w)oo|$GIC_8OzpQMPH^<g2uRr{>
zY0~CW?<co8Pkg>5_||?u+hps6L!azQZ|=Qz-ta@L+1pL+{@Y5w+pV4c*YNK2ZK<bz
z9M$(Nw9K9SlEePcp7h{=pxb|qZq98!`|{&m-IB5*ZsmR2%FY|l&ODQsrc!b|bkBd4
zlNEJESzHEB>VEaw{<xT@Rd<{(XZz;)iyr*nqPe3>_)?q8yH1n3s(O{(X0Bgre%Qo%
z->*#y2{MTaJ0sJvc$4;$?(P5A?4PB3H##DucHf=V#jD>HrMG{&6#XyY|K>kyWR_if
zeecwrQ;KgDugScYdgXL);f}4}1o(P{*L^R@KExN#9Q`jy!@9vhq;cj^!(tPiw0Ji2
zrRj4fhEHla>8I%X?sC*_-yq#dyQZ&xdOl?CR{#0o!p1oZ!(U$dD*iEx&nIWU`If!D
z-(Gy&W~#PA=#Rt9o0HG^S=^Oh7i|~&yujk`l4kCA^3|W4SD48E>)Ej<;h)m>g%6po
z_XX^nv0tAz_EmKK)~$|ZA3YQE&tG=Bo#pKPck7x>kItoax?GKkS!A?_*Pv|KR^KdX
zsnAU4g&Pz3&TY=+=scMCB5~!zhJ{m7|0b%Pl$*W8=yaO*UG=$VBQKu0$+vsI#kM0y
zrY*LcH2;0*&GS4<>Mxc(HC(;v`o)enr&l)RK0l&5eO2`Ay1I2aQ{|o{z06ioPCMLJ
z*PJ2Vq^{QWFf{qvi|V{<N8`(r&-j%6pLeEYjqU5dZ~n}Fvu!)S)#4}5lJ74M+;qG@
zWyQ+YeG+@$Z^?7MZ}jw?t#0M*opUl3wO1~jJZXyQxwAKJ-YtLqc~@8dKgam)4!PHr
z${7-B`tP4kH-F*!g!gZlvZe&rUd3d+{t5}DuV%>;oNRm_yHERl?3v4EuOB?uzdd2)
zj5$;!<$X3&uuM-*?pDQ)#|}J67j(~=E?lfzr?BFRX`f@qIlunGTjqb?Ezmn!spWhn
za@O>X+2Q*xeDF9vakm<y$BhFAE-qf*Ej81r>7hN(-WI_^1JmsjPMQSSr++$e^Lnw-
z)@7EJ&+h-PX1}lfGrq^y(vMI0@yv~TLmy?V5AZwVR3sK{J7>mS)7|@5RzAyP?wwfu
zdX|Q6&)m;9JXd|ZsWttN;ACmpD^p_U>CDeN-_7mmwP$X4?C<2n(?5IlpH$ROE%&K%
z$PPEtoht06BY4v=zH_I&{_-x(eS4nuEICpoI`d?RJFAk%{1P*E7d4hCVWnAr_*fPd
zuky>@EvEMV(1PIaF)LS`6Lw|by8YO=PRIIhuV1C&!kAl6c5k+y{Ff!&ba7|kxrWQ{
zrWslmE;#h?)cIW>H!tG#U|AE*$h<?@=b~(ye;Z?4_BZ$boRSx%Ie(L$Pb#r9txgwI
zUN!Y_>A97CH^MImzAN69V5j<6%t~8fcVLiL#`o4)c9#u1TK)cP`Kg!_AnV;w`|Hku
z1)gt{yxh6G53Y*4mAuHg(6{mSzsnOp&9hkLp!ufg)qd@Li_PMi82{|&+p=fhtQ$QK
z=e|wbIIrW_)%o(r7M!l1`tYjb1X08JZ$31+&q%KR-)&i<eC%KJQ?cDFlj1$<IZmGM
z+qKh@PdEHnsP>7A5!}=IeJf8WTx~3DJiYh80;?9DkQ)`zDsIUqyIy@*cENPxnXS{z
zM0Yf{a0MscN!Z!j&#KKOy>x=PlVWAe=QL}roBBKKcl2)czHv#Wd)-d%lcItB&lkBS
z70tPqG<ie+F%_>1i#`aIxE$Jc;)X`u<qI6$Qx%+_w{l-d{PIo3{tfre{Uw#{la|MF
z?vt{4l)6CS@NWIJH+`&bJrY~b$<#M{;jiH38#@0!^zU-Ia&5=`)ywW`ew_SbQG(gb
z_H-4YZ;IgxsXqd3{$0E%tFb{x&R->!&8_;?x&^XA33s}M)h8WU+IdoSsb|y%70bYw
zq{f!7_d0GKR=oKx{m$OX#l`EBcAw^pRC@S{DUy+kGgtQf+Qs+H96BPa-<oSn_pICQ
zU6&D_Go$au&c0&J69;D~ZmgJWq!4B>ZLZDH=gP;Nnj%sc?A)<s)2D{WAE%zAs~4^h
zO_4h4ZksVbEVF1+h0r-(#)~#@*Ca7mtF07|jnTOmR;X$}L)o8u@d+g*uHEd~OggLI
z7M=B)U|>3ZwWNUYakr&DUl~L%ne5yiwDMi<*;)T|7F?^?<-T(5JJHSm_c_HXs=p9i
zq2ao`)ad11Ny#ts{M@2;btV4G?aLE2R(tt)qWNagubX~FzUZ6CS;Z=%dqs@v-E%JI
zL;rMM1c-{Q2w`nq#iw!SVql<v)La1(iOB*|s~Qh1$Q9e(`+TFUw=A3Zo>}a2Z7u9O
zw(qDuap!KT+&f+CyJhK<P9K?@{P$+O(<hC$=F7_a-Y%Iay2`>aDpJaFhSx;))dfXr
zq4R#e`73j%{?ON#vH3IfY<b>UIi+-ItU306*@d~!C*Kd8SnYQyYEoueY3Z}qoWcbg
z1Oqd8?6_XHt0!L&OxZr?>dlE?k1227{My}TrfZ&Udd!NfWs85^eEe$LHutLv<qh9o
zDpx+(DDx~R-@}{LG(=~4|I{1vXRegsN<VV#S96Myl3sIQM4H5JiI-D?g_S;?@49EZ
zN@QX9k6Y}U{>iVNRdHvV*mv&PRsAnFx2h^u<n#0IN%!Dncl;4zq8YwaJxZ;pcv4W;
z;l12Rv8pR3#NACf9%0$@P?fJ^`ij*B_Qyniw*J1@bT}yGD9_)f6y;N|vR2=5558nq
z^j&A2)t$9`VY12ZHksSTmtHF5z4Kuw+qaztzy8Lzes)=#{$`cCg6fgt>?!3f`&XS%
z-FbH9oO^So?^iu0kv(ZM(_HDDca+}Gx;no=KH^N;ljHdlV)`VW_uTglKfc&AsI~Lv
z(mk9^-!j_om)vj>2y5KxFyYVMm8;HdaSDxHm+@_S=d7fg#}09Cu6`d}qpb9&#>hEV
zd7Bc)K24c*4f2lazuLK!EFX$KEL{08qCb?Ud*-}(I(L_8y_mR+rDa+A3g_KFZrx(5
ziY-`hFj4$^(`>_>DM<&o9M=e@`uU}HxlEop$8+KYW7C<5cf6j3)YcVx_d8s;5*%|U
zMM75k{JwpWG7j!p9KxN;MJxVDUG~=8R}}uxtnTJ*rBu6g7xO8#HItXjiRu4Z#2|hz
z^|j}^UHug)|5JK>K5cy*JxwRu?c>d#-cHvJ*Z=*ydGpoMQfB8L**`9w`DtsZ${M_K
zrtr^?_iBs`xjz4I+Ix!QOb54ilGwDf@sGl1nyPFQdO1nMrf;g$w64Q}g%Rg9oD3AN
zOl~{9W>Wfxtm>nN4{G!;S4kS&&AmRWWcHWY_x}7kQ~7Sgn@Kz8E?qkJr|Qjz%==jM
zeD}I<xGj=-y5zgjg;P~~YA(#HR&Uy;y)QbTI#>3GU$V$UPf?kA$Mb1UK5Ld)-%et5
zcq`F0yI)stU)K2#Z_0OGw7cS%=N6c5yT0P#)o)fS&usee>Cc(T6*(zO<gK*l^e8OS
z4ld(MpI<I4$G9VcdBg7Y_iz8P@18$5tlozGpGtayXhgh<$)Dci_uCU+a*IFd|KQX6
z=h5>Y`s!P>cZqs0$-nt2a&xETqpqSgfyeUp)H$sx_<j5S`|p36q-%1uD}2Aa-Zp#N
zv^zVMx82+uz44*0!QP6wS`+^N+h6_jyRF@Oy)B&)9wC3`NU)e(PyQ?IpY|unC;CHq
z^fu9(&lkAv%Q!f9ck{RXn{#y*&s@Gw%4pNe2M=YpwX;XRw%c@fSL-AD6wSkPev5Ri
zTXCSGJGJ6!`@;#p1Qu}~d*>v1%Qrym-oL~T$EPN*o_0o!B~P);zJDXLrb^5^F}cz?
zFOto|8mGI+EO^>?>BoJpqK(l9Q&X2`=*3+)`?}h;dZI@4#9Q<3Rkc<ze|l_lKSb$w
zT%2sFI=@HdnLvxzS!dT8bN8<-ToUlXL~{0I8C!1k=W8bUOTT_wweW!W<L)r2s@J^k
zyvMTlYn^=b;gZMBaP<`(5?g;>x8$)f;1T}W|KsVr?ecBOHh+VBYX7bIcJz}izg<s#
zsNS^4>S2t!6Q|$Sy4KaXCVz{P&s?eZv!t&#WvUCm7jt@lc5CnYe+7pR*K^I)&sxL0
zFn>{td~J;78-?$Bf4sMtshg=R_njM|8GrV>UX0h;tJ}Q!UY+`1@u_*&XV28D&Y{sq
z@BU70-hNrQDoWzyziGGLCLc91zVSwE*IM~4YIhlV-jx`)T$v`umR@q^mvoo(>$u~~
zifpyx!Z;39_NHzP40FBa`1GJ(=uhVzi$0`POP~JmCqL=f^N?fd9~me2AN=5v5m%wO
z-auv+dq2;=j#-{DRWgjTUY~6hF8DtG{5!5S3W~M|j5=rdUWvB+`(ka+*^5^if8C#x
zb=rHS<3(n_8ONXB-?ymZo%WaY>kshn3tGSW^x@NszdWsYpv|>z{RNM$A)DPFpU(7I
ze?pB<-tN$|{(P<3i`~O?Ip!Qpn;bp0#+CD-Hc!n~6C0kcMd|!Tisx4q%3PT7;B?{f
za1qIUPVK9gZY!3Z@LJg6-HDkIHH$VZd{{nJm*b<QSn9WqTFZIAx|Gg`d%V^T2-m&(
zu<%z=%y&`OPr|KLNmiGl87H_0#tP46Q(X1DPV(VNE#;#2$?FwXty+39Wyi6imprSM
zim<gWa1THBalvVed1n0SD<ABcuDK*!aoM!n>x*>F6q|m3v&pPqDf_SfU`eO`w(_St
zcULRiudh#QC^L+RWepD4yC=SB)6q?O@4as&%-ngJX;19i4Cgrvin;vT+6#<#7JrIb
zAhPoOx9%%jo==_byKM24w_U!n=T0pC6MNgUI{ZedW!Vy0hDRJJOZISX&5WEm>5gY*
zE63Ikx2jmRxu>2zw;;=fJ$)+co+li)3XW~LzW%mn^*zpCOE(=2e>cf0CnBTNvdks6
zdiwm{n+`Wc+iu=czhyD){qlsfs$Z1#CT-Xw|MmNPm(p*uHhCl_@hUV&wQMm=n&WVc
z-IDW0k96cw?<v_GA^n{n9=%=M_%A*+U}K}j3&9O+8->HUx)?Y@!gpA{C}01yVdl1p
zq3=VCn6p`$GPRhR@3}~2btZdkNSz&d^tYSx+6NnZidWya(|Y+ow0*{nfD@PHd>5Q#
zSS)wdc7@yDfXX2Lt84dNW(k~=wbn@Kd(rvTO%5g+#$}eX);{?zxJEAI+HD5|2|X^Z
z8wX;SwJG*)5ed0{r8DVp8LzA7+DA9HtmN>PoG4@cp}Krqr)v$P)vf%Ap+{yNar}2<
z#=OSd=tr_bv-Y+uIxnDa@49$eVs`hM&;XU`iWgsBObc=-&FNsjsw~07^Q?-ez5QF*
z`JR>+A*+|q^WM^yZ1&|@#h$4amfW|V@V-($zqDXuTCS}Lv$~Ukd4sL7Gn<)2iP&1c
z=(xstya|!du1{&c8|W;u|C@QO(bZP_&zsiGX3<h=TXrCn$Kq|SrZe}dO(%Ya&3`*9
zBq5Zg>EVV1wXjF?a-VP46}{nNu;6W2zU>UlZ^k-li$1yZU%r2Kk!wRsUd$su*JqNu
z%zx&qdVNxM;mdm;aACtaO&M;VRav*^ELB|A5HNrGqK(#lKUd}LH23COv!l2ASls@_
z`?g&u(OS&+ZqkJl+uj{`@tWsMhyu_3zJ>O_LMj{gCz?z=8B%op+UBf1xd%#b*}G(Z
zms-B^fWxc{408k)2YjpAsekTKZ{#0m)&}XlORI12y_&#r!8!lm%F7$i&RI5N-6uvX
z#xU=MCQsA4icMF|xC;7wf@WLuGRMz$UZOr#L;P4L=PMt+ye75|4YhN=&)%0$?bvB{
z_ImPqjff>ls`WlDvy3<T%{#MgnQ-EqrB@qVuTGmN-_&v_=9<$HmJ4jJ3=bYL5Ls?I
z$LLtTb)@rsKjEC?A`d({PF^~_=4w%qVCY#%%b>0A4^K%_Yc%6-IQVSt+Iva@A<`dq
zFuKpaq2V1nvnAp%NBEYIg=QBlHmY3+w3^<#`)=*UX}Npeh)v(w%P&=*>{R;e*?sp!
zqpwjv+17k}=j*qATmFMW6~Ew1!neCzn>!~5aILaryYV$ve`V*n9--aUvzD@~*GW9_
zSzfVA`Gw^bJ})K459=a=W?dIL7kXT0=EXb0Ul!iYQsK#c_gO$8uRM#}QaaV-kl*yk
z4|n{sR(CKJM4av{I(|e<%j%XPgZ8E$XS(E+EOxN|d$rWY$Na@Jhdt9zDyUC&%`!ec
z|3&u3u#8)qo77&H#08&l-M|(mxMfkN#bM=JMak~Qji!tmlOD%4r+6t^WMo`dD2~a>
zyqoZ4GV`0BML~<!ZK^r>STx_cso{>opUI|-C7XCpD_VWt=y2<V!YbRY^ZLyT{w9_0
zxuo_=<%iTZ&Mgtb0>?#-*m7nmt9z)m_C`F|6V&ASn17OE)I5h)IiaMiFK$tB(;}CK
z&bZ?K{{z>p$HiuMJWVCFf~GERRdZwxHCpSuJHRPveP*`3N%?D^>p|zuyKf%#Y+J&0
z<oB<z2luAG`F67V>=UL%Pous!cFvLJF=4u)mK1vT#ioiIdj8?vd4_DatoobgPbmHI
z!RPCwEQNoKmN6fg9~rGs*PkCY&EeVgT?co+z7)kcad&=GAcypu0){hTTMJu`E%E6+
zo0P31Y;G7VH{IsPol{&|Mi=_J8Wk3_%&y<Kq*3GYYRQAW0bEfDZdUKDn^<i=-+jP(
z&BfK1Et&K97a1P^jhz|SWqKw)Ej73zbBps!#Q#0o0;}dQZTz$H*w&Jz9sOT+U)_~2
z=XU>r=`7tgbHg~@(yf0BzX)%sI=()Y;ksaX|CvCk8B$xt*1nG@W8IRu>3f}U?0LhJ
zRz9aTc|AKNcERnn!K%H2XTK}`jSN|_#bt-t56%A4-pch;dea5il2&BjXbPO5?s3!g
zW&~sTS2^|HN7%1?JLmbxQp9B4E_02&^RA}+kKlRAuyM_%p7$+nN-GRrNuKsoO+Ola
zTHsNKn%?rqJG1V4Y=7Dtp}E-O+Kz+Qr#IiNFq+#@I5Bvhn#F<x3F|Z>W<H$y<w7*y
zvg@ldM0b4(*1S{wZBN3Ti@#Jw^4O%VrtkmKwd%gzsh9t+zF|^vewE{t!ng0x!V^b}
zujGGyvEFH7by_S}7JL5GO4GFy&s7O+jS{Y``1<+x*>`_RW>#Lm!g_S|t^@sl-WP7Z
zvOH8MU2CEH7EZ}c$&+v0Oq;+LXS?XSwAs^o|4rcwG?pEgPyRmRYUWNoo~L?Twcnh}
zH{5#6a<2Hgg3!`LezWXrVXEf2rvEETd~BLJgw}kTdRnX1>%_?|t>If{Y<(cDUflTC
z>QM8^o2IAs%#P8$Dy8dgZ@=o)F54}Kq<if2H;cSorgiDawx>-`mj8G&b5Wb74pZZM
z-v{NZyF?UZ?rwg2=#`THL7!!^23JK7N%9$*Ci#_i?TVN2G@Lyts9)AmaL<g!*Wv>8
zJ4_`^*1NOj?X8<?Xpp{!>rb<M#=g>v>67-~x8*i3NM?QW+soqFv>T_+#wE{wD$z9Y
zp>gAdRlFj{3orjF=XE^mQkHvlGLv_**u#&-zTZl`OdLgSl+DWId98SpIl^DX=ykRr
zgMhy`W9XK~!cY1JLf*L(4d0ph*c^CQa#&}-p*mZ?z%sw(zTyoXQ%fIhU*ofI9#?5O
z<6p*WAv@b6t!_R}IK0^RmrCN9z^->uHx3<~ck+V*&o9QSOogA0h`f<~$2d1}sYFNr
zioQt_$%>1D53)a2I5czi)Kxbos=K5Fi-;-(oG7{fO#A!HZPtpqhmKU6XS{j;;ObwY
z6BjjHF3J@LRi2jNmVRfT&0ukHAxHo7b*zqlLVSwPN<;%xViwEsKAt9@DQY9Xw?U>u
zS262q1Al7J>_0mnL@{Ts7i-{H$yCI1k8^!ig+ZO*g|r374=kDBsdBbqmg~YLQfy~8
zlrfd%+Dzi<=evDJ;qa9^t?|M8s$)NXvpH;RA-(eBHlwZoZSpDu8CND|Z}Ssc_-I1n
z%xdv7Ck{Fo1ciNyd1K$Nv)g}p%+%Pd6t@Kn4;c4fkQ1F}8TXx~H9L2{Uh}oI;8o}O
znc4kJ=KD@4b6@Qo`TfB0h&87^9b3S-RiW71b>{wO(r*PdF189uU1X>VPE%R9==a%P
z&)A@)b*wWpUnjV{R^e5%U4Dn<?nH(4M+z^9xaE{<y_0p>c`+;Fb4hn>`I6htnV!qu
zmG62Y=R4#4&RtQ7L4Qm2mb1-f+Z%X!>vw6FlqGjUz4f<jJ@t0+rBFwq19e)PIGyEA
zE;;}6Zm&^dzOcIaTK#N>OU>(jTRxkvEM}Wy)SEu>QE!CTG54>xY|7f-6wHrSO1o=d
zU|W`_JJn?R-Yp-_c*w2&dT(c@1oQQ2m0X$iObg%YU2gfdCONI5;c?!HhpZyu#gP+p
zo!U6UMIsH4#wD)y{(bzN^&^LxpS@EX)gIerg++he`at3G;v+^mQYH>dTb}qIn6YTj
z@2z(~IG%CKtZG?#WjV9ZW9C&``p<`%KYW}hwM1s+;e%86a=U&LSbh5D%VqD^PYiJl
zcyadB+2D}Mh+wh6Yjr2$o@^7c_?e-lV6&*^&)bCUInO;etc$%a`BCf3&G#=ITe{*K
z0|hT{Y(EllsJ2Ba{_)8gFWc{WHkRintXiYr7q{>B>J(i|!8toKjaOe>dB%US_hZTC
zWF9W@>?2pa_qr-rFBjBO3*Y+X$hJo@JPSo1F({n+c9Nkn;=o${J2(AmXZFZ`wm*4h
zrSQ*l6Paw=P28vEhuLJEoTBR5^wUFpouE&p<>bIi<`?#5`iFSSMoxP*_rmE1Ke--l
zN~`T=Jk-62Y0c@XQw;)s-vxSkpTw>|GQZ%-u?I8N9QnDlK3|UgEcJD^=q%9%Grigl
z-_ZOuTSs8ke<dEbc)7gjv@<@^k#m;@#pd3=T*7N`dcVVczBi^W>NDnUyC+c@Gi~dt
zx|d3AU$#8^H1(m;ucjYcV>WH8i&@Oy=)9!Jp)cRVKcRNT(&^%bR=X0Ge~`D=*x+Vz
z)vi-qLgLV}^+K|o>04Q{b0<|x`A1x<&3SZEzN!1Ub)ofT<BLZEHM7sy&-~U?;g>A6
z=Xm2n-(ro~Uwou_yf67_-#oaS|6yQ6!fC;0TR6L&r^H;h%sujf_t3K6MHd&C`k&eT
zkmuYPhmYdi718FCcY5|ZhKcnDnSRI>(qt)D*&XzKg}+ab#|=Z5ZQ4dRpZ+}&FCvqg
zv+qsb9F^xhhp$cCFw4oj@1hU)_HYS>V>1q@G#+SfJfou0ur>O9x$Yj7<lan=eV@OX
zs-ChvWVhu|)8+`)N}WF6%BItYS22Y9Y}#(w-;<rAcz>n*#6z#;JY59EcXa#R4cmFD
zUgzZG1+5E;0-gtlg<8(r;38KYk~f*3`xV>8vy**azl(X(m3?)~ug{w&KVE#exz>a4
z%i{%;w~F@V&XzW*I+<~V$NcZ}N5V#HCTy+nh+A^a*NRuLOiOmIhSR6=X<>d0r7zAe
z=UkYZ{xtaVIX1(D-egxvn=`vJAB$Xgu>88JYQ^c(jlzOgcO@^={NYuqxS&ZqQ&ZuL
z+70LP%M039xTvnSY<i`zt2$hG=ifuOHboqsA)B-Du#SvJr;_NqXSYOyUp@<I(Jd1y
zobFuf!0=#;hQM?oYYkiOMThk3_jktbe|-C=@cToJEw|UFzV7F2TXXrS-^CTX1Jk4J
z9#mZVQuJrHvLdhlu72J#_O7dLDoG2Pc5%g(RxogHQ59Ti==pLBzk+`rf5oD_vgOBD
zzIYnv(>7PT#?w&q)3-@deow_dDrjH1^`z!pDC;)egFjp6-EH&udCq@Teg6GQ&m`|n
zZo-q2tJEIM<tz(&^ut+kS!b@75C5OIIH7bNmB65b{kpH5=4F)HK0kME+u;KVmf03t
zIiE`#&VHcMUd1ACF2h&GNL^ZY_TNB`wgZ<`W^FH)OnCN!NALH6;;zP05xdO2!5i-{
zIkeMx&ZUm6kr$Z7`5M%p*8lo%_^Gh7%J^Z%)b(r9_?mW|te!bd<55o@pILT?y~ww3
zDHb1I`1Y;&@?6njV)1%^Ufor78>_zR`_HIRRR6u$MUZ37thjgFOAU8?smy+vm69WS
zxH@TndR@}f-=7pt1c>Q8oyD|4<8mrrSj>4229|x@JLThEp5Q60=Q$?D&~X0Ter@J`
zca9hT%YRY6@4|kTk}nJ_1)6OKPIN~tJj$bR>5=`k^J$YA88`zT#ci<ZyJr1k{UOIy
zhEA3O(|=aTt}(c`Yg54G_TT;2RC#s<XxD{??>|y{{DRdS5$Tii-Ws1pmp+RuTJ|w;
zqExN$Bi|*fU1#$zTlwhvwcrbJY4v9p)ZC3vU14yvZ;SAOsjRX~J+f}T+Wn<#ThFaa
zk_<7b7pFbnBFebs?)i#l`HQbu%cdUMva5RL;uBu-l}ofvSwHpqQgcW<v_RSGJeTej
zuXX>ttsk>R{|)~>_gl-N-w$e@am77XcS)>%6`t7J#vH&EHgETwYp1n4{mhsdKL~4G
z(uv&kpw#uwghb5{<{eR*%Ub>OS8S2ved@)=!)$p!H1qPLOC06XZnwuYv(|Q<W79sY
z;d>(Dl6;2tzl*(_LY^K7J)yMFBz)O^k=(?E#$lD_?30=;Kd=b4KDjpG`^OcppS2uH
z`c&K|>R#aT;Kq5TSFs{e)joIsG3N7s<8xZy#kXgJdyK>DzQr${URY=I+L)AIT@os9
zZ@fI^P-fB%?F=>MtVhY#US&@eYoA+{=kz{pWIQ8VV&Z8zVNS(Wz6+n!cO`F|{Hygz
z73<v81IGj67nUA(=w`X688180g?+YgI>Rr<TGryO?UpK{S;r2PO>biO)8Q%4*dsUP
z`bviKep8kJfddY58Xl3%4U-R?cH#(D=Kd-X8Nng?B1f^OxS_S+NkLr41BpYE(~sC&
z35aM1dg{o}ZxHdCU~fM8m73o7C)2cpHD)sihYNCw%!)8v7-Pxn^)YT@-JzpL;!UfU
zH&5156g+c$xo@3TsM_r5YDc*$e?RH`61?N|$34fN<k?<dyzi^QlSk%D6MV#+KYzN<
zckZhUW9Xs$8FrO6(QWT%@qg8wqcXjJnt!2AR*%~!?&lAU!n<Zq+JAk?g4&j#O@A`m
zEHZX@w+5e{*%|cd;L=K7e(?`N;Sb+mTjk`okX_^NhTO^ick1d{lpGf@oSGjmIVr=F
z>FCjg3%d^;I^yt9PvgL`Q|AtzIeUCjmvp~Zis2+xkI71+(Yts$nNmJ;b#k1ZsO@j3
z+0^zVD6C8Cwh`AkPQUq$9o+GMi?^#TQWjX&p}f(lM#D+fC^qH1LYp%8b=KE1r8flI
zZ7#ksoVvU$Ye~r@w`S3~v;HiIoo%>#ZqY3{d#Mel-RmR1?k=>h`RJK_-~c1L?yc8*
z&i7?reD2?0GW&Y6_1eEyOni0~?|UV~W6iXq`(78t7M^{3`qG!Z)1E(c%?M(>rxmu!
zC8$Fu=IQCs2`hs#rFUj+&APJkc=7p3*3Uld-Rz(--(w+@Yh%L;XC8%Y1&<R^9f~Qk
zM>sagCCNy89hxc9CHK%o;$>Rl#=4uPKP7l>y?4HHT>a6_?K_MNW^X#trf}r-^oxS|
z4_lw*XfUikzt=G)CNON1TI2O=OgjUOI(_^Mq>t$FXL6moe|YNUdGFOHoGX5Qa(|J2
z)!n)m@-^HqECU{Vt9-FLddBC3WPaB;`}>jSS8raoS((31<bnHx(~<$%##_!Y{j*g$
z^*cGR;Kx_BB~L@X?aBH%RYC54u4P(dEt5sfy08BpN^DNJ+Bjv(GV3t4CGJmN$UU<%
cc)QRo?|tU~_gh!Rl~4V#>_KTmg#-fw0O0G@QUCw|

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/montserrat/montserrat-600.woff b/app/Views/_assets/fonts/montserrat/montserrat-600.woff
new file mode 100644
index 0000000000000000000000000000000000000000..e7f8a31ba35c59891483cc67b9471ff78c7b000f
GIT binary patch
literal 23628
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
Hg@FM8L6S4r

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/montserrat/montserrat-600.woff2 b/app/Views/_assets/fonts/montserrat/montserrat-600.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..29cc1a9734501f08df2d097c77bead989321249c
GIT binary patch
literal 19264
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
Ia|Q+m0E5RN_y7O^

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/montserrat/montserrat-regular.woff b/app/Views/_assets/fonts/montserrat/montserrat-regular.woff
new file mode 100644
index 0000000000000000000000000000000000000000..676a065e24ff77f050f1fe75c0f295d4ab48acbb
GIT binary patch
literal 23480
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

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/fonts/montserrat/montserrat-regular.woff2 b/app/Views/_assets/fonts/montserrat/montserrat-regular.woff2
new file mode 100644
index 0000000000000000000000000000000000000000..70788c2732074a4a752cb2e0410d49fb1b067cc0
GIT binary patch
literal 19172
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
G3=9A`=C}U<

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/icons/add-box.svg b/app/Views/_assets/icons/add-box.svg
old mode 100644
new mode 100755
index dc56100ad4..5a6fd80c6c
--- a/app/Views/_assets/icons/add-box.svg
+++ b/app/Views/_assets/icons/add-box.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h14V5H5zm6 6V7h2v4h4v2h-4v4h-2v-4H7v-2h4z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm7 8H7v2h4v4h2v-4h4v-2h-4V7h-2v4z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/add.svg b/app/Views/_assets/icons/add.svg
old mode 100644
new mode 100755
diff --git a/app/Views/_assets/icons/alert.svg b/app/Views/_assets/icons/alert.svg
old mode 100644
new mode 100755
index 02da88f90b..7dd74af774
--- a/app/Views/_assets/icons/alert.svg
+++ b/app/Views/_assets/icons/alert.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path fill-rule="nonzero" d="M12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0zm-8.66 16h15.588L12 5.5 4.206 19zM11 16h2v2h-2v-2zm0-7h2v5h-2V9z"/>
+        <path d="M12.866 3l9.526 16.5a1 1 0 0 1-.866 1.5H2.474a1 1 0 0 1-.866-1.5L11.134 3a1 1 0 0 1 1.732 0zM11 16v2h2v-2h-2zm0-7v5h2V9h-2z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/bookmark.svg b/app/Views/_assets/icons/bookmark.svg
old mode 100644
new mode 100755
index f340d6ed24..d3bde5f356
--- a/app/Views/_assets/icons/bookmark.svg
+++ b/app/Views/_assets/icons/bookmark.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 2h14a1 1 0 0 1 1 1v19.143a.5.5 0 0 1-.766.424L12 18.03l-7.234 4.536A.5.5 0 0 1 4 22.143V3a1 1 0 0 1 1-1z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M5 2h14a1 1 0 0 1 1 1v19.143a.5.5 0 0 1-.766.424L12 18.03l-7.234 4.536A.5.5 0 0 1 4 22.143V3a1 1 0 0 1 1-1z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/chat.svg b/app/Views/_assets/icons/chat.svg
new file mode 100755
index 0000000000..594b150329
--- /dev/null
+++ b/app/Views/_assets/icons/chat.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M6.455 19L2 22.5V4a1 1 0 0 1 1-1h18a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H6.455z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/cloud-off.svg b/app/Views/_assets/icons/cloud-off.svg
new file mode 100755
index 0000000000..7177145aaf
--- /dev/null
+++ b/app/Views/_assets/icons/cloud-off.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M3.515 2.1l19.092 19.092-1.415 1.415-2.014-2.015A5.985 5.985 0 0 1 17 21H7A6 6 0 0 1 5.008 9.339a6.992 6.992 0 0 1 .353-2.563L2.1 3.514 3.515 2.1zM17 9a6.003 6.003 0 0 1 5.204 8.989L14.01 9.796C14.89 9.29 15.91 9 17 9zm-5-7a7.003 7.003 0 0 1 6.765 5.195 8.027 8.027 0 0 0-6.206 1.15L7.694 3.48A6.97 6.97 0 0 1 12 2z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/dashboard.svg b/app/Views/_assets/icons/dashboard.svg
old mode 100644
new mode 100755
index 1d2279e5d1..a25c9e477a
--- a/app/Views/_assets/icons/dashboard.svg
+++ b/app/Views/_assets/icons/dashboard.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M13 21V11h8v10h-8zM3 13V3h8v10H3zm6-2V5H5v6h4zM3 21v-6h8v6H3zm2-2h4v-2H5v2zm10 0h4v-6h-4v6zM13 3h8v6h-8V3zm2 2v2h4V5h-4z"/>
+        <path d="M3 13h8V3H3v10zm0 8h8v-6H3v6zm10 0h8V11h-8v10zm0-18v6h8V3h-8z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/delete-bin.svg b/app/Views/_assets/icons/delete-bin.svg
old mode 100644
new mode 100755
index 91a963ddcf..bd1f9b30ed
--- a/app/Views/_assets/icons/delete-bin.svg
+++ b/app/Views/_assets/icons/delete-bin.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm1 2H6v12h12V8zm-9 3h2v6H9v-6zm4 0h2v6h-2v-6zM9 4v2h6V4H9z"/>
+        <path d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm-8 5v6h2v-6H9zm4 0v6h2v-6h-2zM9 4v2h6V4H9z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/download.svg b/app/Views/_assets/icons/download.svg
old mode 100644
new mode 100755
index 42702f57db..b3ea2a9f6e
--- a/app/Views/_assets/icons/download.svg
+++ b/app/Views/_assets/icons/download.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M13 10h5l-6 6-6-6h5V3h2v7zm-9 9h16v-7h2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-8h2v7z"/>
+        <path d="M4 19h16v-7h2v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1v-8h2v7zM14 9h5l-7 7-7-7h5V3h4v6z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/edit.svg b/app/Views/_assets/icons/edit.svg
old mode 100644
new mode 100755
index ace6db3a1b..d9efb56cad
--- a/app/Views/_assets/icons/edit.svg
+++ b/app/Views/_assets/icons/edit.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M6.414 16L16.556 5.858l-1.414-1.414L5 14.586V16h1.414zm.829 2H3v-4.243L14.435 2.322a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414L7.243 18zM3 20h18v2H3v-2z"/>
+        <path d="M7.243 18H3v-4.243L14.435 2.322a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414L7.243 18zM3 20h18v2H3v-2z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/external-link.svg b/app/Views/_assets/icons/external-link.svg
old mode 100644
new mode 100755
index 2a69c5f353..2efc62595c
--- a/app/Views/_assets/icons/external-link.svg
+++ b/app/Views/_assets/icons/external-link.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm11-3v8h-2V6.413l-7.793 7.794-1.414-1.414L17.585 5H13V3h8z"/>
+        <path d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm11-3v9l-3.794-3.793-5.999 6-1.414-1.414 5.999-6L12 3h9z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/eye.svg b/app/Views/_assets/icons/eye.svg
old mode 100644
new mode 100755
index 0b8b52e099..f14a8b7d57
--- a/app/Views/_assets/icons/eye.svg
+++ b/app/Views/_assets/icons/eye.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M12 3c5.392 0 9.878 3.88 10.819 9-.94 5.12-5.427 9-10.819 9-5.392 0-9.878-3.88-10.819-9C2.121 6.88 6.608 3 12 3zm0 16a9.005 9.005 0 0 0 8.777-7 9.005 9.005 0 0 0-17.554 0A9.005 9.005 0 0 0 12 19zm0-2.5a4.5 4.5 0 1 1 0-9 4.5 4.5 0 0 1 0 9zm0-2a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5z"/>
+        <path d="M1.181 12C2.121 6.88 6.608 3 12 3c5.392 0 9.878 3.88 10.819 9-.94 5.12-5.427 9-10.819 9-5.392 0-9.878-3.88-10.819-9zM12 17a5 5 0 1 0 0-10 5 5 0 0 0 0 10zm0-2a3 3 0 1 1 0-6 3 3 0 0 1 0 6z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/file-copy.svg b/app/Views/_assets/icons/file-copy.svg
old mode 100644
new mode 100755
index 491df11d37..0b90743626
--- a/app/Views/_assets/icons/file-copy.svg
+++ b/app/Views/_assets/icons/file-copy.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1.001 1.001 0 0 1 3 21l.003-14c0-.552.45-1 1.006-1H7zM5.002 8L5 20h10V8H5.002zM9 6h8v10h2V4H9v2zm-2 5h6v2H7v-2zm0 4h6v2H7v-2z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M7 6V3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1h-3v3c0 .552-.45 1-1.007 1H4.007A1.001 1.001 0 0 1 3 21l.003-14c0-.552.45-1 1.007-1H7zm2 0h8v10h2V4H9v2zm-2 5v2h6v-2H7zm0 4v2h6v-2H7z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/file.svg b/app/Views/_assets/icons/file.svg
old mode 100644
new mode 100755
index dcddb3965b..d10c86cf81
--- a/app/Views/_assets/icons/file.svg
+++ b/app/Views/_assets/icons/file.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M19 22H5a3 3 0 0 1-3-3V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v12h4v4a3 3 0 0 1-3 3zm-1-5v2a1 1 0 0 0 2 0v-2h-2zm-2 3V4H4v15a1 1 0 0 0 1 1h11zM6 7h8v2H6V7zm0 4h8v2H6v-2zm0 4h5v2H6v-2z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M19 22H5a3 3 0 0 1-3-3V3a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v12h4v4a3 3 0 0 1-3 3zm-1-5v2a1 1 0 0 0 2 0v-2h-2zM6 7v2h8V7H6zm0 4v2h8v-2H6zm0 4v2h5v-2H6z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/folder-user.svg b/app/Views/_assets/icons/folder-user.svg
old mode 100644
new mode 100755
index 590e6aa19a..6dcd37c42a
--- a/app/Views/_assets/icons/folder-user.svg
+++ b/app/Views/_assets/icons/folder-user.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2zM4 5v14h16V7h-8.414l-2-2H4zm4 13a4 4 0 1 1 8 0H8zm4-5a2.5 2.5 0 1 1 0-5 2.5 2.5 0 0 1 0 5z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M12.414 5H21a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1h7.414l2 2zM12 13a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5zm-4 5h8a4 4 0 1 0-8 0z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/funding/gofundme.svg b/app/Views/_assets/icons/funding/gofundme.svg
new file mode 100755
index 0000000000..8573eaa3e6
--- /dev/null
+++ b/app/Views/_assets/icons/funding/gofundme.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.07,14.76a4.78,4.78,0,0,1,.48-.37A2.58,2.58,0,0,1,8.13,14a2.5,2.5,0,0,1,.76.19A2,2,0,0,1,9.7,15c0,.05.06.06.09,0A2,2,0,0,1,11.3,14a2,2,0,0,1,1.69.48,1.44,1.44,0,0,1,.44.83,4.6,4.6,0,0,1,.05.64V19.3c0,.1,0,.12-.12.12q-.87,0-1.74,0c-.08,0-.1,0-.1-.11v-2.6a2.56,2.56,0,0,0-.07-.62.8.8,0,0,0-1.33-.38,1.15,1.15,0,0,0-.33.76,5.88,5.88,0,0,0,0,.73v2.12c0,.07,0,.1-.09.1H7.91c-.08,0-.1,0-.1-.1V16.68a3.27,3.27,0,0,0,0-.54.73.73,0,0,0-.58-.61.86.86,0,0,0-1,.36,1.12,1.12,0,0,0-.15.62q0,1.39,0,2.79c0,.1,0,.12-.13.12q-.87,0-1.74,0c-.08,0-.1,0-.1-.1V14.21c0-.08,0-.1.11-.1H6c.08,0,.1,0,.1.1s0,.36,0,.55Zm14.62,2.29a3.65,3.65,0,0,0-.11-1,2.5,2.5,0,0,0-1.81-1.9,3.93,3.93,0,0,0-2.35,0,2.5,2.5,0,0,0-1.36,1,3,3,0,0,0-.38,2.17,2.56,2.56,0,0,0,1.72,2,4,4,0,0,0,1.5.22,4.14,4.14,0,0,0,.87-.1,2.36,2.36,0,0,0,1.81-1.61c0-.08,0-.1-.07-.1H18.82c-.07,0-.1,0-.14.07a.93.93,0,0,1-.52.37,1.47,1.47,0,0,1-.88,0,.88.88,0,0,1-.62-.67,1.64,1.64,0,0,1-.05-.32c0-.11,0-.12.1-.12h3.88C20.64,17.12,20.69,17.12,20.69,17.05Zm-1.91-1h-2c-.06,0-.08,0-.07-.08a1,1,0,0,1,1-.83,1.18,1.18,0,0,1,.77.18,1.12,1.12,0,0,1,.42.66C18.87,16.07,18.82,16.05,18.78,16.05Zm3-10.15a1.67,1.67,0,0,0-1.81-.3,2.7,2.7,0,0,0-.34.17L16.32,8.16a1.15,1.15,0,0,0-.48.73.82.82,0,0,0,.24.75,1.74,1.74,0,0,0,2,.28c.42-.25,3.2-2.31,3.66-2.64l.11-.12a1,1,0,0,0-.06-1.26ZM7.92,9.58a.82.82,0,0,0,.24-.75,1.19,1.19,0,0,0-.48-.74L4.39,5.71a1.83,1.83,0,0,0-.34-.18,1.68,1.68,0,0,0-1.8.31,1,1,0,0,0-.06,1.25l.11.12C2.76,7.55,5.54,9.6,6,9.86a1.76,1.76,0,0,0,2-.28ZM12,8.94A1.4,1.4,0,0,0,13.48,8a1.07,1.07,0,0,0,0-.25l0-2.14V5.58c0-.82-.66-1.2-1.49-1.2s-1.5.44-1.51,1.26V7.79a1,1,0,0,0,0,.25,1.35,1.35,0,0,0,1.47.9Zm4.34,1.62a10.11,10.11,0,0,0-4.51-.9c-3.23,0-5.39,1-6.49,2.5h13a5.75,5.75,0,0,0-2-1.6Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/helloasso.svg b/app/Views/_assets/icons/funding/helloasso.svg
new file mode 100755
index 0000000000..a16faf738a
--- /dev/null
+++ b/app/Views/_assets/icons/funding/helloasso.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M9.74,3c7.35.4,6.31,7.57,6.31,7.57A7.62,7.62,0,0,0,9.56,7.08c-3.39.08-7,2.61-7.06,7.71A8,8,0,0,1,2,12.14C2.14,5.71,7,2.83,9.74,3Zm7.11.07a8,8,0,0,0-2.56-.81c4.48,2.43,5,6.84,3.43,9.87a7.61,7.61,0,0,1-6.13,4.07s5.83,4.32,9.66-2C22.7,11.83,22.45,6.23,16.85,3.05ZM17,20.32a8,8,0,0,0,2-1.77c-4.4,2.58-8.43.73-10.23-2.15a7.64,7.64,0,0,1-.32-7.35s-6.7,2.76-3.3,9.28C6.44,20.8,11.37,23.48,17,20.32Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/indiegogo.svg b/app/Views/_assets/icons/funding/indiegogo.svg
new file mode 100755
index 0000000000..0d6240d3fb
--- /dev/null
+++ b/app/Views/_assets/icons/funding/indiegogo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.08,15.11c-1.66,0-1.88-1.14-1.88-3s.22-3,1.88-3,1.87,1.14,1.87,3S18.72,15.11,17.08,15.11Zm0-8.87C12.89,6.24,12.14,9,12.14,12s.75,5.75,4.94,5.75S22,15,22,12s-.73-5.77-4.92-5.77m-10.7,7H8.32v.2c0,1.24,0,1.79-1.44,1.79S5,14.63,5,12.1s.79-3,2-3a4,4,0,0,1,2,.51l1.61-2.5a6.61,6.61,0,0,0-3.5-.91C3.25,6.24,2,8.1,2,12c0,3.4.91,5.75,4.6,5.75a9.41,9.41,0,0,0,1.7-.13h2.77V10.84H6.71l-.33,2.44"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/kickstarter.svg b/app/Views/_assets/icons/funding/kickstarter.svg
new file mode 100755
index 0000000000..2f055f75e7
--- /dev/null
+++ b/app/Views/_assets/icons/funding/kickstarter.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21,17.52a4.6,4.6,0,0,1-8.33,2.56l-.94-1.33A4.21,4.21,0,0,1,7.47,22,4.44,4.44,0,0,1,3,17.56V6.44A4.42,4.42,0,0,1,7.47,2a4.27,4.27,0,0,1,4.29,3.38l1.08-1.46A4.63,4.63,0,0,1,16.53,2,4.4,4.4,0,0,1,21,6.38,4.35,4.35,0,0,1,20.16,9L18,12l2.15,3A4.44,4.44,0,0,1,21,17.52Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/kisskissbankbank.svg b/app/Views/_assets/icons/funding/kisskissbankbank.svg
new file mode 100755
index 0000000000..f3041450f1
--- /dev/null
+++ b/app/Views/_assets/icons/funding/kisskissbankbank.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15,6.84a7.54,7.54,0,1,0-.09,10.42L9.77,12.09Zm4.86,5.23A2.54,2.54,0,1,0,17.7,7.73h0l-4.33,4.34,4.23,4.23a2.55,2.55,0,1,0,2.3-4.24"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/liberapay.svg b/app/Views/_assets/icons/funding/liberapay.svg
new file mode 100755
index 0000000000..e3e261bca4
--- /dev/null
+++ b/app/Views/_assets/icons/funding/liberapay.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M8.12,18.36A5.69,5.69,0,0,1,5.79,18a2.41,2.41,0,0,1-1.2-1,3,3,0,0,1-.36-1.53,8.94,8.94,0,0,1,.24-1.84l2.65-11L10.34,2,7.45,14a3,3,0,0,0-.09.68,1.12,1.12,0,0,0,.11.56.86.86,0,0,0,.43.38,2.37,2.37,0,0,0,.84.19Zm11.65-6.89a7.55,7.55,0,0,1-.5,2.78,6.68,6.68,0,0,1-1.39,2.17,6.15,6.15,0,0,1-2.12,1.43,7,7,0,0,1-2.69.51,7.5,7.5,0,0,1-1.42-.13L10.71,22H7.63L11.09,7.6A16.73,16.73,0,0,1,13,7.15,13,13,0,0,1,15.31,7a5.08,5.08,0,0,1,2,.36,3.8,3.8,0,0,1,1.39,1,4.06,4.06,0,0,1,.8,1.44,5.9,5.9,0,0,1,.26,1.76Zm-7.56,4.27a4.33,4.33,0,0,0,.88.08,3.51,3.51,0,0,0,1.47-.3,3.22,3.22,0,0,0,1.14-.85,4,4,0,0,0,.73-1.3,5.18,5.18,0,0,0,.26-1.67,2.79,2.79,0,0,0-.4-1.52,1.48,1.48,0,0,0-1.37-.63,6.15,6.15,0,0,0-1.25.13Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/patreon.svg b/app/Views/_assets/icons/funding/patreon.svg
new file mode 100755
index 0000000000..0c02798fa1
--- /dev/null
+++ b/app/Views/_assets/icons/funding/patreon.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15,17a7.5,7.5,0,1,1,7.5-7.5A7.5,7.5,0,0,1,15,17ZM2,2H6V22H2Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/paypal.svg b/app/Views/_assets/icons/funding/paypal.svg
new file mode 100755
index 0000000000..5e055a78a8
--- /dev/null
+++ b/app/Views/_assets/icons/funding/paypal.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M20.07,8.48a4.89,4.89,0,0,1,.3,3.32c-.74,3.81-3.28,5.12-6.52,5.12h-.5a.81.81,0,0,0-.79.68l0,.22-.63,4,0,.17a.81.81,0,0,1-.8.68H7.72a.48.48,0,0,1-.48-.49v-.07L7.42,21H8.94l1-6h1.38C16,15,19,12.78,20.07,8.48Zm-3-5.09a3.62,3.62,0,0,1,.75,3.28L17.8,7c-.74,3.78-3.09,5.45-7,5.45H9a1.42,1.42,0,0,0-1.36,1h0l-.93,5.89H3.12a0,0,0,0,1-.05-.05h0L5.67,2.8A1,1,0,0,1,6.61,2h6c2.19,0,3.72.47,4.53,1.39Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/tipeee.svg b/app/Views/_assets/icons/funding/tipeee.svg
new file mode 100755
index 0000000000..2984b9b3de
--- /dev/null
+++ b/app/Views/_assets/icons/funding/tipeee.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12.7,14h-.62V7.58a.2.2,0,0,0-.19-.2l-3.3,1a.27.27,0,0,0-.19.29v1.89a.19.19,0,0,0,.19.19l.59-.17V14H8.56a.19.19,0,0,0-.19.19v2a.19.19,0,0,0,.19.2h4.15a.2.2,0,0,0,.19-.2v-2a.2.2,0,0,0-.2-.19ZM10.63,7.09A1.45,1.45,0,1,0,9.18,5.64a1.45,1.45,0,0,0,1.45,1.45Zm-3.42.29H5.69V5.26s0-.55-.53-.35-1.94.6-1.94.6A.42.42,0,0,0,2.9,6c0,.34,0,.54,0,1.41H2.19a.2.2,0,0,0-.19.2v2a.2.2,0,0,0,.19.19h.73v4.32s-.17,3.49,4.24,1.77c0,0,.23-.12.24-.31V13.61s0-.29-.27-.16c0,0-1.44.65-1.44-.29V9.75H7.21a.2.2,0,0,0,.2-.2v-2a.2.2,0,0,0-.2-.19Zm10.88,0a3.56,3.56,0,0,0-1.34.27V7.57a.2.2,0,0,0-.2-.2H13.21a.2.2,0,0,0-.2.2v2a.2.2,0,0,0,.2.2h.63v7.69h-.63a.19.19,0,0,0-.2.19v2a.2.2,0,0,0,.2.2h4.16a.19.19,0,0,0,.19-.2v-2a.19.19,0,0,0-.19-.19h-.62V16.05a3.56,3.56,0,0,0,1.34.27A4.22,4.22,0,0,0,22,11.85,4.22,4.22,0,0,0,18.09,7.38ZM18.14,14c-.78,0-1.4-1-1.39-2.16s.63-2.15,1.41-2.14,1.39,1,1.39,2.16S18.91,14,18.14,14Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/funding/ulule.svg b/app/Views/_assets/icons/funding/ulule.svg
new file mode 100755
index 0000000000..c4231b3e3b
--- /dev/null
+++ b/app/Views/_assets/icons/funding/ulule.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.88,6.22a.42.42,0,0,0-.59,0h0l-.69.68a10,10,0,0,0-17.2,0l-.69-.68a.42.42,0,0,0-.59,0,.45.45,0,0,0-.12.3V12a10,10,0,0,0,20,0V6.52A.42.42,0,0,0,21.88,6.22ZM16.32,17.57a4.6,4.6,0,0,1-4.09-2.49.26.26,0,0,0-.35-.1.24.24,0,0,0-.1.1,4.62,4.62,0,1,1,0-4.15,2.28,2.28,0,0,0,.11,3.13.1.1,0,0,0,.14,0,2.28,2.28,0,0,0,.11-3.13,4.61,4.61,0,1,1,4.13,6.64Zm.16-8.2Zm-6.25,2.91a2.91,2.91,0,1,1-3.1-2.9c0,.13-.1.21-.21.32l0,0a.79.79,0,0,0-.28.58.73.73,0,0,0,1.45,0,.76.76,0,0,0-.29-.6.78.78,0,0,1-.26-.34A2.9,2.9,0,0,1,10.23,12.28Zm9.34,0a2.91,2.91,0,1,1-3.11-2.9c0,.13-.1.21-.21.32l0,0a.82.82,0,0,0-.28.58.74.74,0,0,0,.7.7.73.73,0,0,0,.75-.7.76.76,0,0,0-.29-.6c-.12-.11-.24-.23-.25-.34A2.9,2.9,0,0,1,19.57,12.28Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/group.svg b/app/Views/_assets/icons/group.svg
old mode 100644
new mode 100755
index fff529099d..5c2f10ee22
--- a/app/Views/_assets/icons/group.svg
+++ b/app/Views/_assets/icons/group.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M2 22a8 8 0 1 1 16 0h-2a6 6 0 1 0-12 0H2zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm8.284 3.703A8.002 8.002 0 0 1 23 22h-2a6.001 6.001 0 0 0-3.537-5.473l.82-1.824zm-.688-11.29A5.5 5.5 0 0 1 21 8.5a5.499 5.499 0 0 1-5 5.478v-2.013a3.5 3.5 0 0 0 1.041-6.609l.555-1.943z"/>
+        <path d="M2 22a8 8 0 1 1 16 0H2zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm7.363 2.233A7.505 7.505 0 0 1 22.983 22H20c0-2.61-1-4.986-2.637-6.767zm-2.023-2.276A7.98 7.98 0 0 0 18 7a7.964 7.964 0 0 0-1.015-3.903A5 5 0 0 1 21 8a4.999 4.999 0 0 1-5.66 4.957z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/heart.svg b/app/Views/_assets/icons/heart.svg
new file mode 100755
index 0000000000..f10aafa427
--- /dev/null
+++ b/app/Views/_assets/icons/heart.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0H24V24H0z"/>
+        <path d="M16.5 3C19.538 3 22 5.5 22 9c0 7-7.5 11-10 12.5C9.5 20 2 16 2 9c0-3.5 2.5-6 5.5-6C9.36 3 11 4 12 5c1-1 2.64-2 4.5-2z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/line-chart.svg b/app/Views/_assets/icons/line-chart.svg
old mode 100644
new mode 100755
index c3080e57c7..dc43cd7ddf
--- a/app/Views/_assets/icons/line-chart.svg
+++ b/app/Views/_assets/icons/line-chart.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0H24V24H0z"/>
-        <path d="M5 3v16h16v2H3V3h2zm15.293 3.293l1.414 1.414L16 13.414l-3-2.999-4.293 4.292-1.414-1.414L13 7.586l3 2.999 4.293-4.292z"/>
+        <path d="M5 3v16h16v2H3V3h2zm14.94 2.94l2.12 2.12L16 14.122l-3-3-3.94 3.94-2.12-2.122L13 6.88l3 3 3.94-3.94z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/link.svg b/app/Views/_assets/icons/link.svg
new file mode 100755
index 0000000000..3b7c8e0697
--- /dev/null
+++ b/app/Views/_assets/icons/link.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M18.364 15.536L16.95 14.12l1.414-1.414a5 5 0 1 0-7.071-7.071L9.879 7.05 8.464 5.636 9.88 4.222a7 7 0 0 1 9.9 9.9l-1.415 1.414zm-2.828 2.828l-1.415 1.414a7 7 0 0 1-9.9-9.9l1.415-1.414L7.05 9.88l-1.414 1.414a5 5 0 1 0 7.071 7.071l1.414-1.414 1.415 1.414zm-.708-10.607l1.415 1.415-7.071 7.07-1.415-1.414 7.071-7.07z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/links.svg b/app/Views/_assets/icons/links.svg
deleted file mode 100644
index 3bff86576e..0000000000
--- a/app/Views/_assets/icons/links.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M13.06 8.11l1.415 1.415a7 7 0 0 1 0 9.9l-.354.353a7 7 0 0 1-9.9-9.9l1.415 1.415a5 5 0 1 0 7.071 7.071l.354-.354a5 5 0 0 0 0-7.07l-1.415-1.415 1.415-1.414zm6.718 6.011l-1.414-1.414a5 5 0 1 0-7.071-7.071l-.354.354a5 5 0 0 0 0 7.07l1.415 1.415-1.415 1.414-1.414-1.414a7 7 0 0 1 0-9.9l.354-.353a7 7 0 0 1 9.9 9.9z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/map-pin.svg b/app/Views/_assets/icons/map-pin.svg
index 8e2366f3b9..5950f05602 100644
--- a/app/Views/_assets/icons/map-pin.svg
+++ b/app/Views/_assets/icons/map-pin.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17.657 15.657L12 21.314l-5.657-5.657a8 8 0 1 1 11.314 0zM5 22h14v2H5v-2z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M18.364 17.364L12 23.728l-6.364-6.364a9 9 0 1 1 12.728 0zM12 13a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/menu.svg b/app/Views/_assets/icons/menu.svg
old mode 100644
new mode 100755
diff --git a/app/Views/_assets/icons/mic.svg b/app/Views/_assets/icons/mic.svg
old mode 100644
new mode 100755
index 836c580d13..becff50cfb
--- a/app/Views/_assets/icons/mic.svg
+++ b/app/Views/_assets/icons/mic.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M12 3a3 3 0 0 0-3 3v6a3 3 0 0 0 6 0V6a3 3 0 0 0-3-3zm0-2a5 5 0 0 1 5 5v6a5 5 0 0 1-10 0V6a5 5 0 0 1 5-5zM2.192 13.962l1.962-.393a8.003 8.003 0 0 0 15.692 0l1.962.393C20.896 18.545 16.85 22 12 22s-8.896-3.455-9.808-8.038z"/>
+        <path d="M12 1a5 5 0 0 1 5 5v4a5 5 0 0 1-10 0V6a5 5 0 0 1 5-5zM3.055 11H5.07a7.002 7.002 0 0 0 13.858 0h2.016A9.004 9.004 0 0 1 13 18.945V23h-2v-4.055A9.004 9.004 0 0 1 3.055 11z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/more.svg b/app/Views/_assets/icons/more.svg
old mode 100644
new mode 100755
index d77a746cbe..5f6b5dba6a
--- a/app/Views/_assets/icons/more.svg
+++ b/app/Views/_assets/icons/more.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M12 3c-.825 0-1.5.675-1.5 1.5S11.175 6 12 6s1.5-.675 1.5-1.5S12.825 3 12 3zm0 15c-.825 0-1.5.675-1.5 1.5S11.175 21 12 21s1.5-.675 1.5-1.5S12.825 18 12 18zm0-7.5c-.825 0-1.5.675-1.5 1.5s.675 1.5 1.5 1.5 1.5-.675 1.5-1.5-.675-1.5-1.5-1.5z"/>
+        <path d="M5 10c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm14 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm-7 0c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/movie.svg b/app/Views/_assets/icons/movie.svg
old mode 100644
new mode 100755
index a3eaa1b73d..f92dd60fc6
--- a/app/Views/_assets/icons/movie.svg
+++ b/app/Views/_assets/icons/movie.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M2 3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993H2.992A.993.993 0 0 1 2 20.007V3.993zM4 5v14h16V5H4zm6.622 3.415l4.879 3.252a.4.4 0 0 1 0 .666l-4.88 3.252a.4.4 0 0 1-.621-.332V8.747a.4.4 0 0 1 .622-.332z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M2 3.993A1 1 0 0 1 2.992 3h18.016c.548 0 .992.445.992.993v16.014a1 1 0 0 1-.992.993H2.992A.993.993 0 0 1 2 20.007V3.993zm8.622 4.422a.4.4 0 0 0-.622.332v6.506a.4.4 0 0 0 .622.332l4.879-3.252a.4.4 0 0 0 0-.666l-4.88-3.252z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/pages.svg b/app/Views/_assets/icons/pages.svg
old mode 100644
new mode 100755
index e33ed93fda..3d28c4005c
--- a/app/Views/_assets/icons/pages.svg
+++ b/app/Views/_assets/icons/pages.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M5 8v12h14V8H5zm0-2h14V4H5v2zm15 16H4a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v18a1 1 0 0 1-1 1zM7 10h4v4H7v-4zm0 6h10v2H7v-2zm6-5h4v2h-4v-2z"/>
+        <path d="M20 22H4a1 1 0 0 1-1-1V8h18v13a1 1 0 0 1-1 1zm1-16H3V3a1 1 0 0 1 1-1h16a1 1 0 0 1 1 1v3zM7 11v4h4v-4H7zm0 6v2h10v-2H7zm6-5v2h4v-2h-4z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/podcasting/amazon.svg b/app/Views/_assets/icons/podcasting/amazon.svg
new file mode 100755
index 0000000000..82ba8b7997
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/amazon.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M22,18.23a4.28,4.28,0,0,1-1.32,2.9c-.18.14-.36.06-.28-.15.26-.65.87-2.14.58-2.49s-1-.24-1.73-.18c-.33,0-.61.06-.83.1s-.25-.16,0-.3a3.36,3.36,0,0,1,.87-.43,3.87,3.87,0,0,1,2.67.09.84.84,0,0,1,.08.46Zm-1.92,1.29a7,7,0,0,1-.83.55A14.69,14.69,0,0,1,12,22,14.57,14.57,0,0,1,2.1,18.23c-.22-.18,0-.45.22-.3a19.85,19.85,0,0,0,9.89,2.63,19.55,19.55,0,0,0,7-1.34l.5-.2C20.12,18.85,20.44,19.26,20.08,19.52Zm-6.17-11a3.85,3.85,0,0,0-.31-2.18A1.7,1.7,0,0,0,12,5.66a2,2,0,0,0-1.87,1.53.55.55,0,0,1-.44.48L7.29,7.36a.4.4,0,0,1-.35-.52C7.46,4.09,9.81,3.13,12,3h.53a5.89,5.89,0,0,1,3.79,1.26c1.21,1.14,1.08,2.67,1.08,4.32v3.93a3.24,3.24,0,0,0,1,2.31.48.48,0,0,1,0,.66c-.48.43-1.4,1.22-1.92,1.65a.57.57,0,0,1-.61.05,6.86,6.86,0,0,1-1.43-1.66A5.45,5.45,0,0,1,12,17.13a7.11,7.11,0,0,1-1.78.22A3.56,3.56,0,0,1,6.5,13.47a4.2,4.2,0,0,1,2.7-4.1,15.59,15.59,0,0,1,4.7-.88Zm-.48,5.2c.52-.88.47-1.59.47-3.19a8.6,8.6,0,0,0-1.87.18A2.29,2.29,0,0,0,10.16,13c0,1.09.57,1.84,1.52,1.84a1.18,1.18,0,0,0,.35,0A2,2,0,0,0,13.43,13.69Z"/><path d="M0,0H24V24H0Z" fill="none"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/antennapod.svg b/app/Views/_assets/icons/podcasting/antennapod.svg
new file mode 100755
index 0000000000..26e9699d39
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/antennapod.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12.06,2.52A8.55,8.55,0,0,0,4.82,6.4,9.93,9.93,0,0,0,3.69,9a8.64,8.64,0,0,0,2.69,8.59,10.55,10.55,0,0,0,1,.73,3.82,3.82,0,0,0,.24-.61c.12-.34.21-.64.21-.66a1.08,1.08,0,0,0-.21-.19,8.14,8.14,0,0,1-1.2-1.16,7.2,7.2,0,0,1-1.62-4.61A7,7,0,0,1,5.5,7.88a7.23,7.23,0,0,1,5.49-4,8.62,8.62,0,0,1,2,0,7.27,7.27,0,0,1,6.17,6.17,9.1,9.1,0,0,1,0,1.88,7.35,7.35,0,0,1-1.62,3.76,9.94,9.94,0,0,1-1.14,1.11,1.31,1.31,0,0,0-.23.21s.1.31.22.64l.22.61.26-.17a8.18,8.18,0,0,0,1.14-1,8,8,0,0,0,1.62-2.25,8.58,8.58,0,0,0,.69-5.71A8.4,8.4,0,0,0,18.12,5.1a8.39,8.39,0,0,0-6.06-2.58ZM12,5.83a4.59,4.59,0,0,0-1.64.25A5.52,5.52,0,0,0,7.54,8.26a6.34,6.34,0,0,0-.74,1.93,7.2,7.2,0,0,0,0,1.67,5.44,5.44,0,0,0,1,2.39,5.31,5.31,0,0,0,.71.77,6.13,6.13,0,0,0,.26-.65c.12-.36.23-.67.23-.69a1.41,1.41,0,0,0-.17-.26,3.84,3.84,0,0,1-.75-2.36,3.68,3.68,0,0,1,.52-2,3.95,3.95,0,0,1,7,3.7,3.51,3.51,0,0,1-.36.61l-.19.26.17.44c.09.24.19.54.24.67a.74.74,0,0,0,.1.23,6.13,6.13,0,0,0,.8-.89,5.44,5.44,0,0,0,.85-2,5.14,5.14,0,0,0-.4-3.33,4.74,4.74,0,0,0-1-1.47,5.07,5.07,0,0,0-2.08-1.29A4.51,4.51,0,0,0,12,5.83Zm0,3.28a1.93,1.93,0,0,0-1.38.59A1.84,1.84,0,0,0,10,11.2a1.92,1.92,0,0,0,.44,1.14l.15.19-.11.3c0,.16-.49,1.4-1,2.75S8.36,18.92,8,20s-.64,1.8-.7,1.95a12.15,12.15,0,0,0,1.57.55L9,22c.1-.27.34-1,.55-1.55l.37-1H10l.55.1a6.71,6.71,0,0,0,1.43.08,6.43,6.43,0,0,0,1.41-.08l.54-.1.1,0L14.62,21c.27.78.5,1.44.53,1.54A12.34,12.34,0,0,0,16.73,22h0S16,19.89,15.1,17.39l-1.66-4.7-.06-.16.17-.22a2,2,0,0,0,.22-2.12,2.32,2.32,0,0,0-.87-.86A2,2,0,0,0,12,9.11Zm0,4.51s1.5,4.12,1.51,4.21a7.6,7.6,0,0,1-2.09.16,5.39,5.39,0,0,1-.9-.15S12,13.67,12,13.62Z" fill-opacity="0.88"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/apple.svg b/app/Views/_assets/icons/podcasting/apple.svg
new file mode 100755
index 0000000000..358ce6f5ab
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/apple.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M11.36,22.27c-.77-.28-.94-.65-1.25-2.84-.37-2.54-.45-4.11-.23-4.61a2.11,2.11,0,0,1,2.11-1,2.09,2.09,0,0,1,2.12,1c.21.5.13,2.07-.24,4.61-.24,1.78-.38,2.23-.72,2.53a1.78,1.78,0,0,1-1.78.31ZM8.08,19.66a9,9,0,0,1-5-6.45,11.9,11.9,0,0,1,0-3.26A9.05,9.05,0,0,1,5.43,5.33,9,9,0,0,1,18.5,5.26,8.83,8.83,0,0,1,20.92,10a12.6,12.6,0,0,1,0,3.07,9.08,9.08,0,0,1-3.47,5.68A10.5,10.5,0,0,1,15,20.08c-.09,0-.1-.1-.06-.5.08-.63.16-.76.52-.92a8.2,8.2,0,0,0,4.31-5.33,10.13,10.13,0,0,0-.06-3.76,8,8,0,0,0-6-5.74,9.67,9.67,0,0,0-3.22,0A8.06,8.06,0,0,0,4.33,9.76a10.76,10.76,0,0,0,0,3.58,8.27,8.27,0,0,0,3.42,4.84,7,7,0,0,0,.89.5c.36.16.43.29.5.92,0,.39,0,.5-.06.5a6.76,6.76,0,0,1-1-.41Zm0-3.49A6.54,6.54,0,0,1,6.1,13a7.36,7.36,0,0,1,0-2.92A6.3,6.3,0,0,1,10.2,5.72a7.57,7.57,0,0,1,3.13-.12A6.12,6.12,0,0,1,18,12.23a6,6,0,0,1-1.3,3.09,5.44,5.44,0,0,1-1.39,1.23,2.06,2.06,0,0,1-.05-.65v-.64l.44-.54a4.87,4.87,0,0,0-.27-6.67,4.66,4.66,0,0,0-2.6-1.34,3.25,3.25,0,0,0-1.55,0A4.71,4.71,0,0,0,8.6,8.05a4.88,4.88,0,0,0-.28,6.67l.44.54v.65a1.9,1.9,0,0,1-.06.65,3,3,0,0,1-.55-.39Zm3-3.51a2,2,0,0,1-1.19-1.9,2.1,2.1,0,0,1,1.2-1.87,2.28,2.28,0,0,1,1.81,0A2.35,2.35,0,0,1,14,10.25a2.08,2.08,0,0,1-2.91,2.41Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/blubrry.svg b/app/Views/_assets/icons/podcasting/blubrry.svg
new file mode 100755
index 0000000000..d3db4e2575
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/blubrry.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15.84,4.47s.92-2.09.87-2.13-2.1,1.25-2.1,1.25S12.11,1.66,12,1.66,9.74,3.43,9.74,3.43,7.47,1.78,7.41,1.84s.74,2.65.74,2.65a8.83,8.83,0,0,0-5.62,8.13,9.26,9.26,0,0,0,9.47,9,9.16,9.16,0,0,0,9.47-9A8.88,8.88,0,0,0,15.84,4.47Zm.93,8.12a4.45,4.45,0,0,0-2.56-3.93l.35-.88a5.39,5.39,0,0,1,3.19,4.81Zm2.14,0A6.47,6.47,0,0,0,15,6.74l.5-1.26a7.81,7.81,0,0,1,4.86,7.11Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/breaker.svg b/app/Views/_assets/icons/podcasting/breaker.svg
new file mode 100755
index 0000000000..98fe46f349
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/breaker.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M13.3,13.07a1.91,1.91,0,0,1,.48,0,2.51,2.51,0,0,1,1.88,1.63c.08.26.19.66.26.93l.09.37h.38a5.49,5.49,0,0,0,5.38-5.46c0-4.52-3.77-8.28-9.54-8.28A10.16,10.16,0,0,0,5.9,4.56,10,10,0,0,0,2.23,12.3a10.64,10.64,0,0,0,.28,2.35,10,10,0,0,0,9.72,7.65,11.07,11.07,0,0,0,1.3-.08A10,10,0,0,0,20,18.6l.1-.12-.2-.73-.38.1a14.32,14.32,0,0,1-3.72.48,14.14,14.14,0,0,1-3-.31,2.51,2.51,0,0,1-1.87-1.65,2.51,2.51,0,0,1,.48-2.44A2.5,2.5,0,0,1,13.3,13.07ZM12.23,3.24c5.34,0,8.6,3.42,8.6,7.34a4.55,4.55,0,0,1-4.1,4.5c-.06-.22-.13-.45-.18-.62a15.25,15.25,0,0,0-9.36-9.7A8.79,8.79,0,0,1,12.23,3.24ZM3.17,12.3A9,9,0,0,1,6.3,5.45a14.35,14.35,0,0,1,8.38,7A3.26,3.26,0,0,0,14,12.2a15.86,15.86,0,0,0-3.17-.33,15.65,15.65,0,0,0-7.51,1.94A9.33,9.33,0,0,1,3.17,12.3Zm9.44,6.64a15.9,15.9,0,0,0,3.19.33,16.77,16.77,0,0,0,2.46-.19,9,9,0,0,1-4.6,2.17,13.91,13.91,0,0,1-1.73-2.52A3.83,3.83,0,0,0,12.61,18.94Zm-.07,2.42h-.31a8.82,8.82,0,0,1-4.16-1A14.24,14.24,0,0,1,9.88,16a4.07,4.07,0,0,0,.16.71A15.68,15.68,0,0,0,12.54,21.36Zm-1.83-8a15.6,15.6,0,0,0-3.48,6.55,9,9,0,0,1-3.72-5.1,14.27,14.27,0,0,1,7.29-1.95h.44A3.57,3.57,0,0,0,10.71,13.31Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/castbox.svg b/app/Views/_assets/icons/podcasting/castbox.svg
new file mode 100755
index 0000000000..f3b4a19722
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/castbox.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M14.42,6.47a1.07,1.07,0,0,0-1.11,1.06v2.56c0,.33-.28.55-.67.55a.63.63,0,0,1-.67-.55V6.64a1.11,1.11,0,0,0-1.11-1.06A1.07,1.07,0,0,0,9.75,6.64V9.41c0,.34-.28.56-.67.56a.63.63,0,0,1-.66-.56v-1a1.1,1.1,0,0,0-1.11-1,1.07,1.07,0,0,0-1.12,1V10.8a.58.58,0,0,1-.66.56.63.63,0,0,1-.67-.56v-.27a1.11,1.11,0,1,0-2.22-.08v3.41a1.11,1.11,0,0,0,2.22,0v-.28c0-.33.28-.55.67-.55a.61.61,0,0,1,.66.55v3.78a1.11,1.11,0,0,0,1.12,1.06,1.07,1.07,0,0,0,1.11-1.06V12.2a.58.58,0,0,1,.66-.56.63.63,0,0,1,.67.56v2.55a1.1,1.1,0,0,0,1.11,1.06A1.07,1.07,0,0,0,12,14.75V12.86c0-.33.28-.55.67-.55a.63.63,0,0,1,.67.55v2.06A1.11,1.11,0,0,0,14.42,16a1.07,1.07,0,0,0,1.11-1.06V7.53a1.11,1.11,0,0,0-1.11-1.06M18,9.36a1.07,1.07,0,0,0-1.11,1.06v4.22A1.1,1.1,0,0,0,18,15.7a1.07,1.07,0,0,0,1.11-1.06V10.42A1.07,1.07,0,0,0,18,9.36m3.56,2.11a1.07,1.07,0,0,0-1.11,1.06v1.06a1.1,1.1,0,0,0,1.11,1.06,1.07,1.07,0,0,0,1.11-1.06V12.53a1.07,1.07,0,0,0-1.11-1.06" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/castopod.svg b/app/Views/_assets/icons/podcasting/castopod.svg
new file mode 100755
index 0000000000..ff91790c9d
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/castopod.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.13,11.69a1.28,1.28,0,0,1-.26.8,2.91,2.91,0,0,0-1.09-.3,2.12,2.12,0,0,0-1.15.35,1.36,1.36,0,0,1-.29-.85,1.4,1.4,0,1,1,2.79,0ZM8.26,10.28a1.39,1.39,0,0,0-1.14,2.2,2.84,2.84,0,0,1,1.09-.3,2.12,2.12,0,0,1,1.15.35,1.36,1.36,0,0,0,.29-.85A1.39,1.39,0,0,0,8.26,10.28ZM22,7.19V17.8a1.34,1.34,0,0,1-1.34,1.35H17.17s-.36-.65-.49-.86a.57.57,0,0,0-.45-.19H7.75a.54.54,0,0,0-.46.19c-.17.23-.5.86-.5.86H3.35A1.35,1.35,0,0,1,2,17.81V7.2A1.35,1.35,0,0,1,3.34,5.85H20.65A1.35,1.35,0,0,1,22,7.19Zm-2.6,4.39a2.82,2.82,0,0,0-2.84-2.86H7.43a2.85,2.85,0,0,0,0,5.7h9.13A2.84,2.84,0,0,0,19.4,11.58Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/castro.svg b/app/Views/_assets/icons/podcasting/castro.svg
new file mode 100755
index 0000000000..d3716c8e1e
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/castro.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2h0A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,11.67a1.73,1.73,0,1,1,1.72-1.73A1.72,1.72,0,0,1,12,13.67Zm4.17,4L14.5,15.39a4.25,4.25,0,1,0-4.94,0L7.89,17.72a7.12,7.12,0,1,1,11.28-5.78A7.37,7.37,0,0,1,16.17,17.72Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/chartable.svg b/app/Views/_assets/icons/podcasting/chartable.svg
new file mode 100755
index 0000000000..6383bbfc6f
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/chartable.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M7.64,19.53a7.62,7.62,0,0,1-1.95-.36,5.47,5.47,0,0,1-2.47-1.63A5.89,5.89,0,0,1,2,13.2,8.75,8.75,0,0,1,3,9.59,7,7,0,0,1,4.38,7.65,6.18,6.18,0,0,1,7.82,6,7.11,7.11,0,0,1,9.8,6a2.89,2.89,0,0,1,2.07,1.6A3.44,3.44,0,0,1,11.62,11a1,1,0,0,1-.71.31.92.92,0,0,1-.9-.36,1.36,1.36,0,0,1-.06-1,3.21,3.21,0,0,0,.07-1C9.9,8.1,9.35,7.72,8.38,7.77c-2,.09-3.51,1.85-3.91,4.41a7,7,0,0,0,.11,3,3.16,3.16,0,0,0,.9,1.45,4.21,4.21,0,0,0,3.1,1,9.81,9.81,0,0,0,3.78-.79l.42-.16,0-.33c0-.18,0-.57,0-.87a27.41,27.41,0,0,1,.52-4.86c.54-2.76,1.55-5,2.57-5.71a2,2,0,0,1,1.57-.39A1.78,1.78,0,0,1,18.7,5.85a2.67,2.67,0,0,1,.09.77c.06,2.08-1,4.14-3.64,7.11l-.35.39,0,.35c0,.19,0,.54,0,.78v.44l.14-.33a6,6,0,0,1,2.48-3.09c.77-.38,1.51-.33,1.82.12s.23.93-.19,3c-.29,1.44-.33,1.79-.23,2.12s.4.34.74.17A6,6,0,0,0,21,16.29c.27-.31.38-.39.57-.39s.44.2.46.68a1.57,1.57,0,0,1-.17.86,7.38,7.38,0,0,1-1.49,1.46,3.08,3.08,0,0,1-1.52.62,1.57,1.57,0,0,1-2-1.13,2.76,2.76,0,0,1-.05-.69,9.31,9.31,0,0,1,.28-2c.18-.94.17-1.18,0-1.2s-.13,0-.28.16a8.75,8.75,0,0,0-1.65,3.46,2.14,2.14,0,0,1-.43,1,1.39,1.39,0,0,1-1.08.45c-.27,0-.31,0-.44-.09a.71.71,0,0,1-.32-.58l0-.22-.38.13a11.51,11.51,0,0,1-2.94.69,14.78,14.78,0,0,1-1.84.06Zm7.7-7.89c1.28-1.68,2-3.62,1.88-4.86,0-.36-.08-.49-.19-.61s-.46-.09-.73.46a15.26,15.26,0,0,0-1,3.44c-.09.47-.31,1.86-.31,2s0,.05.35-.39Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/deezer.svg b/app/Views/_assets/icons/podcasting/deezer.svg
new file mode 100755
index 0000000000..869b06ef07
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/deezer.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.37,5.47H21.7V8H17.37Zm0,3.51H21.7v2.53H17.37Zm0,3.51H21.7V15H17.37ZM1.7,16H6v2.53H1.7Zm5.22,0h4.33v2.53H6.92Zm5.23,0h4.33v2.53H12.15Zm5.22,0H21.7v2.53H17.37Zm-5.22-3.51h4.33V15H12.15Zm-5.23,0h4.33V15H6.92ZM6.92,9h4.33v2.53H6.92Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/fyyd.svg b/app/Views/_assets/icons/podcasting/fyyd.svg
new file mode 100755
index 0000000000..f8b6518caa
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/fyyd.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2,12A10,10,0,1,1,12,22,10,10,0,0,1,2,12Zm8.16,6.5a.85.85,0,0,0,1.18,0l5.91-5.91a.83.83,0,0,0,0-1.17L11.34,5.5a.85.85,0,0,0-1.18,0L8.84,6.83A.82.82,0,0,0,8.84,8l4,4-4,4a.82.82,0,0,0,0,1.17Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/google.svg b/app/Views/_assets/icons/podcasting/google.svg
new file mode 100755
index 0000000000..51056db8e6
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/google.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M3.22,10.08A1.24,1.24,0,0,0,2,11.31V12.7a1.22,1.22,0,0,0,2.44,0h0V11.31A1.17,1.17,0,0,0,3.22,10.08Zm17.56,0a1.23,1.23,0,0,0-1.22,1.23V12.7a1.21,1.21,0,0,0,1.22,1.22A1.22,1.22,0,0,0,22,12.7h0V11.31A1.24,1.24,0,0,0,20.78,10.08ZM7.56,14.2a1.24,1.24,0,0,0-1.23,1.23v1.4a1.23,1.23,0,0,0,2.45,0h0v-1.4A1.17,1.17,0,0,0,7.56,14.2ZM7.56,6A1.24,1.24,0,0,0,6.33,7.24V11.7h0a1.23,1.23,0,0,0,2.45,0h0V7.24A1.17,1.17,0,0,0,7.56,6Zm8.88,0a1.24,1.24,0,0,0-1.22,1.23V8.63a1.23,1.23,0,0,0,2.45,0h0V7.24A1.24,1.24,0,0,0,16.44,6ZM12,2a1.23,1.23,0,0,0-1.22,1.23V4.62a1.22,1.22,0,1,0,2.44,0h0V3.23A1.23,1.23,0,0,0,12,2Zm0,16.16a1.22,1.22,0,0,0-1.22,1.22v1.4a1.22,1.22,0,1,0,2.44,0h0v-1.4A1.26,1.26,0,0,0,12,18.16Zm4.44-7a1.23,1.23,0,0,0-1.22,1.22v4.47a1.23,1.23,0,0,0,2.45,0h0V12.36A1.23,1.23,0,0,0,16.44,11.14ZM13.22,8.41a1.22,1.22,0,0,0-2.44,0h0v7.36h0a1.22,1.22,0,1,0,2.44,0h0V8.41Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/ivoox.svg b/app/Views/_assets/icons/podcasting/ivoox.svg
new file mode 100755
index 0000000000..6715e45240
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/ivoox.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2.07a10,10,0,0,0-1.62,19.86c0-2.77,0-6.41,0-9,0-.29,0-.29-.28-.29H7.69c-.17,0-.22-.05-.22-.22q0-1.38,0-2.76c0-.17,0-.23.22-.23,1.6,0,3.21,0,4.82,0a1.64,1.64,0,0,1,.7.22,1.05,1.05,0,0,1,.47,1c0,1.29,0,2.56,0,3.83v7.44A10,10,0,0,0,12,2.07ZM11.91,8.7h-.07a1.76,1.76,0,0,1-1.73-1.82,1.8,1.8,0,0,1,1.83-1.81,1.82,1.82,0,0,1,0,3.63Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/listennotes.svg b/app/Views/_assets/icons/podcasting/listennotes.svg
new file mode 100755
index 0000000000..05f99886cb
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/listennotes.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22.48,21.2a3.61,3.61,0,0,0-.34-.84,7.94,7.94,0,0,0-.84-1.29A13.12,13.12,0,0,0,19,16.81a9.68,9.68,0,0,0-1.46-1l0,0a8.34,8.34,0,0,0,.4-9.31,8.65,8.65,0,0,0-.67-.92A8.32,8.32,0,1,0,4.44,16.21a8.13,8.13,0,0,0,5.32,2.92,8.24,8.24,0,0,0,6.11-1.61.05.05,0,0,0,0,0,9.88,9.88,0,0,0,.91,1.31,13.73,13.73,0,0,0,2,2,10.41,10.41,0,0,0,1.42,1,5.15,5.15,0,0,0,1,.44,1.79,1.79,0,0,0,.69.08.71.71,0,0,0,.37-.12.64.64,0,0,0,.26-.5A1.67,1.67,0,0,0,22.48,21.2ZM10.84,17.46a6.58,6.58,0,0,1,0-13.16h0a6.58,6.58,0,0,1,0,13.16ZM7.62,6.31a7.29,7.29,0,0,1,3,.62,7.77,7.77,0,0,1,4.7,7.17H14.12V14a6.54,6.54,0,0,0-2.86-5.36,6.12,6.12,0,0,0-2.08-.94,5.36,5.36,0,0,0-.89-.16l-.57,0h-.1Zm5.57,8H12a4.39,4.39,0,0,0-1.36-3.18,4.49,4.49,0,0,0-3.2-1.31V8.59a5.8,5.8,0,0,1,5,2.86A5.5,5.5,0,0,1,13.19,14.3ZM7.42,11.71V10.59a3.67,3.67,0,0,1,3.23,1.94,3.42,3.42,0,0,1,.4,1.66H9.94a2.43,2.43,0,0,0-.75-1.76A2.45,2.45,0,0,0,7.42,11.71Zm1.69,2A1.06,1.06,0,1,1,8,12.68a1,1,0,0,1,1.07,1.05Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/overcast.svg b/app/Views/_assets/icons/podcasting/overcast.svg
new file mode 100755
index 0000000000..742522639e
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/overcast.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,22a10,10,0,1,1,.08,0Zm0-3.94.72-.73L12,14.44l-.72,2.89ZM11.06,18l-.39,1.44.89-.88Zm1.88,0-.5.5.89.89Zm.72,2.56L12,18.89l-1.67,1.67a8.51,8.51,0,0,0,1.67.16,5.92,5.92,0,0,0,1.67-.16ZM12,3.22A8.8,8.8,0,0,0,3.22,12a8.65,8.65,0,0,0,5.89,8.22L11,13.28A1.53,1.53,0,0,1,10.33,12,1.67,1.67,0,0,1,12,10.28a1.64,1.64,0,0,1,1.67,1.61v0A1.76,1.76,0,0,1,13,13.28l1.89,6.94A8.71,8.71,0,0,0,20.78,12,8.8,8.8,0,0,0,12,3.22Zm5.72,13.11a.61.61,0,0,1-.89.11.57.57,0,0,1-.11-.83,6.43,6.43,0,0,0,0-7.22.57.57,0,0,1,.11-.83.66.66,0,0,1,.89.11A7,7,0,0,1,19.11,12,7.28,7.28,0,0,1,17.72,16.33Zm-3.06-1.61a.68.68,0,0,1,.06-.94A2.79,2.79,0,0,0,15.33,12a3.2,3.2,0,0,0-.61-1.78.67.67,0,0,1-.05-.94.61.61,0,0,1,.87-.06h0a4.19,4.19,0,0,1,0,5.55.69.69,0,0,1-.89-.06Zm-5.33,0a.63.63,0,0,1-.88.07h0A4.07,4.07,0,0,1,7.38,12,4.19,4.19,0,0,1,8.44,9.22a.62.62,0,0,1,.89.06.68.68,0,0,1-.06.94,2.89,2.89,0,0,0,0,3.55.68.68,0,0,1,.06,1ZM7.16,16.44a.67.67,0,0,1-.89-.11A7,7,0,0,1,4.89,12,7.15,7.15,0,0,1,6.27,7.67a.62.62,0,0,1,.89-.12.55.55,0,0,1,.11.83,6.43,6.43,0,0,0,0,7.22.56.56,0,0,1,0,.79l-.06.05Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/playerfm.svg b/app/Views/_assets/icons/podcasting/playerfm.svg
new file mode 100755
index 0000000000..fc24e26d74
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/playerfm.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M11.4,22A9.4,9.4,0,0,1,9.17,3.48,2,2,0,0,1,11.62,5a2,2,0,0,1-1.5,2.44A5.37,5.37,0,0,0,11.4,18h0a5.36,5.36,0,0,0,5.23-4.12,2,2,0,0,1,3.95.95A9.47,9.47,0,0,1,11.4,22Zm9.74-11.24a.84.84,0,0,1-.84-.61,10.1,10.1,0,0,0-6.4-6.51A.84.84,0,1,1,14.36,2h.05A11.81,11.81,0,0,1,22,9.66a.86.86,0,0,1-.56,1.06A.5.5,0,0,1,21.14,10.77Zm-2.78.56a.85.85,0,0,1-.84-.61,7.38,7.38,0,0,0-4.17-4.34.85.85,0,0,1,.51-1.62,8.61,8.61,0,0,1,5.28,5.45.86.86,0,0,1-.56,1.06C18.52,11.27,18.41,11.33,18.36,11.33Zm-2.84.33a.82.82,0,0,1-.78-.5,4.61,4.61,0,0,0-2-2.06.87.87,0,1,1,.78-1.56h0a6.77,6.77,0,0,1,2.78,2.9A.8.8,0,0,1,16,11.53l0,0A.76.76,0,0,1,15.52,11.66Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/pocketcasts.svg b/app/Views/_assets/icons/podcasting/pocketcasts.svg
new file mode 100755
index 0000000000..bb55131204
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/pocketcasts.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2,12a10,10,0,0,1,20,0H19.5A7.5,7.5,0,1,0,12,19.5V22A10,10,0,0,1,2,12Zm10,6a6,6,0,1,1,6-6H15.83A3.83,3.83,0,1,0,12,15.83h0Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podbean.svg b/app/Views/_assets/icons/podcasting/podbean.svg
new file mode 100755
index 0000000000..c8577b5f88
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podbean.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M11.79,4.1a10.58,10.58,0,0,1,1.69.08,10.85,10.85,0,0,1,1.38.27,12.06,12.06,0,0,1,2,.68A11.42,11.42,0,0,1,19,6.4,10.4,10.4,0,0,1,20,7.31c.2.2.41.4.61.61a11.51,11.51,0,0,1,1.23,1.64A1.36,1.36,0,0,1,22,10a1.25,1.25,0,0,1-.43,1,1.16,1.16,0,0,1-.67.26A1.14,1.14,0,0,1,20,11a5.65,5.65,0,0,1-.56-.73A9.11,9.11,0,0,0,17.12,8a10,10,0,0,0-1.4-.77c-.18-.08-.37-.14-.55-.21a6.54,6.54,0,0,0-1.31-.37,8.88,8.88,0,0,0-1.78-.18,8.27,8.27,0,0,0-1.79.14A9.52,9.52,0,0,0,8.9,7a9.33,9.33,0,0,0-4.12,2.9c-.19.25-.38.49-.54.75a1.72,1.72,0,0,1-.36.4,1.14,1.14,0,0,1-.44.18,1.51,1.51,0,0,1-.56,0,1.14,1.14,0,0,1-.7-.52,1.21,1.21,0,0,1-.11-1,2,2,0,0,1,.17-.32A11.7,11.7,0,0,1,6.36,5.54a12.77,12.77,0,0,1,2.12-.91A12,12,0,0,1,11.79,4.1Zm.12,4.3a7.24,7.24,0,0,1,5.21,2.1,6.88,6.88,0,0,1,1.05,1.3,1.27,1.27,0,0,1,.09,1,1.24,1.24,0,0,1-.65.68,1.2,1.2,0,0,1-1.21-.16,1.34,1.34,0,0,1-.31-.36,6.31,6.31,0,0,0-.71-.84A4.85,4.85,0,0,0,13,10.89a6.09,6.09,0,0,0-1.13-.1,4.91,4.91,0,0,0-2.7.88,5.55,5.55,0,0,0-.94.87c-.19.23-.34.49-.54.71a1.2,1.2,0,0,1-1.69,0,1.13,1.13,0,0,1-.29-.51,1.06,1.06,0,0,1,0-.61,1.86,1.86,0,0,1,.23-.47,9.71,9.71,0,0,1,.86-1.06A7.92,7.92,0,0,1,8,9.57a7.16,7.16,0,0,1,1.38-.7A7.33,7.33,0,0,1,11.91,8.4Zm-.09,4.65a3.7,3.7,0,0,1,3.89,3.42,5.13,5.13,0,0,1,0,1,3.92,3.92,0,0,1-1.19,2.12,3.74,3.74,0,0,1-1.76.89,4,4,0,0,1-1.25,0A3.88,3.88,0,0,1,10.16,20a4.32,4.32,0,0,1-1.1-.94,5.11,5.11,0,0,1-.57-1,3.76,3.76,0,0,1,1.39-4.36,3.59,3.59,0,0,1,1.94-.66m0,1.77a3.21,3.21,0,0,0-.63.14,2.77,2.77,0,0,0-.6.41,2,2,0,0,0-.47,2.09,2.12,2.12,0,0,0,.61.86,2.61,2.61,0,0,0,.77.37,3.08,3.08,0,0,0,.68,0,1.7,1.7,0,0,0,.9-.33,1.93,1.93,0,0,0,.82-1.29A2.21,2.21,0,0,0,13.81,16a2.57,2.57,0,0,0-.34-.54,2,2,0,0,0-1.61-.65Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podcastaddict.svg b/app/Views/_assets/icons/podcasting/podcastaddict.svg
new file mode 100755
index 0000000000..2db5845757
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podcastaddict.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22,11.77A10,10,0,1,0,7.3,20.83V12a4.76,4.76,0,0,1,3.86-4.66V9a3.12,3.12,0,0,0-2.24,3v0h0a3.13,3.13,0,0,0,6.13.85h1.66a4.74,4.74,0,0,1-5.56,3.76,4.59,4.59,0,0,1-2.23-1.09v6A10.33,10.33,0,0,0,12,22a10,10,0,0,0,5.61-1.72V22H22Zm-9.95,2a1.83,1.83,0,1,1,1.82-1.83h0a1.81,1.81,0,0,1-1.81,1.82ZM16.79,12H15.18a3.13,3.13,0,0,0-3.13-3.13h0V7.2h0A4.75,4.75,0,0,1,16.79,12h0Zm2.78,0H18A5.93,5.93,0,0,0,12.05,6h0V4.42h0A7.53,7.53,0,0,1,19.57,12Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podcastindex.svg b/app/Views/_assets/icons/podcasting/podcastindex.svg
new file mode 100755
index 0000000000..4b88645e77
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podcastindex.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M4.52,3.59l-.13.15A8.84,8.84,0,0,0,2.08,8.48a11.43,11.43,0,0,0-.06,2,9.65,9.65,0,0,0,.42,2A8.64,8.64,0,0,0,3.93,15.2a5,5,0,0,0,.61.66s.29-.27.62-.6l.61-.61-.17-.17a7,7,0,0,1-1.78-3.63,7.94,7.94,0,0,1,0-1.95A7.06,7.06,0,0,1,5.55,5l.2-.22-.61-.61Zm15,0L18.25,4.82l.19.21a7.34,7.34,0,0,1,.85,1.14,6.92,6.92,0,0,1,.78,5.25,7.79,7.79,0,0,1-.8,1.93,8.66,8.66,0,0,1-.86,1.12l-.16.16.61.62.61.61.14-.13.33-.36a8.83,8.83,0,0,0,2-4.33,10.75,10.75,0,0,0,0-2.27,8.3,8.3,0,0,0-.83-2.84,8.55,8.55,0,0,0-1.49-2.16ZM17.41,5.66l-.6.6-.59.59.11.13a4.32,4.32,0,0,1,1,1.95,5.59,5.59,0,0,1,0,1.42,4.43,4.43,0,0,1-.54,1.49,5.32,5.32,0,0,1-.52.69c-.06.05-.06.05.53.66a7.84,7.84,0,0,0,.6.59l.15-.15a6,6,0,0,0,1.34-2.48,5.81,5.81,0,0,0-1.26-5.22Zm-10.8,0s-.08,0-.25.25a5.59,5.59,0,0,0-.62.83A5.94,5.94,0,0,0,5,8.8a7.78,7.78,0,0,0,0,1.53,5.83,5.83,0,0,0,1.4,3.2l.25.27.58-.6.59-.6-.13-.16a4.22,4.22,0,0,1-.95-1.9A5,5,0,0,1,6.68,9a4.11,4.11,0,0,1,1-2l.17-.19-.55-.54-.61-.59s0,0,0,0Zm2,1.93L8.5,7.7A3.78,3.78,0,0,0,7.91,9a4.11,4.11,0,0,0,0,1.31,3.55,3.55,0,0,0,.27.89,3.16,3.16,0,0,0,.4.64,3.26,3.26,0,0,0,.36-.34l.34-.35L9.19,11a2.38,2.38,0,0,1,0-2.6l.07-.11L8.92,8Zm6.87,0a5.54,5.54,0,0,0-.68.69.56.56,0,0,0,.08.15,2.41,2.41,0,0,1,.05,2.42l-.12.21.34.35a4.92,4.92,0,0,0,.35.35.58.58,0,0,0,.11-.13A3.52,3.52,0,0,0,16,10.9a3.47,3.47,0,0,0-.21-2.8,2.72,2.72,0,0,0-.33-.47Zm-3.38.19a2.13,2.13,0,0,0-.46,0,2,2,0,0,0-1.27,1,1.93,1.93,0,0,0,.89,2.58,1.57,1.57,0,0,0,.9.18,1.47,1.47,0,0,0,.53-.07,2,2,0,0,0,1.26-1.24,2.48,2.48,0,0,0,0-1.05,2,2,0,0,0-1.42-1.43,1.72,1.72,0,0,0-.47,0ZM11,12.44l-.08.58c-.11.9-.36,2.77-.5,3.81s-.4,3-.51,3.87c0,.36-.09.68-.09.71l0,.06h2.13v-.09c0-.05,0-.23.06-.4s.09-.75.16-1.26.2-1.47.28-2.12c.21-1.6.41-3.09.55-4.2.07-.51.13-.94.13-1H11Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podchaser.svg b/app/Views/_assets/icons/podcasting/podchaser.svg
new file mode 100755
index 0000000000..ca80217dc1
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podchaser.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Zm0,18.63a8.81,8.81,0,0,1-2.78-.46V17.94a6.39,6.39,0,1,0-3.61-5.76v5.61A8.61,8.61,0,1,1,12,20.63Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podcloud.svg b/app/Views/_assets/icons/podcasting/podcloud.svg
new file mode 100755
index 0000000000..9abda5d736
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podcloud.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M19.42,11.07c0-.08,0-.16,0-.24a4.92,4.92,0,0,0-9.28-2.3,3.87,3.87,0,0,0-.77-.08A3.56,3.56,0,0,0,6,11l-.4,0a3.57,3.57,0,0,0,0,7.14H18.41a3.59,3.59,0,0,0,1-7Zm-6.77,6.71c-1,0-1.76-1.16-1.76-2.24,0-1.28.48-1.28,1.69-1.28s1.83,0,1.83,1.28C14.41,16.62,13.62,17.78,12.65,17.78Zm-1.18-5.3a1.17,1.17,0,1,1,1.17,1.17A1.17,1.17,0,0,1,11.47,12.48Zm2.85,1.33a2.07,2.07,0,0,0,.47-1.33,2.15,2.15,0,1,0-3.86,1.3,1,1,0,0,0-.35.25,2.58,2.58,0,1,1,4.09,0A.9.9,0,0,0,14.32,13.81ZM15,15.89a4.38,4.38,0,0,0,0-.51,2.62,2.62,0,0,0,0-.29,3.53,3.53,0,1,0-4.75,0c0,.09,0,.18,0,.28a3.05,3.05,0,0,0,.05.52,4.14,4.14,0,1,1,4.68,0Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podfriend.svg b/app/Views/_assets/icons/podcasting/podfriend.svg
new file mode 100755
index 0000000000..6c96c60d53
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podfriend.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2.46,15.14l.07.48a7.24,7.24,0,0,0,1.56,3.22C5.29,20.28,7.63,22,12,22s6.71-1.72,7.9-3.16a7.2,7.2,0,0,0,1.57-3.22l.07-.48Zm9.54,6a10.56,10.56,0,0,1-5.34-1.24,9.09,9.09,0,0,1,.3-1.1,5.35,5.35,0,0,1,.78-1.45A5.06,5.06,0,0,1,9.54,16H13l0,0A6,6,0,0,0,11.8,19h0c0,.18,0,.41.14.49a.33.33,0,0,0,.37-.1,1,1,0,0,0,.17-.37,7.32,7.32,0,0,1,1.88-3h6.17C20.11,17.34,18.35,21.17,12,21.17ZM20.24,9.49h0c0-.39-.76-7.41-8.18-7.49h-.12C4.53,2.08,3.8,9.09,3.76,9.49c0,.19-.28,2.38.77,3.58a2.24,2.24,0,0,0,1.78.76H17.69a2.24,2.24,0,0,0,1.78-.76C20.52,11.87,20.26,9.68,20.24,9.49Zm-7.6-1.57a1.25,1.25,0,1,1,1.25,1.24A1.25,1.25,0,0,1,12.64,7.92Zm6.21,4.6h0a1.45,1.45,0,0,1-1.16.48H14A4.35,4.35,0,1,0,10,13H6.31a1.45,1.45,0,0,1-1.16-.48c-.82-.94-.57-2.91-.57-2.93v0c0-.27.55-6.69,7.41-6.73s7.39,6.46,7.41,6.73v0A4.39,4.39,0,0,1,18.85,12.52Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podinstall.svg b/app/Views/_assets/icons/podcasting/podinstall.svg
new file mode 100755
index 0000000000..9bec6ac614
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podinstall.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22,9.69C21.74,8,21.37,7.38,18.94,5s-3-2.78-4.5-3.07c-.45-.09-3-.13-5.23-.13H4.43v17.5l.07.07,1.43,1.43,1.42,1.43.07.07h6.36V16.67H15a17.15,17.15,0,0,0,2.2-.13A6.08,6.08,0,0,0,22,9.69ZM7.22,19.46v1.26l-.66-.65L6,19.46Zm0-14.27V18.48H5.42V3.39Zm.65-.65L6.08,2.74H10v1.8ZM8.2,18.48v-13H10v13Zm0,2.79V19.46h2.14l1.07,1.08.73.73ZM11,12.9V5.52H12.8V12.9Zm1.81,1v3.5c0,1.44,0,2.57,0,3.2L12,19.85,11,18.8V13.89ZM11,4.54V3.4l.55.54.59.59H11Zm7,5.13a5.32,5.32,0,0,1-2.89,2.89,5.61,5.61,0,0,1-1.13.3l-.24,0V5.52h1.49a9.07,9.07,0,0,1,2.27.18l.49.14.17.64A5.86,5.86,0,0,1,18,9.67Zm-4.26,4.19.25,0a7.76,7.76,0,0,0,2.56-1,6.1,6.1,0,0,0,2.66-6c0-.12,0-.24-.06-.34.12.1.25.23.4.37a5.46,5.46,0,0,1,1.14,1.55,3.41,3.41,0,0,1,.37,2.06,4.39,4.39,0,0,1-.26,1.9,5.42,5.42,0,0,1-2.92,2.92,6.39,6.39,0,0,1-2.49.29l-1.65.05Zm3.39-9.19A15.74,15.74,0,0,0,15,4.55H13.45L11.66,2.73l1.2,0c1.65,0,1.81.06,2.43.35a5.66,5.66,0,0,1,2,1.59h0Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podlink.svg b/app/Views/_assets/icons/podcasting/podlink.svg
new file mode 100755
index 0000000000..c980f8f623
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podlink.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2.49,10.51a.27.27,0,0,1,.37-.09l2.63,1.66a.27.27,0,0,1,.08.38.26.26,0,0,1-.22.12.28.28,0,0,1-.15,0L2.57,10.88A.27.27,0,0,1,2.49,10.51Zm3.61,1a.28.28,0,0,0,.23.13.23.23,0,0,0,.14,0,.27.27,0,0,0,.1-.37L5.32,9.14A.27.27,0,0,0,5,9.05a.28.28,0,0,0-.1.37ZM4.92,14a.28.28,0,0,0,.27-.24.27.27,0,0,0-.23-.3l-2.41-.33a.27.27,0,1,0-.08.53L4.88,14ZM21.6,6.89h0a.71.71,0,0,0-1-.09h0l-4.1,3.42L13.46,5.09a1.49,1.49,0,0,0-1-.73V1.89a.27.27,0,0,0-.54,0V4.34a1.5,1.5,0,0,0-1.1.75h0l-7,13.81a.73.73,0,0,0,1.26.72h0l7-13.78a.09.09,0,0,1,.09,0h0a.12.12,0,0,1,.09,0h0l3.13,5.3h0L9.91,15.71h0a.69.69,0,0,0,.88,1.07l5.31-4.42,3.3,5.58a.11.11,0,0,1-.1.16h0L5.34,20.24a.69.69,0,0,0-.68.69.7.7,0,0,0,.7.69h0l14-2.13a1.53,1.53,0,0,0,1.3-2.29h0l-3.44-5.77,4.28-3.55h0A.71.71,0,0,0,21.6,6.89Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podtail.svg b/app/Views/_assets/icons/podcasting/podtail.svg
new file mode 100755
index 0000000000..09426777e4
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podtail.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M13.51,22l-.45-.08A2.68,2.68,0,0,1,11,20.08a5.9,5.9,0,0,1-.28-1.91c0-.29,0-.3-.31-.3H9.11a.53.53,0,0,1,0-1.05c.44,0,.87,0,1.31,0,.19,0,.26-.07.26-.26,0-.4,0-.79,0-1.19,0-.16-.07-.23-.23-.25a3.34,3.34,0,0,1-2.94-3.47c0-.53.05-.48-.48-.48H6.75a.6.6,0,0,1-.51-.54.57.57,0,0,1,.51-.52h.46c.3,0,.31,0,.31-.3V5.43A3.36,3.36,0,0,1,10.3,2l.1,0h1.79a3.78,3.78,0,0,1,1.65.76A3.22,3.22,0,0,1,15,5.21c0,2.26,0,4.51,0,6.77a3.3,3.3,0,0,1-2.87,3.14c-.41.05-.41,0-.41.47v1c0,.17.07.24.24.24h1.46a.46.46,0,0,1,.51.51.48.48,0,0,1-.52.54H12c-.19,0-.26.07-.25.25A5,5,0,0,0,12,19.72a1.73,1.73,0,0,0,1.41,1.2A2.17,2.17,0,0,0,15.71,20c.36-.51.64-1.06,1-1.59a10,10,0,0,1,.79-1.24,2.14,2.14,0,0,1,2.9-.39,1.53,1.53,0,0,1,.32.35.42.42,0,0,1-.05.58.52.52,0,0,1-.59.11l-.17-.12a1.11,1.11,0,0,0-1.67.19c-.24.33-.43.7-.64,1.05-.38.62-.74,1.26-1.16,1.84A2.9,2.9,0,0,1,14.46,22l-.1,0ZM11.27,10.1h2.39c.3,0,.31,0,.31-.3V9.69c0-.37,0-.37-.38-.37H12.27a.52.52,0,0,1-.52-.52.53.53,0,0,1,.49-.54h1.48c.24,0,.24,0,.25-.35s0-.26-.25-.25H12.33a.54.54,0,1,1,0-1.08h1.33c.27,0,.28,0,.28-.3S14,6,13.69,6H12.17a.53.53,0,0,1-.5-.57.54.54,0,0,1,.44-.49,1.22,1.22,0,0,1,.27,0h1.29c.23,0,.25,0,.18-.25a2.18,2.18,0,0,0-1.8-1.53,6.19,6.19,0,0,0-1.29,0,2.27,2.27,0,0,0-2,1.55c-.07.23-.05.26.18.26h1.32a.54.54,0,1,1,0,1.08H8.91c-.3,0-.31,0-.31.3s0,.31.3.31h1.41a.54.54,0,1,1,0,1.07c-.5,0-1,0-1.48,0-.24,0-.27,0-.27.31s0,.28.27.29h1.38c.39,0,.64.21.65.52s-.25.55-.65.55H9.07c-.5,0-.48-.06-.48.49,0,.27,0,.29.3.29Zm0,1.06H8.85c-.18,0-.27.06-.26.25s0,.36,0,.52a2.25,2.25,0,0,0,2.18,2.15c.32,0,.64,0,1,0a2.23,2.23,0,0,0,2-1.26A2.61,2.61,0,0,0,14,11.44c0-.26,0-.28-.29-.28Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/podverse.svg b/app/Views/_assets/icons/podcasting/podverse.svg
new file mode 100755
index 0000000000..ccec56af03
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/podverse.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M7.12,21.73a4.62,4.62,0,0,1-2.46-2.49,10.13,10.13,0,0,0-.85-1.63,10,10,0,1,1,16.4,0,9.39,9.39,0,0,0-.85,1.63,4.5,4.5,0,0,1-2.52,2.49A2.48,2.48,0,0,1,16,22a65.25,65.25,0,0,1,2.21-7.53,1.55,1.55,0,0,1,.59.46,2.13,2.13,0,0,0,.52.46,3.71,3.71,0,0,0,.42-1,7.37,7.37,0,0,0,.24-2.76,5.78,5.78,0,0,0-.76-3.12,8,8,0,0,0-14.34,0,5.79,5.79,0,0,0-.77,3.12,7.56,7.56,0,0,0,.25,2.76,3.71,3.71,0,0,0,.42,1,2.34,2.34,0,0,0,.52-.46,1.49,1.49,0,0,1,.6-.46,10.94,10.94,0,0,1,.84,2.45c.37,1.35.84,3,1,3.71A3.32,3.32,0,0,1,8,21.9a2,2,0,0,1-.84-.17Zm1.41-.3c-.1-.34-.62-2.19-1.17-4.11-.83-3-1-3.51-.72-3.65a1.35,1.35,0,0,1,1.54.16A54.67,54.67,0,0,1,10.34,21c0,.32-.58.78-1.14.92s-.52.06-.67-.49Zm5.84.37a1,1,0,0,1-.62-.61,33.68,33.68,0,0,1,2-7.26,1.14,1.14,0,0,1,.85-.44c1.11,0,1.11,0-.15,4.43A23.9,23.9,0,0,1,15.09,22a4.11,4.11,0,0,1-.72-.2Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/radiopublic.svg b/app/Views/_assets/icons/podcasting/radiopublic.svg
new file mode 100755
index 0000000000..1803cccd20
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/radiopublic.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M15.52,12.63V9.58l.37-.08c.46-.11.51.13.51.52v1.8c0,.33,0,.62-.51.73ZM7.65,9.85V7.12L8.09,7c.4-.09.49,0,.49.5V9c0,.51-.15.69-.55.78Zm5.89-4.47V2.48C9.92.82,6.3,4.14,2.68,2.48V19.06c2.64,1.21,5.27-.22,7.91-.44v2.9c3.58,1.66,7.15-1.66,10.73,0V4.94C18.73,3.74,16.14,5.14,13.54,5.38Zm-2.8,10.31a13.18,13.18,0,0,0-2,.32c-.1-.1-.18-.31-.18-.79V12.06c0-.5-.12-.61-.52-.52l-.41.1v4.62a16.38,16.38,0,0,1-2,.34V5.79a24.5,24.5,0,0,0,3.12-.6c1.21-.27,1.81.35,1.81,1.5V8.42A1.72,1.72,0,0,1,9.73,10a1.09,1.09,0,0,1,.84,1.17v3.67a1.36,1.36,0,0,0,.17.79Zm7.65-4a2.26,2.26,0,0,1-1.93,2.51l-.94.22v4.33a14.75,14.75,0,0,1-2,.34V8.26a23.56,23.56,0,0,0,2.81-.54c1.68-.38,2,.46,2,1.78Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/spotify.svg b/app/Views/_assets/icons/podcasting/spotify.svg
new file mode 100755
index 0000000000..da84da85c7
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/spotify.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.91,10.87C14.69,9,9.37,8.77,6.3,9.71a.93.93,0,1,1-.54-1.79c3.53-1.08,9.4-.87,13.11,1.34a.93.93,0,1,1-1,1.6h0Zm-.1,2.83a.78.78,0,0,1-1.07.26h0a13.14,13.14,0,0,0-10-1.17.78.78,0,0,1-1-.49.79.79,0,0,1,.5-1h0a14.58,14.58,0,0,1,11.23,1.33.78.78,0,0,1,.26,1.07Zm-1.22,2.72a.63.63,0,0,1-.86.21h0c-2.35-1.44-5.3-1.76-8.79-1a.62.62,0,0,1-.27-1.21c3.81-.87,7.07-.5,9.71,1.11a.63.63,0,0,1,.21.86ZM12,2A10,10,0,1,0,22,12,10,10,0,0,0,12,2Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/spreaker.svg b/app/Views/_assets/icons/podcasting/spreaker.svg
new file mode 100755
index 0000000000..06ddebe33a
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/spreaker.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M14.82,2,10.11,7.45l-7-1.52,7.23,6.15L3.2,18.29l7-1.65L15,22l.59-7.17,6.6-2.9L15.56,9.16,14.82,2Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/stitcher.svg b/app/Views/_assets/icons/podcasting/stitcher.svg
new file mode 100755
index 0000000000..b2f7c0d02c
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/stitcher.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M14.69,8.5h3v6.32h-3Zm-4.21.89h3V15.5h-3ZM6.24,8.9h3v5.92h-3ZM2,9.82H5.07v5.4H2Zm16.93-.21H22v4.78H18.93Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/podcasting/tunein.svg b/app/Views/_assets/icons/podcasting/tunein.svg
new file mode 100755
index 0000000000..8ebef8d472
--- /dev/null
+++ b/app/Views/_assets/icons/podcasting/tunein.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.5,5.23H12.06a.49.49,0,0,0-.5.49h0V8.32H2.5a.5.5,0,0,0-.5.5H2v9.45a.5.5,0,0,0,.49.5h9.45a.49.49,0,0,0,.5-.49h0v-2.6H21.5a.49.49,0,0,0,.5-.49h0V5.67A.49.49,0,0,0,21.5,5.23Zm-10,12.6H2.94V9.26H11.5Zm6.41-5.36a.11.11,0,0,1-.11.11h-2a.11.11,0,0,1-.11-.11v-.61a.12.12,0,0,1,.11-.11h.5s0,0,0-.05V9.21c0-.06,0-.06,0-.06h-.45A.12.12,0,0,1,15.7,9v-.6a.11.11,0,0,1,.11-.11h1.88a.11.11,0,0,1,.11.11V9a.11.11,0,0,1-.11.11h-.44c-.05,0-.05,0-.05.06V11.7c0,.05,0,.05.05.05h.5a.12.12,0,0,1,.11.11l.06.61Zm-12-.33v-.61A.11.11,0,0,1,6,11.42H8.46a.11.11,0,0,1,.11.11v.61h0a.12.12,0,0,1-.11.11H7.7c-.06,0-.06,0-.06.05v3.26a.11.11,0,0,1-.11.11H6.92a.11.11,0,0,1-.11-.11V12.3c0-.05,0-.05-.06-.05H6A.12.12,0,0,1,5.87,12.14Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/question.svg b/app/Views/_assets/icons/question.svg
old mode 100644
new mode 100755
index 984376ae7d..b7fd91eda2
--- a/app/Views/_assets/icons/question.svg
+++ b/app/Views/_assets/icons/question.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zm-1-5h2v2h-2v-2zm2-1.645V14h-2v-1.5a1 1 0 0 1 1-1 1.5 1.5 0 1 0-1.471-1.794l-1.962-.393A3.501 3.501 0 1 1 13 13.355z"/>
+        <path d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-7v2h2v-2h-2zm2-1.645A3.502 3.502 0 0 0 12 6.5a3.501 3.501 0 0 0-3.433 2.813l1.962.393A1.5 1.5 0 1 1 12 11.5a1 1 0 0 0-1 1V14h2v-.645z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/repeat.svg b/app/Views/_assets/icons/repeat.svg
new file mode 100644
index 0000000000..c5a2604773
--- /dev/null
+++ b/app/Views/_assets/icons/repeat.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M6 4h15a1 1 0 0 1 1 1v7h-2V6H6v3L1 5l5-4v3zm12 16H3a1 1 0 0 1-1-1v-7h2v6h14v-3l5 4-5 4v-3z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/rss.svg b/app/Views/_assets/icons/rss.svg
old mode 100644
new mode 100755
index e8cff80175..723552d9b1
--- a/app/Views/_assets/icons/rss.svg
+++ b/app/Views/_assets/icons/rss.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M3 17a4 4 0 0 1 4 4H3v-4zm0-7c6.075 0 11 4.925 11 11h-2a9 9 0 0 0-9-9v-2zm0-7c9.941 0 18 8.059 18 18h-2c0-8.837-7.163-16-16-16V3z"/>
+        <path d="M3 3c9.941 0 18 8.059 18 18h-3c0-8.284-6.716-15-15-15V3zm0 7c6.075 0 11 4.925 11 11h-3a8 8 0 0 0-8-8v-3zm0 7a4 4 0 0 1 4 4H3v-4z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/scales.svg b/app/Views/_assets/icons/scales.svg
old mode 100644
new mode 100755
index 2592d2ca59..7383e06a6f
--- a/app/Views/_assets/icons/scales.svg
+++ b/app/Views/_assets/icons/scales.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0H24V24H0z"/>
-        <path d="M13 2v1.278l5 1.668 3.632-1.21.633 1.896-3.032 1.011 3.096 8.512C21.237 16.292 19.7 17 18 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512L13 5.387V19H17v2H7v-2h4V5.387L7.232 6.643l3.096 8.512C9.237 16.292 7.7 17 6 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512-3.03-1.01.633-1.898L6 4.945l5-1.667V2h2zm5 7.103l-1.958 5.386c.587.331 1.257.511 1.958.511.7 0 1.37-.18 1.958-.51L18 9.102zm-12 0l-1.958 5.386C4.629 14.82 5.299 15 6 15c.7 0 1.37-.18 1.958-.51L6 9.102z"/>
+        <path d="M13 2v1.278l5 1.668 3.632-1.21.633 1.896-3.032 1.011 3.096 8.512C21.237 16.292 19.7 17 18 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512L13 5.387V19H17v2H7v-2h4V5.387L7.232 6.643l3.096 8.512C9.237 16.292 7.7 17 6 17c-1.701 0-3.237-.708-4.329-1.845l3.094-8.512-3.03-1.01.633-1.898L6 4.945l5-1.667V2h2zm5 7.103L16.582 13h2.835L18 9.103zm-12 0L4.582 13h2.835L6 9.103z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/settings.svg b/app/Views/_assets/icons/settings.svg
old mode 100644
new mode 100755
index 8ab66f65d2..893c92d2ee
--- a/app/Views/_assets/icons/settings.svg
+++ b/app/Views/_assets/icons/settings.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M2 12c0-.865.11-1.703.316-2.504A3 3 0 0 0 4.99 4.867a9.99 9.99 0 0 1 4.335-2.505 3 3 0 0 0 5.348 0 9.99 9.99 0 0 1 4.335 2.505 3 3 0 0 0 2.675 4.63c.206.8.316 1.638.316 2.503 0 .865-.11 1.703-.316 2.504a3 3 0 0 0-2.675 4.629 9.99 9.99 0 0 1-4.335 2.505 3 3 0 0 0-5.348 0 9.99 9.99 0 0 1-4.335-2.505 3 3 0 0 0-2.675-4.63C2.11 13.704 2 12.866 2 12zm4.804 3c.63 1.091.81 2.346.564 3.524.408.29.842.541 1.297.75A4.993 4.993 0 0 1 12 18c1.26 0 2.438.471 3.335 1.274.455-.209.889-.46 1.297-.75A4.993 4.993 0 0 1 17.196 15a4.993 4.993 0 0 1 2.77-2.25 8.126 8.126 0 0 0 0-1.5A4.993 4.993 0 0 1 17.195 9a4.993 4.993 0 0 1-.564-3.524 7.989 7.989 0 0 0-1.297-.75A4.993 4.993 0 0 1 12 6a4.993 4.993 0 0 1-3.335-1.274 7.99 7.99 0 0 0-1.297.75A4.993 4.993 0 0 1 6.804 9a4.993 4.993 0 0 1-2.77 2.25 8.126 8.126 0 0 0 0 1.5A4.993 4.993 0 0 1 6.805 15zM12 15a3 3 0 1 1 0-6 3 3 0 0 1 0 6zm0-2a1 1 0 1 0 0-2 1 1 0 0 0 0 2z"/>
+        <path d="M9.954 2.21a9.99 9.99 0 0 1 4.091-.002A3.993 3.993 0 0 0 16 5.07a3.993 3.993 0 0 0 3.457.261A9.99 9.99 0 0 1 21.5 8.876 3.993 3.993 0 0 0 20 12c0 1.264.586 2.391 1.502 3.124a10.043 10.043 0 0 1-2.046 3.543 3.993 3.993 0 0 0-3.456.261 3.993 3.993 0 0 0-1.954 2.86 9.99 9.99 0 0 1-4.091.004A3.993 3.993 0 0 0 8 18.927a3.993 3.993 0 0 0-3.457-.26A9.99 9.99 0 0 1 2.5 15.121 3.993 3.993 0 0 0 4 11.999a3.993 3.993 0 0 0-1.502-3.124 10.043 10.043 0 0 1 2.046-3.543A3.993 3.993 0 0 0 8 5.071a3.993 3.993 0 0 0 1.954-2.86zM12 15a3 3 0 1 0 0-6 3 3 0 0 0 0 6z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/social/castopod.svg b/app/Views/_assets/icons/social/castopod.svg
new file mode 100755
index 0000000000..ff91790c9d
--- /dev/null
+++ b/app/Views/_assets/icons/social/castopod.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M17.13,11.69a1.28,1.28,0,0,1-.26.8,2.91,2.91,0,0,0-1.09-.3,2.12,2.12,0,0,0-1.15.35,1.36,1.36,0,0,1-.29-.85,1.4,1.4,0,1,1,2.79,0ZM8.26,10.28a1.39,1.39,0,0,0-1.14,2.2,2.84,2.84,0,0,1,1.09-.3,2.12,2.12,0,0,1,1.15.35,1.36,1.36,0,0,0,.29-.85A1.39,1.39,0,0,0,8.26,10.28ZM22,7.19V17.8a1.34,1.34,0,0,1-1.34,1.35H17.17s-.36-.65-.49-.86a.57.57,0,0,0-.45-.19H7.75a.54.54,0,0,0-.46.19c-.17.23-.5.86-.5.86H3.35A1.35,1.35,0,0,1,2,17.81V7.2A1.35,1.35,0,0,1,3.34,5.85H20.65A1.35,1.35,0,0,1,22,7.19Zm-2.6,4.39a2.82,2.82,0,0,0-2.84-2.86H7.43a2.85,2.85,0,0,0,0,5.7h9.13A2.84,2.84,0,0,0,19.4,11.58Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/discord.svg b/app/Views/_assets/icons/social/discord.svg
new file mode 100755
index 0000000000..ad22eebd4c
--- /dev/null
+++ b/app/Views/_assets/icons/social/discord.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M10.08,11a1,1,0,1,1,0,2,1,1,0,1,1,0-2Zm3.84,0a1,1,0,1,1-1.07,1A1,1,0,0,1,13.92,11Zm5-9A2.14,2.14,0,0,1,21,4.16V23l-2.21-2-1.25-1.17-1.31-1.25.54,1.94H5.11A2.13,2.13,0,0,1,3,18.36V4.16A2.14,2.14,0,0,1,5.11,2Zm-4,13.71a3.75,3.75,0,0,0,3.15-1.59A14.29,14.29,0,0,0,16.59,8,5,5,0,0,0,13.7,6.89l-.15.17A6.79,6.79,0,0,1,16.11,8.4a8,8,0,0,0-3.09-1,8.52,8.52,0,0,0-2.08,0l-.17,0a7.66,7.66,0,0,0-2.34.66c-.38.18-.61.31-.61.31A7,7,0,0,1,10.53,7l-.1-.13A5,5,0,0,0,7.54,8a14.21,14.21,0,0,0-1.49,6.12,3.73,3.73,0,0,0,3.14,1.59l.69-.87a3.19,3.19,0,0,1-1.8-1.24,2,2,0,0,0,.29.18l0,0,.09.06a7,7,0,0,0,.75.35,7.9,7.9,0,0,0,1.52.45,6.8,6.8,0,0,0,2.66,0,6.56,6.56,0,0,0,1.49-.45,5.2,5.2,0,0,0,1.18-.62,3.24,3.24,0,0,1-1.86,1.25c.31.4.68.85.68.85Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/facebook.svg b/app/Views/_assets/icons/social/facebook.svg
new file mode 100755
index 0000000000..4d215877eb
--- /dev/null
+++ b/app/Views/_assets/icons/social/facebook.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2.06a10,10,0,0,0-1.56,19.88V15H7.9V12.06h2.54V9.86A3.53,3.53,0,0,1,14.22,6a15.68,15.68,0,0,1,2.23.19V8.62H15.19a1.45,1.45,0,0,0-1.63,1.56v1.88h2.78L15.89,15H13.56v7A10,10,0,0,0,12,2.06Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/funkwhale.svg b/app/Views/_assets/icons/social/funkwhale.svg
new file mode 100755
index 0000000000..4abbeaade4
--- /dev/null
+++ b/app/Views/_assets/icons/social/funkwhale.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.27,3c-.33,0-.66,0-1,0A2.44,2.44,0,0,0,5.7,5.13a4.89,4.89,0,0,0,1.8,1.4c.67.35,1.39.41,2,.79a2.65,2.65,0,0,1,1,.93,2.68,2.68,0,0,1,.39,1.39l0,.85s.33.85,1.05.85,1-.85,1-.85l.05-.85a2.7,2.7,0,0,1,.39-1.39,2.36,2.36,0,0,1,.95-.93c.64-.38,1.37-.44,2-.79a4.77,4.77,0,0,0,1.75-1.4A2.43,2.43,0,0,0,18.62,3a7.71,7.71,0,0,0-3.86.69c-1.56.83-2.51.54-2.79,1.78h0c-.29-1.25-1.22-1-2.8-1.78A6.75,6.75,0,0,0,6.27,3Zm2.45,7.88a.18.18,0,0,0-.18.18,3.46,3.46,0,1,0,6.92,0,.18.18,0,0,0-.18-.18H14a.19.19,0,0,0-.18.18,1.79,1.79,0,0,1-3.58,0,.19.19,0,0,0-.18-.18Zm-6.54,0A.19.19,0,0,0,2,11a10,10,0,0,0,20,0,.19.19,0,0,0-.18-.18H20.51a.18.18,0,0,0-.18.18A8.34,8.34,0,0,1,3.65,11a.19.19,0,0,0-.18-.18Zm3.28,0a.19.19,0,0,0-.18.18,6.72,6.72,0,0,0,13.44,0,.19.19,0,0,0-.18-.18H17.23a.19.19,0,0,0-.18.18A5.06,5.06,0,1,1,6.93,11a.19.19,0,0,0-.18-.18Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/instagram.svg b/app/Views/_assets/icons/social/instagram.svg
new file mode 100755
index 0000000000..a56bb3e90f
--- /dev/null
+++ b/app/Views/_assets/icons/social/instagram.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2c2.72,0,3.06,0,4.12.06a7.3,7.3,0,0,1,2.43.47,4.7,4.7,0,0,1,1.77,1.15,4.84,4.84,0,0,1,1.15,1.77,7.3,7.3,0,0,1,.47,2.43C22,8.94,22,9.28,22,12s0,3.06-.06,4.12a7.3,7.3,0,0,1-.47,2.43,5.08,5.08,0,0,1-2.92,2.92,7.3,7.3,0,0,1-2.43.47c-1.06,0-1.4.06-4.12.06s-3.06,0-4.12-.06a7.3,7.3,0,0,1-2.43-.47,4.84,4.84,0,0,1-1.77-1.15,4.84,4.84,0,0,1-1.15-1.77,7.3,7.3,0,0,1-.47-2.43C2,15.06,2,14.72,2,12s0-3.06.06-4.12a7.3,7.3,0,0,1,.47-2.43A4.84,4.84,0,0,1,3.68,3.68,4.84,4.84,0,0,1,5.45,2.53a7.3,7.3,0,0,1,2.43-.47C8.94,2,9.28,2,12,2Zm0,5a5,5,0,1,0,5,5A5,5,0,0,0,12,7Zm6.5-.25A1.25,1.25,0,1,0,17.25,8,1.25,1.25,0,0,0,18.5,6.75ZM12,9a3,3,0,1,1-3,3A3,3,0,0,1,12,9Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/linkedin.svg b/app/Views/_assets/icons/social/linkedin.svg
new file mode 100755
index 0000000000..78000a7a8e
--- /dev/null
+++ b/app/Views/_assets/icons/social/linkedin.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M18.33,18.34H15.67V14.16c0-1,0-2.28-1.39-2.28s-1.6,1.09-1.6,2.21v4.25H10V9.75h2.56v1.17h0a2.83,2.83,0,0,1,2.53-1.39c2.7,0,3.2,1.78,3.2,4.09v4.72ZM7,8.57A1.55,1.55,0,0,1,5.45,7h0a1.55,1.55,0,0,1,3.1,0A1.54,1.54,0,0,1,7,8.57Zm1.34,9.77H5.67V9.75H8.34v8.59ZM19.67,3H4.33A1.31,1.31,0,0,0,3,4.3V19.7A1.31,1.31,0,0,0,4.33,21H19.67A1.32,1.32,0,0,0,21,19.7V4.3A1.32,1.32,0,0,0,19.67,3Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/mastodon.svg b/app/Views/_assets/icons/social/mastodon.svg
new file mode 100755
index 0000000000..f931556394
--- /dev/null
+++ b/app/Views/_assets/icons/social/mastodon.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.26,14c-.28,1.41-2.46,3-5,3.25a23.66,23.66,0,0,1-4,.24,22.68,22.68,0,0,1-4-.54,4,4,0,0,0,0,.62c.29,2.22,2.19,2.35,4,2.41a11.23,11.23,0,0,0,3.44-.45l.07,1.65a9.21,9.21,0,0,1-3.54.81,14.73,14.73,0,0,1-4.61-.51C3.8,20.43,3.12,16.25,3,12c0-1.26,0-2.45,0-3.44C3,4.23,5.85,3,5.85,3A17.64,17.64,0,0,1,12.3,2h.06a17.64,17.64,0,0,1,6.45,1s2.85,1.27,2.85,5.61A33.59,33.59,0,0,1,21.26,14Zm-3-5.09a3.78,3.78,0,0,0-.82-2.56,2.87,2.87,0,0,0-2.23-1,2.68,2.68,0,0,0-2.4,1.23l-.52.87-.52-.87A2.68,2.68,0,0,0,9.4,5.39a2.83,2.83,0,0,0-2.22,1A3.79,3.79,0,0,0,6.35,8.9v5.26H8.43V9.06c0-1.08.46-1.62,1.36-1.62s1.5.64,1.5,1.92v2.79h2.07V9.36q0-1.92,1.5-1.92c.91,0,1.36.54,1.36,1.62v5.1H18.3V8.9Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/mobilizon.svg b/app/Views/_assets/icons/social/mobilizon.svg
new file mode 100755
index 0000000000..b7fd11a6cc
--- /dev/null
+++ b/app/Views/_assets/icons/social/mobilizon.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M16,8.17a5.11,5.11,0,0,0-4.11-1.44,4.57,4.57,0,0,0-2.48.42A6.23,6.23,0,0,0,6,11.86a14.48,14.48,0,0,0,.33,5.52,5.8,5.8,0,0,0,4.43,3.83h0a6.17,6.17,0,0,0,5.14-1.35A5.77,5.77,0,0,0,17.8,16.6C18.61,13.41,17.88,10,16,8.17Zm-1.6,8.65a3,3,0,0,1-1.33,2.23,2.09,2.09,0,0,1-2.28,0c-.91-.52-1.35-1.7-1.45-3.86A7.94,7.94,0,0,1,10,11.25,1.85,1.85,0,0,1,11.8,10c1.54-.1,2.2.55,2.63,2.6A10.2,10.2,0,0,1,14.42,16.82ZM10.78,4.73c-.56-.16-.74-.54-.74-1.62s.16-1.42.83-1.63a4.68,4.68,0,0,1,2.52,0c.58.2.8.64.8,1.63s-.22,1.42-.8,1.62a5.48,5.48,0,0,1-2.61,0Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/peertube.svg b/app/Views/_assets/icons/social/peertube.svg
new file mode 100755
index 0000000000..0fb16946e5
--- /dev/null
+++ b/app/Views/_assets/icons/social/peertube.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.1,2V12l7.5-5Zm7.5,5V17l7.5-5Zm0,10L6.1,12V22Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/pixelfed.svg b/app/Views/_assets/icons/social/pixelfed.svg
new file mode 100755
index 0000000000..b34713407e
--- /dev/null
+++ b/app/Views/_assets/icons/social/pixelfed.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,2A10,10,0,1,1,2,12,10,10,0,0,1,12,2Zm1,6.1H10.41A1.76,1.76,0,0,0,8.62,9.83v6.75l2.59-2.47H13a3,3,0,1,0,0-6Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/plume.svg b/app/Views/_assets/icons/social/plume.svg
new file mode 100755
index 0000000000..a1009fa50a
--- /dev/null
+++ b/app/Views/_assets/icons/social/plume.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M2.09,21.87c-.12-.15-.12-.46,0-.92a10.48,10.48,0,0,1,1.26-2.42,18.94,18.94,0,0,0,1.06-2.05C6,12.16,7.64,9.27,10,6.92a10.18,10.18,0,0,1,2.51-2c.15,0,.14.43.09.6s.28-.27.49-.49c1.3-1.39,3.18-2.12,7.18-2.82C21.61,2,21.88,2,22,2.14s0,.23-.32.56A4.51,4.51,0,0,0,20.42,5a6.74,6.74,0,0,1-1.14,2.31l-.72.77.83-.19c.18.17,0,.4-.32,1.06-.93,2.26-4.58,5.76-8.47,7.7A17.29,17.29,0,0,1,7,18l-.44.09L5,19.67C3.24,21.62,2.83,22,2.4,22a.42.42,0,0,1-.31-.11Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/reddit.svg b/app/Views/_assets/icons/social/reddit.svg
new file mode 100755
index 0000000000..a97eb3e230
--- /dev/null
+++ b/app/Views/_assets/icons/social/reddit.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M12,22A10,10,0,1,1,22,12,10,10,0,0,1,12,22Zm6.67-10a1.46,1.46,0,0,0-1.51-1.41,1.5,1.5,0,0,0-1,.41,7.15,7.15,0,0,0-3.85-1.23L13,6.65l2.14.45a1,1,0,1,0,.13-.61L12.82,6a.31.31,0,0,0-.37.24h0l-.74,3.47a7.14,7.14,0,0,0-3.9,1.23A1.46,1.46,0,1,0,6.2,13.33a3.23,3.23,0,0,0,0,.44C6.2,16,8.81,17.83,12,17.83s5.83-1.82,5.83-4.06a3.23,3.23,0,0,0,0-.44A1.47,1.47,0,0,0,18.67,12Zm-10,1a1,1,0,1,1,1,1A1,1,0,0,1,8.67,13Zm5.81,2.75a3.84,3.84,0,0,1-2.47.77,3.84,3.84,0,0,1-2.47-.77.27.27,0,0,1,.38-.38A3.3,3.3,0,0,0,12,16a3.25,3.25,0,0,0,2.09-.61.27.27,0,0,1,.4,0,.28.28,0,0,1,0,.39l0,0ZM14.3,14a1,1,0,1,1,1-1,1,1,0,0,1-1,1h-.05Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/slack.svg b/app/Views/_assets/icons/social/slack.svg
new file mode 100755
index 0000000000..03fa2ede30
--- /dev/null
+++ b/app/Views/_assets/icons/social/slack.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.53,14.51a2,2,0,1,1-2-2h2v2Zm1,0a2,2,0,0,1,3.93,0v4.93a2,2,0,1,1-3.93,0Zm2-8a2,2,0,1,1,2-2v2Zm0,1a2,2,0,0,1,0,3.93H4.56a2,2,0,1,1,0-3.93Zm8,2a2,2,0,1,1,2,2h-2Zm-1,0a2,2,0,0,1-3.93,0V4.56a2,2,0,1,1,3.93,0V9.49Zm-2,8a2,2,0,1,1-2,2v-2Zm0-1a2,2,0,0,1,0-3.93h4.93a2,2,0,1,1,0,3.93Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/tiktok.svg b/app/Views/_assets/icons/social/tiktok.svg
new file mode 100755
index 0000000000..0362bd93bb
--- /dev/null
+++ b/app/Views/_assets/icons/social/tiktok.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M16.57,2c.33,2.84,1.91,4.53,4.67,4.71V9.9a7.22,7.22,0,0,1-4.62-1.35v6c0,7.59-8.27,10-11.6,4.52-2.13-3.5-.82-9.64,6-9.88v3.36a11.17,11.17,0,0,0-1.59.39c-1.53.52-2.39,1.49-2.15,3.19.46,3.26,6.45,4.23,6-2.15V2h3.31Z" fill-rule="evenodd"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/twitch.svg b/app/Views/_assets/icons/social/twitch.svg
new file mode 100755
index 0000000000..dbc56ddc97
--- /dev/null
+++ b/app/Views/_assets/icons/social/twitch.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21,3V14.74l-4.7,4.69H12.39L10,21.78h-3V19.43H3V6.13L4.23,3ZM19.43,4.57H6.13V16.31H9.26v2.34l2.35-2.35H16.3l3.13-3.13V4.57ZM16.31,7.7v4.69H14.74V7.7h1.57Zm-3.92,0v4.69H10.83V7.7Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/twitter.svg b/app/Views/_assets/icons/social/twitter.svg
new file mode 100755
index 0000000000..c32aa097ab
--- /dev/null
+++ b/app/Views/_assets/icons/social/twitter.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M22.19,5.68a8.31,8.31,0,0,1-2.4.66A4.2,4.2,0,0,0,21.63,4,8.43,8.43,0,0,1,19,5a4.18,4.18,0,0,0-7.12,3.81A11.8,11.8,0,0,1,3.23,4.48a4.19,4.19,0,0,0,1.29,5.59,4.07,4.07,0,0,1-1.89-.53V9.6A4.19,4.19,0,0,0,6,13.7a4.3,4.3,0,0,1-1.89.07A4.19,4.19,0,0,0,8,16.67a8.41,8.41,0,0,1-6.19,1.74,11.89,11.89,0,0,0,18.31-10c0-.18,0-.37,0-.54a8.62,8.62,0,0,0,2.09-2.17Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/writefreely.svg b/app/Views/_assets/icons/social/writefreely.svg
new file mode 100755
index 0000000000..e6a02e09cf
--- /dev/null
+++ b/app/Views/_assets/icons/social/writefreely.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M6.35,18.83a2.69,2.69,0,0,1-1.47-1.49,4.7,4.7,0,0,1-.23-1.92A26.66,26.66,0,0,1,5,11c.18-1.65.34-3.2.34-3.45,0-1.12-.65-1.51-1.43-.86a4.71,4.71,0,0,0-1,1.82L2.69,9l-.3,0A.91.91,0,0,1,2,8.78,4.69,4.69,0,0,1,2.61,7,4.32,4.32,0,0,1,4.26,5.26a2.39,2.39,0,0,1,2.57.32c.52.52.66,1,.65,2.36,0,.62-.1,2-.22,3.09C6.83,15,6.8,15.32,6.8,15.87c0,.76.12,1.12.46,1.42a.84.84,0,0,0,.65.26c2,0,3.66-2.31,4.41-6a13.11,13.11,0,0,0,.2-3.29c0-1.29,0-2.46-.06-2.61l-.06-.27h2.32l.06.56a31.23,31.23,0,0,1-.56,6.49,13.12,13.12,0,0,0-.17,4.15,1.76,1.76,0,0,0,.4.67c.29.27.3.28,1.06.28a2.26,2.26,0,0,0,1.43-.33C19.29,16,21,12.55,20.79,9.45A3.09,3.09,0,0,0,20,7.12c-.35-.31-.42-.32-.54-.09a1.33,1.33,0,0,1-1.56.29,1.14,1.14,0,0,1-.51-1.07,1.22,1.22,0,0,1,.66-1,1.69,1.69,0,0,1,1-.16,1.91,1.91,0,0,1,1.13.22,3.78,3.78,0,0,1,1.75,2.46,16.69,16.69,0,0,1,0,4.12c-.73,3.46-3.21,6.37-6,7a3.41,3.41,0,0,1-3.12-.61,4.19,4.19,0,0,1-.8-2.78c0-.28,0-.5,0-.5s-.15.29-.32.64c-1,2-2.7,3.38-4.38,3.36a3.91,3.91,0,0,1-1-.13Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/social/youtube.svg b/app/Views/_assets/icons/social/youtube.svg
new file mode 100755
index 0000000000..dca4bf6f97
--- /dev/null
+++ b/app/Views/_assets/icons/social/youtube.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M0,0H24V24H0Z" fill="none"/><path d="M21.54,6.5A30.83,30.83,0,0,1,22,12a30.83,30.83,0,0,1-.46,5.5,2.78,2.78,0,0,1-1.94,2C17.9,20,12,20,12,20s-5.89,0-7.61-.48a2.8,2.8,0,0,1-1.93-2A30.83,30.83,0,0,1,2,12a30.83,30.83,0,0,1,.46-5.5,2.78,2.78,0,0,1,1.93-2C6.11,4,12,4,12,4s5.9,0,7.6.48A2.79,2.79,0,0,1,21.54,6.5ZM10,15.5,16,12,10,8.5Z"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/icons/star-smile.svg b/app/Views/_assets/icons/star-smile.svg
new file mode 100755
index 0000000000..05014c318f
--- /dev/null
+++ b/app/Views/_assets/icons/star-smile.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M12 .5l4.226 6.183 7.187 2.109-4.575 5.93.215 7.486L12 19.69l-7.053 2.518.215-7.486-4.575-5.93 7.187-2.109L12 .5zM10 12H8a4 4 0 0 0 7.995.2L16 12h-2a2 2 0 0 1-3.995.15L10 12z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/timer.svg b/app/Views/_assets/icons/timer.svg
old mode 100644
new mode 100755
index 4f2136e6e9..21ab47678c
--- a/app/Views/_assets/icons/timer.svg
+++ b/app/Views/_assets/icons/timer.svg
@@ -1 +1,6 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path fill="none" d="M0 0h24v24H0z"/><path d="M17.618 5.968l1.453-1.453 1.414 1.414-1.453 1.453a9 9 0 1 1-1.414-1.414zM11 8v6h2V8h-2zM8 1h8v2H8V1z"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M17.618 5.968l1.453-1.453 1.414 1.414-1.453 1.453a9 9 0 1 1-1.414-1.414zM11 8v6h2V8h-2zM8 1h8v2H8V1z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/upload-cloud.svg b/app/Views/_assets/icons/upload-cloud.svg
new file mode 100755
index 0000000000..b87c758121
--- /dev/null
+++ b/app/Views/_assets/icons/upload-cloud.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+    <g>
+        <path fill="none" d="M0 0h24v24H0z"/>
+        <path d="M12 12.586l4.243 4.242-1.415 1.415L13 16.415V22h-2v-5.587l-1.828 1.83-1.415-1.415L12 12.586zM12 2a7.001 7.001 0 0 1 6.954 6.194 5.5 5.5 0 0 1-.953 10.784L18 17a6 6 0 0 0-11.996-.225L6 17v1.978a5.5 5.5 0 0 1-.954-10.784A7 7 0 0 1 12 2z"/>
+    </g>
+</svg>
diff --git a/app/Views/_assets/icons/user-add.svg b/app/Views/_assets/icons/user-add.svg
old mode 100644
new mode 100755
index ab808608ff..2d56227feb
--- a/app/Views/_assets/icons/user-add.svg
+++ b/app/Views/_assets/icons/user-add.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M14 14.252v2.09A6 6 0 0 0 6 22l-2-.001a8 8 0 0 1 10-7.748zM12 13c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm6 6v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3z"/>
+        <path d="M14 14.252V22H4a8 8 0 0 1 10-7.748zM12 13c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm6 4v-3h2v3h3v2h-3v3h-2v-3h-3v-2h3z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/icons/user.svg b/app/Views/_assets/icons/user.svg
old mode 100644
new mode 100755
index 9e64bb5632..f6566c8e4a
--- a/app/Views/_assets/icons/user.svg
+++ b/app/Views/_assets/icons/user.svg
@@ -1,6 +1,6 @@
 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
     <g>
         <path fill="none" d="M0 0h24v24H0z"/>
-        <path d="M4 22a8 8 0 1 1 16 0h-2a6 6 0 1 0-12 0H4zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6zm0-2c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4z"/>
+        <path d="M4 22a8 8 0 1 1 16 0H4zm8-9c-3.315 0-6-2.685-6-6s2.685-6 6-6 6 2.685 6 6-2.685 6-6 6z"/>
     </g>
 </svg>
diff --git a/app/Views/_assets/images/castopod-cover-default.jpg b/app/Views/_assets/images/castopod-cover-default.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..9fe87fd67b898475400ed24dc255351dfddf2840
GIT binary patch
literal 13020
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

literal 0
HcmV?d00001

diff --git a/app/Views/_assets/images/logo-castopod.svg b/app/Views/_assets/images/castopod-logo.svg
similarity index 96%
rename from app/Views/_assets/images/logo-castopod.svg
rename to app/Views/_assets/images/castopod-logo.svg
index 0208232af0..444036e3e8 100644
--- a/app/Views/_assets/images/logo-castopod.svg
+++ b/app/Views/_assets/images/castopod-logo.svg
@@ -1,5 +1,4 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
 <svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 	 viewBox="0 0 202.4 137.8" style="enable-background:new 0 0 202.4 137.8;" xml:space="preserve">
 <style type="text/css">
diff --git a/app/Views/_assets/images/logo-castopod-circle.svg b/app/Views/_assets/images/logo-castopod-circle.svg
deleted file mode 100644
index 562d13facf..0000000000
--- a/app/Views/_assets/images/logo-castopod-circle.svg
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="64" height="64" version="1.1" viewBox="0 0 64 64" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"><metadata><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/><dc:title/></cc:Work></rdf:RDF></metadata>
-<style type="text/css">
-	.st0{fill:#009486;}
-	.st1{fill:#E7F9E4;}
-	.st2{fill:none;}
-	.st3{fill:#E7FFE3;}
-</style>
-<circle cx="32" cy="32" r="32" fill="#e7f9e4" stroke-width="2.0334"/><g transform="matrix(.24971 0 0 .24971 6.7291 14.595)">
-	<path id="dark_greeen_19_" class="st0" d="m181.9 131.7h-32.5s-1.2-2.5-2.5-4.9-4.4-2.3-4.4-2.3h-82.8s-3-0.4-4.5 2.3c-1.6 2.7-2.6 4.9-2.6 4.9h-32c-6.9 0-12.6-5.6-12.6-12.5v-98.9c0-6.9 5.6-12.6 12.5-12.6h161.3c6.9 0 12.6 5.6 12.6 12.5v98.9c0.1 6.9-5.6 12.6-12.5 12.6z"/>
-	<path class="st1" d="m143.7 34.5h-85.1c-14.6 0-26.5 12-26.5 26.6s11.9 26.5 26.5 26.5h85.1c14.6 0 26.5-11.9 26.5-26.5 0.1-14.8-11.8-26.7-26.5-26.6zm-75.4 34.2s-3.9-2.9-9.4-2.9c-4.1 0-8.9 2.5-8.9 2.5-1.3-1.9-2.1-4.1-2.1-6.6 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0 2.7-0.9 5.1-2.4 7zm32.9 6.6c-12.5 0-12-9.6-12-9.6-0.2-1.8 2.1-2.4 2.9-1.3 0.4 0.6 0.4 0.6 0.7 1.7 1.7 5.9 8.4 5.6 8.4 5.6s6.7 0.4 8.4-5.6c0.3-1 0.3-1.1 0.7-1.7 0.8-1 3.1-0.5 2.9 1.3 0 0 0.5 9.6-12 9.6zm51.1-6.9s-4.8-2.5-8.9-2.5c-5.5 0-9.4 2.9-9.4 2.9-1.5-1.9-2.4-4.3-2.4-7 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0.1 2.4-0.7 4.7-2.1 6.6z"/>
-	<path class="st2" d="m110.3 64.3c-0.4 0.6-0.4 0.6-0.7 1.7-1.7 5.9-8.4 5.6-8.4 5.6s-6.7 0.4-8.4-5.6c-0.3-1-0.3-1.1-0.7-1.7-0.8-1-3.1-0.5-2.9 1.3 0 0-0.5 9.6 12 9.6s12-9.6 12-9.6c0.2-1.7-2.1-2.3-2.9-1.3z"/>
-	<path class="st2" d="m143.1 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.6 0.9 5 2.4 7 0 0 3.9-2.9 9.4-2.9 4.1 0 8.9 2.5 8.9 2.5 1.3-1.9 2.1-4.1 2.1-6.6 0-6.3-5.1-11.4-11.4-11.4z"/>
-	<path class="st2" d="m59.3 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.5 0.8 4.7 2.1 6.6 0 0 4.8-2.5 8.9-2.5 5.5 0 9.4 2.9 9.4 2.9 1.5-1.9 2.4-4.3 2.4-7 0-6.3-5.1-11.4-11.4-11.4z"/>
-	
-		
-			<path class="st3" d="m47.1 23.3c-6.3-1.7-11.7 2.1-14.7 7.3-0.7 1.2-0.2 2.2 0.5 2.6 1 0.3 1.7 0.1 2.8-1.5 2.2-3.9 5.9-6.1 10.1-5.3 0 0 2.9 0.9 3.3-1 0.3-1.2-0.8-1.8-2-2.1z"/>
-		
-	
-	
-		
-			<path class="st3" d="m159.9 27.3c-0.1 1.9 2.9 1.9 2.9 1.9 4.2 0.4 6.8 2.3 7.8 6.7 0.6 1.9 1.2 2.2 2.3 2.2 0.8-0.1 1.6-1 1.2-2.4-1.4-5.8-5.1-9.8-11.7-9.9-1.2-0.1-2.4 0.2-2.5 1.5z"/>
-		
-	
-</g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/_default.svg b/app/Views/_assets/images/platforms/_default.svg
deleted file mode 100644
index e3b5c64118..0000000000
--- a/app/Views/_assets/images/platforms/_default.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg width="300" height="300" version="1.1" viewBox="0 0 300 300" xml:space="preserve" xmlns="http://www.w3.org/2000/svg">
-<rect width="300" height="300" rx="67" ry="67" fill="#fff" fill-opacity=".50"/><g transform="matrix(.91201 0 0 .91201 57.704 86.433)">
-	<path id="dark_greeen_19_" d="m181.9 131.7h-32.5s-1.2-2.5-2.5-4.9-4.4-2.3-4.4-2.3h-82.8s-3-0.4-4.5 2.3c-1.6 2.7-2.6 4.9-2.6 4.9h-32c-6.9 0-12.6-5.6-12.6-12.5v-98.9c0-6.9 5.6-12.6 12.5-12.6h161.3c6.9 0 12.6 5.6 12.6 12.5v98.9c0.1 6.9-5.6 12.6-12.5 12.6z" fill="#aaa"/>
-	<path d="m143.7 34.5h-85.1c-14.6 0-26.5 12-26.5 26.6s11.9 26.5 26.5 26.5h85.1c14.6 0 26.5-11.9 26.5-26.5 0.1-14.8-11.8-26.7-26.5-26.6zm-75.4 34.2s-3.9-2.9-9.4-2.9c-4.1 0-8.9 2.5-8.9 2.5-1.3-1.9-2.1-4.1-2.1-6.6 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0 2.7-0.9 5.1-2.4 7zm32.9 6.6c-12.5 0-12-9.6-12-9.6-0.2-1.8 2.1-2.4 2.9-1.3 0.4 0.6 0.4 0.6 0.7 1.7 1.7 5.9 8.4 5.6 8.4 5.6s6.7 0.4 8.4-5.6c0.3-1 0.3-1.1 0.7-1.7 0.8-1 3.1-0.5 2.9 1.3 0 0 0.5 9.6-12 9.6zm51.1-6.9s-4.8-2.5-8.9-2.5c-5.5 0-9.4 2.9-9.4 2.9-1.5-1.9-2.4-4.3-2.4-7 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0.1 2.4-0.7 4.7-2.1 6.6z" fill="#ccc"/>
-	<path d="m110.3 64.3c-0.4 0.6-0.4 0.6-0.7 1.7-1.7 5.9-8.4 5.6-8.4 5.6s-6.7 0.4-8.4-5.6c-0.3-1-0.3-1.1-0.7-1.7-0.8-1-3.1-0.5-2.9 1.3 0 0-0.5 9.6 12 9.6s12-9.6 12-9.6c0.2-1.7-2.1-2.3-2.9-1.3z" fill="#aaa"/>
-	<path d="m143.1 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.6 0.9 5 2.4 7 0 0 3.9-2.9 9.4-2.9 4.1 0 8.9 2.5 8.9 2.5 1.3-1.9 2.1-4.1 2.1-6.6 0-6.3-5.1-11.4-11.4-11.4z" fill="#aaa"/>
-	<path d="m59.3 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.5 0.8 4.7 2.1 6.6 0 0 4.8-2.5 8.9-2.5 5.5 0 9.4 2.9 9.4 2.9 1.5-1.9 2.4-4.3 2.4-7 0-6.3-5.1-11.4-11.4-11.4z" fill="#aaa"/>
-	<path d="m47.1 23.3c-6.3-1.7-11.7 2.1-14.7 7.3-0.7 1.2-0.2 2.2 0.5 2.6 1 0.3 1.7 0.1 2.8-1.5 2.2-3.9 5.9-6.1 10.1-5.3 0 0 2.9 0.9 3.3-1 0.3-1.2-0.8-1.8-2-2.1z" fill="#ccc"/>
-	<path d="m159.9 27.3c-0.1 1.9 2.9 1.9 2.9 1.9 4.2 0.4 6.8 2.3 7.8 6.7 0.6 1.9 1.2 2.2 2.3 2.2 0.8-0.1 1.6-1 1.2-2.4-1.4-5.8-5.1-9.8-11.7-9.9-1.2-0.1-2.4 0.2-2.5 1.5z" fill="#ccc"/>
-</g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/gofundme.svg b/app/Views/_assets/images/platforms/funding/gofundme.svg
deleted file mode 100644
index 8b6a8b0d1e..0000000000
--- a/app/Views/_assets/images/platforms/funding/gofundme.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#008648"/>
- <g transform="matrix(25.805 0 0 25.805 525 -3846.6)" fill="#fff">
-  <path d="m12.765 154.51c0.0337-0.0767 0.0631-0.14717 0.09502-0.2165 0.01373-0.0299 0.06242-0.0446 0.09174-0.0323 0.01685 7e-3 0.01171 0.0207 0.01171 0.0323 0 0.13479 0 0.26957 7.58e-4 0.40393 0 0.0253-0.0079 0.0337-0.0337 0.0337-0.02578 0-0.03369-9e-3 -0.03369-0.0341 1e-3 -0.0954 5.89e-4 -0.1908 0-0.28641 0-0.0147 0.0033-0.0302-0.0062-0.0493-0.02991 0.0724-0.06832 0.1368-0.09123 0.20815-0.0055 0.0169-0.01045 0.0307-0.03193 0.0325-0.02148 2e-3 -0.03201-8e-3 -0.04018-0.0274-0.0235-0.0565-0.04903-0.11229-0.07447-0.16806-0.0049-0.0108-0.0071-0.0243-0.02334-0.0306-0.0089 0.0169-0.0047 0.0352-0.0048 0.0524-5.06e-4 0.0883-9.28e-4 0.1769 0 0.26502 0 0.0259-0.0056 0.0377-0.03471 0.0376-0.02915-8e-5 -0.03024-0.016-0.03024-0.0376 4.22e-4 -0.12905 0-0.25811 6.74e-4 -0.38708 0-0.0169-0.01112-0.0456 0.02022-0.0456 0.02763 0 0.06234-0.0176 0.08028 0.0238 0.02923 0.0674 0.06074 0.13419 0.0914 0.20108 0.0033 7e-3 0.0067 0.0126 0.01272 0.0243z"/>
-  <path d="m12.28 154.53c0-0.0518-0.0027-0.10379 9.27e-4 -0.15534 0.0029-0.0421-0.01314-0.0548-0.05248-0.0501-0.02207 3e-3 -0.04482-5.9e-4 -0.06739 7.6e-4 -0.02367 1e-3 -0.03546-4e-3 -0.03563-0.0318 0-0.0294 0.01483-0.0307 0.03681-0.0306 0.10226 5.9e-4 0.20453 7.6e-4 0.3068 0 0.02451 0 0.03555 7e-3 0.03521 0.0337-3.37e-4 0.027-0.01381 0.0298-0.03487 0.0292-0.02662-8.4e-4 -0.05341 2e-3 -0.07977-6.7e-4 -0.0326-3e-3 -0.04364 8e-3 -0.04296 0.0417 2e-3 0.10782 0 0.21573 1e-3 0.32356 0 0.0261 5.06e-4 0.0451-0.03614 0.0444-0.03665-6.7e-4 -0.03176-0.0222-0.03176-0.0445 2.78e-4 -0.0536 3.62e-4 -0.10701 2.52e-4 -0.1603z"/>
-  <path d="m6.289 155.55c0.07194-0.0627 0.13723-0.11962 0.2111-0.16527 0.21211-0.13116 0.44369-0.1716 0.68942-0.15029 0.11549 9e-3 0.22632 0.0367 0.3325 0.083 0.15163 0.0674 0.26434 0.1769 0.35642 0.31169 0.015332 0.0223 0.023166 0.0267 0.040351 1e-3 0.15727-0.23512 0.38228-0.36392 0.65867-0.39778 0.27378-0.0337 0.52852 0.02 0.73971 0.2106 0.10648 0.0963 0.16604 0.22028 0.19122 0.3613 0.01608 0.0941 0.023858 0.18886 0.023334 0.28431 0.00109 0.48286 0 0.9658 0.00152 1.4489 0 0.0412-0.011457 0.0505-0.051471 0.0505-0.25407-2e-3 -0.50816-2e-3 -0.76228 0-0.036896 0-0.047006-9e-3 -0.046837-0.0464 0.00146-0.38042 0.00163-0.76085 5.054e-4 -1.1413 9.199e-4 -0.0914-0.00863-0.18177-0.02864-0.271-0.073457-0.31169-0.42718-0.31362-0.58487-0.16612-0.09696 0.0907-0.12914 0.20647-0.14321 0.33148-0.01213 0.10631-0.00741 0.21296-0.00758 0.31952-5.054e-4 0.31028-3.707e-4 0.62051 4.212e-4 0.93068 0 0.0321-0.00708 0.0433-0.041529 0.043-0.25833-1e-3 -0.51667-1e-3 -0.775 0-0.036139 0-0.043719-0.0112-0.043635-0.0452 0.00118-0.38464 6.739e-4 -0.76928 7.581e-4 -1.1541 0-0.0786-0.0027-0.15694-0.01786-0.23436-0.028136-0.14413-0.11431-0.2341-0.25584-0.26956-0.16688-0.0415-0.33173 0.0213-0.41934 0.15845-0.05265 0.0823-0.064023 0.1769-0.064695 0.27058-0.00298 0.40716-0.00357 0.81431-0.00177 1.2215 0 0.0436-0.011793 0.053-0.053577 0.0526-0.25407-2e-3 -0.50816-2e-3 -0.76228 0-0.035549 0-0.044057-0.01-0.043973-0.0446 8.988e-4 -0.74546 8.988e-4 -1.4909 0-2.2363 0-0.0366 0.011708-0.0435 0.04532-0.0433 0.25693 1e-3 0.51383 1e-3 0.77071 0 0.036308 0 0.044563 0.0114 0.043551 0.0453-0.00253 0.0768-0.0011 0.15408-0.0011 0.24109z"/>
-  <path d="m3.7061 157.35c-0.052818 0.0513-0.10378 0.10108-0.16132 0.14261-0.13099 0.0951-0.27925 0.14321-0.43922 0.16141-0.24766 0.0281-0.4837-0.0115-0.70197-0.13057-0.3469-0.18912-0.57215-0.47343-0.63415-0.86927-0.050544-0.32441-0.01331-0.63837 0.17387-0.91745 0.20108-0.29897 0.48084-0.48194 0.8413-0.53484 0.26519-0.0391 0.51487 3e-3 0.74586 0.14228 0.061411 0.0369 0.11339 0.0864 0.16974 0.13479 0.010446-0.0169 0.00598-0.0337 0.00598-0.0491 0-0.5179-2.527e-4 -1.0358-7.581e-4 -1.5538 0-0.0427 0.011287-0.0544 0.054082-0.0541 0.25685 2e-3 0.51386 2e-3 0.77054 0 0.032349 0 0.042963 8e-3 0.042963 0.0421-8.988e-4 1.2268-8.988e-4 2.4536 0 3.6803 0 0.0316-0.00615 0.0432-0.041025 0.043-0.26103-2e-3 -0.52217-2e-3 -0.78343 0-0.033696 0-0.043804-0.0106-0.042794-0.0433 0.00177-0.0648 3.369e-4 -0.12931 3.369e-4 -0.19417zm-0.51605-0.40435c0.030832 0 0.062084 3e-3 0.092663-5.1e-4 0.31337-0.0382 0.5249-0.36223 0.43215-0.66658-0.10842-0.35524-0.52919-0.48185-0.82049-0.29392-0.21211 0.13689-0.27133 0.3314-0.23916 0.52995 0.039508 0.24464 0.26898 0.44791 0.53484 0.43106z"/>
-  <path d="m-8.5416 155.18c0.30874-5e-4 0.56592 0.041 0.80213 0.16848 0.32853 0.17791 0.56044 0.43804 0.64334 0.80996 0.12636 0.56752-0.14733 1.1152-0.67501 1.3652-0.18735 0.0887-0.3859 0.13023-0.59203 0.14447-0.21986 0.0152-0.4372 3e-3 -0.65024-0.0534-0.39011-0.10328-0.68942-0.32559-0.85486-0.69919-0.18373-0.41463-0.13739-0.92116 0.20546-1.2889 0.21447-0.22998 0.47814-0.35987 0.78393-0.41412 0.12594-0.0217 0.25247-0.0334 0.33729-0.0325zm0.023335 0.70761c-0.04217-8.6e-4 -0.084009 2e-3 -0.12552 0.01-0.31514 0.0617-0.55488 0.42398-0.38228 0.76456 0.11642 0.22972 0.35844 0.34395 0.62615 0.29593 0.30267-0.0544 0.49777-0.35481 0.43097-0.6542-0.047342-0.2122-0.27268-0.42684-0.54933-0.4164l5e-7 1.7e-4z"/>
-  <path d="m-0.42281 155.55c0.059228-0.0707 0.12623-0.13314 0.20099-0.18718 0.12409-0.0883 0.26502-0.12956 0.41513-0.14473 0.19173-0.0193 0.38076-0.012 0.56221 0.059 0.2758 0.10842 0.4372 0.31101 0.48977 0.60214 0.014321 0.0791 0.016848 0.15846 0.016848 0.2384-3.369e-4 0.47444-8.42e-5 0.94884 7.582e-4 1.4232 0 0.0375-0.00986 0.0464-0.046669 0.0462-0.25541-2e-3 -0.51094-2e-3 -0.76658 0-0.042626 0-0.049618-0.0131-0.049534-0.052 0.001461-0.39019 0.001461-0.78036 0-1.1705 2.106e-4 -0.0814-0.007965-0.16198-0.024514-0.24169-0.029567-0.13655-0.11591-0.22121-0.24817-0.25052-0.17446-0.0388-0.33131-6.8e-4 -0.45388 0.13815-0.058968 0.0668-0.078763 0.14952-0.089377 0.23587-0.012299 0.0992-0.006824 0.19889-0.006992 0.29829-7.3288e-4 0.33269-5.644e-4 0.66535 5.0544e-4 0.99798 0 0.0347-0.008424 0.0446-0.044057 0.0445-0.25833-2e-3 -0.51667-2e-3 -0.775 0-0.036055 0-0.043553-0.0109-0.043468-0.045 8.989e-4 -0.7453 8.989e-4 -1.4906 0-2.2359 0-0.0378 0.010362-0.0462 0.046838-0.0459 0.25682 2e-3 0.51366 2e-3 0.77054 0 0.033696 0 0.046416 7e-3 0.045152 0.0434-0.002612 0.0786-5.0544e-4 0.15702-5.0544e-4 0.24632z"/>
-  <path d="m-1.8386 156.07c0 0.24429 0.00522 0.48858-0.00135 0.73288-0.00842 0.31564-0.14877 0.55724-0.42878 0.71165-0.16924 0.0933-0.35263 0.1379-0.54326 0.16082-0.14793 0.0169-0.29625 0.0216-0.44495 0.0141-0.27209-0.0121-0.53745-0.0569-0.77332-0.20613-0.22503-0.14225-0.35139-0.34636-0.37908-0.61234-0.00555-0.0629-0.00783-0.12584-0.00683-0.18895 1.7e-6 -0.45624 1.7e-6 -0.91256-0.00101-1.3688 0-0.0371 0.00767-0.0497 0.04768-0.0494 0.25693 2e-3 0.51386 2e-3 0.77079 0 0.037992 0 0.049533 8e-3 0.049364 0.0484-0.00152 0.42819-6.739e-4 0.85638-0.00118 1.2846 0 0.0694 0.00741 0.13689 0.035295 0.201 0.049617 0.11414 0.14279 0.17497 0.2592 0.19948 0.10513 0.0221 0.21195 0.0207 0.31506-0.0155 0.14119-0.0497 0.21532-0.1529 0.23469-0.2993 0.00842-0.0642 8e-3 -0.12855 8e-3 -0.193 0-0.39314 5.055e-4 -0.7862-9.266e-4 -1.1794 0-0.0372 0.00935-0.0466 0.046416-0.0463 0.25693 2e-3 0.51386 2e-3 0.77079 0 0.03437 0 0.044984 8e-3 0.044732 0.0437-0.0016 0.25407-8.424e-4 0.50822-8.424e-4 0.76237l-5.055e-4 1.7e-4z"/>
-  <path d="m11.795 156.58h-0.84644c-0.04878 0-0.05282 5e-3 -0.04642 0.0536 0.0063 0.0471 0.0094 0.0946 0.02182 0.14093 0.03951 0.14641 0.12729 0.24775 0.27403 0.29298 0.1272 0.0393 0.25558 0.0471 0.38489 8e-3 0.09368-0.0278 0.16738-0.0842 0.225-0.16132 0.01685-0.0222 0.03327-0.033 0.06225-0.0329 0.2471 1e-3 0.4942 1e-3 0.74131 0 0.04069 0 0.04288 0.0121 0.03142 0.0461-0.13032 0.38548-0.40603 0.60652-0.79244 0.70323-0.1256 0.0312-0.25348 0.0426-0.38304 0.0448-0.22441 4e-3 -0.44546-0.016-0.65631-0.096-0.41362-0.15702-0.6756-0.44874-0.75436-0.88805-0.060062-0.33494-0.01634-0.65707 0.16907-0.94955 0.14186-0.22391 0.34142-0.37907 0.59304-0.45994 0.3405-0.10952 0.68723-0.11794 1.0308-0.0202 0.42524 0.12046 0.67703 0.41437 0.79261 0.83313 0.04111 0.14868 0.04692 0.30115 0.0449 0.45447 0 0.0337-0.01988 0.0303-0.04136 0.0303l-0.85082 9e-5zm-0.39037-0.46517h0.44647c0.01752 0 0.04044 5e-3 0.03201-0.0263-0.03125-0.11642-0.08298-0.21995-0.18482-0.29198-0.10184-0.072-0.21717-0.0832-0.33696-0.0785-0.21902 8e-3 -0.38438 0.14809-0.43122 0.36223-0.0067 0.0309 0.0015 0.035 0.02881 0.0349 0.14826-7.6e-4 0.29703-3.4e-4 0.44571-3.4e-4z"/>
-  <path d="m-6.2272 156.76c0-0.25819-6.739e-4 -0.51647 7.582e-4 -0.775 0-0.0346-0.00842-0.0459-0.043889-0.0446-0.075816 3e-3 -0.15163 0-0.22745 1e-3 -0.025693 5.1e-4 -0.033696-8e-3 -0.033696-0.0337 8.427e-4 -0.20487 8.427e-4 -0.40986 0-0.61495 0-0.0289 0.010193-0.0352 0.03656-0.0347 0.074383 2e-3 0.14894-2e-3 0.22315 2e-3 0.039003 2e-3 0.046247-0.0118 0.045489-0.0474-0.00236-0.10244-0.00345-0.20496 0-0.30731 0.00665-0.21363 0.042625-0.42187 0.16317-0.60299 0.16048-0.241 0.38598-0.39398 0.66895-0.458 0.1983-0.0449 0.39365-0.0359 0.58462 0.0403 0.03597 0.0143 0.047427 0.0322 0.047006 0.0707-0.00211 0.20344-9.266e-4 0.40704-9.266e-4 0.61057 0 0.0585 0 0.059-0.050544 0.0337-0.090136-0.0455-0.18389-0.0728-0.28641-0.067-0.14161 8e-3 -0.23781 0.10336-0.25095 0.2443-0.013815 0.14843-0.00691 0.29702-0.010446 0.44545-7.581e-4 0.0302 0.00952 0.0377 0.038329 0.0375 0.17269-1e-3 0.34538 0 0.5179-1e-3 0.032265 0 0.043467 7e-3 0.043216 0.0421-0.00157 0.19785-0.00157 0.39576 0 0.59372 0 0.036-0.00842 0.0487-0.046753 0.0482-0.16561-2e-3 -0.33123-1e-3 -0.49701-7.6e-4 -0.061832 0-0.055009-7e-3 -0.055009 0.0574v1.5285c0 0.0571 0 0.0571-0.05703 0.0571-0.25541 0-0.51091-5.9e-4 -0.76658 7.6e-4 -0.032937 0-0.042709-8e-3 -0.04212-0.0421 2.519e-4 -0.26106-3.378e-4 -0.52211-3.378e-4 -0.78326z"/>
-  <path d="m13.155 151.67c-0.16452-0.19788-0.55227-0.24665-0.79227-0.13386-0.05054 0.0238-0.10328 0.043-0.14868 0.0758l-1.4398 1.0446c-0.10252 0.0895-0.19535 0.19114-0.20992 0.32322-0.01331 0.12047 0 0.22012 0.10538 0.32769 0.2384 0.24278 0.65926 0.2443 0.85992 0.12198 0.18432-0.11195 1.4019-1.0118 1.6005-1.1585l0.05156-0.0516c0.05888-0.0811 0.1609-0.32364-0.0267-0.54932z"/>
-  <path d="m7.0985 153.28c0.10555-0.10757 0.11869-0.20723 0.10538-0.32769-0.014573-0.13208-0.10741-0.23376-0.20992-0.32322l-1.4398-1.0446c-0.045404-0.0329-0.098054-0.0521-0.14868-0.0758-0.24-0.11279-0.62775-0.064-0.79185 0.13386-0.1876 0.22568-0.085587 0.46812-0.026284 0.54907l0.051556 0.0516c0.19779 0.14691 1.4154 1.0468 1.5999 1.1587 0.20049 0.12207 0.62135 0.1208 0.85975-0.12198z"/>
-  <path d="m8.8947 153c0.30739 0 0.56499-0.13992 0.6382-0.39971 0.00956-0.0359 0.014301-0.0724 0.014238-0.10951l0.00691-0.93658c0-8e-3 5.897e-4 -0.0158 5.897e-4 -0.0237 0-0.36004-0.2902-0.52734-0.65462-0.52734-0.36223 0-0.65665 0.19434-0.6596 0.55101l-6.739e-4 0.94416c-5.896e-4 0.0369 0.00303 0.0734 0.010867 0.10951 0.06259 0.27016 0.32702 0.39213 0.6441 0.39213z"/>
-  <path d="m10.795 153.71c-0.48859-0.24312-1.1344-0.39593-1.9776-0.39593-1.4129 0-2.3603 0.44588-2.8416 1.0939h0.00725l-0.00202 3e-3 5.6862-5.1e-4c-0.20731-0.26855-0.49221-0.5115-0.87213-0.70011z"/>
-  <path d="m-11.318 157.32c-0.04212 0.0348-0.07641 0.0644-0.11196 0.0927-0.15416 0.12392-0.3303 0.1903-0.52742 0.20773-0.28094 0.0253-0.54503-0.0238-0.78536-0.17479-0.28987-0.18162-0.45203-0.44883-0.5019-0.78461-0.04212-0.28119-0.01441-0.55598 0.1192-0.80971 0.19139-0.36307 0.4912-0.58285 0.90136-0.64333 0.21498-0.0318 0.42457-0.0134 0.6248 0.0772 0.08955 0.0405 0.16477 0.10109 0.23309 0.17034 0.01323 0.0135 0.02451 0.0289 0.03673 0.0435l0.01272-8e-3c0-0.0625 0.0014-0.12509-6.74e-4 -0.18751-1e-3 -0.0316 0.0064-0.0439 0.04136-0.0437 0.25833 2e-3 0.51667 2e-3 0.775 0 0.02889 0 0.03841 7e-3 0.03841 0.0375-1e-3 0.76085 0.0012 1.5217-3e-3 2.2829-1e-3 0.17623-0.02157 0.35271-0.10479 0.51428-0.12316 0.23933-0.31548 0.40519-0.55598 0.51782-0.1876 0.088-0.3875 0.12485-0.59364 0.13773-0.25592 0.016-0.50763-3e-3 -0.74973-0.0881-0.3073-0.10749-0.54857-0.29627-0.70264-0.58774-0.0283-0.0536-0.0438-0.1117-0.05551-0.17117-0.0061-0.0307-0.0012-0.0404 0.03311-0.0402 0.21473 2e-3 0.42962 8.4e-4 0.64426 8.4e-4h0.24429c0.01744 0 0.03193 0 0.03984 0.0214 0.05164 0.13833 0.16208 0.20066 0.29947 0.21802 0.13537 0.0168 0.26906 6e-3 0.39222-0.0621 0.15668-0.0868 0.23427-0.22374 0.25044-0.39879 0.0097-0.10437 0.0076-0.20891 0.0063-0.32221zm-0.50914-0.36771c0.29298 8e-3 0.55109-0.23183 0.55126-0.53778 0-0.29661-0.23174-0.54554-0.54907-0.54562-0.3362 0-0.54545 0.27917-0.54697 0.54309-0.0017 0.27976 0.2405 0.54511 0.54478 0.54031z"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/helloasso.svg b/app/Views/_assets/images/platforms/funding/helloasso.svg
deleted file mode 100644
index e8820b3858..0000000000
--- a/app/Views/_assets/images/platforms/funding/helloasso.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <linearGradient id="SVGID_1_" x1="4.322" x2="24.268" y1="33.651" y2="-.503" gradientTransform="matrix(3.9122 0 0 -3.9122 133.76 239.95)" gradientUnits="userSpaceOnUse">
-  <stop stop-color="#498a63" offset="0"/>
-  <stop stop-color="#61b984" offset=".25"/>
- </linearGradient>
- <linearGradient id="SVGID_2_" x1="19.889" x2="40.524" y1="3.627" y2="36.697" gradientTransform="matrix(3.9122 0 0 -3.9122 133.76 239.95)" gradientUnits="userSpaceOnUse">
-  <stop stop-color="#89356d" offset="0"/>
-  <stop stop-color="#b94794" offset=".21"/>
- </linearGradient>
- <linearGradient id="SVGID_3_" x1="3.242" x2="37.689" y1="35.782" y2="23.384" gradientTransform="matrix(3.9122 0 0 -3.9122 133.76 239.95)" gradientUnits="userSpaceOnUse">
-  <stop stop-color="#f59c1c" offset=".6"/>
-  <stop stop-color="#c7702b" offset="1"/>
- </linearGradient>
- <rect width="1050" height="300" rx="150" ry="150" fill="#2e2f5e"/>
-  <path d="m411.92 140.44v52.032h-25.821v-46.946c0-5.4771-1.5649-7.042-3.9122-7.042-2.7385 0-5.8683 2.3473-8.6068 7.042v46.946h-25.821v-97.805l25.821-2.7385v36.775c5.8683-6.2595 11.737-8.9981 19.561-8.9981 11.737-.39122 18.779 7.4332 18.779 20.735zm75.114 24.256h-41.861c1.5649 10.172 6.2595 11.737 14.084 11.737 5.0859 0 9.7805-1.9561 15.649-6.2595l10.563 14.475c-7.8244 6.6507-18.387 10.563-28.559 10.563-25.429 0-37.557-16.04-37.557-37.557 0-20.735 11.737-37.948 34.819-37.948 20.343 0 34.036 13.301 34.036 36.775-.39122 1.9561-.78244 5.4771-1.1737 8.2156zm-24.647-15.649c0-7.042-1.5649-12.91-8.2156-12.91-5.4771 0-8.2156 3.1298-9.3893 14.084h17.605zm31.689 23.082v-77.853l25.821-2.7385v79.418c0 2.3473 1.1737 3.521 3.1298 3.521.78244 0 1.9561 0 2.7385-.78244l4.6946 18.387c-4.6946 1.5649-9.3893 2.3473-14.084 2.3473-14.475.78244-22.3-7.8244-22.3-22.3zm39.122 0v-77.853l25.821-2.7385v79.418c0 2.3473 1.1737 3.521 3.1298 3.521.78244 0 1.9561 0 2.7385-.78244l4.6946 18.387c-4.6946 1.5649-9.3893 2.3473-14.084 2.3473-14.475.78244-22.3-7.8244-22.3-22.3zm106.8-14.866c0 23.082-13.693 37.557-35.992 37.557-21.908 0-35.992-13.301-35.992-37.948 0-23.082 13.693-37.557 35.992-37.557 21.908 0 35.992 13.693 35.992 37.948zm-44.99 0c0 14.084 2.7385 19.17 9.3893 19.17 6.2595 0 9.3893-5.4771 9.3893-19.17 0-14.084-2.7385-19.17-9.3893-19.17s-9.7805 5.8683-9.3893 19.17zm116.97 20.735-5.0859 16.822c-8.9981-.78244-14.866-3.1298-18.779-9.7805-5.0859 7.8244-12.91 10.172-21.126 10.172-14.084 0-23.082-9.3893-23.082-22.3 0-15.649 11.737-24.256 33.645-24.256h5.0859v-1.9561c0-7.042-2.3473-8.9981-10.172-8.9981-6.2595.39122-12.128 1.5649-17.996 3.521l-5.4771-16.431c8.6068-3.521 17.996-5.4771 27.385-5.4771 22.3 0 31.298 8.6068 31.298 25.821v24.256c0 5.0859 1.1737 7.4332 4.3034 8.6068zm-29.342-5.4771v-10.563h-2.7385c-7.4332 0-10.563 2.3473-10.563 7.8244 0 3.9122 2.3473 6.6507 5.8683 6.6507 2.7385.39122 5.8683-1.1737 7.4332-3.9122zm91.154-43.817-8.9981 14.084c-5.0859-3.1298-10.563-5.0859-16.431-5.0859-4.3034 0-5.8683 1.1737-5.8683 3.1298 0 2.3473.78244 3.521 14.084 7.4332 13.301 4.3034 20.343 9.7805 20.343 22.691 0 14.475-13.693 24.256-32.862 24.256-12.128 0-23.473-4.3034-30.515-11.345l12.128-13.693c5.0859 3.9122 11.345 7.042 17.605 7.042 4.6946 0 7.4332-1.5649 7.4332-4.3034 0-3.521-1.5649-4.3034-13.301-7.8244-12.91-3.9122-20.343-11.345-20.343-22.691 0-12.519 10.954-22.691 30.124-22.691 10.172-.39122 20.343 3.1298 26.603 8.9981zm64.551 0-8.9981 14.084c-5.0859-3.1298-10.563-5.0859-16.431-5.0859-4.3034 0-5.8683 1.1737-5.8683 3.1298 0 2.3473.78244 3.521 14.084 7.4332 13.301 4.3034 20.343 9.7805 20.343 22.691 0 14.475-13.693 24.256-32.862 24.256-12.128 0-23.473-4.3034-30.515-11.345l12.128-13.693c5.0859 3.9122 11.345 7.042 17.605 7.042 4.6946 0 7.4332-1.5649 7.4332-4.3034 0-3.521-1.5649-4.3034-13.301-7.8244-12.91-3.9122-20.343-11.345-20.343-22.691 0-12.519 10.954-22.691 30.124-22.691 10.172-.39122 19.952 3.1298 26.603 8.9981zm77.853 28.559c0 23.082-13.693 37.557-35.992 37.557-21.908 0-35.992-13.301-35.992-37.948 0-23.082 13.693-37.557 35.992-37.557 21.908 0 35.992 13.693 35.992 37.948zm-44.99 0c0 14.084 2.7385 19.17 9.3893 19.17 6.2595 0 9.3893-5.4771 9.3893-19.17 0-14.084-2.7385-19.17-9.3893-19.17s-9.7805 5.8683-9.3893 19.17z" fill="#fff"/>
-  <path d="m184.23 201.47c-25.821-29.733-8.6068-104.85 2.3473-104.85-21.126-.78244-57.118 13.301-52.032 63.769 5.8683 46.946 48.12 79.809 94.284 73.941 14.866-1.9561 28.559-7.8244 40.296-16.822-40.687 29.342-68.072 3.1298-84.895-16.04z" fill="url(#SVGID_1_)"/>
-  <path d="m279.29 150.61c-21.517 43.425-87.633 61.813-95.066 50.467 12.91 19.17 44.99 45.382 85.286 15.649 36.775-28.559 43.425-82.156 14.866-119.32-8.9981-11.737-21.126-20.735-34.819-26.603 45.773 20.735 41.078 57.118 29.733 79.809z" fill="url(#SVGID_2_)"/>
-  <path d="m186.57 96.623c46.555-5.0859 99.37 43.034 92.719 54.38 12.91-22.691 16.04-59.074-29.342-79.809-43.425-17.605-92.719 3.521-109.93 47.338-5.4771 13.693-7.4332 28.559-5.4771 43.034-3.1298-50.076 34.819-63.378 52.032-64.943z" fill="url(#SVGID_3_)"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/indiegogo.svg b/app/Views/_assets/images/platforms/funding/indiegogo.svg
deleted file mode 100644
index c701e0bf46..0000000000
--- a/app/Views/_assets/images/platforms/funding/indiegogo.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#eb1478"/>
- <g transform="matrix(.2146 0 0 -.2146 125 207.11)" fill="#fff">
-  <path d="m138.89 6.3047v519.68h-138.89v-519.68h138.89"/>
-  <path d="m493.87 285.41-140.27 240.57h-145.88v-519.68h131.84v270l2.105-0.039 159.2-269.96h127.62v519.68h-132.52v-240.57h-2.094"/>
-  <path d="m974.1 265.8c0-131.17-37.167-139.53-89.066-139.53h-48.418v273.46h42.777c58.946 0 94.707-3.503 94.707-133.93zm-276.31 260.18v-519.68h174.61c164.8 0 242.63 41.387 242.63 260.18 0 214.6-79.22 259.5-244.72 259.5h-172.52"/>
-  <path d="m1303.6 6.3047v519.68h-138.85v-519.68h138.85"/>
-  <path d="m2450.9 122.73c-76.43 0-86.96 52.618-86.96 138.14 0 84.867 10.53 137.47 86.96 137.47 75.76 0 86.27-52.602 86.27-137.47 0-85.527-10.51-138.14-86.27-138.14zm0 409.56c-193.54 0-227.91-126.91-227.91-266.49 0-138.87 34.37-265.8 227.91-265.8 192.87 0 227.24 126.93 227.24 265.8 0 139.58-33.69 266.49-227.24 266.49"/>
-  <path d="m3424.2 122.73c-76.45 0-87 52.618-87 138.14 0 84.867 10.55 137.47 87 137.47 75.68 0 86.23-52.602 86.23-137.47 0-85.527-10.55-138.14-86.23-138.14zm0 409.56c-193.58 0-227.97-126.91-227.97-266.49 0-138.87 34.39-265.8 227.97-265.8 192.83 0 227.18 126.93 227.18 265.8 0 139.58-33.65 266.49-227.18 266.49"/>
-  <path d="m3696.2 15.27c-20.74 0-25.51 14.648-25.51 33.73 0 19.199 4.77 33.828 25.51 33.828 20.76 0 25.62-14.629 25.62-33.828 0-19.082-4.86-33.73-25.62-33.73zm0 73.262c-25.33 0-31.54-17.109-31.54-39.531 0-22.305 6.21-39.316 31.54-39.316 25.21 0 31.66 17.012 31.66 39.316 0 22.422-6.45 39.531-31.66 39.531"/>
-  <path d="m3698 50.133h-7.91v14.219h7.91c4.66 0 6.23-1.9727 6.23-7.1485 0-5.0976-1.57-7.0703-6.23-7.0703zm15.66 7.793c0 9.4336-3.11 14.844-15.25 14.844h-17.97v-47.012h9.65v16.602h6.13l7.26-16.602h9.87l-7.89 17.539c6.32 2.0703 8.2 7.2656 8.2 14.629"/>
-  <path d="m1956.7 206.85h89.59v-9.082c0-57.422 1.79-82.754-66.61-82.754-63.82 0-85.58 29.453-85.58 146.56 0 122.04 36.46 136.77 91.17 136.77 40.65 0 69.43-10.508 93.28-23.867l74.34 115.74c-39.3 25.254-96.8 42.07-161.31 42.07-179.51 0-237.03-86.269-237.03-266.49 0-157.09 42.07-265.8 212.48-265.8 30.19 0 56.13 2.0703 78.48 6.3086h127.71v313.48h-201.19l-15.33-112.93"/>
-  <path d="m2930 206.85h89.59v-9.082c0-57.422 1.79-82.754-66.6-82.754-63.83 0-85.59 29.453-85.59 146.56 0 122.04 36.46 136.77 91.17 136.77 40.65 0 69.43-10.508 93.28-23.867l74.34 115.74c-39.3 25.254-96.8 42.07-161.31 42.07-179.51 0-237.03-86.269-237.03-266.49 0-157.09 42.07-265.8 212.48-265.8 30.19 0 56.13 2.0703 78.48 6.3086h127.71v313.48h-201.19l-15.33-112.93"/>
-  <path d="m1718 399.05v126.93h-345.04v-519.68h345.04v123.42h-208.96v77.871h137.24l16.76 123.41h-154v68.047h208.96"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/kickstarter.svg b/app/Views/_assets/images/platforms/funding/kickstarter.svg
deleted file mode 100644
index ea1b6cef3d..0000000000
--- a/app/Views/_assets/images/platforms/funding/kickstarter.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#05ce78"/>
- <path d="m200.13 172.35c0 10.244-8.5504 18.827-19.203 18.689-5.8871 0-11.915-2.7686-15.559-8.029l-3.9252-5.5381c-1.8219 8.03-8.8307 13.567-17.801 13.567-10.373 0-18.643-8.3057-18.643-18.551v-46.375c0-10.244 8.1299-18.55 18.643-18.55 9.111 0 16.259 5.9528 17.941 14.12l4.4853-6.0912c3.6445-4.9837 9.5316-7.891 15.419-7.891 10.092 0 18.643 7.891 18.643 18.135 0 3.8759-1.1214 7.7522-3.5042 10.936l-8.9711 12.321 8.9711 12.321c2.3828 3.3219 3.5042 7.0599 3.5042 10.936zm25.809-64.787c11.247 0 20.243 9.1521 20.102 19.968v43.542c0 10.816-8.8558 19.968-20.243 19.968-11.106 0-20.102-9.0136-20.102-19.968v-43.542c0-10.816 8.9965-19.968 20.243-19.968zm98.017 60.535c0 13.407-11.204 22.943-29.185 22.943-24.067 0-41.772-17.829-41.772-41.739 0-23.91 17.705-41.739 41.772-41.739 17.981 0 29.185 9.5365 29.185 22.943 0 8.9834-4.4258 15.064-13.278 18.796 8.8525 3.7322 13.278 9.9512 13.278 18.797zm82.087 4.252c0 10.244-8.5658 18.827-19.098 18.689-5.8983 0-11.937-2.7686-15.588-8.029l-3.9317-5.5381c-1.8258 8.03-8.8475 13.567-17.835 13.567-10.392 0-18.677-8.3057-18.677-18.551v-46.375c0-10.244 8.145-18.55 18.677-18.55 9.1283 0 16.291 5.9528 17.976 14.12l4.3533-6.0912c3.6508-4.9837 9.5492-7.891 15.447-7.891 10.112 0 18.677 7.891 18.677 18.135 0 3.8759-1.1233 7.7522-3.5108 10.936l-8.9875 12.321 8.9875 12.321c2.3875 3.3219 3.5108 7.0599 3.5108 10.936zm70.957-6.9977c0 16.61-12.827 27.08-34.437 27.08-22.028 0-32.346-7.5387-32.346-19.822 0-8.5146 6.5525-13.958 15.893-13.958h0.14l-5.0192-4.6068c-6.2742-5.7232-10.596-11.446-10.596-19.822 0-16.332 11.99-26.661 32.485-26.661 20.913 0 30.812 7.3982 30.812 19.822 0 7.3977-5.0192 12.423-12.547 13.54l5.1583 4.6062c6.2742 5.5836 10.457 11.446 10.457 19.822zm56.732 8.2975c0 10.295-8.7817 18.783-20.072 18.783-10.873 0-19.655-8.4876-19.655-18.783v-28.8c-9.3391-0.55666-17.006-8.209-17.006-17.948 0-10.157 8.085-17.948 17.982-17.948h37.776c9.8975 0 17.982 7.93 17.982 17.948 0 9.7389-7.6667 17.53-17.007 17.948zm48.894 2.8792c-4.7458 9.8128-11.447 14.512-19.544 14.512-14.659 0-25.269-13.406-18.707-28.471l17.172-39.804c4.3283-9.8128 10.61-15.203 21.22-15.203 10.75 0 17.032 5.39 21.221 15.203l17.172 39.804c6.4216 15.065-4.0492 28.471-18.847 28.471-8.2358 0-14.937-4.6989-19.685-14.512zm46.026-46.845c0-13.635 7.2908-20.73 20.33-20.73h24.257c14.722 0 26.219 11.13 26.219 25.46 0 7.7913-3.2258 14.192-8.5533 18.226l7.2908 11.548c1.9625 3.0606 2.8042 6.4004 2.8042 9.8786 0 10.296-8.1325 18.366-18.367 18.366-6.3092 0-12.478-3.2002-15.983-9.0443l-1.9633-3.4782c-2.3833 7.374-8.9733 12.522-17.386 12.522-10.235 0-18.647-8.6266-18.647-19.061zm130.5 43.965c0 10.295-8.6258 18.783-20.174 18.783-10.852 0-19.617-8.4876-19.617-18.783v-28.8c-9.3217-0.55666-16.974-8.209-16.974-17.948 0-10.157 8.07-17.948 17.948-17.948h37.843c9.8783 0 17.947 7.93 17.947 17.948 0 9.7389-7.6517 17.53-16.973 17.948zm87.93 2.7865c0 8.9794-7.1883 16.135-15.898 15.994h-29.032c-13.272 0-20.461-7.0143-20.461-20.764v-41.948c0-13.609 7.1883-20.764 20.461-20.764h29.032c8.71 0 15.898 7.1546 15.898 16.134 0 8.1373-4.9766 14.03-12.166 15.433 3.3183 2.1045 5.1158 5.6116 5.1158 10.241 0 4.6302-1.9358 8.1376-5.1158 10.242 7.0508 1.403 12.166 7.4359 12.166 15.432zm5.5659-46.752c0-13.635 7.1508-20.73 20.33-20.73h24.257c14.722 0 26.218 11.13 26.218 25.46 0 7.7913-3.225 14.192-8.5525 18.226l7.2908 11.548c1.9625 3.0606 2.8042 6.4004 2.8042 9.8786 0 10.296-8.1325 18.366-18.367 18.366-6.3092 0-12.479-3.2002-15.984-9.0443l-1.9625-3.4782c-2.3833 7.374-8.9733 12.522-17.386 12.522-10.236 0-18.647-8.6266-18.647-19.061v-43.687" fill="#fff"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/kisskissbankbank.svg b/app/Views/_assets/images/platforms/funding/kisskissbankbank.svg
deleted file mode 100644
index fc9fa40dde..0000000000
--- a/app/Views/_assets/images/platforms/funding/kisskissbankbank.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150"/>
- <path d="m451.53 234.43c-5.1982-1.5812-9.9198-6.0479-11.315-10.704-1.3748-4.5888-0.98625-10.172 0.98296-14.124 3.0594-6.1394 8.3802-8.6365 23.162-10.87 10.665-1.6113 13.347-2.5798 13.469-4.8625 0.14138-2.6542-0.14928-3.481-1.8252-5.1921-1.4683-1.4991-2.1941-1.6804-6.7271-1.6804-4.8892 0-5.1553 0.083-7.0426 2.1952-1.0788 1.2074-1.9614 2.6441-1.9614 3.1929 0 0.83438-1.5333 0.99766-9.3682 0.99766h-9.3682l0.39093-2.5207c1.7348-11.186 11.312-16.972 28.092-16.972 13.434 0 20.84 3.1166 24.755 10.419 1.3598 2.5359 1.4634 3.8918 1.8229 23.862 0.25423 14.121 0.6491 21.804 1.1854 23.066 0.44231 1.0408 0.80423 2.0238 0.80423 2.1846 0 0.16077-4.3723 0.29233-9.7161 0.29233h-9.7161l-0.44137-2.3526c-0.24274-1.294-0.56154-2.3526-0.70845-2.3526-0.1469 0-1.5239 0.91043-3.06 2.0232-1.5361 1.1127-4.3107 2.4739-6.1658 3.0248-3.5444 1.0526-14.254 1.2845-17.249 0.37362zm22.985-14.119c2.1023-2.3108 3.2253-5.8421 3.2306-10.158l4e-3 -3.0592-7.2259 1.7673c-10.34 2.529-11.595 3.4318-11.595 8.3399 0 2.7674 1.7187 4.8447 4.5201 5.4633 1.0261 0.22659 2.1628 0.48458 2.526 0.57331 2.1263 0.51945 6.891-1.1131 8.5406-2.9263zm253.28 14.119c-5.1982-1.5812-9.9198-6.0479-11.315-10.704-1.3748-4.5888-0.98626-10.172 0.98296-14.124 3.0594-6.1394 8.3802-8.6365 23.162-10.87 10.665-1.6113 13.347-2.5798 13.469-4.8625 0.14142-2.6542-0.14928-3.481-1.8252-5.1921-1.4682-1.4991-2.1942-1.6804-6.7271-1.6804-4.8891 0-5.1553 0.083-7.0426 2.1952-1.0788 1.2074-1.9614 2.6441-1.9614 3.1929 0 0.83438-1.5333 0.99766-9.3682 0.99766h-9.3682l0.39094-2.5207c1.7348-11.186 11.312-16.972 28.092-16.972 13.434 0 20.84 3.1166 24.755 10.419 1.3597 2.5359 1.4633 3.8918 1.823 23.862 0.25424 14.121 0.64907 21.804 1.1855 23.066 0.44228 1.0408 0.80418 2.0238 0.80418 2.1846 0 0.16077-4.3722 0.29233-9.7161 0.29233h-9.7161l-0.44138-2.3526c-0.24274-1.294-0.56156-2.3526-0.70846-2.3526-0.14689 0-1.5239 0.91043-3.06 2.0232-1.5361 1.1127-4.3107 2.4739-6.1658 3.0248-3.5444 1.0526-14.254 1.2845-17.249 0.37362zm22.985-14.119c2.1023-2.3108 3.2253-5.8421 3.2306-10.158l5e-3 -3.0592-7.2259 1.7673c-10.34 2.529-11.595 3.4318-11.595 8.3399 0 2.7674 1.7186 4.8447 4.5201 5.4633 1.0261 0.22659 2.1628 0.48458 2.5259 0.57331 2.1263 0.51945 6.8911-1.1131 8.5406-2.9263zm-383.94-26.599v-40.077l24.703 0.22259c23.636 0.21299 24.876 0.28746 28.713 1.7254 5.0079 1.8764 8.184 4.4025 10.776 8.5705 1.831 2.9445 2.015 3.7675 2.0133 9.009-2e-3 4.6318-0.28966 6.3073-1.4623 8.503-1.5411 2.8856-6.3585 7.6636-7.7774 7.7139-0.46106 0.0164 0.37163 0.65469 1.8504 1.4185 3.794 1.9597 6.8888 5.0615 8.9505 8.9705 1.56 2.9579 1.7727 4.1381 1.7738 9.8431 2e-3 6.0751-0.14556 6.77-2.3367 11.066-2.8192 5.5269-6.9837 8.9936-13.429 11.179-4.1333 1.4015-5.7028 1.4937-29.072 1.7073l-24.703 0.22578zm42.397 22.522c3.5348-0.98195 5.4623-3.3796 5.835-7.258 0.38843-4.0423-1.005-7.0321-4.0478-8.6849-1.7461-0.94849-4.2537-1.2265-12.76-1.4148l-10.587-0.23429v18.267l9.5785-4e-3c5.2682-2e-3 10.66-0.30406 11.981-0.67114zm-3.0188-31.674c3.8982-0.98159 5.6576-3.1945 5.6576-7.116 0-2.3834-0.38485-3.3707-1.9072-4.8931-2.336-2.336-5.2934-2.8451-14.897-2.5646l-7.0579 0.20615-0.19383 6.674c-0.10661 3.6707-0.0405 7.0736 0.14695 7.562 0.43657 1.1377 13.871 1.2346 18.252 0.13171zm96.402 19.894v-29.259l18.485 0.37405 0.19857 3.3958 0.19856 3.3958 2.5603-2.4356c4.005-3.8099 8.2829-5.5323 14.628-5.8898 9.8009-0.55218 16.542 2.8789 19.793 10.075 1.5802 3.4972 1.6112 3.9526 1.8086 26.58l0.20085 23.022h-19.501l-0.19673-19.885-0.19674-19.885-2.2763-2.033c-2.1223-1.8954-2.5642-2.0146-6.532-1.762-3.3506 0.21335-4.6362 0.62192-6.0446 1.921-3.4201 3.1547-3.6321 4.5443-3.6321 23.81v17.834h-19.493zm63.857-10.736v-39.995h19.493v39.828l17.607-18.318h10.69c5.8794 0 10.69 0.2074 10.69 0.46089s-4.7136 5.2327-10.475 11.065c-7.0559 7.1431-10.306 10.887-9.9576 11.47 0.28429 0.47644 5.6028 8.4996 11.819 17.829 6.2161 9.3296 11.302 17.118 11.302 17.309 0 0.19019-5.0666 0.33866-11.259 0.32995l-11.259-0.0159-9.4105-14.202-9.4105-14.202-0.18141 14.218-0.18141 14.218h-19.466zm76.628-7e-3v-40.077l24.703 0.2226c23.636 0.21298 24.876 0.28745 28.713 1.7253 5.0079 1.8764 8.1839 4.4025 10.776 8.5705 1.831 2.9445 2.015 3.7674 2.0133 9.009-2e-3 4.6318-0.28966 6.3073-1.4623 8.503-1.5411 2.8856-6.3585 7.6636-7.7774 7.7139-0.46105 0.0164 0.37165 0.65467 1.8504 1.4185 3.794 1.9597 6.8888 5.0615 8.9505 8.9705 1.56 2.9579 1.7727 4.1381 1.7738 9.8431 2e-3 6.0751-0.14557 6.77-2.3367 11.066-2.8192 5.5269-6.9837 8.9936-13.429 11.179-4.1333 1.4015-5.7028 1.4937-29.072 1.7073l-24.703 0.22579zm42.397 22.522c3.5348-0.98192 5.4623-3.3795 5.835-7.258 0.38842-4.0423-1.005-7.0321-4.0478-8.6849-1.7461-0.9485-4.2537-1.2265-12.76-1.4148l-10.587-0.23432v18.267l9.5785-4e-3c5.2682-2e-3 10.66-0.30409 11.981-0.67116zm-2.4847-31.649c3.9275-1.0905 5.7957-3.3074 5.7957-6.8776 0-3.7042-1.8328-6.2059-5.24-7.1522-1.3695-0.38038-6.1955-0.69328-10.724-0.69532l-8.2342-4e-3v15.46l7.8981-4e-3c4.344-2e-3 9.071-0.32942 10.505-0.72747zm95.868 19.869v-29.259l18.485 0.37402 0.19854 3.3958 0.19858 3.3958 2.5604-2.4356c4.005-3.8099 8.2828-5.5323 14.628-5.8898 9.8008-0.55219 16.542 2.8789 19.793 10.075 1.5802 3.4972 1.6112 3.9526 1.8086 26.58l0.20085 23.022h-19.501l-0.19664-19.885-0.19678-19.885-2.2762-2.033c-2.1222-1.8954-2.5643-2.0147-6.532-1.762-3.3505 0.21333-4.6362 0.62192-6.0446 1.921-3.4201 3.1547-3.632 4.5443-3.632 23.81v17.834h-19.493zm63.857-10.736v-39.995h19.493v39.828l17.607-18.318h10.69c5.8794 0 10.69 0.2074 10.69 0.46089 0 0.25351-4.7136 5.2327-10.475 11.065-7.0559 7.1431-10.306 10.887-9.9577 11.47 0.28434 0.47646 5.6029 8.4996 11.819 17.829 6.2161 9.3296 11.302 17.118 11.302 17.309 0 0.19019-5.0666 0.33866-11.259 0.32995l-11.259-0.0159-18.821-28.404-0.18143 14.218-0.1814 14.218h-19.466zm-642.11 20.828c-26.293-4.9828-46.186-23.638-53.389-50.067-0.93564-3.4332-1.1837-6.8892-1.1579-16.132 0.0303-10.859 0.17462-12.228 1.8785-17.813 3.3538-10.993 8.3207-19.61 15.832-27.468 9.8577-10.313 20.972-16.647 34.581-19.708 6.4242-1.445 21.297-1.4479 27.637-0.0057 12.769 2.9053 24.72 9.3451 32.58 17.555l2.3324 2.4363-46.333 46.347 45.701 45.794-2.6887 2.3784c-8.2266 7.2773-18.588 12.902-28.486 15.463-8.253 2.1358-20.815 2.6737-28.488 1.2198zm92.184-21.419c-4.6231-1.6521-7.062-3.7992-26.986-23.758l-20.007-20.042 21.016-20.899c23.924-23.791 23.458-23.466 33.451-23.397 4.8391 0.0331 6.2498 0.31579 9.2176 1.8472 5.0387 2.6001 7.7337 5.2161 10.324 10.021 2.1015 3.8989 2.2782 4.6914 2.2908 10.274 0.0109 4.8022-0.28577 6.6976-1.4388 9.1925-2.0662 4.4708-6.4515 8.9385-11.009 11.216l-3.9213 1.9595 2.9632 1.1317c4.2266 1.6141 9.3165 6.4588 11.537 10.981 1.6383 3.3362 1.8823 4.6175 1.8823 9.8828 0 5.2653-0.24404 6.5466-1.8823 9.8828-2.3569 4.7995-7.4136 9.4298-12.291 11.255-4.2616 1.5945-11.357 1.8064-15.145 0.45248zm197-46.856c-12.5-1.2927-20.822-7.9125-21.953-17.463l-0.3926-3.3149h18.229l0.43212 1.9675c1.3596 6.1901 11.205 8.7528 16.502 4.2954 2.5626-2.1563 2.6811-4.952 0.28962-6.8332-0.95-0.74728-5.0384-2.1135-9.2424-3.0885-12.038-2.792-13.414-3.1894-16.713-4.8267-4.2149-2.0919-7.0761-5.7123-7.9888-10.109-1.4759-7.1094 0.83402-12.968 6.6461-16.855 4.6308-3.0976 9.0073-4.307 17.039-4.7086 17.045-0.85245 27.231 4.6787 29.082 15.792l0.47572 2.8568h-18.099l-0.39749-1.9876c-0.52573-2.6286-3.3868-4.062-8.1078-4.062-6.026 0-8.8639 2.1244-7.1402 5.3451 1.1756 2.1966 4.3602 3.4209 14.263 5.4832 5.1248 1.0673 10.293 2.349 11.484 2.8483 5.4398 2.2795 9.8762 8.6787 9.8896 14.265 0.0341 14.187-13.947 22.501-34.298 20.396zm60.756 0.0496c-10.913-1.1653-17.395-5.027-20.834-12.412-0.86441-1.8562-1.5746-4.5093-1.5782-5.8956l-7e-3 -2.5207h17.936l0.81518 2.7209c0.94331 3.1484 3.5977 5.0936 7.7779 5.6998 5.51 0.79898 11.132-2.8859 10.181-6.6732-0.6693-2.6667-2.7356-3.5852-13.757-6.1155-11.297-2.5935-15.657-4.4525-18.777-8.0058-5.8618-6.6762-4.1666-17.931 3.476-23.077 4.5679-3.0761 9.036-4.2651 17.623-4.6895 17.03-0.84175 26.658 4.5492 28.771 16.11l0.46061 2.5207-17.874-0.029-1.0083-2.167c-1.3016-2.7974-3.4821-3.8337-8.0661-3.8337-4.4282 0-6.9781 1.1367-7.28 3.2453-0.49738 3.474 3.1261 5.2516 15.978 7.8378 10.025 2.0174 14.228 4.1028 17.265 8.5654 3.6021 5.2928 3.5902 12.1-0.0318 18.281-4.5965 7.8434-16.844 11.958-31.072 10.438zm173.98-0.0312c-2.7054-0.27586-6.7888-1.1976-9.0744-2.0482-7.4666-2.7789-13.23-10.276-13.23-17.209v-1.5774l18.401 0.37402 0.55073 2.1289c1.1689 4.5181 7.0067 7.1182 12.6 5.612 3.7565-1.0115 5.553-2.8896 5.2893-5.5295-0.29181-2.9204-2.5385-4.3157-9.6182-5.9733-17.503-4.0981-21.44-5.8817-24.341-11.026-2.0437-3.6247-2.1539-11.282-0.21694-15.079 1.8656-3.6569 6.2135-7.1291 11.027-8.8059 5.0521-1.76 17.045-2.4957 22.87-1.403 10.096 1.8938 16.318 7.3608 17.616 15.479l0.43981 2.7504h-18.153l-0.39752-1.9876c-0.52851-2.6426-3.3881-4.062-8.1836-4.062-4.1625 0-5.9811 0.69702-7.0553 2.7041-1.8925 3.5362 2.2496 5.7774 15.468 8.3698 12.063 2.3657 16.535 5.0898 19.337 11.778 1.3246 3.1615 0.79592 10.242-1.029 13.782-4.5878 8.8988-16.741 13.309-32.302 11.722zm59.938 0.0312c-13.413-1.4323-20.733-7.1858-22.378-17.588l-0.51209-3.2397h18.452l0.40673 2.0337c0.93341 4.6669 6.6965 7.4325 12.558 6.0264 6.5197-1.564 7.9925-7.4317 2.4414-9.727-1.1717-0.48451-5.9115-1.703-10.533-2.7077-13.587-2.954-17.729-5.1016-20.478-10.619-3.9638-7.9542-1.2209-16.844 6.5726-21.303 10.245-5.8612 30.633-5.2248 38.754 1.2096 2.8614 2.2672 6.072 8.2663 6.072 11.346v2.2321l-17.141-0.029-1.0083-2.167c-1.3016-2.7974-3.482-3.8337-8.0661-3.8337-4.6324 0-6.9916 1.1245-7.2646 3.4625-0.41491 3.5547 3.1237 5.1786 17.194 7.8906 8.4906 1.6365 12.944 3.9125 15.841 8.0949 1.8374 2.6534 2.1442 3.7297 2.3586 8.274 0.21678 4.5953 0.0287 5.6682-1.5608 8.9175-4.2886 8.7656-16.646 13.336-31.709 11.728zm-417.66-41.329v-39.995h20.811l0.18142 14.204 0.18141 14.204 26.659-28.409h25.014l-1.6694 1.8485c-1.6683 1.8474-20.046 21.56-24.993 26.808l-2.6182 2.7778 16.069 23.437c8.8379 12.89 16.295 23.815 16.57 24.277 0.39418 0.66024-2.2194 0.84023-12.201 0.84023h-12.703l-30.129-43.896-0.17723 21.948-0.17722 21.948h-20.819zm78.645 10.755v-29.24h18.821v58.48h-18.821zm155.27-10.755v-39.995h20.811l0.18143 14.161 0.18142 14.161 26.614-28.321h25.081l-2.3522 2.5207c-1.2937 1.3864-7.1628 7.6628-13.042 13.948-5.8796 6.2849-11.421 12.236-12.313 13.225l-1.623 1.7977 16.041 23.362c8.8228 12.849 16.283 23.761 16.579 24.249 0.43766 0.72212-1.8326 0.88688-12.22 0.88688h-12.758l-30.006-43.805-0.17723 21.903-0.17724 21.902h-20.819zm78.645 10.755v-29.24h18.821v58.48h-18.821zm-233.92-43.019v-7.73h18.821v15.46h-18.821zm233.92 0v-7.73h18.821v15.46h-18.821z" fill="#fff" stroke-width=".67218"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/liberapay.svg b/app/Views/_assets/images/platforms/funding/liberapay.svg
deleted file mode 100644
index 21a14fd912..0000000000
--- a/app/Views/_assets/images/platforms/funding/liberapay.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#f6c915"/>
- <g transform="matrix(2.9235 0 0 2.9235 110.03 -24.29)" fill="#1a171b">
-  <g transform="matrix(1.5452 0 0 1.5452 -536.72 -207.67)">
-   <path d="m410.27 182.21-0.664 2.814h-11.498l4.408-18.401h3.346l-3.733 15.587z"/>
-   <path d="m415.39 185.03h-3.213l3.347-13.887h3.212zm2.391-15.984c-0.479 0-0.896-0.141-1.249-0.425-0.354-0.283-0.531-0.708-0.531-1.274 0-0.655 0.226-1.195 0.677-1.62s0.97-0.637 1.554-0.637c0.479 0 0.898 0.146 1.262 0.438 0.362 0.292 0.545 0.722 0.545 1.288 0 0.656-0.23 1.191-0.69 1.606-0.461 0.415-0.985 0.624-1.568 0.624z"/>
-   <path d="m428.49 170.82c0.813 0 1.516 0.137 2.106 0.411 0.593 0.275 1.084 0.65 1.474 1.128 0.389 0.478 0.681 1.04 0.875 1.687s0.291 1.34 0.291 2.084c0 1.221-0.211 2.39-0.638 3.505-0.424 1.115-1.03 2.098-1.817 2.947-0.787 0.85-1.749 1.527-2.882 2.032-1.133 0.504-2.407 0.757-3.823 0.757-0.212 0-0.496-0.01-0.849-0.027-0.355-0.018-0.743-0.063-1.17-0.133-0.424-0.07-0.858-0.168-1.301-0.292s-0.85-0.283-1.221-0.478l4.647-19.49 3.362-0.531-1.707 7.117c0.388-0.195 0.803-0.363 1.246-0.505 0.443-0.141 0.911-0.212 1.407-0.212zm-3.988 11.843c0.813 0 1.562-0.173 2.243-0.518s1.265-0.81 1.752-1.394c0.485-0.585 0.862-1.252 1.129-2.005 0.266-0.751 0.398-1.536 0.398-2.35 0-0.407-0.037-0.783-0.105-1.128-0.071-0.345-0.194-0.646-0.371-0.902-0.178-0.257-0.416-0.461-0.717-0.61-0.3-0.15-0.679-0.227-1.138-0.227-0.389 0-0.813 0.071-1.272 0.213s-0.882 0.363-1.271 0.664l-1.95 8.125c0.159 0.035 0.339 0.066 0.544 0.093 0.203 0.025 0.456 0.039 0.758 0.039z"/>
-   <path d="m435.15 180.01c0-1.185 0.19-2.331 0.571-3.438 0.38-1.106 0.929-2.088 1.646-2.948 0.716-0.858 1.58-1.543 2.588-2.058 1.01-0.513 2.142-0.77 3.399-0.77 1.345 0 2.39 0.345 3.134 1.036 0.743 0.689 1.114 1.575 1.114 2.655 0 1.115-0.274 2.018-0.822 2.708-0.549 0.69-1.261 1.23-2.138 1.62-0.876 0.39-1.868 0.655-2.975 0.797-1.106 0.142-2.227 0.23-3.358 0.265-0.018 0.036-0.027 0.071-0.027 0.107v0.265c0 1.61 1.02 2.417 3.055 2.417 1.204 0 2.406-0.248 3.609-0.744l0.268 2.603c-0.426 0.195-1.028 0.389-1.806 0.585-0.78 0.194-1.665 0.292-2.655 0.292-0.991 0-1.843-0.143-2.549-0.425-0.709-0.283-1.289-0.672-1.74-1.167-0.451-0.496-0.783-1.067-0.995-1.714s-0.319-1.341-0.319-2.086zm7.728-6.584c-0.53 0-1.035 0.105-1.514 0.318-0.479 0.212-0.903 0.505-1.274 0.876-0.372 0.372-0.695 0.81-0.97 1.314s-0.474 1.048-0.597 1.633c2.124-0.071 3.668-0.328 4.633-0.77 0.965-0.443 1.447-1.106 1.447-1.992 0-0.354-0.128-0.672-0.386-0.956-0.254-0.282-0.702-0.423-1.339-0.423z"/>
-   <path d="m458.67 173.98c-0.354-0.124-0.735-0.221-1.146-0.292-0.406-0.07-0.887-0.106-1.438-0.106-0.303 0-0.621 0.022-0.96 0.066-0.337 0.045-0.621 0.102-0.853 0.172l-2.667 11.206h-3.212l3.187-13.25c0.743-0.248 1.548-0.464 2.416-0.65 0.866-0.186 1.805-0.279 2.813-0.279 0.213 0 0.452 0.014 0.719 0.041 0.264 0.025 0.524 0.057 0.783 0.092 0.255 0.036 0.494 0.08 0.716 0.132 0.222 0.054 0.412 0.116 0.57 0.186z"/>
-   <path d="m470.94 179.64c-0.054 0.195-0.107 0.513-0.159 0.956-0.054 0.443-0.079 0.858-0.079 1.248 0 0.514 0.044 1.013 0.131 1.5 0.091 0.487 0.23 0.978 0.427 1.473l-2.869 0.425c-0.212-0.425-0.381-0.877-0.504-1.354-0.442 0.389-0.986 0.74-1.633 1.049s-1.377 0.464-2.191 0.464c-0.832 0-1.545-0.137-2.138-0.412-0.592-0.274-1.075-0.654-1.446-1.142-0.372-0.486-0.647-1.057-0.823-1.712-0.178-0.655-0.265-1.363-0.265-2.125 0-1.291 0.23-2.496 0.69-3.611 0.459-1.115 1.101-2.079 1.924-2.894 0.824-0.814 1.802-1.456 2.935-1.925 1.132-0.469 2.372-0.703 3.718-0.703 0.69 0 1.384 0.058 2.083 0.173s1.404 0.332 2.111 0.65zm-1.747-6.002c-0.337-0.07-0.716-0.106-1.143-0.106-0.797 0-1.532 0.173-2.207 0.518-0.674 0.346-1.253 0.806-1.74 1.38-0.486 0.576-0.863 1.234-1.128 1.979-0.267 0.743-0.399 1.522-0.399 2.336 0 0.408 0.034 0.789 0.107 1.142 0.07 0.354 0.188 0.664 0.356 0.929s0.395 0.478 0.678 0.637c0.282 0.159 0.646 0.24 1.088 0.24 0.567 0 1.066-0.121 1.502-0.359 0.433-0.24 0.837-0.562 1.208-0.969 0.017-0.461 0.057-0.894 0.12-1.301 0.062-0.407 0.146-0.814 0.251-1.221z"/>
-   <path d="m483.02 166.44c2.213 0 3.906 0.435 5.084 1.301 1.176 0.868 1.766 2.107 1.766 3.718 0 1.274-0.244 2.359-0.73 3.253-0.487 0.894-1.161 1.624-2.021 2.19-0.858 0.566-1.886 0.978-3.082 1.234-1.196 0.257-2.512 0.386-3.945 0.386h-1.437l-1.553 6.505h-3.349l4.327-18.135c0.85-0.177 1.7-0.296 2.549-0.359 0.85-0.061 1.647-0.093 2.391-0.093zm-0.319 2.815c-0.336 0-0.654 9e-3 -0.955 0.026-0.302 0.018-0.604 0.044-0.903 0.079l-1.487 6.346h1.349c0.741 0 1.454-0.062 2.143-0.185 0.688-0.124 1.297-0.332 1.826-0.625 0.529-0.292 0.952-0.689 1.271-1.194 0.317-0.505 0.476-1.146 0.476-1.925 0-0.902-0.332-1.549-0.995-1.938-0.667-0.389-1.575-0.584-2.725-0.584z"/>
-   <path d="m501.82 179.64c-0.054 0.195-0.107 0.513-0.16 0.956-0.052 0.443-0.079 0.858-0.079 1.248 0 0.514 0.045 1.013 0.132 1.5 0.09 0.487 0.23 0.978 0.427 1.473l-2.869 0.425c-0.212-0.425-0.381-0.877-0.505-1.354-0.44 0.389-0.985 0.74-1.632 1.049s-1.377 0.464-2.191 0.464c-0.832 0-1.545-0.137-2.137-0.412-0.593-0.274-1.075-0.654-1.447-1.142-0.372-0.486-0.647-1.057-0.823-1.712-0.179-0.655-0.266-1.363-0.266-2.125 0-1.291 0.231-2.496 0.691-3.611 0.459-1.115 1.101-2.079 1.924-2.894 0.824-0.814 1.802-1.456 2.935-1.925 1.132-0.469 2.372-0.703 3.718-0.703 0.69 0 1.384 0.058 2.083 0.173s1.404 0.332 2.111 0.65zm-1.747-6.002c-0.337-0.07-0.716-0.106-1.143-0.106-0.798 0-1.532 0.173-2.207 0.518-0.673 0.346-1.253 0.806-1.74 1.38-0.486 0.576-0.863 1.234-1.128 1.979-0.267 0.743-0.399 1.522-0.399 2.336 0 0.408 0.033 0.789 0.107 1.142 0.07 0.354 0.188 0.664 0.356 0.929s0.395 0.478 0.679 0.637c0.281 0.159 0.646 0.24 1.087 0.24 0.567 0 1.066-0.121 1.502-0.359 0.433-0.24 0.837-0.562 1.208-0.969 0.017-0.461 0.057-0.894 0.12-1.301 0.062-0.407 0.146-0.814 0.25-1.221z"/>
-   <path d="m518.07 171.14c-0.354 1.009-0.745 2.058-1.171 3.146-0.427 1.088-0.901 2.182-1.425 3.28-0.523 1.097-1.088 2.19-1.691 3.279-0.602 1.088-1.249 2.147-1.941 3.173-0.515 0.78-1.046 1.527-1.596 2.244-0.551 0.718-1.147 1.35-1.794 1.898-0.647 0.549-1.36 0.992-2.139 1.328-0.781 0.336-1.668 0.505-2.658 0.505-0.551 0-1.042-0.063-1.478-0.186-0.433-0.125-0.801-0.265-1.104-0.425l1.036-2.576c0.249 0.141 0.528 0.256 0.837 0.346 0.31 0.088 0.65 0.132 1.022 0.132 0.833 0 1.563-0.217 2.192-0.65 0.628-0.434 1.198-1.023 1.712-1.766-0.567-1.965-1.044-4.098-1.435-6.399s-0.646-4.744-0.772-7.329h3.242c0.018 0.743 0.057 1.566 0.12 2.47 0.063 0.902 0.143 1.828 0.243 2.774 0.098 0.948 0.218 1.881 0.362 2.802 0.143 0.919 0.303 1.77 0.481 2.549 0.534-0.85 1.031-1.744 1.491-2.683 0.462-0.938 0.888-1.872 1.279-2.801 0.39-0.929 0.732-1.833 1.025-2.708 0.292-0.877 0.545-1.677 0.759-2.403z"/>
-  </g>
-  <g transform="matrix(1.1558 0 0 1.1558 -378.16 -140.8)">
-   <path d="m354.34 189.4c-2.479 0-4.424-0.322-5.837-0.969-1.415-0.646-2.427-1.526-3.037-2.644-0.61-1.116-0.906-2.399-0.89-3.848 0.017-1.448 0.217-2.992 0.602-4.632l6.649-27.8 8.114-1.257-7.278 30.156c-0.138 0.628-0.217 1.205-0.233 1.728-0.019 0.523 0.078 0.986 0.287 1.387 0.209 0.402 0.566 0.725 1.072 0.969 0.505 0.245 1.214 0.402 2.122 0.471z"/>
-   <path d="m383.65 172.07c0 2.548-0.418 4.877-1.256 6.989s-1.997 3.936-3.481 5.471c-1.483 1.537-3.263 2.731-5.341 3.586-2.075 0.855-4.337 1.283-6.779 1.283-1.187 0-2.372-0.104-3.56-0.314l-2.355 9.476h-7.748l8.69-36.229c1.396-0.418 2.992-0.793 4.79-1.125 1.797-0.332 3.743-0.498 5.837-0.498 1.955 0 3.64 0.297 5.053 0.89 1.413 0.594 2.574 1.405 3.481 2.435 0.906 1.029 1.578 2.234 2.015 3.612 0.438 1.379 0.654 2.854 0.654 4.424zm-19.002 10.732c0.592 0.14 1.324 0.209 2.198 0.209 1.361 0 2.599-0.253 3.717-0.759 1.117-0.506 2.068-1.212 2.852-2.12 0.787-0.908 1.397-1.998 1.834-3.272 0.435-1.273 0.654-2.678 0.654-4.214 0-1.5-0.332-2.775-0.994-3.822-0.664-1.047-1.817-1.571-3.456-1.571-1.117 0-2.164 0.104-3.142 0.314z"/>
-  </g>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/patreon.svg b/app/Views/_assets/images/platforms/funding/patreon.svg
deleted file mode 100644
index fba04ee940..0000000000
--- a/app/Views/_assets/images/platforms/funding/patreon.svg
+++ /dev/null
@@ -1,24 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#ff424d"/>
- <g transform="translate(-49.245)">
-  <g transform="matrix(.019653 0 0 -.019653 447.72 185)">
-   <path d="m1863.2 2250.3c0 314.6-212.99 585.63-542.06 585.63h-537.16v-1171.1h537.16c329.07 0 542.06 270.86 542.06 585.46zm-1863.2 1224.4h1417.9c750.16 0 1234.2-566.28 1234.2-1224.4s-484.01-1224.2-1234.2-1224.2h-633.9v-938.93h-783.98v3387.6" fill="#fff"/>
-   <path d="m4921.7 2506.9-416.21-1393.8h822.66zm730.81-2419.7-130.54 411.34h-1205.1l-130.72-411.34h-837.3l1209.9 3387.6h721.05l1224.4-3387.6h-851.78" fill="#fff"/>
-   <path d="m7820.6 2797.2h-764.45v677.48h2317.9v-677.48h-769.51v-2710.1h-783.97v2710.1" fill="#fff"/>
-   <path d="m12457 2250.3c0 314.6-213 585.63-542.1 585.63h-537.2v-1171.1h537.2c329.1 0 542.1 270.86 542.1 585.46zm-1863.2 1224.4h1422.9c750 0 1234-566.28 1234-1224.4 0-474.25-251.7-895.17-672.8-1093.7l677.7-1069.5h-909.8l-600.3 938.93h-367.8v-938.93h-783.9v3387.6" fill="#fff"/>
-   <g transform="scale(1.0213)">
-    <path d="m15044 2786.1v-753.27h1255.6v-601.88h-1255.6v-729.53h1255.6v-616.07h-2023.2v3316.8h2023.2v-616.05h-1255.6" fill="#fff"/>
-   </g>
-   <g transform="scale(1.3194)">
-    <path d="m15695 1349.8c0 421.79-286.2 814.25-751.9 814.25-469.6 0-752-392.46-752-814.25s282.4-814.26 752-814.26c465.7 0 751.9 392.47 751.9 814.26zm-2112.8 0c0 704.22 506.2 1349.8 1360.9 1349.8 850.8 0 1357-645.56 1357-1349.8 0-704.22-506.2-1349.8-1357-1349.8-854.7 0-1360.9 645.56-1360.9 1349.8" fill="#fff"/>
-   </g>
-   <g transform="scale(1.5724)">
-    <path d="m15804 806.4v1403.4h495.5v-2154.4h-520.1l-775.7 1385v-1385h-498.6v2154.4h520.1l778.8-1403.4" fill="#fff"/>
-   </g>
-  </g>
-  <g transform="matrix(.027788 0 0 -.027788 197.08 230)" fill="#fff" fill-rule="evenodd">
-   <path d="m3844.9 5757.8c-1190.8 0-2159.5-969.65-2159.5-2161.6 0-1188.3 968.78-2155.1 2159.5-2155.1 1187.1 0 2152.8 966.79 2152.8 2155.1 0 1191.9-965.74 2161.6-2152.8 2161.6"/>
-   <path d="M 0,0 H 1054.41 V 5757.81 H 0 V 0"/>
-  </g>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/paypal.svg b/app/Views/_assets/images/platforms/funding/paypal.svg
deleted file mode 100644
index 33552f5799..0000000000
--- a/app/Views/_assets/images/platforms/funding/paypal.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#f2c40f"/>
- <g transform="matrix(5.3019 0 0 5.3019 197.38 70)">
-  <path d="m46.211 6.749h-6.839a0.95 0.95 0 0 0-0.939 0.802l-2.766 17.537a0.57 0.57 0 0 0 0.564 0.658h3.265a0.95 0.95 0 0 0 0.939-0.803l0.746-4.73a0.95 0.95 0 0 1 0.938-0.803h2.165c4.505 0 7.105-2.18 7.784-6.5 0.306-1.89 0.013-3.375-0.872-4.415-0.972-1.142-2.696-1.746-4.985-1.746zm0.789 6.405c-0.374 2.454-2.249 2.454-4.062 2.454h-1.032l0.724-4.583a0.57 0.57 0 0 1 0.563-0.481h0.473c1.235 0 2.4 0 3.002 0.704 0.359 0.42 0.469 1.044 0.332 1.906zm19.654-0.079h-3.275a0.57 0.57 0 0 0-0.563 0.481l-0.145 0.916-0.229-0.332c-0.709-1.029-2.29-1.373-3.868-1.373-3.619 0-6.71 2.741-7.312 6.586-0.313 1.918 0.132 3.752 1.22 5.031 0.998 1.176 2.426 1.666 4.125 1.666 2.916 0 4.533-1.875 4.533-1.875l-0.146 0.91a0.57 0.57 0 0 0 0.562 0.66h2.95a0.95 0.95 0 0 0 0.939-0.803l1.77-11.209a0.568 0.568 0 0 0-0.561-0.658zm-4.565 6.374c-0.316 1.871-1.801 3.127-3.695 3.127-0.951 0-1.711-0.305-2.199-0.883-0.484-0.574-0.668-1.391-0.514-2.301 0.295-1.855 1.805-3.152 3.67-3.152 0.93 0 1.686 0.309 2.184 0.892 0.499 0.589 0.697 1.411 0.554 2.317zm22.007-6.374h-3.291a0.954 0.954 0 0 0-0.787 0.417l-4.539 6.686-1.924-6.425a0.953 0.953 0 0 0-0.912-0.678h-3.234a0.57 0.57 0 0 0-0.541 0.754l3.625 10.638-3.408 4.811a0.57 0.57 0 0 0 0.465 0.9h3.287a0.949 0.949 0 0 0 0.781-0.408l10.946-15.8a0.57 0.57 0 0 0-0.468-0.895z" fill="#253B80"/>
-  <path d="m94.992 6.749h-6.84a0.95 0.95 0 0 0-0.938 0.802l-2.766 17.537a0.569 0.569 0 0 0 0.562 0.658h3.51a0.665 0.665 0 0 0 0.656-0.562l0.785-4.971a0.95 0.95 0 0 1 0.938-0.803h2.164c4.506 0 7.105-2.18 7.785-6.5 0.307-1.89 0.012-3.375-0.873-4.415-0.971-1.142-2.694-1.746-4.983-1.746zm0.789 6.405c-0.373 2.454-2.248 2.454-4.062 2.454h-1.031l0.725-4.583a0.568 0.568 0 0 1 0.562-0.481h0.473c1.234 0 2.4 0 3.002 0.704 0.359 0.42 0.468 1.044 0.331 1.906zm19.653-0.079h-3.273a0.567 0.567 0 0 0-0.562 0.481l-0.145 0.916-0.23-0.332c-0.709-1.029-2.289-1.373-3.867-1.373-3.619 0-6.709 2.741-7.311 6.586-0.312 1.918 0.131 3.752 1.219 5.031 1 1.176 2.426 1.666 4.125 1.666 2.916 0 4.533-1.875 4.533-1.875l-0.146 0.91a0.57 0.57 0 0 0 0.564 0.66h2.949a0.95 0.95 0 0 0 0.938-0.803l1.771-11.209a0.571 0.571 0 0 0-0.565-0.658zm-4.565 6.374c-0.314 1.871-1.801 3.127-3.695 3.127-0.949 0-1.711-0.305-2.199-0.883-0.484-0.574-0.666-1.391-0.514-2.301 0.297-1.855 1.805-3.152 3.67-3.152 0.93 0 1.686 0.309 2.184 0.892 0.501 0.589 0.699 1.411 0.554 2.317zm8.426-12.219-2.807 17.858a0.569 0.569 0 0 0 0.562 0.658h2.822c0.469 0 0.867-0.34 0.939-0.803l2.768-17.536a0.57 0.57 0 0 0-0.562-0.659h-3.16a0.571 0.571 0 0 0-0.562 0.482z" fill="#179BD7"/>
-  <path d="m7.266 29.154 0.523-3.322-1.165-0.027h-5.563l3.866-24.513a0.316 0.316 0 0 1 0.314-0.268h9.38c3.114 0 5.263 0.648 6.385 1.927 0.526 0.6 0.861 1.227 1.023 1.917 0.17 0.724 0.173 1.589 7e-3 2.644l-0.012 0.077v0.676l0.526 0.298a3.69 3.69 0 0 1 1.065 0.812c0.45 0.513 0.741 1.165 0.864 1.938 0.127 0.795 0.085 1.741-0.123 2.812-0.24 1.232-0.628 2.305-1.152 3.183a6.547 6.547 0 0 1-1.825 2c-0.696 0.494-1.523 0.869-2.458 1.109-0.906 0.236-1.939 0.355-3.072 0.355h-0.73c-0.522 0-1.029 0.188-1.427 0.525a2.21 2.21 0 0 0-0.744 1.328l-0.055 0.299-0.924 5.855-0.042 0.215c-0.011 0.068-0.03 0.102-0.058 0.125a0.155 0.155 0 0 1-0.096 0.035z" fill="#253B80"/>
-  <path d="m23.048 7.667c-0.028 0.179-0.06 0.362-0.096 0.55-1.237 6.351-5.469 8.545-10.874 8.545h-2.752c-0.661 0-1.218 0.48-1.321 1.132l-1.409 8.936-0.399 2.533a0.704 0.704 0 0 0 0.695 0.814h4.881c0.578 0 1.069-0.42 1.16-0.99l0.048-0.248 0.919-5.832 0.059-0.32c0.09-0.572 0.582-0.992 1.16-0.992h0.73c4.729 0 8.431-1.92 9.513-7.476 0.452-2.321 0.218-4.259-0.978-5.622a4.667 4.667 0 0 0-1.336-1.03z" fill="#179BD7"/>
-  <path d="m21.754 7.151a9.757 9.757 0 0 0-1.203-0.267 15.284 15.284 0 0 0-2.426-0.177h-7.352a1.172 1.172 0 0 0-1.159 0.992l-1.564 9.906-0.045 0.289a1.336 1.336 0 0 1 1.321-1.132h2.752c5.405 0 9.637-2.195 10.874-8.545 0.037-0.188 0.068-0.371 0.096-0.55a6.594 6.594 0 0 0-1.017-0.429 9.045 9.045 0 0 0-0.277-0.087z" fill="#222D65"/>
-  <path d="m9.614 7.699a1.169 1.169 0 0 1 1.159-0.991h7.352c0.871 0 1.684 0.057 2.426 0.177a9.757 9.757 0 0 1 1.481 0.353c0.365 0.121 0.704 0.264 1.017 0.429 0.368-2.347-3e-3 -3.945-1.272-5.392-1.399-1.593-3.924-2.275-7.155-2.275h-9.38c-0.66 0-1.223 0.48-1.325 1.133l-3.907 24.765a0.806 0.806 0 0 0 0.795 0.932h5.791l1.454-9.225z" fill="#253B80"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/tipeee.svg b/app/Views/_assets/images/platforms/funding/tipeee.svg
deleted file mode 100644
index 72063b9a85..0000000000
--- a/app/Views/_assets/images/platforms/funding/tipeee.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="1050" height="300" rx="150" ry="150" fill="#d84759"/>
- <g transform="matrix(1.9051 0 0 1.9051 134.44 -488.69)" fill="#fff">
-  <path d="m137.87 348.34h-4.17v-42.82c0-0.73-0.59-1.32-1.31-1.32l-22.14 6.65c-1.01 0.25-1.31 1.2-1.31 1.93v12.71c0 0.73 0.59 1.32 1.31 1.32l3.96-1.19v22.72h-4.17c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h27.85c0.73 0 1.31-0.59 1.31-1.32v-13.31c-0.02-0.73-0.61-1.32-1.33-1.32z"/>
-  <path d="m280.02 364.43c5.15 0.51 10.66-1.06 15.48-2.7 11.36-3.87 22.13-10 31.7-17.19 4.18-3.13 8.26-6.5 11.67-10.47 2.53-2.94 5-6.41 5.19-10.43 0.21-4.44-6.68-4.42-6.89 0v0.1c-0.01 0.02-0.01 0.05-0.02 0.08-0.07 0.34-0.18 0.67-0.29 1l-0.03 0.09c-0.05 0.11-0.1 0.21-0.15 0.32-0.22 0.44-0.47 0.87-0.72 1.3-0.24 0.39-0.5 0.78-0.77 1.15-0.14 0.2-0.28 0.39-0.43 0.59-0.02 0.03-0.05 0.06-0.09 0.11-0.75 0.94-1.55 1.83-2.38 2.69-4.05 4.24-8.15 7.36-12.81 10.56-5.33 3.66-10.96 6.91-16.79 9.72-4.98 2.39-10.23 4.47-15.97 5.67-0.59 0.12-1.18 0.23-1.77 0.32-0.06 0.01-0.28 0.04-0.43 0.06-0.21 0.02-0.42 0.05-0.63 0.07-1.19 0.12-2.38 0.15-3.57 0.08-0.08 0-0.41-0.04-0.55-0.06-0.17-0.03-0.34-0.07-0.51-0.1-0.45-0.09-0.88-0.23-1.31-0.38 0.43 0.14-0.68-0.34-0.9-0.47-0.09-0.05-0.18-0.11-0.26-0.17 0.07 0.04-0.41-0.32-0.53-0.43-0.14-0.13-0.65-0.72-0.73-0.78-0.15-0.21-0.29-0.43-0.42-0.66 4.81-3.37 9.28-7.29 13.33-11.5 4.69-4.87 9.03-10.35 12.1-16.4 2.99-5.9 5.25-14.04 0.38-19.6-5.03-5.74-13.35-1.62-17.96 2.26-4.62 3.89-7.93 9.17-10.43 14.6-2.41 5.24-4.27 10.77-5.2 16.47-0.59 3.61-0.94 7.53-0.35 11.23-2.06 1.22-4.18 2.34-6.37 3.31-2.48 1.1-5.7 2.06-8.64 2.52 0.18-0.03-0.69 0.07-0.69 0.07-0.35 0.03-0.71 0.05-1.06 0.07-0.67 0.04-1.35 0.03-2.02 0.01-0.19-0.01-0.38-0.02-0.57-0.04 0.19 0.01-0.41-0.06-0.52-0.08-0.52-0.1-1.03-0.25-1.54-0.42 0.32 0.1-0.73-0.36-0.94-0.48-0.1-0.06-0.19-0.12-0.29-0.18-0.09-0.07-0.26-0.19-0.33-0.25-0.29-0.25-0.55-0.54-0.81-0.83-0.07-0.08-0.14-0.17-0.17-0.22-0.17-0.24-0.32-0.5-0.46-0.75 5.38-3.67 10.33-7.97 14.69-12.8 5.36-5.95 10.2-12.88 13.16-20.35 2.42-6.09 1.73-13.88-5.07-16.52-3.05-1.18-6.49-0.22-9.33 1.01-3.86 1.67-7.12 4.89-9.75 8.08-3.43 4.16-5.81 9.04-7.8 14.01-2.14 5.34-3.57 10.97-4.07 16.7-0.19 2.2-0.2 4.55 0.12 6.84-2.59 1.53-5.27 2.91-8.03 4.12-0.17 0.07-0.9 0.37-1.12 0.46-0.35 0.14-0.7 0.27-1.05 0.4-0.31 0.11-0.62 0.22-0.94 0.32-0.66 0.2-1.32 0.37-1.98 0.53-0.31 0.07-0.62 0.13-0.94 0.19-0.06 0.01-0.42 0.07-0.56 0.09-1.05 0.12-2.11 0.13-3.16 0.04-0.03 0-0.05-0.01-0.09-0.02-0.23-0.04-0.45-0.09-0.68-0.15-0.3-0.07-0.6-0.17-0.89-0.27 0.09 0.02-0.68-0.33-0.87-0.44-0.17-0.1-0.34-0.21-0.5-0.32-0.03-0.03-0.07-0.06-0.12-0.11-0.31-0.27-0.59-0.57-0.86-0.87-0.02-0.02-0.04-0.05-0.06-0.07-0.09-0.13-0.18-0.26-0.27-0.39-0.23-0.36-0.44-0.73-0.63-1.11-0.04-0.07-0.07-0.15-0.11-0.23-0.05-0.13-0.2-0.47-0.24-0.58-0.02-0.07-0.04-0.13-0.07-0.2 8.87-5.58 16.4-13.13 21.91-22.17 3.76-6.17 8.24-14.6 4.51-21.78-3.37-6.49-11.66-4.99-16.71-1.71-9.33 6.07-13.99 17-16.29 27.48-0.96 4.37-1.76 9.76-1.26 14.81-1.58 0.85-3.22 1.59-4.87 2.3-1.72 0.75-2.1 3.24-1.24 4.71 1.03 1.76 2.99 1.99 4.71 1.24 1.04-0.46 2.07-0.94 3.09-1.44 0.82 1.83 1.96 3.5 3.5 4.89 4.54 4.13 10.95 3.88 16.49 2.23 3.99-1.24 7.87-3.09 11.54-5.22 0.15 0.25 0.31 0.49 0.47 0.73 3.24 4.68 8.62 6.11 14.07 5.65 6.42-0.54 12.52-3.04 18.09-6.21 2.33 3.71 6.03 5.8 10.66 6.27zm-69.34-24.23c0.03-0.23 0.07-0.47 0.11-0.7 0.09-0.58 0.2-1.16 0.3-1.74 0.24-1.26 0.53-2.51 0.84-3.75 0.6-2.34 1.34-4.64 2.2-6.89 0.17-0.44 0.35-0.88 0.53-1.32 0.01-0.01 0.42-0.94 0.5-1.12 0.46-1 0.95-1.97 1.49-2.93 0.44-0.8 0.92-1.58 1.44-2.34 0.14-0.21 0.28-0.41 0.43-0.61-0.03 0.05 0.55-0.69 0.53-0.66 0.5-0.61 1.03-1.19 1.57-1.77 2.38-2.55 5.18-4.7 8.29-5.34 0.03-0.01 0.05-0.01 0.07-0.02 0.05 0 0.13 0 0.25-0.01 0.29-0.02 0.58-0.01 0.87 0.01h0.01c0.04 0.01 0.09 0.02 0.17 0.04 0.15 0.03 0.29 0.08 0.43 0.12-0.21-0.06 0.28 0.14 0.41 0.22l0.06 0.03c0.02 0.01 0.03 0.02 0.05 0.04 0.06 0.06 0.24 0.26 0.32 0.34 0.07 0.11 0.15 0.23 0.21 0.35 0.02 0.05 0.19 0.42 0.23 0.52 0.09 0.29 0.15 0.58 0.21 0.88 0.01 0.03 0.01 0.05 0.02 0.07 0 0.06 0 0.15 0.01 0.29 0.02 0.35 0.02 0.69 0.01 1.04-0.03 1.47-0.52 3.09-1.15 4.78-1.48 3.96-3.94 7.75-6.35 11.19-2.23 3.18-4.84 6.08-7.65 8.74-2.1 1.99-4.38 3.8-6.77 5.46 0.02-1.51 0.14-3.03 0.32-4.53-0.01-0.05 0.02-0.24 0.04-0.39zm1.76 14.73c-0.04-0.05-0.05-0.07 0 0zm28.86-11.11c0.02-0.24 0.05-0.48 0.08-0.72 0 0.07 0.11-0.81 0.13-0.91 0.43-2.76 1.13-5.48 1.97-8.15 1.57-5 3.41-9.22 6.47-13.83 0.29-0.44 0.6-0.88 0.92-1.31 0.03-0.04 0.06-0.08 0.08-0.11 0.3-0.38 0.62-0.75 0.93-1.12 1.38-1.63 2.93-3.18 4.68-4.41 1.33-0.94 2.54-1.56 3.79-1.95 0.32-0.1 0.65-0.17 0.98-0.24 0.04-0.01 0.07-0.02 0.1-0.02 0.05 0 0.12-0.01 0.22-0.01 0.29-0.02 0.59-0.01 0.88 0h0.12c0.06 0.02 0.16 0.05 0.32 0.09 0.08 0.02 0.31 0.1 0.43 0.15 0.13 0.07 0.26 0.15 0.38 0.22l0.1 0.1c0.06 0.06 0.21 0.24 0.29 0.33 0.09 0.14 0.17 0.28 0.25 0.42 0.02 0.03 0.03 0.06 0.05 0.08 0.01 0.03 0.02 0.07 0.04 0.12 0.1 0.28 0.16 0.56 0.23 0.85 0.01 0.08 0.02 0.14 0.03 0.19 0.01 0.16 0.03 0.31 0.03 0.47 0.17 3.07-1.48 6.37-3.13 9.38-5.11 9.35-12.24 17.26-20.56 23.43 0.01-0.39 0.02-0.78 0.03-1.18 0.05-0.63 0.1-1.25 0.16-1.87zm32.32 1.56c0.03-0.62 0.09-1.25 0.16-1.87 0.01-0.05 0.06-0.49 0.07-0.61 0.03-0.24 0.07-0.47 0.11-0.71 0.22-1.42 0.52-2.83 0.86-4.23 0.67-2.74 1.55-5.44 2.57-8.07 0.12-0.31 0.25-0.62 0.37-0.93 0.04-0.09 0.06-0.15 0.08-0.2s0.05-0.11 0.09-0.2c0.26-0.6 0.53-1.19 0.81-1.79 0.57-1.23 1.2-2.43 1.86-3.62 0.56-1.01 1.17-1.99 1.8-2.95 0.29-0.44 0.6-0.88 0.92-1.31 0.03-0.04 0.06-0.08 0.08-0.11 0.43-0.54 0.88-1.06 1.33-1.58 2.31-2.64 5.31-5.18 8.31-5.97 0.06-0.02 0.52-0.09 0.62-0.12 0.2-0.01 0.4-0.02 0.6-0.02 0.08 0 0.34 0.03 0.48 0.04 0.16 0.04 0.32 0.08 0.48 0.13 0.01 0 0.02 0.01 0.04 0.01 0.03 0.01 0.05 0.03 0.08 0.04 0.08 0.04 0.3 0.19 0.4 0.25l0.32 0.32c0.08 0.12 0.15 0.23 0.22 0.35 0.04 0.07 0.17 0.35 0.22 0.46 0.06 0.19 0.12 0.39 0.18 0.59 0.07 0.26 0.12 0.53 0.17 0.8-0.09-0.47 0.02 0.5 0.02 0.56 0.08 1.72-0.21 2.92-0.74 4.7-0.87 2.91-2.43 5.61-4.06 8.16-3.69 5.8-8.45 10.92-13.64 15.58-1.56 1.4-3.19 2.74-4.86 4.02 0-0.56 0.02-1.14 0.05-1.72z"/>
-  <path d="m123.94 302.28c5.39 0 9.76-4.37 9.76-9.76s-4.37-9.76-9.76-9.76-9.76 4.37-9.76 9.76c0.01 5.39 4.37 9.76 9.76 9.76z"/>
-  <path d="m100.95 304.2h-10.18v-14.24s0.33-3.71-3.62-2.33-13.04 4.02-13.04 4.02-2.11 0.3-2.11 3.04c0 2.31 0.03 3.65 0.07 9.5h-4.82c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h4.88c0.01 7.08 0.02 16.45 0.02 29 0 0-1.19 23.5 28.5 11.93 0 0 1.49-0.81 1.61-2.11v-12.89s0.02-1.97-1.83-1.09c0 0-9.66 4.41-9.66-1.91v-22.95h10.19c0.73 0 1.31-0.59 1.31-1.32v-13.31c0-0.7-0.59-1.29-1.32-1.29z"/>
-  <path d="m174.1 304.2c-3.18 0-6.23 0.65-9.05 1.83v-0.56c0-0.73-0.59-1.32-1.31-1.32h-22.46c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h4.27v51.69h-4.27c-0.73 0-1.31 0.59-1.31 1.32v13.31c0 0.73 0.59 1.32 1.31 1.32h27.94c0.73 0 1.31-0.59 1.31-1.32v-13.31c0-0.73-0.59-1.32-1.31-1.32h-4.17v-9.33c2.82 1.18 5.87 1.83 9.05 1.83 14.5 0 26.26-13.45 26.26-30.04s-11.76-30.05-26.26-30.05zm0.3 44.51c-5.2-0.02-9.38-6.52-9.35-14.51 0.04-7.99 4.28-14.45 9.48-14.42 5.2 0.02 9.38 6.52 9.35 14.51-0.04 7.98-4.28 14.44-9.48 14.42z"/>
-  <path d="m279.41 380.67c-2.18 0-3.37 1.88-3.37 3.4 0 1.58 1.4 3.22 3.37 3.22 2.24 0 3.43-1.43 3.43-3.22 0-1.52-1.25-3.4-3.43-3.4z"/>
-  <path d="m292.59 383.2c-1.91-0.03-3.07-1.58-3.07-3.52s0.87-3.82 2.62-3.82c1.37 0 1.82 1.7 1.88 3.13h4.39v-6.74h-3.52l-0.51 1.43c-0.51-0.6-1.7-1.7-3.73-1.7-3.82 0-7.34 2.36-7.34 7.64 0 5.31 3.82 7.97 8.2 7.97 3.22 0 5.91-1.52 7.31-3.04l-2.63-3.04c-0.97 1.07-2.02 1.72-3.6 1.69z"/>
-  <path d="m307.63 371.89c-4.12 0-8.14 2.77-8.17 7.76-0.06 5.28 4.06 7.91 8.32 7.91 4.54 0 8.2-2.83 8.14-7.79-0.09-4.98-3.58-7.82-8.29-7.88zm0.15 11.85c-1.25 0-2.21-1.61-2.21-4.06 0-2.18 0.89-3.91 2.06-3.91 1.4 0.03 2.18 1.76 2.18 4s-0.75 3.97-2.03 3.97z"/>
-  <path d="m341.43 379.02c0-3.64-0.75-7.16-5.58-7.16-2.06 0-3.46 1.1-4.38 2.15-0.48-0.72-1.43-2.15-4.45-2.15-1.88 0-3.25 1.61-3.73 2.18l-0.66-1.76h-5.64v3.94h1.25v7.04h-1.25v3.91h8.86v-3.91h-1.79v-5.31c0-1.22 0.39-1.79 1.34-1.79 1.19 0 1.25 0.98 1.25 3.4v7.61h7.73v-4h-1.79v-4.83c0-1.28 0.3-2.18 1.58-2.18 1.4 0 1.13 2.27 1.13 3.7v7.31h7.58v-4.03h-1.46v-4.12z"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/funding/ulule.svg b/app/Views/_assets/images/platforms/funding/ulule.svg
deleted file mode 100644
index 5d932e426a..0000000000
--- a/app/Views/_assets/images/platforms/funding/ulule.svg
+++ /dev/null
@@ -1,37 +0,0 @@
-<svg width="1050" height="300" version="1.1" viewBox="0 0 1050 300" xmlns="http://www.w3.org/2000/svg">
- <defs>
-  <clipPath id="clipPath1961">
-   <path d="m0 817.8v-793.72h595.29v793.72z"/>
-  </clipPath>
-  <clipPath id="clipPath1967">
-   <path d="m595.29 817.8v-793.72h-595.29v793.72z"/>
-  </clipPath>
-  <clipPath id="clipPath1973">
-   <path d="m0 0h595.29v841.89h-595.29z"/>
-  </clipPath>
- </defs>
- <rect width="1050" height="300" rx="150" ry="150" fill="#18a5d6"/>
- <g transform="matrix(0 -1.5089 -1.5089 0 1164.3 599.12)">
-  <g clip-path="url(#clipPath1961)">
-   <g clip-path="url(#clipPath1967)">
-    <g clip-path="url(#clipPath1973)">
-     <path d="m290.35 431.32c-8.2612 0-11.755 4.0252-11.755 9.9556 0 5.932 3.4935 9.9572 11.755 9.9572h17.056c0.8992 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.82c-0.0697 0.7914-0.7325 1.3991-1.527 1.3991h-15.935c-17.687 0-26.583-10.38-26.583-25.842 0-15.462 9.0014-25.841 26.583-25.841h20.188c0.8999 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.82c-0.069 0.7914-0.7317 1.3991-1.527 1.3991z" fill="#fff"/>
-     <path d="m290.35 331.14c-8.2612 0-11.755 4.0252-11.755 9.9556 0 5.932 3.4935 9.9572 11.755 9.9572h25.822c0.8991 0 1.6052 0.7712 1.5262 1.6665l-1.1216 12.82c-0.069 0.7914-0.7317 1.3999-1.5262 1.3999h-24.7c-17.687 0-26.583-10.38-26.583-25.843 0-15.462 9.0014-25.841 26.583-25.841h28.953c0.8992 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.82c-0.069 0.7922-0.7317 1.3991-1.527 1.3991z" fill="#fff"/>
-     <path d="m281.03 305.3h-14.355c-0.8456 0-1.5324-0.6867-1.5324-1.5332v-29.194c0-0.8456 0.6868-1.5324 1.5324-1.5324h12.822c0.8465 0 1.5332 0.6868 1.5332 1.5324v14.84h40.532c0.8991 0 1.6052 0.7705 1.5269 1.6665l-1.1215 12.822c-0.0698 0.7922-0.7325 1.3991-1.527 1.3991z" fill="#fff"/>
-     <path d="m281.03 405.49h-14.355c-0.8456 0-1.5324-0.6859-1.5324-1.5331v-29.194c0-0.8456 0.6868-1.5324 1.5324-1.5324h12.822c0.8465 0 1.5332 0.6868 1.5332 1.5324v14.84h31.767c0.9 0 1.6053 0.7704 1.527 1.6665l-1.1216 12.822c-0.069 0.7922-0.7317 1.3991-1.527 1.3991z" fill="#fff"/>
-     <path d="m314.37 224.48h12.876c0.8992 0 1.6053 0.7705 1.527 1.6657l-3.1834 36.381c-0.069 0.7914-0.7317 1.3999-1.527 1.3999h-57.384c-0.8465 0-1.5332-0.6867-1.5332-1.5332v-36.38c0-0.8472 0.6867-1.5332 1.5332-1.5332h12.822c0.8456 0 1.5324 0.686 1.5324 1.5332v22.026h8.6216v-13.397c0-0.8457 0.686-1.5324 1.5324-1.5324h10.707c0.8464 0 1.5324 0.6867 1.5324 1.5324v13.397h7.4783l1.9386-22.16c0.0698-0.7922 0.7325-1.3991 1.527-1.3991" fill="#fff"/>
-     <path d="m231.37 556.56c0 36.543 29.729 66.272 66.272 66.272h33.386c2.1262 0 4.1268-0.8286 5.6313-2.3323 1.5037-1.5045 2.3323-3.5043 2.3323-5.6312 0-1.8882-0.6527-3.6764-1.851-5.1057 16.783-12.491 26.774-32.312 26.774-53.203s-9.9913-40.712-26.774-53.202c1.1983-1.4309 1.851-3.2191 1.851-5.1065 0-2.1261-0.8278-4.1259-2.3308-5.6297-1.5076-1.5052-3.5082-2.3338-5.6328-2.3338h-33.386c-36.544 0-66.272 29.73-66.272 66.272" fill="#fff"/>
-     <path d="m332.82 496.46c0.4961 0.4953 0.7433 1.1464 0.7433 1.7944 0 0.6511-0.2472 1.2983-0.7433 1.7944l-4.1663 4.1678c17.858 10.603 29.833 30.072 29.833 52.347 0 22.274-11.975 41.743-29.833 52.346l4.1663 4.1678c0.4961 0.4953 0.7433 1.1433 0.7433 1.7944 0 0.648-0.2472 1.2983-0.7433 1.7944-0.4961 0.496-1.1464 0.7441-1.7944 0.7441h-33.386c-33.604 0-60.847-27.242-60.847-60.847 0-33.605 27.242-60.847 60.847-60.847h33.386c0.648 0 1.2983 0.2472 1.7944 0.7433"/>
-     <path d="m263.77 530.31c0 10.821 6.1335 20.206 15.112 24.876 1.1239 0.5852 1.1239 2.1641 0 2.7493-8.979 4.6701-15.112 14.055-15.112 24.876 0 16.145 13.651 29.101 30.04 27.957 13.706-0.9565 24.842-11.981 25.925-25.677 0.9487-12.004-5.6762-22.568-15.602-27.442-2.4509 2.1479-5.6498 3.4609-9.165 3.4609-3.8616 0-7.3473-1.5789-9.8719-4.1159-0.2356-0.2364-0.2356-0.6294 0-0.8658 2.5246-2.5369 6.0103-4.1151 9.8719-4.1151 3.5152 0 6.7141 1.3123 9.165 3.4602 9.9254-4.874 16.55-15.437 15.602-27.442-1.0821-13.696-12.219-24.721-25.925-25.677-16.39-1.1441-30.04 11.812-30.04 27.957" fill="#fff"/>
-     <path d="m313.64 583.81c-0.5868-6.1134-5.7188-10.917-11.99-10.959-6.6986-0.0427-12.167 5.3498-12.214 12.05-0.0457 6.7001 5.3468 12.169 12.047 12.212 6.3242 0.045 11.526-4.7677 12.128-10.94 7e-3 -8e-4 0.0132-2e-3 0.0201-2e-3 -0.6162 9.2991-8.3627 16.628-17.806 16.565-9.8068-0.0667-17.7-8.0713-17.633-17.873 0.0667-9.8067 8.0667-17.697 17.875-17.635 9.3634 0.0635 16.971 7.3798 17.573 16.581" fill="#18a5d6"/>
-     <path d="m311.45 582.34c-1.01-1.0666-2.0161-1.7704-3.6616-1.7603-2.3711 9e-3 -4.2981 2.0145-4.3089 4.4724 0.0155 2.3455 2.006 4.3259 4.3476 4.3407 1.9138 0.0108 2.9757-1.0953 3.5454-1.6898l0.255-0.262c0.6465-0.6712 1.1627-1.2006 1.9843-1.2626-0.6015 6.1722-5.8033 10.986-12.128 10.94-6.7001-0.0427-12.093-5.5111-12.046-12.211 0.0458-6.7009 5.5142-12.093 12.213-12.05 6.2707 0.0411 11.403 4.8453 11.99 10.958 3e-3 0.0326 3e-3 0.0644 5e-3 0.0969-0.7301-0.0635-1.5184-0.827-2.1951-1.5719" fill="#18a5d6"/>
-     <path d="m311.45 582.34c-1.01-1.0666-2.0161-1.7704-3.6616-1.7603-2.3711 9e-3 -4.2981 2.0145-4.3089 4.4724 0.0155 2.3455 2.006 4.3259 4.3476 4.3407 1.9138 0.0108 2.9757-1.0953 3.5454-1.6898l0.255-0.262c0.6465-0.6712 1.1627-1.2006 1.9843-1.2626-0.6015 6.1722-5.8033 10.986-12.128 10.94-6.7001-0.0427-12.093-5.5111-12.046-12.211 0.0458-6.7009 5.5142-12.093 12.213-12.05 6.2707 0.0411 11.403 4.8453 11.99 10.958 3e-3 0.0326 3e-3 0.0644 5e-3 0.0969-0.7301-0.0635-1.5184-0.827-2.1951-1.5719" fill="#004e69"/>
-     <path d="m313.64 527.07c-5e-3 0-0.0101-2e-3 -0.0155-2e-3 -0.5496-6.2257-5.7777-11.096-12.14-11.052-6.7001 0.0427-12.093 5.5119-12.046 12.212 0.0457 6.7001 5.5142 12.093 12.214 12.05 6.2645-0.0411 11.393-4.8375 11.987-10.944h8e-4c-0.6085 9.1944-8.2132 16.502-17.571 16.566-9.8091 0.0635-17.809-7.8264-17.876-17.634-0.0667-9.8014 7.8271-17.806 17.632-17.873 9.482-0.0628 17.253 7.3249 17.814 16.677" fill="#f01446"/>
-     <path d="m311.45 525.49c-1.01-1.0658-2.0161-1.7696-3.6617-1.7595-2.371 9e-3 -4.2988 2.0145-4.3096 4.4724 0.0155 2.3455 2.0068 4.3259 4.3476 4.3407 1.9138 0.0108 2.9749-1.0961 3.5454-1.6898l0.2558-0.2628c0.6534-0.6774 1.1728-1.213 2.0107-1.265-0.5938 6.1056-5.7227 10.902-11.987 10.943-6.6994 0.0426-12.167-5.3491-12.214-12.05-0.0458-6.7001 5.3467-12.169 12.047-12.211 6.3622-0.0457 11.59 4.8251 12.14 11.051-0.7247-0.0759-1.5037-0.8301-2.1742-1.5688" fill="#f01446"/>
-     <path d="m311.45 525.49c-1.01-1.0658-2.0161-1.7696-3.6617-1.7595-2.371 9e-3 -4.2988 2.0145-4.3096 4.4724 0.0155 2.3455 2.0068 4.3259 4.3476 4.3407 1.9138 0.0108 2.9749-1.0961 3.5454-1.6898l0.2558-0.2628c0.6534-0.6774 1.1728-1.213 2.0107-1.265-0.5938 6.1056-5.7227 10.902-11.987 10.943-6.6994 0.0426-12.167-5.3491-12.214-12.05-0.0458-6.7001 5.3467-12.169 12.047-12.211 6.3622-0.0457 11.59 4.8251 12.14 11.051-0.7247-0.0759-1.5037-0.8301-2.1742-1.5688" fill="#8b0020"/>
-     <path d="m313.64 529.32c0 5e-3 -8e-4 0.0101-8e-4 0.0147h-8e-4c0-5e-3 2e-3 -0.0101 2e-3 -0.0147" fill="#fff"/>
-    </g>
-   </g>
-  </g>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/amazon.svg b/app/Views/_assets/images/platforms/podcasting/amazon.svg
deleted file mode 100644
index 5d6af71eba..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/amazon.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#fff"/>
- <g transform="matrix(.66677 0 0 .66677 64.525 64.708)" fill-rule="evenodd">
-  <path d="m221.5 210.32c-105.24 50.083-170.54 8.18-212.35-17.271-2.587-1.604-6.984 0.375-3.169 4.757 13.928 16.888 59.573 57.593 119.15 57.593 59.621 0 95.09-32.532 99.527-38.207 4.407-5.627 1.294-8.731-3.16-6.872zm29.555-16.322c-2.826-3.68-17.184-4.366-26.22-3.256-9.05 1.078-22.634 6.609-21.453 9.93 0.606 1.244 1.843 0.686 8.06 0.127 6.234-0.622 23.698-2.826 27.337 1.931 3.656 4.79-5.57 27.608-7.255 31.288-1.628 3.68 0.622 4.629 3.68 2.178 3.016-2.45 8.476-8.795 12.14-17.774 3.639-9.028 5.858-21.622 3.71-24.424z" fill="#f90" fill-rule="nonzero"/>
-  <path d="m150.74 108.13c0 13.141 0.332 24.1-6.31 35.77-5.361 9.489-13.853 15.324-23.341 15.324-12.952 0-20.495-9.868-20.495-24.432 0-28.75 25.76-33.968 50.146-33.968zm34.015 82.216c-2.23 1.992-5.456 2.135-7.97 0.806-11.196-9.298-13.189-13.615-19.356-22.487-18.502 18.882-31.596 24.527-55.601 24.527-28.37 0-50.478-17.506-50.478-52.565 0-27.373 14.85-46.018 35.96-55.126 18.313-8.066 43.884-9.489 63.43-11.718v-4.365c0-8.018 0.616-17.506-4.08-24.432-4.128-6.215-12.003-8.777-18.93-8.777-12.856 0-24.337 6.594-27.136 20.257-0.57 3.037-2.799 6.026-5.835 6.168l-32.735-3.51c-2.751-0.618-5.787-2.847-5.028-7.07 7.543-39.66 43.36-51.616 75.43-51.616 16.415 0 37.858 4.365 50.81 16.795 16.415 15.323 14.849 35.77 14.849 58.02v52.565c0 15.798 6.547 22.724 12.714 31.264 2.182 3.036 2.657 6.69-0.095 8.966-6.879 5.74-19.119 16.415-25.855 22.393l-0.095-0.095"/>
-  <path d="m221.5 210.32c-105.24 50.083-170.54 8.18-212.35-17.271-2.587-1.604-6.984 0.375-3.169 4.757 13.928 16.888 59.573 57.593 119.15 57.593 59.621 0 95.09-32.532 99.527-38.207 4.407-5.627 1.294-8.731-3.16-6.872zm29.555-16.322c-2.826-3.68-17.184-4.366-26.22-3.256-9.05 1.078-22.634 6.609-21.453 9.93 0.606 1.244 1.843 0.686 8.06 0.127 6.234-0.622 23.698-2.826 27.337 1.931 3.656 4.79-5.57 27.608-7.255 31.288-1.628 3.68 0.622 4.629 3.68 2.178 3.016-2.45 8.476-8.795 12.14-17.774 3.639-9.028 5.858-21.622 3.71-24.424z" fill="#f90" fill-rule="nonzero"/>
-  <path d="m150.74 108.13c0 13.141 0.332 24.1-6.31 35.77-5.361 9.489-13.853 15.324-23.341 15.324-12.952 0-20.495-9.868-20.495-24.432 0-28.75 25.76-33.968 50.146-33.968zm34.015 82.216c-2.23 1.992-5.456 2.135-7.97 0.806-11.196-9.298-13.189-13.615-19.356-22.487-18.502 18.882-31.596 24.527-55.601 24.527-28.37 0-50.478-17.506-50.478-52.565 0-27.373 14.85-46.018 35.96-55.126 18.313-8.066 43.884-9.489 63.43-11.718v-4.365c0-8.018 0.616-17.506-4.08-24.432-4.128-6.215-12.003-8.777-18.93-8.777-12.856 0-24.337 6.594-27.136 20.257-0.57 3.037-2.799 6.026-5.835 6.168l-32.735-3.51c-2.751-0.618-5.787-2.847-5.028-7.07 7.543-39.66 43.36-51.616 75.43-51.616 16.415 0 37.858 4.365 50.81 16.795 16.415 15.323 14.849 35.77 14.849 58.02v52.565c0 15.798 6.547 22.724 12.714 31.264 2.182 3.036 2.657 6.69-0.095 8.966-6.879 5.74-19.119 16.415-25.855 22.393l-0.095-0.095"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/antennapod.svg b/app/Views/_assets/images/platforms/podcasting/antennapod.svg
deleted file mode 100644
index e59072943e..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/antennapod.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#fff"/>
- <g transform="matrix(.18722 0 0 .18722 22.187 22.187)">
-  <circle cx="682.67" cy="682.67" r="454" fill="#219dff"/>
-  <g stroke-width="1.8511">
-   <path d="m684.63 369.89c-30.328-0.19072-60.66 3.7865-90.174 11.924-75.664 20.861-141.7 69.154-187.06 136.81-16.702 24.907-35.504 67.624-43.424 98.652-30.406 119.13 10.485 249.64 103.11 329.1 11.68 10.02 35.34 28.056 36.912 28.139 0.4157 0.0219 4.4739-10.608 9.0195-23.623s8.2364-24.263 8.2012-24.996c-0.0352-0.73322-3.7896-4.0326-8.3438-7.332-11.262-8.1592-35.408-31.659-45.889-44.66-41.118-51.006-62.054-110.64-62.012-176.64 0.0281-44.14 9.0261-82.782 28.328-121.65 41.156-82.883 118.3-138.83 210.28-152.51 19.137-2.8445 58.771-2.8282 78.039 0.0332 123.25 18.302 218.67 113.95 236.24 236.8 2.6716 18.681 2.9826 54.435 0.625 71.988-7.2733 54.151-28.808 104.05-62.129 143.98-10.249 12.28-31.548 33.033-43.629 42.512-4.9475 3.8817-8.9941 7.5494-8.9941 8.1504 0 0.60105 3.7748 11.654 8.3887 24.564l8.3887 23.475 9.9336-6.8301c16.268-11.182 27.712-20.847 43.977-37.137 26.937-26.98 44.633-51.564 62.01-86.152 33.563-66.807 42.974-144.94 26.375-218.96-13.261-59.134-42.302-112.25-85.658-156.68-41.938-42.977-95.65-74.155-152.8-88.699-26.188-6.664-52.945-10.078-79.705-10.246zm-3.4902 126.9c-25.617 0.0821-40.596 2.4243-62.699 9.8047-42.582 14.218-82.4 45.34-106.82 83.486-12.014 18.768-24.43 50.892-28.545 73.855-2.8002 15.627-3.1666 49.819-0.68555 63.99 6.1754 35.272 18.553 64.851 38.334 91.607 7.4456 10.071 25.39 29.707 27.148 29.707 0.54638 0 4.9719-11.248 9.834-24.996 4.862-13.748 8.8365-25.609 8.832-26.357-4e-3 -0.74892-2.9144-5.3502-6.4668-10.225-19.334-26.529-28.693-55.995-28.713-90.398-0.0161-27.648 6.2921-51.227 20.021-74.836 41.912-72.071 134.34-96.885 206.39-55.408 69.532 40.028 95.763 125.29 60.779 197.57-3.549 7.3321-9.7238 17.768-13.723 23.193l-7.2715 9.8633 6.2246 16.799c3.4229 9.2394 7.5615 20.85 9.1992 25.799s3.4896 8.998 4.1133 8.998c1.9707 0 22.549-23.129 30.588-34.379 14.862-20.798 27.475-49.854 32.529-74.938 9.0653-44.987 3.9852-87.74-15.162-127.63-11.039-22.999-21.92-38.363-39.934-56.383-23.686-23.694-47.905-38.656-79.863-49.336-23.439-7.833-36.795-9.8707-64.109-9.7832z" fill="#1460cc"/>
-   <path d="m684.63 353.89c-30.328-0.19072-60.66 3.7865-90.174 11.924-75.664 20.861-141.7 69.154-187.06 136.81-16.702 24.907-35.504 67.624-43.424 98.652-30.406 119.13 10.485 249.64 103.11 329.1 11.68 10.02 35.34 28.056 36.912 28.139 0.4157 0.0219 4.4739-10.608 9.0195-23.623s8.2364-24.263 8.2012-24.996c-0.0352-0.73322-3.7896-4.0326-8.3438-7.332-11.262-8.1592-35.408-31.659-45.889-44.66-41.118-51.006-62.054-110.64-62.012-176.64 0.0281-44.14 9.0261-82.782 28.328-121.65 41.156-82.883 118.3-138.83 210.28-152.51 19.137-2.8445 58.771-2.8282 78.039 0.0332 123.25 18.302 218.67 113.95 236.24 236.8 2.6716 18.681 2.9826 54.435 0.625 71.988-7.2733 54.151-28.808 104.05-62.129 143.98-10.249 12.28-31.548 33.033-43.629 42.512-4.9475 3.8817-8.9941 7.5494-8.9941 8.1504 0 0.60105 3.7748 11.654 8.3887 24.564l8.3887 23.475 9.9336-6.8301c16.268-11.182 27.712-20.847 43.977-37.137 26.937-26.98 44.633-51.564 62.01-86.152 33.563-66.807 42.974-144.94 26.375-218.96-13.261-59.134-42.302-112.25-85.658-156.68-41.938-42.977-95.65-74.155-152.8-88.699-26.188-6.664-52.945-10.078-79.705-10.246zm-3.4902 126.9c-25.617 0.0821-40.596 2.4243-62.699 9.8047-42.582 14.218-82.4 45.34-106.82 83.486-12.014 18.768-24.43 50.892-28.545 73.855-2.8002 15.627-3.1666 49.819-0.68555 63.99 6.1754 35.272 18.553 64.851 38.334 91.607 7.4456 10.071 25.39 29.707 27.148 29.707 0.54638 0 4.9719-11.248 9.834-24.996 4.862-13.748 8.8365-25.609 8.832-26.357-4e-3 -0.74892-2.9144-5.3502-6.4668-10.225-19.334-26.529-28.693-55.995-28.713-90.398-0.0161-27.648 6.2921-51.227 20.021-74.836 41.912-72.071 134.34-96.885 206.39-55.408 69.532 40.028 95.763 125.29 60.779 197.57-3.549 7.3321-9.7238 17.768-13.723 23.193l-7.2715 9.8633 6.2246 16.799c3.4229 9.2394 7.5615 20.85 9.1992 25.799s3.4896 8.998 4.1133 8.998c1.9707 0 22.549-23.129 30.588-34.379 14.862-20.798 27.475-49.854 32.529-74.938 9.0653-44.987 3.9852-87.74-15.162-127.63-11.039-22.999-21.92-38.363-39.934-56.383-23.686-23.694-47.905-38.656-79.863-49.336-23.439-7.833-36.795-9.8707-64.109-9.7832z" fill="#d1edfc" fill-opacity=".87843"/>
-  </g>
-  <g>
-   <path d="m682.03 622.6c-19.36 0.0221-37.97 7.7326-52.885 22.652-16.373 16.378-23.647 35.213-22.15 57.348 1.1862 17.539 6.0532 30.177 16.906 43.912l5.6055 7.0957-4.0566 11.49c-2.2314 6.3194-18.997 53.783-37.256 105.47-18.259 51.692-45.144 128.02-59.746 169.62-8.9313 25.443-16.753 47.261-21.799 60.967a454 454 0 0 0 60.086 20.459l1.2168-3.4649c3.6623-10.421 13.074-37.144 20.916-59.385l14.258-40.436 4.0254 0.5977c2.2145 0.3288 11.823 2.0197 21.352 3.7578 15.561 2.8383 21.124 3.1583 54.639 3.1523 33.586-0.01 38.979-0.3194 53.973-3.1484 9.162-1.7287 18.492-3.4201 20.732-3.7578l4.0742-0.6133 20.82 59.088c6.307 17.9 11.678 33.388 15.406 44.33a454 454 0 0 0 60.4-20.52c-9.5845-26.55-31.781-89.038-57.273-161.32-33.746-95.685-62.366-176.69-63.6-180l-2.2441-6.0312 6.5312-8.6328c18.543-24.511 21.476-53.85 8.1211-81.219-5.7788-11.842-21.191-27.262-33.029-33.043-11.52-5.6256-23.407-8.3804-35.023-8.3672zm0.0352 172.9c0.70363-1.1389 57.584 157.79 57.676 161.15 0.10235 3.7643-60.665 8.6812-79.922 6.4668-15.31-1.7605-34.648-5.1487-34.648-6.0703 0-1.3249 55.809-159.79 56.895-161.54z" fill="#1460cc"/>
-   <path d="m682.03 606.6c-19.36 0.0221-37.97 7.7326-52.885 22.652-16.373 16.378-23.647 35.213-22.15 57.348 1.1862 17.539 6.0532 30.177 16.906 43.912l5.6055 7.0957-4.0566 11.49c-2.2314 6.3194-18.997 53.783-37.256 105.47-18.259 51.692-45.144 128.02-59.746 169.62-13.273 37.813-24.664 69.294-27.016 74.734 19.531 8.5036 39.636 15.622 60.166 21.303l6.3535-18.076c3.6623-10.421 13.074-37.144 20.916-59.385l14.258-40.436 4.0254 0.5977c2.2145 0.3288 11.823 2.0197 21.352 3.7578 15.561 2.8383 21.124 3.1583 54.639 3.1523 33.586-0.01 38.979-0.3194 53.973-3.1484 9.162-1.7287 18.492-3.4201 20.732-3.7578l4.0742-0.6133 20.82 59.088c10.619 30.139 19.265 55.326 20.275 59.022 20.749-5.7038 41.065-12.876 60.797-21.461-0.0977-0.01-0.17206-0.031-0.21093-0.072-0.53381-0.5652-28.582-79.314-62.328-175-33.746-95.685-62.366-176.69-63.6-180l-2.2441-6.0312 6.5312-8.6328c18.543-24.511 21.476-53.85 8.1211-81.219-5.7788-11.842-21.191-27.262-33.029-33.043-11.52-5.6256-23.407-8.3804-35.023-8.3672zm0.0352 172.9c0.70363-1.1389 57.584 157.79 57.676 161.15 0.10235 3.7643-60.665 8.6812-79.922 6.4668-15.31-1.7605-34.648-5.1487-34.648-6.0703 0-1.3249 55.809-159.79 56.895-161.54z" fill="#fff" fill-opacity=".87843"/>
-  </g>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/apple.svg b/app/Views/_assets/images/platforms/podcasting/apple.svg
deleted file mode 100644
index db1d3e8660..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/apple.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300">
-  <defs>
-    <linearGradient id="apple-podcasts" x1="150" y1="300" x2="150" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#822cbe"/>
-      <stop offset="1" stop-color="#d772fb"/>
-    </linearGradient>
-  </defs>
-  <g id="apple-podcasts-2" data-name="apple-podcasts">
-    <rect width="300" height="300" rx="67" fill="url(#apple-podcasts)"/>
-    <path d="M144.55,233.2c-6.53-2.34-7.94-5.51-10.61-24.11-3.12-21.62-3.8-35-2-39.23,2.39-5.62,8.88-8.81,18-8.85s15.56,3.18,18,8.85c1.81,4.23,1.14,17.61-2,39.23-2.12,15.1-3.28,18.92-6.2,21.49a15,15,0,0,1-15.1,2.63ZM116.65,211c-22.54-11.09-37-29.86-42.24-54.82-1.31-6.44-1.53-21.82-.29-27.73,3.28-15.86,9.56-28.27,20-39.25C109.14,73.38,128.47,65,150,65a74.93,74.93,0,0,1,55.22,23.59c11.17,11.61,17.44,23.88,20.65,40.06,1.1,5.38,1.1,20.06.08,26.12a77.61,77.61,0,0,1-29.55,48.3c-5.55,4.18-19.12,11.49-21.31,11.49-.8,0-.87-.83-.51-4.19.66-5.4,1.32-6.52,4.38-7.81,4.89-2,13.21-8,18.31-13.09a69.77,69.77,0,0,0,18.32-32.24c1.89-7.52,1.67-24.23-.44-32-6.64-24.59-26.71-43.7-51.29-48.81-7.15-1.46-20.14-1.46-27.36,0-24.88,5.11-45.45,25.17-51.73,50.42-1.68,6.85-1.68,23.56,0,30.42,4.16,16.71,15,32,29.11,41.15a62.4,62.4,0,0,0,7.52,4.3c3.06,1.32,3.72,2.41,4.3,7.81.37,3.28.29,4.23-.51,4.23a59.41,59.41,0,0,1-8.17-3.5Zm.3-29.68c-7.59-6.06-14.3-16.8-17.08-27.33-1.67-6.36-1.67-18.46.08-24.81,4.59-17.13,17.21-30.41,34.72-36.64,6-2.12,19.27-2.59,26.63-1,25.39,5.66,43.41,31.08,39.91,56.31a51.41,51.41,0,0,1-11.09,26.26c-3.06,3.92-10.5,10.49-11.82,10.49-.22,0-.43-2.48-.43-5.5v-5.52l3.79-4.52c14.3-17.13,13.28-41.06-2.34-56.76-6-6.11-13-9.7-22.1-11.36-5.84-1.08-7.08-1.08-13.21-.07a40,40,0,0,0-22.91,11.45c-15.68,15.54-16.7,39.6-2.4,56.74l3.76,4.52v5.55c0,3.06-.24,5.54-.54,5.54a26.16,26.16,0,0,1-4.67-3.28Zm25.31-29.79c-6.49-3-10-8.72-10.07-16.15,0-6.67,3.72-12.49,10.14-15.9,4.09-2.15,11.31-2.15,15.4,0A19.81,19.81,0,0,1,167.21,131c4.24,14.39-11,27-24.8,20.55Z" fill="#fff"/>
-    <circle cx="151.15" cy="136.19" r="18.2" fill="#fff"/>
-    <path d="M152.89,161.43a36.45,36.45,0,0,1,6.09,1.24,21.89,21.89,0,0,1,6.1,3.05,10.74,10.74,0,0,1,3.51,3.85,16.33,16.33,0,0,1,1.31,6.09,102.7,102.7,0,0,1-.51,14.3c-.66,7.42-2,18.3-3,25.27s-1.75,10.07-2.7,12.33a11.08,11.08,0,0,1-8.1,7.08,17.7,17.7,0,0,1-4.23.36,18.24,18.24,0,0,1-4.23-.36,13.42,13.42,0,0,1-5.48-2.34,11.86,11.86,0,0,1-3.64-5.69c-.88-2.48-1.54-5.47-2.41-11.45s-2-14.89-2.77-21.67-1-11.46-1.08-14.59a22.66,22.66,0,0,1,.43-6.21,12.6,12.6,0,0,1,1.75-4,13.39,13.39,0,0,1,2.92-3,12,12,0,0,1,3.4-1.84,25.47,25.47,0,0,1,4.67-1.31c1.9-.37,4.09-.73,5.21-.88a5.61,5.61,0,0,1,2.38,0Z" fill="#fff"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/blubrry.svg b/app/Views/_assets/images/platforms/podcasting/blubrry.svg
deleted file mode 100644
index 56becf31c8..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/blubrry.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="blubrry">
-    <rect width="300" height="300" rx="67" fill="#b347a3"/>
-    <path d="M182.68,88.87s7.79-17.79,7.39-18.13-17.85,10.63-17.85,10.63S150.91,65,150.06,65c-1.14,0-19.27,15-19.27,15S111.46,66,111,66.48,117.26,89,117.26,89c-28.14,11.88-47.74,37.74-47.74,69.11,0,42.45,36,76.9,80.48,76.9,45.92,0,80.48-34.45,80.48-76.9C230.48,126.73,210.82,100.87,182.68,88.87Zm7.85,69a37.88,37.88,0,0,0-21.77-33.42l3-7.45a45.85,45.85,0,0,1,27.12,40.87Zm18.24,0a55,55,0,0,0-33.53-49.67l4.26-10.75c24.39,10.52,41.32,33.6,41.32,60.43Z" fill="#fff"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/breaker.svg b/app/Views/_assets/images/platforms/podcasting/breaker.svg
deleted file mode 100644
index 27eeadd740..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/breaker.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#f2f8ff"/>
- <g transform="matrix(1.36 0 0 1.36 -45.282 22.882)">
-  <path d="m133.88 120.47c4.08 12.49 10.64 23.85 19.12 33.5 15.88-2.06 29.85-10.22 39.46-22.06-7.84 2.07-16.07 3.17-24.56 3.17-6.79 0-13.42-.72-19.81-2.06-6.67-1.36-12.07-6.21-14.21-12.55z" fill="#1269ff"/>
-  <path d="m145.09 154.47c2.68 0 5.32-.17 7.91-.51-8.48-9.65-15.04-21.01-19.12-33.5-.64-1.91-.99-3.95-.99-6.07 0-4.77 1.76-9.12 4.66-12.46-11.1 12.41-19.02 27.71-22.48 44.64 8.85 5.03 19.1 7.9 30.02 7.9z" fill="#5c9dff"/>
-  <path d="m85.78 107.8c4 16.61 14.79 30.57 29.28 38.78 3.47-16.95 11.4-32.28 22.52-44.69 3.48-3.98 8.6-6.49 14.3-6.49 1.27 0 2.5.12 3.7.36-6.36-1.33-12.95-2.04-19.71-2.04-18.35-.01-35.5 5.14-50.09 14.08z" fill="#9ec6ff"/>
-  <path d="m155.59 95.754c-6.36-1.33-12.95-2.04-19.71-2.04-18.36 0-35.51 5.15-50.1 14.09-1.1-4.59-1.69-9.39-1.69-14.33 0-19.02 8.71-36.01 22.35-47.2 29.91 9.03 53.64 32.31 63.39 61.91.09.26.18.52.26.79-.08-.26-.17-.53-.26-.79-2.19-6.29-7.6-11.12-14.24-12.43z" fill="#d1e3ff"/>
-  <path d="m203.08 82.474c0-27-22.49-50-58-50-14.66 0-28.12 5.18-38.64 13.8 30.18 9.12 54.07 32.7 63.64 62.69.56 1.75 1.07 3.62 1.53 5.42 17.34-.38 31.47-14.48 31.47-31.91z" fill="#fff"/>
-  <path d="m151.89 98.394c1.12 0 2.06.09 3.12.3 5.56 1.1 10.12 5.14 11.98 10.43.54 1.7 1.25 4.25 1.7 6l.59 2.31 2.38-.05c18.94-.4 34.43-15.81 34.43-34.91 0-28.93-24.13-53-61-53-15.21.05-29.63 5.58-40.55 14.48-14.31 11.73-23.45 29.56-23.45 49.52.01 5.12.63 10.27 1.78 15.03 4.2 17.43 15.52 32.08 30.71 40.68 9.19 5.18 20.18 8.25 31.51 8.28 2.78 0 5.61-.19 8.29-.53 16.67-2.16 31.32-10.73 41.41-23.14l.66-.81-1.28-4.63-2.47.65c-7.66 2.03-15.51 3.08-23.8 3.07-6.63 0-12.95-.68-19.19-2-5.62-1.13-10.19-5.22-11.99-10.56-.58-1.68-.84-3.24-.83-5.11-.06-4.17 1.37-7.6 3.95-10.53 2.94-3.36 7.25-5.48 12.05-5.48zm-6.8-62.92c34.12 0 55 21.92 55 47 0 14.99-11.56 27.3-26.23 28.78-.39-1.39-.81-2.86-1.17-3.98-9.29-29.1-31.41-51.63-59.87-62.03 9.25-6.28 20.16-9.81 32.27-9.77zm-58 58c0-17.51 7.76-33.21 20.03-43.85 23.34 7.48 42.47 23.45 53.64 44.64-1.45-.64-2.98-1.13-4.58-1.45-6.5-1.35-13.39-2.1-20.3-2.1-17.28.03-33.84 4.58-48 12.4-.53-3.13-.79-6.31-.79-9.64zm60.39 42.48c6.53 1.37 13.47 2.12 20.42 2.12 5.31 0 10.59-.44 15.72-1.25-8.1 7.21-18.23 12.17-29.43 13.94-4.26-5-7.96-10.4-11.05-16.17 1.38.59 2.83 1.05 4.34 1.36zm-.45 15.49c-.64.02-1.29.03-1.94.03-9.73.03-18.59-2.26-26.63-6.45 2.31-10.17 6.25-19.6 11.58-28.14.18 1.57.53 3.13.99 4.52 3.57 10.89 9.08 21.14 16 30.04zm-11.69-51.54c-10.42 11.68-18.29 26.2-22.27 41.94-11.43-7.58-20.01-19.1-23.82-32.62 13.79-8.04 29.5-12.54 46.63-12.51.96 0 1.91.01 2.86.04-1.24.93-2.38 1.98-3.4 3.15z" fill="#003dad"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/castbox.svg b/app/Views/_assets/images/platforms/podcasting/castbox.svg
deleted file mode 100644
index 48543373b3..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/castbox.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300">
-  <defs>
-    <linearGradient id="castbox" x1="19.62" y1="19.62" x2="280.38" y2="280.38" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#ffb768"/>
-      <stop offset="0.19" stop-color="#ff9953"/>
-      <stop offset="0.57" stop-color="#ff652e"/>
-      <stop offset="0.85" stop-color="#ff4518"/>
-      <stop offset="1" stop-color="#ff390f"/>
-    </linearGradient>
-  </defs>
-  <g id="castbox-2" data-name="castbox">
-    <rect width="300" height="300" rx="67" fill="url(#castbox)"/>
-    <path d="M165.11,103c-5.19,0-9.44,3.78-9.44,9v21.72c0,2.83-2.36,4.72-5.67,4.72s-5.67-2.36-5.67-4.72V104.43c0-4.72-4.25-9-9.44-9s-9.45,3.78-9.45,9V128c0,2.84-2.36,4.72-5.66,4.72s-5.67-2.36-5.67-4.72v-8.5c0-4.72-4.25-9-9.44-9s-9.45,3.78-9.45,9v20.31c0,2.83-2.36,4.72-5.66,4.72s-5.67-2.36-5.67-4.72v-2.36a9.45,9.45,0,1,0-18.89,0v28.33a9.45,9.45,0,0,0,18.89,0v-2.36c0-2.83,2.36-4.72,5.67-4.72s5.66,2.36,5.66,4.72v32.11c0,4.72,4.25,9,9.45,9s9.44-3.78,9.44-9V151.65c0-2.83,2.36-4.72,5.67-4.72s5.66,2.36,5.66,4.72v21.72c0,4.73,4.25,9,9.45,9s9.44-3.78,9.44-9V157.32c0-2.83,2.36-4.72,5.67-4.72s5.67,2.36,5.67,4.72v17.47c0,4.72,4.25,9,9.44,9s9.45-3.77,9.45-9V112c0-4.73-4.25-9-9.45-9" fill="#fff" fill-rule="evenodd"/>
-    <path d="M195.33,127.57c-5.19,0-9.44,3.78-9.44,9v35.89c0,4.72,4.25,9,9.44,9s9.45-3.77,9.45-9V136.54c0-5.19-4.25-9-9.45-9" fill="#fff" fill-rule="evenodd"/>
-    <path d="M225.56,145.51c-5.2,0-9.45,3.78-9.45,9v9c0,4.72,4.25,9,9.45,9s9.44-3.78,9.44-9v-9c0-5.2-4.25-9-9.44-9" fill="#fff" fill-rule="evenodd"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/castopod.svg b/app/Views/_assets/images/platforms/podcasting/castopod.svg
deleted file mode 100644
index 8b349032bf..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/castopod.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#e7f9e4"/>
- <g transform="matrix(.91201 0 0 .91201 57.704 86.433)">
-  <path fill="#009486" d="m181.9 131.7h-32.5s-1.2-2.5-2.5-4.9-4.4-2.3-4.4-2.3h-82.8s-3-0.4-4.5 2.3c-1.6 2.7-2.6 4.9-2.6 4.9h-32c-6.9 0-12.6-5.6-12.6-12.5v-98.9c0-6.9 5.6-12.6 12.5-12.6h161.3c6.9 0 12.6 5.6 12.6 12.5v98.9c0.1 6.9-5.6 12.6-12.5 12.6z"/>
-  <path fill="#E7F9E4" d="m143.7 34.5h-85.1c-14.6 0-26.5 12-26.5 26.6s11.9 26.5 26.5 26.5h85.1c14.6 0 26.5-11.9 26.5-26.5 0.1-14.8-11.8-26.7-26.5-26.6zm-75.4 34.2s-3.9-2.9-9.4-2.9c-4.1 0-8.9 2.5-8.9 2.5-1.3-1.9-2.1-4.1-2.1-6.6 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0 2.7-0.9 5.1-2.4 7zm32.9 6.6c-12.5 0-12-9.6-12-9.6-0.2-1.8 2.1-2.4 2.9-1.3 0.4 0.6 0.4 0.6 0.7 1.7 1.7 5.9 8.4 5.6 8.4 5.6s6.7 0.4 8.4-5.6c0.3-1 0.3-1.1 0.7-1.7 0.8-1 3.1-0.5 2.9 1.3 0 0 0.5 9.6-12 9.6zm51.1-6.9s-4.8-2.5-8.9-2.5c-5.5 0-9.4 2.9-9.4 2.9-1.5-1.9-2.4-4.3-2.4-7 0-6.3 5.1-11.4 11.4-11.4s11.4 5.1 11.4 11.4c0.1 2.4-0.7 4.7-2.1 6.6z"/>
-  <path fill="#009486" d="m110.3 64.3c-0.4 0.6-0.4 0.6-0.7 1.7-1.7 5.9-8.4 5.6-8.4 5.6s-6.7 0.4-8.4-5.6c-0.3-1-0.3-1.1-0.7-1.7-0.8-1-3.1-0.5-2.9 1.3 0 0-0.5 9.6 12 9.6s12-9.6 12-9.6c0.2-1.7-2.1-2.3-2.9-1.3z"/>
-  <path fill="#009486" d="m143.1 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.6 0.9 5 2.4 7 0 0 3.9-2.9 9.4-2.9 4.1 0 8.9 2.5 8.9 2.5 1.3-1.9 2.1-4.1 2.1-6.6 0-6.3-5.1-11.4-11.4-11.4z"/>
-  <path fill="#009486" d="m59.3 50.4c-6.3 0-11.4 5.1-11.4 11.4 0 2.5 0.8 4.7 2.1 6.6 0 0 4.8-2.5 8.9-2.5 5.5 0 9.4 2.9 9.4 2.9 1.5-1.9 2.4-4.3 2.4-7 0-6.3-5.1-11.4-11.4-11.4z"/>
-  <path fill="#E7FFE3" d="m47.1 23.3c-6.3-1.7-11.7 2.1-14.7 7.3-0.7 1.2-0.2 2.2 0.5 2.6 1 0.3 1.7 0.1 2.8-1.5 2.2-3.9 5.9-6.1 10.1-5.3 0 0 2.9 0.9 3.3-1 0.3-1.2-0.8-1.8-2-2.1z"/>
-  <path fill="#E7FFE3" d="m159.9 27.3c-0.1 1.9 2.9 1.9 2.9 1.9 4.2 0.4 6.8 2.3 7.8 6.7 0.6 1.9 1.2 2.2 2.3 2.2 0.8-0.1 1.6-1 1.2-2.4-1.4-5.8-5.1-9.8-11.7-9.9-1.2-0.1-2.4 0.2-2.5 1.5z"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/castro.svg b/app/Views/_assets/images/platforms/podcasting/castro.svg
deleted file mode 100644
index a1f7c73c1e..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/castro.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300">
-  <defs>
-    <linearGradient id="castro" x1="150" x2="150" y2="300" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#00ccbf"/>
-      <stop offset="1" stop-color="#00b265"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient" x1="-678.11" y1="574.88" x2="-678.11" y2="580.63" gradientTransform="translate(20211.11 -16925.38) scale(29.58 29.55)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#151515"/>
-      <stop offset="1" stop-color="#353535"/>
-    </linearGradient>
-  </defs>
-  <g id="castro-2" data-name="castro">
-    <rect width="300" height="300" rx="67" fill="url(#castro)"/>
-    <path id="path-2" d="M150,65a85,85,0,1,1-85,85A84.95,84.95,0,0,1,150,65Z" fill-rule="evenodd" fill="url(#linear-gradient)"/>
-    <path id="path-3" d="M185.42,198.64l-14.17-19.83a36.13,36.13,0,1,0-42,0l-14.16,19.83a60.49,60.49,0,1,1,95.86-49.11A62.82,62.82,0,0,1,185.42,198.64ZM150,134.89a14.64,14.64,0,1,1-14.64,14.64A14.71,14.71,0,0,1,150,134.89Z" fill="#fff" fill-rule="evenodd"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/chartable.svg b/app/Views/_assets/images/platforms/podcasting/chartable.svg
deleted file mode 100644
index 1a09a99bd9..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/chartable.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#fff"/>
- <circle cx="150" cy="150" r="85" fill="#bddbe8" stroke-dasharray="1.52637, 1.52637" stroke-width="1.5264"/>
- <path d="m119.28 196.55c-5.2759-0.41139-9.7186-1.2399-13.653-2.546-6.9248-2.2989-13.222-6.449-17.286-11.393-6.5353-7.949-9.2631-17.839-8.3879-30.411 0.69606-9.9992 2.6547-17.49 6.6052-25.262 2.764-5.4374 5.807-9.5961 9.9143-13.549 6.809-6.5529 15.012-10.554 24.086-11.749 4.0314-0.5307 10.66-0.32651 13.845 0.42647 6.8313 1.6152 11.839 5.4866 14.493 11.204 3.474 7.4848 2.6106 19.176-1.736 23.508-1.4198 1.415-2.8164 2.0178-4.9897 2.1538-2.9275 0.18324-5.0304-0.6543-6.3473-2.5281-0.89207-1.2693-1.0071-3.371-0.38296-6.9966 0.66108-3.8401 0.77076-5.5125 0.48376-7.3769-0.85327-5.5432-4.6866-8.1686-11.469-7.855-13.666 0.63195-24.596 12.949-27.39 30.867-1.1945 7.6596-0.89556 15.506 0.79293 20.81 1.3593 4.2696 3.1725 7.197 6.2806 10.14 5.1317 4.8585 11.858 7.0392 21.7 7.0348 8.6376-4e-3 15.814-1.5049 26.495-5.5418l2.8851-1.0904 0.14272-2.3326c0.0785-1.2829 0.14272-4.0282 0.14272-6.1006 0-9.519 1.416-22.71 3.654-34.039 3.8056-19.265 10.84-34.868 18.012-39.952 3.5656-2.5275 7.4093-3.4892 10.969-2.7444 3.867 0.80906 7.2202 4.5523 8.5708 9.5679 0.35828 1.3305 0.49623 2.6199 0.57664 5.3896 0.42125 14.51-6.9524 28.93-25.438 49.747l-2.4331 2.7399-0.14394 2.435c-0.0792 1.3392-0.11252 3.8008-0.0741 5.4702l0.0698 3.0351 0.96327-2.2644c4.4317-10.418 10.798-18.348 17.357-21.619 5.3814-2.6841 10.575-2.3474 12.763 0.82754 1.8537 2.6898 1.6068 6.521-1.3468 20.904-2.0726 10.093-2.3421 12.548-1.6299 14.847 0.5834 1.8829 2.8235 2.3929 5.2061 1.1853 2.1175-1.0732 5.6588-4.4869 10.01-9.6492 1.8391-2.182 2.612-2.7044 4.0007-2.7044 2.1334 0 3.0319 1.3454 3.1708 4.7478 0.10319 2.5289-0.27738 4.4331-1.2009 6.0091-1.3062 2.2289-6.3345 7.1702-10.394 10.214-3.3075 2.4801-6.686 3.8597-10.679 4.3606-7.3802 0.9259-12.053-1.7734-13.736-7.9354-0.30195-1.1054-0.38626-2.2087-0.37017-4.8446 0.0214-3.5012 0.19513-4.749 1.958-14.061 1.2473-6.5885 1.1942-8.2173-0.27231-8.359-0.60292-0.0583-0.90324 0.11129-1.9499 1.101-3.9066 3.6942-8.8177 13.999-11.538 24.21-0.96881 3.6364-1.719 5.3125-3.0559 6.8279-1.8926 2.1453-4.2493 3.1338-7.5137 3.1517-1.8941 0.0104-2.1889-0.0455-3.1168-0.59101-1.2312-0.72379-1.875-1.9008-2.23-4.0773-0.13331-0.81733-0.25689-1.5112-0.27462-1.5419-0.0177-0.0307-1.2127 0.39274-2.6556 0.94107-6.3414 2.41-12.926 3.9576-20.57 4.8351-2.9227 0.3355-10.723 0.59197-12.882 0.42359zm53.857-55.273c8.9818-11.73 14.266-25.324 13.216-33.999-0.30601-2.5291-0.58398-3.3974-1.3765-4.3001-1.4905-1.6976-3.179-0.61904-5.0729 3.2403-2.4678 5.029-4.9006 13.393-7.0014 24.071-0.65028 3.3054-2.204 13.036-2.1975 13.763 3e-3 0.38751 0.0549 0.32874 2.4321-2.7759z" fill="#30657b" stroke-width=".22021"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/deezer.svg b/app/Views/_assets/images/platforms/podcasting/deezer.svg
deleted file mode 100644
index 4dbfbabfaa..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/deezer.svg
+++ /dev/null
@@ -1,54 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300">
-  <defs>
-    <linearGradient id="linear-gradient" x1="121.67" y1="310.68" x2="178.33" y2="-10.68" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#202122"/>
-      <stop offset="1" stop-color="#26303c"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-2" x1="89.73" y1="16.18" x2="89.54" y2="4.17" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#358c7b"/>
-      <stop offset="0.53" stop-color="#33a65e"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-3" x1="79.3" y1="31.76" x2="99.98" y2="21.22" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#222b90"/>
-      <stop offset="1" stop-color="#367b99"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-4" x1="6.87" y1="42.77" x2="26.93" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#f90"/>
-      <stop offset="1" stop-color="#ff8000"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-5" x1="31.12" y1="42.77" x2="51.19" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#ff8000"/>
-      <stop offset="1" stop-color="#cc1953"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-6" x1="55.37" y1="42.77" x2="75.44" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#cc1953"/>
-      <stop offset="1" stop-color="#241284"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-7" x1="79.6" y1="42.77" x2="99.67" y2="42.77" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#222b90"/>
-      <stop offset="1" stop-color="#3559a6"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-8" x1="54.58" y1="29.66" x2="76.23" y2="23.33" xlink:href="#linear-gradient-6"/>
-    <linearGradient id="linear-gradient-9" x1="30.38" y1="22.58" x2="51.88" y2="30.4" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#fc0"/>
-      <stop offset="1" stop-color="#ce1938"/>
-    </linearGradient>
-    <linearGradient id="linear-gradient-10" x1="32.79" y1="2.51" x2="49.48" y2="17.91" gradientTransform="translate(52.42 116.38) scale(1.83)" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#ffd100"/>
-      <stop offset="1" stop-color="#fd5a22"/>
-    </linearGradient>
-  </defs>
-  <g id="deezer">
-    <rect width="300" height="300" rx="67" fill="url(#linear-gradient)"/>
-    <rect id="rect8185" x="198.24" y="94.52" width="36.76" height="21.51" fill="#40ab5d"/>
-    <rect id="rect8192" x="198.24" y="124.34" width="36.76" height="21.51" fill="url(#linear-gradient-2)"/>
-    <rect id="rect8199" x="198.24" y="154.16" width="36.76" height="21.51" fill="url(#linear-gradient-3)"/>
-    <rect id="rect8206" x="65" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-4)"/>
-    <rect id="rect8213" x="109.39" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-5)"/>
-    <rect id="rect8220" x="153.86" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-6)"/>
-    <rect id="rect8227" x="198.24" y="183.97" width="36.76" height="21.51" fill="url(#linear-gradient-7)"/>
-    <rect id="rect8234" x="153.86" y="154.16" width="36.76" height="21.51" fill="url(#linear-gradient-8)"/>
-    <rect id="rect8241" x="109.39" y="154.16" width="36.76" height="21.51" fill="url(#linear-gradient-9)"/>
-    <rect id="rect8248" x="109.39" y="124.34" width="36.76" height="21.51" fill="url(#linear-gradient-10)"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/fyyd.svg b/app/Views/_assets/images/platforms/podcasting/fyyd.svg
deleted file mode 100644
index e17b8f6bbb..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/fyyd.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#fff"/>
- <g transform="matrix(.46296 0 0 .46296 64.352 65)" clip-rule="evenodd" fill="#008000" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.4142">
-  <path d="m1.4 183.6c0-101.4 82.2-183.6 183.6-183.6 101.3 0 183.6 82.2 183.6 183.6 0 101.3-82.2 183.6-183.6 183.6-101.4-0.1-183.6-82.3-183.6-183.6zm149.9 119.3c6 6 15.5 6 21.5 0l108.5-108.5c6-6 6-15.5 0-21.5l-108.5-108.6c-6-6-15.5-6-21.5 0l-24.4 24.4c-6 6-6 15.5 0 21.5l73.4 73.4-73.4 73.4c-6 6-6 15.5 0 21.5z" fill="#008000"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/google.svg b/app/Views/_assets/images/platforms/podcasting/google.svg
deleted file mode 100644
index c158a05db5..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/google.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="google-podcasts">
-    <rect width="300" height="300" rx="67" fill="#fff"/>
-    <path id="Shape" d="M75.39,133.66A10.5,10.5,0,0,0,65,144.08v11.84a10.39,10.39,0,1,0,20.78,0V144.08C86.25,138.4,81.53,133.66,75.39,133.66Z" fill="#0066d9"/>
-    <path d="M224.61,133.66a10.5,10.5,0,0,0-10.39,10.42v11.84a10.39,10.39,0,1,0,20.78,0V144.08A10.5,10.5,0,0,0,224.61,133.66Z" fill="#4285f4"/>
-    <path d="M112.22,168.7a10.5,10.5,0,0,0-10.39,10.42V191a10.39,10.39,0,1,0,20.78,0V179.12C123.08,173.44,118.36,168.7,112.22,168.7Z" fill="#ea4335"/>
-    <path d="M112.22,99.09a10.5,10.5,0,0,0-10.39,10.42V147.4h0a10.39,10.39,0,1,0,20.78,0h0V109.51C123.08,103.83,118.36,99.09,112.22,99.09Z" fill="#ea4335"/>
-    <path d="M187.78,99.09a10.5,10.5,0,0,0-10.39,10.42v11.84a10.39,10.39,0,1,0,20.78,0V109.51A10.5,10.5,0,0,0,187.78,99.09Z" fill="#34a853"/>
-    <path d="M150,65a10.5,10.5,0,0,0-10.39,10.42V87.26a10.39,10.39,0,1,0,20.78,0V75.42A10.5,10.5,0,0,0,150,65Z" fill="#fab908"/>
-    <path d="M150,202.33a10.49,10.49,0,0,0-10.39,10.41v11.84a10.39,10.39,0,1,0,20.78,0V212.74A10.81,10.81,0,0,0,150,202.33Z" fill="#fab908"/>
-    <path d="M187.78,142.66a10.5,10.5,0,0,0-10.39,10.42V191a10.39,10.39,0,1,0,20.78,0V153.08A10.5,10.5,0,0,0,187.78,142.66Z" fill="#34a853"/>
-    <path d="M160.39,119.46a10.39,10.39,0,1,0-20.78,0h0V182h0a10.39,10.39,0,1,0,20.78,0h0v-62.5Z" fill="#fab908"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/ivoox.svg b/app/Views/_assets/images/platforms/podcasting/ivoox.svg
deleted file mode 100644
index 36299c8780..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/ivoox.svg
+++ /dev/null
@@ -1,7 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="ivoox">
-    <rect width="300" height="300" rx="67" fill="#ff8600"/>
-    <path d="M136.58,126.88a23.51,23.51,0,0,0,.31-47c-13.32,0-23.66,10.19-23.66,23.35A23,23,0,0,0,136.58,126.88Z" fill="#fff"/>
-    <path d="M116.52,181.56c0,36.82.16,81.65.16,118.31H159.3V201.62c0-16.45.15-32.91.15-49.52,0-5.32-1.41-10.18-6.11-12.84a20.43,20.43,0,0,0-9.09-2.82c-20.84-.32-41.68-.16-62.36-.16-2.19,0-2.82.78-2.82,3q.24,17.85,0,35.72c0,2.2.63,2.82,2.82,2.82,10.34-.15,20.68,0,31,0C116.52,177.8,116.52,177.8,116.52,181.56Z" fill="#fff"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/listennotes.svg b/app/Views/_assets/images/platforms/podcasting/listennotes.svg
deleted file mode 100644
index 9d01f6bbaa..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/listennotes.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="listennotes">
-    <rect width="300" height="300" rx="67" fill="#fff"/>
-    <path d="M178.46,193.16c-15.55,11.36-32.83,16.1-51.88,13.64C108.33,204.44,93.22,196,81.41,182A70.71,70.71,0,1,1,196.05,99.76a69.54,69.54,0,0,1,9.6,26.08,70.58,70.58,0,0,1-13,52.94c.13.08.22.15.32.2a79.82,79.82,0,0,1,12.38,8.13,113.6,113.6,0,0,1,19.26,19.2,69.62,69.62,0,0,1,7.15,10.9,31.83,31.83,0,0,1,2.83,7.19,13.09,13.09,0,0,1,.39,4.18,5.47,5.47,0,0,1-2.22,4.25,6.07,6.07,0,0,1-3.14,1.08,15.69,15.69,0,0,1-5.85-.74,42,42,0,0,1-8.45-3.67,83.54,83.54,0,0,1-12-8.18,115.42,115.42,0,0,1-16.93-16.73,77.74,77.74,0,0,1-7.69-11.09C178.62,193.39,178.54,193.28,178.46,193.16ZM135.77,80.84a55.91,55.91,0,1,0,55.93,55.95A55.9,55.9,0,0,0,135.77,80.84Z"/>
-    <path d="M108.43,97.91a63.9,63.9,0,0,1,25.67,5.27A66.07,66.07,0,0,1,174,164.05H163.68c0-.21,0-.43,0-.65a55.86,55.86,0,0,0-24.29-45.52,54.44,54.44,0,0,0-17.67-8,52,52,0,0,0-7.62-1.34c-1.59-.16-3.19-.19-4.78-.27l-.86,0Z" fill="#b82f00"/>
-    <path d="M155.73,165.78h-10.3a37.4,37.4,0,0,0-11.48-27c-7.53-7.37-16.69-10.94-27.23-11.13V117.3a49.2,49.2,0,0,1,42.52,24.31A46.75,46.75,0,0,1,155.73,165.78Z" fill="#b82f00"/>
-    <path d="M106.71,143.76v-9.5a31.07,31.07,0,0,1,27.45,16.52,28.64,28.64,0,0,1,3.42,14.06c-.45.12-8.82.13-9.41,0a20.92,20.92,0,0,0-6.4-14.93A21.45,21.45,0,0,0,106.71,143.76Z" fill="#b82f00"/>
-    <path d="M121.11,161a9,9,0,1,1-9.08-9A9,9,0,0,1,121.11,161Z" fill="#b82f00"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/overcast.svg b/app/Views/_assets/images/platforms/podcasting/overcast.svg
deleted file mode 100644
index db0bdb49d7..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/overcast.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="overcast">
-    <rect width="300" height="300" rx="67" fill="#fc7e0f"/>
-    <path id="overcastCanvas-bezier" d="M150,235a85,85,0,1,1,85-85A84.65,84.65,0,0,1,150,235Zm0-33.53,6.14-6.14L150,170.78l-6.14,24.55Zm-8-.47-3.3,12.28,7.55-7.56ZM158,201l-4.25,4.25,7.55,7.56Zm6.14,21.72L150,208.56l-14.17,14.16A71.77,71.77,0,0,0,150,224.14C154.72,224.14,159.44,224.14,164.17,222.72ZM150,75.39A74.77,74.77,0,0,0,75.39,150a73.52,73.52,0,0,0,50.05,69.89l16.06-59c-3.78-2.36-5.67-6.61-5.67-11.33A14.21,14.21,0,0,1,150,135.36a13.92,13.92,0,0,1,14.17,14.17c0,4.72-2.36,8.5-5.67,11.33l16.06,59A74,74,0,0,0,224.61,150,74.77,74.77,0,0,0,150,75.39Zm48.64,111.44c-1.89,2.36-4.72,2.84-7.56.95-2.36-1.89-2.83-4.72-.94-7.09a54.61,54.61,0,0,0,0-61.38c-1.89-2.37-1.42-5.2.94-7.09s5.67-.94,7.56,1c.94.47,11.8,15.11,11.8,36.83S199.11,186.36,198.64,186.83Zm-26-13.69c-1.89-2.36-1.89-6.14.47-8A23.68,23.68,0,0,0,178.33,150c0-9-5.19-14.64-5.19-15.11-2.36-1.89-2.36-5.67-.47-8a5.29,5.29,0,0,1,7.55-.47,35.56,35.56,0,0,1,0,47.22C177.86,175.5,175,175,172.67,173.14Zm-45.34,0a5.29,5.29,0,0,1-7.55.47,34.37,34.37,0,0,1-9-23.61c0-14.64,8.5-22.67,9-23.61,2.36-1.89,5.66-1.89,7.55.47s1.89,6.14-.47,8c0,.47-5.19,5.67-5.19,15.11a25.31,25.31,0,0,0,5.19,15.11C129.22,167,129.22,170.78,127.33,173.14Zm-18.41,14.64c-2.36,1.89-5.67.94-7.56-.95-.94-.47-11.8-15.11-11.8-36.83s10.86-35.89,11.8-36.83c1.89-2.36,4.72-2.84,7.56-1,2.36,1.89,2.83,4.72.94,7.09a54.61,54.61,0,0,0,0,61.38A4.74,4.74,0,0,1,108.92,187.78Z" fill="#fff" fill-rule="evenodd"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/playerfm.svg b/app/Views/_assets/images/platforms/podcasting/playerfm.svg
deleted file mode 100644
index 502b7343b4..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/playerfm.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="playerfm">
-    <rect width="300" height="300" rx="67" fill="#c81329"/>
-    <path d="M144.92,235A79.78,79.78,0,0,1,126,77.7c9-2.36,18.43,3.3,20.79,12.75,2.36,9-3.31,18.42-12.76,20.79-20.31,4.72-34.48,23.14-34.48,44.4A45.36,45.36,0,0,0,144.92,201c21.26,0,39.21-14.17,44.4-35,2.37-9,11.34-15.11,20.79-12.75,9,2.36,15.11,11.34,12.75,20.78A80.3,80.3,0,0,1,144.92,235Z" fill="#fff"/>
-    <path d="M227.59,139.58a7.1,7.1,0,0,1-7.09-5.2c-12.28-42.51-53.85-55.27-54.32-55.27a7.17,7.17,0,1,1,4.25-13.69c1.89.47,49.6,15.11,64.24,64.71,1,3.78-.94,8-4.72,9A5.17,5.17,0,0,1,227.59,139.58Z" fill="#fff"/>
-    <path d="M204,144.3a7.1,7.1,0,0,1-7.09-5.19c-8.5-27.4-35.43-36.38-35.43-36.85-3.78-1.42-6.14-5.19-4.72-9s5.2-6.14,9-4.73c1.42.47,34.49,11.34,44.88,46.3.95,3.77-.94,8-4.72,9C205.38,143.83,204.44,144.3,204,144.3Z" fill="#fff"/>
-    <path d="M179.88,147.14a7.14,7.14,0,0,1-6.62-4.25c-5.19-11.81-16.53-17.48-16.53-17.48a7.39,7.39,0,1,1,6.61-13.23c.47.47,16.06,8,23.62,24.57a6.93,6.93,0,0,1-3.31,9.44A6.29,6.29,0,0,1,179.88,147.14Z" fill="#fff"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/pocketcasts.svg b/app/Views/_assets/images/platforms/podcasting/pocketcasts.svg
deleted file mode 100644
index 7cefa63c85..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/pocketcasts.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="pocketcasts">
-    <rect width="300" height="300" rx="67" fill="#f43e37"/>
-    <path d="M65,150a85,85,0,0,1,170,0H213.75A63.75,63.75,0,1,0,150,213.75V235A85.25,85.25,0,0,1,65,150Zm85,51a51,51,0,1,1,51-51H182.58A32.58,32.58,0,1,0,150,182.58Z" fill="#fff" fill-rule="evenodd"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podbean.svg b/app/Views/_assets/images/platforms/podcasting/podbean.svg
deleted file mode 100644
index ab3710939b..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podbean.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="podbean">
-    <rect width="300" height="300" rx="67" fill="#252027"/>
-    <path d="M148.57,167.13c6.39-.62,12.72,2.28,17.07,6.87a30.92,30.92,0,0,1,3.62,5.75c1.55,3.56,1.63,7.54,1.39,11.35A20.88,20.88,0,0,1,162,204.85a18.47,18.47,0,0,1-9.54,3.53,28,28,0,0,1-7.26-.28,25.22,25.22,0,0,1-8.1-3.91,22.63,22.63,0,0,1-6.51-9,20.48,20.48,0,0,1,1.5-17.62,20.12,20.12,0,0,1,3.52-4.57,26,26,0,0,1,6.39-4.31A30.54,30.54,0,0,1,148.57,167.13Z" fill="#fff"/>
-    <path d="M148.25,80.27a82.52,82.52,0,0,1,14.31.74,89.08,89.08,0,0,1,11.79,2.23,97.77,97.77,0,0,1,16.75,5.84,93.84,93.84,0,0,1,18.05,10.77,76.07,76.07,0,0,1,9.17,7.73c1.71,1.74,3.48,3.44,5.17,5.22A91,91,0,0,1,234,126.69a12.09,12.09,0,0,1,1,4.11,10.52,10.52,0,0,1-3.68,8.11,9.54,9.54,0,0,1-5.66,2.22,9.67,9.67,0,0,1-7.44-2.31c-1.95-1.76-3.12-4.14-4.69-6.2a78.41,78.41,0,0,0-20-19,82.9,82.9,0,0,0-11.91-6.53c-1.53-.66-3.11-1.21-4.66-1.83a64.2,64.2,0,0,0-11.13-3.16,82,82,0,0,0-15.15-1.5,71.44,71.44,0,0,0-15.17,1.21,74.6,74.6,0,0,0-11.84,3.24,79,79,0,0,0-35.06,24.66c-1.58,2.07-3.16,4.14-4.59,6.32A13.36,13.36,0,0,1,81,139.45,10.15,10.15,0,0,1,77.26,141a14,14,0,0,1-4.74-.07,9.72,9.72,0,0,1-5.93-4.49,10.1,10.1,0,0,1-1-8.75,16.89,16.89,0,0,1,1.48-2.7,99.33,99.33,0,0,1,35-32.49,109.06,109.06,0,0,1,18-7.7A102.4,102.4,0,0,1,148.25,80.27Z" fill="#8dc742"/>
-    <path d="M149.23,116.85a61.61,61.61,0,0,1,44.29,17.86,54,54,0,0,1,8.92,11.06,10.64,10.64,0,0,1,.74,8.52,10.28,10.28,0,0,1-5.48,5.79,10.11,10.11,0,0,1-10.29-1.36,13.3,13.3,0,0,1-2.68-3,47.3,47.3,0,0,0-6-7.2A42,42,0,0,0,158.5,138a46.12,46.12,0,0,0-9.6-.81c-8.2,0-16.2,2.92-22.93,7.48a46,46,0,0,0-8,7.36c-1.65,1.92-2.92,4.13-4.6,6a10.14,10.14,0,0,1-16.8-4.67,9.48,9.48,0,0,1-.06-5.12,13,13,0,0,1,2-4,70.45,70.45,0,0,1,7.33-9,66.92,66.92,0,0,1,10.51-8.46,60.35,60.35,0,0,1,11.73-5.93A62.53,62.53,0,0,1,149.23,116.85Z" fill="#8dc742"/>
-    <path d="M148.52,156.34a31.67,31.67,0,0,1,27.41,13.37,31.25,31.25,0,0,1,5.64,15.71,42.81,42.81,0,0,1-.23,8.16,33,33,0,0,1-10.05,18,31.78,31.78,0,0,1-15,7.55,33.35,33.35,0,0,1-10.64.37,32.19,32.19,0,0,1-11.24-3.84,33.53,33.53,0,0,1-9.36-8,36.17,36.17,0,0,1-4.84-8.67,31.75,31.75,0,0,1-.57-20.13A32,32,0,0,1,132,161.93a31,31,0,0,1,16.5-5.59m.28,15.08a23.89,23.89,0,0,0-5.29,1.21,20.94,20.94,0,0,0-5.13,3.46,16.85,16.85,0,0,0-4,17.79,18.07,18.07,0,0,0,5.21,7.24,20.08,20.08,0,0,0,6.5,3.14,22.67,22.67,0,0,0,5.82.23,14.86,14.86,0,0,0,7.65-2.83,16.76,16.76,0,0,0,7-11,19.55,19.55,0,0,0-1.12-9.1,24.82,24.82,0,0,0-2.9-4.61A17,17,0,0,0,148.8,171.42Z" fill="#8dc742"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podcastaddict.svg b/app/Views/_assets/images/platforms/podcasting/podcastaddict.svg
deleted file mode 100644
index 9544f550d6..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podcastaddict.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300">
-  <defs>
-    <linearGradient id="linear-gradient" x1="142.29" y1="253.24" x2="273.52" y2="121.61" gradientUnits="userSpaceOnUse">
-      <stop offset="0.13" stop-color="#e85d27"/>
-      <stop offset="0.69" stop-color="#f0772b"/>
-    </linearGradient>
-  </defs>
-  <g id="podcast-addict">
-    <rect width="300" height="300" rx="67" fill="#f4842d"/>
-    <path d="M300,233V183.06L217.93,101,147.86,82,85.5,158.53l14,60.86L180.14,300H233A67,67,0,0,0,300,233Z" fill="url(#linear-gradient)"/>
-    <path d="M234.94,148.07a85,85,0,1,0-124.89,77V149.57a40.42,40.42,0,0,1,32.77-39.63v14.13a26.56,26.56,0,0,0-19,25.5v.23h0v.11a26.6,26.6,0,0,0,52.09,7.27H190a40.33,40.33,0,0,1-66.23,22.67v51A85.77,85.77,0,0,0,150,235a84.59,84.59,0,0,0,47.65-14.59V235H235l-.06-86.93Zm-84.62,17a15.52,15.52,0,1,1,15.51-15.51A15.48,15.48,0,0,1,150.32,165.08Zm40.38-15.4H177v-.11a26.58,26.58,0,0,0-26.6-26.6h-.05V109.24h.05a40.33,40.33,0,0,1,40.33,40.33Zm23.65,0H200.73v-.11a50.36,50.36,0,0,0-50.36-50.36h-.05V85.59h.05a64,64,0,0,1,64,64Z" fill="#fff"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podcastindex.svg b/app/Views/_assets/images/platforms/podcasting/podcastindex.svg
deleted file mode 100644
index f55cb7787f..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podcastindex.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#a00"/>
- <path d="m86.443 74.014-1.164 1.2443c-10.624 11.352-17.086 24.618-19.614 40.264-0.6282 3.889-0.87221 13.034-0.46444 17.395 0.52565 5.6222 1.6382 10.827 3.5778 16.742 2.6825 8.1804 7.1797 16.385 12.617 23.014 2.1481 2.6189 4.9164 5.6404 5.1618 5.6348 0.08123-2e-3 2.4698-2.3265 5.308-5.1661l5.1604-5.1632-1.4277-1.4678c-7.6388-7.8558-12.989-18.745-15.144-30.825-0.70766-3.9654-0.88111-12.413-0.33973-16.557 1.6185-12.39 6.8116-23.696 15.055-32.78l1.7202-1.8964-5.2235-5.2192zm127.11 0.0029-10.444 10.435 1.6513 1.7689c2.2391 2.3976 5.507 6.7796 7.2406 9.7087 8.0172 13.549 10.381 29.552 6.5837 44.577-1.4313 5.6636-3.8657 11.534-6.8129 16.433-1.5633 2.5982-5.4754 7.722-7.263 9.5122l-1.4062 1.4091 5.2091 5.222 5.2091 5.2235 1.1425-1.1138c0.62864-0.61189 1.9098-2.0097 2.8468-3.1077 8.797-10.308 14.719-23.267 16.826-36.816 0.71394-4.5915 0.89257-14.531 0.34547-19.278-0.98586-8.555-3.2874-16.413-7.0613-24.109-3.4164-6.9672-7.6663-13.139-12.66-18.387zm-17.587 17.584-5.0572 5.0586-5.0586 5.0572 0.92311 1.0937c4.507 5.3429 7.067 10.372 8.4301 16.557 0.61235 2.7794 0.74026 8.9539 0.25086 12.091-0.67188 4.3072-2.4127 9.1197-4.5884 12.686-1.0693 1.7527-3.6154 5.1128-4.4236 5.837-0.48933 0.43841-0.48125 0.4479 4.4895 5.5789 2.7385 2.8267 5.0446 5.1114 5.126 5.0787 0.0814-0.0327 0.67246-0.63988 1.313-1.3503 5.4732-6.0703 9.281-13.131 11.33-21.01 3.9908-15.344-0.12986-32.456-10.683-44.363zm-91.754 0.2537c-0.30746-0.06121-0.69429 0.37777-2.1659 2.0785-2.4502 2.8316-3.4895 4.2471-5.2163 7.1112-3.1224 5.179-5.2049 10.824-6.3716 17.263-0.50856 2.8066-0.71317 9.9642-0.36983 12.939 1.187 10.286 5.3538 19.803 11.912 27.202l2.0656 2.3293 5.007-5.1102 5.0084-5.1102-1.1496-1.3302c-4.047-4.6807-6.7034-10.007-8.0774-16.2-0.68545-3.0884-0.7384-9.911-0.10034-13.07 1.2873-6.3732 4.2129-12.347 8.1446-16.632l1.4621-1.5926-4.6673-4.63c-2.5673-2.5468-4.8907-4.8196-5.1632-5.05-0.12226-0.10336-0.21574-0.17885-0.31822-0.19924zm16.644 16.354-0.58771 0.70382c-1.9132 2.2963-4.0928 6.939-5.0457 10.745-0.6866 2.7426-0.86529 8.2349-0.36122 11.128 0.43461 2.4945 1.3262 5.4446 2.2892 7.5754 0.71497 1.5823 3.1697 5.427 3.4646 5.427 0.0953 0 1.4731-1.3158 3.0633-2.9242l2.8912-2.9242-0.47877-0.77406c-4.3296-7.0055-4.2822-15.126 0.12758-22.112l0.58198-0.92311-2.9715-2.9615zm58.352 0.1161c-0.32564 0-5.7194 5.529-5.7194 5.8628 0 0.2031 0.27558 0.77701 0.61351 1.2744 3.8598 5.6802 4.0679 14.341 0.49454 20.594l-1.0163 1.7803 2.831 2.9615c1.5571 1.6292 2.9014 2.9696 2.9873 2.9773 0.0859 8e-3 0.52626-0.49123 0.97907-1.108 1.1824-1.6107 2.6499-4.4136 3.4274-6.5465 2.8302-7.7643 2.1774-16.582-1.7603-23.759-0.84692-1.5436-2.5988-4.0366-2.8368-4.0366zm-28.656 1.5753c-1.4423 4e-3 -2.8916 0.14205-3.9549 0.41426-4.614 1.1814-8.6196 4.4216-10.764 8.708-4.0197 8.0358-0.68308 17.77 7.5172 21.928 2.5055 1.2708 4.4886 1.6762 7.7092 1.5768 2.0654-0.0637 3.2574-0.22545 4.4623-0.60634 4.9195-1.5552 8.8553-5.4521 10.685-10.58 0.74-2.0743 0.93617-6.706 0.37843-8.9346-1.4801-5.914-6.1361-10.567-12.12-12.111-1.0353-0.26722-2.471-0.39908-3.9132-0.39563zm-9.379 39.291-0.65075 4.9898c-0.98758 7.5709-3.0927 23.539-4.2659 32.351-1.3288 9.9815-3.4038 25.731-4.3318 32.88-0.39403 3.0355-0.77054 5.757-0.83571 6.0476l-0.11755 0.52751h18.072l0.12757-0.7626c0.0701-0.41981 0.28334-1.9792 0.47447-3.4646 0.19114-1.4854 0.82221-6.2945 1.4019-10.686 0.57967-4.3918 1.642-12.475 2.3608-17.965 1.7847-13.63 3.4514-26.298 4.7045-35.735 0.57723-4.3475 1.0507-7.9666 1.0507-8.0428 0-0.0766-4.048-0.13904-8.9948-0.13904z" fill="#fff" stroke-width=".36682"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podchaser.svg b/app/Views/_assets/images/platforms/podcasting/podchaser.svg
deleted file mode 100644
index b875da9dfe..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podchaser.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="podchaser">
-    <rect width="300" height="300" rx="67" fill="#293b65"/>
-    <circle id="Outer-Pink" cx="150" cy="150" r="85" fill="#f70664"/>
-    <circle id="Outer-White" cx="150" cy="150.14" r="73.19" fill="#fff"/>
-    <path d="M150,97.25a54.32,54.32,0,0,0-54.31,54.31v47.69a79.45,79.45,0,0,0,30.7,20.31V200.47A54.31,54.31,0,1,0,150,97.25Z" fill="#293b65"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podcloud.svg b/app/Views/_assets/images/platforms/podcasting/podcloud.svg
deleted file mode 100644
index 8bdfccd98f..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podcloud.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#fff"/>
- <g transform="matrix(.625 0 0 .625 .5364 .11496)">
-  <path fill="#fdfdfd" d="m276.6 128.4c-1.18 0.05-2.85 0.16-3.7 0.24-0.85 0.09-3.08 0.38-4.95 0.65-1.87 0.28-4.39 0.71-5.6 0.96s-2.63 0.55-3.15 0.66c-0.52 0.1-1.31 0.3-1.75 0.44-0.44 0.13-1.36 0.38-2.05 0.56-0.69 0.17-1.57 0.43-1.95 0.56-0.39 0.14-1.47 0.51-2.4 0.83-0.94 0.32-2.33 0.81-3.1 1.08s-1.58 0.58-1.8 0.7c-0.22 0.11-0.81 0.36-1.3 0.55-0.5 0.19-1.53 0.64-2.3 0.99s-2.12 1.01-3 1.47c-0.88 0.47-1.89 0.99-2.25 1.16-0.36 0.18-1.1 0.58-1.65 0.9-0.55 0.31-1.38 0.8-1.85 1.07-0.47 0.28-1.12 0.67-1.45 0.86s-1.43 0.91-2.45 1.59-2.28 1.55-2.8 1.94c-0.52 0.38-1.27 0.92-1.65 1.18-0.39 0.26-1.29 0.95-2 1.52-0.72 0.58-1.75 1.41-2.3 1.85-0.55 0.45-1.92 1.67-3.05 2.71s-2.95 2.84-4.05 3.99-2.3 2.43-2.66 2.84-1.03 1.22-1.49 1.8c-0.47 0.58-1.07 1.32-1.35 1.65s-0.97 1.23-1.55 2c-0.57 0.77-1.25 1.69-1.5 2.05s-0.86 1.23-1.35 1.93c-0.65 0.92-0.94 1.26-1.05 1.22-0.08-0.03-0.92-0.11-1.85-0.18-0.94-0.06-3.12-0.11-4.85-0.12-1.73 0-3.85 0.06-4.7 0.13s-2 0.17-2.55 0.23-1.63 0.19-2.4 0.29c-0.77 0.11-1.9 0.28-2.5 0.39-0.61 0.11-1.71 0.32-2.45 0.46-0.74 0.13-2.39 0.52-3.65 0.86-1.27 0.33-2.37 0.64-2.45 0.68-0.08 0.05-1.12 0.41-2.3 0.81-1.18 0.39-2.96 1.05-3.95 1.45-0.99 0.41-2.68 1.16-3.75 1.68-1.07 0.51-2.51 1.25-3.2 1.62-0.69 0.38-1.52 0.84-1.85 1.02-0.33 0.19-1.16 0.68-1.85 1.11-0.69 0.42-1.68 1.06-2.2 1.41s-1.33 0.91-1.8 1.25c-0.47 0.33-1.35 0.99-1.95 1.45-0.61 0.47-1.66 1.33-2.35 1.9-0.69 0.58-1.93 1.66-2.75 2.41-0.83 0.76-2.08 2-2.8 2.76-0.71 0.76-1.5 1.62-1.75 1.89-0.25 0.28-0.58 0.66-0.75 0.85-0.16 0.19-0.75 0.91-1.3 1.6s-1.2 1.51-1.45 1.84c-0.25 0.32-0.68 0.91-0.97 1.3-0.28 0.39-0.85 1.2-1.26 1.81-0.41 0.6-1.08 1.62-1.49 2.25s-1.04 1.67-1.4 2.3-1.03 1.89-1.49 2.8-0.98 1.96-1.14 2.33l-0.3 0.68c-1.32-0.01-2.31 0.04-3.05 0.09-0.74 0.06-2.59 0.27-4.1 0.46s-3.79 0.55-5.05 0.8c-1.27 0.25-3.04 0.66-3.95 0.9s-2.15 0.58-2.75 0.74c-0.61 0.17-1.91 0.58-2.9 0.92-0.99 0.33-2.48 0.87-3.3 1.2-0.83 0.33-2.04 0.85-2.7 1.15-0.66 0.31-1.81 0.86-2.55 1.23s-2.23 1.16-3.3 1.75-2.6 1.49-3.4 2.01c-0.8 0.51-1.86 1.21-2.37 1.56-0.5 0.35-1.6 1.15-2.45 1.79-0.84 0.64-2.16 1.69-2.93 2.33s-2.26 1.98-3.3 2.99c-1.05 1-2.4 2.36-3.01 3.02s-1.47 1.63-1.9 2.15c-0.44 0.52-1.07 1.29-1.4 1.7-0.34 0.41-0.97 1.22-1.4 1.8-0.44 0.58-1.31 1.84-1.95 2.8s-1.41 2.15-1.71 2.65c-0.31 0.49-0.9 1.48-1.31 2.2-0.41 0.71-1.06 1.93-1.44 2.7-0.39 0.77-0.97 2.01-1.3 2.75-0.34 0.74-0.81 1.84-1.06 2.45-0.25 0.6-0.66 1.66-0.9 2.35-0.25 0.69-0.71 2.04-1.02 3s-0.79 2.67-1.07 3.8c-0.27 1.13-0.58 2.45-0.68 2.95-0.1 0.49-0.32 1.75-0.49 2.8-0.17 1.04-0.35 2.3-0.41 2.8-0.06 0.49-0.18 1.64-0.25 2.55-0.1 1.06-0.15 3.06-0.15 5.6 0 2.17 0.05 4.44 0.1 5.05 0.06 0.6 0.2 1.86 0.31 2.8 0.11 0.93 0.34 2.49 0.5 3.45 0.17 0.96 0.45 2.4 0.64 3.2 0.18 0.8 0.5 2.1 0.7 2.9s0.54 2.03 0.76 2.75c0.23 0.71 0.83 2.42 1.34 3.8 0.52 1.37 1.19 3.06 1.5 3.75s1.08 2.26 1.71 3.5c0.64 1.24 1.52 2.86 1.96 3.6s1.24 2 1.77 2.8 1.3 1.92 1.71 2.5 0.97 1.34 1.25 1.7c0.27 0.36 1.03 1.3 1.69 2.1s1.86 2.17 2.66 3.05 1.59 1.7 1.75 1.82c0.17 0.12 0.75 0.67 1.3 1.23s1.51 1.45 2.14 1.98c0.62 0.53 1.64 1.37 2.26 1.87 0.62 0.49 1.77 1.37 2.56 1.95s2.12 1.5 2.95 2.05c0.84 0.55 2.21 1.4 3.06 1.9 0.84 0.49 2.16 1.23 2.93 1.64s2.21 1.12 3.2 1.58c0.99 0.47 2.18 1 2.65 1.2 0.47 0.19 1.07 0.43 1.35 0.53 0.27 0.1 1.02 0.38 1.65 0.63 0.63 0.24 2.05 0.72 3.15 1.06 1.1 0.35 2.79 0.83 3.75 1.07 0.96 0.25 2.15 0.53 2.65 0.64 0.49 0.11 1.64 0.33 2.55 0.49s2.3 0.39 3.1 0.51 2.44 0.28 3.65 0.36 3.28 0.17 4.6 0.21c1.32 0.03 11.62 0 22.9-0.06 11.27-0.06 32.74-0.18 47.7-0.26s52.62-0.28 83.7-0.45c31.07-0.16 57.94-0.31 59.7-0.34 1.88-0.02 3.84-0.11 4.75-0.2 0.85-0.09 2.29-0.25 3.2-0.37s2.14-0.29 2.75-0.4c0.6-0.1 1.73-0.3 2.5-0.44 0.77-0.15 2.52-0.55 3.9-0.9 1.37-0.35 3.11-0.85 3.85-1.11s1.78-0.61 2.3-0.79 1.38-0.49 1.9-0.69 1.51-0.6 2.2-0.89c0.68-0.29 2.39-1.09 3.8-1.79 1.4-0.7 3.2-1.66 4-2.13 0.8-0.48 1.88-1.14 2.4-1.48s1.47-0.95 2.1-1.36c0.63-0.42 1.78-1.23 2.55-1.81s1.76-1.34 2.2-1.69 1.02-0.85 1.3-1.11c0.27-0.27 0.81-0.74 1.2-1.06 0.38-0.33 1.59-1.47 2.68-2.54s2.47-2.49 3.06-3.15 1.4-1.63 1.81-2.15c0.4-0.52 0.94-1.2 1.2-1.5s0.89-1.14 1.4-1.85c0.52-0.72 1.33-1.91 1.82-2.65 0.48-0.74 1.28-2.03 1.77-2.85 0.49-0.83 1.06-1.79 1.25-2.15 0.2-0.36 0.68-1.3 1.07-2.1s0.94-1.95 1.21-2.55c0.27-0.61 0.91-2.16 1.43-3.45 0.51-1.29 1.2-3.23 1.53-4.3s0.74-2.47 0.9-3.1c0.17-0.63 0.49-2.01 0.71-3.05 0.22-1.05 0.47-2.37 0.56-2.95s0.23-1.5 0.31-2.05 0.24-1.83 0.35-2.85c0.11-1.04 0.23-2.93 0.26-4.3 0.03-1.38 0.01-3.54-0.06-4.95-0.07-1.38-0.23-3.49-0.36-4.7-0.14-1.21-0.38-3.01-0.55-4s-0.43-2.34-0.59-3c-0.17-0.66-0.48-1.97-0.71-2.9-0.23-0.94-0.66-2.42-0.95-3.3s-0.86-2.46-1.25-3.5c-0.39-1.05-0.84-2.19-1-2.55s-0.83-1.78-1.5-3.15c-0.67-1.38-1.73-3.36-2.36-4.4-0.63-1.05-1.43-2.33-1.77-2.85-0.34-0.53-1.1-1.63-1.68-2.45-0.59-0.83-1.71-2.31-2.5-3.3s-1.95-2.36-2.58-3.05-1.89-1.98-2.8-2.88-2.09-2.01-2.61-2.46c-0.52-0.46-1.38-1.18-1.91-1.62-0.52-0.43-1.29-1.05-1.7-1.36s-1.03-0.79-1.39-1.06-1.24-0.89-1.95-1.38c-0.72-0.49-1.77-1.19-2.35-1.55-0.58-0.37-1.39-0.87-1.8-1.12-0.41-0.24-1.45-0.83-2.3-1.29-0.85-0.47-2.09-1.12-2.76-1.44-0.66-0.33-1.66-0.79-2.21-1.04l-1.01-0.45c-0.07-2.95-0.14-4.34-0.2-5-0.07-0.66-0.17-1.67-0.23-2.25s-0.22-1.82-0.35-2.75c-0.13-0.94-0.33-2.26-0.43-2.95-0.11-0.69-0.27-1.57-0.35-1.95-0.08-0.39-0.38-1.67-0.66-2.85s-0.6-2.56-0.71-3.05c-0.12-0.5-0.52-1.87-0.91-3.05-0.38-1.18-0.95-2.89-1.25-3.8-0.31-0.91-0.71-2.01-0.9-2.45s-0.48-1.14-0.63-1.55c-0.16-0.41-0.48-1.22-0.73-1.8-0.24-0.58-1.15-2.45-2.01-4.15-0.86-1.71-1.97-3.8-2.47-4.65s-1.07-1.82-1.27-2.15-1.03-1.61-1.85-2.85c-0.83-1.24-1.76-2.59-2.08-3s-1.05-1.38-1.64-2.15c-0.58-0.77-1.31-1.72-1.63-2.1-0.31-0.39-1.13-1.36-1.81-2.15-0.68-0.8-2.62-2.82-4.3-4.5-1.69-1.68-3.43-3.37-3.87-3.75-0.44-0.39-1.2-1.04-1.69-1.45-0.48-0.41-1.23-1.02-1.66-1.35-0.42-0.33-1.15-0.9-1.61-1.26-0.46-0.37-1.35-1.04-1.98-1.5s-2.17-1.51-3.42-2.34-2.48-1.63-2.75-1.78c-0.26-0.15-0.91-0.53-1.43-0.84-0.52-0.3-1.54-0.88-2.25-1.28-0.72-0.4-1.71-0.93-2.2-1.18-0.5-0.24-1.13-0.58-1.4-0.74-0.28-0.16-0.77-0.4-1.1-0.53s-0.89-0.38-1.25-0.56c-0.36-0.17-1.06-0.49-1.55-0.69-0.5-0.2-1.55-0.64-2.35-0.97-0.8-0.34-2.06-0.82-2.8-1.09-0.74-0.26-1.8-0.63-2.35-0.83-0.55-0.19-1.72-0.57-2.6-0.85s-2.46-0.73-3.5-1.01c-1.05-0.28-3.05-0.75-4.45-1.04-1.4-0.3-2.89-0.61-3.3-0.7-0.41-0.08-1.38-0.24-2.15-0.35-0.77-0.12-2.01-0.28-2.75-0.36-0.74-0.09-1.91-0.22-2.6-0.3s-2.17-0.19-3.3-0.24c-1.13-0.06-3.4-0.13-5.05-0.15s-3.97-0.01-5.15 0.04z"/>
-  <path fill="#21218b" d="m277.3 137.4c-1.24 0.05-2.77 0.14-3.4 0.2s-2.57 0.32-4.3 0.56-4.37 0.69-5.85 0.99c-1.49 0.3-3.04 0.65-3.45 0.76-0.41 0.12-1.4 0.39-2.2 0.6s-1.95 0.56-2.55 0.78c-0.61 0.22-1.64 0.58-2.3 0.81s-1.74 0.61-2.4 0.84c-0.66 0.24-1.83 0.7-2.6 1.03s-1.81 0.78-2.3 1.01c-0.5 0.22-1.4 0.66-2 0.97-0.61 0.32-1.64 0.86-2.3 1.2s-1.63 0.87-2.15 1.17-1.22 0.71-1.55 0.91c-0.33 0.19-0.96 0.57-1.4 0.84-0.43 0.26-1.22 0.77-1.75 1.12-0.52 0.35-1.36 0.93-1.85 1.29-0.5 0.36-1.26 0.92-1.7 1.24s-1.09 0.79-1.44 1.06c-0.36 0.26-1.21 0.94-1.9 1.5-0.7 0.57-1.46 1.2-1.71 1.4-0.24 0.21-1 0.89-1.68 1.52s-1.78 1.69-2.45 2.36c-0.67 0.66-1.69 1.7-2.27 2.3-0.57 0.6-1.29 1.38-1.6 1.74s-1.03 1.23-1.61 1.93c-0.57 0.7-1.21 1.49-1.41 1.75-0.21 0.26-0.77 1.01-1.26 1.67-0.48 0.66-1.18 1.63-1.54 2.15-0.37 0.52-0.76 1.06-0.86 1.2-0.11 0.14-0.43 0.63-0.72 1.1s-0.85 1.39-1.25 2.05c-0.39 0.66-0.83 1.4-0.97 1.65s-0.38 0.55-0.54 0.68c-0.23 0.18-0.41 0.22-0.84 0.22-0.3-0.01-0.78-0.05-1.05-0.11-0.28-0.05-1.45-0.22-2.6-0.38-1.16-0.16-3.11-0.34-4.35-0.41s-3.02-0.1-3.95-0.08c-0.94 0.03-2.31 0.11-3.05 0.17s-1.82 0.16-2.4 0.22-1.61 0.19-2.3 0.29-2.02 0.32-2.95 0.49c-0.94 0.16-2.33 0.46-3.1 0.66s-1.63 0.43-1.9 0.5c-0.28 0.07-1.6 0.51-2.95 0.98-1.35 0.46-3.19 1.14-4.1 1.51s-2.62 1.16-3.8 1.75-2.74 1.41-3.45 1.83c-0.72 0.42-1.55 0.91-1.85 1.1s-1 0.63-1.55 0.99-1.36 0.92-1.81 1.25c-0.44 0.32-1.16 0.86-1.6 1.18-0.43 0.33-1.38 1.09-2.09 1.7-0.72 0.6-1.75 1.51-2.3 2-0.55 0.5-1.29 1.21-1.65 1.57s-1.11 1.15-1.66 1.75c-0.56 0.6-1.26 1.38-1.55 1.73-0.3 0.35-0.83 1.01-1.19 1.45-0.36 0.45-0.99 1.26-1.4 1.81-0.4 0.55-0.9 1.22-1.1 1.5-0.21 0.27-0.68 0.97-1.05 1.55s-0.84 1.3-1.05 1.6c-0.2 0.3-0.54 0.86-0.75 1.25-0.21 0.38-0.46 0.81-0.55 0.95s-0.44 0.79-0.78 1.45c-0.33 0.66-0.88 1.78-1.2 2.5-0.33 0.71-0.92 2.11-1.32 3.1-0.39 0.99-0.81 2-0.93 2.24-0.12 0.25-0.36 0.53-0.52 0.63-0.17 0.1-0.49 0.18-0.75 0.18-0.25 0-0.99-0.07-1.65-0.15s-1.9-0.15-2.75-0.15-2.18 0.05-2.95 0.1c-0.77 0.06-1.72 0.15-2.1 0.21-0.39 0.05-1.43 0.19-2.33 0.3-0.89 0.1-2.51 0.37-3.6 0.58-1.08 0.22-2.56 0.55-3.27 0.74-0.72 0.19-1.86 0.51-2.55 0.7s-2.06 0.63-3.05 0.96c-0.99 0.34-2.05 0.72-2.35 0.85s-0.91 0.38-1.35 0.56c-0.44 0.19-1.54 0.69-2.45 1.13s-2.44 1.22-3.4 1.75c-0.96 0.52-2.04 1.13-2.4 1.35s-1.35 0.86-2.2 1.43-2.18 1.51-2.95 2.1c-0.77 0.58-2.05 1.61-2.85 2.28-0.8 0.66-2.19 1.95-3.11 2.86-0.91 0.91-1.99 2.01-2.4 2.45s-1.25 1.41-1.86 2.15c-0.62 0.74-1.44 1.77-1.82 2.27-0.39 0.51-1.15 1.59-1.69 2.4-0.55 0.82-1.26 1.91-1.58 2.43-0.33 0.52-0.78 1.26-0.99 1.65-0.22 0.38-0.5 0.88-0.63 1.1-0.12 0.22-0.58 1.12-1.02 2-0.43 0.88-1.06 2.25-1.4 3.05s-0.84 2.06-1.12 2.8-0.7 1.96-0.95 2.7c-0.24 0.74-0.7 2.43-1.03 3.75s-0.69 2.96-0.8 3.65c-0.12 0.69-0.3 1.83-0.4 2.55-0.1 0.71-0.26 2.08-0.34 3.02-0.11 1.15-0.16 2.85-0.16 5.05 0 1.83 0.04 3.82 0.1 4.43 0.06 0.6 0.17 1.71 0.26 2.45 0.08 0.74 0.22 1.73 0.3 2.2s0.19 1.12 0.25 1.45c0.05 0.33 0.23 1.21 0.4 1.95s0.48 2.02 0.69 2.85c0.21 0.82 0.51 1.88 0.65 2.35 0.15 0.47 0.63 1.82 1.07 3s0.98 2.58 1.21 3.1c0.22 0.52 0.89 1.89 1.47 3.05 0.58 1.15 1.44 2.73 1.9 3.5s1.22 1.98 1.7 2.7c0.48 0.71 1.11 1.64 1.41 2.05s0.76 1.04 1.04 1.4c0.27 0.36 1.03 1.3 1.69 2.1s2.28 2.53 3.6 3.85c1.33 1.32 2.72 2.66 3.11 2.97 0.38 0.32 1.01 0.84 1.4 1.17 0.38 0.33 0.88 0.73 1.1 0.88 0.23 0.15 0.97 0.69 1.65 1.2 0.69 0.51 1.7 1.23 2.25 1.59 0.55 0.37 1.72 1.1 2.6 1.62s2.07 1.2 2.65 1.5 1.09 0.58 1.15 0.62c0.05 0.04 0.8 0.4 1.65 0.8s1.83 0.83 2.17 0.96c0.35 0.13 0.71 0.28 0.8 0.34 0.1 0.05 0.9 0.37 1.78 0.69 0.88 0.33 2.39 0.84 3.35 1.14s2.56 0.75 3.55 1 2.65 0.61 3.7 0.8c1.04 0.19 2.21 0.39 2.6 0.46 0.38 0.06 1.06 0.15 1.5 0.2 0.44 0.06 2.15 0.18 3.8 0.27 2.81 0.16 4.94 0.16 33.45 0 16.75-0.09 55.15-0.3 85.35-0.46 30.19-0.16 64.06-0.34 75.25-0.4 11.19-0.05 21.34-0.12 22.55-0.15 1.21-0.02 3.1-0.14 4.2-0.25s2.47-0.26 3.05-0.34c0.58-0.09 1.32-0.2 1.65-0.25s1.21-0.21 1.95-0.35 1.98-0.4 2.75-0.59 1.83-0.46 2.35-0.6 1.4-0.42 1.95-0.62c0.55-0.19 1.47-0.51 2.05-0.71 0.58-0.19 1.43-0.51 1.9-0.69 0.47-0.19 1.5-0.62 2.3-0.95 0.8-0.34 2.19-0.99 3.1-1.45s2.23-1.19 2.95-1.61c0.71-0.42 2.11-1.29 3.1-1.93s2.44-1.64 3.22-2.24c0.79-0.59 1.72-1.31 2.07-1.6 0.35-0.28 1.12-0.95 1.72-1.47s1.9-1.76 2.89-2.75c1-0.99 2.19-2.23 2.65-2.76 0.47-0.53 1.1-1.29 1.4-1.69s0.77-0.98 1.03-1.29c0.27-0.31 0.9-1.15 1.41-1.86 0.5-0.72 1.26-1.84 1.68-2.5s1.04-1.67 1.38-2.25c0.35-0.58 1.05-1.86 1.56-2.85s1.24-2.54 1.62-3.45 0.93-2.26 1.22-3 0.75-2.05 1.02-2.9 0.63-2.07 0.79-2.7 0.43-1.76 0.59-2.5c0.17-0.74 0.41-2.03 0.55-2.85 0.13-0.83 0.29-1.84 0.35-2.25s0.17-1.43 0.25-2.25c0.08-0.83 0.18-2.33 0.21-3.35 0.04-1.04 0.02-2.88-0.05-4.2-0.07-1.29-0.16-2.82-0.22-3.4-0.05-0.58-0.14-1.43-0.2-1.9s-0.22-1.55-0.35-2.4c-0.14-0.85-0.33-1.89-0.44-2.3s-0.38-1.52-0.6-2.45c-0.23-0.94-0.53-2.08-0.67-2.55s-0.68-2-1.2-3.4c-0.63-1.69-1.36-3.4-2.16-5.05-0.66-1.38-1.3-2.66-1.42-2.85s-0.39-0.64-0.6-1-0.48-0.81-0.6-1-0.55-0.87-0.95-1.5-1.11-1.69-1.58-2.35-1.26-1.72-1.76-2.35-1.13-1.42-1.41-1.75c-0.27-0.33-1.02-1.16-1.65-1.85s-1.75-1.84-2.5-2.56c-0.74-0.72-1.68-1.6-2.09-1.95s-1.04-0.89-1.4-1.19-1.5-1.18-2.53-1.95-2.65-1.9-3.6-2.51-2.36-1.46-3.13-1.89-2.01-1.09-2.75-1.46-1.87-0.91-2.5-1.19c-0.63-0.29-1.56-0.68-2.05-0.87-0.5-0.19-1.55-0.59-2.35-0.89-0.94-0.35-1.55-0.64-1.73-0.82-0.15-0.15-0.32-0.41-0.39-0.57-0.09-0.23-0.07-0.6 0.06-1.65 0.14-1.08 0.16-1.91 0.13-4.1-0.02-1.51-0.09-3.34-0.16-4.05-0.06-0.72-0.16-1.75-0.22-2.3s-0.17-1.47-0.25-2.05-0.21-1.43-0.29-1.9-0.19-1.19-0.25-1.6-0.27-1.4-0.46-2.2c-0.2-0.8-0.53-2.24-0.75-3.2s-0.59-2.34-0.84-3.05c-0.24-0.72-0.69-2.11-1.01-3.1-0.31-0.99-0.77-2.27-1.02-2.85-0.24-0.58-0.57-1.39-0.72-1.8-0.16-0.41-0.48-1.22-0.73-1.8-0.24-0.58-0.56-1.28-0.71-1.55-0.14-0.28-0.3-0.57-0.35-0.65-0.06-0.08-0.46-0.92-0.91-1.85-0.45-0.94-0.97-1.93-1.15-2.2-0.18-0.28-0.68-1.13-1.11-1.9s-0.97-1.68-1.19-2.01c-0.22-0.34-0.62-0.95-0.89-1.35-0.27-0.41-0.73-1.12-1.04-1.59-0.3-0.47-0.81-1.19-1.14-1.6-0.32-0.41-0.99-1.29-1.48-1.95-0.5-0.66-1.14-1.49-1.43-1.85s-1.08-1.31-1.76-2.1c-0.68-0.8-2.48-2.68-4-4.19-1.52-1.5-3.3-3.19-3.96-3.74-0.66-0.56-1.25-1.06-1.31-1.11-0.06-0.06-0.39-0.34-0.73-0.61-0.35-0.28-0.93-0.74-1.3-1.04-0.36-0.29-1.38-1.06-2.26-1.7-0.88-0.63-2.4-1.68-3.37-2.31-0.98-0.63-2.15-1.38-2.6-1.66-0.46-0.29-1.03-0.62-1.28-0.74s-0.52-0.28-0.6-0.35-0.51-0.32-0.95-0.55c-0.44-0.24-1.27-0.68-1.85-0.97-0.58-0.3-1.3-0.67-1.6-0.83s-1.09-0.54-1.75-0.84-1.7-0.74-2.3-0.99c-0.61-0.25-1.51-0.62-2-0.83-0.5-0.2-1.22-0.48-1.6-0.61-0.39-0.13-1.31-0.46-2.05-0.72-0.74-0.27-2-0.7-2.8-0.95s-2.22-0.66-3.15-0.91c-0.94-0.25-2.2-0.57-2.8-0.7-0.61-0.14-1.96-0.42-3-0.64-1.05-0.22-2.19-0.45-2.55-0.5-0.36-0.06-1.44-0.2-2.4-0.31-0.96-0.12-2.31-0.28-3-0.36s-2.22-0.19-3.4-0.24-3.12-0.11-4.3-0.13c-1.18-0.03-3.16-0.01-4.4 0.03z"/>
-  <path fill="#fdfdfd" d="m249.9 177.72c1.29-0.01 3.07 0.03 3.95 0.08 0.88 0.06 2.39 0.19 3.35 0.3 0.96 0.1 2.47 0.31 3.35 0.45s2.32 0.41 3.2 0.6 2.3 0.53 3.15 0.75c0.85 0.23 1.64 0.42 1.75 0.44s0.76 0.2 1.45 0.41c0.69 0.2 1.95 0.63 2.8 0.95s2.25 0.85 3.1 1.19c0.85 0.35 1.82 0.74 2.15 0.89 0.33 0.14 1.81 0.87 3.3 1.62 1.48 0.75 3.55 1.9 4.6 2.55 1.04 0.65 2.28 1.44 2.75 1.74 0.47 0.31 1.16 0.79 1.55 1.06 0.38 0.27 1.15 0.83 1.7 1.23 0.55 0.41 1.4 1.09 1.88 1.51 0.49 0.42 1.09 0.93 1.35 1.15 0.26 0.21 1.14 1.01 1.97 1.77 0.82 0.75 2.15 2.07 2.95 2.92 0.8 0.84 1.8 1.94 2.23 2.43s0.91 1.02 1.07 1.19c0.15 0.16 0.83 1.02 1.5 1.9 0.66 0.88 1.72 2.36 2.34 3.3 0.62 0.93 1.42 2.17 1.78 2.75 0.35 0.58 0.94 1.57 1.31 2.2 0.36 0.63 0.66 1.18 0.67 1.22 0 0.05 0.21 0.47 0.48 0.95 0.26 0.49 0.64 1.24 0.84 1.68s0.5 1.1 0.67 1.47c0.17 0.38 0.31 0.7 0.31 0.73s0.14 0.35 0.31 0.72c0.17 0.38 0.43 0.99 0.59 1.38 0.15 0.38 0.42 1.08 0.6 1.55s0.41 1.07 0.52 1.35c0.1 0.27 0.43 1.33 0.73 2.35s0.84 3 1.19 4.4c0.39 1.53 0.81 3.53 1.05 5 0.22 1.35 0.47 2.97 0.55 3.6s0.2 1.76 0.26 2.5c0.07 0.74 0.11 3.19 0.11 5.45-0.01 2.25-0.06 4.64-0.11 5.3-0.06 0.66-0.15 1.56-0.2 2-0.06 0.44-0.15 1.11-0.21 1.5-0.06 0.38-0.29 1.71-0.5 2.95-0.22 1.24-0.62 3.1-0.9 4.15-0.28 1.04-0.71 2.6-0.95 3.45-0.25 0.85-0.65 2.11-0.89 2.8s-0.59 1.65-0.78 2.15c-0.19 0.49-0.71 1.73-1.15 2.75s-1.03 2.32-1.3 2.9c-0.28 0.58-0.8 1.57-1.15 2.2-0.34 0.63-0.82 1.51-1.06 1.95s-0.62 1.09-0.84 1.45-0.83 1.29-1.36 2.08c-0.53 0.78-1.12 1.66-1.31 1.95s-0.71 1-1.15 1.57c-0.43 0.58-0.99 1.3-1.23 1.6-0.23 0.3-0.66 0.84-0.95 1.19-0.29 0.36-0.97 1.14-1.51 1.75-0.55 0.61-1.32 1.45-1.72 1.86-0.39 0.41-1.29 1.31-2 2s-1.78 1.68-2.38 2.2c-0.61 0.52-1.37 1.16-1.7 1.42-0.34 0.26-1.13 0.87-1.76 1.36-0.63 0.48-1.52 1.13-1.98 1.45-0.45 0.31-0.85 0.57-0.9 0.57-0.04 0-0.06-2.62-0.05-11.65l0.24-0.47c0.15-0.3 1.05-1.3 2.5-2.8 1.24-1.28 2.59-2.71 3-3.18s1.08-1.28 1.5-1.8 1.23-1.6 1.8-2.4 1.32-1.9 1.67-2.45 1-1.61 1.44-2.35 1.13-2 1.53-2.8 0.79-1.61 0.88-1.8c0.08-0.19 0.43-0.98 0.77-1.75s0.82-1.94 1.07-2.6 0.61-1.65 0.79-2.2c0.19-0.55 0.48-1.5 0.64-2.1 0.16-0.61 0.45-1.71 0.64-2.45s0.51-2.14 0.7-3.1c0.2-0.96 0.47-2.63 0.6-3.7 0.14-1.07 0.3-2.6 0.36-3.4s0.1-2.67 0.1-4.15c0-1.49-0.04-3.31-0.1-4.05s-0.2-2.09-0.31-3-0.31-2.21-0.44-2.9-0.35-1.77-0.5-2.4c-0.14-0.63-0.46-1.94-0.71-2.9-0.26-0.96-0.64-2.31-0.86-3-0.23-0.69-0.71-2.02-1.08-2.95-0.38-0.94-0.86-2.08-1.07-2.55-0.22-0.47-0.4-0.88-0.41-0.93-0.01-0.04-0.34-0.71-0.74-1.5-0.39-0.78-1.14-2.16-1.65-3.07-0.52-0.91-1.18-2.01-1.46-2.45-0.29-0.44-0.57-0.87-0.64-0.95s-0.6-0.83-1.19-1.65c-0.58-0.83-1.57-2.13-2.19-2.9-0.63-0.77-1.5-1.81-1.96-2.3-0.45-0.5-1.32-1.41-1.93-2.04-0.61-0.62-1.74-1.7-2.51-2.4s-1.76-1.56-2.2-1.92-1.18-0.94-1.65-1.29c-0.46-0.36-1.07-0.81-1.36-1-0.28-0.19-0.85-0.57-1.25-0.85-0.41-0.27-0.92-0.63-1.14-0.8-0.22-0.16-0.78-0.53-1.25-0.81s-1.44-0.82-2.15-1.21c-0.72-0.39-1.82-0.97-2.45-1.31-0.63-0.33-2.03-0.94-3.1-1.37-1.07-0.42-2.36-0.94-2.85-1.15-0.5-0.21-1.78-0.65-2.85-0.98s-3.1-0.85-4.5-1.16c-1.4-0.3-3.05-0.62-3.65-0.71-0.61-0.08-1.98-0.24-3.05-0.35s-3.12-0.25-4.55-0.31c-1.92-0.09-3.24-0.09-5.05-0.01-1.35 0.06-3.35 0.23-4.45 0.37s-2.34 0.32-2.75 0.4-1.67 0.36-2.8 0.61-2.86 0.7-3.85 1-2.36 0.77-3.05 1.04-1.52 0.59-1.85 0.7-0.96 0.37-1.4 0.56c-0.44 0.2-0.96 0.43-1.15 0.51-0.19 0.09-1 0.49-1.8 0.88-0.8 0.4-2.08 1.07-2.85 1.5s-1.64 0.93-1.93 1.11c-0.28 0.19-0.54 0.34-0.57 0.34s-0.24 0.15-0.46 0.32c-0.23 0.18-0.63 0.46-0.9 0.63-0.26 0.16-0.81 0.52-1.21 0.8-0.4 0.27-1.2 0.86-1.78 1.29-0.58 0.44-1.3 1-1.6 1.25-0.3 0.24-0.91 0.75-1.35 1.12s-1.32 1.16-1.95 1.76-1.65 1.6-2.26 2.23-1.63 1.76-2.25 2.51c-0.63 0.75-1.28 1.54-1.45 1.75-0.17 0.22-0.66 0.88-1.1 1.49-0.44 0.6-1.09 1.53-1.44 2.05-0.34 0.52-0.77 1.17-0.95 1.45-0.18 0.27-0.48 0.77-0.68 1.1-0.19 0.33-0.54 0.91-0.77 1.3-0.23 0.38-0.88 1.64-1.45 2.8-0.56 1.15-1.14 2.35-1.28 2.65s-0.52 1.22-0.85 2.05c-0.33 0.82-0.74 1.93-0.92 2.45-0.17 0.52-0.61 1.96-0.96 3.2-0.36 1.24-0.81 2.99-1 3.9s-0.48 2.46-0.64 3.45-0.36 2.56-0.46 3.5c-0.15 1.32-0.19 2.53-0.19 5.45 0 2.33 0.05 4.24 0.13 5.05 0.07 0.71 0.24 2.06 0.37 3 0.14 0.93 0.4 2.49 0.6 3.45 0.19 0.96 0.55 2.49 0.8 3.4s0.69 2.37 0.97 3.25 0.65 1.98 0.83 2.45 0.49 1.2 0.69 1.62c0.2 0.43 0.36 0.8 0.36 0.83s0.32 0.76 0.71 1.62c0.39 0.87 0.93 2.01 1.21 2.53s0.73 1.33 1.01 1.8 0.77 1.3 1.1 1.85 0.96 1.54 1.4 2.2 1.26 1.81 1.81 2.55 1.12 1.47 1.26 1.61c0.14 0.15 0.45 0.51 0.7 0.8s0.88 1 1.41 1.58 1.34 1.44 1.79 1.91c0.46 0.47 1.29 1.27 1.84 1.78 0.56 0.51 1.1 1.08 1.2 1.25 0.19 0.31 0.19 0.38 0.05 2.52-0.08 1.29-0.14 3.77-0.14 9.84l-0.3-0.23c-0.17-0.13-0.62-0.45-1-0.73-0.39-0.27-1.02-0.74-1.41-1.04-0.38-0.3-1.06-0.83-1.5-1.19s-1.09-0.89-1.45-1.19c-0.35-0.29-1.35-1.19-2.22-2-0.87-0.8-2.16-2.07-2.86-2.81-0.69-0.74-1.69-1.84-2.21-2.44s-1.19-1.39-1.48-1.75-1.04-1.34-1.66-2.16c-0.62-0.83-1.51-2.05-1.97-2.73s-1.1-1.62-1.41-2.1c-0.32-0.48-0.64-1.01-0.71-1.17-0.08-0.17-0.36-0.68-0.64-1.15s-0.93-1.66-1.45-2.65-1.11-2.21-1.32-2.7c-0.21-0.5-0.58-1.35-0.82-1.9s-0.65-1.54-0.92-2.2c-0.28-0.66-0.61-1.56-0.75-2s-0.45-1.45-0.71-2.25c-0.25-0.8-0.48-1.59-0.52-1.75-0.04-0.17-0.27-1.04-0.51-1.95s-0.63-2.73-0.88-4.05c-0.24-1.32-0.51-2.87-0.59-3.45-0.09-0.58-0.18-1.46-0.2-1.95-0.03-0.5-0.11-1.6-0.17-2.45-0.08-0.87-0.13-3.17-0.13-5.25 0-2.04 0.05-4.44 0.12-5.35s0.15-2.08 0.17-2.6c0.03-0.52 0.1-1.22 0.16-1.55s0.3-1.61 0.54-2.85 0.57-2.77 0.73-3.4 0.49-1.83 0.72-2.65c0.23-0.83 0.52-1.82 0.65-2.2 0.13-0.39 0.33-1.04 0.45-1.45s0.47-1.38 0.76-2.15c0.3-0.77 0.65-1.65 0.79-1.95 0.13-0.3 0.51-1.18 0.85-1.95s0.9-1.99 1.25-2.7c0.36-0.72 0.95-1.82 1.31-2.45 0.37-0.63 0.79-1.38 0.94-1.65 0.15-0.28 0.55-0.95 0.9-1.5s0.91-1.41 1.25-1.9c0.34-0.5 0.9-1.31 1.25-1.8 0.34-0.5 0.79-1.1 0.98-1.35 0.2-0.25 0.4-0.46 0.44-0.48 0.04-0.01 0.08-0.09 0.08-0.17s0.03-0.15 0.07-0.15c0.05 0 0.28-0.26 0.53-0.57s0.85-1.04 1.33-1.62c0.49-0.58 1.48-1.71 2.2-2.5 0.73-0.8 2.04-2.12 2.92-2.94 0.88-0.83 2.03-1.87 2.55-2.32 0.52-0.44 1.42-1.19 2-1.65s1.06-0.88 1.07-0.92c0.02-0.05 0.1-0.08 0.18-0.08s0.15-0.03 0.15-0.08c0-0.04 0.52-0.46 1.17-0.93s1.47-1.05 1.83-1.29c0.36-0.23 1.17-0.75 1.8-1.15s1.66-1.03 2.27-1.39c0.62-0.36 1.17-0.66 1.23-0.66 0.05 0 0.11-0.04 0.12-0.09 0.02-0.05 1.18-0.66 2.58-1.35 1.4-0.7 2.75-1.34 3-1.43s0.47-0.21 0.5-0.25c0.03-0.05 0.12-0.1 0.2-0.12s0.28-0.08 0.45-0.15c0.16-0.07 1.22-0.48 2.35-0.91s2.68-0.98 3.45-1.23 1.74-0.52 2.15-0.62 0.97-0.24 1.25-0.32c0.27-0.07 1.26-0.31 2.2-0.53 0.93-0.21 2.35-0.5 3.15-0.64s2.51-0.39 3.8-0.55c1.29-0.17 3-0.35 3.8-0.41 0.8-0.05 1.63-0.12 1.85-0.13 0.22-0.02 1.46-0.04 2.75-0.05zm0 26c0.8-0.01 2.08 0.03 2.85 0.08 0.77 0.06 2.19 0.22 3.15 0.35 1.17 0.16 2.53 0.43 4.1 0.84 1.29 0.33 3.07 0.84 3.95 1.15 0.88 0.3 2.3 0.86 3.15 1.24s1.98 0.91 2.5 1.17 1.26 0.66 1.65 0.88c0.38 0.22 1.42 0.88 2.3 1.46s2.16 1.51 2.84 2.06 1.38 1.11 1.56 1.25c0.17 0.14 0.78 0.68 1.34 1.2 0.57 0.52 1.56 1.53 2.21 2.25 0.65 0.71 1.36 1.52 1.59 1.8 0.23 0.27 0.81 1.02 1.29 1.66s1.11 1.52 1.41 1.95c0.3 0.44 0.83 1.25 1.18 1.81 0.34 0.57 1.07 1.92 1.62 3 0.54 1.09 1.24 2.6 1.55 3.35 0.31 0.76 0.65 1.71 0.75 2.1 0.11 0.4 0.35 1.22 0.54 1.83 0.19 0.6 0.42 1.44 0.51 1.85s0.25 1.15 0.35 1.65c0.11 0.49 0.31 1.64 0.45 2.55 0.13 0.91 0.3 2.3 0.37 3.1 0.07 0.9 0.1 2.27 0.06 3.6-0.03 1.32-0.14 2.75-0.27 3.7-0.11 0.85-0.35 2.22-0.51 3.05-0.17 0.82-0.51 2.24-0.76 3.15s-0.6 2.1-0.78 2.65-0.54 1.52-0.8 2.15-0.97 2.16-1.59 3.4c-0.77 1.54-1.5 2.82-2.31 4.05-0.65 0.99-1.51 2.23-1.92 2.75-0.4 0.52-0.83 1.07-1.18 1.49l-0.85-0.82c-0.47-0.45-1.57-1.41-2.45-2.15s-1.67-1.38-1.75-1.42c-0.13-0.07-0.09-0.16 0.18-0.52 0.18-0.24 0.6-0.84 0.92-1.33 0.33-0.5 0.67-1.01 0.77-1.15s0.47-0.72 0.82-1.3 0.99-1.7 1.42-2.5 0.79-1.51 0.79-1.58c0-0.06 0.17-0.49 0.39-0.95 0.21-0.45 0.46-1 0.55-1.22 0.1-0.22 0.41-1.12 0.71-2 0.29-0.88 0.67-2.29 0.84-3.15 0.17-0.85 0.4-2.38 0.52-3.4 0.14-1.3 0.2-2.5 0.21-4.05 0-1.21-0.05-2.74-0.12-3.4s-0.13-1.27-0.15-1.35-0.06-0.38-0.1-0.65c-0.03-0.28-0.13-0.86-0.22-1.3-0.08-0.44-0.26-1.25-0.4-1.8-0.13-0.55-0.47-1.68-0.75-2.5-0.28-0.83-0.75-2.09-1.04-2.8-0.3-0.72-0.78-1.77-1.06-2.35-0.29-0.57-0.94-1.7-1.44-2.5s-1.12-1.77-1.38-2.15c-0.27-0.39-0.65-0.9-0.85-1.14-0.2-0.25-0.43-0.54-0.51-0.66s-0.44-0.56-0.8-0.96c-0.36-0.41-1.1-1.19-1.65-1.74s-1.48-1.41-2.06-1.9c-0.59-0.5-1.33-1.1-1.65-1.35-0.33-0.25-1.11-0.8-1.74-1.21-0.63-0.42-1.42-0.93-1.75-1.15-0.33-0.21-0.69-0.44-0.8-0.5s-0.76-0.4-1.45-0.76-1.57-0.78-1.95-0.93c-0.39-0.15-0.97-0.38-1.3-0.51-0.33-0.12-1.03-0.36-1.55-0.53-0.52-0.16-1.4-0.43-1.95-0.6s-1.56-0.42-2.25-0.55c-0.69-0.14-2.13-0.34-3.2-0.46-1.7-0.19-2.32-0.21-4.8-0.17-2.12 0.03-3.24 0.1-4.35 0.25-0.83 0.12-1.97 0.3-2.55 0.42-0.58 0.11-1.46 0.34-1.95 0.5-0.5 0.16-1.31 0.41-1.8 0.55-0.5 0.15-1.15 0.38-1.45 0.52s-1.05 0.45-1.65 0.7c-0.61 0.24-1.15 0.48-1.2 0.53-0.06 0.05-0.6 0.35-1.2 0.68-0.61 0.32-1.44 0.78-1.85 1.02s-1.18 0.72-1.7 1.08c-0.52 0.35-1.09 0.75-1.25 0.88-0.17 0.13-0.84 0.69-1.5 1.23s-1.69 1.47-2.29 2.07-1.5 1.56-2 2.14-1.06 1.26-1.24 1.5c-0.18 0.25-0.54 0.74-0.8 1.1-0.27 0.36-0.83 1.2-1.25 1.87-0.42 0.68-0.77 1.25-0.77 1.28s-0.15 0.29-0.33 0.57c-0.18 0.29-0.48 0.87-0.67 1.28-0.18 0.41-0.51 1.13-0.72 1.6-0.22 0.47-0.46 1.03-0.53 1.25s-0.34 0.98-0.6 1.7c-0.26 0.71-0.64 2.02-0.85 2.9s-0.46 2.09-0.54 2.7c-0.09 0.6-0.21 1.8-0.27 2.65-0.07 0.85-0.12 2.49-0.12 3.65 0 1.15 0.06 2.71 0.12 3.45 0.07 0.74 0.21 1.8 0.32 2.35s0.34 1.54 0.5 2.2c0.17 0.66 0.43 1.56 0.59 2s0.44 1.2 0.63 1.7c0.19 0.49 0.66 1.59 1.06 2.42 0.39 0.84 0.71 1.55 0.71 1.58s0.28 0.56 0.63 1.17c0.35 0.62 1.09 1.83 1.64 2.68 0.56 0.85 1.19 1.77 1.4 2.04s0.42 0.55 0.48 0.63c0.07 0.1 0.05 0.17-0.1 0.26-0.11 0.06-0.31 0.22-0.45 0.35-0.14 0.14-0.45 0.41-0.7 0.6-0.25 0.2-0.86 0.72-1.35 1.16-0.5 0.44-1.26 1.15-2.5 2.37l-0.92-1.23c-0.51-0.68-1.36-1.91-1.89-2.73-0.53-0.83-1.11-1.75-1.29-2.05s-0.73-1.34-1.22-2.3-1.11-2.25-1.37-2.85c-0.27-0.61-0.66-1.62-0.88-2.25-0.21-0.63-0.61-1.94-0.89-2.9-0.27-0.96-0.63-2.4-0.79-3.2s-0.33-1.79-0.39-2.2-0.16-1.38-0.23-2.15-0.13-2.66-0.13-4.2c0-1.68 0.05-3.22 0.13-3.85 0.07-0.58 0.22-1.61 0.33-2.3s0.38-1.99 0.6-2.9 0.63-2.35 0.9-3.2c0.28-0.85 0.59-1.8 0.7-2.1 0.1-0.3 0.34-0.93 0.54-1.4s0.75-1.64 1.23-2.6c0.47-0.96 1.06-2.11 1.31-2.55s0.82-1.34 1.27-2c0.44-0.66 1.1-1.62 1.45-2.14s0.98-1.33 1.39-1.8 0.91-1.06 1.1-1.31 0.72-0.85 1.19-1.34c0.47-0.48 1.17-1.19 1.56-1.56 0.38-0.37 1.02-0.94 1.42-1.26 0.39-0.33 1-0.82 1.35-1.1 0.34-0.28 1.03-0.78 1.53-1.11 0.49-0.33 1.37-0.92 1.95-1.29 0.58-0.38 1.3-0.83 1.6-0.98 0.3-0.16 0.66-0.37 0.8-0.46s0.79-0.42 1.45-0.72c0.66-0.31 1.76-0.81 2.45-1.11 0.69-0.31 1.83-0.77 2.55-1.02 0.71-0.25 2.06-0.66 3-0.9 0.93-0.23 2.19-0.55 2.8-0.69 0.6-0.14 1.71-0.35 2.45-0.45 0.74-0.11 1.91-0.25 2.6-0.31 0.69-0.05 1.43-0.12 1.65-0.14 0.22-0.01 1.05-0.03 1.85-0.04zm0.65 23.43c1.11 0.02 2.13 0.11 2.92 0.24 0.83 0.14 1.74 0.39 2.8 0.77 0.87 0.31 1.74 0.64 1.93 0.73 0.19 0.1 0.78 0.41 1.3 0.7 0.52 0.28 1.31 0.77 1.76 1.09 0.44 0.31 1.23 0.93 1.74 1.37 0.52 0.44 1.23 1.14 1.6 1.55 0.36 0.41 0.9 1.09 1.21 1.5 0.3 0.41 0.79 1.14 1.07 1.62 0.29 0.49 0.52 0.92 0.52 0.98 0 0.05 0.03 0.11 0.08 0.12 0.04 0.02 0.24 0.39 0.44 0.83s0.52 1.25 0.71 1.8 0.44 1.4 0.55 1.9c0.12 0.49 0.28 1.37 0.37 1.95 0.08 0.58 0.15 1.72 0.15 2.55 0 0.82-0.05 1.88-0.11 2.35-0.05 0.47-0.19 1.3-0.31 1.85-0.11 0.55-0.36 1.47-0.54 2.05-0.19 0.58-0.72 1.81-1.18 2.75-0.54 1.08-1.13 2.1-1.64 2.8-0.43 0.6-1.21 1.53-1.73 2.05s-1.37 1.28-1.89 1.69c-0.52 0.4-1.33 0.96-1.8 1.23-0.47 0.28-1.32 0.74-1.9 1.03s-1.52 0.69-2.1 0.89-1.41 0.46-1.85 0.57-0.98 0.23-1.2 0.25c-0.22 0.03-0.74 0.08-1.15 0.12s-1.49 0.07-2.4 0.07-2.04-0.03-2.53-0.08c-0.48-0.04-1.29-0.16-1.8-0.27-0.5-0.11-1.19-0.29-1.52-0.39-0.33-0.11-0.8-0.27-1.05-0.36-0.25-0.08-1.08-0.47-1.85-0.84-0.77-0.38-1.76-0.93-2.2-1.22-0.44-0.28-1.12-0.77-1.5-1.08-0.39-0.31-1.11-0.97-1.6-1.46-0.5-0.5-1.2-1.29-1.56-1.75-0.37-0.47-0.95-1.32-1.3-1.9-0.34-0.58-0.8-1.43-1.01-1.9-0.22-0.47-0.48-1.03-0.58-1.25s-0.3-0.76-0.43-1.2c-0.14-0.44-0.35-1.27-0.46-1.85-0.12-0.58-0.26-1.59-0.31-2.25s-0.1-1.76-0.1-2.45c0-0.77 0.07-1.71 0.19-2.45 0.11-0.66 0.36-1.76 0.56-2.45s0.62-1.79 0.94-2.45c0.31-0.66 0.86-1.67 1.21-2.25 0.36-0.58 0.92-1.41 1.26-1.85s0.99-1.18 1.45-1.65 1.13-1.1 1.49-1.41 1.03-0.83 1.5-1.16 1.19-0.78 1.6-0.98c0.41-0.21 0.93-0.5 1.15-0.63 0.22-0.14 1.01-0.47 1.75-0.74s1.71-0.58 2.15-0.68 1.23-0.24 1.75-0.29c0.52-0.06 1.13-0.13 1.35-0.15s1.16-0.03 2.1-0.01zm2.05 49.63c7.29 0.01 12.44 0.07 13.05 0.13 0.55 0.06 1.43 0.21 1.95 0.34s1.24 0.36 1.6 0.5 0.94 0.42 1.3 0.61c0.36 0.2 1.01 0.65 1.45 0.99 0.44 0.35 1.21 1.05 1.71 1.57 0.51 0.51 1.18 1.27 1.49 1.68s0.8 1.13 1.07 1.6c0.28 0.47 0.62 1.07 0.76 1.35 0.14 0.27 0.45 0.97 0.69 1.55s0.59 1.61 0.78 2.3 0.45 1.79 0.59 2.45c0.13 0.66 0.27 1.56 0.31 2 0.03 0.44 0.1 1.29 0.15 1.9 0.06 0.6 0.1 1.8 0.1 2.65s-0.05 2.07-0.1 2.7c-0.06 0.63-0.13 1.58-0.16 2.1s-0.21 1.76-0.41 2.75c-0.19 0.99-0.5 2.34-0.69 3s-0.49 1.63-0.66 2.15-0.53 1.56-0.8 2.3-0.69 1.84-0.94 2.45c-0.24 0.6-0.84 1.84-1.32 2.75-0.49 0.91-1.01 1.87-1.16 2.15-0.15 0.27-0.44 0.77-0.64 1.1s-0.61 0.96-0.91 1.4c-0.31 0.44-0.84 1.18-1.2 1.65-0.35 0.47-0.85 1.1-1.1 1.4s-0.8 0.9-1.21 1.34c-0.41 0.45-1.29 1.31-1.95 1.92-0.66 0.62-1.54 1.38-1.95 1.7s-1.2 0.87-1.75 1.22c-0.55 0.36-1.59 0.93-2.3 1.28-0.72 0.34-1.98 0.86-2.8 1.15-0.87 0.3-2.07 0.63-2.85 0.77-1.28 0.25-1.53 0.26-4.85 0.26-3.27 0.01-3.58-0.01-4.75-0.23-0.69-0.13-1.75-0.4-2.35-0.61-0.61-0.2-1.51-0.54-2-0.75-0.5-0.2-1.31-0.58-1.8-0.84-0.5-0.27-1.22-0.68-1.6-0.94-0.39-0.25-1.1-0.74-1.59-1.09s-1.13-0.83-1.41-1.08-0.67-0.59-0.86-0.76c-0.19-0.16-0.41-0.39-0.5-0.5-0.09-0.1-0.36-0.38-0.6-0.6-0.24-0.23-0.54-0.53-0.67-0.68-0.12-0.14-0.28-0.29-0.35-0.34-0.07-0.04-0.35-0.34-0.63-0.67s-0.91-1.14-1.4-1.8c-0.5-0.66-1.08-1.47-1.3-1.8-0.23-0.33-0.68-1.05-1.01-1.6s-0.87-1.47-1.2-2.05-0.81-1.47-1.07-1.98c-0.25-0.5-0.52-1.09-0.6-1.3-0.07-0.2-0.41-1.07-0.76-1.92-0.34-0.85-0.84-2.2-1.1-3s-0.66-2.17-0.88-3.05-0.42-1.85-0.45-2.15-0.15-1.14-0.26-1.85c-0.11-0.72-0.25-1.98-0.32-2.8-0.07-0.97-0.1-2.43-0.06-4.1 0.03-1.44 0.13-3.07 0.21-3.65s0.24-1.64 0.35-2.35c0.11-0.72 0.34-1.75 0.51-2.3 0.18-0.55 0.43-1.27 0.57-1.6s0.41-0.96 0.6-1.4c0.2-0.44 0.63-1.27 0.96-1.85s0.76-1.25 0.96-1.5 0.39-0.46 0.43-0.48c0.04-0.01 0.08-0.07 0.08-0.12 0-0.06 0.42-0.53 0.92-1.06 0.51-0.53 1.31-1.27 1.78-1.65 0.47-0.37 1.28-0.91 1.8-1.18s1.42-0.66 2-0.85 1.43-0.4 1.9-0.46 2.27-0.15 4-0.19c1.73-0.03 8.57-0.05 15.2-0.03z" fill-rule="evenodd"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podfriend.svg b/app/Views/_assets/images/platforms/podcasting/podfriend.svg
deleted file mode 100644
index 5d393afe0f..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podfriend.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#00a4ff"/>
- <g transform="matrix(.72999 0 0 .72999 304.76 303.22)">
-  <path fill="#ff00b7" d="m-322.55-166.48h221.1s-11.256 73.535-110.59 73.535c-99.331 0-110.52-73.535-110.52-73.535z"/>
-  <path d="m-277.13-107.51c-22.588-10.667-39.639-32.37-44.651-56.836q25.424-1.3916 50.895-1.8896c11.941-0.23145 26.604-2.6191 38.268-0.0439-12.012 6.1934-22.772 10.778-31.348 22.011a64.523 64.523 0 0 0-9.5566 17.646c-0.74121 2.0508-5.6748 18.138-3.6064 19.113z"/>
-  <path d="m-214.43-124.95c-0.29297 2.2002-0.24024 4.9805 1.7578 5.9766 1.4824 0.75 3.3662 0 4.4443-1.2744 1.0781-1.2744 1.5469-2.9297 2.0361-4.5146 5.1387-16.951 15.431-30.158 28.271-41.938-7.5674 0.74121-17.15-0.52149-22.626 5.7686-8.1182 9.3106-12.237 24.023-13.884 35.982z"/>
-  <path fill="#fff" d="m-286.12-133.07c6.6826 0 12.847-17.487 14.965-30.747h-27.425c1.1162 13.151 5.9502 30.747 12.46 30.747z"/>
-  <path fill="#fff" d="m-137.88-133.07c6.5332 0 11.358-17.596 12.463-30.747h-27.434c2.127 13.26 8.2998 30.747 14.971 30.747z"/>
-  <path d="m-212.04-87.893c-53.282 0-81.832-20.982-96.404-38.596-15.926-19.242-18.987-38.423-19.116-39.223l-0.87891-5.8213h232.88l-0.87891 5.8242c-0.12598 0.8086-3.2227 19.989-19.151 39.226-14.599 17.607-43.175 38.59-96.451 38.59zm-104.12-73.535c4.9453 16.781 25.743 63.404 104.12 63.404 77.531 0 98.941-46.723 104.11-63.404z"/>
-  <circle fill="#00a397" cx="-212" cy="-244.74" r="53.013"/>
-  <circle cx="-212" cy="-244.74" r="27.305"/>
-  <circle fill="#fff" cx="-189" cy="-259.72" r="15.185"/>
-  <path fill="#fff" d="m-212.71-326.84c90.34 0 96.202 86.845 96.202 86.845s6.3926 47.417-26.106 47.417h-74.722"/>
-  <path fill="#fff" d="m-211.29-326.84c-90.34 0-96.202 86.845-96.202 86.845s-6.3926 47.417 26.106 47.417h74.725"/>
-  <circle fill="#00a397" cx="-212" cy="-244.74" r="53.013"/>
-  <circle cx="-212" cy="-244.74" r="27.305"/>
-  <circle fill="#fff" cx="-189" cy="-259.72" r="15.185"/>
-  <path d="m-111.48-240.54c-0.41895-4.793-9.3193-90.439-99.806-91.342v-0.0205h-0.71484-0.71484v0.0205c-90.478 0.90234-99.384 86.54-99.806 91.339-0.29297 2.3877-3.3809 29.106 9.375 43.696 5.4082 6.1875 12.732 9.3252 21.765 9.3252h138.76c9.0322 0 16.354-3.1377 21.765-9.3252 12.756-14.59 9.6797-41.306 9.375-43.693zm-16.992 37.031c-3.4541 3.9492-8.0801 5.8594-14.147 5.8594h-138.76c-6.0586 0-10.682-1.9131-14.133-5.8594-10.058-11.479-6.9902-35.59-6.958-35.827l0.0322-0.33106c0.23437-3.3428 6.7031-81.671 90.439-82.119 83.736 0.44824 90.202 78.776 90.439 82.113l0.0322 0.33692c0.90527 6.7295 1.4238 26.256-6.9434 35.836z"/>
- </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podinstall.svg b/app/Views/_assets/images/platforms/podcasting/podinstall.svg
deleted file mode 100644
index fb6f386875..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podinstall.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#1c185b"/>
- <path d="m89.047 222.88-12.09-12.122v-145.76h38.496c21.876 0 40.89 0.45403 44.041 1.0516 12.35 2.3421 17.534 5.9045 37.172 25.542 20.305 20.305 23.32 24.884 25.741 39.088 4.3347 25.437-13.949 51.09-39.775 55.808-3.3624 0.61415-11.592 1.1167-18.288 1.1167h-12.174v47.394h-51.032zm46.637-1.7876-9.7472-9.7881h-21.162v19.576h40.656zm-35.03-1.0303v-8.7573h-17.984l8.7117 8.7573c4.7917 4.8166 8.8384 8.7573 8.9922 8.7573 0.15377 0 0.28032-3.9409 0.28032-8.7573zm47.394-24.212v-31.939h-19.576v44.78l9.51 9.5494c5.2304 5.2523 9.6351 9.5494 9.7881 9.5494 0.15286 0 0.27793-14.373 0.27793-31.939zm-47.394-46.642v-57.975l-19.575-19.494v135.44h19.575zm23.697 0.79305v-57.182h-19.576v114.36h19.576zm65.939 30.608c11.361-4.5296 21.383-14.54 26.002-25.971 1.8769-4.6453 2.2934-7.7093 2.3108-17 0.0201-10.675-0.17353-11.745-3.3326-18.415-2.3347-4.9298-5.415-9.1027-10.137-13.732-3.7304-3.6577-6.9882-6.4448-7.2394-6.1936-0.25125 0.25125 0.0894 3.7648 0.75719 7.8076 3.0251 18.318-5.9376 38.414-21.621 48.478-5.1536 3.3071-14.15 6.64-20.997 7.779l-3.8636 0.64265v19.664l16.227-0.39957c13.681-0.33686 17.117-0.75412 21.894-2.659zm-42.243-54.304v-33.485h-19.576v66.97h19.576zm18.659 30.441c11.115-4.1886 21.419-14.499 25.788-25.804 3.0932-8.0031 3.6953-20 1.4245-28.389l-1.7941-6.628-5.2259-1.552c-3.5923-1.0668-9.8376-1.5519-19.978-1.5519h-14.752v67.25l4.4922-0.61573c2.4707-0.33865 6.9912-1.5574 10.045-2.7085zm19.458-70.113c-4.6159-5.828-10.991-10.805-18.098-14.13-5.6804-2.6572-7.1962-2.8816-21.564-3.1922l-15.455-0.33408 19.535 19.722 14.445 0.1219c7.9444 0.0671 15.836 0.47583 17.536 0.90842 6.7179 1.7094 7.1284 1.3564 3.6016-3.0965zm-61.814-7.7217v-9.7881h-40.656l19.494 19.576h21.162zm20.606 9.5061c0-0.15496-3.7091-3.9691-8.2427-8.476l-8.2427-8.194v16.951h8.2427c4.5334 0 8.2427-0.12679 8.2427-0.28174z" fill="#fff" stroke-width="1.3333"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podlink.svg b/app/Views/_assets/images/platforms/podcasting/podlink.svg
deleted file mode 100644
index cb779322c6..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podlink.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg"><rect width="300" height="300" rx="67" fill="#db73f5"/><path d="m82.825 212.98 59.131-117.38c4.1141-7.1264 14.395-7.1264 18.51 0l61.264 102.9c4.1141 7.1264-1.0266 16.028-9.2548 16.028l-118.92 18.169c-1.9897 0-3.6068-1.6131-3.6068-3.6068s1.6131-3.6068 3.6068-3.6068l118.52-18.153c2.4613 0 4.0071-2.6635 2.7824-4.7998l-60.693-102.77c-1.2287-2.1443-4.3202-2.1522-5.5568-.01189l-59.088 117.1a3.8664 3.8664 0 01-5.2279 1.4427c-1.8906-1.0503-2.5525-3.4443-1.4705-5.3151z" fill="#fff" stroke="#000" stroke-linecap="round" stroke-miterlimit="10" stroke-width="4.5953"/><path d="m151.66 98.17v-30.872m-80.538 74.419 22.326 14.122m-2.2037-25.739 10.602 17.749m-32.485 17.031 20.475 2.822" fill="#fff" stroke="#000" stroke-linecap="round" stroke-miterlimit="10" stroke-width="4.5953"/><path d="m229.36 116.33-91.085 75.695a3.5977 3.5977 0 01-5.0693-.4677 3.5977 3.5977 0 01.46769-5.0693l91.089-75.695a3.5977 3.5977 0 015.0693.4677c1.2683 1.5299 1.0582 3.801-.47166 5.0693z" fill="#fff" stroke="#000" stroke-linecap="round" stroke-miterlimit="10" stroke-width="4.5953"/></svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podtail.svg b/app/Views/_assets/images/platforms/podcasting/podtail.svg
deleted file mode 100644
index acbeb47fc9..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podtail.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 300">
-  <defs>
-    <linearGradient id="linear-gradient" x1="98.65" y1="77.34" x2="182.61" y2="222.76" gradientUnits="userSpaceOnUse">
-      <stop offset="0" stop-color="#fbdb67"/>
-      <stop offset="0.5" stop-color="#906a01"/>
-      <stop offset="1" stop-color="#ab8009"/>
-    </linearGradient>
-  </defs>
-  <g id="podtail">
-    <rect y="0.14" width="300" height="300" rx="67"/>
-    <path d="M150.08,235.14c-1.27-.24-2.55-.45-3.82-.72-8.82-1.82-14.78-6.95-17.8-15.46-1.86-5.25-2.27-10.71-2.36-16.22,0-2.47-.17-2.6-2.63-2.61-3.6,0-7.2,0-10.8,0-2.75,0-4.33-1.68-4.32-4.46s1.61-4.43,4.36-4.45c3.72,0,7.43-.06,11.15,0,1.61,0,2.21-.59,2.18-2.19-.08-3.37-.06-6.73,0-10.09,0-1.41-.58-2-1.93-2.18-15.44-2.55-25-13.85-25-29.49,0-4.53.42-4.1-4.06-4.12-.83,0-1.66,0-2.48,0a5,5,0,0,1-4.37-4.59,4.86,4.86,0,0,1,4.38-4.37c1.3-.1,2.6-.05,3.9-.06,2.53,0,2.62-.08,2.62-2.56q0-18.59,0-37.17c0-14.65,9.25-26,23.65-28.93a8.16,8.16,0,0,0,.84-.26h15.23c5.11,1.19,9.93,3,14,6.5,6.36,5.49,10.11,12.38,10.17,20.81.13,19.18.16,38.37-.1,57.55-.19,13.39-11.09,25-24.42,26.72-3.48.45-3.45,0-3.44,4,0,2.84,0,5.67,0,8.5,0,1.43.58,2,2,2,4.13,0,8.27,0,12.4,0,2.81,0,4.32,1.58,4.34,4.41s-1.51,4.51-4.41,4.52c-4.08,0-8.15,0-12.22,0-1.62,0-2.19.61-2.17,2.2.07,4.56.32,9.08,1.83,13.44a14.53,14.53,0,0,0,12,10.22c8.27,1.47,15.17-.78,20-7.75,3-4.29,5.43-9,8.17-13.45,2.18-3.57,4.13-7.34,6.72-10.58a18.15,18.15,0,0,1,24.66-3.29,12.06,12.06,0,0,1,2.79,2.91,3.66,3.66,0,0,1-.49,5,4.28,4.28,0,0,1-5,.87,8.34,8.34,0,0,1-1.46-1c-4.8-3.75-10.54-3.2-14.16,1.67-2.06,2.78-3.64,5.92-5.47,8.88-3.25,5.25-6.24,10.71-9.88,15.69a24.61,24.61,0,0,1-16.57,10,6.27,6.27,0,0,0-.84.26ZM131,134.07v.06h20.36c2.48,0,2.58-.12,2.6-2.61,0-.3,0-.59,0-.89,0-3.18,0-3.18-3.27-3.18-3.72,0-7.44.07-11.16,0a4.43,4.43,0,0,1-4.45-4.38,4.52,4.52,0,0,1,4.19-4.65,18.77,18.77,0,0,1,2.12-.07c3.49,0,7,0,10.45,0,2,0,2-.23,2.11-2.93,0-1.56-.37-2.25-2.08-2.2q-5.92.13-11.86,0c-3-.06-5-2-4.94-4.63s2-4.46,5.09-4.48c3.77,0,7.55,0,11.33,0,2.34,0,2.42-.1,2.42-2.57s-.07-2.64-2.35-2.65c-4.31,0-8.62,0-12.93,0a4.54,4.54,0,0,1-.48-9,14.59,14.59,0,0,1,2.29-.13c3.66,0,7.32,0,11,0,1.93,0,2.13-.25,1.49-2.06-2.58-7.31-7.67-11.87-15.32-13.07a53.3,53.3,0,0,0-10.94-.3,19.24,19.24,0,0,0-17.4,13.18c-.62,1.91-.44,2.2,1.53,2.22,3.72,0,7.44,0,11.16.07,3,.08,5,2,4.89,4.71s-2.1,4.44-5.12,4.47c-3.6,0-7.2,0-10.8,0-2.53,0-2.63.11-2.64,2.55s.1,2.62,2.56,2.63h12a4.57,4.57,0,0,1,4.36,2.5c1.59,3-.51,6.46-4.15,6.61-4.19.17-8.38.06-12.57.1-2.06,0-2.26.3-2.25,2.63,0,2.16.21,2.39,2.28,2.41,3.89,0,7.79,0,11.68,0,3.34,0,5.47,1.79,5.53,4.48s-2.12,4.66-5.48,4.69-6.62,0-9.92,0c-4.29,0-4.12-.53-4.11,4.12,0,2.31.16,2.46,2.58,2.46Q120.9,134.09,131,134.07Zm.15,9v.06c-6.9,0-13.81,0-20.71,0-1.57,0-2.32.49-2.24,2.13.08,1.47,0,3,.06,4.43a19.21,19.21,0,0,0,18.61,18.27c2.71.08,5.43.11,8.14,0,7.7-.31,13.29-4,16.9-10.76,2-3.67,2.19-7.66,2.07-11.71-.06-2.24-.18-2.4-2.46-2.4Z" fill="url(#linear-gradient)"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/podverse.svg b/app/Views/_assets/images/platforms/podcasting/podverse.svg
deleted file mode 100644
index 1cb12e6a6d..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/podverse.svg
+++ /dev/null
@@ -1,4 +0,0 @@
-<svg version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
- <rect width="300" height="300" rx="67" fill="#0d7ab3"/>
- <path d="m108.51 232.73c-8.2227-2.8269-17.674-12.373-20.933-21.144-1.4665-3.9465-4.7117-10.21-7.2115-13.92-15.531-23.047-19.28-51.198-10.163-76.316 12.336-33.985 44.034-56.346 79.872-56.346 68.149 0 108 75.842 69.71 132.66-2.4999 3.7094-5.7451 9.973-7.2115 13.92-3.3562 9.032-12.39 17.953-21.395 21.127-3.8172 1.346-7.2108 2.1768-7.5413 1.8463-1.069-1.0689 17.424-64.017 18.807-64.017 0.73594 0 2.9804 1.7721 4.9877 3.9381 2.0073 2.166 4.003 3.9381 4.4348 3.9381s2.0278-3.9506 3.5465-8.7789c2.0748-6.5964 2.6018-12.426 2.1197-23.448-0.57133-13.063-1.2825-15.965-6.4982-26.518-25.161-50.91-96.762-50.91-121.92 0-5.2156 10.553-5.9268 13.456-6.4982 26.518-0.48205 11.022 0.04497 16.851 2.1197 23.448 1.5187 4.8284 3.1146 8.7789 3.5464 8.7789s2.4275-1.7721 4.4348-3.9381c2.0073-2.166 4.2812-3.9381 5.053-3.9381 0.77188 0 3.994 9.3922 7.1604 20.871 3.1664 11.48 7.1234 25.647 8.7936 31.484 1.6701 5.8367 2.5558 10.91 1.9681 11.273-0.58766 0.36319-3.8201-0.28564-7.1833-1.4418zm11.966-2.5793c-0.80948-2.894-5.2598-18.597-9.8898-34.897-7.1225-25.074-8.0649-29.859-6.1239-31.086 3.777-2.3892 10.294-1.6927 13.093 1.3991 2.2627 2.5003 18.343 55.943 18.343 60.964 0 2.6724-4.9172 6.6288-9.732 7.8301-3.7779 0.94269-4.3723 0.50303-5.6902-4.2091zm49.68 3.1452c-2.4441-0.89259-4.7315-3.1626-5.2438-5.204-1.1929-4.7531 13.211-56.734 17.086-61.66 1.8185-2.3119 4.5872-3.7542 7.178-3.7395 9.4435 0.0541 9.4384 0.20748-1.2564 37.644-5.4668 19.136-10.724 34.736-11.684 34.668-0.95949-0.0683-3.6954-0.83679-6.0796-1.7076z" fill="#fff" stroke-width="1.6667"/>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/radiopublic.svg b/app/Views/_assets/images/platforms/podcasting/radiopublic.svg
deleted file mode 100644
index 99f072d1ad..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/radiopublic.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="podcastrepublic">
-    <rect width="300" height="300" rx="67" fill="#ce262f"/>
-    <path d="M229.23,230.93c-30.4-14.09-60.8,14.09-91.2,0V90c30.4,14.09,60.8-14.09,91.2,0Zm-49.32-75.56V129.44l3.15-.73c3.92-.9,4.3,1.12,4.3,4.45v15.31c0,2.84-.38,5.27-4.3,6.18Zm0,14.94c2.65-.6,5.3-1.23,8-1.83,11.75-2.68,16.42-9.94,16.42-21.35v-18.4c0-11.22-3-18.35-17.3-15.12-8,1.81-15.91,3.84-23.87,4.56v91.88a128,128,0,0,0,16.8-2.94Z" fill="#fff" fill-rule="evenodd"/>
-    <path d="M163.2,210.13S161.79,218,138,230.93V154.81Z" fill="#c1c1c1" fill-rule="evenodd"/>
-    <path d="M163.12,210c-30.79-14.09-61.57,14.09-92.35,0V69.07c30.78,14.09,61.56-14.09,92.35,0ZM113,131.73V108.52l3.79-.86c3.41-.78,4.17.29,4.16,4.24v12.47c0,4.32-1.26,5.83-4.66,6.62Zm0,54.46V146.92l3.54-.8c3.41-.78,4.41.11,4.41,4.43v26.8c0,4.07.64,5.9,1.52,6.7a115.06,115.06,0,0,1,16.8-2.67v-.62c-.64-1.07-1.39-2.73-1.39-6.68V142.83c0-6.82-4.55-9.42-7.2-9.92a14.67,14.67,0,0,0,7.45-13.31V104.9c0-9.85-5.17-15.05-15.4-12.78-8.84,1.93-17.68,4.29-26.52,5.09v91.87A131,131,0,0,0,113,186.19Z" fill="#fff" fill-rule="evenodd"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/spotify.svg b/app/Views/_assets/images/platforms/podcasting/spotify.svg
deleted file mode 100644
index ed4f435a1f..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/spotify.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="spotify">
-    <rect width="300" height="300" rx="67"/>
-    <path d="M199.52,140.5c-27-16-71.5-17.5-97.26-9.68a7.83,7.83,0,0,1-4.54-15c29.57-9,78.73-7.24,109.79,11.2a7.83,7.83,0,0,1-8,13.47Zm-.88,23.74a6.54,6.54,0,0,1-9,2.15c-22.5-13.83-56.8-17.84-83.42-9.76a6.53,6.53,0,1,1-3.8-12.49c30.41-9.23,68.21-4.76,94.05,11.12a6.54,6.54,0,0,1,2.15,9ZM188.39,187a5.21,5.21,0,0,1-7.17,1.74c-19.66-12-44.4-14.73-73.55-8.07a5.22,5.22,0,0,1-2.32-10.17c31.89-7.29,59.25-4.16,81.31,9.33a5.21,5.21,0,0,1,1.73,7.17ZM150,66.28A83.72,83.72,0,1,0,233.72,150,83.72,83.72,0,0,0,150,66.28Z" fill="#1ed760"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/spreaker.svg b/app/Views/_assets/images/platforms/podcasting/spreaker.svg
deleted file mode 100644
index 7cce4d1063..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/spreaker.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="spreaker">
-    <rect width="300" height="300" rx="67" fill="#212322"/>
-    <path d="M168.52,65l-40,46.32L68.75,98.42l61.48,52.22L69.76,203.5l59.58-14.05L170.14,235l5-60.92,56.08-24.67-56.4-23.59L168.57,65Z" fill="#ffc107"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/stitcher.svg b/app/Views/_assets/images/platforms/podcasting/stitcher.svg
deleted file mode 100644
index 327075acce..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/stitcher.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="stitcher">
-    <rect width="300" height="300" rx="67" fill="#fff"/>
-    <path d="M168.94,114.31h31V178.8h-31Z" fill="#eb8923"/>
-    <path d="M134.5,123.39h31v62.3h-31v-62.3Z" fill="#fac712"/>
-    <path d="M99.75,118.38h31V178.8h-31Z" fill="#612268"/>
-    <path d="M65,127.77H96.31v55.1H65Z" fill="#3199cd"/>
-    <path d="M203.69,125.58H235v48.84H203.69V125.58Z" fill="#c33626"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/podcasting/tunein.svg b/app/Views/_assets/images/platforms/podcasting/tunein.svg
deleted file mode 100644
index 7e0f073c0c..0000000000
--- a/app/Views/_assets/images/platforms/podcasting/tunein.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300">
-  <g id="tunein">
-    <rect width="300" height="300" rx="67" fill="#1c203b"/>
-    <path d="M230.77,92.47h-80.3a4.21,4.21,0,0,0-4.23,4.23V177a4.21,4.21,0,0,0,4.23,4.23h80.3A4.21,4.21,0,0,0,235,177V96.23A4.14,4.14,0,0,0,230.77,92.47ZM200.25,154a1,1,0,0,1-.94.94H181.93A1,1,0,0,1,181,154v-5.16a1,1,0,0,1,.94-.94h4.23c.47,0,.47,0,.47-.47V126.28c0-.47,0-.47-.47-.47H182.4a1,1,0,0,1-.94-.93v-5.17a1,1,0,0,1,.94-.94h16a1,1,0,0,1,.94.94v5.17a1,1,0,0,1-.94.93h-3.76c-.47,0-.47,0-.47.47v21.14c0,.47,0,.47.47.47h4.23a1,1,0,0,1,.94.94l.47,5.16Z" fill="#14d8cc" fill-rule="evenodd"/>
-    <path d="M145.77,126.75v72.79H73V126.75h72.79m3.76-8H69.23A4.21,4.21,0,0,0,65,123v80.3a4.21,4.21,0,0,0,4.23,4.23h80.3a4.21,4.21,0,0,0,4.23-4.23V122.53a4.52,4.52,0,0,0-4.23-3.76Z" fill="#14d8cc"/>
-    <path d="M120.88,151.17V146a1,1,0,0,0-.94-.94H98.81a1,1,0,0,0-.94.94v5.16a1,1,0,0,0,.94.94h6.58c.47,0,.47,0,.47.47v27.71a1,1,0,0,0,.94.94H112a1,1,0,0,0,.94-.94V152.58c0-.47,0-.47.47-.47h6.57a1,1,0,0,0,.94-.94Z" fill="#14d8cc" fill-rule="evenodd"/>
-  </g>
-</svg>
diff --git a/app/Views/_assets/images/platforms/social/castopod.svg b/app/Views/_assets/images/platforms/social/castopod.svg
deleted file mode 100644
index 593e3731fa..0000000000
--- a/app/Views/_assets/images/platforms/social/castopod.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m3.3417 5.3477c-0.74036 1e-7 -1.3418 0.6112-1.3418 1.3516v10.611c0 0.74036 0.6112 1.3418 1.3516 1.3418h3.4336s0.10762-0.23568 0.2793-0.52539c0.16095-0.28971 0.48242-0.24609 0.48242-0.24609h8.8848s0.33317-0.01142 0.47266 0.24609c0.13949 0.25752 0.26758 0.52539 0.26758 0.52539h3.4863c0.74036 0 1.3525-0.6112 1.3418-1.3516v-10.611c0-0.74036-0.6112-1.3418-1.3516-1.3418zm2.6055 1.6328c0.08117 0.00522 0.16355 0.018215 0.24805 0.041016 0.12876 0.032189 0.24703 0.095851 0.21484 0.22461-0.04292 0.20387-0.35547 0.10742-0.35547 0.10742-0.45065-0.085839-0.84597 0.1499-1.082 0.56836-0.11803 0.17168-0.19348 0.1943-0.30078 0.16211-0.075109-0.042919-0.1298-0.15054-0.054688-0.2793 0.28166-0.48821 0.76192-0.86075 1.3301-0.82422zm12.619 0.30859c0.70817 0.01073 1.1056 0.44017 1.2559 1.0625 0.04292 0.15022-0.04307 0.24708-0.12891 0.25781-0.11803 0-0.18171-0.03246-0.24609-0.23633-0.1073-0.47211-0.38724-0.67583-0.83789-0.71875 0 0-0.32128 7.42e-4 -0.31055-0.20313 0.01073-0.13949 0.13882-0.17284 0.26758-0.16211zm-11.137 0.93359h9.1309c1.5773-0.01073 2.8545 1.2675 2.8438 2.8555 0 1.5666-1.2772 2.8418-2.8438 2.8418h-9.1309c-1.5666 0-2.8437-1.2752-2.8437-2.8418 0-1.5666 1.2772-2.8555 2.8437-2.8555zm0.07422 1.6953c-0.67598 0-1.2227 0.54863-1.2227 1.2246 0 0.26825 0.08512 0.50316 0.22461 0.70703 0 0 0.51516-0.26758 0.95508-0.26758 0.59014 0 1.0098 0.31055 1.0098 0.31055 0.16095-0.20387 0.25586-0.46029 0.25586-0.75 0-0.67598-0.54668-1.2246-1.2227-1.2246zm8.9805 0.01172c-0.67598 0-1.2227 0.54668-1.2227 1.2227 0 0.2897 0.09686 0.54809 0.25781 0.75195 0 0 0.41767-0.3125 1.0078-0.3125 0.43992 0 0.95508 0.26953 0.95508 0.26953 0.15022-0.20387 0.23729-0.45147 0.22656-0.70898 0-0.67598-0.54863-1.2227-1.2246-1.2227zm-5.5488 1.4473c-0.10462-0.02263-0.23875 0.04851-0.22266 0.19336 0 0-0.05412 1.0312 1.2871 1.0312 1.3412 0 1.2871-1.0312 1.2871-1.0312 0.02146-0.19314-0.22471-0.24597-0.31055-0.13867-0.04292 0.06438-0.04398 0.07434-0.07617 0.18164-0.18241 0.64379-0.90039 0.60156-0.90039 0.60156s-0.71994 0.0315-0.90234-0.60156c-0.03219-0.11803-0.0313-0.11726-0.07422-0.18164-0.02146-0.02951-0.05302-0.04714-0.08789-0.05469z"  fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/discord.svg b/app/Views/_assets/images/platforms/social/discord.svg
deleted file mode 100644
index 043e782fa7..0000000000
--- a/app/Views/_assets/images/platforms/social/discord.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M10.076 11c.6 0 1.086.45 1.075 1 0 .55-.474 1-1.075 1C9.486 13 9 12.55 9 12s.475-1 1.076-1zm3.848 0c.601 0 1.076.45 1.076 1s-.475 1-1.076 1c-.59 0-1.075-.45-1.075-1s.474-1 1.075-1zm4.967-9C20.054 2 21 2.966 21 4.163V23l-2.211-1.995-1.245-1.176-1.317-1.25.546 1.943H5.109C3.946 20.522 3 19.556 3 18.359V4.163C3 2.966 3.946 2 5.109 2H18.89zm-3.97 13.713c2.273-.073 3.148-1.596 3.148-1.596 0-3.381-1.482-6.122-1.482-6.122-1.48-1.133-2.89-1.102-2.89-1.102l-.144.168c1.749.546 2.561 1.334 2.561 1.334a8.263 8.263 0 0 0-3.096-1.008 8.527 8.527 0 0 0-2.077.02c-.062 0-.114.011-.175.021-.36.032-1.235.168-2.335.662-.38.178-.607.305-.607.305s.854-.83 2.705-1.376l-.103-.126s-1.409-.031-2.89 1.103c0 0-1.481 2.74-1.481 6.121 0 0 .864 1.522 3.137 1.596 0 0 .38-.472.69-.871-1.307-.4-1.8-1.24-1.8-1.24s.102.074.287.179c.01.01.02.021.041.031.031.022.062.032.093.053.257.147.514.262.75.357.422.168.926.336 1.513.452a7.06 7.06 0 0 0 2.664.01 6.666 6.666 0 0 0 1.491-.451c.36-.137.761-.337 1.183-.62 0 0-.514.861-1.862 1.25.309.399.68.85.68.85z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/facebook.svg b/app/Views/_assets/images/platforms/social/facebook.svg
deleted file mode 100644
index 4aee074afb..0000000000
--- a/app/Views/_assets/images/platforms/social/facebook.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2C6.477 2 2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.879V14.89h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.989C18.343 21.129 22 16.99 22 12c0-5.523-4.477-10-10-10z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/funkwhale.svg b/app/Views/_assets/images/platforms/social/funkwhale.svg
deleted file mode 100644
index 863462c3ba..0000000000
--- a/app/Views/_assets/images/platforms/social/funkwhale.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m6.2734 2.9688c-0.33408-0.014496-0.66419-0.012275-0.98242 0.0039062-0.24811 0.72276-0.034084 1.5325 0.4082 2.1582 0.47465 0.62567 1.1339 1.0679 1.8027 1.4023 0.66882 0.3452 1.3918 0.40955 2.0391 0.78711 0.42071 0.24811 0.69032 0.51781 0.94922 0.92773 0.40992 0.61489 0.38867 1.3906 0.38867 1.3906l0.052735 0.85352s0.32411 0.85156 1.0469 0.85156c0.76591 0 1.0469-0.85156 1.0469-0.85156l0.052734-0.85352s-0.021257-0.76495 0.38867-1.3906c0.2589-0.40992 0.51772-0.7012 0.94922-0.92773 0.64725-0.37756 1.3702-0.44191 2.0391-0.78711s1.3155-0.78746 1.7578-1.4023c0.44229-0.61489 0.64748-1.4354 0.41016-2.1582-1.2729-0.064725-2.7394 0.085354-3.8613 0.68945-1.5642 0.83064-2.5144 0.54069-2.7949 1.7812h-0.021485c-0.28048-1.2513-1.218-0.95061-2.793-1.7812-0.84142-0.45307-1.8767-0.64987-2.8789-0.69336zm2.4473 7.8789c-0.097087 0-0.18359 0.086507-0.18359 0.18359 0 1.9202 1.5535 3.4629 3.4629 3.4629s3.4629-1.5535 3.4629-3.4629c0-0.09709-0.086507-0.18359-0.18359-0.18359h-1.3047c-0.09709 0-0.18359 0.086507-0.18359 0.18359 0 0.98166-0.79857 1.791-1.791 1.791-0.98166 0-1.791-0.79857-1.791-1.791 0-0.09709-0.086506-0.18359-0.18359-0.18359h-1.3047zm-6.5371 0.009766c-0.097087 0-0.18359 0.086506-0.18359 0.18359 0 5.5124 4.4876 10 10 10 5.5124 0 10-4.4876 10-10 0-0.09709-0.086507-0.18359-0.18359-0.18359h-1.3047c-0.09709 0-0.18359 0.086506-0.18359 0.18359 0 4.5955-3.7552 8.3398-8.3398 8.3398-4.5955 0-8.3379-3.7336-8.3379-8.3398 0-0.09709-0.086506-0.18359-0.18359-0.18359h-1.2832zm3.2793 0c-0.097087 0-0.18359 0.086506-0.18359 0.18359-0.021575 3.7001 2.999 6.7207 6.7207 6.7207 3.7001 0 6.7207-3.0206 6.7207-6.7207 0-0.09709-0.086507-0.18359-0.18359-0.18359h-1.3047c-0.09709 0-0.18359 0.086506-0.18359 0.18359 0 2.794-2.2666 5.0605-5.0605 5.0605-2.794 0-5.0586-2.2666-5.0586-5.0605 0-0.09709-0.086506-0.18359-0.18359-0.18359h-1.2832z"  fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/instagram.svg b/app/Views/_assets/images/platforms/social/instagram.svg
deleted file mode 100644
index fcd8831895..0000000000
--- a/app/Views/_assets/images/platforms/social/instagram.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2c2.717 0 3.056.01 4.122.06 1.065.05 1.79.217 2.428.465.66.254 1.216.598 1.772 1.153a4.908 4.908 0 0 1 1.153 1.772c.247.637.415 1.363.465 2.428.047 1.066.06 1.405.06 4.122 0 2.717-.01 3.056-.06 4.122-.05 1.065-.218 1.79-.465 2.428a4.883 4.883 0 0 1-1.153 1.772 4.915 4.915 0 0 1-1.772 1.153c-.637.247-1.363.415-2.428.465-1.066.047-1.405.06-4.122.06-2.717 0-3.056-.01-4.122-.06-1.065-.05-1.79-.218-2.428-.465a4.89 4.89 0 0 1-1.772-1.153 4.904 4.904 0 0 1-1.153-1.772c-.248-.637-.415-1.363-.465-2.428C2.013 15.056 2 14.717 2 12c0-2.717.01-3.056.06-4.122.05-1.066.217-1.79.465-2.428a4.88 4.88 0 0 1 1.153-1.772A4.897 4.897 0 0 1 5.45 2.525c.638-.248 1.362-.415 2.428-.465C8.944 2.013 9.283 2 12 2zm0 5a5 5 0 1 0 0 10 5 5 0 0 0 0-10zm6.5-.25a1.25 1.25 0 0 0-2.5 0 1.25 1.25 0 0 0 2.5 0zM12 9a3 3 0 1 1 0 6 3 3 0 0 1 0-6z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/linkedin.svg b/app/Views/_assets/images/platforms/social/linkedin.svg
deleted file mode 100644
index 3052351b66..0000000000
--- a/app/Views/_assets/images/platforms/social/linkedin.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M18.335 18.339H15.67v-4.177c0-.996-.02-2.278-1.39-2.278-1.389 0-1.601 1.084-1.601 2.205v4.25h-2.666V9.75h2.56v1.17h.035c.358-.674 1.228-1.387 2.528-1.387 2.7 0 3.2 1.778 3.2 4.091v4.715zM7.003 8.575a1.546 1.546 0 0 1-1.548-1.549 1.548 1.548 0 1 1 1.547 1.549zm1.336 9.764H5.666V9.75H8.34v8.589zM19.67 3H4.329C3.593 3 3 3.58 3 4.297v15.406C3 20.42 3.594 21 4.328 21h15.338C20.4 21 21 20.42 21 19.703V4.297C21 3.58 20.4 3 19.666 3h.003z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/mastodon.svg b/app/Views/_assets/images/platforms/social/mastodon.svg
deleted file mode 100644
index 91133fee24..0000000000
--- a/app/Views/_assets/images/platforms/social/mastodon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21.258 13.99c-.274 1.41-2.456 2.955-4.962 3.254-1.306.156-2.593.3-3.965.236-2.243-.103-4.014-.535-4.014-.535 0 .218.014.426.04.62.292 2.215 2.196 2.347 4 2.41 1.82.062 3.44-.45 3.44-.45l.076 1.646s-1.274.684-3.542.81c-1.25.068-2.803-.032-4.612-.51-3.923-1.039-4.598-5.22-4.701-9.464-.031-1.26-.012-2.447-.012-3.44 0-4.34 2.843-5.611 2.843-5.611 1.433-.658 3.892-.935 6.45-.956h.062c2.557.02 5.018.298 6.451.956 0 0 2.843 1.272 2.843 5.61 0 0 .036 3.201-.397 5.424zm-2.956-5.087c0-1.074-.273-1.927-.822-2.558-.567-.631-1.308-.955-2.229-.955-1.065 0-1.871.41-2.405 1.228l-.518.87-.519-.87C11.276 5.8 10.47 5.39 9.405 5.39c-.921 0-1.663.324-2.229.955-.549.631-.822 1.484-.822 2.558v5.253h2.081V9.057c0-1.075.452-1.62 1.357-1.62 1 0 1.501.647 1.501 1.927v2.79h2.07v-2.79c0-1.28.5-1.927 1.5-1.927.905 0 1.358.545 1.358 1.62v5.1h2.08V8.902z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/mobilizon.svg b/app/Views/_assets/images/platforms/social/mobilizon.svg
deleted file mode 100644
index 7d8cfe8f6a..0000000000
--- a/app/Views/_assets/images/platforms/social/mobilizon.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m10.772 21.903c-2.0216-0.34968-3.6292-1.7403-4.4289-3.8311-0.42576-1.1132-0.61601-4.2232-0.33773-5.5208 0.49543-2.3101 1.643-3.8884 3.4277-4.7141 0.79895-0.36966 1.1046-0.42127 2.48-0.4188 1.9586 0.00358 2.9793 0.36215 4.1063 1.4428 1.8627 1.786 2.591 5.2413 1.7762 8.4272-0.39058 1.5272-0.86524 2.3495-1.8859 3.2671-1.2927 1.1622-3.2467 1.6748-5.1377 1.3477zm2.3192-2.8506c0.77962-0.53061 1.0739-1.0254 1.3296-2.2354 0.29185-1.3811 0.29551-2.838 0.01049-4.1828-0.43453-2.0502-1.0912-2.6996-2.63-2.601-0.99932 0.06407-1.3958 0.32483-1.8472 1.2148-0.48672 0.95961-0.67676 2.2172-0.59606 3.9446 0.10081 2.1579 0.54705 3.3379 1.457 3.8526 0.80649 0.4562 1.6127 0.45873 2.2762 0.0072zm-2.3134-13.627c-0.56056-0.16192-0.73514-0.54879-0.73514-1.629 0-1.1135 0.15651-1.4206 0.82627-1.6213 0.77205-0.23131 1.8695-0.2342 2.5222-0.00666 0.58207 0.20291 0.79656 0.64126 0.79656 1.6279 0 0.98663-0.21449 1.425-0.79656 1.6279-0.5958 0.2077-1.8963 0.20826-2.6134 0.00109z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/peertube.svg b/app/Views/_assets/images/platforms/social/peertube.svg
deleted file mode 100644
index c616a21c2c..0000000000
--- a/app/Views/_assets/images/platforms/social/peertube.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m4.5 2v10l7.5-5-7.5-5zm7.5 5v10l7.5-5-7.5-5zm0 10-7.5-5v10l7.5-5z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/pixelfed.svg b/app/Views/_assets/images/platforms/social/pixelfed.svg
deleted file mode 100644
index 9a1715e448..0000000000
--- a/app/Views/_assets/images/platforms/social/pixelfed.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2zm1.031 6.099h-2.624c-.988 0-1.789.776-1.789 1.733v6.748l2.595-2.471h1.818c1.713 0 3.101-1.345 3.101-3.005s-1.388-3.005-3.1-3.005z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/plume.svg b/app/Views/_assets/images/platforms/social/plume.svg
deleted file mode 100644
index aa46e90c89..0000000000
--- a/app/Views/_assets/images/platforms/social/plume.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m2.0894 21.866c-0.12089-0.14567-0.11924-0.45058 5e-3 -0.91177 0.11891-0.44159 0.2393-0.67414 1.2572-2.4283 0.46438-0.80031 0.9393-1.7206 1.0554-2.045 1.5446-4.3177 3.2356-7.2127 5.5846-9.5612 0.99215-0.99192 2.2588-2.001 2.5117-2.001 0.14557 0 0.13922 0.43526 0.09112 0.60181-0.01874 0.06489 0.27549-0.27178 0.48394-0.49328 1.3006-1.382 3.1774-2.119 7.1806-2.8195 1.3547-0.23707 1.6192-0.24701 1.7212-0.064676 0.05953 0.10637-0.0065 0.22409-0.31533 0.56197-0.44966 0.492-0.78864 0.7466-1.2482 2.2622-0.3822 1.2605-0.91684 2.0825-1.133 2.3122l-0.72637 0.77204 0.83494-0.18725c0.17638 0.16433-0.04666 0.39769-0.31951 1.0587-0.93186 2.2575-4.5828 5.7549-8.4727 7.6983-1.1955 0.59729-2.7378 1.1696-3.6397 1.3507l-0.44051 0.08845-1.4802 1.6069c-1.7996 1.9535-2.2074 2.3109-2.6433 2.3168-0.11367 0.0015-0.25175-0.05153-0.30685-0.11792z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/slack.svg b/app/Views/_assets/images/platforms/social/slack.svg
deleted file mode 100644
index b65ba6ee33..0000000000
--- a/app/Views/_assets/images/platforms/social/slack.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M6.527 14.514A1.973 1.973 0 0 1 4.56 16.48a1.973 1.973 0 0 1-1.967-1.967c0-1.083.884-1.968 1.967-1.968h1.968v1.968zm.992 0c0-1.083.884-1.968 1.967-1.968 1.083 0 1.968.885 1.968 1.968v4.927a1.973 1.973 0 0 1-1.968 1.967 1.973 1.973 0 0 1-1.967-1.967v-4.927zm1.967-7.987A1.973 1.973 0 0 1 7.52 4.56c0-1.083.884-1.967 1.967-1.967 1.083 0 1.968.884 1.968 1.967v1.968H9.486zm0 .992c1.083 0 1.968.884 1.968 1.967a1.973 1.973 0 0 1-1.968 1.968H4.56a1.973 1.973 0 0 1-1.967-1.968c0-1.083.884-1.967 1.967-1.967h4.927zm7.987 1.967c0-1.083.885-1.967 1.968-1.967s1.967.884 1.967 1.967a1.973 1.973 0 0 1-1.967 1.968h-1.968V9.486zm-.992 0a1.973 1.973 0 0 1-1.967 1.968 1.973 1.973 0 0 1-1.968-1.968V4.56c0-1.083.885-1.967 1.968-1.967s1.967.884 1.967 1.967v4.927zm-1.967 7.987c1.083 0 1.967.885 1.967 1.968a1.973 1.973 0 0 1-1.967 1.967 1.973 1.973 0 0 1-1.968-1.967v-1.968h1.968zm0-.992a1.973 1.973 0 0 1-1.968-1.967c0-1.083.885-1.968 1.968-1.968h4.927c1.083 0 1.967.885 1.967 1.968a1.973 1.973 0 0 1-1.967 1.967h-4.927z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/twitch.svg b/app/Views/_assets/images/platforms/social/twitch.svg
deleted file mode 100644
index 296d95bc55..0000000000
--- a/app/Views/_assets/images/platforms/social/twitch.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21 3v11.74l-4.696 4.695h-3.913l-2.437 2.348H6.913v-2.348H3V6.13L4.227 3H21zm-1.565 1.565H6.13v11.74h3.13v2.347l2.349-2.348h4.695l3.13-3.13V4.565zm-3.13 3.13v4.696h-1.566V7.696h1.565zm-3.914 0v4.696h-1.565V7.696h1.565z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/twitter.svg b/app/Views/_assets/images/platforms/social/twitter.svg
deleted file mode 100644
index f1a961d2cf..0000000000
--- a/app/Views/_assets/images/platforms/social/twitter.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M22.162 5.656a8.384 8.384 0 0 1-2.402.658A4.196 4.196 0 0 0 21.6 4c-.82.488-1.719.83-2.656 1.015a4.182 4.182 0 0 0-7.126 3.814 11.874 11.874 0 0 1-8.62-4.37 4.168 4.168 0 0 0-.566 2.103c0 1.45.738 2.731 1.86 3.481a4.168 4.168 0 0 1-1.894-.523v.052a4.185 4.185 0 0 0 3.355 4.101 4.21 4.21 0 0 1-1.89.072A4.185 4.185 0 0 0 7.97 16.65a8.394 8.394 0 0 1-6.191 1.732 11.83 11.83 0 0 0 6.41 1.88c7.693 0 11.9-6.373 11.9-11.9 0-.18-.005-.362-.013-.54a8.496 8.496 0 0 0 2.087-2.165z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/writefreely.svg b/app/Views/_assets/images/platforms/social/writefreely.svg
deleted file mode 100644
index 7291016c6e..0000000000
--- a/app/Views/_assets/images/platforms/social/writefreely.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg width="24" height="24" version="1.1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m6.3491 18.83c-0.56506-0.17351-1.2138-0.83126-1.4734-1.4939-0.17093-0.43626-0.19937-0.67537-0.22812-1.9179-0.028936-1.2506 0.00766-1.7765 0.30768-4.4207 0.18729-1.6507 0.34052-3.2018 0.34052-3.447 0-1.1215-0.644-1.5097-1.4299-0.8619-0.32115 0.26472-0.79951 1.1107-1.0305 1.8225l-0.14303 0.44074-0.30562-0.05425c-0.16809-0.029842-0.33464-0.080598-0.3701-0.11279-0.097242-0.088266 0.24986-1.1391 0.59364-1.7973 0.37248-0.71307 1.1149-1.4899 1.6503-1.7267 0.89996-0.3981 1.9847-0.26275 2.5678 0.3204 0.51747 0.51747 0.66507 1.0514 0.65349 2.3639-0.0055 0.61997-0.10576 2.0102-0.22286 3.0894-0.42666 3.9321-0.46032 4.2857-0.45986 4.8309 6.68e-4 0.76101 0.11775 1.1208 0.46371 1.4245 0.22985 0.20181 0.37032 0.25736 0.6508 0.25736 1.9687 0 3.6599-2.3064 4.411-6.0156 0.17516-0.86506 0.19365-1.1797 0.19366-3.2944 1e-6 -1.2859-0.02723-2.46-0.06054-2.6093l-0.06053-0.27137h2.3205l0.06024 0.5626c0.11712 1.0936-0.05575 3.1226-0.55321 6.493-0.29127 1.9734-0.35616 3.5194-0.174 4.146 0.06705 0.23062 0.23015 0.50214 0.40125 0.66798 0.28471 0.27595 0.29784 0.27941 1.0603 0.27941 0.72778 0 0.80944-0.01848 1.4243-0.32236 2.3486-1.1607 4.0824-4.6369 3.8581-7.7352-0.08784-1.2134-0.32659-1.8715-0.84372-2.3255-0.35033-0.3076-0.4238-0.32067-0.54363-0.096756-0.2137 0.3993-1.129 0.57346-1.5532 0.29553-0.3671-0.24053-0.54817-0.62213-0.50927-1.0732 0.03969-0.4603 0.24144-0.77523 0.65127-1.0166 0.22411-0.13201 0.43221-0.16675 0.99324-0.16582 0.60378 9.936e-4 0.7723 0.034028 1.1289 0.22129 0.81315 0.42703 1.4572 1.332 1.7512 2.4605 0.17402 0.66809 0.17417 3.2971 2.51e-4 4.124-0.72812 3.4614-3.2088 6.3679-5.9567 6.9793-1.2677 0.28204-2.5047 0.04143-3.1186-0.60664-0.51583-0.54452-0.86384-1.7498-0.80515-2.7885 0.01543-0.27326 0.02285-0.49677 0.01646-0.49669-0.0064 8.4e-5 -0.14831 0.28802-0.31539 0.63985-0.97609 2.0554-2.7004 3.3799-4.3772 3.3624-0.30589-0.0032-0.73971-0.06218-0.96404-0.13105z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/images/platforms/social/youtube.svg b/app/Views/_assets/images/platforms/social/youtube.svg
deleted file mode 100644
index 02ff073ae5..0000000000
--- a/app/Views/_assets/images/platforms/social/youtube.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24"><path d="M21.543 6.498C22 8.28 22 12 22 12s0 3.72-.457 5.502c-.254.985-.997 1.76-1.938 2.022C17.896 20 12 20 12 20s-5.893 0-7.605-.476c-.945-.266-1.687-1.04-1.938-2.022C2 15.72 2 12 2 12s0-3.72.457-5.502c.254-.985.997-1.76 1.938-2.022C6.107 4 12 4 12 4s5.896 0 7.605.476c.945.266 1.687 1.04 1.938 2.022zM10 15.5l6-3.5-6-3.5v7z" fill="currentColor"/></svg>
\ No newline at end of file
diff --git a/app/Views/_assets/modules/Clipboard.ts b/app/Views/_assets/modules/Clipboard.ts
index 2b5b0a59ac..7b4e4ebfec 100644
--- a/app/Views/_assets/modules/Clipboard.ts
+++ b/app/Views/_assets/modules/Clipboard.ts
@@ -1,7 +1,7 @@
 const Clipboard = (): void => {
-  const buttons: NodeListOf<
-    HTMLButtonElement
-  > | null = document.querySelectorAll("button[data-type='clipboard-copy']");
+  const buttons: NodeListOf<HTMLButtonElement> | null = document.querySelectorAll(
+    "button[data-type='clipboard-copy']"
+  );
 
   if (buttons) {
     for (let i = 0; i < buttons.length; i++) {
diff --git a/app/Views/_assets/modules/Dropdown.ts b/app/Views/_assets/modules/Dropdown.ts
index 1958160987..231e028fca 100644
--- a/app/Views/_assets/modules/Dropdown.ts
+++ b/app/Views/_assets/modules/Dropdown.ts
@@ -1,62 +1,81 @@
-import { createPopper, Placement } from "@popperjs/core";
+import { createPopper, Instance, Placement } from "@popperjs/core";
 
 const Dropdown = (): void => {
-  const dropdownContainers: NodeListOf<HTMLElement> = document.querySelectorAll(
-    "[data-toggle='dropdown']"
+  const dropdownButtons: NodeListOf<HTMLButtonElement> = document.querySelectorAll(
+    "[data-dropdown='button']"
   );
 
-  for (let i = 0; i < dropdownContainers.length; i++) {
-    const dropdownContainer = dropdownContainers[i];
+  for (let i = 0; i < dropdownButtons.length; i++) {
+    const button = dropdownButtons[i];
 
-    const button: HTMLElement | null = dropdownContainer.querySelector(
-      "[data-popper='button']"
-    );
-    const menu: HTMLElement | null = dropdownContainer.querySelector(
-      "[data-popper='menu']"
-    );
+    if (button.dataset.dropdownTarget) {
+      const menu: HTMLElement | null = document.getElementById(
+        button.dataset?.dropdownTarget
+      );
 
-    if (button && menu) {
-      const popper = createPopper(button, menu, {
-        placement: menu.dataset.popperPlacement as Placement,
-        modifiers: [
-          {
-            name: "offset",
-            options: {
-              offset: [menu.dataset.popperOffsetX, menu.dataset.popperOffsetY],
-            },
-          },
-        ],
-      });
+      if (menu) {
+        // place the menu at then end of the body to prevent any overflow cuts
+        document.body.appendChild(menu);
 
-      const dropdownToggle = () => {
-        const isExpanded = !menu.classList.contains("hidden");
+        let popperInstance: Instance | null = null;
 
-        if (isExpanded) {
-          menu.classList.add("hidden");
-          menu.classList.remove("flex");
-        } else {
-          menu.classList.add("flex");
-          menu.classList.remove("hidden");
-        }
+        const create = () => {
+          const offsetX = menu.dataset.dropdownOffsetX
+            ? parseInt(menu.dataset.dropdownOffsetX)
+            : 0;
+          const offsetY = menu.dataset.dropdownOffsetY
+            ? parseInt(menu.dataset.dropdownOffsetY)
+            : 0;
+          popperInstance = createPopper(button, menu, {
+            placement: menu.dataset.dropdownPlacement as Placement,
+            // strategy: "fixed",
+            modifiers: [
+              {
+                name: "offset",
+                options: {
+                  offset: [offsetX, offsetY],
+                },
+              },
+            ],
+          });
+        };
 
-        button.setAttribute("aria-expanded", isExpanded.toString());
-        popper.update();
-      };
+        const destroy = () => {
+          if (popperInstance) {
+            popperInstance.destroy();
+            popperInstance = null;
+          }
+        };
 
-      // Toggle dropdown menu on button click event
-      button.addEventListener("click", dropdownToggle);
+        const dropdownToggle = () => {
+          const isExpanded = menu.hasAttribute("data-show");
 
-      // Toggle off when clicking outside of dropdown
-      document.addEventListener("click", function (event) {
-        const isExpanded = !menu.classList.contains("hidden");
-        const isClickOutside = !dropdownContainer.contains(
-          event.target as Node
-        );
+          if (isExpanded) {
+            menu.removeAttribute("data-show");
+            button.setAttribute("aria-expanded", "false");
+            destroy();
+          } else {
+            menu.setAttribute("data-show", "");
+            button.setAttribute("aria-expanded", "true");
+            create();
+          }
+        };
 
-        if (isExpanded && isClickOutside) {
-          dropdownToggle();
-        }
-      });
+        // Toggle dropdown menu on button click event
+        button.addEventListener("click", dropdownToggle);
+
+        // Toggle off when clicking outside of dropdown
+        document.addEventListener("click", function (event) {
+          const isExpanded = menu.hasAttribute("data-show");
+          const isClickOutside =
+            !menu.contains(event.target as Node) &&
+            !button.contains(event.target as Node);
+
+          if (isExpanded && isClickOutside) {
+            dropdownToggle();
+          }
+        });
+      }
     }
   }
 };
diff --git a/app/Views/_assets/modules/MarkdownEditor.ts b/app/Views/_assets/modules/MarkdownEditor.ts
index 604e948ea3..5e669b48f1 100644
--- a/app/Views/_assets/modules/MarkdownEditor.ts
+++ b/app/Views/_assets/modules/MarkdownEditor.ts
@@ -59,7 +59,7 @@ class ProseMirrorView {
         }
       },
       attributes: {
-        class: "prose-sm px-3 py-2 overflow-y-auto focus:shadow-outline",
+        class: "prose-sm px-3 py-2 overflow-y-auto focus:ring",
         style: "min-height: 200px; max-height: 500px",
       },
     });
@@ -83,7 +83,7 @@ const MarkdownEditor = (): void => {
   const targets: NodeListOf<HTMLTextAreaElement> = document.querySelectorAll(
     "textarea[data-editor='markdown']"
   );
-  const activeClass = "font-bold";
+  const activeClass = "font-semibold";
 
   for (let i = 0; i < targets.length; i++) {
     const target = targets[i];
@@ -97,7 +97,7 @@ const MarkdownEditor = (): void => {
       "border",
       "text-xs",
       "outline-none",
-      "focus:shadow-outline"
+      "focus:ring"
     );
     wysiwygBtn.setAttribute("type", "button");
     wysiwygBtn.innerHTML = "Wysiwyg";
@@ -109,7 +109,7 @@ const MarkdownEditor = (): void => {
       "border",
       "text-xs",
       "outline-none",
-      "focus:shadow-outline"
+      "focus:ring"
     );
     markdownBtn.setAttribute("type", "button");
     markdownBtn.innerHTML = "Markdown";
diff --git a/app/Views/_assets/modules/Modal.ts b/app/Views/_assets/modules/Modal.ts
new file mode 100644
index 0000000000..060540a0ce
--- /dev/null
+++ b/app/Views/_assets/modules/Modal.ts
@@ -0,0 +1,34 @@
+const Modal = (): void => {
+  const modalTriggerElements: NodeListOf<HTMLElement> = document.querySelectorAll(
+    "[data-modal-target]"
+  );
+
+  for (let i = 0; i < modalTriggerElements.length; i++) {
+    const modalTrigger = modalTriggerElements[i];
+
+    if (modalTrigger.dataset.modalTarget) {
+      const modal: HTMLElement | null = document.getElementById(
+        modalTrigger.dataset.modalTarget
+      );
+
+      if (modal) {
+        modalTrigger.addEventListener("click", () => {
+          modal.classList.toggle("hidden");
+        });
+
+        const closeButtonsElements: NodeListOf<HTMLElement> = modal.querySelectorAll(
+          "[data-modal-button]"
+        );
+
+        for (let j = 0; j < closeButtonsElements.length; j++) {
+          const closeButton = closeButtonsElements[j];
+          closeButton.addEventListener("click", () => {
+            modal.classList.toggle("hidden");
+          });
+        }
+      }
+    }
+  }
+};
+
+export default Modal;
diff --git a/app/Views/_assets/modules/Soundbites.ts b/app/Views/_assets/modules/Soundbites.ts
index b8f7ffbf0c..601b2b7020 100644
--- a/app/Views/_assets/modules/Soundbites.ts
+++ b/app/Views/_assets/modules/Soundbites.ts
@@ -51,9 +51,9 @@ const Soundbites = (): void => {
       }
     }
 
-    const soundbitePlayButtons: NodeListOf<
-      HTMLButtonElement
-    > | null = document.querySelectorAll("button[data-type='play-soundbite']");
+    const soundbitePlayButtons: NodeListOf<HTMLButtonElement> | null = document.querySelectorAll(
+      "button[data-type='play-soundbite']"
+    );
     if (soundbitePlayButtons) {
       for (let i = 0; i < soundbitePlayButtons.length; i++) {
         const soundbitePlayButton: HTMLButtonElement = soundbitePlayButtons[i];
@@ -67,9 +67,9 @@ const Soundbites = (): void => {
       }
     }
 
-    const inputFields: NodeListOf<
-      HTMLInputElement
-    > | null = document.querySelectorAll("input[data-type='soundbite-field']");
+    const inputFields: NodeListOf<HTMLInputElement> | null = document.querySelectorAll(
+      "input[data-type='soundbite-field']"
+    );
     if (inputFields) {
       for (let i = 0; i < inputFields.length; i++) {
         const inputField: HTMLInputElement = inputFields[i];
diff --git a/app/Views/_assets/modules/ThemePicker.ts b/app/Views/_assets/modules/ThemePicker.ts
index 167f260020..d495170cd3 100644
--- a/app/Views/_assets/modules/ThemePicker.ts
+++ b/app/Views/_assets/modules/ThemePicker.ts
@@ -1,7 +1,7 @@
 const ThemePicker = (): void => {
-  const buttons: NodeListOf<
-    HTMLButtonElement
-  > | null = document.querySelectorAll("button[data-type='theme-picker']");
+  const buttons: NodeListOf<HTMLButtonElement> | null = document.querySelectorAll(
+    "button[data-type='theme-picker']"
+  );
   const iframe: HTMLIFrameElement | null = document.querySelector(
     `iframe[id="embeddable_player"]`
   );
diff --git a/app/Views/_assets/modules/Toggler.ts b/app/Views/_assets/modules/Toggler.ts
new file mode 100644
index 0000000000..c726ac1eaa
--- /dev/null
+++ b/app/Views/_assets/modules/Toggler.ts
@@ -0,0 +1,31 @@
+const Toggler = (): void => {
+  const togglerElements: NodeListOf<HTMLElement> = document.querySelectorAll(
+    "[data-toggle]"
+  );
+
+  for (let i = 0; i < togglerElements.length; i++) {
+    const toggler = togglerElements[i];
+
+    if (toggler.dataset.toggle) {
+      const target: HTMLElement | null = document.getElementById(
+        toggler.dataset.toggle
+      );
+
+      if (target && toggler.dataset.toggleClass) {
+        toggler.addEventListener("click", () => {
+          toggler.dataset.toggleClass?.split(" ").forEach((className) => {
+            target.classList.toggle(className);
+          });
+
+          if (toggler.dataset.toggleBodyClass) {
+            toggler.dataset.toggleBodyClass.split(" ").forEach((className) => {
+              document.body.classList.toggle(className);
+            });
+          }
+        });
+      }
+    }
+  }
+};
+
+export default Toggler;
diff --git a/app/Views/_assets/podcast.ts b/app/Views/_assets/podcast.ts
index c5e125b3f5..67235fe782 100644
--- a/app/Views/_assets/podcast.ts
+++ b/app/Views/_assets/podcast.ts
@@ -1,3 +1,9 @@
+import Dropdown from "./modules/Dropdown";
 import Time from "./modules/Time";
+import Toggler from "./modules/Toggler";
+import Tooltip from "./modules/Tooltip";
 
+Dropdown();
 Time();
+Toggler();
+Tooltip();
diff --git a/app/Views/_assets/styles/dropdown.css b/app/Views/_assets/styles/dropdown.css
new file mode 100644
index 0000000000..bf3e2ed00f
--- /dev/null
+++ b/app/Views/_assets/styles/dropdown.css
@@ -0,0 +1,8 @@
+@layer base {
+  [data-dropdown="menu"] {
+    @apply z-50;
+  }
+  [data-dropdown="menu"]:not([data-show]) {
+    @apply absolute top-0 left-0 invisible pointer-events-none;
+  }
+}
diff --git a/app/Views/_assets/styles/fonts.css b/app/Views/_assets/styles/fonts.css
new file mode 100644
index 0000000000..2e3b341f43
--- /dev/null
+++ b/app/Views/_assets/styles/fonts.css
@@ -0,0 +1,41 @@
+@layer base {
+  /* kumbh-sans-regular */
+  @font-face {
+    font-family: "Kumbh Sans";
+    font-style: normal;
+    font-weight: 400;
+    src: local(""), url("fonts/kumbh-sans-regular.woff2") format("woff2"),
+      /* Chrome 26+, Opera 23+, Firefox 39+ */
+        url("fonts/kumbh-sans-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  }
+
+  /* kumbh-sans-700 */
+  @font-face {
+    font-family: "Kumbh Sans";
+    font-style: normal;
+    font-weight: 700;
+    src: local(""), url("fonts/kumbh-sans-700.woff2") format("woff2"),
+      /* Chrome 26+, Opera 23+, Firefox 39+ */ url("fonts/kumbh-sans-700.woff")
+        format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  }
+
+  /* montserrat-regular */
+  @font-face {
+    font-family: "Montserrat";
+    font-style: normal;
+    font-weight: 400;
+    src: local(""), url("fonts/montserrat-regular.woff2") format("woff2"),
+      /* Chrome 26+, Opera 23+, Firefox 39+ */
+        url("fonts/montserrat-regular.woff") format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  }
+
+  /* montserrat-600 - latin */
+  @font-face {
+    font-family: "Montserrat";
+    font-style: normal;
+    font-weight: 600;
+    src: local(""), url("fonts/montserrat-600.woff2") format("woff2"),
+      /* Chrome 26+, Opera 23+, Firefox 39+ */ url("fonts/montserrat-600.woff")
+        format("woff"); /* Chrome 6+, Firefox 3.6+, IE 9+, Safari 5.1+ */
+  }
+}
diff --git a/app/Views/_assets/styles/index.css b/app/Views/_assets/styles/index.css
index f7737f4f32..eb98956f1e 100644
--- a/app/Views/_assets/styles/index.css
+++ b/app/Views/_assets/styles/index.css
@@ -1,7 +1,12 @@
 @import "./tailwind.css";
+@import "./fonts.css";
 @import "./layout.css";
 @import "./breadcrumb.css";
+@import "./dropdown.css";
 @import "./multiSelect.css";
 @import "./radioBtn.css";
 @import "./switch.css";
 @import "./charts.css";
+@import "./note.css";
+@import "./tabs.css";
+@import "./radioToggler.css";
diff --git a/app/Views/_assets/styles/layout.css b/app/Views/_assets/styles/layout.css
index b613b7473d..e5535241b5 100644
--- a/app/Views/_assets/styles/layout.css
+++ b/app/Views/_assets/styles/layout.css
@@ -1,9 +1,10 @@
+/* Admin layout */
 .holy-grail-grid {
   @apply grid min-h-screen overflow-y-auto;
   grid-template: 1fr auto / auto 1fr;
 
   & .holy-grail-sidebar {
-    @apply w-64 col-start-1 col-end-2 row-start-1 row-end-3;
+    @apply col-start-1 col-end-2 row-start-1 row-end-3 w-80;
   }
 
   & .holy-grail-main {
diff --git a/app/Views/_assets/styles/multiSelect.css b/app/Views/_assets/styles/multiSelect.css
index 83fe9c76a7..05fcdc742b 100644
--- a/app/Views/_assets/styles/multiSelect.css
+++ b/app/Views/_assets/styles/multiSelect.css
@@ -1,180 +1,182 @@
-/*===============================
+@layer components {
+  /*===============================
 =          MultiSelect          =
 ===============================*/
-.multiselect {
-  @apply relative;
+  .multiselect {
+    @apply relative;
 
-  &:focus {
-    @apply shadow-outline outline-none;
-  }
-  &:last-child {
-    @apply mb-0;
-  }
-  &.is-disabled {
-    &.multiselect__inner,
-    &.multiselect__input {
-      @apply bg-gray-300 cursor-not-allowed select-none;
+    &:focus {
+      @apply outline-none ring;
     }
-    &.multiselect__item {
-      @apply cursor-not-allowed;
+    &:last-child {
+      @apply mb-0;
+    }
+    &.is-disabled {
+      &.multiselect__inner,
+      &.multiselect__input {
+        @apply bg-gray-300 cursor-not-allowed select-none;
+      }
+      &.multiselect__item {
+        @apply cursor-not-allowed;
+      }
     }
-  }
-
-  & [hidden] {
-    @apply hidden;
-  }
-}
 
-.multiselect[data-type*="select-multiple"],
-.multiselect[data-type*="text"] {
-  & .multiselect__inner {
-    @apply cursor-text;
+    & [hidden] {
+      @apply hidden;
+    }
   }
-  & .multiselect__button {
-    @apply relative inline-block w-2 pl-4 mt-0 mb-0 ml-1 opacity-75;
-    background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);
-    background-size: 8px;
 
-    &:hover,
-    &:focus {
-      @apply opacity-100;
+  .multiselect[data-type*="select-multiple"],
+  .multiselect[data-type*="text"] {
+    & .multiselect__inner {
+      @apply cursor-text;
+    }
+    & .multiselect__button {
+      @apply relative inline-block w-2 pl-4 mt-0 mb-0 ml-1 opacity-75;
+      background-image: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjEiIHZpZXdCb3g9IjAgMCAyMSAyMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48ZyBmaWxsPSIjRkZGIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxwYXRoIGQ9Ik0yLjU5Mi4wNDRsMTguMzY0IDE4LjM2NC0yLjU0OCAyLjU0OEwuMDQ0IDIuNTkyeiIvPjxwYXRoIGQ9Ik0wIDE4LjM2NEwxOC4zNjQgMGwyLjU0OCAyLjU0OEwyLjU0OCAyMC45MTJ6Ii8+PC9nPjwvc3ZnPg==);
+      background-size: 8px;
+
+      &:hover,
+      &:focus {
+        @apply opacity-100;
+      }
     }
   }
-}
 
-.multiselect__inner {
-  @apply inline-block w-full px-2 pt-2 pb-1 overflow-hidden align-top bg-white border rounded;
+  .multiselect__inner {
+    @apply inline-block w-full px-2 pt-2 pb-1 overflow-hidden align-top bg-white border rounded;
 
-  &.is-focused,
-  &.is-open {
-    @apply shadow-outline;
-  }
-  &.is-open {
-    @apply rounded-b-none;
+    &.is-focused,
+    &.is-open {
+      @apply ring;
+    }
+    &.is-open {
+      @apply rounded-b-none;
+    }
+    &.is-flipped.is-open {
+      @apply rounded-t-none;
+    }
   }
-  &.is-flipped.is-open {
-    @apply rounded-t-none;
+
+  .multiselect__list {
+    @apply p-0 m-0 list-none;
   }
-}
 
-.multiselect__list {
-  @apply p-0 m-0 list-none;
-}
+  .multiselect__list--multiple {
+    @apply inline;
 
-.multiselect__list--multiple {
-  @apply inline;
+    & .multiselect__item {
+      @apply inline-flex px-2 py-1 mb-1 mr-2 text-sm text-white break-all rounded bg-pine-600;
 
-  & .multiselect__item {
-    @apply inline-flex px-2 py-1 mb-1 mr-2 text-sm text-white break-all bg-green-500 rounded;
+      &[data-deletable] {
+        @apply pr-1;
+      }
+      & [dir="rtl"] {
+        @apply ml-2 mr-0;
+      }
+      &.is-highlighted {
+        @apply bg-pine-600;
+      }
+      &.is-disabled {
+        @apply bg-gray-500;
+      }
+    }
+  }
+
+  .multiselect__list--dropdown {
+    @apply absolute z-10 invisible w-full overflow-hidden break-all bg-white border border-t-0 rounded-b shadow-lg;
+    top: 100%;
+    will-change: visibility;
 
-    &[data-deletable] {
-      @apply pr-1;
+    &.is-active {
+      @apply visible;
     }
-    & [dir="rtl"] {
-      @apply ml-2 mr-0;
+    &.is-open {
+      @apply ring;
     }
-    &.is-highlighted {
-      @apply bg-green-700;
+    &.is-flipped {
+      @apply top-auto mt-0 rounded-t;
+      bottom: 100%;
     }
-    &.is-disabled {
-      @apply bg-gray-500;
+    & .multiselect__list {
+      @apply relative overflow-auto;
+      max-height: 300px;
+      -webkit-overflow-scrolling: touch;
+      will-change: scroll-position;
     }
-  }
-}
+    & .multiselect__item {
+      @apply relative p-3;
 
-.multiselect__list--dropdown {
-  @apply absolute z-10 invisible w-full overflow-hidden break-all bg-white border border-t-0 rounded-b shadow-lg;
-  top: 100%;
-  will-change: visibility;
-
-  &.is-active {
-    @apply visible;
-  }
-  &.is-open {
-    @apply shadow-outline;
-  }
-  &.is-flipped {
-    @apply top-auto mt-0 rounded-t;
-    bottom: 100%;
-  }
-  & .multiselect__list {
-    @apply relative overflow-auto;
-    max-height: 300px;
-    -webkit-overflow-scrolling: touch;
-    will-change: scroll-position;
-  }
-  & .multiselect__item {
-    @apply relative p-3;
-
-    & [dir="rtl"] {
-      @apply text-right;
-    }
-  }
-  & .multiselect__item--selectable {
-    @screen sm {
-      padding-right: 100px;
-      &:after {
-        @apply absolute text-sm transform -translate-y-1/2 opacity-0;
-        content: attr(data-select-text);
-        right: 10px;
-        top: 50%;
-      }
       & [dir="rtl"] {
         @apply text-right;
-        padding-left: 100px;
-        padding-right: 10px;
+      }
+    }
+    & .multiselect__item--selectable {
+      @screen sm {
+        padding-right: 100px;
         &:after {
-          @apply right-auto;
-          left: 10px;
+          @apply absolute text-sm transform -translate-y-1/2 opacity-0;
+          content: attr(data-select-text);
+          right: 10px;
+          top: 50%;
+        }
+        & [dir="rtl"] {
+          @apply text-right;
+          padding-left: 100px;
+          padding-right: 10px;
+          &:after {
+            @apply right-auto;
+            left: 10px;
+          }
         }
       }
-    }
-    &.is-highlighted {
-      @apply bg-gray-100;
-      &:after {
-        @apply opacity-50;
+      &.is-highlighted {
+        @apply bg-gray-100;
+        &:after {
+          @apply opacity-50;
+        }
       }
     }
   }
-}
 
-.multiselect__item {
-  @apply cursor-default;
-}
+  .multiselect__item {
+    @apply cursor-default;
+  }
 
-.multiselect__item--selectable {
-  @apply cursor-pointer;
-}
+  .multiselect__item--selectable {
+    @apply cursor-pointer;
+  }
 
-.multiselect__item--disabled {
-  @apply opacity-50 cursor-not-allowed select-none;
-}
+  .multiselect__item--disabled {
+    @apply opacity-50 cursor-not-allowed select-none;
+  }
 
-.multiselect__heading {
-  @apply p-3 font-semibold text-gray-600 border-b;
-}
+  .multiselect__heading {
+    @apply p-3 font-semibold text-gray-600 border-b;
+  }
 
-.multiselect__button {
-  @apply bg-transparent bg-center bg-no-repeat border-0 appearance-none cursor-pointer;
-  text-indent: -9999px;
+  .multiselect__button {
+    @apply bg-transparent bg-center bg-no-repeat border-0 appearance-none cursor-pointer;
+    text-indent: -9999px;
 
-  &:focus {
-    @apply outline-none;
+    &:focus {
+      @apply outline-none;
+    }
   }
-}
 
-.multiselect__input {
-  @apply inline-block max-w-full py-1 pl-1 mb-1 align-baseline bg-transparent border-0 rounded-none;
-  &:focus {
-    @apply outline-none;
+  .multiselect__input {
+    @apply inline-block max-w-full py-1 pl-1 mb-1 align-baseline bg-transparent border-0 rounded-none;
+    &:focus {
+      @apply outline-none;
+    }
+    & [dir="rtl"] {
+      @apply pl-0 pr-1;
+    }
   }
-  & [dir="rtl"] {
-    @apply pl-0 pr-1;
+
+  .multiselect__placeholder {
+    @apply opacity-50;
   }
-}
 
-.multiselect__placeholder {
-  @apply opacity-50;
+  /*=====  End of Choices  ======*/
 }
-
-/*=====  End of Choices  ======*/
diff --git a/app/Views/_assets/styles/note.css b/app/Views/_assets/styles/note.css
new file mode 100644
index 0000000000..510bcda243
--- /dev/null
+++ b/app/Views/_assets/styles/note.css
@@ -0,0 +1,22 @@
+@layer components {
+  .note-content {
+    & a {
+      @apply text-sm font-semibold text-pine-600 hover:underline;
+    }
+  }
+
+  .note-replies > * {
+    @apply relative;
+
+    & img {
+      @apply z-20;
+    }
+
+    &:not(:last-child)::before {
+      @apply absolute z-10 h-full bg-gray-300 top-8;
+      content: "";
+      left: 3rem;
+      width: 2px;
+    }
+  }
+}
diff --git a/app/Views/_assets/styles/radioBtn.css b/app/Views/_assets/styles/radioBtn.css
index 1007c67333..0abe1a6e65 100644
--- a/app/Views/_assets/styles/radioBtn.css
+++ b/app/Views/_assets/styles/radioBtn.css
@@ -1,24 +1,26 @@
-.form-radio-btn {
-  @apply absolute opacity-0;
-}
+@layer components {
+  .form-radio-btn {
+    @apply absolute opacity-0;
+  }
 
-.form-radio-btn:focus + label {
-  @apply shadow-outline;
-}
+  .form-radio-btn:focus + label {
+    @apply ring;
+  }
 
-.form-radio-btn + label {
-  @apply inline-block px-2 py-1 text-sm text-black bg-white border rounded cursor-pointer;
+  .form-radio-btn + label {
+    @apply inline-block px-2 py-1 text-sm text-black bg-white border rounded cursor-pointer;
 
-  &:hover {
-    @apply bg-green-100;
+    &:hover {
+      @apply bg-pine-100;
+    }
   }
-}
 
-.form-radio-btn:checked + label {
-  @apply text-white bg-green-500;
+  .form-radio-btn:checked + label {
+    @apply text-white bg-pine-600;
 
-  &::before {
-    @apply mr-2 text-green-200;
-    content: "✓";
+    &::before {
+      @apply mr-2 text-pine-200;
+      content: "✓";
+    }
   }
 }
diff --git a/app/Views/_assets/styles/radioToggler.css b/app/Views/_assets/styles/radioToggler.css
new file mode 100644
index 0000000000..47e7048a95
--- /dev/null
+++ b/app/Views/_assets/styles/radioToggler.css
@@ -0,0 +1,9 @@
+@layer components {
+  .radio-toggler-element {
+    @apply hidden;
+  }
+
+  .radio-toggler > input:checked ~ .radio-toggler-element {
+    @apply block;
+  }
+}
diff --git a/app/Views/_assets/styles/switch.css b/app/Views/_assets/styles/switch.css
index be0cbe0f35..3d8a7f3d15 100644
--- a/app/Views/_assets/styles/switch.css
+++ b/app/Views/_assets/styles/switch.css
@@ -1,26 +1,28 @@
-.form-switch {
-  @apply absolute w-0 h-0 opacity-0;
+@layer components {
+  .form-switch {
+    @apply absolute w-0 h-0 opacity-0;
 
-  &:checked + .form-switch-slider {
-    @apply bg-green-500;
-  }
+    &:checked + .form-switch-slider {
+      @apply bg-pine-600;
+    }
 
-  &:focus + .form-switch-slider {
-    @apply shadow-outline;
-  }
+    &:focus + .form-switch-slider {
+      @apply ring;
+    }
 
-  &:checked + .form-switch-slider::before {
-    @apply transform translate-x-5;
+    &:checked + .form-switch-slider::before {
+      @apply transform translate-x-5;
+    }
   }
-}
 
-.form-switch-slider {
-  @apply relative inset-0 flex-shrink-0 w-10 h-5 transition duration-200 bg-gray-400 rounded-full cursor-pointer;
+  .form-switch-slider {
+    @apply relative inset-0 flex-shrink-0 w-10 h-5 transition duration-200 bg-gray-400 rounded-full cursor-pointer;
 
-  &::before {
-    @apply absolute w-4 h-4 transition duration-200 bg-white rounded-full shadow-xs;
-    content: "";
-    left: 2px;
-    bottom: 2px;
+    &::before {
+      @apply absolute w-4 h-4 transition duration-200 bg-white rounded-full ring-1 ring-black ring-opacity-5;
+      content: "";
+      left: 2px;
+      bottom: 2px;
+    }
   }
 }
diff --git a/app/Views/_assets/styles/tabs.css b/app/Views/_assets/styles/tabs.css
new file mode 100644
index 0000000000..4414c5174e
--- /dev/null
+++ b/app/Views/_assets/styles/tabs.css
@@ -0,0 +1,37 @@
+@layer components {
+  .tabset {
+    @apply grid grid-cols-2;
+  }
+
+  .tabset > input[type="radio"] {
+    @apply absolute -left-full;
+  }
+
+  .tab-panel {
+    @apply hidden;
+  }
+
+  /* Logic for 2 tabs at most */
+  .tabset > input:first-child:checked ~ .tab-panels > .tab-panel:first-child,
+  .tabset > input:nth-child(3):checked ~ .tab-panels > .tab-panel:nth-child(2) {
+    @apply block;
+  }
+
+  /* Styling */
+  .tabset > label {
+    @apply relative inline-block w-full px-4 py-3 text-center cursor-pointer opacity-70 hover:opacity-100;
+  }
+
+  .tabset > input:checked + label::after {
+    @apply absolute inset-x-0 bottom-0 w-1/2 h-1 mx-auto bg-pine-700;
+    content: "";
+  }
+
+  .tabset > input:checked + label {
+    @apply font-semibold opacity-100 text-pine-700;
+  }
+
+  .tab-panels {
+    @apply col-span-2 p-6;
+  }
+}
diff --git a/app/Views/admin/_layout.php b/app/Views/admin/_layout.php
index 6a8d170667..3ca4c951ba 100644
--- a/app/Views/admin/_layout.php
+++ b/app/Views/admin/_layout.php
@@ -9,12 +9,12 @@
     <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
     <link rel="stylesheet" href="/assets/admin.css"/>
     <link rel="stylesheet" href="/assets/index.css"/>
-    <script src="/assets/admin.js" type="module" defer></script>
+    <script src="/assets/admin.js" type="module"></script>
 </head>
 
 <body class="relative bg-gray-100 holy-grail-grid">
     <div id="sidebar-backdrop" role="button" tabIndex="0" aria-label="Close" class="fixed z-50 hidden w-full h-full bg-gray-900 bg-opacity-50 md:hidden"></div>
-    <aside id="admin-sidebar" class="sticky top-0 z-50 flex flex-col w-64 max-h-screen transition duration-200 ease-in-out transform -translate-x-full bg-white border-r holy-grail-sidebar md:translate-x-0">
+    <aside id="admin-sidebar" class="sticky top-0 z-50 flex flex-col max-h-screen transition duration-200 ease-in-out transform -translate-x-full bg-white border-r w-80 holy-grail-sidebar md:translate-x-0">
         <?php if (isset($podcast)): ?>
             <?= $this->include('admin/podcast/_sidebar') ?>
         <?php else: ?>
@@ -22,16 +22,19 @@
         <?php endif; ?>
     </aside>
     <main class="overflow-hidden holy-grail-main">
-        <header class="text-white bg-gradient-to-tr from-gray-900 to-gray-800">
+        <header class="text-white bg-pine-900">
             <div class="container flex flex-wrap items-end justify-between px-2 py-10 mx-auto md:px-12 gap-y-6 gap-x-6">
                 <div class="flex flex-col">
                     <?= render_breadcrumb('text-gray-300') ?>
-                    <h1 class="text-3xl"><?= $this->renderSection(
-                        'pageTitle'
-                    ) ?></h1>
+                    <div class="flex flex-wrap items-center">
+                        <h1 class="text-3xl font-bold font-display"><?= $this->renderSection(
+                            'pageTitle',
+                        ) ?></h1>
+                        <?= $this->renderSection('headerLeft') ?>
+                    </div>
                 </div>
                 <div class="flex flex-wrap"><?= $this->renderSection(
-                    'headerRight'
+                    'headerRight',
                 ) ?></div>
             </div>
         </header>
@@ -50,6 +53,6 @@
     <button
         type="button"
         id="sidebar-toggler"
-        class="fixed bottom-0 left-0 z-50 p-3 mb-3 ml-3 text-xl transition duration-300 ease-in-out bg-white border-2 rounded-full shadow-lg focus:outline-none md:hidden hover:bg-gray-100 focus:shadow-outline"
+        class="fixed bottom-0 left-0 z-50 p-3 mb-3 ml-3 text-xl transition duration-300 ease-in-out bg-white border-2 rounded-full shadow-lg focus:outline-none md:hidden hover:bg-gray-100 focus:ring"
         style="transform: translateX(0px);"><?= icon('menu') ?></button>
 </body>
diff --git a/app/Views/admin/_sidebar.php b/app/Views/admin/_sidebar.php
index 069dc74243..59320ba18a 100644
--- a/app/Views/admin/_sidebar.php
+++ b/app/Views/admin/_sidebar.php
@@ -9,37 +9,40 @@ $navigation = [
         'icon' => 'folder-user',
         'items' => ['person-list', 'person-create'],
     ],
+    'fediverse' => [
+        'icon' => 'star-smile',
+        'items' => ['fediverse-blocked-actors', 'fediverse-blocked-domains'],
+    ],
     'users' => ['icon' => 'group', 'items' => ['user-list', 'user-create']],
     'pages' => ['icon' => 'pages', 'items' => ['page-list', 'page-create']],
 ]; ?>
 
 <a href="<?= route_to(
-    'admin'
-) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-xl">
-    <?= svg('logo-castopod', 'h-8 mr-2') ?>
-    Castopod
+    'admin',
+) ?>" class="inline-flex items-baseline px-6 py-2 mb-2 text-2xl font-semibold font-display text-pine-700">
+    <?= 'castopod' . svg('castopod-logo', 'h-5 ml-1') ?>
 </a>
 <a href="<?= route_to(
-    'home'
-) ?>" class="inline-flex items-center px-6 py-2 mb-2 text-sm underline outline-none hover:no-underline focus:shadow-outline">
+    'home',
+) ?>" class="inline-flex items-center px-6 py-2 mb-2 text-sm underline outline-none hover:no-underline focus:ring">
         <?= lang('AdminNavigation.go_to_website') ?>
         <?= icon('external-link', 'ml-2 text-gray-500') ?>
 </a>
 <nav class="flex flex-col flex-1 overflow-y-auto">
     <?php foreach ($navigation as $section => $data): ?>
     <div class="mb-4">
-        <button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button">
-            <?= icon($data['icon'], 'text-gray-500') ?>
-            <span class="ml-2"><?= lang('AdminNavigation.' . $section) ?></span>
+        <button class="inline-flex items-center w-full px-6 py-1 font-semibold text-gray-600 outline-none focus:ring" type="button">
+            <?= icon($data['icon'], 'text-gray-400 text-xl mr-3') ?>
+            <?= lang('AdminNavigation.' . $section) ?>
         </button>
-        <ul>
+        <ul class="flex flex-col">
             <?php foreach ($data['items'] as $item): ?>
-                <?php $isActive = base_url(route_to($item)) == current_url(); ?>
-            <li>
-                <a class="block py-1 pl-12 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:shadow-outline <?= $isActive
+                <?php $isActive = url_is(route_to($item)); ?>
+            <li class="inline-flex">
+                <a class="w-full py-1 pl-14 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:ring <?= $isActive
                     ? 'font-semibold text-gray-900'
                     : '' ?>" href="<?= route_to($item) ?>"><?= lang(
-    'AdminNavigation.' . $item
+    'AdminNavigation.' . $item,
 ) ?></a>
             </li>
             <?php endforeach; ?>
@@ -47,21 +50,31 @@ $navigation = [
     </div>
     <?php endforeach; ?>
 </nav>
-<div class="w-full mt-auto border-t" data-toggle="dropdown">
-    <button type="button" class="inline-flex items-center w-full px-6 py-2 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
-        <?= icon('user', 'text-gray-500 mr-2') ?>
-        <?= user()->username ?>
-        <?= icon('caret-right', 'ml-auto') ?>
-    </button>
-    <nav class="absolute z-50 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="right-end">
-        <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-            'my-account'
-        ) ?>"><?= lang('AdminNavigation.account.my-account') ?></a>
-        <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-            'change-password'
-        ) ?>"><?= lang('AdminNavigation.account.change-password') ?></a>
-        <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-            'logout'
-        ) ?>"><?= lang('AdminNavigation.account.logout') ?></a>
-    </nav>
-</div>
+<button
+type="button"
+class="inline-flex items-center w-full px-6 py-2 mt-auto border-t outline-none focus:ring"
+id="my-account-dropdown"
+data-dropdown="button"
+data-dropdown-target="my-account-dropdown-menu"
+aria-haspopup="true"
+aria-expanded="false">
+    <?= icon('user', 'text-gray-500 mr-2') ?>
+    <?= user()->username ?>
+    <?= icon('caret-right', 'ml-auto') ?>
+</button>
+<nav
+id="my-account-dropdown-menu"
+class="absolute z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow"
+aria-labelledby="my-accountDropdown"
+data-dropdown="menu"
+data-dropdown-placement="right-end">
+    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+        'my-account',
+    ) ?>"><?= lang('AdminNavigation.account.my-account') ?></a>
+    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+        'change-password',
+    ) ?>"><?= lang('AdminNavigation.account.change-password') ?></a>
+    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+        'logout',
+    ) ?>"><?= lang('AdminNavigation.account.logout') ?></a>
+</nav>
diff --git a/app/Views/admin/contributor/list.php b/app/Views/admin/contributor/list.php
index 8d55150c80..e2b3178e18 100644
--- a/app/Views/admin/contributor/list.php
+++ b/app/Views/admin/contributor/list.php
@@ -10,7 +10,7 @@
 
 <?= $this->section('headerRight') ?>
 <?= button(lang('Contributor.add'), route_to('contributor-add', $podcast->id), [
-    'variant' => 'primary',
+    'variant' => 'accent',
     'iconLeft' => 'add',
 ]) ?>
 <?= $this->endSection() ?>
diff --git a/app/Views/admin/episode/create.php b/app/Views/admin/episode/create.php
index 2c5dffda5d..37de291c8d 100644
--- a/app/Views/admin/episode/create.php
+++ b/app/Views/admin/episode/create.php
@@ -141,6 +141,53 @@
     </label>
 <?= form_fieldset_close() ?>
 
+<?= form_fieldset('', ['class' => 'flex mb-6 gap-1']) ?>
+    <legend>
+    <?= lang('Episode.form.parental_advisory.label') .
+        hint_tooltip(lang('Episode.form.parental_advisory.hint'), 'ml-1') ?>
+    </legend>
+    <?= form_radio(
+        [
+            'id' => 'undefined',
+            'name' => 'parental_advisory',
+            'class' => 'form-radio-btn',
+        ],
+        'undefined',
+        old('parental_advisory')
+            ? old('parental_advisory') === 'undefined'
+            : true
+    ) ?>
+    <label for="undefined"><?= lang(
+        'Episode.form.parental_advisory.undefined'
+    ) ?></label>
+    <?= form_radio(
+        [
+            'id' => 'clean',
+            'name' => 'parental_advisory',
+            'class' => 'form-radio-btn',
+        ],
+        'clean',
+        old('parental_advisory') ? old('parental_advisory') === 'clean' : false
+    ) ?>
+    <label for="clean"><?= lang(
+        'Episode.form.parental_advisory.clean'
+    ) ?></label>
+    <?= form_radio(
+        [
+            'id' => 'explicit',
+            'name' => 'parental_advisory',
+            'class' => 'form-radio-btn',
+        ],
+        'explicit',
+        old('parental_advisory')
+            ? old('parental_advisory') === 'explicit'
+            : false
+    ) ?>
+    <label for="explicit"><?= lang(
+        'Episode.form.parental_advisory.explicit'
+    ) ?></label>
+<?= form_fieldset_close() ?>
+
 <?= form_section_close() ?>
 
 
@@ -207,89 +254,6 @@
 ]) ?>
 <?= form_section_close() ?>
 
-<?= form_section(
-    lang('Episode.form.publication_section_title'),
-    lang('Episode.form.publication_section_subtitle')
-) ?>
-
-<?= form_label(
-    lang('Episode.form.publication_date'),
-    'publication_date',
-    [],
-    lang('Episode.form.publication_date_hint')
-) ?>
-<div class="flex mb-4" data-picker="datetime">
-    <?= form_input([
-        'id' => 'publication_date',
-        'name' => 'publication_date',
-        'class' => 'form-input rounded-r-none flex-1',
-        'value' => old('publication_date', date('Y-m-d H:i')),
-        'data-input' => '',
-    ]) ?>
-    <button
-        class="p-3 bg-green-100 border border-l-0 focus:outline-none rounded-r-md hover:bg-green-200 focus:shadow-outline"
-        type="button"
-        title="<?= lang('Episode.form.publication_date_clear') ?>"
-        data-clear=""><?= icon('close') ?></button>
-</div>
-
-<?= form_fieldset('', ['class' => 'flex mb-6 gap-1']) ?>
-    <legend>
-    <?= lang('Episode.form.parental_advisory.label') .
-        hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?>
-    </legend>
-    <?= form_radio(
-        [
-            'id' => 'undefined',
-            'name' => 'parental_advisory',
-            'class' => 'form-radio-btn',
-        ],
-        'undefined',
-        old('parental_advisory')
-            ? old('parental_advisory') === 'undefined'
-            : true
-    ) ?>
-    <label for="undefined"><?= lang(
-        'Episode.form.parental_advisory.undefined'
-    ) ?></label>
-    <?= form_radio(
-        [
-            'id' => 'clean',
-            'name' => 'parental_advisory',
-            'class' => 'form-radio-btn',
-        ],
-        'clean',
-        old('parental_advisory') ? old('parental_advisory') === 'clean' : false
-    ) ?>
-    <label for="clean"><?= lang(
-        'Episode.form.parental_advisory.clean'
-    ) ?></label>
-    <?= form_radio(
-        [
-            'id' => 'explicit',
-            'name' => 'parental_advisory',
-            'class' => 'form-radio-btn',
-        ],
-        'explicit',
-        old('parental_advisory')
-            ? old('parental_advisory') === 'explicit'
-            : false
-    ) ?>
-    <label for="explicit"><?= lang(
-        'Episode.form.parental_advisory.explicit'
-    ) ?></label>
-<?= form_fieldset_close() ?>
-
-<?= form_switch(
-    lang('Episode.form.block') .
-        hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'),
-    ['id' => 'block', 'name' => 'block'],
-    'yes',
-    old('block', false)
-) ?>
-
-<?= form_section_close() ?>
-
 <?= form_section(
     lang('Episode.form.additional_files_section_title'),
     lang('Episode.form.additional_files_section_subtitle')
@@ -343,6 +307,14 @@
 ]) ?>
 <?= form_section_close() ?>
 
+<?= form_switch(
+    lang('Episode.form.block') .
+        hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'),
+    ['id' => 'block', 'name' => 'block'],
+    'yes',
+    old('block', false)
+) ?>
+
 <?= button(
     lang('Episode.form.submit_create'),
     null,
diff --git a/app/Views/admin/episode/edit.php b/app/Views/admin/episode/edit.php
index 710cda7eab..59d6678e46 100644
--- a/app/Views/admin/episode/edit.php
+++ b/app/Views/admin/episode/edit.php
@@ -16,7 +16,6 @@
     'class' => 'flex flex-col',
 ]) ?>
 <?= csrf_field() ?>
-<?= form_hidden('client_timezone', 'UTC') ?>
 
 <?= form_section(
     lang('Episode.form.info_section_title'),
@@ -144,6 +143,55 @@
     </label>
 <?= form_fieldset_close() ?>
 
+<?= form_fieldset('', ['class' => 'mb-6']) ?>
+    <legend>
+    <?= lang('Episode.form.parental_advisory.label') .
+        hint_tooltip(lang('Episode.form.parental_advisory.hint'), 'ml-1') ?>
+    </legend>
+    <?= form_radio(
+        [
+            'id' => 'undefined',
+            'name' => 'parental_advisory',
+            'class' => 'form-radio-btn',
+        ],
+        'undefined',
+        old('parental_advisory')
+            ? old('parental_advisory') === 'undefined'
+            : $episode->parental_advisory === null
+    ) ?>
+    <label for="undefined"><?= lang(
+        'Episode.form.parental_advisory.undefined'
+    ) ?></label>
+    <?= form_radio(
+        [
+            'id' => 'clean',
+            'name' => 'parental_advisory',
+            'class' => 'form-radio-btn',
+        ],
+        'clean',
+        old('parental_advisory')
+            ? old('parental_advisory') === 'clean'
+            : $episode->parental_advisory === 'clean'
+    ) ?>
+    <label for="clean"><?= lang(
+        'Episode.form.parental_advisory.clean'
+    ) ?></label>
+    <?= form_radio(
+        [
+            'id' => 'explicit',
+            'name' => 'parental_advisory',
+            'class' => 'form-radio-btn',
+        ],
+        'explicit',
+        old('parental_advisory')
+            ? old('parental_advisory') === 'explicit'
+            : $episode->parental_advisory === 'explicit'
+    ) ?>
+    <label for="explicit"><?= lang(
+        'Episode.form.parental_advisory.explicit'
+    ) ?></label>
+<?= form_fieldset_close() ?>
+
 <?= form_section_close() ?>
 
 
@@ -210,95 +258,7 @@
 ]) ?>
 <?= form_section_close() ?>
 
-<?= form_section(
-    lang('Episode.form.publication_section_title'),
-    lang('Episode.form.publication_section_subtitle')
-) ?>
-
-<?= form_label(
-    lang('Episode.form.publication_date'),
-    'publication_date',
-    [],
-    lang('Episode.form.publication_date_hint')
-) ?>
-<div class="flex mb-4" data-picker="datetime">
-    <?= form_input([
-        'id' => 'publication_date',
-        'name' => 'publication_date',
-        'class' => 'form-input rounded-r-none flex-1',
-        'value' => old(
-            'publication_date',
-            $episode->published_at
-                ? $episode->published_at->format('Y-m-d H:i')
-                : ''
-        ),
-        'data-input' => '',
-    ]) ?>
-    <button
-        class="p-3 bg-green-100 border border-l-0 focus:outline-none rounded-r-md hover:bg-green-200 focus:shadow-outline"
-        type="button"
-        title="<?= lang('Episode.form.publication_date_clear') ?>"
-        data-clear=""><?= icon('close') ?></button>
-</div>
-
-<?= form_fieldset('', ['class' => 'mb-6']) ?>
-    <legend>
-    <?= lang('Episode.form.parental_advisory.label') .
-        hint_tooltip(lang('Episode.form.type.hint'), 'ml-1') ?>
-    </legend>
-    <?= form_radio(
-        [
-            'id' => 'undefined',
-            'name' => 'parental_advisory',
-            'class' => 'form-radio-btn',
-        ],
-        'undefined',
-        old('parental_advisory')
-            ? old('parental_advisory') === 'undefined'
-            : $episode->parental_advisory === null
-    ) ?>
-    <label for="undefined"><?= lang(
-        'Episode.form.parental_advisory.undefined'
-    ) ?></label>
-    <?= form_radio(
-        [
-            'id' => 'clean',
-            'name' => 'parental_advisory',
-            'class' => 'form-radio-btn',
-        ],
-        'clean',
-        old('parental_advisory')
-            ? old('parental_advisory') === 'clean'
-            : $episode->parental_advisory === 'clean'
-    ) ?>
-    <label for="clean"><?= lang(
-        'Episode.form.parental_advisory.clean'
-    ) ?></label>
-    <?= form_radio(
-        [
-            'id' => 'explicit',
-            'name' => 'parental_advisory',
-            'class' => 'form-radio-btn',
-        ],
-        'explicit',
-        old('parental_advisory')
-            ? old('parental_advisory') === 'explicit'
-            : $episode->parental_advisory === 'explicit'
-    ) ?>
-    <label for="explicit"><?= lang(
-        'Episode.form.parental_advisory.explicit'
-    ) ?></label>
-<?= form_fieldset_close() ?>
-
-<?= form_switch(
-    lang('Episode.form.block') .
-        hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'),
-    ['id' => 'block', 'name' => 'block'],
-    'yes',
-    old('block', $episode->is_blocked)
-) ?>
 
-<?= form_section_close() ?>
 <?= form_section(
     lang('Episode.form.additional_files_section_title'),
     lang('Episode.form.additional_files_section_subtitle', [
@@ -407,6 +367,14 @@
 ]) ?>
 <?= form_section_close() ?>
 
+<?= form_switch(
+    lang('Episode.form.block') .
+        hint_tooltip(lang('Episode.form.block_hint'), 'ml-1'),
+    ['id' => 'block', 'name' => 'block'],
+    'yes',
+    old('block', $episode->is_blocked)
+) ?>
+
 <?= button(
     lang('Episode.form.submit_edit'),
     null,
diff --git a/app/Views/admin/episode/embeddable_player.php b/app/Views/admin/episode/embeddable_player.php
index 2144580e1e..ea5c409bbc 100644
--- a/app/Views/admin/episode/embeddable_player.php
+++ b/app/Views/admin/episode/embeddable_player.php
@@ -10,57 +10,56 @@
 
 <?= $this->section('content') ?>
 
-    <?= form_label(lang('Episode.embeddable_player.label'), 'label') ?>
+<?= form_label(lang('Episode.embeddable_player.label'), 'label') ?>
 
-    <div class="flex w-full mt-6 mb-6">
-        <?php foreach ($themes as $themeKey => $theme): ?>
-            <button style="<?= $theme[
-                'style'
-            ] ?>" class="w-12 h-12 mr-1 border-2 border-gray-400 rounded-lg hover:border-white" title="<?= lang("Episode.embeddable_player.{$themeKey}") ?>" data-type="theme-picker" data-url="<?= $episode->getEmbeddablePlayer(
-    $themeKey
+<div class="flex w-full mt-6 mb-6">
+    <?php foreach ($themes as $themeKey => $theme): ?>
+        <button style="<?= $theme[
+            'style'
+        ] ?>" class="w-12 h-12 mr-1 border-2 border-gray-400 rounded-lg hover:border-white" title="<?= lang(
+    "Episode.embeddable_player.{$themeKey}",
+) ?>" data-type="theme-picker" data-url="<?= $episode->getEmbeddablePlayer(
+    $themeKey,
 ) ?>"></button>
-        <?php endforeach; ?>
-    </div>
+    <?php endforeach; ?>
+</div>
 
-    <iframe name="embeddable_player" id="embeddable_player" width="100%" height="280" frameborder="0" scrolling="no" style="width: 100%; height: 280;  overflow: hidden;" src="<?= $episode->embeddable_player ?>"></iframe>
+<iframe name="embeddable_player" id="embeddable_player" class="w-full h-48 max-w-xl" frameborder="0" scrolling="no" style="width: 100%;  overflow: hidden;" src="<?= $episode->embeddable_player ?>"></iframe>
 
-    <div class="flex items-center w-full mt-8">
-        <?= form_textarea(
-            [
-                'id' => 'iframe',
-                'name' => 'iframe',
-                'class' => 'form-textarea w-full h-20 mr-2',
-            ],
-            "<iframe width=\"100%\" height=\"280\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: 280px; overflow: hidden;\" src=\"{$episode->embeddable_player}\"></iframe>"
-        ) ?>
-        <?= icon_button(
-            'file-copy',
-            lang('Episode.embeddable_player.clipboard_iframe'),
-            null,
-            ['variant' => 'default'],
-            [
-                'data-type' => 'clipboard-copy',
-                'data-clipboard-target' => 'iframe',
-            ]
-        ) ?>
-    </div>
+<div class="flex items-center w-full mt-8">
+    <?= form_textarea(
+        [
+            'id' => 'iframe',
+            'name' => 'iframe',
+            'class' => 'form-textarea w-full h-20 mr-2',
+        ],
+        "<iframe width=\"100%\" height=\"280\" frameborder=\"0\" scrolling=\"no\" style=\"width: 100%; height: 280px; overflow: hidden;\" src=\"{$episode->embeddable_player}\"></iframe>",
+    ) ?>
+    <?= icon_button(
+        'file-copy',
+        lang('Episode.embeddable_player.clipboard_iframe'),
+        null,
+        ['variant' => 'default'],
+        ['data-type' => 'clipboard-copy', 'data-clipboard-target' => 'iframe'],
+    ) ?>
+</div>
 
-    <div class="flex items-center w-full mt-4">
-       <?= form_textarea(
-           [
-               'id' => 'url',
-               'name' => 'url',
-               'class' => 'form-textarea w-full h-10 mr-2',
-           ],
-           $episode->embeddable_player
-       ) ?>
-        <?= icon_button(
-            'file-copy',
-            lang('Episode.embeddable_player.clipboard_url'),
-            null,
-            ['variant' => 'default'],
-            ['data-type' => 'clipboard-copy', 'data-clipboard-target' => 'url']
-        ) ?>
-    </div>
+<div class="flex items-center w-full mt-4">
+    <?= form_textarea(
+        [
+            'id' => 'url',
+            'name' => 'url',
+            'class' => 'form-textarea w-full h-10 mr-2',
+        ],
+        $episode->embeddable_player,
+    ) ?>
+    <?= icon_button(
+        'file-copy',
+        lang('Episode.embeddable_player.clipboard_url'),
+        null,
+        ['variant' => 'default'],
+        ['data-type' => 'clipboard-copy', 'data-clipboard-target' => 'url'],
+    ) ?>
+</div>
 
 <?= $this->endSection() ?>
diff --git a/app/Views/admin/episode/list.php b/app/Views/admin/episode/list.php
index fc0f61e373..ef0650c250 100644
--- a/app/Views/admin/episode/list.php
+++ b/app/Views/admin/episode/list.php
@@ -11,12 +11,10 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('headerRight') ?>
-<?= button(
-    lang('Episode.create'),
-    route_to('episode-create', $podcast->id),
-
-    ['variant' => 'primary', 'iconLeft' => 'add']
-) ?>
+<?= button(lang('Episode.create'), route_to('episode-create', $podcast->id), [
+    'variant' => 'accent',
+    'iconLeft' => 'add',
+]) ?>
 <?= $this->endSection() ?>
 
 
@@ -39,62 +37,74 @@
                         <a class="flex-1 text-sm hover:underline" href="<?= route_to(
                             'episode-view',
                             $podcast->id,
-                            $episode->id
+                            $episode->id,
                         ) ?>">
-                            <h2 class="inline-flex justify-between w-full font-bold leading-none group">
+                            <h2 class="inline-flex justify-between w-full font-semibold leading-none group">
                                 <span class="mr-1 group-hover:underline"><?= $episode->title ?></span>
                                 <?= episode_numbering(
                                     $episode->number,
                                     $episode->season_number,
-                                    'text-xs font-bold text-gray-600',
-                                    true
+                                    'text-xs font-semibold text-gray-600',
+                                    true,
                                 ) ?>
                             </h2>
                         </a>
-                        <div class="relative" data-toggle="dropdown">
-                            <button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
-                                <?= icon('more') ?>
-                            </button>
-                            <nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="bottom-end" data-popper-offset-x="0" data-popper-offset-y="-24" >
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'episode-edit',
-                                        $podcast->id,
-                                        $episode->id
-                                    ) ?>"><?= lang('Episode.edit') ?></a>
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'embeddable-player-add',
-                                        $podcast->id,
-                                        $episode->id
-                                    ) ?>"><?= lang(
-    'Episode.embeddable_player.add'
+                        <button
+                        id="more-dropdown-<?= $episode->id ?>"
+                        type="button"
+                        class="inline-flex items-center p-1 outline-none focus:ring"
+                        data-dropdown="button"
+                        data-dropdown-target="more-dropdown-<?= $episode->id ?>-menu"
+                        aria-haspopup="true"
+                        aria-expanded="false">
+                            <?= icon('more') ?>
+                        </button>
+                        <nav
+                            id="more-dropdown-<?= $episode->id ?>-menu"
+                            class="flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow"
+                            aria-labelledby="more-dropdown-<?= $episode->id ?>"
+                            data-dropdown="menu"
+                            data-dropdown-placement="bottom-start"
+                            data-dropdown-offset-x="0"
+                            data-dropdown-offset-y="-24">
+                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                    'episode-edit',
+                                    $podcast->id,
+                                    $episode->id,
+                                ) ?>"><?= lang('Episode.edit') ?></a>
+                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                    'embeddable-player-add',
+                                    $podcast->id,
+                                    $episode->id,
+                                ) ?>"><?= lang(
+    'Episode.embeddable_player.add',
 ) ?></a>
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'episode-person-manage',
-                                        $podcast->id,
-                                        $episode->id
-                                    ) ?>"><?= lang('Person.persons') ?></a>
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'soundbites-edit',
-                                        $podcast->id,
-                                        $episode->id
-                                    ) ?>"><?= lang('Episode.soundbites') ?></a>
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'episode',
-                                        $podcast->name,
-                                        $episode->slug
-                                    ) ?>"><?= lang('Episode.go_to_page') ?></a>
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'episode-delete',
-                                        $podcast->id,
-                                        $episode->id
-                                    ) ?>"><?= lang('Episode.delete') ?></a>
-                            </nav>
-                        </div>
+                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                    'episode-person-manage',
+                                    $podcast->id,
+                                    $episode->id,
+                                ) ?>"><?= lang('Person.persons') ?></a>
+                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                    'soundbites-edit',
+                                    $podcast->id,
+                                    $episode->id,
+                                ) ?>"><?= lang('Episode.soundbites') ?></a>
+                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                    'episode',
+                                    $podcast->name,
+                                    $episode->slug,
+                                ) ?>"><?= lang('Episode.go_to_page') ?></a>
+                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                    'episode-delete',
+                                    $podcast->id,
+                                    $episode->id,
+                                ) ?>"><?= lang('Episode.delete') ?></a>
+                        </nav>
                     </div>
                     <div class="mb-2 text-xs">
                         <?= publication_pill(
                             $episode->published_at,
-                            $episode->publication_status
+                            $episode->publication_status,
                         ) ?>
                         <span class="mx-1">•</span>
                         <time datetime="PT<?= $episode->enclosure_duration ?>S">
diff --git a/app/Views/admin/episode/publish.php b/app/Views/admin/episode/publish.php
new file mode 100644
index 0000000000..f491092b3b
--- /dev/null
+++ b/app/Views/admin/episode/publish.php
@@ -0,0 +1,171 @@
+<?= $this->extend('admin/_layout') ?>
+
+<?= $this->section('title') ?>
+<?= lang('Episode.publish') ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('pageTitle') ?>
+<?= lang('Episode.publish') ?>
+<?= $this->endSection() ?>
+
+
+<?= $this->section('content') ?>
+
+<?= form_open(route_to('episode-publish', $podcast->id, $episode->id), [
+    'method' => 'post',
+    'class' => 'flex flex-col max-w-xl items-start',
+]) ?>
+<?= csrf_field() ?>
+<?= form_hidden('client_timezone', 'UTC') ?>
+
+
+<label for="message" class="text-lg font-semibold"><?= lang(
+    'Episode.publish_form.note',
+) . hint_tooltip(lang('Episode.publish_form.note_hint'), 'ml-1') ?></label>
+<div class="mb-8 overflow-hidden bg-white shadow-md rounded-xl">
+    <div class="flex px-4 py-3">
+        <img src="<?= $podcast->actor->avatar_image_url ?>" alt="<?= $podcast
+    ->actor->display_name ?>" class="w-12 h-12 mr-4 rounded-full"/>
+        <p class="flex items-baseline min-w-0">
+            <span class="mr-2 font-semibold truncate"><?= $podcast->actor
+                ->display_name ?></span>
+            <span class="text-sm text-gray-500 truncate">@<?= $podcast->actor
+                ->username ?></span>
+        </p>
+    </div>
+    <div class="px-4 mb-2">
+        <?= form_textarea(
+            [
+                'id' => 'message',
+                'name' => 'message',
+                'class' => 'form-textarea min-w-0 w-full',
+                'required' => 'required',
+                'placeholder' => 'Write your message...',
+            ],
+            old('message', '', false),
+            ['rows' => 2],
+        ) ?>
+    </div>
+    <div class="flex">
+        <img
+        src="<?= $episode->image->thumbnail_url ?>"
+        alt="<?= $episode->title ?>" class="w-24 h-24"/>
+        <div class="flex flex-col flex-1">
+            <a href="<?= $episode->link ?>" class="flex-1 px-4 py-2 bg-gray-100">
+                <div class="flex items-baseline">
+                    <span class="flex-1 w-0 mr-2 text-sm font-semibold truncate"><?= $episode->title ?></span>
+                    <?= episode_numbering(
+                        $episode->number,
+                        $episode->season_number,
+                        'text-xs font-semibold text-gray-600',
+                        true,
+                    ) ?>
+                </div>
+                <div class="text-xs text-gray-600">
+                    <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                        <?= format_duration($episode->enclosure_duration) ?>
+                    </time>
+                </div>
+            </a>
+            <audio controls preload="none" class="w-full mt-auto">
+                <source
+                src="<?= $episode->enclosure_web_url ?>"
+                type="<?= $episode->enclosure_mimetype ?>">
+                Your browser does not support the audio tag.
+            </audio>
+        </div>
+    </div>
+    <footer class="flex justify-around px-6 py-3">
+        <span class="inline-flex items-center"><?= icon(
+            'chat',
+            'text-xl mr-1 text-gray-400',
+        ) . '0' ?></span>
+        <span class="inline-flex items-center"><?= icon(
+            'repeat',
+            'text-xl mr-1 text-gray-400',
+        ) . '0' ?></span>
+        <span class="inline-flex items-center"><?= icon(
+            'heart',
+            'text-xl mr-1 text-gray-400',
+        ) . '0' ?></span>
+    </footer>
+</div>
+
+<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
+    <legend class="text-lg font-semibold"><?= lang(
+        'Episode.publish_form.publication_date',
+    ) ?></legend>
+    <label for="now" class="inline-flex items-center">
+    <?= form_radio(
+        [
+            'id' => 'now',
+            'name' => 'publication_method',
+            'class' => 'text-pine-700',
+        ],
+        'now',
+        old('publication_method') ? old('publish') === 'now' : true,
+    ) ?>
+        <span class="ml-2"><?= lang(
+            'Episode.publish_form.publication_method.now',
+        ) ?></span>
+    </label>
+    <div class="inline-flex flex-wrap items-center mb-4 radio-toggler">
+        <?= form_radio(
+            [
+                'id' => 'schedule',
+                'name' => 'publication_method',
+                'class' => 'text-pine-700',
+            ],
+            'schedule',
+            old('publication_method')
+                ? old('publication_method') === 'schedule'
+                : false,
+        ) ?>
+        <label for="schedule" class="ml-2"><?= lang(
+            'Episode.publish_form.publication_method.schedule',
+        ) ?></label>
+        <div class="w-full mt-2 radio-toggler-element">
+            <?= form_label(
+                lang('Episode.publish_form.scheduled_publication_date'),
+                'scheduled_publication_date',
+                [],
+                lang('Episode.publish_form.scheduled_publication_date_hint'),
+            ) ?>
+            <div class="flex mb-4" data-picker="datetime">
+                <?= form_input([
+                    'id' => 'scheduled_publication_date',
+                    'name' => 'scheduled_publication_date',
+                    'class' => 'form-input rounded-r-none flex-1',
+                    'value' => old('scheduled_publication_date', ''),
+                    'data-input' => '',
+                ]) ?>
+                <button
+                    class="p-3 border border-l-0 border-gray-500 bg-pine-100 focus:outline-none rounded-r-md hover:bg-pine-200 focus:ring"
+                    type="button"
+                    title="<?= lang(
+                        'Episode.publish_form.scheduled_publication_date_clear',
+                    ) ?>"
+                    data-clear=""><?= icon('close') ?></button>
+            </div>
+        </div>
+    </div>
+<?= form_fieldset_close() ?>
+
+<div class="self-end">
+<?= anchor(
+    route_to('episode-view', $podcast->id, $episode->id),
+    lang('Common.cancel'),
+    ['class' => 'font-semibold mr-4'],
+) ?>
+
+<?= button(
+    lang('Episode.publish_form.submit'),
+    null,
+    ['variant' => 'primary'],
+    ['type' => 'submit'],
+) ?>
+</div>
+
+<?= form_close() ?>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/admin/episode/publish_edit.php b/app/Views/admin/episode/publish_edit.php
new file mode 100644
index 0000000000..64246aef0d
--- /dev/null
+++ b/app/Views/admin/episode/publish_edit.php
@@ -0,0 +1,186 @@
+<?= $this->extend('admin/_layout') ?>
+
+<?= $this->section('title') ?>
+<?= lang('Episode.publish') ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('pageTitle') ?>
+<?= lang('Episode.publish') ?>
+<?= $this->endSection() ?>
+
+
+<?= $this->section('content') ?>
+
+<?= form_open(route_to('episode-publish_edit', $podcast->id, $episode->id), [
+    'method' => 'post',
+    'class' => 'flex flex-col max-w-xl items-start',
+]) ?>
+<?= csrf_field() ?>
+<?= form_hidden('client_timezone', 'UTC') ?>
+<?= form_hidden('note_id', $note->id) ?>
+
+
+<label for="message" class="text-lg font-semibold"><?= lang(
+    'Episode.publish_form.note',
+) . hint_tooltip(lang('Episode.publish_form.note_hint'), 'ml-1') ?></label>
+<div class="mb-8 overflow-hidden bg-white shadow-md rounded-xl">
+    <div class="flex px-4 py-3">
+    <img src="<?= $podcast->actor->avatar_image_url ?>" alt="<?= $podcast->actor
+    ->display_name ?>" class="w-12 h-12 mr-4 rounded-full"/>
+        <div class="flex flex-col min-w-0">
+            <p class="flex items-baseline min-w-0">
+                <span class="mr-2 font-semibold truncate"><?= $podcast->actor
+                    ->display_name ?></span>
+                <span class="text-sm text-gray-500 truncate">@<?= $podcast
+                    ->actor->username ?></span>
+            </p>
+            <time class="text-xs text-gray-500" itemprop="published" datetime="<?= $note->published_at->format(
+                DateTime::ATOM,
+            ) ?>" title="<?= $note->published_at ?>"><?= lang(
+    'Common.mediumDate',
+    [$note->published_at],
+) ?></time>
+        </div>
+    </div>
+    <div class="px-4 mb-2">
+        <?= form_textarea(
+            [
+                'id' => 'message',
+                'name' => 'message',
+                'class' => 'form-textarea',
+                'required' => 'required',
+                'placeholder' => 'Write your message...',
+            ],
+            old('message', $note->message, false),
+            ['rows' => 2],
+        ) ?>
+    </div>
+    <div class="flex">
+        <img src="<?= $episode->image
+            ->thumbnail_url ?>" alt="<?= $episode->title ?>" class="w-24 h-24" />
+        <div class="flex flex-col flex-1">
+            <a href="<?= $episode->link ?>" class="flex-1 px-4 py-2 bg-gray-100">
+                <div class="flex items-baseline">
+                    <span class="flex-1 w-0 mr-2 text-sm font-semibold truncate"><?= $episode->title ?></span>
+                    <?= episode_numbering(
+                        $episode->number,
+                        $episode->season_number,
+                        'text-xs font-semibold text-gray-600',
+                        true,
+                    ) ?>
+                </div>
+                <div class="text-xs text-gray-600">
+                    <time itemprop="published" datetime="<?= $episode->published_at->format(
+                        DateTime::ATOM,
+                    ) ?>" title="<?= $episode->published_at ?>">
+                        <?= lang('Common.mediumDate', [
+                            $episode->published_at,
+                        ]) ?>
+                    </time>
+                    <span class="mx-1">•</span>
+                    <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                        <?= format_duration($episode->enclosure_duration) ?>
+                    </time>
+                </div>
+            </a>
+            <audio controls preload="none" class="w-full mt-auto">
+                <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_mimetype ?>">
+                Your browser does not support the audio tag.
+            </audio>
+        </div>
+    </div>
+    <footer class="flex justify-around px-6 py-3">
+        <span class="inline-flex items-center"><?= icon(
+            'chat',
+            'text-xl mr-1 text-gray-400',
+        ) . '0' ?></span>
+        <span class="inline-flex items-center"><?= icon(
+            'repeat',
+            'text-xl mr-1 text-gray-400',
+        ) . '0' ?></span>
+        <span class="inline-flex items-center"><?= icon(
+            'heart',
+            'text-xl mr-1 text-gray-400',
+        ) . '0' ?></span>
+    </footer>
+</div>
+
+<?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
+<legend class="text-lg font-semibold"><?= lang(
+    'Episode.publish_form.publication_date',
+) ?></legend>
+<label for="now" class="inline-flex items-center">
+    <?= form_radio(
+        [
+            'id' => 'now',
+            'name' => 'publication_method',
+            'class' => 'text-pine-700',
+        ],
+        'now',
+        old('publication_method') ? old('publish') === 'now' : false,
+    ) ?>
+    <span class="ml-2"><?= lang(
+        'Episode.publish_form.publication_method.now',
+    ) ?></span>
+</label>
+<div class="inline-flex flex-wrap items-center mb-4 radio-toggler">
+    <?= form_radio(
+        [
+            'id' => 'schedule',
+            'name' => 'publication_method',
+            'class' => 'text-pine-700',
+        ],
+        'schedule',
+        old('publication_method')
+            ? old('publication_method') === 'schedule'
+            : true,
+    ) ?>
+    <label for="schedule" class="ml-2"><?= lang(
+        'Episode.publish_form.publication_method.schedule',
+    ) ?></label>
+    <div class="w-full mt-2 radio-toggler-element">
+        <?= form_label(
+            lang('Episode.publish_form.scheduled_publication_date'),
+            'scheduled_publication_date',
+            [],
+            lang('Episode.publish_form.scheduled_publication_date_hint'),
+        ) ?>
+        <div class="flex mb-4" data-picker="datetime">
+            <?= form_input([
+                'id' => 'scheduled_publication_date',
+                'name' => 'scheduled_publication_date',
+                'class' => 'form-input rounded-r-none flex-1',
+                'value' => old(
+                    'scheduled_publication_date',
+                    $episode->published_at,
+                ),
+                'data-input' => '',
+            ]) ?>
+            <button class="p-3 border border-l-0 border-gray-500 bg-pine-100 focus:outline-none rounded-r-md hover:bg-pine-200 focus:ring" type="button" aria-label="<?= lang(
+                'Episode.publish_form.scheduled_publication_date_clear',
+            ) ?>" title="<?= lang(
+    'Episode.publish_form.scheduled_publication_date_clear',
+) ?>" data-clear=""><?= icon('close') ?></button>
+        </div>
+    </div>
+</div>
+<?= form_fieldset_close() ?>
+
+<div class="self-end">
+    <?= anchor(
+        route_to('episode-view', $podcast->id, $episode->id),
+        lang('Common.cancel'),
+        ['class' => 'font-semibold mr-4'],
+    ) ?>
+
+    <?= button(
+        lang('Episode.publish_form.submit_edit'),
+        null,
+        ['variant' => 'primary'],
+        ['type' => 'submit'],
+    ) ?>
+</div>
+
+<?= form_close() ?>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/admin/episode/unpublish.php b/app/Views/admin/episode/unpublish.php
new file mode 100644
index 0000000000..829808136e
--- /dev/null
+++ b/app/Views/admin/episode/unpublish.php
@@ -0,0 +1,53 @@
+<?= $this->extend('admin/_layout') ?>
+
+<?= $this->section('title') ?>
+<?= lang('Episode.unpublish') ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('pageTitle') ?>
+<?= lang('Episode.unpublish') ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+
+<?= form_open(route_to('episode-unpublish', $podcast->id, $episode->id), [
+    'class' => 'flex flex-col max-w-xl mx-auto',
+]) ?>
+
+<p class="flex max-w-xl p-2 mb-4 font-semibold text-red-900 bg-red-100 border border-red-300"><?= icon(
+    'alert',
+    'mr-4 text-2xl flex-shrink-0 text-red-500',
+) . lang('Episode.unpublish_form.disclaimer') ?></p>
+
+<label for="understand" class="inline-flex items-center mb-4">
+    <?= form_checkbox(
+        [
+            'id' => 'understand',
+            'name' => 'understand',
+            'class' => 'text-pine-700',
+            'required' => 'required',
+        ],
+        'yes',
+        old('understand', false),
+    ) ?>
+    <span class="ml-2"><?= lang('Episode.unpublish_form.understand') ?></span>
+</label>
+
+<div class="self-end">
+<?= button(
+    lang('Common.cancel'),
+    route_to('episode-view', $podcast->id, $episode->id),
+) ?>
+
+<?= button(
+    lang('Episode.unpublish_form.submit'),
+    null,
+    ['variant' => 'danger'],
+    ['type' => 'submit'],
+) ?>
+</div>
+
+
+<?= form_close() ?>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/admin/episode/view.php b/app/Views/admin/episode/view.php
index bc2dfd4641..cd90f1cc00 100644
--- a/app/Views/admin/episode/view.php
+++ b/app/Views/admin/episode/view.php
@@ -5,20 +5,30 @@
 <?= $this->endSection() ?>
 
 <?= $this->section('pageTitle') ?>
-<?= $episode->title .
-    publication_pill(
-        $episode->published_at,
-        $episode->publication_status,
-        'text-sm ml-2 align-middle'
-    ) ?>
-    <?= location_link(
-        $episode->location_name,
-        $episode->location_geo,
-        $episode->location_osmid,
-        'ml-2'
-    ) ?>
+<?= $episode->title ?>    
+<?= $this->endSection() ?>
+
+<?= $this->section('headerLeft') ?>
+<?= publication_pill(
+    $episode->published_at,
+    $episode->publication_status,
+    'text-sm ml-2 align-middle',
+) ?>
 <?= $this->endSection() ?>
 
+<?= $this->section('headerRight') ?>
+<?= publication_button(
+    $podcast->id,
+    $episode->id,
+    $episode->publication_status,
+    lang('Episode.publish'),
+    route_to('episode-publish', $podcast->id, $episode->id),
+    ['variant' => 'accent', 'iconLeft' => 'upload'],
+    ['class' => 'mr-2'],
+) ?>
+<?= $this->endSection() ?>
+
+
 <?= $this->section('content') ?>
    
 <div class="flex flex-wrap">
@@ -37,22 +47,28 @@
         <?= button(
             lang('Episode.edit'),
             route_to('episode-edit', $podcast->id, $episode->id),
-            ['variant' => 'info', 'iconLeft' => 'edit']
+            ['variant' => 'info', 'iconLeft' => 'edit'],
         ) ?>
         <?= button(
             lang('Episode.go_to_page'),
             route_to('episode', $podcast->name, $episode->slug),
-            ['variant' => 'secondary', 'iconLeft' => 'external-link']
+            ['variant' => 'secondary', 'iconLeft' => 'external-link'],
         ) ?>
         <?= button(
             lang('Episode.delete'),
             route_to('episode-delete', $podcast->id, $episode->id),
-            ['variant' => 'danger', 'iconLeft' => 'delete-bin']
+            ['variant' => 'danger', 'iconLeft' => 'delete-bin'],
         ) ?>
         </div>
     </div>
 
     <section class="w-full max-w-sm prose">
+    <?= location_link(
+        $episode->location_name,
+        $episode->location_geo,
+        $episode->location_osmid,
+        'text-sm',
+    ) ?>
     <?= $episode->description_html ?>
     </section>
 </div>
@@ -62,19 +78,19 @@
         lang('Episode.embeddable_player.add'),
         route_to('embeddable-player-add', $podcast->id, $episode->id),
         ['variant' => 'info', 'iconLeft' => 'movie'],
-        ['class' => 'mb-4']
+        ['class' => 'mb-4'],
     ) ?>
     <?= button(
         lang('Episode.soundbites_form.title'),
         route_to('soundbites-edit', $podcast->id, $episode->id),
         ['variant' => 'info', 'iconLeft' => 'edit'],
-        ['class' => 'mb-4']
+        ['class' => 'mb-4'],
     ) ?>
     <?= button(
         lang('Person.episode_form.title'),
         route_to('episode-person-manage', $podcast->id, $episode->id),
         ['variant' => 'info', 'iconLeft' => 'folder-user'],
-        ['class' => 'mb-4']
+        ['class' => 'mb-4'],
     ) ?>
     <?php if (count($episode->soundbites) > 0): ?>
     <?= data_table(
@@ -93,7 +109,7 @@
                             'data-soundbite-start-time' =>
                                 $soundbite->start_time,
                             'data-soundbite-duration' => $soundbite->duration,
-                        ]
+                        ],
                     );
                 },
             ],
@@ -116,7 +132,7 @@
                 },
             ],
         ],
-        $episode->soundbites
+        $episode->soundbites,
     ) ?>
     <?php endif; ?>
     </div>
@@ -128,7 +144,7 @@
         $podcast->id,
         'PodcastByEpisode',
         'ByDay',
-        $episode->id
+        $episode->id,
     ) ?>"></div>
     </div>
     
@@ -139,7 +155,7 @@
         $podcast->id,
         'PodcastByEpisode',
         'ByMonth',
-        $episode->id
+        $episode->id,
     ) ?>"></div>
     </div>
 
diff --git a/app/Views/admin/fediverse/blocked_actors.php b/app/Views/admin/fediverse/blocked_actors.php
new file mode 100644
index 0000000000..40505748e7
--- /dev/null
+++ b/app/Views/admin/fediverse/blocked_actors.php
@@ -0,0 +1,83 @@
+<?= $this->extend('admin/_layout') ?>
+
+<?= $this->section('title') ?>
+<?= lang('Fediverse.blocked_actors') ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('pageTitle') ?>
+<?= lang('Fediverse.blocked_actors') ?>
+<?= $this->endSection() ?>
+
+
+<?= $this->section('content') ?>
+
+<?= form_open(route_to('fediverse-attempt-block-actor'), [
+    'method' => 'post',
+    'class' => 'flex flex-col max-w-md mb-8',
+]) ?>
+
+<?= form_label(
+    lang('Fediverse.block_lists_form.handle'),
+    'blocked_users',
+    [],
+    lang('Fediverse.block_lists_form.handle_hint'),
+) ?>
+<?= form_input(
+    [
+        'id' => 'handle',
+        'name' => 'handle',
+        'class' => 'form-input mb-4',
+        'type' => 'text',
+    ],
+    old('handle', ''),
+) ?>
+
+<?= button(
+    lang('Fediverse.block_lists_form.submit'),
+    null,
+    ['variant' => 'primary'],
+    ['type' => 'submit', 'class' => 'self-end'],
+) ?>
+
+<?= form_close() ?>
+
+
+<?= data_table(
+    [
+        [
+            'header' => lang('Fediverse.list.actor'),
+            'cell' => function ($blockedActor) {
+                return $blockedActor->username;
+            },
+        ],
+        [
+            'header' => lang('Common.actions'),
+            'cell' => function ($blockedActor) {
+                return '<form action="' .
+                    route_to('fediverse-attempt-unblock-actor') .
+                    '" method="POST">' .
+                    '<input name="actor_id" type="hidden" value="' .
+                    $blockedActor->id .
+                    '" />' .
+                    csrf_field() .
+                    button(
+                        lang('Fediverse.list.unblock'),
+                        route_to(
+                            'fediverse-unblock-actor',
+                            $blockedActor->username,
+                        ),
+                        ['variant' => 'info', 'size' => 'small'],
+                        [
+                            'class' => 'mr-2',
+                            'type' => 'submit',
+                        ],
+                    ) .
+                    '</form>';
+            },
+        ],
+    ],
+    $blockedActors,
+) ?>
+
+
+<?= $this->endSection() ?>
diff --git a/app/Views/admin/fediverse/blocked_domains.php b/app/Views/admin/fediverse/blocked_domains.php
new file mode 100644
index 0000000000..c6a440ddd2
--- /dev/null
+++ b/app/Views/admin/fediverse/blocked_domains.php
@@ -0,0 +1,80 @@
+<?= $this->extend('admin/_layout') ?>
+
+<?= $this->section('title') ?>
+<?= lang('Fediverse.blocked_domains') ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('pageTitle') ?>
+<?= lang('Fediverse.blocked_domains') ?>
+<?= $this->endSection() ?>
+
+
+<?= $this->section('content') ?>
+
+<?= form_open(route_to('fediverse-attempt-block-domain'), [
+    'method' => 'post',
+    'class' => 'flex flex-col max-w-md mb-8',
+]) ?>
+
+<?= form_label(
+    lang('Fediverse.block_lists_form.domain'),
+    'blocked_users',
+    [],
+) ?>
+<?= form_input(
+    [
+        'id' => 'domain',
+        'name' => 'domain',
+        'class' => 'form-input mb-4',
+        'type' => 'text',
+    ],
+    old('domain', ''),
+) ?>
+
+<?= button(
+    lang('Fediverse.block_lists_form.submit'),
+    null,
+    ['variant' => 'primary'],
+    ['type' => 'submit', 'class' => 'self-end'],
+) ?>
+
+<?= form_close() ?>
+
+<?= data_table(
+    [
+        [
+            'header' => lang('Fediverse.list.actor'),
+            'cell' => function ($blockedDomain) {
+                return $blockedDomain->name;
+            },
+        ],
+        [
+            'header' => lang('Common.actions'),
+            'cell' => function ($blockedDomain) {
+                return '<form action="' .
+                    route_to('fediverse-attempt-unblock-domain') .
+                    '" method="POST">' .
+                    '<input name="domain" type="hidden" value="' .
+                    $blockedDomain->name .
+                    '" />' .
+                    csrf_field() .
+                    button(
+                        lang('Fediverse.list.unblock'),
+                        route_to(
+                            'fediverse-unblock-domain',
+                            $blockedDomain->name,
+                        ),
+                        ['variant' => 'info', 'size' => 'small'],
+                        [
+                            'class' => 'mr-2',
+                            'type' => 'submit',
+                        ],
+                    ) .
+                    '</form>';
+            },
+        ],
+    ],
+    $blockedDomains,
+) ?>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/admin/page/list.php b/app/Views/admin/page/list.php
index 1db15fd73b..745ddc5ef8 100644
--- a/app/Views/admin/page/list.php
+++ b/app/Views/admin/page/list.php
@@ -10,7 +10,7 @@
 
 <?= $this->section('headerRight') ?>
 <?= button(lang('Page.create'), route_to('page-create'), [
-    'variant' => 'primary',
+    'variant' => 'accent',
     'iconLeft' => 'add',
 ]) ?>
 <?= $this->endSection() ?>
diff --git a/app/Views/admin/page/view.php b/app/Views/admin/page/view.php
index 7a64d6f13d..029b9587a4 100644
--- a/app/Views/admin/page/view.php
+++ b/app/Views/admin/page/view.php
@@ -10,7 +10,7 @@
 
 <?= $this->section('headerRight') ?>
 <?= button(lang('Page.edit'), route_to('page-edit', $page->id), [
-    'variant' => 'primary',
+    'variant' => 'accent',
     'iconLeft' => 'add',
 ]) ?>
 <?= $this->endSection() ?>
diff --git a/app/Views/admin/podcast/_sidebar.php b/app/Views/admin/podcast/_sidebar.php
index ffa8fe3c44..5cf2139307 100644
--- a/app/Views/admin/podcast/_sidebar.php
+++ b/app/Views/admin/podcast/_sidebar.php
@@ -29,7 +29,7 @@ $podcastNavigation = [
         'items' => ['contributor-list', 'contributor-add'],
     ],
     'platforms' => [
-        'icon' => 'links',
+        'icon' => 'link',
         'items' => [
             'platforms-podcasting',
             'platforms-social',
@@ -39,11 +39,12 @@ $podcastNavigation = [
 ]; ?>
 
 <a href="<?= route_to(
-    'admin'
+    'admin',
 ) ?>" class="inline-flex items-center px-4 py-2 border-b">
-    <?= icon('arrow-left', 'mr-4') ?>
-    <?= svg('logo-castopod', 'h-8 mr-2') ?>
-    Castopod
+    <?= icon('arrow-left', 'mr-4 text-xl') ?>
+        <span class="inline-flex items-baseline text-2xl font-semibold font-display text-pine-700"> <?= 'castopod' .
+            svg('castopod-logo', 'h-5 ml-1') ?></span>
+
 </a>
 <div class="flex items-center border-b">
     <img
@@ -54,11 +55,11 @@ $podcastNavigation = [
     <div class="flex flex-col items-start flex-1 w-48 px-2">
         <span class="w-40 text-sm font-semibold truncate" title="<?= $podcast->title ?>"><?= $podcast->title ?></span>
         <a href="<?= route_to(
-            'podcast',
-            $podcast->name
-        ) ?>" class="inline-flex items-center text-xs underline outline-none hover:no-underline focus:shadow-outline"
+            'podcast-activity',
+            $podcast->name,
+        ) ?>" class="inline-flex items-center text-xs underline outline-none hover:no-underline focus:ring"
         data-toggle="tooltip" data-placement="bottom" title="<?= lang(
-            'PodcastNavigation.go_to_page'
+            'PodcastNavigation.go_to_page',
         ) ?>">@<?= $podcast->name ?>
         <?= icon('external-link', 'ml-1 text-gray-500') ?>
         </a>
@@ -67,22 +68,19 @@ $podcastNavigation = [
 <nav class="flex flex-col flex-1 py-6 overflow-y-auto">
     <?php foreach ($podcastNavigation as $section => $data): ?>
     <div class="mb-4">
-        <button class="inline-flex items-center w-full px-6 py-1 outline-none focus:shadow-outline" type="button">
-            <?= icon($data['icon'], 'text-gray-500') ?>
-            <span class="ml-2"><?= lang(
-                'PodcastNavigation.' . $section
-            ) ?></span>
+        <button class="inline-flex items-center w-full px-6 py-1 outline-none focus:ring" type="button">
+            <?= icon($data['icon'], 'text-gray-400 text-xl mr-3') .
+                lang('PodcastNavigation.' . $section) ?>
         </button>
-        <ul>
+        <ul class="flex flex-col">
             <?php foreach ($data['items'] as $item): ?>
-                <?php $isActive =
-                    base_url(route_to($item, $podcast->id)) == current_url(); ?>
-            <li>
-                <a class="block py-1 pl-12 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:shadow-outline <?= $isActive
+                <?php $isActive = url_is(route_to($item, $podcast->id)); ?>
+            <li class="inline-flex">
+                <a class="w-full py-1 pl-14 pr-2 text-sm text-gray-600 outline-none hover:text-gray-900 focus:ring <?= $isActive
                     ? 'font-semibold text-gray-900'
                     : '' ?>" href="<?= route_to(
     $item,
-    $podcast->id
+    $podcast->id,
 ) ?>"><?= lang('PodcastNavigation.' . $item) ?></a>
             </li>
             <?php endforeach; ?>
@@ -90,21 +88,32 @@ $podcastNavigation = [
     </div>
     <?php endforeach; ?>
 </nav>
-<div class="w-full mt-auto border-t" data-toggle="dropdown">
-    <button type="button" class="inline-flex items-center w-full px-6 py-2 outline-none focus:shadow-outline" id="my-accountDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
+    <button
+        type="button"
+        class="inline-flex items-center w-full px-6 py-2 mt-auto border-t outline-none focus:ring"
+        id="my-account-dropdown"
+        data-dropdown="button"
+        data-dropdown-target="my-account-dropdown-menu"
+        aria-haspopup="true"
+        aria-expanded="false">
         <?= icon('user', 'text-gray-500 mr-2') ?>
         <?= user()->username ?>
         <?= icon('caret-right', 'ml-auto') ?>
     </button>
-    <nav class="absolute z-50 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-popper="menu" data-popper-placement="right-end">
+    <nav
+        id="my-account-dropdown-menu"
+        class="flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow"
+        aria-labelledby="my-account-dropdown"
+        data-dropdown="menu"
+        data-dropdown-placement="right-end">
         <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-            'my-account'
+            'my-account',
         ) ?>"><?= lang('AdminNavigation.account.my-account') ?></a>
         <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-            'change-password'
+            'change-password',
         ) ?>"><?= lang('AdminNavigation.account.change-password') ?></a>
         <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-            'logout'
+            'logout',
         ) ?>"><?= lang('AdminNavigation.account.logout') ?></a>
     </nav>
 </div>
diff --git a/app/Views/admin/podcast/edit.php b/app/Views/admin/podcast/edit.php
index 749f995f08..cd520c1010 100644
--- a/app/Views/admin/podcast/edit.php
+++ b/app/Views/admin/podcast/edit.php
@@ -18,7 +18,7 @@
 
 <?= form_section(
     lang('Podcast.form.identity_section_title'),
-    lang('Podcast.form.identity_section_subtitle')
+    lang('Podcast.form.identity_section_subtitle'),
 ) ?>
 
 <?= form_label(lang('Podcast.form.image'), 'image') ?>
@@ -35,31 +35,18 @@
     'accept' => '.jpg,.jpeg,.png',
 ]) ?>
 <small class="mb-4 text-gray-600"><?= lang(
-    'Common.forms.image_size_hint'
+    'Common.forms.image_size_hint',
 ) ?></small>
 
 <?= form_label(lang('Podcast.form.title'), 'title') ?>
 <?= form_input([
     'id' => 'title',
     'name' => 'title',
-    'class' => 'form-input mb-4',
+    'class' => 'form-input mb-1',
     'value' => old('title', $podcast->title),
     'required' => 'required',
 ]) ?>
-
-<?= form_label(
-    lang('Podcast.form.name'),
-    'name',
-    [],
-    lang('Podcast.form.name_hint')
-) ?>
-<?= form_input([
-    'id' => 'name',
-    'name' => 'name',
-    'class' => 'form-input mb-4',
-    'value' => old('name', $podcast->name),
-    'required' => 'required',
-]) ?>
+<span class="mb-4 text-sm"><?= $podcast->link ?></span>
 
 <?= form_fieldset('', ['class' => 'mb-4']) ?>
     <legend><?= lang('Podcast.form.type.label') .
@@ -68,13 +55,13 @@
     <?= form_radio(
         ['id' => 'episodic', 'name' => 'type', 'class' => 'form-radio-btn'],
         'episodic',
-        old('type') ? old('type') == 'episodic' : $podcast->type == 'episodic'
+        old('type') ? old('type') == 'episodic' : $podcast->type == 'episodic',
     ) ?>
     <label for="episodic"><?= lang('Podcast.form.type.episodic') ?></label>
     <?= form_radio(
         ['id' => 'serial', 'name' => 'type', 'class' => 'form-radio-btn'],
         'serial',
-        old('type') ? old('type') == 'serial' : $podcast->type == 'serial'
+        old('type') ? old('type') == 'serial' : $podcast->type == 'serial',
     ) ?>
     <label for="serial"><?= lang('Podcast.form.type.serial') ?></label>
 <?= form_fieldset_close() ?>
@@ -89,7 +76,7 @@
             'required' => 'required',
         ],
         old('description', $podcast->description_markdown, false),
-        'data-editor="markdown"'
+        'data-editor="markdown"',
     ) ?>
 </div>
 
@@ -98,7 +85,7 @@
 
 <?= form_section(
     lang('Podcast.form.classification_section_title'),
-    lang('Podcast.form.classification_section_subtitle')
+    lang('Podcast.form.classification_section_subtitle'),
 ) ?>
 
 <?= form_label(lang('Podcast.form.language'), 'language') ?>
@@ -110,7 +97,7 @@
         'id' => 'language',
         'class' => 'form-select mb-4',
         'required' => 'required',
-    ]
+    ],
 ) ?>
 
 <?= form_label(lang('Podcast.form.category'), 'category') ?>
@@ -122,7 +109,7 @@
         'id' => 'category',
         'class' => 'form-select mb-4',
         'required' => 'required',
-    ]
+    ],
 ) ?>
 
 <?= form_label(
@@ -130,7 +117,7 @@
     'other_categories',
     [],
     '',
-    true
+    true,
 ) ?>
 <?= form_multiselect(
     'other_categories[]',
@@ -140,7 +127,7 @@
         'id' => 'other_categories',
         'class' => 'mb-4',
         'data-max-item-count' => '2',
-    ]
+    ],
 ) ?>
 
 <?= form_fieldset('', ['class' => 'mb-4']) ?>
@@ -156,10 +143,10 @@
         'undefined',
         old('parental_advisory')
             ? old('parental_advisory') === 'undefined'
-            : $podcast->parental_advisory === null
+            : $podcast->parental_advisory === null,
     ) ?>
     <label for="undefined"><?= lang(
-        'Podcast.form.parental_advisory.undefined'
+        'Podcast.form.parental_advisory.undefined',
     ) ?></label>
     <?= form_radio(
         [
@@ -170,10 +157,10 @@
         'clean',
         old('parental_advisory')
             ? old('parental_advisory') === 'clean'
-            : $podcast->parental_advisory === 'clean'
+            : $podcast->parental_advisory === 'clean',
     ) ?>
     <label for="clean"><?= lang(
-        'Podcast.form.parental_advisory.clean'
+        'Podcast.form.parental_advisory.clean',
     ) ?></label>
     <?= form_radio(
         [
@@ -184,10 +171,10 @@
         'explicit',
         old('parental_advisory')
             ? old('parental_advisory') === 'explicit'
-            : $podcast->parental_advisory === 'explicit'
+            : $podcast->parental_advisory === 'explicit',
     ) ?>
     <label for="explicit"><?= lang(
-        'Podcast.form.parental_advisory.explicit'
+        'Podcast.form.parental_advisory.explicit',
     ) ?></label>
 <?= form_fieldset_close() ?>
 
@@ -195,14 +182,14 @@
 
 <?= form_section(
     lang('Podcast.form.author_section_title'),
-    lang('Podcast.form.author_section_subtitle')
+    lang('Podcast.form.author_section_subtitle'),
 ) ?>
 
 <?= form_label(
     lang('Podcast.form.owner_name'),
     'owner_name',
     [],
-    lang('Podcast.form.owner_name_hint')
+    lang('Podcast.form.owner_name_hint'),
 ) ?>
 <?= form_input([
     'id' => 'owner_name',
@@ -216,7 +203,7 @@
     lang('Podcast.form.owner_email'),
     'owner_email',
     [],
-    lang('Podcast.form.owner_email_hint')
+    lang('Podcast.form.owner_email_hint'),
 ) ?>
 <?= form_input([
     'id' => 'owner_email',
@@ -232,7 +219,7 @@
     'publisher',
     [],
     lang('Podcast.form.publisher_hint'),
-    true
+    true,
 ) ?>
 <?= form_input([
     'id' => 'publisher',
@@ -253,7 +240,7 @@
 
 <?= form_section(
     lang('Podcast.form.location_section_title'),
-    lang('Podcast.form.location_section_subtitle')
+    lang('Podcast.form.location_section_subtitle'),
 ) ?>
 
 <?= form_label(
@@ -261,7 +248,7 @@
     'location_name',
     [],
     lang('Podcast.form.location_name_hint'),
-    true
+    true,
 ) ?>
 <?= form_input([
     'id' => 'location_name',
@@ -273,7 +260,7 @@
 
 <?= form_section(
     lang('Podcast.form.monetization_section_title'),
-    lang('Podcast.form.monetization_section_subtitle')
+    lang('Podcast.form.monetization_section_subtitle'),
 ) ?>
 
 <?= form_label(
@@ -281,7 +268,7 @@
     'payment_pointer',
     [],
     lang('Podcast.form.payment_pointer_hint'),
-    true
+    true,
 ) ?>
 <?= form_input([
     'id' => 'payment_pointer',
@@ -298,7 +285,7 @@
             'partner_id',
             [],
             lang('Podcast.form.partner_id_hint'),
-            true
+            true,
         ) ?>
         <?= form_input([
             'id' => 'partner_id',
@@ -313,7 +300,7 @@
             'partner_link_url',
             [],
             lang('Podcast.form.partner_link_url_hint'),
-            true
+            true,
         ) ?>
         <?= form_input([
             'id' => 'partner_link_url',
@@ -328,7 +315,7 @@
             'partner_image_url',
             [],
             lang('Podcast.form.partner_image_url_hint'),
-            true
+            true,
         ) ?>
         <?= form_input([
             'id' => 'partner_image_url',
@@ -342,14 +329,14 @@
 
 <?= form_section(
     lang('Podcast.form.advanced_section_title'),
-    lang('Podcast.form.advanced_section_subtitle')
+    lang('Podcast.form.advanced_section_subtitle'),
 ) ?>
 <?= form_label(
     lang('Podcast.form.custom_rss'),
     'custom_rss',
     [],
     lang('Podcast.form.custom_rss_hint'),
-    true
+    true,
 ) ?>
 <?= form_textarea([
     'id' => 'custom_rss',
@@ -361,7 +348,7 @@
 
 <?= form_section(
     lang('Podcast.form.status_section_title'),
-    lang('Podcast.form.status_section_subtitle')
+    lang('Podcast.form.status_section_subtitle'),
 ) ?>
 
 <?= form_switch(
@@ -369,7 +356,7 @@
     ['id' => 'block', 'name' => 'block'],
     'yes',
     old('block', $podcast->is_blocked),
-    'mb-2'
+    'mb-2',
 ) ?>
 
 <?= form_switch(
@@ -377,7 +364,7 @@
     ['id' => 'complete', 'name' => 'complete'],
     'yes',
     old('complete', $podcast->is_completed),
-    'mb-2'
+    'mb-2',
 ) ?>
 
 <?= form_switch(
@@ -385,7 +372,7 @@
         hint_tooltip(lang('Podcast.form.lock_hint'), 'ml-1'),
     ['id' => 'lock', 'name' => 'lock'],
     'yes',
-    old('lock', $podcast->is_locked)
+    old('lock', $podcast->is_locked),
 ) ?>
 
 <?= form_section_close() ?>
@@ -394,7 +381,7 @@
     lang('Podcast.form.submit_edit'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/admin/podcast/import.php b/app/Views/admin/podcast/import.php
index e6f484c849..7bffc4a6cb 100644
--- a/app/Views/admin/podcast/import.php
+++ b/app/Views/admin/podcast/import.php
@@ -22,14 +22,14 @@
     icon('scales', 'mr-2 text-lg flex-shrink-0') .
         lang('PodcastImport.old_podcast_section_subtitle'),
     [],
-    'inline-flex text-xs p-2 text-teal-800 font-semibold bg-teal-100 border border-teal-300 rounded'
+    'inline-flex text-xs p-2 text-blue-800 font-semibold bg-blue-100 border border-blue-300 rounded',
 ) ?>
 
 <?= form_label(
     lang('PodcastImport.imported_feed_url'),
     'imported_feed_url',
     [],
-    lang('PodcastImport.imported_feed_url_hint')
+    lang('PodcastImport.imported_feed_url_hint'),
 ) ?>
 <?= form_input([
     'id' => 'imported_feed_url',
@@ -50,7 +50,7 @@
     lang('PodcastImport.name'),
     'name',
     [],
-    lang('PodcastImport.name_hint')
+    lang('PodcastImport.name_hint'),
 ) ?>
 <?= form_input([
     'id' => 'name',
@@ -79,7 +79,7 @@
 
 <?= form_section(
     lang('PodcastImport.advanced_params_section_title'),
-    lang('PodcastImport.advanced_params_section_subtitle')
+    lang('PodcastImport.advanced_params_section_subtitle'),
 ) ?>
 
 <?= form_fieldset('', ['class' => 'flex flex-col mb-4']) ?>
@@ -89,10 +89,10 @@
             [
                 'id' => 'link',
                 'name' => 'slug_field',
-                'class' => 'form-radio text-green-500',
+                'class' => 'form-radio text-pine-700',
             ],
             'link',
-            old('slug_field') ? old('slug_field') == 'link' : true
+            old('slug_field') ? old('slug_field') == 'link' : true,
         ) ?>
         <span class="ml-2"><?= lang('PodcastImport.slug_field.link') ?></span>
     </label>
@@ -101,10 +101,10 @@
             [
                 'id' => 'title',
                 'name' => 'slug_field',
-                'class' => 'form-radio text-green-500',
+                'class' => 'form-radio text-pine-700',
             ],
             'title',
-            old('slug_field') ? old('slug_field') == 'title' : false
+            old('slug_field') ? old('slug_field') == 'title' : false,
         ) ?>
         <span class="ml-2"><?= lang('PodcastImport.slug_field.title') ?></span>
     </label>
@@ -117,12 +117,12 @@
             [
                 'id' => 'description',
                 'name' => 'description_field',
-                'class' => 'form-radio text-green-500',
+                'class' => 'form-radio text-pine-700',
             ],
             'description',
             old('description_field')
                 ? old('description_field') == 'description'
-                : true
+                : true,
         ) ?>
         <span class="ml-2">&lt;description&gt;</span>
     </label>
@@ -131,12 +131,12 @@
             [
                 'id' => 'summary',
                 'name' => 'description_field',
-                'class' => 'form-radio text-green-500',
+                'class' => 'form-radio text-pine-600',
             ],
             'summary',
             old('description_field')
                 ? old('description_field') == 'summary'
-                : false
+                : false,
         ) ?>
         <span class="ml-2">&lt;itunes:summary&gt;</span>
     </label>
@@ -145,12 +145,12 @@
             [
                 'id' => 'subtitle_summary',
                 'name' => 'description_field',
-                'class' => 'form-radio text-green-500',
+                'class' => 'form-radio text-pine-700',
             ],
             'subtitle_summary',
             old('description_field')
                 ? old('description_field') == 'subtitle_summary'
-                : false
+                : false,
         ) ?>
         <span class="ml-2">&lt;itunes:subtitle&gt; + &lt;itunes:summary&gt;</span>
     </label>
@@ -159,12 +159,12 @@
             [
                 'id' => 'content',
                 'name' => 'description_field',
-                'class' => 'form-radio text-green-500',
+                'class' => 'form-radio text-pine-700',
             ],
             'content',
             old('description_field')
                 ? old('description_field') == 'content'
-                : false
+                : false,
         ) ?>
         <span class="ml-2">&lt;content:encoded&gt;</span>
     </label>
@@ -176,10 +176,10 @@
         [
             'id' => 'force_renumber',
             'name' => 'force_renumber',
-            'class' => 'form-checkbox text-green-500',
+            'class' => 'form-checkbox text-pine-700',
         ],
         'yes',
-        old('force_renumber', false)
+        old('force_renumber', false),
     ) ?>
     <span class="ml-2"><?= lang('PodcastImport.force_renumber') ?></span>
     <?= hint_tooltip(lang('PodcastImport.force_renumber_hint'), 'ml-1') ?>
@@ -189,7 +189,7 @@
     lang('PodcastImport.season_number'),
     'season_number',
     [],
-    lang('PodcastImport.season_number_hint')
+    lang('PodcastImport.season_number_hint'),
 ) ?>
 <?= form_input([
     'id' => 'season_number',
@@ -203,7 +203,7 @@
     lang('PodcastImport.max_episodes'),
     'max_episodes',
     [],
-    lang('PodcastImport.max_episodes_hint')
+    lang('PodcastImport.max_episodes_hint'),
 ) ?>
 <?= form_input([
     'id' => 'max_episodes',
@@ -215,7 +215,7 @@
 
 <?= form_section_close() ?>
 
-<div class="inline-flex w-full p-2 mb-4 text-sm font-semibold text-yellow-800 bg-orange-100 border border-orange-300 rounded" role="alert">
+<div class="inline-flex w-full p-2 mb-4 text-sm font-semibold text-yellow-800 bg-red-100 border border-red-300 rounded" role="alert">
   <?= icon('alert', 'mr-2 text-lg flex-shrink-0') .
       lang('PodcastImport.warning') ?>
 </div>
@@ -224,7 +224,7 @@
     lang('PodcastImport.submit'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/admin/podcast/latest_episodes.php b/app/Views/admin/podcast/latest_episodes.php
index 71ec4389ba..4bf5ac7df4 100644
--- a/app/Views/admin/podcast/latest_episodes.php
+++ b/app/Views/admin/podcast/latest_episodes.php
@@ -3,42 +3,42 @@
         <h1 class="text-xl"><?= lang('Podcast.latest_episodes') ?></h1>
         <a href="<?= route_to(
             'episode-list',
-            $podcast->id
+            $podcast->id,
         ) ?>" class="inline-flex items-center text-sm underline hover:no-underline">
             <?= lang('Podcast.see_all_episodes') ?>
             <?= icon('chevron-right', 'ml-2') ?>
         </a>
     </header>
     <?php if ($episodes): ?>
-        <div class="flex p-2 space-x-4 overflow-x-auto">
+        <div class="flex justify-between p-2 space-x-4 overflow-x-auto">
         <?php foreach ($episodes as $episode): ?>
-            <article class="flex flex-col w-56 bg-white border rounded shadow" style="min-width: 12rem;">
+            <article class="flex flex-col flex-shrink-0 w-56 overflow-hidden bg-white border shadow rounded-xl">
                 <img
                 src="<?= $episode->image->thumbnail_url ?>"
                 alt="<?= $episode->title ?>" class="object-cover" />
-                <div class="flex justify-between p-2">
-                    <div class="flex flex-col">
+                <div class="flex items-start justify-between p-2">
+                    <div class="flex flex-col min-w-0">
                         <a href="<?= route_to(
                             'episode-view',
                             $podcast->id,
-                            $episode->id
+                            $episode->id,
                         ) ?>"
-                        class="text-sm font-semibold hover:underline"
+                        class="text-sm font-semibold truncate hover:underline"
                         ><?= $episode->title ?>
                         </a>
                         <div class="text-xs">
                             <?= episode_numbering(
                                 $episode->number,
                                 $episode->season_number,
-                                'font-bold text-gray-600',
-                                true
+                                'font-semibold text-gray-600',
+                                true,
                             ) ?>
                             <?php if ($episode->published_at): ?>
                                 <span class="mx-1">•</span>
                                 <time
                                 pubdate
                                 datetime="<?= $episode->published_at->format(
-                                    DateTime::ATOM
+                                    DateTime::ATOM,
                                 ) ?>"
                                 title="<?= $episode->published_at ?>">
                                 <?= lang('Common.mediumDate', [
@@ -48,45 +48,51 @@
                             <?php endif; ?>
                         </div>
                     </div>
-                    <div class="relative" data-toggle="dropdown">
-                        <button type="button" class="inline-flex items-center p-1 outline-none focus:shadow-outline" id="moreDropdown" data-popper="button" aria-haspopup="true" aria-expanded="false">
-                            <?= icon('more') ?>
-                        </button>
-                        <nav class="absolute z-10 flex-col hidden py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="moreDropdown" data-popper="menu" data-popper-placement="top-end" data-popper-offset-x="0" data-popper-offset-y="-24" >
-                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                    'episode-edit',
-                                    $podcast->id,
-                                    $episode->id
-                                ) ?>"><?= lang('Episode.edit') ?></a>
-                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                    'embeddable-player-add',
-                                    $podcast->id,
-                                    $episode->id
-                                ) ?>"><?= lang(
-    'Episode.embeddable_player.add'
+                    <button
+                        type="button"
+                        class="inline-flex items-center p-1 outline-none focus:ring"
+                        id="more-dropdown-<?= $episode->id ?>"
+                        data-dropdown="button"
+                        data-dropdown-target="more-dropdown-<?= $episode->id ?>-menu"
+                        aria-label="<?= lang('Common.more') ?>"
+                        aria-haspopup="true"
+                        aria-expanded="false"
+                        ><?= icon('more') ?></button>
+                    <nav
+                        id="more-dropdown-<?= $episode->id ?>-menu"
+                        class="z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow"
+                        aria-labelledby="more-dropdown-<?= $episode->id ?>"
+                        data-dropdown="menu"
+                        data-dropdown-placement="bottom">
+                            <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                'episode-edit',
+                                $podcast->id,
+                                $episode->id,
+                            ) ?>"><?= lang('Episode.edit') ?></a>
+                            <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                'embeddable-player-add',
+                                $podcast->id,
+                                $episode->id,
+                            ) ?>"><?= lang(
+    'Episode.embeddable_player.add',
 ) ?></a>
-                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                    'episode-person-manage',
-                                    $podcast->id,
-                                    $episode->id
-                                ) ?>"><?= lang('Person.persons') ?></a>
-                                    <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                        'soundbites-edit',
-                                        $podcast->id,
-                                        $episode->id
-                                    ) ?>"><?= lang('Episode.soundbites') ?></a>
-                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                    'episode',
-                                    $podcast->name,
-                                    $episode->slug
-                                ) ?>"><?= lang('Episode.go_to_page') ?></a>
-                                <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
-                                    'episode-delete',
-                                    $podcast->id,
-                                    $episode->id
-                                ) ?>"><?= lang('Episode.delete') ?></a>
-                        </nav>
-                    </div>
+                            <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                'episode-person-manage',
+                                $podcast->id,
+                                $episode->id,
+                            ) ?>"><?= lang('Person.persons') ?></a>
+                            <a class="px-4 py-1 hover:bg-gray-100" href="<?= route_to(
+                                'episode',
+                                $podcast->name,
+                                $episode->slug,
+                            ) ?>"><?= lang('Episode.go_to_page') ?></a>
+                            <hr class="my-2 border border-gray-100">
+                            <a class="px-4 py-1 font-semibold text-red-600 hover:bg-gray-100" href="<?= route_to(
+                                'episode-delete',
+                                $podcast->id,
+                                $episode->id,
+                            ) ?>"><?= lang('Episode.delete') ?></a>
+                    </nav>
                 </div>
             </article>
         <?php endforeach; ?>
diff --git a/app/Views/admin/podcast/list.php b/app/Views/admin/podcast/list.php
index 28aa7ef625..5a22b06e5c 100644
--- a/app/Views/admin/podcast/list.php
+++ b/app/Views/admin/podcast/list.php
@@ -12,8 +12,8 @@
 <?= button(
     lang('Podcast.create'),
     route_to('podcast-create'),
-    ['variant' => 'primary', 'iconLeft' => 'add'],
-    ['class' => 'mr-2']
+    ['variant' => 'accent', 'iconLeft' => 'add'],
+    ['class' => 'mr-2'],
 ) ?>
 <?= button(lang('Podcast.import'), route_to('podcast-import'), [
     'variant' => 'primary',
@@ -24,35 +24,33 @@
 
 <?= $this->section('content') ?>
 
-<div class="flex flex-wrap">
+<div class="grid gap-4 grid-cols-podcasts">
     <?php if (!empty($podcasts)): ?>
         <?php foreach ($podcasts as $podcast): ?>
-            <article class="w-48 h-full mb-4 mr-4 overflow-hidden bg-white border rounded shadow">
+            <article class="h-full overflow-hidden bg-white border shadow rounded-xl">
             <img
             alt="<?= $podcast->title ?>"
             src="<?= $podcast->image
-                ->thumbnail_url ?>" class="object-cover w-full h-40" />
-            <div class="p-2">
-                <a href="<?= route_to(
-                    'podcast-view',
-                    $podcast->id
-                ) ?>" class="hover:underline">
-                    <h2 class="font-semibold"><?= $podcast->title ?></h2>
-                </a>
+                ->medium_url ?>" class="object-cover w-full h-48" />
+            <a href="<?= route_to(
+                'podcast-view',
+                $podcast->id,
+            ) ?>" class="flex flex-col p-2 hover:underline">
+                <h2 class="font-semibold truncate"><?= $podcast->title ?></h2>
                 <p class="text-gray-600">@<?= $podcast->name ?></p>
-            </div>
+            </a>
             <footer class="flex items-center justify-end p-2">
-                <a class="inline-flex p-2 mr-2 text-teal-700 bg-teal-100 rounded-full shadow-xs hover:bg-teal-200" href="<?= route_to(
+                <a class="inline-flex p-2 mr-2 text-blue-700 bg-blue-100 rounded-full shadow-xs hover:bg-blue-200" href="<?= route_to(
                     'podcast-edit',
-                    $podcast->id
+                    $podcast->id,
                 ) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang(
-    'Podcast.edit'
+    'Podcast.edit',
 ) ?>"><?= icon('edit') ?></a>
                 <a class="inline-flex p-2 text-gray-700 bg-gray-100 rounded-full shadow-xs hover:bg-gray-200" href="<?= route_to(
                     'podcast-view',
-                    $podcast->id
+                    $podcast->id,
                 ) ?>" data-toggle="tooltip" data-placement="bottom" title="<?= lang(
-    'Podcast.view'
+    'Podcast.view',
 ) ?>"><?= icon('eye') ?></a>
             </footer>
         </article>
diff --git a/app/Views/admin/podcast/platforms.php b/app/Views/admin/podcast/platforms.php
index 88365ad8bd..b41f8d5114 100644
--- a/app/Views/admin/podcast/platforms.php
+++ b/app/Views/admin/podcast/platforms.php
@@ -18,13 +18,12 @@
 <?php foreach ($platforms as $platform): ?>
 
 <div class="relative flex items-start mb-8">
-    <div class="flex flex-col w-12 mr-4">
+    <div class="flex flex-col items-center w-12 mr-4">
         <?= anchor(
             $platform->submit_url,
-            platform_icon(
-                $platform->type,
-                $platform->slug,
-                $platform->type == 'social' ? 'text-gray-800' : null
+            icon(
+                $platform->type . '/' . $platform->slug,
+                'text-gray-600 text-4xl',
             ),
             [
                 'class' => 'mb-1 text-gray-600 hover:text-gray-900',
@@ -35,7 +34,7 @@
                 'title' => lang('Platforms.submit_url', [
                     'platformName' => $platform->label,
                 ]),
-            ]
+            ],
         ) ?>
         <div class="inline-flex bg-gray-200">
             <?= anchor($platform->home_url, icon('external-link', 'mx-auto'), [
@@ -49,7 +48,7 @@
                 ]),
             ]) ?>
             <?= $platform->submit_url
-                ? anchor($platform->submit_url, icon('add-box', 'mx-auto'), [
+                ? anchor($platform->submit_url, icon('add', 'mx-auto'), [
                     'class' => 'flex-1 text-gray-600 hover:text-gray-900',
                     'target' => '_blank',
                     'rel' => 'noopener noreferrer',
@@ -68,7 +67,7 @@
                 route_to(
                     'podcast-platform-remove',
                     $podcast->id,
-                    $platform->slug
+                    $platform->slug,
                 ),
                 icon('delete-bin', 'mx-auto'),
                 [
@@ -79,7 +78,7 @@
                     'title' => lang('Platforms.remove', [
                         'platformName' => $platform->label,
                     ]),
-                ]
+                ],
             )
             : '' ?>
         <?= form_label($platform->label, $platform->slug, [
@@ -99,7 +98,7 @@
             'class' => 'form-input mb-1 w-full',
             'value' => old(
                 $platform->slug . '_link_content',
-                $platform->link_content
+                $platform->link_content,
             ),
             'type' => 'text',
             'placeholder' => lang("Platforms.description.{$platform->type}"),
@@ -113,9 +112,9 @@
             'yes',
             old(
                 $platform->slug . '_visible',
-                $platform->is_visible ? $platform->is_visible : false
+                $platform->is_visible ? $platform->is_visible : false,
             ),
-            'text-sm mb-1'
+            'text-sm mb-1',
         ) ?>
         <?= form_switch(
             lang('Platforms.on_embeddable_player'),
@@ -129,9 +128,9 @@
                 $platform->slug . '_on_embeddable_player',
                 $platform->is_on_embeddable_player
                     ? $platform->is_on_embeddable_player
-                    : false
+                    : false,
             ),
-            'text-sm'
+            'text-sm',
         ) ?>
     </div>
 </div>
@@ -142,7 +141,7 @@
     lang('Platforms.submit'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/admin/podcast/view.php b/app/Views/admin/podcast/view.php
index c21870e4be..cc7d48652b 100644
--- a/app/Views/admin/podcast/view.php
+++ b/app/Views/admin/podcast/view.php
@@ -6,11 +6,14 @@
 
 <?= $this->section('pageTitle') ?>
 <?= $podcast->title ?>
+<?= $this->endSection() ?>
+
+<?= $this->section('headerLeft') ?>
 <?= location_link(
     $podcast->location_name,
     $podcast->location_geo,
     $podcast->location_osmid,
-    'ml-4'
+    'ml-4 text-sm',
 ) ?>
 <?= $this->endSection() ?>
 
@@ -18,11 +21,11 @@
 <?= button(
     lang('Podcast.edit'),
     route_to('podcast-edit', $podcast->id),
-    ['variant' => 'secondary', 'iconLeft' => 'edit'],
-    ['class' => 'mr-2']
+    ['variant' => 'primary', 'iconLeft' => 'edit'],
+    ['class' => 'mr-2'],
 ) ?>
 <?= button(lang('Episode.create'), route_to('episode-create', $podcast->id), [
-    'variant' => 'primary',
+    'variant' => 'accent',
     'iconLeft' => 'add',
 ]) ?>
 <?= $this->endSection() ?>
diff --git a/app/Views/admin/user/list.php b/app/Views/admin/user/list.php
index 9f409dc126..ebaed87d74 100644
--- a/app/Views/admin/user/list.php
+++ b/app/Views/admin/user/list.php
@@ -10,7 +10,7 @@
 
 <?= $this->section('headerRight') ?>
 <?= button(lang('User.create'), route_to('user-create'), [
-    'variant' => 'primary',
+    'variant' => 'accent',
     'iconLeft' => 'user-add',
 ]) ?>
 <?= $this->endSection() ?>
diff --git a/app/Views/auth/_layout.php b/app/Views/auth/_layout.php
index 04fa708844..4af7f3b70b 100644
--- a/app/Views/auth/_layout.php
+++ b/app/Views/auth/_layout.php
@@ -13,12 +13,16 @@
 
 <body class="flex flex-col items-center justify-center min-h-screen mx-auto bg-gray-100">
 	<header class="mb-4">
-		<a href="<?= route_to('home') ?>" class="inline-flex items-center">
-			<?= svg('logo-castopod', 'h-10 mr-2') ?><span class="text-xl">Castopod</span>
+		<a href="<?= route_to(
+      'home',
+  ) ?>" class="inline-flex items-baseline text-4xl font-bold font-display text-pine-700">
+			<?= 'castopod' . svg('castopod-logo', 'h-8 ml-2') ?>
 		</a>
 	</header>
 	<main class="w-full max-w-md px-6 py-4 mx-auto bg-white rounded-lg shadow">
-		<h1 class="mb-2 text-2xl text-center"><?= $this->renderSection('title') ?></h1>
+		<h1 class="mb-6 text-2xl font-bold text-center font-display"><?= $this->renderSection(
+      'title',
+  ) ?></h1>
 		<?= view('_message_block') ?>
 		<?= $this->renderSection('content') ?>
 	</main>
diff --git a/app/Views/credits.php b/app/Views/credits.php
index 97152c0be2..f85ddb070b 100644
--- a/app/Views/credits.php
+++ b/app/Views/credits.php
@@ -8,42 +8,44 @@
 
 <div class="grid w-full grid-cols-1 gap-4 md:grid-cols-2">
 <?php foreach ($credits as $groupSlug => $groups): ?>
-    <?php if (
-        $groupSlug
-    ): ?><div class="col-span-1 mt-12 mb-2 text-xl font-bold text-gray-500 md:text-2xl md:col-span-2 "><?= $groups[
-    'group_label'
-] ?></div><?php endif; ?>
+    <?php if ($groupSlug): ?>
+    <div class="col-span-1 mt-12 mb-2 text-xl font-semibold text-gray-500 md:text-2xl md:col-span-2 "><?= $groups[
+        'group_label'
+    ] ?></div>
+    <?php endif; ?>
     <?php foreach ($groups['persons'] as $personId => $persons): ?>
         <div class="flex mt-2 mb-2">
-            <img src="<?= $persons['thumbnail_url'] ?>" alt="<?= $persons[
-    'full_name'
-] ?>" class="object-cover w-16 h-16 border-4 rounded-full md:h-24 md:w-24 border-gray" />
-            <div class="flex flex-col ml-3 mr-4"><span class="text-lg font-bold text-gray-700 md:text-xl"><?= $persons[
-                'full_name'
-            ] ?></span>
-            <?php if (
-                !empty($persons['information_url'])
-            ): ?><a href="<?= $persons[
-    'information_url'
-] ?>" class="text-sm text-blue-800 hover:underline" target="_blank" rel="noreferrer noopener"><?= $persons[
-    'information_url'
-] ?></a><?php endif; ?></div>
+            <img
+            src="<?= $persons['thumbnail_url'] ?>"
+            alt="<?= $persons['full_name'] ?>"
+            class="object-cover w-16 h-16 border-4 rounded-full md:h-24 md:w-24 border-gray" />
+            <div class="flex flex-col ml-3 mr-4">
+                <span class="text-lg font-semibold text-gray-700 md:text-xl">
+                    <?= $persons['full_name'] ?>
+                </span>
+                <?php if (!empty($persons['information_url'])): ?>
+                <a href="<?= $persons['information_url'] ?>"
+                class="text-sm text-blue-800 hover:underline" target="_blank" rel="noreferrer noopener"><?= $persons[
+                    'information_url'
+                ] ?></a>
+                <?php endif; ?>
+            </div>
         </div>
         <div class="flex flex-col">
         <?php foreach ($persons['roles'] as $role_slug => $role_array): ?>
             <?= $role_array['role_label'] ?>
             
             <?php foreach ($role_array['is_in'] as $isIn): ?>
-               <a href="<?= $isIn[
-                   'link'
-               ] ?>" class="text-sm text-gray-500 hover:underline"><?= $isIn[
-    'title'
-] ?></a>
+               <a
+               href="<?= $isIn['link'] ?>"
+               class="text-sm text-gray-500 hover:underline"><?= $isIn[
+                   'title'
+               ] ?></a>
             <?php endforeach; ?>
-            
         <?php endforeach; ?>
         </div>
     <?php endforeach; ?>
 <?php endforeach; ?>
 </div>
+
 <?php $this->endSection(); ?>
diff --git a/app/Views/embeddable_player.php b/app/Views/embeddable_player.php
index a203673259..b9d9365a37 100644
--- a/app/Views/embeddable_player.php
+++ b/app/Views/embeddable_player.php
@@ -1,214 +1,63 @@
 <!DOCTYPE html>
 <html lang="<?= service('request')->getLocale() ?>">
+
 <head>
     <meta charset="UTF-8" />
     <title><?= $episode->title ?></title>
-    <meta name="description"
-    content="<?= htmlspecialchars($episode->description) ?>"/> 
+    <meta name="description" content="<?= htmlspecialchars(
+        $episode->description,
+    ) ?>" />
     <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
     <link rel="stylesheet" href="/assets/index.css" />
     <link rel="canonical" href="<?= $episode->link ?>" />
 </head>
-<body>
-    <div class="flex w-full p-1 md:p-2"style="background: <?= $theme[
-        'background'
-    ] ?>; color: <?= $theme['text'] ?>;">
-        <img src="<?= $episode->image
-            ->medium_url ?>" alt="<?= $episode->title ?>" class="w-32 h-32 md:w-64 md:h-64" />
-        <div class="flex-grow pl-4">
-            <div class="flex">
-                <a href="<?= route_to('podcast', $podcast->name) ?>"
-                style="color: <?= $theme['text'] ?>;"
-                class="flex flex-col text-base leading-tight opacity-50 md:text-lg hover:opacity-100" target="_blank">
-                <?= $podcast->title ?>
-                </a>
-                <address class="ml-2 text-xs opacity-50 md:text-sm">
-                <?= lang('Podcast.by', [
-                    'publisher' => $podcast->publisher,
-                ]) ?></address>
-            </div>
 
-            <div class="flex mt-1 space-x-2 md:space-x-4 md:mt-3 md:top-0 md:mr-4 md:right-0 md:absolute ">
-                <?php if ($podcast->has_social_platforms): ?> 
-                    <div  class="flex space-x-1">
-                        <?php foreach (
-                            $podcast->social_platforms
-                            as $socialPlatform
-                        ): ?>
-                            <?php if (
-                                $socialPlatform->is_on_embeddable_player
-                            ): ?>
-                                <?= anchor(
-                                    $socialPlatform->link_url,
-                                    platform_icon(
-                                        $socialPlatform->type,
-                                        $socialPlatform->slug,
-                                        'h-4 md:h-6'
-                                    ),
-                                    [
-                                        'target' => '_blank',
-                                        'rel' => 'noopener noreferrer',
-                                        'title' => $socialPlatform->label,
-                                        'class' =>
-                                            'opacity-50 hover:opacity-100',
-                                    ]
-                                ) ?>
-                            <?php endif; ?>
-                        <?php endforeach; ?>
-                    </div>
-                <?php endif; ?>
-                <?php if ($podcast->has_funding_platforms): ?>
-                    <div class="flex space-x-1">
-                        <?php foreach (
-                            $podcast->funding_platforms
-                            as $fundingPlatform
-                        ): ?>
-                            <?php if (
-                                $fundingPlatform->is_on_embeddable_player
-                            ): ?>
-                                <?= anchor(
-                                    $fundingPlatform->link_url,
-                                    platform_icon(
-                                        $fundingPlatform->type,
-                                        $fundingPlatform->slug,
-                                        'h-4 md:h-6'
-                                    ),
-                                    [
-                                        'target' => '_blank',
-                                        'rel' => 'noopener noreferrer',
-                                        'title' => $fundingPlatform->label,
-                                        'class' =>
-                                            'opacity-50 hover:opacity-100',
-                                    ]
-                                ) ?>
-                            <?php endif; ?>
-                        <?php endforeach; ?>
-                    </div>
-                <?php endif; ?>
-                <div class="flex space-x-1">
-                <?php foreach (
-                    $podcast->podcasting_platforms
-                    as $podcastingPlatform
-                ): ?>
-                    <?php if ($podcastingPlatform->is_on_embeddable_player): ?>
-                        <?= anchor(
-                            $podcastingPlatform->link_url,
-                            platform_icon(
-                                $podcastingPlatform->type,
-                                $podcastingPlatform->slug,
-                                'h-4 md:h-6'
-                            ),
-                            [
-                                'target' => '_blank',
-                                'rel' => 'noopener noreferrer',
-                                'title' => $podcastingPlatform->label,
-                                'class' => 'opacity-50 hover:opacity-100',
-                            ]
-                        ) ?>
-                    <?php endif; ?>
-                <?php endforeach; ?>
-                <?= anchor(
-                    route_to('podcast_feed', $podcast->name),
-                    icon('rss', 'mr-2') . lang('Podcast.feed'),
-                    [
-                        'target' => '_blank',
-                        'class' =>
-                            'text-white h-4 md:h-6 md:text-sm text-xs bg-gradient-to-r from-orange-400 to-red-500 hover:to-orange-500 hover:bg-orange-500 inline-flex items-center px-2 py-1 font-semibold rounded-md md:rounded-lg shadow-md hover:bg-orange-600',
-                    ]
-                ) ?>
-                </div>
-            </div>
-            <h1 class="mt-2 text-xl font-semibold opacity-100 md:text-3xl hover:opacity-75">
-                <a href="<?= $episode->link ?>"
-                style="color: <?= $theme['text'] ?>;"
-                target="_blank">
-                    <?= $episode->title ?>
-                </a>
-            </h1>
-            <div class="flex w-full">
-                <div
-                    style="color: <?= $theme['text'] ?>;"
-                    class="text-sm opacity-50 md:text-base">
-                    <?= episode_numbering(
-                        $episode->number,
-                        $episode->season_number
-                    ) ?>
-                    <div>
-                        <time
-                            pubdate
-                            datetime="<?= $episode->published_at->format(
-                                DateTime::ATOM
-                            ) ?>"
-                            title="<?= $episode->published_at ?>">
-                            <?= lang('Common.mediumDate', [
-                                $episode->published_at,
-                            ]) ?>
-                        </time>
-                        <span>•</span>
-                        <time datetime="PT<?= $episode->enclosure_duration ?>S">
-                            <?= format_duration($episode->enclosure_duration) ?>
-                        </time>
-                    </div>
-                </div>
-                <?php if ($episode->location_name): ?>
-                    <a href="<?= location_url(
-                        $episode->location_name,
-                        $episode->location_geo,
-                        $episode->location_osmid
-                    ) ?>"
-                style="color: <?= $theme['inverted'] ?>; background: <?= $theme[
+<body class="flex w-full h-screen" style="background: <?= $theme[
+    'background'
+] ?>; color: <?= $theme['text'] ?>;">
+    <img src="<?= $episode->image
+        ->medium_url ?>" alt="<?= $episode->title ?>" class="flex-shrink h-full" />
+    <div class="flex flex-col flex-1 min-w-0 p-4">
+        <div class="flex items-center">
+            <a href="<?= route_to(
+                'podcast',
+                $podcast->name,
+            ) ?>" style="color: <?= $theme[
     'text'
-] ?>;" class="inline-flex items-center px-3 py-1 mt-1 ml-4 text-xs align-middle rounded-full shadow-xs outline-none opacity-50 md:mt-2 md:text-sm hover:opacity-75 focus:shadow-outline" target="_blank" rel="noreferrer noopener"><?= icon(
-    'map-pin'
-) ?>
-                        <?= $episode->location_name ?>
-                    </a>
-                <?php endif; ?>
-            </div>
-                    
-            <?php if (!empty($persons)): ?>
-                <div class="flex my-2 space-x-1 md:my-4 md:space-x-2">
-                    <?php foreach ($persons as $person): ?>
-                        <?php if (!empty($person['information_url'])): ?>
-                            <a href="<?= $person['information_url'] ?>"
-                            class="hover:opacity-50"
-                            target="_blank"
-                            rel="noreferrer noopener">
-                        <?php endif; ?>
-                                <img src="<?= $person['thumbnail_url'] ?>"
-                                alt="<?= $person['full_name'] ?>"
-                                title="[<?= $person[
-                                    'full_name'
-                                ] ?>] <?= $person['roles'] ?>"
-                                class="object-cover h-8 rounded-full md:h-12 md:w-12" />
-                        <?php if (!empty($person['information_url'])): ?>
-                            </a>
-                        <?php endif; ?>
-                    <?php endforeach; ?>
-                </div>
-            <?php endif; ?>
-            <audio controls preload="none" class="flex w-full mt-2 md:mt-4">
-                <source
-                src="<?= $episode->enclosure_url .
-                    (isset($_SERVER['HTTP_REFERER'])
-                        ? '?_from=' .
-                            parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)
-                        : '') ?>"
-                type="<?= $episode->enclosure_type ?>" />
-                    Your browser does not support the audio tag.
-            </audio>
+] ?>;" class="mr-2 text-xs tracking-wider uppercase truncate opacity-75 hover:opacity-100" target="_blank">
+                <?= $podcast->title ?>
+            </a>
+            <a href="https://castopod.org/" class="ml-auto text-xl text-pine-700 hover:opacity-75" title="<?= lang(
+                'Common.powered_by',
+                [
+                    'castopod' => 'Castopod',
+                ],
+            ) ?>" target="_blank" rel="noopener noreferrer">
+                <?= icon('podcasting/castopod') ?>
+            </a>
         </div>
-
-
-        <a href="https://castopod.org/"
-        class="absolute bottom-0 right-0 mb-4 mr-4 hover:opacity-75"
-        title="<?= lang('Common.powered_by', [
-            'castopod' => 'Castopod',
-        ]) ?>"
-        target="_blank"
-        rel="noopener noreferrer">
-            <?= platform_icon('podcasting', 'castopod', 'h-6') ?>
+        <a href="<?= $episode->link ?>" class="flex items-center mb-2" style="color: <?= $theme[
+    'text'
+] ?>;" target="_blank">
+            <h1 class="mr-2 text-lg font-semibold truncate opacity-100 hover:opacity-75">
+                <?= $episode->title ?>
+            </h1>
+            <?= episode_numbering(
+                $episode->number,
+                $episode->season_number,
+                'text-xs',
+                true,
+            ) ?>
         </a>
+        <audio controls preload="none" class="flex w-full mt-auto">
+            <source src="<?= $episode->enclosure_url .
+                (isset($_SERVER['HTTP_REFERER'])
+                    ? '?_from=' .
+                        parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)
+                    : '') ?>" type="<?= $episode->enclosure_type ?>" />
+            Your browser does not support the audio tag.
+        </audio>
     </div>
 </body>
+
 </html>
\ No newline at end of file
diff --git a/app/Views/episode.php b/app/Views/episode.php
deleted file mode 100644
index 2f5ec68408..0000000000
--- a/app/Views/episode.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?= helper('page') ?>
-<!DOCTYPE html>
-<html lang="<?= service('request')->getLocale() ?>">
-
-<head>
-    <meta charset="UTF-8"/>
-    <title><?= $episode->title ?></title>
-    <meta name="description"
-    content="<?= htmlspecialchars($episode->description) ?>" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-<?php if (
-    !empty($podcast->payment_pointer)
-): ?>    <meta name="monetization" content="<?= $podcast->payment_pointer ?>" />                    
-<?php endif; ?>
-    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
-    <link rel="stylesheet" href="/assets/index.css"/>
-    <link rel="canonical" href="<?= $episode->link ?>" />
-    <script src="/assets/podcast.js" type="module" defer></script>
-    <meta property="og:title" content="<?= $episode->title ?>" />
-    <meta property="og:locale" content="<?= $podcast->language_code ?>" />
-    <meta property="og:site_name" content="<?= $podcast->title ?>" />
-    <meta property="og:url" content="<?= current_url() ?>" />
-    <meta property="article:published_time" content="<?= $episode->published_at ?>" />
-    <meta property="article:modified_time" content="<?= $episode->updated_at ?>" />
-    <meta property="og:image" content="<?= $episode->image->large_url ?>" />
-    <meta property="og:image:width" content="<?= config('Images')
-        ->largeSize ?>" />
-    <meta property="og:image:height" content="<?= config('Images')
-        ->largeSize ?>" />
-    <meta property="og:audio" content="<?= $episode->enclosure_opengraph_url ?>" />
-    <meta property="og:audio:type" content="<?= $episode->enclosure_mimetype ?>" />
-    <meta property="og:description" content="<?= $episode->description ?>" />
-    <meta name="twitter:card" content="summary_large_image" />
-</head>
-
-<body class="flex flex-col min-h-screen mx-auto">
-    <header class="border-b bg-gradient-to-tr from-gray-900 to-gray-800">
-        <div class="container flex items-start px-2 py-2 mx-auto">
-          <img
-            class="w-12 h-12 mr-2 rounded cover"
-            src="<?= $podcast->image->thumbnail_url ?>"
-            alt="<?= $podcast->title ?>"
-          />
-          <a
-            href="<?= route_to('podcast', $podcast->name) ?>"
-            class="flex flex-col text-lg leading-tight text-white"
-            title="<?= lang('Episode.back_to_podcast') ?>">
-            <?= $podcast->title ?>
-            <span class="text-sm text-gray-300">
-                @<?= $podcast->name ?>
-            </span>
-          </a>
-        </div>
-    </header>
-    <main class="container flex-1 mx-auto">
-      <nav class="flex items-center px-2 py-4">
-            <?php if ($previousEpisode): ?>
-                <a class="flex items-center text-xs leading-snug text-gray-600 hover:text-gray-900" href="<?= $previousEpisode->link ?>" title="<?= $previousEpisode->title ?>">
-                    <?= icon('chevron-left', 'mr-2') ?>
-                    <div class="flex flex-col">
-                        <?= $previousEpisode->season_number ==
-                        $episode->season_number
-                            ? lang('Episode.previous_episode')
-                            : lang('Episode.previous_season') ?>
-                        <span class="w-40 font-semibold truncate"><?= $previousEpisode->title ?></span>
-                    </div>
-                </a>
-            <?php endif; ?>
-            <?php if ($nextEpisode): ?>
-                <a class="flex items-center ml-auto text-xs leading-snug text-right text-gray-600 hover:text-gray-900" href="<?= $nextEpisode->link ?>" title="<?= $nextEpisode->title ?>">
-                    <div class="flex flex-col">
-                        <?= $nextEpisode->season_number ==
-                        $episode->season_number
-                            ? lang('Episode.next_episode')
-                            : lang('Episode.next_season') ?>
-                        <span class="w-40 font-semibold truncate"><?= $nextEpisode->title ?></span>
-                    </div>
-                    <?= icon('chevron-right', 'ml-2') ?>
-                </a>
-            <?php endif; ?>
-      </nav>
-      <header class="flex flex-col items-center px-4 md:items-stretch md:justify-center md:flex-row">
-        <img src="<?= $episode->image->medium_url ?>"
-        alt="<?= $episode->title ?>" class="object-cover w-full max-w-xs mb-2 rounded-lg md:mb-0 md:mr-4" />
-        <div class="flex flex-col w-full max-w-sm">
-          <h1 class="text-lg font-semibold md:text-2xl"><?= $episode->title ?></h1>
-          <?= episode_numbering(
-              $episode->number,
-              $episode->season_number,
-              'text-gray-600'
-          ) ?>
-          <div class="text-sm">
-              <time
-              pubdate
-              datetime="<?= $episode->published_at->format(DateTime::ATOM) ?>"
-              title="<?= $episode->published_at ?>">
-              <?= lang('Common.mediumDate', [$episode->published_at]) ?>
-              </time>
-              <span class="mx-1">•</span>
-              <time datetime="PT<?= $episode->enclosure_duration ?>S">
-                <?= format_duration($episode->enclosure_duration) ?>
-              </time>
-          </div>
-          <div class="flex mt-2 mb-1 space-x-2">
-            <?php foreach ($persons as $person): ?>
-                <?php if (!empty($person['information_url'])): ?>
-                    <a href="<?= $person[
-                        'information_url'
-                    ] ?>" target="_blank" rel="noreferrer noopener">
-                <?php endif; ?>
-                <img src="<?= $person['thumbnail_url'] ?>" alt="<?= $person[
-    'full_name'
-] ?>" title="[<?= $person['full_name'] ?>] <?= $person[
-    'roles'
-] ?>" class="object-cover w-12 h-12 rounded-full" />
-                <?php if (!empty($person['information_url'])): ?>
-                    </a>
-                <?php endif; ?>
-            <?php endforeach; ?>
-          </div>
-          <?= location_link(
-              $episode->location_name,
-              $episode->location_geo,
-              $episode->location_osmid,
-              'self-start mt-2 mb-2'
-          ) ?>
-          <audio controls preload="none" class="w-full mt-auto">
-            <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>">
-            Your browser does not support the audio tag.
-          </audio>
-        </div>
-      </header>      
-      <section class="w-full max-w-3xl px-2 py-6 mx-auto prose md:px-6">
-      <?= $episode->getDescriptionHtml('-+Website+-') ?>
-      </section>
-    </main>
-    <footer class="px-2 py-4 border-t ">
-        <div class="container flex flex-col items-center justify-between mx-auto text-xs md:flex-row ">
-            <?= render_page_links('inline-flex mb-4 md:mb-0') ?>
-            <div class="flex flex-col items-end">
-                <p><?= $podcast->copyright ?></p>
-                <p><?= lang('Common.powered_by', [
-                    'castopod' =>
-                        '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
-                ]) ?></p>
-            </div>
-        </div>
-    </footer>
-</body>
\ No newline at end of file
diff --git a/app/Views/errors/cli/error_exception.php b/app/Views/errors/cli/error_exception.php
index c161311cc5..f9ebc35a21 100644
--- a/app/Views/errors/cli/error_exception.php
+++ b/app/Views/errors/cli/error_exception.php
@@ -1,24 +1,77 @@
-An uncaught Exception was encountered
-
-Type: <?= get_class($exception), "\n" ?>
-Message: <?= $message, "\n" ?>
-Filename: <?= $exception->getFile(), "\n" ?>
-Line Number: <?= $exception->getLine() ?>
-
-<?php if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE === true): ?>
-    Backtrace:
-    <?php foreach ($exception->getTrace() as $error): ?>
-        <?php if (isset($error['file'])): ?>
-            <?= trim(
-                '-' .
-                    $error['line'] .
-                    ' - ' .
-                    $error['file'] .
-                    '::' .
-                    $error['function']
-            ) . "\n" ?>
-        <?php endif; ?>
-    <?php endforeach; ?>
-
-<?php endif;
-?>
+<?php
+
+use CodeIgniter\CLI\CLI;
+
+// The main Exception
+CLI::newLine();
+CLI::write('[' . get_class($exception) . ']', 'light_gray', 'red');
+CLI::newLine();
+CLI::write($message);
+CLI::newLine();
+CLI::write(
+    'at ' .
+        CLI::color(
+            clean_path($exception->getFile()) . ':' . $exception->getLine(),
+            'green'
+        )
+);
+CLI::newLine();
+
+// The backtrace
+if (defined('SHOW_DEBUG_BACKTRACE') && SHOW_DEBUG_BACKTRACE) {
+    $backtraces = $exception->getTrace();
+
+    if ($backtraces) {
+        CLI::write('Backtrace:', 'green');
+    }
+
+    foreach ($backtraces as $i => $error) {
+        $padFile = '    '; // 4 spaces
+        $padClass = '       '; // 7 spaces
+        $c = str_pad($i + 1, 3, ' ', STR_PAD_LEFT);
+
+        if (isset($error['file'])) {
+            $filepath = clean_path($error['file']) . ':' . $error['line'];
+
+            CLI::write($c . $padFile . CLI::color($filepath, 'yellow'));
+        } else {
+            CLI::write(
+                $c . $padFile . CLI::color('[internal function]', 'yellow')
+            );
+        }
+
+        $function = '';
+
+        if (isset($error['class'])) {
+            $type =
+                $error['type'] === '->'
+                    ? '()' . $error['type']
+                    : $error['type'];
+            $function .=
+                $padClass . $error['class'] . $type . $error['function'];
+        } elseif (!isset($error['class']) && isset($error['function'])) {
+            $function .= $padClass . $error['function'];
+        }
+
+        $args = implode(
+            ', ',
+            array_map(function ($value) {
+                switch (true) {
+                    case is_object($value):
+                        return 'Object(' . get_class($value) . ')';
+                    case is_array($value):
+                        return count($value) ? '[...]' : '[]';
+                    case is_null($value):
+                        return 'null'; // return the lowercased version
+                    default:
+                        return var_export($value, true);
+                }
+            }, array_values($error['args'] ?? []))
+        );
+
+        $function .= '(' . $args . ')';
+
+        CLI::write($function);
+        CLI::newLine();
+    }
+}
diff --git a/app/Views/errors/html/debug.css b/app/Views/errors/html/debug.css
index 6595eedb32..ec6dc81fea 100644
--- a/app/Views/errors/html/debug.css
+++ b/app/Views/errors/html/debug.css
@@ -64,6 +64,7 @@ p.lead {
   border-radius: 5px;
   font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
   margin: 0;
+  overflow-x: scroll;
 }
 .source span.line {
   line-height: 1.4;
diff --git a/app/Views/errors/html/error_404.php b/app/Views/errors/html/error_404.php
index 089a67bb41..ae4d553d88 100644
--- a/app/Views/errors/html/error_404.php
+++ b/app/Views/errors/html/error_404.php
@@ -10,7 +10,7 @@
 
 <body class="flex flex-col items-center justify-center min-h-screen px-2 text-center bg-gray-100">
         <?= svg('castopod-mascot_confused', 'h-64') ?>
-        <h1 class="text-3xl font-bold md:text-4xl lg:text-5xl">404 - File Not Found</h1>
+        <h1 class="text-3xl font-bold font-display md:text-4xl lg:text-5xl">404 - File Not Found</h1>
 
         <p class="mb-6 text-lg text-gray-600 md:text-xl lg:text-2xl">
             <?php if (!empty($message) && $message !== '(null)'): ?>
@@ -20,7 +20,7 @@
             <?php endif; ?>
         </p>
 
-        <?= button('Go back', previous_url(), [
+        <?= button(lang('Common.go_back'), previous_url(), [
             'variant' => 'primary',
             'iconLeft' => 'arrow-left',
         ]) ?>
diff --git a/app/Views/errors/html/error_exception.php b/app/Views/errors/html/error_exception.php
index 5101f1e162..7a1c053cd2 100644
--- a/app/Views/errors/html/error_exception.php
+++ b/app/Views/errors/html/error_exception.php
@@ -1,535 +1,423 @@
 <?php $error_id = uniqid('error', true); ?>
 <!doctype html>
 <html>
-
 <head>
-    <meta charset="UTF-8">
-    <meta name="robots" content="noindex">
-
-    <title><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8') ?></title>
-    <style type="text/css">
-        <?= preg_replace(
-            '#[\r\n\t ]+#',
-            ' ',
-            file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
-        ) ?>
-    </style>
-
-    <script type="text/javascript">
-        <?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
-    </script>
+	<meta charset="UTF-8">
+	<meta name="robots" content="noindex">
+
+	<title><?= esc($title) ?></title>
+	<style type="text/css">
+		<?= preg_replace(
+      '#[\r\n\t ]+#',
+      ' ',
+      file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.css')
+  ) ?>
+	</style>
+
+	<script type="text/javascript">
+		<?= file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'debug.js') ?>
+	</script>
 </head>
-
 <body onload="init()">
 
-    <!-- Header -->
-    <div class="header">
-        <div class="container">
-            <h1><?= htmlspecialchars($title, ENT_SUBSTITUTE, 'UTF-8'),
-                $exception->getCode()
-                    ? ' #' . $exception->getCode()
-                    : '' ?></h1>
-            <p>
-                <?= $exception->getMessage() ?>
-                <a href="https://www.google.com/search?q=<?= urlencode(
-                    $title .
-                        ' ' .
-                        preg_replace(
-                            '#\'.*\'|".*"#Us',
-                            '',
-                            $exception->getMessage()
-                        )
-                ) ?>" rel="noreferrer" target="_blank">search &rarr;</a>
-            </p>
-        </div>
-    </div>
-
-    <!-- Source -->
-    <div class="container">
-        <p><b><?= static::cleanPath(
-            $file,
-            $line
-        ) ?></b> at line <b><?= $line ?></b></p>
-
-        <?php if (is_file($file)): ?>
-            <div class="source">
-                <?= static::highlightFile($file, $line, 15) ?>
-            </div>
-        <?php endif; ?>
-    </div>
-
-    <div class="container">
-
-        <ul class="tabs" id="tabs">
-            <li><a href="#backtrace">Backtrace</a></li>
-            <li><a href="#server">Server</a></li>
-            <li><a href="#request">Request</a></li>
-            <li><a href="#response">Response</a></li>
-            <li><a href="#files">Files</a></li>
-            <li><a href="#memory">Memory</a></li>
-            </li>
-        </ul>
-
-        <div class="tab-content">
-
-            <!-- Backtrace -->
-            <div class="content" id="backtrace">
-
-                <ol class="trace">
-                    <?php foreach ($trace as $index => $row): ?>
-                        <li>
-                            <p>
-                                <!-- Trace info -->
-                                <?php if (
-                                    isset($row['file']) &&
-                                    is_file($row['file'])
-                                ): ?>
-                                    <?php if (
-                                        isset($row['function']) &&
-                                        in_array($row['function'], [
-                                            'include',
-                                            'include_once',
-                                            'require',
-                                            'require_once',
-                                        ])
-                                    ) {
-                                        echo $row['function'] .
-                                            ' ' .
-                                            static::cleanPath($row['file']);
-                                    } else {
-                                        echo static::cleanPath($row['file']) .
-                                            ' : ' .
-                                            $row['line'];
-                                    } ?>
-                                <?php else: ?>
-                                    {PHP internal code}
-                                <?php endif; ?>
-
-                                <!-- Class/Method -->
-                                <?php if (isset($row['class'])): ?>
-                                    &nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= $row[
-                                        'class'
-                                    ] .
-                                        $row['type'] .
-                                        $row['function'] ?>
-                                    <?php if (!empty($row['args'])): ?>
-                                        <?php $args_id =
-                                            $error_id . 'args' . $index; ?>
-                                        ( <a href="#" onclick="return toggle('<?= $args_id ?>');">arguments</a> )
-                                        <div class="args" id="<?= $args_id ?>">
-                                            <table cellspacing="0">
-
-                                                <?php
-                                                $params = null;
-                                                // Reflection by name is not available for closure function
-                                                if (
-                                                    substr(
-                                                        $row['function'],
-                                                        -1
-                                                    ) !== '}'
-                                                ) {
-                                                    $mirror = isset(
-                                                        $row['class']
-                                                    )
-                                                        ? new \ReflectionMethod(
-                                                            $row['class'],
-                                                            $row['function']
-                                                        )
-                                                        : new \ReflectionFunction(
-                                                            $row['function']
-                                                        );
-                                                    $params = $mirror->getParameters();
-                                                }
-                                                foreach (
-                                                    $row['args']
-                                                    as $key => $value
-                                                ): ?>
-                                                    <tr>
-                                                        <td><code><?= htmlspecialchars(
-                                                            isset($params[$key])
-                                                                ? '$' .
-                                                                    $params[
-                                                                        $key
-                                                                    ]->name
-                                                                : "#$key",
-                                                            ENT_SUBSTITUTE,
-                                                            'UTF-8'
-                                                        ) ?></code></td>
-                                                        <td>
-                                                            <pre><?= print_r(
-                                                                $value,
-                                                                true
-                                                            ) ?></pre>
-                                                        </td>
-                                                    </tr>
-                                                <?php endforeach;
-                                                ?>
-
-                                            </table>
-                                        </div>
-                                    <?php else: ?>
-                                        ()
-                                    <?php endif; ?>
-                                <?php endif; ?>
-
-                                <?php if (
-                                    !isset($row['class']) &&
-                                    isset($row['function'])
-                                ): ?>
-                                    &nbsp;&nbsp;&mdash;&nbsp;&nbsp; <?= $row[
-                                        'function'
-                                    ] ?>()
-                                <?php endif; ?>
-                            </p>
-
-                            <!-- Source? -->
-                            <?php if (
-                                isset($row['file']) &&
-                                is_file($row['file']) &&
-                                isset($row['class'])
-                            ): ?>
-                                <div class="source">
-                                    <?= static::highlightFile(
-                                        $row['file'],
-                                        $row['line']
-                                    ) ?>
-                                </div>
-                            <?php endif; ?>
-                        </li>
-
-                    <?php endforeach; ?>
-                </ol>
-
-            </div>
-
-            <!-- Server -->
-            <div class="content" id="server">
-                <?php foreach (['_SERVER', '_SESSION'] as $var): ?>
-                    <?php if (
-                        empty($GLOBALS[$var]) ||
-                        !is_array($GLOBALS[$var])
-                    ) {
-                        continue;
-                    } ?>
-
-                    <h3>$<?= $var ?></h3>
-
-                    <table>
-                        <thead>
-                            <tr>
-                                <th>Key</th>
-                                <th>Value</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php foreach ($GLOBALS[$var] as $key => $value): ?>
-                                <tr>
-                                    <td><?= htmlspecialchars(
-                                        $key,
-                                        ENT_IGNORE,
-                                        'UTF-8'
-                                    ) ?></td>
-                                    <td>
-                                        <?php if (is_string($value)): ?>
-                                            <?= htmlspecialchars(
-                                                $value,
-                                                ENT_SUBSTITUTE,
-                                                'UTF-8'
-                                            ) ?>
-                                        <?php else: ?>
-                                            <?= '<pre>' .
-                                                print_r($value, true) ?>
-                                        <?php endif; ?>
-                                    </td>
-                                </tr>
-                            <?php endforeach; ?>
-                        </tbody>
-                    </table>
-
-                <?php endforeach; ?>
-
-                <!-- Constants -->
-                <?php $constants = get_defined_constants(true); ?>
-                <?php if (!empty($constants['user'])): ?>
-                    <h3>Constants</h3>
-
-                    <table>
-                        <thead>
-                            <tr>
-                                <th>Key</th>
-                                <th>Value</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php foreach (
-                                $constants['user']
-                                as $key => $value
-                            ): ?>
-                                <tr>
-                                    <td><?= htmlspecialchars(
-                                        $key,
-                                        ENT_IGNORE,
-                                        'UTF-8'
-                                    ) ?></td>
-                                    <td>
-                                        <?php if (
-                                            !is_array($value) &&
-                                            !is_object($value)
-                                        ): ?>
-                                            <?= htmlspecialchars(
-                                                $value,
-                                                ENT_SUBSTITUTE,
-                                                'UTF-8'
-                                            ) ?>
-                                        <?php else: ?>
-                                            <?= '<pre>' .
-                                                print_r($value, true) ?>
-                                        <?php endif; ?>
-                                    </td>
-                                </tr>
-                            <?php endforeach; ?>
-                        </tbody>
-                    </table>
-                <?php endif; ?>
-            </div>
-
-            <!-- Request -->
-            <div class="content" id="request">
-                <?php $request = \Config\Services::request(); ?>
-
-                <table>
-                    <tbody>
-                        <tr>
-                            <td style="width: 10em">Path</td>
-                            <td><?= $request->uri ?></td>
-                        </tr>
-                        <tr>
-                            <td>HTTP Method</td>
-                            <td><?= $request->getMethod(true) ?></td>
-                        </tr>
-                        <tr>
-                            <td>IP Address</td>
-                            <td><?= $request->getIPAddress() ?></td>
-                        </tr>
-                        <tr>
-                            <td style="width: 10em">Is AJAX Request?</td>
-                            <td><?= $request->isAJAX() ? 'yes' : 'no' ?></td>
-                        </tr>
-                        <tr>
-                            <td>Is CLI Request?</td>
-                            <td><?= $request->isCLI() ? 'yes' : 'no' ?></td>
-                        </tr>
-                        <tr>
-                            <td>Is Secure Request?</td>
-                            <td><?= $request->isSecure() ? 'yes' : 'no' ?></td>
-                        </tr>
-                        <tr>
-                            <td>User Agent</td>
-                            <td><?= $request
-                                ->getUserAgent()
-                                ->getAgentString() ?></td>
-                        </tr>
-
-                    </tbody>
-                </table>
-
-
-                <?php $empty = true; ?>
-                <?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
-                    <?php if (
-                        empty($GLOBALS[$var]) ||
-                        !is_array($GLOBALS[$var])
-                    ) {
-                        continue;
-                    } ?>
-
-                    <?php $empty = false; ?>
-
-                    <h3>$<?= $var ?></h3>
-
-                    <table style="width: 100%">
-                        <thead>
-                            <tr>
-                                <th>Key</th>
-                                <th>Value</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php foreach ($GLOBALS[$var] as $key => $value): ?>
-                                <tr>
-                                    <td><?= htmlspecialchars(
-                                        $key,
-                                        ENT_IGNORE,
-                                        'UTF-8'
-                                    ) ?></td>
-                                    <td>
-                                        <?php if (
-                                            !is_array($value) &&
-                                            !is_object($value)
-                                        ): ?>
-                                            <?= htmlspecialchars(
-                                                $value,
-                                                ENT_SUBSTITUTE,
-                                                'UTF-8'
-                                            ) ?>
-                                        <?php else: ?>
-                                            <?= '<pre>' .
-                                                print_r($value, true) ?>
-                                        <?php endif; ?>
-                                    </td>
-                                </tr>
-                            <?php endforeach; ?>
-                        </tbody>
-                    </table>
-
-                <?php endforeach; ?>
-
-                <?php if ($empty): ?>
-                    <div class="alert">
-                        No $_GET, $_POST, or $_COOKIE Information to show.
-                    </div>
-
-                <?php endif; ?>
-
-                <?php $headers = $request->getHeaders(); ?>
-                <?php if (!empty($headers)): ?>
-                    <h3>Headers</h3>
-
-                    <table>
-                        <thead>
-                            <tr>
-                                <th>Header</th>
-                                <th>Value</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php foreach ($headers as $value): ?>
-                                <?php if (empty($value)) {
-                                    continue;
-                                } ?>
-                                <?php if (!is_array($value)) {
-                                    $value = [$value];
-                                } ?>
-                                <?php foreach ($value as $h): ?>
-                                    <tr>
-                                        <td><?= esc(
-                                            $h->getName(),
-                                            'html'
-                                        ) ?></td>
-                                        <td><?= esc(
-                                            $h->getValueLine(),
-                                            'html'
-                                        ) ?></td>
-                                    </tr>
-                                <?php endforeach; ?>
-                            <?php endforeach; ?>
-                        </tbody>
-                    </table>
-
-                <?php endif; ?>
-            </div>
-
-            <!-- Response -->
-            <?php
-            $response = \Config\Services::response();
-            $response->setStatusCode(http_response_code());
-            ?>
-            <div class="content" id="response">
-                <table>
-                    <tr>
-                        <td style="width: 15em">Response Status</td>
-                        <td><?= $response->getStatusCode() .
-                            ' - ' .
-                            $response->getReason() ?></td>
-                    </tr>
-                </table>
-
-                <?php $headers = $response->getHeaders(); ?>
-                <?php if (!empty($headers)): ?>
-                    <?php natsort($headers); ?>
-
-                    <h3>Headers</h3>
-
-                    <table>
-                        <thead>
-                            <tr>
-                                <th>Header</th>
-                                <th>Value</th>
-                            </tr>
-                        </thead>
-                        <tbody>
-                            <?php foreach ($headers as $name => $value): ?>
-                                <tr>
-                                    <td><?= esc($name, 'html') ?></td>
-                                    <td><?= esc(
-                                        $response->getHeaderLine($name),
-                                        'html'
-                                    ) ?></td>
-                                </tr>
-                            <?php endforeach; ?>
-                        </tbody>
-                    </table>
-
-                <?php endif; ?>
-            </div>
-
-            <!-- Files -->
-            <div class="content" id="files">
-                <?php $files = get_included_files(); ?>
-
-                <ol>
-                    <?php foreach ($files as $file): ?>
-                        <li><?= htmlspecialchars(
-                            static::cleanPath($file),
-                            ENT_SUBSTITUTE,
-                            'UTF-8'
-                        ) ?></li>
-                    <?php endforeach; ?>
-                </ol>
-            </div>
-
-            <!-- Memory -->
-            <div class="content" id="memory">
-
-                <table>
-                    <tbody>
-                        <tr>
-                            <td>Memory Usage</td>
-                            <td><?= static::describeMemory(
-                                memory_get_usage(true)
-                            ) ?></td>
-                        </tr>
-                        <tr>
-                            <td style="width: 12em">Peak Memory Usage:</td>
-                            <td><?= static::describeMemory(
-                                memory_get_peak_usage(true)
-                            ) ?></td>
-                        </tr>
-                        <tr>
-                            <td>Memory Limit:</td>
-                            <td><?= ini_get('memory_limit') ?></td>
-                        </tr>
-                    </tbody>
-                </table>
-
-            </div>
-
-        </div> <!-- /tab-content -->
-
-    </div> <!-- /container -->
-
-    <div class="footer">
-        <div class="container">
-
-            <p>
-                Displayed at <?= date('H:i:sa') ?> &mdash;
-                PHP: <?= phpversion() ?> &mdash;
-                CodeIgniter: <?= \CodeIgniter\CodeIgniter::CI_VERSION ?>
-            </p>
-
-        </div>
-    </div>
+	<!-- Header -->
+	<div class="header">
+		<div class="container">
+			<h1><?= esc($title),
+       esc($exception->getCode() ? ' #' . $exception->getCode() : '') ?></h1>
+			<p>
+				<?= esc($exception->getMessage()) ?>
+				<a href="https://www.google.com/search?q=<?= urlencode(
+        $title .
+            ' ' .
+            preg_replace('#\'.*\'|".*"#Us', '', $exception->getMessage())
+    ) ?>"
+				   rel="noreferrer" target="_blank">search &rarr;</a>
+			</p>
+		</div>
+	</div>
+
+	<!-- Source -->
+	<div class="container">
+		<p><b><?= esc(static::cleanPath($file, $line)) ?></b> at line <b><?= esc(
+    $line
+) ?></b></p>
+
+		<?php if (is_file($file)): ?>
+			<div class="source">
+				<?= static::highlightFile($file, $line, 15) ?>
+			</div>
+		<?php endif; ?>
+	</div>
+
+	<div class="container">
+
+		<ul class="tabs" id="tabs">
+			<li><a href="#backtrace">Backtrace</a></li>
+				<li><a href="#server">Server</a></li>
+				<li><a href="#request">Request</a></li>
+				<li><a href="#response">Response</a></li>
+				<li><a href="#files">Files</a></li>
+				<li><a href="#memory">Memory</a></li>
+			</li>
+		</ul>
+
+		<div class="tab-content">
+
+			<!-- Backtrace -->
+			<div class="content" id="backtrace">
+
+				<ol class="trace">
+				<?php foreach ($trace as $index => $row): ?>
+
+					<li>
+						<p>
+							<!-- Trace info -->
+							<?php if (isset($row['file']) && is_file($row['file'])): ?>
+								<?php if (
+            isset($row['function']) &&
+            in_array(
+                $row['function'],
+                ['include', 'include_once', 'require', 'require_once'],
+                true
+            )
+        ) {
+            echo esc($row['function'] . ' ' . static::cleanPath($row['file']));
+        } else {
+            echo esc(static::cleanPath($row['file']) . ' : ' . $row['line']);
+        } ?>
+							<?php else: ?>
+								{PHP internal code}
+							<?php endif; ?>
+
+							<!-- Class/Method -->
+							<?php if (isset($row['class'])): ?>
+								&nbsp;&nbsp;&mdash;&nbsp;&nbsp;<?= esc(
+            $row['class'] . $row['type'] . $row['function']
+        ) ?>
+								<?php if (!empty($row['args'])): ?>
+									<?php $args_id = $error_id . 'args' . $index; ?>
+									( <a href="#" onclick="return toggle('<?= esc(
+             $args_id,
+             'attr'
+         ) ?>');">arguments</a> )
+									<div class="args" id="<?= esc($args_id, 'attr') ?>">
+										<table cellspacing="0">
+
+										<?php
+          $params = null;
+          // Reflection by name is not available for closure function
+          if (substr($row['function'], -1) !== '}') {
+              $mirror = isset($row['class'])
+                  ? new \ReflectionMethod($row['class'], $row['function'])
+                  : new \ReflectionFunction($row['function']);
+              $params = $mirror->getParameters();
+          }
+          foreach ($row['args'] as $key => $value): ?>
+											<tr>
+												<td><code><?= esc(
+                isset($params[$key]) ? '$' . $params[$key]->name : "#$key"
+            ) ?></code></td>
+												<td><pre><?= esc(print_r($value, true)) ?></pre></td>
+											</tr>
+										<?php endforeach;
+          ?>
+
+										</table>
+									</div>
+								<?php else: ?>
+									()
+								<?php endif; ?>
+							<?php endif; ?>
+
+							<?php if (!isset($row['class']) && isset($row['function'])): ?>
+								&nbsp;&nbsp;&mdash;&nbsp;&nbsp;	<?= esc($row['function']) ?>()
+							<?php endif; ?>
+						</p>
+
+						<!-- Source? -->
+						<?php if (
+          isset($row['file']) &&
+          is_file($row['file']) &&
+          isset($row['class'])
+      ): ?>
+							<div class="source">
+								<?= static::highlightFile($row['file'], $row['line']) ?>
+							</div>
+						<?php endif; ?>
+					</li>
+
+				<?php endforeach; ?>
+				</ol>
+
+			</div>
+
+			<!-- Server -->
+			<div class="content" id="server">
+				<?php foreach (['_SERVER', '_SESSION'] as $var): ?>
+					<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
+         continue;
+     } ?>
+
+					<h3>$<?= esc($var) ?></h3>
+
+					<table>
+						<thead>
+							<tr>
+								<th>Key</th>
+								<th>Value</th>
+							</tr>
+						</thead>
+						<tbody>
+						<?php foreach ($GLOBALS[$var] as $key => $value): ?>
+							<tr>
+								<td><?= esc($key) ?></td>
+								<td>
+									<?php if (is_string($value)): ?>
+										<?= esc($value) ?>
+									<?php else: ?>
+										<pre><?= esc(print_r($value, true)) ?></pre>
+									<?php endif; ?>
+								</td>
+							</tr>
+						<?php endforeach; ?>
+						</tbody>
+					</table>
+
+				<?php endforeach; ?>
+
+				<!-- Constants -->
+				<?php $constants = get_defined_constants(true); ?>
+				<?php if (!empty($constants['user'])): ?>
+					<h3>Constants</h3>
+
+					<table>
+						<thead>
+							<tr>
+								<th>Key</th>
+								<th>Value</th>
+							</tr>
+						</thead>
+						<tbody>
+						<?php foreach ($constants['user'] as $key => $value): ?>
+							<tr>
+								<td><?= esc($key) ?></td>
+								<td>
+									<?php if (is_string($value)): ?>
+										<?= esc($value) ?>
+									<?php else: ?>
+										<pre><?= esc(print_r($value, true)) ?></pre>
+									<?php endif; ?>
+								</td>
+							</tr>
+						<?php endforeach; ?>
+						</tbody>
+					</table>
+				<?php endif; ?>
+			</div>
+
+			<!-- Request -->
+			<div class="content" id="request">
+				<?php $request = \Config\Services::request(); ?>
+
+				<table>
+					<tbody>
+						<tr>
+							<td style="width: 10em">Path</td>
+							<td><?= esc($request->uri) ?></td>
+						</tr>
+						<tr>
+							<td>HTTP Method</td>
+							<td><?= esc($request->getMethod(true)) ?></td>
+						</tr>
+						<tr>
+							<td>IP Address</td>
+							<td><?= esc($request->getIPAddress()) ?></td>
+						</tr>
+						<tr>
+							<td style="width: 10em">Is AJAX Request?</td>
+							<td><?= $request->isAJAX() ? 'yes' : 'no' ?></td>
+						</tr>
+						<tr>
+							<td>Is CLI Request?</td>
+							<td><?= $request->isCLI() ? 'yes' : 'no' ?></td>
+						</tr>
+						<tr>
+							<td>Is Secure Request?</td>
+							<td><?= $request->isSecure() ? 'yes' : 'no' ?></td>
+						</tr>
+						<tr>
+							<td>User Agent</td>
+							<td><?= esc($request->getUserAgent()->getAgentString()) ?></td>
+						</tr>
+
+					</tbody>
+				</table>
+
+
+				<?php $empty = true; ?>
+				<?php foreach (['_GET', '_POST', '_COOKIE'] as $var): ?>
+					<?php if (empty($GLOBALS[$var]) || !is_array($GLOBALS[$var])) {
+         continue;
+     } ?>
+
+					<?php $empty = false; ?>
+
+					<h3>$<?= esc($var) ?></h3>
+
+					<table style="width: 100%">
+						<thead>
+							<tr>
+								<th>Key</th>
+								<th>Value</th>
+							</tr>
+						</thead>
+						<tbody>
+						<?php foreach ($GLOBALS[$var] as $key => $value): ?>
+							<tr>
+								<td><?= esc($key) ?></td>
+								<td>
+									<?php if (is_string($value)): ?>
+										<?= esc($value) ?>
+									<?php else: ?>
+										<pre><?= esc(print_r($value, true)) ?></pre>
+									<?php endif; ?>
+								</td>
+							</tr>
+						<?php endforeach; ?>
+						</tbody>
+					</table>
+
+				<?php endforeach; ?>
+
+				<?php if ($empty): ?>
+
+					<div class="alert">
+						No $_GET, $_POST, or $_COOKIE Information to show.
+					</div>
+
+				<?php endif; ?>
+
+				<?php $headers = $request->getHeaders(); ?>
+				<?php if (!empty($headers)): ?>
+
+					<h3>Headers</h3>
+
+					<table>
+						<thead>
+							<tr>
+								<th>Header</th>
+								<th>Value</th>
+							</tr>
+						</thead>
+						<tbody>
+						<?php foreach ($headers as $value): ?>
+							<?php if (empty($value)) {
+           continue;
+       } ?>
+							<?php if (!is_array($value)) {
+           $value = [$value];
+       } ?>
+							<?php foreach ($value as $h): ?>
+								<tr>
+									<td><?= esc($h->getName(), 'html') ?></td>
+									<td><?= esc($h->getValueLine(), 'html') ?></td>
+								</tr>
+							<?php endforeach; ?>
+						<?php endforeach; ?>
+						</tbody>
+					</table>
+
+				<?php endif; ?>
+			</div>
+
+			<!-- Response -->
+			<?php
+   $response = \Config\Services::response();
+   $response->setStatusCode(http_response_code());
+   ?>
+			<div class="content" id="response">
+				<table>
+					<tr>
+						<td style="width: 15em">Response Status</td>
+						<td><?= esc($response->getStatusCode() . ' - ' . $response->getReason()) ?></td>
+					</tr>
+				</table>
+
+				<?php $headers = $response->getHeaders(); ?>
+				<?php if (!empty($headers)): ?>
+					<?php natsort($headers); ?>
+
+					<h3>Headers</h3>
+
+					<table>
+						<thead>
+							<tr>
+								<th>Header</th>
+								<th>Value</th>
+							</tr>
+						</thead>
+						<tbody>
+						<?php foreach ($headers as $name => $value): ?>
+							<tr>
+								<td><?= esc($name, 'html') ?></td>
+								<td><?= esc($response->getHeaderLine($name), 'html') ?></td>
+							</tr>
+						<?php endforeach; ?>
+						</tbody>
+					</table>
+
+				<?php endif; ?>
+			</div>
+
+			<!-- Files -->
+			<div class="content" id="files">
+				<?php $files = get_included_files(); ?>
+
+				<ol>
+				<?php foreach ($files as $file): ?>
+					<li><?= esc(static::cleanPath($file)) ?></li>
+				<?php endforeach; ?>
+				</ol>
+			</div>
+
+			<!-- Memory -->
+			<div class="content" id="memory">
+
+				<table>
+					<tbody>
+						<tr>
+							<td>Memory Usage</td>
+							<td><?= esc(static::describeMemory(memory_get_usage(true))) ?></td>
+						</tr>
+						<tr>
+							<td style="width: 12em">Peak Memory Usage:</td>
+							<td><?= esc(static::describeMemory(memory_get_peak_usage(true))) ?></td>
+						</tr>
+						<tr>
+							<td>Memory Limit:</td>
+							<td><?= esc(ini_get('memory_limit')) ?></td>
+						</tr>
+					</tbody>
+				</table>
+
+			</div>
+
+		</div>  <!-- /tab-content -->
+
+	</div> <!-- /container -->
+
+	<div class="footer">
+		<div class="container">
+
+			<p>
+				Displayed at <?= esc(date('H:i:sa')) ?> &mdash;
+				PHP: <?= esc(phpversion()) ?>  &mdash;
+				CodeIgniter: <?= esc(\CodeIgniter\CodeIgniter::CI_VERSION) ?>
+			</p>
+
+		</div>
+	</div>
 
 </body>
-
 </html>
\ No newline at end of file
diff --git a/app/Views/errors/html/production.php b/app/Views/errors/html/production.php
index a74ac74b12..4125e0c9d8 100644
--- a/app/Views/errors/html/production.php
+++ b/app/Views/errors/html/production.php
@@ -12,7 +12,7 @@
 
 <body class="flex flex-col items-center justify-center min-h-screen px-2 text-center bg-gray-100">
 	<?= svg('castopod-mascot_confused', 'h-64') ?>
-	<h1 class="text-3xl font-bold md:text-4xl lg:text-5xl">Whoops!</h1>
+	<h1 class="text-3xl font-bold font-display md:text-4xl lg:text-5xl">Whoops!</h1>
 	<p class="mb-6 text-lg text-gray-600 md:text-xl lg:text-2xl">We seem to have hit a snag. Please try again later...</p>
 </body>
 
diff --git a/app/Views/home.php b/app/Views/home.php
index 4a8fe34869..3adbcac5f4 100644
--- a/app/Views/home.php
+++ b/app/Views/home.php
@@ -1,29 +1,52 @@
-<?= $this->extend('_layout') ?>
+<?= helper('page') ?>
+<!DOCTYPE html>
+<html lang="<?= service('request')->getLocale() ?>">
 
-<?= $this->section('title') ?>Castopod<?= $this->endSection() ?>
+<head>
+    <meta charset="UTF-8"/>
+    <title>Castopod</title>
+    <meta name="description" content="Castopod is an open-source hosting platform made for podcasters who want engage and interact with their audience."/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+    <link rel="stylesheet" href="/assets/index.css"/>
+</head>
 
-<?= $this->section('content') ?>
-
-<h1 class="mb-2 text-xl"><?= lang('Home.all_podcasts') ?> (<?= count(
-     $podcasts
+<body class="flex flex-col min-h-screen mx-auto bg-pine-50">
+    <header class="py-8 text-white border-b bg-pine-900">
+        <div class="container flex items-center justify-between px-2 py-4 mx-auto">
+            <a href="<?= route_to(
+                'home',
+            ) ?>" class="inline-flex items-baseline text-3xl font-semibold font-display"><?= 'castopod' .
+    svg('castopod-logo', 'h-6 ml-2') ?></a>
+        </div>
+    </header>
+    <main class="container flex-1 px-4 py-10 mx-auto">
+        <h1 class="mb-2 text-xl"><?= lang('Home.all_podcasts') ?> (<?= count(
+     $podcasts,
  ) ?>)</h1>
-<section class="flex flex-wrap">
-    <?php if ($podcasts): ?>
-        <?php foreach ($podcasts as $podcast): ?>
-            <a href="<?= route_to('podcast', $podcast->name) ?>">
-                <article class="w-48 h-full p-2 mb-4 mr-4 border shadow-sm hover:bg-gray-100 hover:shadow">
-                    <img alt="<?= $podcast->title ?>"
-                    src="<?= $podcast->image->thumbnail_url ?>"
-                    class="object-cover w-full h-40 mb-2" />
-                    <h2 class="font-semibold leading-tight"><?= $podcast->title ?></h2>
-                    <p class="text-gray-600">@<?= $podcast->name ?></p>
-                </article>
-            </a>
-        <?php endforeach; ?>
-    <?php else: ?>
-        <p class="italic"><?= lang('Home.no_podcast') ?></p>
-    <?php endif; ?>
-</section>
-
-<?= $this->endSection()
-?>
+        <section class="grid gap-4 grid-cols-podcasts">
+            <?php if ($podcasts): ?>
+                <?php foreach ($podcasts as $podcast): ?>
+                    <a href="<?= $podcast->link ?>" class="w-full">
+                        <article class="w-full h-full overflow-hidden bg-white border shadow rounded-xl hover:bg-gray-100 hover:shadow">
+                            <img alt="<?= $podcast->title ?>"
+                            src="<?= $podcast->image->medium_url ?>"
+                            class="object-cover w-full h-48 mb-2" />
+                            <h2 class="px-2 font-semibold leading-tight truncate"><?= $podcast->title ?></h2>
+                            <p class="px-2 pb-2 text-gray-600">@<?= $podcast->name ?></p>
+                        </article>
+                    </a>
+                <?php endforeach; ?>
+            <?php else: ?>
+                <p class="italic"><?= lang('Home.no_podcast') ?></p>
+            <?php endif; ?>
+        </section>
+    </main>
+    <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t">
+        <?= render_page_links() ?>
+        <small><?= lang('Common.powered_by', [
+            'castopod' =>
+                '<a class="underline hover:no-underline" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod</a>',
+        ]) ?></small>
+    </footer>
+</body>
diff --git a/app/Views/install/_layout.php b/app/Views/install/_layout.php
index 6cd4cb1e5a..3277106b05 100644
--- a/app/Views/install/_layout.php
+++ b/app/Views/install/_layout.php
@@ -8,7 +8,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
     <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
     <link rel="stylesheet" href="/assets/index.css"/>
-    <script src="/assets/install.js" type="module" defer></script>
+    <script src="/assets/install.js" type="module"></script>
 </head>
 
 <body class="flex flex-col min-h-screen mx-auto">
diff --git a/app/Views/install/cache_config.php b/app/Views/install/cache_config.php
index ddd95d8e4b..44f01018fa 100644
--- a/app/Views/install/cache_config.php
+++ b/app/Views/install/cache_config.php
@@ -7,12 +7,12 @@
 ]) ?>
 <?= csrf_field() ?>
 
-<h1 class="mb-4 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">3/4</span><?= lang(
-    'Install.form.cache_config'
+<h1 class="mb-4 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">3/4</span><?= lang(
+    'Install.form.cache_config',
 ) ?></h1>
 
 <p class="mb-4 text-sm text-gray-600"><?= lang(
-    'Install.form.cache_config_hint'
+    'Install.form.cache_config_hint',
 ) ?></p>
 
 <?= form_label(lang('Install.form.cache_handler'), 'db_prefix') ?>
@@ -29,14 +29,14 @@
         'name' => 'cache_handler',
         'class' => 'form-select mb-6',
         'value' => config('Database')->default['DBPrefix'],
-    ]
+    ],
 ) ?>
 
 <?= button(
     lang('Install.form.next') . icon('arrow-right', 'ml-2'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/install/create_superadmin.php b/app/Views/install/create_superadmin.php
index 6a56077332..9bf89683c1 100644
--- a/app/Views/install/create_superadmin.php
+++ b/app/Views/install/create_superadmin.php
@@ -7,8 +7,8 @@
 ]) ?>
 <?= csrf_field() ?>
 
-<h1 class="mb-4 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">4/4</span><?= lang(
-    'Install.form.create_superadmin'
+<h1 class="mb-4 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">4/4</span><?= lang(
+    'Install.form.create_superadmin',
 ) ?></h1>
 
 <?= form_label(lang('Install.form.email'), 'email') ?>
@@ -44,7 +44,7 @@
     icon('check', 'mr-2') . lang('Install.form.submit'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/install/database_config.php b/app/Views/install/database_config.php
index 169419576d..e50d584e69 100644
--- a/app/Views/install/database_config.php
+++ b/app/Views/install/database_config.php
@@ -8,12 +8,12 @@
 ]) ?>
 <?= csrf_field() ?>
 
-<h1 class="mb-2 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">2/4</span><?= lang(
-    'Install.form.database_config'
+<h1 class="mb-2 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">2/4</span><?= lang(
+    'Install.form.database_config',
 ) ?></h1>
 
 <p class="mb-4 text-sm text-gray-600"><?= lang(
-    'Install.form.database_config_hint'
+    'Install.form.database_config_hint',
 ) ?></p>
 
 <?= form_label(lang('Install.form.db_hostname'), 'db_hostname') ?>
@@ -59,7 +59,7 @@
     lang('Install.form.db_prefix'),
     'db_prefix',
     [],
-    lang('Install.form.db_prefix_hint')
+    lang('Install.form.db_prefix_hint'),
 ) ?>
 <?= form_input([
     'id' => 'db_prefix',
@@ -72,7 +72,7 @@
     lang('Install.form.next') . icon('arrow-right', 'ml-2'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/install/instance_config.php b/app/Views/install/instance_config.php
index ef6d642895..4c7ff578a3 100644
--- a/app/Views/install/instance_config.php
+++ b/app/Views/install/instance_config.php
@@ -7,8 +7,8 @@
     '/instance-config' ?>" class="flex flex-col w-full max-w-sm" method="post" accept-charset="utf-8">
 <?= csrf_field() ?>
 
-<h1 class="mb-4 text-xl"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider text-green-700 border-4 border-green-500 rounded-full">1/4</span><?= lang(
-    'Install.form.instance_config'
+<h1 class="mb-4 text-xl font-bold font-display"><span class="inline-flex items-center justify-center w-12 h-12 mr-2 text-sm font-semibold tracking-wider border-4 rounded-full text-pine-700 border-pine-700 font-body">1/4</span><?= lang(
+    'Install.form.instance_config',
 ) ?></h1>
 <?= form_label(lang('Install.form.hostname'), 'hostname') ?>
 <?= form_input([
@@ -17,7 +17,7 @@
     'class' => 'form-input mb-4',
     'value' => old(
         'hostname',
-        empty(host_url()) ? config('App')->baseURL : host_url()
+        empty(host_url()) ? config('App')->baseURL : host_url(),
     ),
     'required' => 'required',
 ]) ?>
@@ -28,7 +28,7 @@
     'media_base_url',
     [],
     lang('Install.form.media_base_url_hint'),
-    true
+    true,
 ) ?>
 <?= form_input([
     'id' => 'media_base_url',
@@ -41,7 +41,7 @@
     lang('Install.form.admin_gateway'),
     'admin_gateway',
     [],
-    lang('Install.form.admin_gateway_hint')
+    lang('Install.form.admin_gateway_hint'),
 ) ?>
 <?= form_input([
     'id' => 'admin_gateway',
@@ -55,7 +55,7 @@
     lang('Install.form.auth_gateway'),
     'auth_gateway',
     [],
-    lang('Install.form.auth_gateway_hint')
+    lang('Install.form.auth_gateway_hint'),
 ) ?>
 <?= form_input([
     'id' => 'auth_gateway',
@@ -66,15 +66,10 @@
 ]) ?>
 
 <?= button(
-    lang('Install.form.next') .
-        icon(
-            'arrow-right',
-
-            'ml-2'
-        ),
+    lang('Install.form.next') . icon('arrow-right', 'ml-2'),
     null,
     ['variant' => 'primary'],
-    ['type' => 'submit', 'class' => 'self-end']
+    ['type' => 'submit', 'class' => 'self-end'],
 ) ?>
 
 <?= form_close() ?>
diff --git a/app/Views/install/manual_config.php b/app/Views/install/manual_config.php
index 446eee8631..26fb5ed12d 100644
--- a/app/Views/install/manual_config.php
+++ b/app/Views/install/manual_config.php
@@ -2,12 +2,14 @@
 
 <?= $this->section('content') ?>
 
-<h1 class="mb-2 text-xl font-bold"><?= lang('Install.manual_config') ?></h1>
+<h1 class="mb-2 text-xl font-bold font-display"><?= lang(
+    'Install.manual_config',
+) ?></h1>
 <div class="inline-flex items-baseline max-w-2xl px-4 py-2 mb-4 font-semibold text-red-900 bg-red-200 border border-red-700">
 <?= icon('alert', 'mr-2 flex-shrink-0') . lang('Install.messages.writeError') ?>
 </div>
 <p class="mb-4 font-semibold text-gray-600"><?= lang(
-    'Install.manual_config_subtitle'
+    'Install.manual_config_subtitle',
 ) ?></p>
 
 <?= $this->endSection()
diff --git a/app/Views/page.php b/app/Views/page.php
index aa6b502e9d..d8aef5572b 100644
--- a/app/Views/page.php
+++ b/app/Views/page.php
@@ -1,11 +1,36 @@
-<?= $this->extend('_layout') ?>
+<?= helper('page') ?>
+<!DOCTYPE html>
+<html lang="<?= service('request')->getLocale() ?>">
 
-<?= $this->section('title') ?>
-<?= $page->title ?>
-<?= $this->endSection() ?>
+<head>
+    <meta charset="UTF-8"/>
+    <title><?= $page->title ?></title>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+    <link rel="stylesheet" href="/assets/index.css"/>
+</head>
 
-<?= $this->section('content') ?>
-<div class="prose">
-    <?= $page->content_html ?>
-</div>
-<?= $this->endSection() ?>
+<body class="flex flex-col min-h-screen mx-auto">
+    <header class="py-8 text-white border-b bg-pine-900">
+        <div class="container flex flex-col px-2 py-4 mx-auto">
+            <a href="<?= route_to('home') ?>"
+            class="inline-flex items-center mb-2"><?= icon(
+                'arrow-left',
+                'mr-2'
+            ) . lang('Page.back_to_home') ?></a>
+            <h1 class="text-3xl font-semibold"><?= $page->title ?></h1>
+        </div>
+    </header>
+    <main class="container flex-1 px-4 py-10 mx-auto">
+        <div class="prose">
+            <?= $page->content_html ?>
+        </div>
+    </main>
+    <footer class="container flex justify-between px-2 py-4 mx-auto text-sm text-right border-t">
+        <?= render_page_links() ?>
+        <small><?= lang('Common.powered_by', [
+            'castopod' =>
+                '<a class="underline hover:no-underline" href="https://castopod.org/" target="_blank" rel="noreferrer noopener">Castopod</a>',
+        ]) ?></small>
+    </footer>
+</body>
diff --git a/app/Views/pager/default_full.php b/app/Views/pager/default_full.php
index e2a065d0c1..ab90a46fc6 100644
--- a/app/Views/pager/default_full.php
+++ b/app/Views/pager/default_full.php
@@ -34,7 +34,7 @@ $pager->setSurroundCount(2); ?>
         <?php foreach ($pager->links() as $link): ?>
             <li>
                 <?php if ($link['active']): ?>
-                    <span class="block px-4 py-2 font-semibold text-white bg-green-500 rounded-full">
+                    <span class="block px-4 py-2 font-semibold text-white rounded-full bg-pine-600">
                         <?= $link['title'] ?>
                     </span>
                 <?php else: ?>
diff --git a/app/Views/podcast.php b/app/Views/podcast.php
deleted file mode 100644
index 2b42958621..0000000000
--- a/app/Views/podcast.php
+++ /dev/null
@@ -1,261 +0,0 @@
-<?= helper('page') ?>
-
-<!DOCTYPE html>
-<html lang="<?= service('request')->getLocale() ?>">
-
-<head>
-    <meta charset="UTF-8"/>
-    <title><?= $podcast->title ?></title>
-    <meta name="description"
-    content="<?= htmlspecialchars($podcast->description) ?>" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-<?php if (
-    !empty($podcast->payment_pointer)
-): ?>    <meta name="monetization" content="<?= $podcast->payment_pointer ?>" />                    
-<?php endif; ?>
-    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
-    <link rel="stylesheet" href="/assets/index.css"/>
-    <link rel="canonical" href="<?= current_season_url() ?>" />
-    <link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>"/>
-    <script src="/assets/podcast.js" type="module" defer></script>
-    <meta property="og:title" content="<?= $podcast->title ?>" />
-    <meta property="og:locale" content="<?= $podcast->language_code ?>" />
-    <meta property="og:site_name" content="<?= $podcast->title ?>" />
-    <meta property="og:url" content="<?= current_season_url() ?>" />
-    <meta property="og:image" content="<?= $podcast->image->large_url ?>" />
-    <meta property="og:image:width" content="<?= config('Images')
-        ->largeSize ?>" />
-    <meta property="og:image:height" content="<?= config('Images')
-        ->largeSize ?>" />
-    <meta property="og:description" content="<?= $podcast->description ?>" />
-    <meta name="twitter:card" content="summary_large_image" />
-</head>
-
-<body class="flex flex-col min-h-screen">
-    <main class="flex-1 bg-gray-200">
-        <header class="border-b bg-gradient-to-tr from-gray-900 to-gray-800">
-            <div class="flex flex-col items-center justify-center md:items-stretch md:mx-auto md:container md:py-12 md:flex-row ">
-                <img src="<?= $podcast->image->medium_url ?>"
-                alt="<?= $podcast->title ?>" class="object-cover w-full max-w-xs m-4 rounded-lg shadow-xl" />
-                <div class="w-full p-4 bg-white md:max-w-md md:text-white md:bg-transparent">
-                    <h1 class="text-2xl font-semibold leading-tight"><?= $podcast->title ?> <span class="text-lg font-normal opacity-75">@<?= $podcast->name ?></span></h1>
-                    <div class="flex items-center mb-4">
-                        <address>
-                            <?= lang('Podcast.by', [
-                                'publisher' => $podcast->publisher,
-                            ]) ?>
-                        </address>
-                        <?= $podcast->parental_advisory === 'explicit'
-                            ? '<span class="px-1 ml-2 text-xs font-semibold leading-tight tracking-wider uppercase border-2 border-gray-700 rounded md:border-white">' .
-                                lang('Common.explicit') .
-                                '</span>'
-                            : '' ?>
-                        <?= location_link(
-                            $podcast->location_name,
-                            $podcast->location_geo,
-                            $podcast->location_osmid,
-                            'ml-4'
-                        ) ?>
-                    </div>
-                    <div class="flex mb-2 space-x-2">
-                        <?= anchor(
-                            route_to('podcast_feed', $podcast->name),
-                            icon('rss', 'mr-2') . lang('Podcast.feed'),
-                            [
-                                'class' =>
-                                    'text-white bg-gradient-to-r from-orange-400 to-red-500 hover:to-orange-500 hover:bg-orange-500 inline-flex items-center px-2 py-1 font-semibold rounded-lg shadow-md hover:bg-orange-600',
-                            ]
-                        ) ?>
-                    <?php foreach (
-                        $podcast->podcastingPlatforms
-                        as $podcastingPlatform
-                    ): ?>
-                        <?php if ($podcastingPlatform->is_visible): ?>
-                            <a href="<?= $podcastingPlatform->link_url ?>" title="<?= $podcastingPlatform->label ?>" target="_blank" rel="noopener noreferrer">
-                            <?= platform_icon(
-                                $podcastingPlatform->type,
-                                $podcastingPlatform->slug,
-                                'h-8'
-                            ) ?>
-                            </a>
-                        <?php endif; ?>
-                    <?php endforeach; ?>
-                    </div>
-                               
-                    <div class="flex mb-2 space-x-2">
-                    <?php foreach (
-                        $podcast->socialPlatforms
-                        as $socialPlatform
-                    ): ?>
-                        <?php if ($socialPlatform->is_visible): ?>
-                            <a href="<?= $socialPlatform->link_url ?>" title="<?= $socialPlatform->label ?>" target="_blank" rel="noopener noreferrer">
-                            <?= platform_icon(
-                                $socialPlatform->type,
-                                $socialPlatform->slug,
-                                'h-8 text-black md:text-white'
-                            ) ?>
-                            </a>
-                        <?php endif; ?>
-                    <?php endforeach; ?>
-                    </div>
-               
-                    <div class="flex mb-2 space-x-2">
-                    <?php foreach (
-                        $podcast->fundingPlatforms
-                        as $fundingPlatform
-                    ): ?>
-                        <?php if ($fundingPlatform->is_visible): ?>
-                            <a href="<?= $fundingPlatform->link_url ?>" title="<?= $fundingPlatform->link_content ?>" target="_blank" rel="noopener noreferrer">
-                            <?= platform_icon(
-                                $fundingPlatform->type,
-                                $fundingPlatform->slug,
-                                'h-8'
-                            ) ?>
-                            </a>
-                        <?php endif; ?>
-                    <?php endforeach; ?>
-                    </div>
-
-                    <div class="flex mb-2 space-x-2">
-                    <?php foreach ($personArray as $person): ?>
-                        <?php if (!empty($person['information_url'])): ?>
-                            <a href="<?= $person[
-                                'information_url'
-                            ] ?>" target="_blank" rel="noreferrer noopener">
-                        <?php endif; ?>
-                        <img src="<?= $person[
-                            'thumbnail_url'
-                        ] ?>" alt="<?= $person[
-    'full_name'
-] ?>" title="[<?= $person['full_name'] ?>] <?= $person[
-    'roles'
-] ?>" class="object-cover w-12 h-12 rounded-full" />
-                        <?php if (!empty($person['information_url'])): ?>
-                            </a>
-                        <?php endif; ?>
-                    <?php endforeach; ?>
-                    </div>
-                    
-                    <div class="mb-2 opacity-75">
-                        <?= $podcast->description_html ?>
-                    </div>
-                    <span class="px-2 py-1 mb-2 mr-2 text-sm text-gray-700 bg-gray-200 rounded">
-                        <?= lang(
-                            'Podcast.category_options.' .
-                                $podcast->category->code
-                        ) ?>
-                    </span>
-                    <?php foreach (
-                        $podcast->other_categories
-                        as $other_category
-                    ): ?>
-                        <span class="px-2 py-1 mb-2 mr-2 text-sm text-gray-700 bg-gray-200 rounded">
-                            <?= lang(
-                                'Podcast.category_options.' .
-                                    $other_category->code
-                            ) ?>
-                        </span>
-                    <?php endforeach; ?>
-                </div>
-            </div>
-        </header>
-
-        <section class="flex flex-col">
-            <nav class="inline-flex justify-center px-4 bg-gray-100 border-b">
-                <?php foreach ($episodesNav as $link): ?>
-                    <?= anchor(
-                        $link['route'],
-                        $link['label'] .
-                            ' (' .
-                            $link['number_of_episodes'] .
-                            ')',
-                        [
-                            'class' =>
-                                'px-2 py-1 font-semibold ' .
-                                ($link['is_active']
-                                    ? 'border-b-2 border-gray-600'
-                                    : 'text-gray-600 hover:text-gray-900'),
-                        ]
-                    ) ?>
-                <?php endforeach; ?>
-            </nav>
-            <div class="container py-6 mx-auto">
-                <?php if ($episodes): ?>
-                    <h1 class="px-4 mb-2 text-xl text-center">
-                    <?php if ($activeQuery['type'] == 'year'): ?>
-                        <?= lang('Podcast.list_of_episodes_year', [
-                            'year' => $activeQuery['value'],
-                        ]) ?> (<?= count($episodes) ?>)
-                    <?php elseif ($activeQuery['type'] == 'season'): ?>
-                        <?= lang('Podcast.list_of_episodes_season', [
-                            'seasonNumber' => $activeQuery['value'],
-                        ]) ?> (<?= count($episodes) ?>)
-                    <?php endif; ?>
-                    </h1>
-                    <?php foreach ($episodes as $episode): ?>
-                        <article class="flex w-full max-w-lg p-4 mx-auto">
-                            <img
-                            loading="lazy"
-                            src="<?= $episode->image->thumbnail_url ?>"
-                            alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" />
-                            <div class="flex flex-col flex-1">
-                                <a class="text-sm hover:underline" href="<?= $episode->link ?>">
-                                    <h2 class="inline-flex justify-between w-full font-bold leading-none group">
-                                        <span class="mr-1 group-hover:underline"><?= $episode->title ?></span>
-                                        <?= episode_numbering(
-                                            $episode->number,
-                                            $episode->season_number,
-                                            'text-xs font-bold text-gray-600',
-                                            true
-                                        ) ?>
-                                    </h2>
-                                </a>
-                                <div class="mb-2 text-xs">
-                                    <time
-                                    pubdate
-                                    datetime="<?= $episode->published_at->format(
-                                        DateTime::ATOM
-                                    ) ?>"
-                                    title="<?= $episode->published_at ?>">
-                                    <?= lang('Common.mediumDate', [
-                                        $episode->published_at,
-                                    ]) ?>
-                                    </time>
-                                    <span class="mx-1">•</span>
-                                    <time datetime="PT<?= $episode->enclosure_duration ?>S">
-                                        <?= format_duration(
-                                            $episode->enclosure_duration
-                                        ) ?>
-                                    </time>
-                                </div>
-                                <audio controls preload="none" class="w-full mt-auto">
-                                    <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>">
-                                    Your browser does not support the audio tag.
-                                </audio>
-                            </div>
-                        </article>
-                    <?php endforeach; ?>
-                <?php else: ?>
-                    <h1 class="px-4 mb-2 text-xl text-center"><?= lang(
-                        'Podcast.no_episode'
-                    ) ?></h1>
-                    <p class="italic text-center"><?= lang(
-                        'Podcast.no_episode_hint'
-                    ) ?></p>
-                <?php endif; ?>
-            </div>
-        </section>
-    </main>
-    <footer class="px-2 py-4 border-t ">
-        <div class="container flex flex-col items-center justify-between mx-auto text-xs md:flex-row ">
-            <?= render_page_links('inline-flex mb-4 md:mb-0') ?>
-            <div class="flex flex-col items-center md:items-end">
-                <p><?= $podcast->copyright ?></p>
-                <p><?= lang('Common.powered_by', [
-                    'castopod' =>
-                        '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
-                ]) ?></p>
-            </div>
-        </div>
-    </footer>
-</body>
diff --git a/app/Views/podcast/_layout.php b/app/Views/podcast/_layout.php
new file mode 100644
index 0000000000..0a88b6de5c
--- /dev/null
+++ b/app/Views/podcast/_layout.php
@@ -0,0 +1,120 @@
+<?= helper('page') ?>
+
+<!DOCTYPE html>
+<html lang="<?= service('request')->getLocale() ?>">
+
+<head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+
+    <?= $this->renderSection('meta-tags') ?>
+    <?php if ($podcast->payment_pointer): ?>
+        <meta name="monetization" content="<?= $podcast->payment_pointer ?>" />
+    <?php endif; ?>
+
+    <link rel="stylesheet" href="/assets/index.css"/>
+    <script src="/assets/podcast.js" type="module"></script>
+</head>
+
+<body class="flex w-full min-h-screen pb-20 overflow-x-hidden lg:mx-auto lg:container bg-pine-50 sm:pb-0">
+    <?= $this->include('podcast/_partials/header') ?>
+
+    <main class="flex-shrink-0 w-full min-w-0 sm:w-auto sm:flex-1 sm:flex-shrink">
+        <?= $this->renderSection('content') ?>
+    </main>
+
+    <?= $this->include('podcast/_partials/sidebar') ?>
+    <nav class="fixed bottom-0 left-0 z-50 flex items-center w-full px-4 py-4 sm:hidden">
+        <div class="flex items-center w-full p-2 rounded-full shadow-2xl bg-pine-900">
+            <button
+            data-toggle="main-header"
+            data-toggle-class="sticky -translate-x-full"
+            class="flex-shrink-0 mr-3 overflow-hidden rounded-full focus:ring-2 focus:outline-none focus:ring-pine-50">
+            <img src="<?= $podcast->image
+                ->thumbnail_url ?>" alt="<?= $podcast->title ?>" class="h-14"/>
+            </button>
+            <p class="flex flex-col flex-1 min-w-0 mr-2 text-white">
+                <span class="text-sm font-semibold truncate"><?= $podcast->title ?></span>
+                <span class="text-xs">@<?= $podcast->name ?></span>
+            </p>
+            <?= anchor_popup(
+                route_to('follow', $podcast->name),
+                icon(
+                    'social/castopod',
+                    'mr-2 text-xl text-pink-200 group-hover:text-pink-50',
+                ) . lang('Podcast.follow'),
+                [
+                    'width' => 420,
+                    'height' => 620,
+                    'class' =>
+                        'group inline-flex items-center px-4 py-2 text-xs tracking-wider font-semibold text-white uppercase rounded-full shadow focus:outline-none focus:ring bg-rose-600',
+                ],
+            ) ?>
+            <button
+            data-toggle="main-sidebar"
+            data-toggle-class="translate-x-full"
+            data-toggle-body-class="-ml-64"
+            class="p-4 text-xl rounded-full focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon(
+                'menu',
+            ) ?><span class="sr-only"><?= lang(
+    'Podcast.toggle_podcast_sidebar',
+) ?></span></button>
+        </div>
+    </nav>
+
+    <button
+    data-toggle="main-sidebar"
+    data-toggle-class="translate-x-full"
+    data-toggle-body-class="-ml-64"
+    class="fixed z-40 hidden p-4 text-xl rounded-full shadow-2xl sm:block lg:hidden bottom-4 left-4 bg-pine-900 focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon(
+        'menu',
+    ) ?><span class="sr-only"><?= lang(
+    'Podcast.toggle_podcast_sidebar',
+) ?></span></button>
+
+    <!-- Funding links modal -->
+    <div id="funding-links" class="fixed top-0 left-0 z-50 flex items-center justify-center hidden w-screen h-screen">
+        <div
+        class="absolute w-full h-full bg-pine-900 bg-opacity-90"
+        role="button"
+        data-toggle="funding-links"
+        data-toggle-class="hidden"
+        aria-label="<?= lang('Common.close') ?>"></div>
+        <div class="z-10 w-full max-w-xl bg-white rounded-lg shadow-2xl">
+            <div class="flex justify-between px-4 py-2 border-b">
+                <h3 class="self-center text-lg"><?= lang(
+                    'Podcast.funding_links',
+                    ['podcastTitle' => $podcast->title],
+                ) ?></h3>
+                <button
+                data-toggle="funding-links"
+                data-toggle-class="hidden"
+                aria-label="<?= lang('Common.close') ?>"
+                class="self-start p-1 text-2xl"><?= icon('close') ?></button>
+            </div>
+            <div class="flex flex-col items-start p-4 space-y-4">
+                <?php foreach (
+                    $podcast->fundingPlatforms
+                    as $fundingPlatform
+                ): ?>
+                    <?php if ($fundingPlatform->is_visible): ?>
+                        <a
+                        href="<?= $fundingPlatform->link_url ?>"
+                        title="<?= $fundingPlatform->link_content ?>"
+                        target="_blank"
+                        rel="noopener noreferrer"
+                        class="inline-flex items-center font-semibold text-pine-900">
+                        <?= icon(
+                            $fundingPlatform->type .
+                                '/' .
+                                $fundingPlatform->slug,
+                            'mr-2',
+                        ) . $fundingPlatform->link_url ?>
+                        </a>
+                    <?php endif; ?>
+                <?php endforeach; ?>
+            </div>
+        </div>
+    </div>
+</body>
diff --git a/app/Views/podcast/_layout_authenticated.php b/app/Views/podcast/_layout_authenticated.php
new file mode 100644
index 0000000000..102929606d
--- /dev/null
+++ b/app/Views/podcast/_layout_authenticated.php
@@ -0,0 +1,147 @@
+<?= helper('page') ?>
+
+<!DOCTYPE html>
+<html lang="<?= service('request')->getLocale() ?>">
+
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+
+    <?= $this->renderSection('meta-tags') ?>
+    <?php if ($podcast->payment_pointer): ?>
+        <meta name="monetization" content="<?= $podcast->payment_pointer ?>" />
+    <?php endif; ?>
+
+    <link rel="stylesheet" href="/assets/index.css" />
+    <script src="/assets/podcast.js" type="module"></script>
+</head>
+
+<body class="flex w-full min-h-screen pt-12 pb-20 overflow-x-hidden bg-pine-50 lg:mx-auto lg:container sm:pb-0">
+    <div class="fixed top-0 left-0 z-50 flex items-center justify-between w-full h-12 px-4 text-white shadow bg-pine-900">
+        <?= anchor(
+            route_to('admin'),
+            'castopod' . svg('castopod-logo', 'h-5 ml-1'),
+            [
+                'class' =>
+                    'text-2xl inline-flex items-baseline font-bold font-display',
+            ],
+        ) ?>
+        <?php if (user()->podcasts): ?>
+            <button type="button" class="inline-flex items-center px-6 py-2 mt-auto font-semibold outline-none focus:ring" id="interact-as-dropdown" data-dropdown="button" data-dropdown-target="interact-as-dropdown-menu" aria-haspopup="true" aria-expanded="false">
+                <img src="<?= interact_as_actor()
+                    ->avatar_image_url ?>" class="w-8 h-8 mr-2 rounded-full" />
+                <?= '@' . interact_as_actor()->username ?>
+                <?= icon('caret-down', 'ml-auto') ?>
+            </button>
+            <nav id="interact-as-dropdown-menu" class="absolute z-50 flex flex-col py-2 text-black whitespace-no-wrap bg-white border rounded shadow" aria-labelledby="my-accountDropdown" data-dropdown="menu" data-dropdown-placement="bottom-end">
+                <span class="px-4 text-xs tracking-wider text-gray-700 uppercase"><?= lang(
+                    'Admin.choose_interact',
+                ) ?></span>
+                <form action="<?= route_to(
+                    'interact-as-actor',
+                ) ?>" method="POST" class="flex flex-col">
+                    <?= csrf_field() ?>
+                    <?php foreach (user()->podcasts as $userPodcast): ?>
+                        <button class="inline-flex items-center w-full px-4 py-1 hover:bg-gray-100" id="<?= "interact-as-actor-{$userPodcast->id}" ?>" name="actor_id" value="<?= $userPodcast->actor_id ?>">
+                            <span class="inline-flex items-center flex-1">
+                                <img src="<?= $userPodcast->image
+                                    ->thumbnail_url ?>" class="w-8 h-8 mr-2 rounded-full" /><?= $userPodcast->title ?>
+                                <?php if (
+                                    interact_as_actor()->id ===
+                                    $userPodcast->actor_id
+                                ): ?>
+                            </span>
+                            <?= icon(
+                                'check',
+                                'ml-4 bg-pine-900 text-white rounded-full',
+                            ) ?>
+                        <?php endif; ?>
+                        </button>
+                    <?php endforeach; ?>
+                </form>
+            </nav>
+        <?php endif; ?>
+    </div>
+    <?= $this->include('podcast/_partials/header') ?>
+
+    <main class="flex-shrink-0 w-full min-w-0 sm:w-auto sm:flex-1 sm:flex-shrink">
+        <?= $this->renderSection('content') ?>
+    </main>
+
+    <?= $this->include('podcast/_partials/sidebar') ?>
+
+    <nav class="fixed bottom-0 left-0 z-50 flex items-center w-full px-4 py-4 sm:hidden">
+        <div class="flex items-center w-full p-2 rounded-full shadow-2xl bg-pine-900">
+            <button data-toggle="main-header" data-toggle-class="sticky -translate-x-full" class="flex-shrink-0 mr-3 overflow-hidden rounded-full focus:ring-2 focus:outline-none focus:ring-pine-50">
+                <img src="<?= $podcast->image
+                    ->thumbnail_url ?>" alt="<?= $podcast->title ?>" class="h-14" />
+            </button>
+            <p class="flex flex-col flex-1 min-w-0 mr-2 text-white">
+                <span class="text-sm font-semibold truncate"><?= $podcast->title ?></span>
+                <span class="text-xs">@<?= $podcast->name ?></span>
+            </p>
+            <?= anchor_popup(
+                route_to('follow', $podcast->name),
+                icon(
+                    'social/castopod',
+                    'mr-2 text-xl text-pink-200 group-hover:text-pink-50',
+                ) . lang('Podcast.follow'),
+                [
+                    'width' => 420,
+                    'height' => 620,
+                    'class' =>
+                        'group inline-flex items-center px-4 py-2 text-xs tracking-wider font-semibold text-white uppercase rounded-full shadow focus:outline-none focus:ring bg-rose-600',
+                ],
+            ) ?>
+            <button data-toggle="main-sidebar" data-toggle-class="translate-x-full" data-toggle-body-class="-ml-64" class="p-4 text-xl rounded-full focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon(
+                'menu',
+            ) ?><span class="sr-only"><?= lang(
+    'Podcast.toggle_podcast_sidebar',
+) ?></span></button>
+        </div>
+    </nav>
+
+    <button data-toggle="main-sidebar" data-toggle-class="translate-x-full" data-toggle-body-class="-ml-64" class="fixed z-40 hidden p-4 text-xl rounded-full shadow-2xl sm:block lg:hidden bottom-4 left-4 bg-pine-900 focus:outline-none focus:ring-2 focus:ring-pine-600 text-pine-200 hover:text-pine-50"><?= icon(
+        'menu',
+    ) ?><span class="sr-only"><?= lang(
+    'Podcast.toggle_podcast_sidebar',
+) ?></span></button>
+
+    <!-- Funding links modal -->
+    <div id="funding-links" class="fixed top-0 left-0 z-50 flex items-center justify-center hidden w-screen h-screen">
+        <div class="absolute w-full h-full bg-pine-900 bg-opacity-90" role="button" data-toggle="funding-links" data-toggle-class="hidden" aria-label="<?= lang(
+            'Common.close',
+        ) ?>"></div>
+        <div class="z-10 w-full max-w-xl bg-white rounded-lg shadow-2xl">
+            <div class="flex justify-between px-4 py-2 border-b">
+                <h3 class="self-center text-lg"><?= lang(
+                    'Podcast.funding_links',
+                    ['podcastTitle' => $podcast->title],
+                ) ?></h3>
+                <button data-toggle="funding-links" data-toggle-class="hidden" aria-label="<?= lang(
+                    'Common.close',
+                ) ?>" class="self-start p-1 text-2xl">
+                    <?= icon('close') ?>
+                </button>
+            </div>
+            <div class="flex flex-col items-start p-4 space-y-4">
+                <?php foreach (
+                    $podcast->fundingPlatforms
+                    as $fundingPlatform
+                ): ?>
+                    <?php if ($fundingPlatform->is_visible): ?>
+                        <a href="<?= $fundingPlatform->link_url ?>" title="<?= $fundingPlatform->link_content ?>" target="_blank" rel="noopener noreferrer" class="inline-flex items-center font-semibold text-pine-900">
+                            <?= icon(
+                                $fundingPlatform->type .
+                                    '/' .
+                                    $fundingPlatform->slug,
+                                'text-2xl text-gray-400 mr-2',
+                            ) . $fundingPlatform->link_url ?>
+                        </a>
+                    <?php endif; ?>
+                <?php endforeach; ?>
+            </div>
+        </div>
+    </div>
+</body>
\ No newline at end of file
diff --git a/app/Views/podcast/_partials/episode_card.php b/app/Views/podcast/_partials/episode_card.php
new file mode 100644
index 0000000000..a3bec75b23
--- /dev/null
+++ b/app/Views/podcast/_partials/episode_card.php
@@ -0,0 +1,36 @@
+<div class="flex">
+    <img
+    src="<?= $episode->image->thumbnail_url ?>"
+    alt="<?= $episode->title ?>" class="w-24 h-24"/>
+    <div class="flex flex-col flex-1">
+        <a href="<?= $episode->link ?>" class="flex-1 px-4 py-2 bg-gray-100">
+            <div class="flex items-baseline">
+                <span class="flex-1 w-0 mr-2 font-semibold leading-none truncate"><?= $episode->title ?></span>
+                <?= episode_numbering(
+                    $episode->number,
+                    $episode->season_number,
+                    'text-xs font-semibold text-gray-600',
+                    true,
+                ) ?>
+            </div>
+            <div class="text-xs text-gray-800">
+                <time
+                itemprop="published"
+                datetime="<?= $episode->published_at->format(DateTime::ATOM) ?>"
+                title="<?= $episode->published_at ?>">
+                <?= lang('Common.mediumDate', [$episode->published_at]) ?>
+                </time>
+                <span class="mx-1">•</span>
+                <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                    <?= format_duration($episode->enclosure_duration) ?>
+                </time>
+            </div>
+        </a>
+        <audio controls preload="none" class="w-full mt-auto">
+            <source
+            src="<?= $episode->enclosure_web_url ?>"
+            type="<?= $episode->enclosure_mimetype ?>">
+            Your browser does not support the audio tag.
+        </audio>
+    </div>
+</div>
diff --git a/app/Views/podcast/_partials/header.php b/app/Views/podcast/_partials/header.php
new file mode 100644
index 0000000000..9e706df1b6
--- /dev/null
+++ b/app/Views/podcast/_partials/header.php
@@ -0,0 +1,95 @@
+<header id="main-header" class="fixed top-0 left-0 flex-col flex-shrink-0 h-screen transform -translate-x-full sm:left-auto sm:-translate-x-0 sm:sticky w-80 sm:w-64 lg:w-80 xl:w-112 sm:flex">
+    <?php if ($podcast->actor->cover_image_url): ?>
+        <img src="<?= $podcast->actor
+            ->cover_image_url ?>" alt="" class="object-cover w-full h-48 bg-pine-900"/>
+    <?php else: ?>
+            <div class="w-full h-48 bg-pine-900"></div>
+    <?php endif; ?>
+    <div class="flex items-center justify-between px-4 py-2 mb-4 lg:px-6 -mt-14 lg:-mt-16 xl:-mt-20">
+        <img src="<?= $podcast->image
+            ->thumbnail_url ?>" alt="<?= $podcast->title ?>" class="h-24 rounded-full shadow-xl xl:h-36 lg:h-28 ring-4 ring-pine-50" />
+        <?= anchor_popup(
+            route_to('follow', $podcast->name),
+            icon(
+                'social/castopod',
+                'mr-2 text-xl text-pink-200 group-hover:text-pink-50',
+            ) . lang('Podcast.follow'),
+            [
+                'width' => 420,
+                'height' => 620,
+                'class' =>
+                    'group inline-flex items-center px-4 py-2 text-xs tracking-wider font-semibold text-white uppercase rounded-full shadow focus:outline-none focus:ring bg-rose-600',
+            ],
+        ) ?>
+    </div>
+    <div class="px-6">
+        <h1 class="inline-flex items-center text-2xl font-bold leading-none font-display"><?= $podcast->title .
+            ($podcast->parental_advisory === 'explicit'
+                ? '<span class="px-1 ml-2 text-xs font-semibold leading-tight tracking-wider text-gray-600 uppercase border-2 border-gray-500">' .
+                    lang('Common.explicit') .
+                    '</span>'
+                : '') ?></h1>
+        <p class="mb-4 font-semibold text-gray-600">@<?= $podcast->name ?></p>
+        <div class="mb-2"><?= $podcast->description_html ?></div>
+        <?php if ($podcast->location_name): ?>
+            <?= location_link(
+                $podcast->location_name,
+                $podcast->location_geo,
+                $podcast->location_osmid,
+                'text-sm mb-4',
+            ) ?>
+        <?php endif; ?>
+        <div class="mb-6 space-x-4">
+            <span class="px-2 py-1 text-sm text-gray-800 bg-gray-200">
+                <?= lang(
+                    'Podcast.category_options.' . $podcast->category->code,
+                ) ?>
+            </span>
+            <?php foreach ($podcast->other_categories as $other_category): ?>
+                <span class="px-2 py-1 text-sm text-gray-800 bg-gray-200">
+                    <?= lang(
+                        'Podcast.category_options.' . $other_category->code,
+                    ) ?>
+                </span>
+            <?php endforeach; ?>
+        </div>
+        <?php if (!empty($persons)): ?>
+        <div class="flex mb-6 space-x-2">
+            <?php foreach ($persons as $person): ?>
+                <?php if ($person['information_url']): ?>
+                    <a href="<?= $person[
+                        'information_url'
+                    ] ?>" target="_blank" rel="noreferrer noopener">
+                        <img
+                        src="<?= $person['thumbnail_url'] ?>"
+                        alt="<?= $person['full_name'] ?>"
+                        class="object-cover w-12 h-12 rounded-full"
+                        title="[<?= $person['full_name'] ?>] <?= $person[
+    'roles'
+] ?>" />
+                    </a>
+                <?php else: ?>
+                    <img
+                    src="<?= $person['thumbnail_url'] ?>"
+                    alt="<?= $person['full_name'] ?>"
+                    class="object-cover w-12 h-12 rounded-full"
+                    title="[<?= $person['full_name'] ?>] <?= $person[
+    'roles'
+] ?>" />
+                <?php endif; ?>
+            <?php endforeach; ?>
+        </div>
+        <?php endif; ?>
+        <div class="space-x-4">
+            <a href="#" class="hover:underline"><?= lang('Podcast.followers', [
+                'numberOfFollowers' => $podcast->actor->followers_count,
+            ]) ?></a>
+            <a href="<?= route_to(
+                'podcast-activity',
+                $podcast->name,
+            ) ?>" class="hover:underline"><?= lang('Podcast.notes', [
+    'numberOfNotes' => $podcast->actor->notes_count,
+]) ?></a>
+        </div>
+    </div>
+</header>
\ No newline at end of file
diff --git a/app/Views/podcast/_partials/note.php b/app/Views/podcast/_partials/note.php
new file mode 100644
index 0000000000..757f478588
--- /dev/null
+++ b/app/Views/podcast/_partials/note.php
@@ -0,0 +1,41 @@
+<article class="relative z-10 w-full bg-white shadow-md rounded-2xl">
+    <header class="flex px-6 py-4">
+        <img src="<?= $note->actor
+            ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" />
+        <div class="flex flex-col min-w-0">
+            <a href="<?= $note->actor
+                ->uri ?>" class="flex items-baseline hover:underline" <?= !$note
+    ->actor->is_local
+    ? 'target="_blank" rel="noopener noreferrer"'
+    : '' ?>>
+                <span class="mr-2 font-semibold truncate"><?= $note->actor
+                    ->display_name ?></span>
+                <span class="text-sm text-gray-500 truncate">@<?= $note->actor
+                    ->username .
+                    (!$note->actor->is_local
+                        ? '@' . $note->actor->domain
+                        : '') ?></span>
+            </a>
+            <a href="<?= route_to('note', $podcast->name, $note->id) ?>"
+            class="text-xs text-gray-500">
+                <time
+                itemprop="published"
+                datetime="<?= $note->published_at->format(DateTime::ATOM) ?>"
+                title="<?= $note->published_at ?>"
+                ><?= lang('Common.mediumDate', [$note->published_at]) ?></time>
+            </a>
+        </div>
+    </header>
+    <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div>
+    <?php if ($note->preview_card): ?>
+        <?= view('podcast/_partials/preview_card', [
+            'preview_card' => $note->preview_card,
+        ]) ?>
+    <?php endif; ?>
+    <?php if ($note->episode_id): ?>
+        <?= view('podcast/_partials/episode_card', [
+            'episode' => $note->episode,
+        ]) ?>
+    <?php endif; ?>
+    <?= $this->include('podcast/_partials/note_actions') ?>
+</article>
diff --git a/app/Views/podcast/_partials/note_actions.php b/app/Views/podcast/_partials/note_actions.php
new file mode 100644
index 0000000000..ab2f9bf3ac
--- /dev/null
+++ b/app/Views/podcast/_partials/note_actions.php
@@ -0,0 +1,36 @@
+<footer class="flex justify-around px-6 py-3">
+    <?= anchor(
+        route_to('note', $podcast->name, $note->id),
+        icon('chat', 'text-2xl mr-1 text-gray-400') . $note->replies_count,
+        [
+            'class' => 'inline-flex items-center hover:underline',
+            'title' => lang('Note.replies', [
+                'numberOfReplies' => $note->replies_count,
+            ]),
+        ],
+    ) ?>
+    <?= anchor_popup(
+        route_to('note-remote-action', $podcast->name, $note->id, 'reblog'),
+        icon('repeat', 'text-2xl mr-1 text-gray-400') . $note->reblogs_count,
+        [
+            'class' => 'inline-flex items-center hover:underline',
+            'width' => 420,
+            'height' => 620,
+            'title' => lang('Note.reblogs', [
+                'numberOfReblogs' => $note->reblogs_count,
+            ]),
+        ],
+    ) ?>
+    <?= anchor_popup(
+        route_to('note-remote-action', $podcast->name, $note->id, 'favourite'),
+        icon('heart', 'text-2xl mr-1 text-gray-400') . $note->favourites_count,
+        [
+            'class' => 'inline-flex items-center hover:underline',
+            'width' => 420,
+            'height' => 620,
+            'title' => lang('Note.favourites', [
+                'numberOfFavourites' => $note->favourites_count,
+            ]),
+        ],
+    ) ?>
+</footer>
diff --git a/app/Views/podcast/_partials/note_actions_authenticated.php b/app/Views/podcast/_partials/note_actions_authenticated.php
new file mode 100644
index 0000000000..61248ab8b4
--- /dev/null
+++ b/app/Views/podcast/_partials/note_actions_authenticated.php
@@ -0,0 +1,89 @@
+<footer class="px-6 py-3">
+    <form action="<?= route_to(
+        'note-attempt-action',
+        interact_as_actor()->username,
+        $note->id,
+    ) ?>" method="POST" class="flex justify-around">
+        <?= csrf_field() ?>
+        <?= anchor(
+            route_to('note', $podcast->name, $note->id),
+            icon('chat', 'text-2xl mr-1 text-gray-400') . $note->replies_count,
+            [
+                'class' => 'inline-flex items-center hover:underline',
+                'title' => lang('Note.replies', [
+                    'numberOfReplies' => $note->replies_count,
+                ]),
+            ],
+        ) ?>
+        <button type="submit" name="action" value="reblog" class="inline-flex items-center hover:underline" title="<?= lang(
+            'Note.reblogs',
+            [
+                'numberOfReblogs' => $note->reblogs_count,
+            ],
+        ) ?>"><?= icon('repeat', 'text-2xl mr-1 text-gray-400') .
+    $note->reblogs_count ?></button>
+        <button type="submit" name="action" value="favourite" class="inline-flex items-center hover:underline" title="<?= lang(
+            'Note.favourites',
+            [
+                'numberOfFavourites' => $note->favourites_count,
+            ],
+        ) ?>"><?= icon('heart', 'text-2xl mr-1 text-gray-400') .
+    $note->favourites_count ?></button>
+        <button id="<?= $note->id .
+            '-more-dropdown' ?>" type="button" class="px-2 py-1 text-2xl text-gray-500 outline-none focus:ring" data-dropdown="button" data-dropdown-target="<?= $note->id .
+    '-more-dropdown-menu' ?>" aria-label="<?= lang(
+    'Common.more',
+) ?>" aria-haspopup="true" aria-expanded="false"><?= icon('more') ?>
+        </button>
+    </form>
+    <nav id="<?= $note->id .
+        '-more-dropdown-menu' ?>" class="flex flex-col py-2 text-sm bg-white border rounded-lg shadow" aria-labelledby="<?= $note->id .
+    '-more-dropdown' ?>" data-dropdown="menu" data-dropdown-placement="bottom">
+        <?= anchor(
+            route_to('note', $podcast->name, $note->id),
+            lang('Note.expand'),
+            [
+                'class' => 'px-4 py-1 hover:bg-gray-100',
+            ],
+        ) ?>
+        <form action="<?= route_to(
+            'note-attempt-block-actor',
+            interact_as_actor()->username,
+            $note->id,
+        ) ?>" method="POST">
+            <?= csrf_field() ?>
+            <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang(
+                'Note.block_actor',
+                [
+                    'actorUsername' => $note->actor->username,
+                ],
+            ) ?></button>
+        </form>
+        <form action="<?= route_to(
+            'note-attempt-block-domain',
+            interact_as_actor()->username,
+            $note->id,
+        ) ?>" method="POST">
+            <?= csrf_field() ?>
+            <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang(
+                'Note.block_domain',
+                [
+                    'actorDomain' => $note->actor->domain,
+                ],
+            ) ?></button>
+        </form>
+        <?php if ($note->actor->is_local): ?>
+            <hr class="my-2" />
+            <form action="<?= route_to(
+                'note-attempt-delete',
+                $note->actor->username,
+                $note->id,
+            ) ?>" method="POST">
+                <?= csrf_field() ?>
+                <button class="w-full px-4 py-1 font-semibold text-left text-red-600 hover:bg-gray-100"><?= lang(
+                    'Note.delete',
+                ) ?></button>
+            </form>
+        <?php endif; ?>
+    </nav>
+</footer>
\ No newline at end of file
diff --git a/app/Views/podcast/_partials/note_authenticated.php b/app/Views/podcast/_partials/note_authenticated.php
new file mode 100644
index 0000000000..44279df1dc
--- /dev/null
+++ b/app/Views/podcast/_partials/note_authenticated.php
@@ -0,0 +1,41 @@
+<article class="relative z-10 w-full bg-white shadow-md rounded-2xl">
+    <header class="flex px-6 py-4">
+        <img src="<?= $note->actor
+            ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" />
+        <div class="flex flex-col min-w-0">
+            <a href="<?= $note->actor
+                ->uri ?>" class="flex items-baseline hover:underline" <?= !$note
+    ->actor->is_local
+    ? 'target="_blank" rel="noopener noreferrer"'
+    : '' ?>>
+                <span class="mr-2 font-semibold truncate"><?= $note->actor
+                    ->display_name ?></span>
+                <span class="text-sm text-gray-500 truncate">@<?= $note->actor
+                    ->username .
+                    (!$note->actor->is_local
+                        ? '@' . $note->actor->domain
+                        : '') ?></span>
+            </a>
+            <a href="<?= route_to('note', $podcast->name, $note->id) ?>"
+            class="text-xs text-gray-500">
+                <time
+                itemprop="published"
+                datetime="<?= $note->created_at->format(DateTime::ATOM) ?>"
+                title="<?= $note->created_at ?>"
+                ><?= lang('Common.mediumDate', [$note->created_at]) ?></time>
+            </a>
+        </div>
+    </header>
+    <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div>
+    <?php if ($note->preview_card): ?>
+            <?= view('podcast/_partials/preview_card', [
+                'preview_card' => $note->preview_card,
+            ]) ?>
+    <?php endif; ?>
+    <?php if ($note->episode_id): ?>
+        <?= view('podcast/_partials/episode_card', [
+            'episode' => $note->episode,
+        ]) ?>
+    <?php endif; ?>
+    <?= $this->include('podcast/_partials/note_actions_authenticated') ?>
+</article>
diff --git a/app/Views/podcast/_partials/note_with_replies.php b/app/Views/podcast/_partials/note_with_replies.php
new file mode 100644
index 0000000000..fa9a769dbd
--- /dev/null
+++ b/app/Views/podcast/_partials/note_with_replies.php
@@ -0,0 +1,21 @@
+<?= $this->include('podcast/_partials/note') ?>
+<div class="-mt-2 overflow-hidden border-b border-l border-r note-replies rounded-b-xl">
+
+<div class="px-6 pt-8 pb-4 bg-gray-50">
+<?= anchor_popup(
+    route_to('note-remote-action', $podcast->name, $note->id, 'reply'),
+    lang('Note.reply_to', ['actorUsername' => $note->actor->username]),
+    [
+        'class' =>
+            'text-center justify-center font-semibold rounded-full shadow relative z-10 px-4 py-2 w-full bg-rose-600 text-white inline-flex items-center hover:bg-rose-700',
+        'width' => 420,
+        'height' => 620,
+    ],
+) ?>
+</div>
+
+
+<?php foreach ($note->replies as $reply): ?>
+    <?= view('podcast/_partials/reply', ['reply' => $reply]) ?>
+<?php endforeach; ?>
+</div>
diff --git a/app/Views/podcast/_partials/note_with_replies_authenticated.php b/app/Views/podcast/_partials/note_with_replies_authenticated.php
new file mode 100644
index 0000000000..429d99f3db
--- /dev/null
+++ b/app/Views/podcast/_partials/note_with_replies_authenticated.php
@@ -0,0 +1,45 @@
+<?= $this->include('podcast/_partials/note_authenticated') ?>
+<div class="-mt-2 overflow-hidden border-b border-l border-r note-replies rounded-b-xl">
+<?= form_open(
+    route_to('note-attempt-action', interact_as_actor()->username, $note->id),
+    [
+        'class' => 'bg-gray-50 flex px-6 pt-8 pb-4',
+    ],
+) ?>
+<img src="<?= interact_as_actor()
+    ->avatar_image_url ?>" alt="<?= interact_as_actor()
+    ->display_name ?>" class="w-12 h-12 mr-4 rounded-full ring-gray-50 ring-2" />
+<div class="flex flex-col flex-1">
+<?= form_textarea(
+    [
+        'id' => 'message',
+        'name' => 'message',
+        'class' => 'form-textarea mb-4 w-full',
+        'required' => 'required',
+        'placeholder' => lang('Note.form.reply_to_placeholder', [
+            'actorUsername' => $note->actor->username,
+        ]),
+    ],
+    old('message', '', false),
+    [
+        'rows' => 1,
+    ],
+) ?>
+<?= button(
+    lang('Note.form.submit_reply'),
+    null,
+    ['variant' => 'primary', 'size' => 'small'],
+    [
+        'type' => 'submit',
+        'class' => 'self-end',
+        'name' => 'action',
+        'value' => 'reply',
+    ],
+) ?>
+</div>
+<?= form_close() ?>
+
+<?php foreach ($note->replies as $reply): ?>
+    <?= view('podcast/_partials/reply_authenticated', ['reply' => $reply]) ?>
+<?php endforeach; ?>
+</div>
diff --git a/app/Views/podcast/_partials/preview_card.php b/app/Views/podcast/_partials/preview_card.php
new file mode 100644
index 0000000000..cf2b58ba86
--- /dev/null
+++ b/app/Views/podcast/_partials/preview_card.php
@@ -0,0 +1,45 @@
+<?php if ($preview_card->type === 'image'): ?>
+<a href="<?= $preview_card->url ?>" class="flex flex-col bg-gray-100" target="_blank" rel="noopener noreferrer">
+    <?php if ($preview_card->image): ?>
+    <div class="relative group">
+        <?= icon(
+            'external-link',
+            'absolute inset-0 m-auto text-6xl bg-pine-800 ring-4 ring-white bg-opacity-50 group-hover:bg-opacity-75 text-white rounded-full p-2',
+        ) ?>
+        <img src="<?= $preview_card->image ?>" alt="<?= $preview_card->title ?>" class="object-cover w-full h-80" />
+    </div>
+    <?php endif; ?>
+
+    <div class="flex flex-col flex-1 px-4 py-2">
+        <span class="text-xs tracking-wider text-gray-600 uppercase"><?= $preview_card->provider_name ?></span>
+    </div>
+</a>
+<?php elseif ($preview_card->type === 'video'): ?>
+<a href="<?= $preview_card->url ?>" class="flex flex-col bg-gray-100" target="_blank" rel="noopener noreferrer">
+    <?php if ($preview_card->image): ?>
+    <div class="relative group">
+        <?= icon(
+            'play',
+            'absolute inset-0 m-auto text-6xl bg-pine-800 ring-4 ring-white bg-opacity-50 group-hover:bg-opacity-75 text-white rounded-full p-2',
+        ) ?>
+        <img class="object-cover w-full h-80" src="<?= $preview_card->image ?>" alt="<?= $preview_card->title ?>" />
+    </div>
+    <?php endif; ?>
+
+    <div class="flex flex-col flex-1 px-4 py-2">
+        <span class="text-xs tracking-wider text-gray-600 uppercase"><?= $preview_card->provider_name ?></span>
+        <span class="mb-2 font-semibold truncate"><?= $preview_card->title ?></span>
+    </div>
+</a>
+<?php else: ?>
+<a href="<?= $preview_card->url ?>" class="flex items-center bg-gray-100">
+    <?php if ($preview_card->image): ?>
+    <img src="<?= $preview_card->image ?>" alt="<?= $preview_card->title ?>" class="object-cover w-20 h-20" />
+    <?php endif; ?>
+    <p class="flex flex-col flex-1 px-4 py-2">
+        <span class="text-xs tracking-wider text-gray-600 uppercase"><?= $preview_card->provider_name ?></span>
+        <span class="mb-2 font-semibold truncate"><?= $preview_card->title ?></span>
+    </p>
+</a>
+<?php endif;
+?>
diff --git a/app/Views/podcast/_partials/reblog.php b/app/Views/podcast/_partials/reblog.php
new file mode 100644
index 0000000000..12077674b1
--- /dev/null
+++ b/app/Views/podcast/_partials/reblog.php
@@ -0,0 +1,48 @@
+<article class="relative z-10 w-full bg-white shadow-md rounded-2xl">
+    <p class="inline-flex px-6 pt-4 text-xs text-gray-700"><?= icon(
+        'repeat',
+        'text-lg mr-2 text-gray-400',
+    ) .
+        lang('Note.actor_shared', [
+            'actor' => $note->actor->display_name,
+        ]) ?></p>
+    <header class="flex px-6 py-4">
+        <img src="<?= $note->actor
+            ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" />
+        <div class="flex flex-col min-w-0">
+            <a href="<?= $note->actor
+                ->uri ?>" class="flex items-baseline hover:underline" <?= !$note
+    ->actor->is_local
+    ? 'target="_blank" rel="noopener noreferrer"'
+    : '' ?>>
+                <span class="mr-2 font-semibold truncate"><?= $note->actor
+                    ->display_name ?></span>
+                <span class="text-sm text-gray-500 truncate">@<?= $note->actor
+                    ->username .
+                    (!$note->actor->is_local
+                        ? '@' . $note->actor->domain
+                        : '') ?></span>
+            </a>
+            <a href="<?= route_to('note', $podcast->name, $note->id) ?>"
+            class="text-xs text-gray-500">
+                <time
+                itemprop="published"
+                datetime="<?= $note->published_at->format(DateTime::ATOM) ?>"
+                title="<?= $note->published_at ?>"
+                ><?= lang('Common.mediumDate', [$note->published_at]) ?></time>
+            </a>
+        </div>
+    </header>
+    <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div>
+    <?php if ($note->preview_card): ?>
+        <?= view('podcast/_partials/preview_card', [
+            'preview_card' => $note->preview_card,
+        ]) ?>
+    <?php endif; ?>
+    <?php if ($note->episode_id): ?>
+        <?= view('podcast/_partials/episode_card', [
+            'episode' => $note->episode,
+        ]) ?>
+    <?php endif; ?>
+    <?= $this->include('podcast/_partials/note_actions') ?>
+</article>
diff --git a/app/Views/podcast/_partials/reblog_authenticated.php b/app/Views/podcast/_partials/reblog_authenticated.php
new file mode 100644
index 0000000000..bfb018068d
--- /dev/null
+++ b/app/Views/podcast/_partials/reblog_authenticated.php
@@ -0,0 +1,48 @@
+<article class="relative z-10 w-full bg-white shadow-md rounded-2xl">
+    <p class="inline-flex px-6 pt-4 text-xs text-gray-700"><?= icon(
+        'repeat',
+        'text-lg mr-2 text-gray-400',
+    ) .
+        lang('Note.actor_shared', [
+            'actor' => $note->actor->display_name,
+        ]) ?></p>
+    <header class="flex px-6 py-4">
+        <img src="<?= $note->actor
+            ->avatar_image_url ?>" alt="<?= $note->display_name ?>" class="w-12 h-12 mr-4 rounded-full" />
+        <div class="flex flex-col min-w-0">
+            <a href="<?= $note->actor
+                ->uri ?>" class="flex items-baseline hover:underline" <?= !$note
+    ->actor->is_local
+    ? 'target="_blank" rel="noopener noreferrer"'
+    : '' ?>>
+                <span class="mr-2 font-semibold truncate"><?= $note->actor
+                    ->display_name ?></span>
+                <span class="text-sm text-gray-500 truncate">@<?= $note->actor
+                    ->username .
+                    (!$note->actor->is_local
+                        ? '@' . $note->actor->domain
+                        : '') ?></span>
+            </a>
+            <a href="<?= route_to('note', $podcast->name, $note->id) ?>"
+            class="text-xs text-gray-500">
+                <time
+                itemprop="published"
+                datetime="<?= $note->published_at->format(DateTime::ATOM) ?>"
+                title="<?= $note->published_at ?>"
+                ><?= lang('Common.mediumDate', [$note->published_at]) ?></time>
+            </a>
+        </div>
+    </header>
+    <div class="px-6 mb-4 note-content"><?= $note->message_html ?></div>
+    <?php if ($note->preview_card): ?>
+        <?= view('podcast/_partials/preview_card', [
+            'preview_card' => $note->preview_card,
+        ]) ?>
+    <?php endif; ?>
+    <?php if ($note->episode_id): ?>
+        <?= view('podcast/_partials/episode_card', [
+            'episode' => $note->episode,
+        ]) ?>
+    <?php endif; ?>
+    <?= $this->include('podcast/_partials/note_actions_authenticated') ?>
+</article>
diff --git a/app/Views/podcast/_partials/reply.php b/app/Views/podcast/_partials/reply.php
new file mode 100644
index 0000000000..2d36a450eb
--- /dev/null
+++ b/app/Views/podcast/_partials/reply.php
@@ -0,0 +1,29 @@
+<article class="flex px-6 py-4 bg-gray-50">
+    <img src="<?= $reply->actor->avatar_image_url ?>" alt="<?= $reply->actor
+    ->display_name ?>" class="w-12 h-12 mr-4 rounded-full ring-gray-50 ring-2" />
+    <div class="flex flex-col flex-1 min-w-0">
+        <header class="flex items-center mb-2">
+            <a href="<?= $reply->actor
+                ->uri ?>" class="mr-2 text-base font-semibold truncate hover:underline" <?= !$reply
+    ->actor->is_local
+    ? 'target="_blank" rel="noopener noreferrer"'
+    : '' ?>><?= $reply->actor
+    ->display_name ?><span class="ml-1 text-sm font-normal text-gray-600">@<?= $reply
+    ->actor->username .
+    (!$reply->actor->is_local ? '@' . $reply->actor->domain : '') ?></span></a>
+            <time
+            class="flex-shrink-0 ml-auto text-xs text-gray-600"
+            itemprop="published"
+            datetime="<?= $reply->published_at->format(DateTime::ATOM) ?>"
+            title="<?= $reply->published_at ?>"
+            ><?= lang('Common.mediumDate', [$reply->published_at]) ?></time>
+        </header>
+        <p class="mb-2 note-content"><?= $reply->message_html ?></p>
+        <?php if ($reply->preview_card): ?>
+            <?= view('podcast/_partials/preview_card', [
+                'preview_card' => $reply->preview_card,
+            ]) ?>
+        <?php endif; ?>
+        <?= $this->include('podcast/_partials/reply_actions') ?>
+    </div>
+</article>
diff --git a/app/Views/podcast/_partials/reply_actions.php b/app/Views/podcast/_partials/reply_actions.php
new file mode 100644
index 0000000000..99895321cd
--- /dev/null
+++ b/app/Views/podcast/_partials/reply_actions.php
@@ -0,0 +1,36 @@
+<footer class="mt-2 space-x-6 text-sm">
+    <?= anchor(
+        route_to('note', $podcast->name, $reply->id),
+        icon('chat', 'text-xl mr-1 text-gray-400') . $reply->replies_count,
+        [
+            'class' => 'inline-flex items-center hover:underline',
+            'title' => lang('Note.replies', [
+                'numberOfReplies' => $reply->replies_count,
+            ]),
+        ],
+    ) ?>
+    <?= anchor_popup(
+        route_to('note-remote-action', $podcast->name, $reply->id, 'reblog'),
+        icon('repeat', 'text-xl mr-1 text-gray-400') . $reply->reblogs_count,
+        [
+            'class' => 'inline-flex items-center hover:underline',
+            'width' => 420,
+            'height' => 620,
+            'title' => lang('Note.reblogs', [
+                'numberOfReblogs' => $reply->reblogs_count,
+            ]),
+        ],
+    ) ?>
+    <?= anchor_popup(
+        route_to('note-remote-action', $podcast->name, $reply->id, 'favourite'),
+        icon('heart', 'text-xl mr-1 text-gray-400') . $reply->favourites_count,
+        [
+            'class' => 'inline-flex items-center hover:underline',
+            'width' => 420,
+            'height' => 620,
+            'title' => lang('Note.favourites', [
+                'numberOfFavourites' => $reply->favourites_count,
+            ]),
+        ],
+    ) ?>
+</footer>
\ No newline at end of file
diff --git a/app/Views/podcast/_partials/reply_actions_authenticated.php b/app/Views/podcast/_partials/reply_actions_authenticated.php
new file mode 100644
index 0000000000..4700eaef01
--- /dev/null
+++ b/app/Views/podcast/_partials/reply_actions_authenticated.php
@@ -0,0 +1,89 @@
+<footer class="mt-2 text-sm">
+    <form action="<?= route_to(
+        'note-attempt-action',
+        interact_as_actor()->username,
+        $reply->id,
+    ) ?>" method="POST" class="flex items-start">
+        <?= csrf_field() ?>
+        <?= anchor(
+            route_to('note', $podcast->name, $reply->id),
+            icon('chat', 'text-xl mr-1 text-gray-400') . $reply->replies_count,
+            [
+                'class' => 'inline-flex items-center mr-6 hover:underline',
+                'title' => lang('Note.replies', [
+                    'numberOfReplies' => $reply->replies_count,
+                ]),
+            ],
+        ) ?>
+        <button type="submit" name="action" value="reblog" class="inline-flex items-center mr-6 hover:underline" title="<?= lang(
+            'Note.reblogs',
+            [
+                'numberOfReblogs' => $reply->reblogs_count,
+            ],
+        ) ?>"><?= icon('repeat', 'text-xl mr-1 text-gray-400') .
+    $reply->reblogs_count ?></button>
+        <button type="submit" name="action" value="favourite" class="inline-flex items-center mr-6 hover:underline" title="<?= lang(
+            'Note.favourites',
+            [
+                'numberOfFavourites' => $reply->favourites_count,
+            ],
+        ) ?>"><?= icon('heart', 'text-xl mr-1 text-gray-400') .
+    $reply->favourites_count ?></button>
+        <button id="<?= $reply->id .
+            '-more-dropdown' ?>" type="button" class="text-xl text-gray-500 outline-none focus:ring" data-dropdown="button" data-dropdown-target="<?= $reply->id .
+    '-more-dropdown-menu' ?>" aria-label="<?= lang(
+    'Common.more',
+) ?>" aria-haspopup="true" aria-expanded="false"><?= icon('more') ?>
+        </button>
+    </form>
+    <nav id="<?= $reply->id .
+        '-more-dropdown-menu' ?>" class="flex flex-col py-2 text-sm bg-white border rounded-lg shadow" aria-labelledby="<?= $reply->id .
+    '-more-dropdown' ?>" data-dropdown="menu" data-dropdown-placement="bottom">
+        <?= anchor(
+            route_to('note', $podcast->name, $reply->id),
+            lang('Note.expand'),
+            [
+                'class' => 'px-4 py-1 hover:bg-gray-100',
+            ],
+        ) ?>
+        <form action="<?= route_to(
+            'note-attempt-block-actor',
+            interact_as_actor()->username,
+            $reply->id,
+        ) ?>" method="POST">
+            <?= csrf_field() ?>
+            <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang(
+                'Note.block_actor',
+                [
+                    'actorUsername' => $reply->actor->username,
+                ],
+            ) ?></button>
+        </form>
+        <form action="<?= route_to(
+            'note-attempt-block-domain',
+            interact_as_actor()->username,
+            $reply->id,
+        ) ?>" method="POST">
+            <?= csrf_field() ?>
+            <button class="w-full px-4 py-1 text-left hover:bg-gray-100"><?= lang(
+                'Note.block_domain',
+                [
+                    'actorDomain' => $reply->actor->domain,
+                ],
+            ) ?></button>
+        </form>
+        <?php if ($reply->actor->is_local): ?>
+            <hr class="my-2" />
+            <form action="<?= route_to(
+                'note-attempt-delete',
+                $reply->actor->username,
+                $reply->id,
+            ) ?>" method="POST">
+                <?= csrf_field() ?>
+                <button class="w-full px-4 py-1 font-semibold text-left text-red-600 hover:bg-gray-100"><?= lang(
+                    'Note.delete',
+                ) ?></button>
+            </form>
+        <?php endif; ?>
+    </nav>
+</footer>
\ No newline at end of file
diff --git a/app/Views/podcast/_partials/reply_authenticated.php b/app/Views/podcast/_partials/reply_authenticated.php
new file mode 100644
index 0000000000..739986fab0
--- /dev/null
+++ b/app/Views/podcast/_partials/reply_authenticated.php
@@ -0,0 +1,29 @@
+<article class="flex px-6 py-4 bg-gray-50">
+    <img src="<?= $reply->actor->avatar_image_url ?>" alt="<?= $reply->actor
+    ->display_name ?>" class="w-12 h-12 mr-4 rounded-full ring-gray-50 ring-2" />
+    <div class="flex flex-col flex-1 min-w-0">
+        <header class="flex items-center mb-2">
+            <a href="<?= $reply->actor
+                ->uri ?>" class="mr-2 text-base font-semibold truncate hover:underline" <?= !$reply
+    ->actor->is_local
+    ? 'target="_blank" rel="noopener noreferrer"'
+    : '' ?>><?= $reply->actor
+    ->display_name ?><span class="ml-1 text-sm font-normal text-gray-600">@<?= $reply
+    ->actor->username .
+    (!$reply->actor->is_local ? '@' . $reply->actor->domain : '') ?></span></a>
+            <time
+            class="flex-shrink-0 ml-auto text-xs text-gray-600"
+            itemprop="published"
+            datetime="<?= $reply->created_at->format(DateTime::ATOM) ?>"
+            title="<?= $reply->created_at ?>"
+            ><?= lang('Common.mediumDate', [$reply->created_at]) ?></time>
+        </header>
+        <p class="mb-2 note-content"><?= $reply->message_html ?></p>
+        <?php if ($reply->preview_card): ?>
+            <?= view('podcast/_partials/preview_card', [
+                'preview_card' => $reply->preview_card,
+            ]) ?>
+        <?php endif; ?>
+        <?= $this->include('podcast/_partials/reply_actions_authenticated') ?>
+    </div>
+</article>
diff --git a/app/Views/podcast/_partials/sidebar.php b/app/Views/podcast/_partials/sidebar.php
new file mode 100644
index 0000000000..a66854e241
--- /dev/null
+++ b/app/Views/podcast/_partials/sidebar.php
@@ -0,0 +1,91 @@
+<aside id="main-sidebar" class="fixed top-0 right-0 flex flex-col items-start flex-shrink-0 w-64 h-screen px-6 py-4 overflow-y-auto transform translate-x-full lg:sticky lg:translate-x-0">
+    <?php if (
+        array_search(
+            true,
+            array_column($podcast->fundingPlatforms, 'is_visible'),
+        ) !== false
+    ): ?>
+    <h2 class="mb-2 text-sm font-semibold"><?= lang(
+        'Podcast.sponsor_title',
+    ) ?></h2>
+    <button
+    class="inline-flex items-center px-2 py-1 mb-8 text-sm font-semibold text-gray-600 border rounded-full shadow-sm focus:outline-none focus:ring focus:ring-pine-600 hover:bg-rose-200 hover:text-gray-800 border-rose-600 bg-rose-100"
+    data-toggle="funding-links"
+    data-toggle-class="hidden"><?= icon('heart', 'mr-2 text-rose-600') .
+        lang('Podcast.sponsor') ?></button>
+    <?php endif; ?>
+
+    <?php if (
+        array_search(
+            true,
+            array_column($podcast->socialPlatforms, 'is_visible'),
+        ) !== false
+    ): ?>
+    <h2 class="mb-2 text-sm font-semibold"> <?= lang('Podcast.find_on', [
+        'podcastTitle' => $podcast->title,
+    ]) ?></h2>
+    <div class="grid items-center justify-center grid-cols-5 gap-3 mb-8">
+    <?php foreach ($podcast->socialPlatforms as $socialPlatform): ?>
+        <?php if ($socialPlatform->is_visible): ?>
+            <?= anchor(
+                $socialPlatform->link_url,
+                icon($socialPlatform->type . '/' . $socialPlatform->slug),
+                [
+                    'class' => 'text-2xl text-gray-500 hover:text-gray-700',
+                    'target' => '_blank',
+                    'rel' => 'noopener noreferrer',
+                    'data-toggle' => 'tooltip',
+                    'data-placement' => 'bottom',
+                    'title' => $socialPlatform->label,
+                ],
+            ) ?>
+        <?php endif; ?>
+    <?php endforeach; ?>
+    </div>
+    <?php endif; ?>
+
+    <h2 class="mb-2 text-sm font-semibold"><?= lang('Podcast.listen_on') ?></h2>
+    <div class="grid items-center justify-center grid-cols-5 gap-3 mb-8">
+        <?= anchor(route_to('podcast_feed', $podcast->name), icon('rss'), [
+            'class' =>
+                'bg-yellow-500 text-xl text-yellow-900 hover:bg-yellow-600 w-8 h-8 inline-flex items-center justify-center rounded-lg',
+            'target' => '_blank',
+            'rel' => 'noopener noreferrer',
+            'data-toggle' => 'tooltip',
+            'data-placement' => 'bottom',
+            'title' => lang('Podcast.feed'),
+        ]) ?>
+        <?php foreach ($podcast->podcastingPlatforms as $podcastingPlatform): ?>
+            <?php if ($podcastingPlatform->is_visible): ?>
+                <?= anchor(
+                    $podcastingPlatform->link_url,
+                    icon(
+                        $podcastingPlatform->type .
+                            '/' .
+                            $podcastingPlatform->slug,
+                    ),
+                    [
+                        'class' => 'text-2xl text-gray-500 hover:text-gray-700',
+                        'target' => '_blank',
+                        'rel' => 'noopener noreferrer',
+                        'data-toggle' => 'tooltip',
+                        'data-placement' => 'bottom',
+                        'title' => $podcastingPlatform->label,
+                    ],
+                ) ?>
+            <?php endif; ?>
+    <?php endforeach; ?>
+    </div>
+    <footer class="px-2 py-4 mt-auto text-gray-600 border-t">
+        <div class="container flex flex-col justify-between mx-auto text-xs">
+            <?= render_page_links('inline-flex mb-2') ?>
+            <div class="flex flex-col">
+                <p><?= $podcast->copyright ?></p>
+                <p><?= lang('Common.powered_by', [
+                    'castopod' =>
+                        '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
+                ]) ?></p>
+            </div>
+        </div>
+    </footer>
+</aside>
diff --git a/app/Views/podcast/activity.php b/app/Views/podcast/activity.php
new file mode 100644
index 0000000000..45832393b8
--- /dev/null
+++ b/app/Views/podcast/activity.php
@@ -0,0 +1,53 @@
+<?= $this->extend('podcast/_layout') ?>
+
+<?= $this->section('meta-tags') ?>
+<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>"/>
+
+<title><?= $podcast->title ?></title>
+<meta name="description" content="<?= htmlspecialchars(
+    $podcast->description,
+) ?>" />
+<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+<link rel="stylesheet" href="/assets/index.css"/>
+<link rel="canonical" href="<?= current_url() ?>" />
+<meta property="og:title" content="<?= $podcast->title ?>" />
+<meta property="og:description" content="<?= $podcast->description ?>" />
+<meta property="og:locale" content="<?= $podcast->language_code ?>" />
+<meta property="og:site_name" content="<?= $podcast->title ?>" />
+<meta property="og:url" content="<?= current_url() ?>" />
+<meta property="og:image" content="<?= $podcast->image->large_url ?>" />
+<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" />
+<meta name="twitter:card" content="summary_large_image" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+
+<nav class="sticky top-0 z-20 flex justify-center pt-2 text-lg bg-pine-50">
+<a href="<?= route_to(
+    'podcast-activity',
+    $podcast->name,
+) ?>" class="px-4 py-1 mr-8 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang(
+    'Podcast.activity',
+) ?></a>
+    <a href="<?= route_to(
+        'podcast-episodes',
+        $podcast->name,
+    ) ?>" class="px-4 py-1 rounded-full hover:bg-pine-100"><?= lang(
+    'Podcast.episodes',
+) ?></a>
+</nav>
+
+<section class="max-w-2xl px-6 py-8 mx-auto space-y-8">
+<?php foreach ($notes as $note): ?>
+    <?php if ($note->is_reblog): ?>
+        <?= view('podcast/_partials/reblog', [
+            'note' => $note->reblog_of_note,
+        ]) ?>
+    <?php else: ?>
+        <?= view('podcast/_partials/note', ['note' => $note]) ?>
+    <?php endif; ?>
+<?php endforeach; ?>
+</section>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/podcast/activity_authenticated.php b/app/Views/podcast/activity_authenticated.php
new file mode 100644
index 0000000000..f64cbc775b
--- /dev/null
+++ b/app/Views/podcast/activity_authenticated.php
@@ -0,0 +1,99 @@
+<?= $this->extend('podcast/_layout_authenticated') ?>
+
+<?= $this->section('meta-tags') ?>
+<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>"/>
+
+<title><?= $podcast->title ?></title>
+<meta name="description" content="<?= htmlspecialchars(
+    $podcast->description,
+) ?>" />
+<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+<link rel="stylesheet" href="/assets/index.css"/>
+<link rel="canonical" href="<?= current_url() ?>" />
+<meta property="og:title" content="<?= $podcast->title ?>" />
+<meta property="og:description" content="<?= $podcast->description ?>" />
+<meta property="og:locale" content="<?= $podcast->language_code ?>" />
+<meta property="og:site_name" content="<?= $podcast->title ?>" />
+<meta property="og:url" content="<?= current_url() ?>" />
+<meta property="og:image" content="<?= $podcast->image->large_url ?>" />
+<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" />
+<meta name="twitter:card" content="summary_large_image" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+
+<nav class="sticky top-0 z-20 flex justify-center pt-2 text-lg bg-pine-50">
+<a href="<?= route_to(
+    'podcast-activity',
+    $podcast->name,
+) ?>" class="px-4 py-1 mr-8 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang(
+    'Podcast.activity',
+) ?></a>
+    <a href="<?= route_to(
+        'podcast-episodes',
+        $podcast->name,
+    ) ?>" class="px-4 py-1 rounded-full hover:bg-pine-100"><?= lang(
+    'Podcast.episodes',
+) ?></a>
+</nav>
+
+<section class="max-w-2xl px-6 py-8 mx-auto">
+<?= form_open(route_to('note-attempt-create', interact_as_actor()->username), [
+    'class' => 'flex p-4 bg-white shadow rounded-xl',
+]) ?>
+    <?= csrf_field() ?>
+
+    <?= view('_message_block') ?>
+
+    <img src="<?= interact_as_actor()
+        ->avatar_image_url ?>" alt="<?= interact_as_actor()
+    ->display_name ?>" class="w-12 h-12 mr-4 rounded-full" />
+    <div class="flex flex-col flex-1 min-w-0">
+        <?= form_textarea(
+            [
+                'id' => 'message',
+                'name' => 'message',
+                'class' => 'form-textarea',
+                'required' => 'required',
+                'placeholder' => lang('Note.form.message_placeholder'),
+            ],
+            old('message', '', false),
+            ['rows' => 2],
+        ) ?>
+        <?= form_input([
+            'id' => 'episode_url',
+            'name' => 'episode_url',
+            'class' => 'form-input mb-2',
+            'placeholder' =>
+                lang('Note.form.episode_url_placeholder') .
+                ' (' .
+                lang('Common.optional') .
+                ')',
+            'type' => 'url',
+        ]) ?>
+
+        <?= button(
+            lang('Note.form.submit'),
+            null,
+            ['variant' => 'primary', 'size' => 'small'],
+            ['type' => 'submit', 'class' => 'self-end'],
+        ) ?>
+    </div>
+<?= form_close() ?>
+<hr class="my-4 border-2 border-pine-100">
+
+<div class="space-y-8">
+<?php foreach ($notes as $note): ?>
+    <?php if ($note->is_reblog): ?>
+        <?= view('podcast/_partials/reblog_authenticated', [
+            'note' => $note->reblog_of_note,
+        ]) ?>
+    <?php else: ?>
+        <?= view('podcast/_partials/note_authenticated', ['note' => $note]) ?>
+    <?php endif; ?>
+<?php endforeach; ?>
+</div>
+</section>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/podcast/episode.php b/app/Views/podcast/episode.php
new file mode 100644
index 0000000000..33dbffa450
--- /dev/null
+++ b/app/Views/podcast/episode.php
@@ -0,0 +1,186 @@
+<?= $this->extend('podcast/_layout') ?>
+
+<?= $this->section('meta-tags') ?>
+<title><?= $episode->title ?></title>
+<meta name="description" content="<?= htmlspecialchars(
+    $episode->description,
+) ?>" />
+<link rel="canonical" href="<?= $episode->link ?>" />
+<meta property="og:title" content="<?= $episode->title ?>" />
+<meta property="og:description" content="<?= $episode->description ?>" />
+<meta property="og:locale" content="<?= $podcast->language_code ?>" />
+<meta property="og:site_name" content="<?= $podcast->title ?>" />
+<meta property="og:url" content="<?= current_url() ?>" />
+<meta property="og:image" content="<?= $episode->image->large_url ?>" />
+<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:description" content="$description" />
+<meta property="article:published_time" content="<?= $episode->published_at ?>" />
+<meta property="article:modified_time" content="<?= $episode->updated_at ?>" />
+<meta property="og:audio" content="<?= $episode->enclosure_opengraph_url ?>" />
+<meta property="og:audio:type" content="<?= $episode->enclosure_mimetype ?>" />
+<link rel="alternate" type="application/json+oembed" href="<?= base_url(
+    route_to('episode-oembed-json', $podcast->name, $episode->slug),
+) ?>" title="<?= $episode->title ?> oEmbed json" />
+<link rel="alternate" type="text/xml+oembed" href="<?= base_url(
+    route_to('episode-oembed-xml', $podcast->name, $episode->slug),
+) ?>" title="<?= $episode->title ?> oEmbed xml" />
+<meta name="twitter:title" content="<?= $episode->title ?>" />
+<meta name="twitter:description" content="<?= $episode->description ?>" />
+<meta name="twitter:image" content="<?= $episode->image->large_url ?>" />
+<meta name="twitter:card" content="player" />
+<meta property="twitter:audio:partner" content="<?= $podcast->publisher ?>" />
+<meta property="twitter:audio:artist_name" content="<?= $podcast->owner_name ?>" />
+<meta name="twitter:player" content="<?= $episode->getEmbeddablePlayer(
+    'light',
+) ?>" />
+<meta name="twitter:player:width" content="600" />
+<meta name="twitter:player:height" content="200" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+<div class="max-w-2xl mx-auto">
+    <a href="<?= route_to(
+        'podcast-episodes',
+        $podcast->name,
+    ) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-sm"><?= icon(
+    'arrow-left',
+    'mr-2 text-lg',
+) . lang('Episode.back_to_episodes', ['podcast' => $podcast->title]) ?></a>
+    <header class="flex flex-col px-6 mb-4 rounded-b-xl">
+        <div class="flex flex-wrap items-start">
+            <img src="<?= $episode->image
+                ->medium_url ?>" alt="<?= $episode->title ?>" class="mb-4 mr-6 rounded-xl w-52" />
+            <div class="flex flex-col items-start flex-1 mb-4" style="min-width: 14rem">
+                <h1 class="text-xl font-bold leading-none font-display line-clamp-2"><?= $episode->title ?></h1>
+                <?= episode_numbering(
+                    $episode->number,
+                    $episode->season_number,
+                    'text-gray-700',
+                ) ?>
+                <div class="mb-4 text-xs">
+                    <time pubdate datetime="<?= $episode->published_at->format(
+                        DateTime::ATOM,
+                    ) ?>" title="<?= $episode->published_at ?>">
+                        <?= lang('Common.mediumDate', [
+                            $episode->published_at,
+                        ]) ?>
+                    </time>
+                    <span class="mx-1">•</span>
+                    <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                        <?= format_duration($episode->enclosure_duration) ?>
+                    </time>
+                </div>
+                <div class="mb-2 space-x-4 text-sm">
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('chat', 'text-xl mr-1 text-gray-400') .
+                            $episode->notes_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_notes', [
+                                'numberOfTotalNotes' => $episode->notes_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('repeat', 'text-xl mr-1 text-gray-400') .
+                            $episode->reblogs_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_reblogs', [
+                                'numberOfTotalReblogs' =>
+                                    $episode->reblogs_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('heart', 'text-xl mr-1 text-gray-400') .
+                            $episode->favourites_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_favourites', [
+                                'numberOfTotalFavourites' =>
+                                    $episode->favourites_total,
+                            ]),
+                        ],
+                    ) ?>
+                </div>
+                <?php if ($episode->location_name): ?>
+                    <?= location_link(
+                        $episode->location_name,
+                        $episode->location_geo,
+                        $episode->location_osmid,
+                        'text-sm mb-4',
+                    ) ?>
+                <?php endif; ?>
+                <?php if ($episodePersons): ?>
+                    <div class="flex space-x-2">
+                        <?php foreach ($episodePersons as $person): ?>
+                            <?php if ($person['information_url']): ?>
+                                <a href="<?= $person[
+                                    'information_url'
+                                ] ?>" target="_blank" rel="noreferrer noopener">
+                                    <img src="<?= $person[
+                                        'thumbnail_url'
+                                    ] ?>" alt="<?= $person[
+    'full_name'
+] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[
+    'full_name'
+] ?>] <?= $person['roles'] ?>" /></a>
+                            <?php else: ?>
+                                <img src="<?= $person[
+                                    'thumbnail_url'
+                                ] ?>" alt="<?= $person[
+    'full_name'
+] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[
+    'full_name'
+] ?>] <?= $person['roles'] ?>" />
+                            <?php endif; ?>
+                        <?php endforeach; ?>
+                    </div>
+                <?php endif; ?>
+            </div>
+        </div>
+        <audio controls preload="none" class="w-full mt-auto">
+            <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>">
+            Your browser does not support the audio tag.
+        </audio>
+    </header>
+
+    <div class="tabset">
+        <?php if ($episode->notes): ?>
+
+            <input type="radio" name="tabset" id="activity" aria-controls="activity" checked="checked" />
+            <label for="activity"><?= lang('Episode.activity') ?></label>
+        <?php endif; ?>
+
+        <input type="radio" name="tabset" id="description" aria-controls="description" <?= $episode->notes
+            ? ''
+            : 'checked="checked"' ?> />
+        <label for="description" class="<?= $episode->notes
+            ? ''
+            : 'col-span-2' ?>"><?= lang('Episode.description') ?></label>
+
+        <div class="tab-panels">
+            <?php if ($episode->notes): ?>
+                <section id="activity" class="space-y-8 tab-panel">
+                    <?php foreach ($episode->notes as $note): ?>
+                        <?= view('podcast/_partials/note', ['note' => $note]) ?>
+                    <?php endforeach; ?>
+                </section>
+            <?php endif; ?>
+            <section id="description" class="prose tab-panel">
+                <?= $episode->getDescriptionHtml('-+Website+-') ?>
+            </section>
+        </div>
+    </div>
+</div>
+
+<?= $this->endSection()
+?>
diff --git a/app/Views/podcast/episode_authenticated.php b/app/Views/podcast/episode_authenticated.php
new file mode 100644
index 0000000000..8d253e1e0f
--- /dev/null
+++ b/app/Views/podcast/episode_authenticated.php
@@ -0,0 +1,220 @@
+<?= $this->extend('podcast/_layout_authenticated') ?>
+
+<?= $this->section('meta-tags') ?>
+<title><?= $episode->title ?></title>
+<meta name="description" content="<?= htmlspecialchars(
+    $episode->description,
+) ?>" />
+<link rel="canonical" href="<?= $episode->link ?>" />
+<meta property="og:title" content="<?= $episode->title ?>" />
+<meta property="og:description" content="<?= $episode->description ?>" />
+<meta property="og:locale" content="<?= $podcast->language_code ?>" />
+<meta property="og:site_name" content="<?= $podcast->title ?>" />
+<meta property="og:url" content="<?= current_url() ?>" />
+<meta property="og:image" content="<?= $episode->image->large_url ?>" />
+<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:description" content="$description" />
+<meta property="article:published_time" content="<?= $episode->published_at ?>" />
+<meta property="article:modified_time" content="<?= $episode->updated_at ?>" />
+<meta property="og:audio" content="<?= $episode->enclosure_opengraph_url ?>" />
+<meta property="og:audio:type" content="<?= $episode->enclosure_mimetype ?>" />
+<link rel="alternate" type="application/json+oembed" href="<?= base_url(
+    route_to('episode-oembed-json', $podcast->name, $episode->slug),
+) ?>" title="<?= $episode->title ?> oEmbed json" />
+<link rel="alternate" type="text/xml+oembed" href="<?= base_url(
+    route_to('episode-oembed-xml', $podcast->name, $episode->slug),
+) ?>" title="<?= $episode->title ?> oEmbed xml" />
+<meta name="twitter:title" content="<?= $episode->title ?>" />
+<meta name="twitter:description" content="<?= $episode->description ?>" />
+<meta name="twitter:image" content="<?= $episode->image->large_url ?>" />
+<meta name="twitter:card" content="player" />
+<meta property="twitter:audio:partner" content="<?= $podcast->publisher ?>" />
+<meta property="twitter:audio:artist_name" content="<?= $podcast->owner_name ?>" />
+<meta name="twitter:player" content="<?= $episode->getEmbeddablePlayer(
+    'light',
+) ?>" />
+<meta name="twitter:player:width" content="600" />
+<meta name="twitter:player:height" content="200" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+<div class="max-w-2xl mx-auto">
+    <a href="<?= route_to(
+        'podcast-episodes',
+        $podcast->name,
+    ) ?>" class="inline-flex items-center px-4 py-2 mb-2 text-sm"><?= icon(
+    'arrow-left',
+    'mr-2 mb- text-lg',
+) . lang('Episode.back_to_episodes', ['podcast' => $podcast->title]) ?></a>
+    <header class="flex flex-col px-6 mb-4 rounded-b-xl">
+        <div class="flex flex-wrap items-start">
+            <img src="<?= $episode->image
+                ->medium_url ?>" alt="<?= $episode->title ?>" class="mb-4 mr-6 rounded-xl w-52" />
+            <div class="flex flex-col items-start flex-1 mb-4" style="min-width: 14rem">
+                <h1 class="text-xl font-bold leading-none font-display line-clamp-2"><?= $episode->title ?></h1>
+                <?= episode_numbering(
+                    $episode->number,
+                    $episode->season_number,
+                    'text-gray-700',
+                ) ?>
+                <div class="mb-4 text-xs">
+                    <time pubdate datetime="<?= $episode->published_at->format(
+                        DateTime::ATOM,
+                    ) ?>" title="<?= $episode->published_at ?>">
+                        <?= lang('Common.mediumDate', [
+                            $episode->published_at,
+                        ]) ?>
+                    </time>
+                    <span class="mx-1">•</span>
+                    <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                        <?= format_duration($episode->enclosure_duration) ?>
+                    </time>
+                </div>
+                <div class="mb-2 space-x-4 text-sm">
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('chat', 'text-xl mr-1 text-gray-400') .
+                            $episode->notes_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_notes', [
+                                'numberOfTotalNotes' => $episode->notes_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('repeat', 'text-xl mr-1 text-gray-400') .
+                            $episode->reblogs_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_reblogs', [
+                                'numberOfTotalReblogs' =>
+                                    $episode->reblogs_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('heart', 'text-xl mr-1 text-gray-400') .
+                            $episode->favourites_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_favourites', [
+                                'numberOfTotalFavourites' =>
+                                    $episode->favourites_total,
+                            ]),
+                        ],
+                    ) ?>
+                </div>
+                <?php if ($episode->location_name): ?>
+                    <?= location_link(
+                        $episode->location_name,
+                        $episode->location_geo,
+                        $episode->location_osmid,
+                        'text-sm mb-4',
+                    ) ?>
+                <?php endif; ?>
+                <?php if ($episodePersons): ?>
+                    <div class="flex space-x-2">
+                        <?php foreach ($episodePersons as $person): ?>
+                            <?php if ($person['information_url']): ?>
+                                <a href="<?= $person[
+                                    'information_url'
+                                ] ?>" target="_blank" rel="noreferrer noopener">
+                                    <img src="<?= $person[
+                                        'thumbnail_url'
+                                    ] ?>" alt="<?= $person[
+    'full_name'
+] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[
+    'full_name'
+] ?>] <?= $person['roles'] ?>" /></a>
+                            <?php else: ?>
+                                <img src="<?= $person[
+                                    'thumbnail_url'
+                                ] ?>" alt="<?= $person[
+    'full_name'
+] ?>" class="object-cover w-12 h-12 rounded-full" title="[<?= $person[
+    'full_name'
+] ?>] <?= $person['roles'] ?>" />
+                            <?php endif; ?>
+                        <?php endforeach; ?>
+                    </div>
+                <?php endif; ?>
+            </div>
+        </div>
+        <audio controls preload="none" class="w-full mt-auto">
+            <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_type ?>">
+            Your browser does not support the audio tag.
+        </audio>
+    </header>
+
+    <div class="tabset">
+        <input type="radio" name="tabset" id="activity" aria-controls="activity" checked="checked" />
+        <label for="activity"><?= lang('Episode.activity') ?></label>
+
+        <input type="radio" name="tabset" id="description" aria-controls="description" />
+        <label for="description"><?= lang('Episode.description') ?></label>
+
+        <div class="tab-panels">
+            <section id="activity" class="space-y-8 tab-panel">
+                <?= form_open(route_to('note-attempt-create', $podcast->name), [
+                    'class' => 'flex p-4 bg-white shadow rounded-xl',
+                ]) ?>
+                <?= csrf_field() ?>
+
+                <?= view('_message_block') ?>
+
+                <img src="<?= interact_as_actor()
+                    ->avatar_image_url ?>" alt="<?= interact_as_actor()
+    ->display_name ?>" class="w-12 h-12 mr-4 rounded-full" />
+                <div class="flex flex-col flex-1 min-w-0">
+                    <?= form_textarea(
+                        [
+                            'id' => 'message',
+                            'name' => 'message',
+                            'class' => 'form-textarea mb-2',
+                            'required' => 'required',
+                            'placeholder' => lang(
+                                'Note.form.episode_message_placeholder',
+                            ),
+                        ],
+                        old('message', '', false),
+                        [
+                            'rows' => 2,
+                        ],
+                    ) ?>
+                    <?= form_input([
+                        'id' => 'episode_url',
+                        'name' => 'episode_url',
+                        'value' => $episode->link,
+                        'type' => 'hidden',
+                    ]) ?>
+                    <?= button(
+                        lang('Note.form.submit'),
+                        null,
+                        ['variant' => 'primary', 'size' => 'small'],
+                        ['type' => 'submit', 'class' => 'self-end'],
+                    ) ?>
+                </div>
+                <?= form_close() ?>
+                <hr class="my-4 border border-pine-100">
+                <?php foreach ($episode->notes as $note): ?>
+                    <?= view('podcast/_partials/note_authenticated', [
+                        'note' => $note,
+                    ]) ?>
+                <?php endforeach; ?>
+            </section>
+            <section id="description" class="prose tab-panel">
+                <?= $episode->getDescriptionHtml('-+Website+-') ?>
+            </section>
+        </div>
+    </div>
+</div>
+
+<?= $this->endSection()
+?>
diff --git a/app/Views/podcast/episodes.php b/app/Views/podcast/episodes.php
new file mode 100644
index 0000000000..8e76c01f6e
--- /dev/null
+++ b/app/Views/podcast/episodes.php
@@ -0,0 +1,171 @@
+<?= $this->extend('podcast/_layout') ?>
+
+<?= $this->section('meta-tags') ?>
+<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>" />
+
+<title><?= $podcast->title ?></title>
+<meta name="description" content="<?= htmlspecialchars(
+    $podcast->description,
+) ?>" />
+<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+<link rel="stylesheet" href="/assets/index.css" />
+<link rel="canonical" href="<?= current_url() ?>" />
+<meta property="og:title" content="<?= $podcast->title ?>" />
+<meta property="og:description" content="<?= $podcast->description ?>" />
+<meta property="og:locale" content="<?= $podcast->language_code ?>" />
+<meta property="og:site_name" content="<?= $podcast->title ?>" />
+<meta property="og:url" content="<?= current_url() ?>" />
+<meta property="og:image" content="<?= $podcast->image->large_url ?>" />
+<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" />
+<meta name="twitter:card" content="summary_large_image" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+<nav class="sticky top-0 flex items-center justify-center pt-2 text-lg bg-pine-50">
+    <a href="<?= route_to(
+        'podcast-activity',
+        $podcast->name,
+    ) ?>" class="px-4 py-1 mr-8 rounded-full hover:bg-pine-100"><?= lang(
+    'Podcast.activity',
+) ?></a>
+    <a href="<?= route_to(
+        'podcast-episodes',
+        $podcast->name,
+    ) ?>" class="px-4 py-1 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang(
+    'Podcast.episodes',
+) ?></a>
+    <?php if ($activeQuery): ?>
+        <button id="episode-lists-dropdown" type="button" class="inline-flex items-center px-2 py-1 text-sm font-semibold outline-none focus:ring" data-dropdown="button" data-dropdown-target="episode-lists-dropdown-menu" aria-label="<?= lang(
+            'Common.more',
+        ) ?>" aria-haspopup="true" aria-expanded="false">
+            <?= $activeQuery['label'] .
+                ' (' .
+                $activeQuery['number_of_episodes'] .
+                ')' .
+                icon('caret-down', 'ml-2 text-xl') ?>
+        </button>
+        <nav id="episode-lists-dropdown-menu" class="flex flex-col py-2 text-black bg-white border rounded shadow" aria-labelledby="episode-lists-dropdown" data-dropdown="menu" data-dropdown-placement="bottom-end">
+            <?php foreach ($episodesNav as $link): ?>
+                <?= anchor(
+                    $link['route'],
+                    $link['label'] . ' (' . $link['number_of_episodes'] . ')',
+                    [
+                        'class' =>
+                            'px-2 py-1 whitespace-nowrap ' .
+                            ($link['is_active']
+                                ? 'font-semibold'
+                                : 'text-gray-600 hover:text-gray-900'),
+                    ],
+                ) ?>
+            <?php endforeach; ?>
+        </nav>
+    <?php endif; ?>
+</nav>
+
+<section class="flex flex-col max-w-2xl px-6 py-8 mx-auto">
+
+    <?php if ($episodes): ?>
+        <h1 class="mb-4 text-xl font-semibold">
+            <?php if ($activeQuery['type'] == 'year'): ?>
+                <?= lang('Podcast.list_of_episodes_year', [
+                    'year' => $activeQuery['value'],
+                    'episodeCount' => count($episodes),
+                ]) ?>
+            <?php elseif ($activeQuery['type'] == 'season'): ?>
+                <?= lang('Podcast.list_of_episodes_season', [
+                    'seasonNumber' => $activeQuery['value'],
+                    'episodeCount' => count($episodes),
+                ]) ?>
+            <?php endif; ?>
+        </h1>
+        <?php foreach ($episodes as $episode): ?>
+            <article class="w-full mb-4 bg-white rounded-lg shadow">
+                <div class="flex px-4 pt-4 pb-2">
+                    <img loading="lazy" src="<?= $episode->image
+                        ->thumbnail_url ?>" alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" />
+                    <div class="flex flex-col flex-1">
+                        <a class="text-sm" href="<?= $episode->link ?>">
+                            <h2 class="inline-flex justify-between w-full font-semibold leading-none group">
+                                <span class="mr-1 group-hover:underline"><?= $episode->title ?></span>
+                                <?= episode_numbering(
+                                    $episode->number,
+                                    $episode->season_number,
+                                    'text-xs font-semibold text-gray-600',
+                                    true,
+                                ) ?>
+                            </h2>
+                        </a>
+                        <div class="mb-2 text-xs">
+                            <time itemprop="published" datetime="<?= $episode->published_at->format(
+                                DateTime::ATOM,
+                            ) ?>" title="<?= $episode->published_at ?>">
+                                <?= lang('Common.mediumDate', [
+                                    $episode->published_at,
+                                ]) ?>
+                            </time>
+                            <span class="mx-1">•</span>
+                            <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                                <?= format_duration(
+                                    $episode->enclosure_duration,
+                                ) ?>
+                            </time>
+                        </div>
+                        <audio controls preload="none" class="w-full mt-auto">
+                            <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_mimetype ?>">
+                            Your browser does not support the audio tag.
+                        </audio>
+                    </div>
+                </div>
+                <div class="px-4 py-2 space-x-4 text-sm">
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('chat', 'text-xl mr-1 text-gray-400') .
+                            $episode->notes_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_notes', [
+                                'numberOfTotalNotes' => $episode->notes_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('repeat', 'text-xl mr-1 text-gray-400') .
+                            $episode->reblogs_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_reblogs', [
+                                'numberOfTotalReblogs' =>
+                                    $episode->reblogs_total,
+                            ]),
+                        ],
+                    ) ?>
+
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('heart', 'text-xl mr-1 text-gray-400') .
+                            $episode->favourites_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_favourites', [
+                                'numberOfTotalFavourites' =>
+                                    $episode->favourites_total,
+                            ]),
+                        ],
+                    ) ?>
+                </div>
+            </article>
+        <?php endforeach; ?>
+    <?php else: ?>
+        <h1 class="px-4 mb-2 text-xl text-center"><?= lang(
+            'Podcast.no_episode',
+        ) ?></h1>
+        <p class="italic text-center"><?= lang('Podcast.no_episode_hint') ?></p>
+    <?php endif; ?>
+</section>
+
+<?= $this->endSection() ?>
diff --git a/app/Views/podcast/episodes_authenticated.php b/app/Views/podcast/episodes_authenticated.php
new file mode 100644
index 0000000000..1d37f1a5b8
--- /dev/null
+++ b/app/Views/podcast/episodes_authenticated.php
@@ -0,0 +1,171 @@
+<?= $this->extend('podcast/_layout_authenticated') ?>
+
+<?= $this->section('meta-tags') ?>
+<link type="application/rss+xml" rel="alternate" title="<?= $podcast->title ?>" href="<?= $podcast->feed_url ?>" />
+
+<title><?= $podcast->title ?></title>
+<meta name="description" content="<?= htmlspecialchars(
+    $podcast->description,
+) ?>" />
+<link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+<link rel="stylesheet" href="/assets/index.css" />
+<link rel="canonical" href="<?= current_url() ?>" />
+<meta property="og:title" content="<?= $podcast->title ?>" />
+<meta property="og:description" content="<?= $podcast->description ?>" />
+<meta property="og:locale" content="<?= $podcast->language_code ?>" />
+<meta property="og:site_name" content="<?= $podcast->title ?>" />
+<meta property="og:url" content="<?= current_url() ?>" />
+<meta property="og:image" content="<?= $podcast->image->large_url ?>" />
+<meta property="og:image:width" content="<?= config('Images')->largeSize ?>" />
+<meta property="og:image:height" content="<?= config('Images')->largeSize ?>" />
+<meta name="twitter:card" content="summary_large_image" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+<nav class="sticky top-0 flex items-center justify-center pt-2 text-lg bg-pine-50">
+    <a href="<?= route_to(
+        'podcast-activity',
+        $podcast->name,
+    ) ?>" class="px-4 py-1 mr-8 rounded-full hover:bg-pine-100"><?= lang(
+    'Podcast.activity',
+) ?></a>
+    <a href="<?= route_to(
+        'podcast-episodes',
+        $podcast->name,
+    ) ?>" class="px-4 py-1 font-semibold border-b-4 text-pine-800 border-pine-800"><?= lang(
+    'Podcast.episodes',
+) ?></a>
+    <?php if ($activeQuery): ?>
+        <button id="episode-lists-dropdown" type="button" class="inline-flex items-center px-2 py-1 text-sm font-semibold outline-none focus:ring" data-dropdown="button" data-dropdown-target="episode-lists-dropdown-menu" aria-label="<?= lang(
+            'Common.more',
+        ) ?>" aria-haspopup="true" aria-expanded="false">
+            <?= $activeQuery['label'] .
+                ' (' .
+                $activeQuery['number_of_episodes'] .
+                ')' .
+                icon('caret-down', 'ml-2 text-xl') ?>
+        </button>
+        <nav id="episode-lists-dropdown-menu" class="flex flex-col py-2 text-black bg-white border rounded shadow" aria-labelledby="episode-lists-dropdown" data-dropdown="menu" data-dropdown-placement="bottom-end">
+            <?php foreach ($episodesNav as $link): ?>
+                <?= anchor(
+                    $link['route'],
+                    $link['label'] . ' (' . $link['number_of_episodes'] . ')',
+                    [
+                        'class' =>
+                            'px-2 py-1 whitespace-nowrap ' .
+                            ($link['is_active']
+                                ? 'font-semibold'
+                                : 'text-gray-600 hover:text-gray-900'),
+                    ],
+                ) ?>
+            <?php endforeach; ?>
+        </nav>
+    <?php endif; ?>
+</nav>
+
+<section class="flex flex-col max-w-2xl px-6 py-8 mx-auto">
+
+    <?php if ($episodes): ?>
+        <h1 class="mb-4 text-xl font-semibold">
+            <?php if ($activeQuery['type'] == 'year'): ?>
+                <?= lang('Podcast.list_of_episodes_year', [
+                    'year' => $activeQuery['value'],
+                    'episodeCount' => count($episodes),
+                ]) ?>
+            <?php elseif ($activeQuery['type'] == 'season'): ?>
+                <?= lang('Podcast.list_of_episodes_season', [
+                    'seasonNumber' => $activeQuery['value'],
+                    'episodeCount' => count($episodes),
+                ]) ?>
+            <?php endif; ?>
+        </h1>
+        <?php foreach ($episodes as $episode): ?>
+            <article class="w-full mb-4 bg-white rounded-lg shadow">
+                <div class="flex px-4 pt-4 pb-2">
+                    <img loading="lazy" src="<?= $episode->image
+                        ->thumbnail_url ?>" alt="<?= $episode->title ?>" class="object-cover w-20 h-20 mr-2 rounded-lg" />
+                    <div class="flex flex-col flex-1">
+                        <a class="text-sm" href="<?= $episode->link ?>">
+                            <h2 class="inline-flex justify-between w-full font-semibold leading-none group">
+                                <span class="mr-1 group-hover:underline"><?= $episode->title ?></span>
+                                <?= episode_numbering(
+                                    $episode->number,
+                                    $episode->season_number,
+                                    'text-xs font-semibold text-gray-600',
+                                    true,
+                                ) ?>
+                            </h2>
+                        </a>
+                        <div class="mb-2 text-xs">
+                            <time itemprop="published" datetime="<?= $episode->published_at->format(
+                                DateTime::ATOM,
+                            ) ?>" title="<?= $episode->published_at ?>">
+                                <?= lang('Common.mediumDate', [
+                                    $episode->published_at,
+                                ]) ?>
+                            </time>
+                            <span class="mx-1">•</span>
+                            <time datetime="PT<?= $episode->enclosure_duration ?>S">
+                                <?= format_duration(
+                                    $episode->enclosure_duration,
+                                ) ?>
+                            </time>
+                        </div>
+                        <audio controls preload="none" class="w-full mt-auto">
+                            <source src="<?= $episode->enclosure_web_url ?>" type="<?= $episode->enclosure_mimetype ?>">
+                            Your browser does not support the audio tag.
+                        </audio>
+                    </div>
+                </div>
+                <div class="px-4 py-2 space-x-4 text-sm">
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('chat', 'text-xl mr-1 text-gray-400') .
+                            $episode->notes_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_notes', [
+                                'numberOfTotalNotes' => $episode->notes_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('repeat', 'text-xl mr-1 text-gray-400') .
+                            $episode->reblogs_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_reblogs', [
+                                'numberOfTotalReblogs' =>
+                                    $episode->reblogs_total,
+                            ]),
+                        ],
+                    ) ?>
+                    <?= anchor(
+                        route_to('episode', $podcast->name, $episode->slug),
+                        icon('heart', 'text-xl mr-1 text-gray-400') .
+                            $episode->favourites_total,
+                        [
+                            'class' =>
+                                'inline-flex items-center hover:underline',
+                            'title' => lang('Episode.total_favourites', [
+                                'numberOfTotalFavourites' =>
+                                    $episode->favourites_total,
+                            ]),
+                        ],
+                    ) ?>
+                </div>
+            </article>
+        <?php endforeach; ?>
+    <?php else: ?>
+        <h1 class="px-4 mb-2 text-xl text-center"><?= lang(
+            'Podcast.no_episode',
+        ) ?></h1>
+        <p class="italic text-center"><?= lang('Podcast.no_episode_hint') ?></p>
+    <?php endif; ?>
+</section>
+
+<?= $this->endSection()
+?>
diff --git a/app/Views/podcast/follow.php b/app/Views/podcast/follow.php
new file mode 100644
index 0000000000..063367661c
--- /dev/null
+++ b/app/Views/podcast/follow.php
@@ -0,0 +1,91 @@
+<?= helper('page') ?>
+
+<!DOCTYPE html>
+<html lang="<?= service('request')->getLocale() ?>">
+
+<head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+    <link rel="stylesheet" href="/assets/index.css" />
+
+    <title><?= lang('Podcast.follow.title', [
+        'actorDisplayName' => $actor->display_name,
+    ]) ?></title>
+    <meta name="description" content="<?= $actor->summary ?>"/>
+    <meta property="og:title" content="<?= lang('Podcast.follow.title', [
+        'actorDisplayName' => $actor->display_name,
+    ]) ?>"/>
+    <meta property="og:locale" content="<?= service(
+        'request',
+    )->getLocale() ?>" />
+    <meta property="og:url" content="<?= current_url() ?>" />
+    <meta property="og:image" content="<?= $actor->avatar_image_url ?>" />
+    <meta property="og:description" content="<?= $actor->summary ?>" />
+</head>
+
+
+<body class="flex flex-col min-h-screen bg-pine-50">
+    <header class="flex flex-col items-center mb-8">
+        <h1 class="w-full pt-8 pb-32 text-center text-white bg-pine-900"><?= lang(
+            'ActivityPub.follow.subtitle',
+        ) ?></h1>
+        <div class="flex flex-col w-full max-w-xs -mt-24 overflow-hidden bg-white shadow rounded-xl">
+            <?php if ($actor->cover_image_url): ?>
+            <img src="<?= $actor->cover_image_url ?>" alt="" class="object-cover w-full h-32 bg-pine-800" />
+            <?php else: ?>
+            <div class="w-full h-32 bg-pine-800"></div>
+            <?php endif; ?>
+            <div class="flex px-4 py-2">
+                <img src="<?= $actor->avatar_image_url ?>" alt="<?= $actor->display_name ?>"
+                    class="w-16 h-16 mr-4 -mt-8 rounded-full shadow-xl ring-2 ring-white" />
+                <div class="">
+                    <p class="font-semibold"><?= $actor->display_name ?></p>
+                    <p class="text-sm text-gray-500">@<?= $actor->username ?></p>
+                </div>
+            </div>
+        </div>
+    </header>
+
+    <main class="w-full max-w-md px-4 mx-auto">
+        <?= form_open(route_to('attempt-follow', $actor->username), [
+            'method' => 'post',
+            'class' => 'flex flex-col',
+        ]) ?>
+        <?= csrf_field() ?>
+        <?= view('_message_block') ?>
+
+        <?= form_label(
+            lang('ActivityPub.your_handle'),
+            'handle',
+            [],
+            lang('ActivityPub.your_handle_hint'),
+        ) ?>
+        <?= form_input([
+            'id' => 'handle',
+            'name' => 'handle',
+            'class' => 'form-input mb-4',
+            'required' => 'required',
+            'type' => 'text',
+        ]) ?>
+
+        <?= button(
+            lang('ActivityPub.follow.submit'),
+            null,
+            ['variant' => 'primary'],
+            ['type' => 'submit', 'class' => 'self-end'],
+        ) ?>
+        <?= form_close() ?>
+    </main>
+
+    <footer
+        class="container flex flex-col items-center px-2 py-4 mx-auto mt-auto text-xs border-t md:justify-between md:flex-row">
+        <?= render_page_links('inline-flex mb-4 md:mb-0') ?>
+        <p>
+            <?= lang('Common.powered_by', [
+                'castopod' =>
+                    '<a class="underline hover:no-underline" href="https://castopod.org" target="_blank" rel="noreferrer noopener">Castopod</a>',
+            ]) ?>
+        </p>
+    </footer>
+</body>
\ No newline at end of file
diff --git a/app/Views/podcast/note.php b/app/Views/podcast/note.php
new file mode 100644
index 0000000000..810af1c16e
--- /dev/null
+++ b/app/Views/podcast/note.php
@@ -0,0 +1,38 @@
+<?= $this->extend('podcast/_layout') ?>
+
+<?= $this->section('meta-tags') ?>
+    <title><?= lang('Note.title', [
+        'actorDisplayName' => $note->actor->display_name,
+    ]) ?></title>
+    <meta name="description" content="<?= $note->message ?>"/>
+    <meta property="og:title" content="<?= lang('Note.title', [
+        'actorDisplayName' => $note->actor->display_name,
+    ]) ?>"/>
+    <meta property="og:locale" content="<?= service(
+        'request',
+    )->getLocale() ?>" />
+    <meta property="og:site_name" content="<?= $note->actor->display_name ?>" />
+    <meta property="og:url" content="<?= current_url() ?>" />
+    <meta property="og:image" content="<?= $note->actor->avatar_image_url ?>" />
+    <meta property="og:description" content="<?= $note->message ?>" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+<div class="max-w-2xl px-6 mx-auto">
+    <nav class="py-3">
+        <a href="<?= route_to('podcast-activity', $podcast->name) ?>"
+        class="inline-flex items-center px-4 py-2 text-sm"><?= icon(
+            'arrow-left',
+            'mr-2 text-lg',
+        ) .
+            lang('Note.back_to_actor_notes', [
+                'actor' => $note->actor->display_name,
+            ]) ?></a>
+    </nav>
+    <div class="pb-12">
+        <?= $this->include('podcast/_partials/note_with_replies') ?>
+    </div>
+</div>
+
+<?= $this->endSection()
+?>
diff --git a/app/Views/podcast/note_authenticated.php b/app/Views/podcast/note_authenticated.php
new file mode 100644
index 0000000000..2d26d1b0a0
--- /dev/null
+++ b/app/Views/podcast/note_authenticated.php
@@ -0,0 +1,40 @@
+<?= $this->extend('podcast/_layout_authenticated') ?>
+
+<?= $this->section('meta-tags') ?>
+    <title><?= lang('Note.title', [
+        'actorDisplayName' => $note->actor->display_name,
+    ]) ?></title>
+    <meta name="description" content="<?= $note->message ?>"/>
+    <meta property="og:title" content="<?= lang('Note.title', [
+        'actorDisplayName' => $note->actor->display_name,
+    ]) ?>"/>
+    <meta property="og:locale" content="<?= service(
+        'request',
+    )->getLocale() ?>" />
+    <meta property="og:site_name" content="<?= $note->actor->display_name ?>" />
+    <meta property="og:url" content="<?= current_url() ?>" />
+    <meta property="og:image" content="<?= $note->actor->avatar_image_url ?>" />
+    <meta property="og:description" content="<?= $note->message ?>" />
+<?= $this->endSection() ?>
+
+<?= $this->section('content') ?>
+<div class="max-w-2xl px-6 mx-auto">
+    <nav class="py-3">
+        <a href="<?= route_to('podcast-activity', $podcast->name) ?>"
+        class="inline-flex items-center px-4 py-2 text-sm"><?= icon(
+            'arrow-left',
+            'mr-2 text-lg',
+        ) .
+            lang('Note.back_to_actor_notes', [
+                'actor' => $note->actor->display_name,
+            ]) ?></a>
+    </nav>
+    <div class="pb-12">
+        <?= $this->include(
+            'podcast/_partials/note_with_replies_authenticated',
+        ) ?>
+    </div>
+</div>
+
+<?= $this->endSection()
+?>
diff --git a/app/Views/podcast/note_remote_action.php b/app/Views/podcast/note_remote_action.php
new file mode 100644
index 0000000000..99a4cd92f5
--- /dev/null
+++ b/app/Views/podcast/note_remote_action.php
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="<?= service('request')->getLocale() ?>">
+
+<head>
+    <meta charset="UTF-8"/>
+    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
+    <link rel="shortcut icon" type="image/png" href="/favicon.ico" />
+
+    <title><?= lang('ActivityPub.' . $action . '.title', [
+        'actorDisplayName' => $note->actor->display_name,
+    ]) ?></title>
+    <meta name="description" content="<?= $note->message ?>"/>
+    <meta property="og:title" content="<?= lang(
+        'ActivityPub.' . $action . '.title',
+        [
+            'actorDisplayName' => $note->actor->display_name,
+        ],
+    ) ?>"/>
+    <meta property="og:locale" content="<?= service(
+        'request',
+    )->getLocale() ?>" />
+    <meta property="og:site_name" content="<?= $note->actor->display_name ?>" />
+    <meta property="og:url" content="<?= current_url() ?>" />
+    <meta property="og:image" content="<?= $note->actor->avatar_image_url ?>" />
+    <meta property="og:description" content="<?= $note->message ?>" />
+
+    <link rel="stylesheet" href="/assets/index.css"/>
+    <script src="/assets/podcast.js" type="module"></script>
+</head>
+
+<body class="min-h-screen mx-auto bg-pine-50">
+    <header class="pt-8 pb-32 bg-pine-900">
+        <h1 class="text-lg font-semibold text-center text-white"><?= lang(
+            'ActivityPub.' . $action . '.subtitle',
+        ) ?></h1>
+    </header>
+    <main class="flex-1 max-w-xl px-4 pb-8 mx-auto -mt-24">
+        <?= $this->include('podcast/_partials/note') ?>
+
+        <?= form_open(
+            route_to('note-attempt-remote-action', $note->id, $action),
+            ['method' => 'post', 'class' => 'flex flex-col mt-8'],
+        ) ?>
+        <?= csrf_field() ?>
+        <?= view('_message_block') ?>
+
+        <?= form_label(
+            lang('ActivityPub.your_handle'),
+            'handle',
+            [],
+            lang('ActivityPub.your_handle_hint'),
+        ) ?>
+        <?= form_input([
+            'id' => 'handle',
+            'name' => 'handle',
+            'class' => 'form-input mb-4',
+            'required' => 'required',
+            'type' => 'text',
+        ]) ?>
+
+        <?= button(
+            lang('ActivityPub.' . $action . '.submit'),
+            null,
+            ['variant' => 'primary'],
+            ['type' => 'submit', 'class' => 'self-end'],
+        ) ?>
+        <?= form_close() ?>
+    </main>
+</body>
diff --git a/castopod_namespace.json b/castopod_namespace.json
new file mode 100644
index 0000000000..41faccfaeb
--- /dev/null
+++ b/castopod_namespace.json
@@ -0,0 +1,31 @@
+{
+  "@context": {
+    "id": "@id",
+    "type": "@type",
+    "as": "https://www.w3.org/ns/activitystreams#",
+    "schema": "http://schema.org#",
+    "cp": "https://castopod.org/ns#",
+    "xsd": "http://www.w3.org/2001/XMLSchema#",
+    "Podcast": "cp:Podcast",
+    "Episode": "cp:Episode",
+    "size": {
+      "@id": "cp:size",
+      "@type": "xsd:nonNegativeInteger"
+    },
+    "season": {
+      "@id": "cp:season",
+      "@type": "xsd:nonNegativeInteger"
+    },
+    "episode": {
+      "@id": "cp:episode",
+      "@type": "xsd:nonNegativeInteger"
+    },
+    "cover": {
+      "@id": "cp:cover",
+      "@type": "as:Link"
+    },
+    "copyright": "cp:copyright",
+    "category": "sc:category",
+    "language": "sc:inLanguage"
+  }
+}
diff --git a/composer.json b/composer.json
index 94ea12429a..e5a5e9e9d9 100644
--- a/composer.json
+++ b/composer.json
@@ -6,23 +6,35 @@
   "homepage": "https://castopod.org",
   "license": "AGPL-3.0-or-later",
   "require": {
-    "php": ">=7.2",
+    "php": "^7.3||^8.0",
     "james-heinrich/getid3": "~2.0.0-dev",
-    "whichbrowser/parser": "^2.0",
-    "geoip2/geoip2": "~2.0",
+    "whichbrowser/parser": "^v2.1.1",
+    "geoip2/geoip2": "^v2.11.0",
     "myth/auth": "dev-develop",
     "codeigniter4/codeigniter4": "dev-develop",
-    "league/commonmark": "^1.5",
-    "vlucas/phpdotenv": "^5.2",
+    "league/commonmark": "^1.5.7",
+    "vlucas/phpdotenv": "^v5.3.0",
     "league/html-to-markdown": "^4.10",
-    "opawg/user-agents-php": "^1.0",
-    "podlibre/ipcat": "^1.0",
-    "podlibre/podcast-namespace": "^1.0.6"
+    "opawg/user-agents-php": "^v1.0",
+    "podlibre/ipcat": "^v1.0",
+    "podlibre/podcast-namespace": "^v1.0.6",
+    "phpseclib/phpseclib": "~2.0.30",
+    "michalsn/codeigniter4-uuid": "^1.0@beta",
+    "essence/essence": "^3.5.4"
   },
   "require-dev": {
-    "mikey179/vfsstream": "1.6.*",
-    "phpunit/phpunit": "8.5.*",
-    "squizlabs/php_codesniffer": "3.*"
+    "mikey179/vfsstream": "^v1.6.8",
+    "phpunit/phpunit": "^9.5.1",
+    "squizlabs/php_codesniffer": "3.5.8"
+  },
+  "autoload": {
+    "psr-4": {
+      "App\\": "app",
+      "Config\\": "app/Config"
+    },
+    "exclude-from-classmap": [
+      "**/Database/Migrations/**"
+    ]
   },
   "autoload-dev": {
     "psr-4": {
diff --git a/composer.lock b/composer.lock
index 1b9ff8f66f..e79f6d1b58 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,76 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "28acb40506572ff4a0b98ad097a14763",
+    "content-hash": "0d419d654c43fa6e14f8a96b42258a91",
     "packages": [
+        {
+            "name": "brick/math",
+            "version": "0.9.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/brick/math.git",
+                "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/brick/math/zipball/dff976c2f3487d42c1db75a3b180e2b9f0e72ce0",
+                "reference": "dff976c2f3487d42c1db75a3b180e2b9f0e72ce0",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "php": "^7.1 || ^8.0"
+            },
+            "require-dev": {
+                "php-coveralls/php-coveralls": "^2.2",
+                "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0",
+                "vimeo/psalm": "4.3.2"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Brick\\Math\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Arbitrary-precision arithmetic library",
+            "keywords": [
+                "Arbitrary-precision",
+                "BigInteger",
+                "BigRational",
+                "arithmetic",
+                "bigdecimal",
+                "bignum",
+                "brick",
+                "math"
+            ],
+            "support": {
+                "issues": "https://github.com/brick/math/issues",
+                "source": "https://github.com/brick/math/tree/0.9.2"
+            },
+            "funding": [
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/brick/math",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-01-20T22:51:39+00:00"
+        },
         {
             "name": "codeigniter4/codeigniter4",
             "version": "dev-develop",
             "source": {
                 "type": "git",
                 "url": "https://github.com/codeigniter4/CodeIgniter4.git",
-                "reference": "b184bb577376f7d31026ebf93c092f768f5fba38"
+                "reference": "425bca14c840c08b935d730c73da372f3d4bdef8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/b184bb577376f7d31026ebf93c092f768f5fba38",
-                "reference": "b184bb577376f7d31026ebf93c092f768f5fba38",
+                "url": "https://api.github.com/repos/codeigniter4/CodeIgniter4/zipball/425bca14c840c08b935d730c73da372f3d4bdef8",
+                "reference": "425bca14c840c08b935d730c73da372f3d4bdef8",
                 "shasum": ""
             },
             "require": {
@@ -27,29 +83,37 @@
                 "ext-mbstring": "*",
                 "kint-php/kint": "^3.3",
                 "laminas/laminas-escaper": "^2.6",
-                "php": ">=7.2",
+                "php": "^7.3||^8.0",
                 "psr/log": "^1.1"
             },
             "require-dev": {
                 "codeigniter4/codeigniter4-standard": "^1.0",
                 "fakerphp/faker": "^1.9",
+                "johnkary/phpunit-speedtrap": "^3.3",
                 "mikey179/vfsstream": "^1.6",
-                "phpstan/phpstan": "^0.12",
-                "phpunit/phpunit": "^8.5",
+                "phpstan/phpstan": "0.12.82",
+                "phpunit/phpunit": "^9.1",
                 "predis/predis": "^1.1",
-                "rector/rector": "^0.8",
+                "rector/rector": "^0.10",
                 "squizlabs/php_codesniffer": "^3.3"
             },
+            "suggest": {
+                "ext-fileinfo": "Improves mime type detection for files"
+            },
             "default-branch": true,
             "type": "project",
             "autoload": {
                 "psr-4": {
                     "CodeIgniter\\": "system/"
-                }
+                },
+                "exclude-from-classmap": [
+                    "**/Database/Migrations/**"
+                ]
             },
             "autoload-dev": {
                 "psr-4": {
-                    "Utils\\": "utils"
+                    "CodeIgniter\\": "tests/system/",
+                    "Utils\\": "utils/"
                 }
             },
             "scripts": {
@@ -75,20 +139,20 @@
                 "slack": "https://codeigniterchat.slack.com",
                 "issues": "https://github.com/codeigniter4/CodeIgniter4/issues"
             },
-            "time": "2020-11-28T07:23:01+00:00"
+            "time": "2021-03-25T19:47:47+00:00"
         },
         {
             "name": "composer/ca-bundle",
-            "version": "1.2.8",
+            "version": "1.2.9",
             "source": {
                 "type": "git",
                 "url": "https://github.com/composer/ca-bundle.git",
-                "reference": "8a7ecad675253e4654ea05505233285377405215"
+                "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
-                "reference": "8a7ecad675253e4654ea05505233285377405215",
+                "url": "https://api.github.com/repos/composer/ca-bundle/zipball/78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
+                "reference": "78a0e288fdcebf92aa2318a8d3656168da6ac1a5",
                 "shasum": ""
             },
             "require": {
@@ -97,14 +161,15 @@
                 "php": "^5.3.2 || ^7.0 || ^8.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
+                "phpstan/phpstan": "^0.12.55",
                 "psr/log": "^1.0",
+                "symfony/phpunit-bridge": "^4.2 || ^5",
                 "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.x-dev"
+                    "dev-main": "1.x-dev"
                 }
             },
             "autoload": {
@@ -134,7 +199,7 @@
             "support": {
                 "irc": "irc://irc.freenode.org/composer",
                 "issues": "https://github.com/composer/ca-bundle/issues",
-                "source": "https://github.com/composer/ca-bundle/tree/1.2.8"
+                "source": "https://github.com/composer/ca-bundle/tree/1.2.9"
             },
             "funding": [
                 {
@@ -150,7 +215,204 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-08-23T12:54:47+00:00"
+            "time": "2021-01-12T12:10:35+00:00"
+        },
+        {
+            "name": "essence/dom",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/essence/dom.git",
+                "reference": "e5776d2286f4ccbd048d160c28ac77ccc6d68f3a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/essence/dom/zipball/e5776d2286f4ccbd048d160c28ac77ccc6d68f3a",
+                "reference": "e5776d2286f4ccbd048d160c28ac77ccc6d68f3a",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Essence\\Dom\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Félix Girault",
+                    "email": "felix.girault@gmail.com",
+                    "homepage": "http://www.felix-girault.fr",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Essence's DOM parser.",
+            "homepage": "http://github.com/essence/dom",
+            "keywords": [
+                "dom",
+                "parser"
+            ],
+            "support": {
+                "issues": "https://github.com/essence/dom/issues",
+                "source": "https://github.com/essence/dom/tree/1.0.0"
+            },
+            "time": "2015-07-23T20:33:17+00:00"
+        },
+        {
+            "name": "essence/essence",
+            "version": "3.5.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/essence/essence.git",
+                "reference": "81e889a87603840dadd04b317a51487df1d45933"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/essence/essence/zipball/81e889a87603840dadd04b317a51487df1d45933",
+                "reference": "81e889a87603840dadd04b317a51487df1d45933",
+                "shasum": ""
+            },
+            "require": {
+                "essence/dom": "~1.0.0",
+                "essence/http": "~1.0.0",
+                "fg/parkour": "~1.1.0",
+                "php": ">=5.5.0"
+            },
+            "suggest": {
+                "ext-curl": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Essence\\": "lib/Essence"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Félix Girault",
+                    "email": "felix.girault@gmail.com",
+                    "homepage": "http://www.felix-girault.fr",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Extracts information about medias on the web, like youtube videos, twitter statuses or blog articles.",
+            "homepage": "http://github.com/essence/essence",
+            "keywords": [
+                "embed",
+                "media",
+                "oembed",
+                "opengraph"
+            ],
+            "support": {
+                "issues": "https://github.com/essence/essence/issues",
+                "source": "https://github.com/essence/essence/tree/3.5.4"
+            },
+            "time": "2021-01-21T09:58:10+00:00"
+        },
+        {
+            "name": "essence/http",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/essence/http.git",
+                "reference": "ce0e52e0c0f2ed894ce2922ab2fd598dcaac91d2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/essence/http/zipball/ce0e52e0c0f2ed894ce2922ab2fd598dcaac91d2",
+                "reference": "ce0e52e0c0f2ed894ce2922ab2fd598dcaac91d2",
+                "shasum": ""
+            },
+            "suggest": {
+                "ext-curl": "*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Essence\\Http\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Félix Girault",
+                    "email": "felix.girault@gmail.com",
+                    "homepage": "http://www.felix-girault.fr",
+                    "role": "Developer"
+                }
+            ],
+            "description": "Essence's HTTP client.",
+            "homepage": "http://github.com/essence/http",
+            "keywords": [
+                "client",
+                "http"
+            ],
+            "support": {
+                "issues": "https://github.com/essence/http/issues",
+                "source": "https://github.com/essence/http/tree/1.0.0"
+            },
+            "time": "2015-07-23T20:33:50+00:00"
+        },
+        {
+            "name": "fg/parkour",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/felixgirault/parkour.git",
+                "reference": "f837eb640fc4aac81b11fe50d2fa04fb4ec71496"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/felixgirault/parkour/zipball/f837eb640fc4aac81b11fe50d2fa04fb4ec71496",
+                "reference": "f837eb640fc4aac81b11fe50d2fa04fb4ec71496",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.3.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Parkour\\": "lib"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Félix Girault",
+                    "email": "felix.girault@gmail.com",
+                    "homepage": "http://www.felix-girault.fr",
+                    "role": "Developer"
+                }
+            ],
+            "description": "A collection of utilities to manipulate arrays.",
+            "homepage": "http://github.com/felixgirault/parkour",
+            "keywords": [
+                "array",
+                "manipulation",
+                "traversing"
+            ],
+            "support": {
+                "issues": "https://github.com/felixgirault/parkour/issues",
+                "source": "https://github.com/felixgirault/parkour/tree/1.1.1"
+            },
+            "time": "2015-10-03T10:39:22+00:00"
         },
         {
             "name": "geoip2/geoip2",
@@ -499,24 +761,26 @@
         },
         {
             "name": "laminas/laminas-zendframework-bridge",
-            "version": "1.1.1",
+            "version": "1.2.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/laminas/laminas-zendframework-bridge.git",
-                "reference": "6ede70583e101030bcace4dcddd648f760ddf642"
+                "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6ede70583e101030bcace4dcddd648f760ddf642",
-                "reference": "6ede70583e101030bcace4dcddd648f760ddf642",
+                "url": "https://api.github.com/repos/laminas/laminas-zendframework-bridge/zipball/6cccbddfcfc742eb02158d6137ca5687d92cee32",
+                "reference": "6cccbddfcfc742eb02158d6137ca5687d92cee32",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0 || ^8.0"
+                "php": "^7.3 || ^8.0"
             },
             "require-dev": {
                 "phpunit/phpunit": "^5.7 || ^6.5 || ^7.5 || ^8.1 || ^9.3",
-                "squizlabs/php_codesniffer": "^3.5"
+                "psalm/plugin-phpunit": "^0.15.1",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^4.6"
             },
             "type": "library",
             "extra": {
@@ -555,7 +819,7 @@
                     "type": "community_bridge"
                 }
             ],
-            "time": "2020-09-14T14:23:00+00:00"
+            "time": "2021-02-25T21:54:58+00:00"
         },
         {
             "name": "league/commonmark",
@@ -746,27 +1010,28 @@
         },
         {
             "name": "maxmind-db/reader",
-            "version": "v1.8.0",
+            "version": "v1.10.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
-                "reference": "b566d429ac9aec10594b0935be8ff38302f8d5c8"
+                "reference": "07f84d969cfc527ce49388558a366ad376f1f35c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/b566d429ac9aec10594b0935be8ff38302f8d5c8",
-                "reference": "b566d429ac9aec10594b0935be8ff38302f8d5c8",
+                "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/07f84d969cfc527ce49388558a366ad376f1f35c",
+                "reference": "07f84d969cfc527ce49388558a366ad376f1f35c",
                 "shasum": ""
             },
             "require": {
                 "php": ">=7.2"
             },
             "conflict": {
-                "ext-maxminddb": "<1.8.0,>=2.0.0"
+                "ext-maxminddb": "<1.10.0,>=2.0.0"
             },
             "require-dev": {
-                "friendsofphp/php-cs-fixer": "2.*",
+                "friendsofphp/php-cs-fixer": "*",
                 "php-coveralls/php-coveralls": "^2.1",
+                "phpstan/phpstan": "*",
                 "phpunit/phpcov": ">=6.0.0",
                 "phpunit/phpunit": ">=8.0.0,<10.0.0",
                 "squizlabs/php_codesniffer": "3.*"
@@ -804,9 +1069,9 @@
             ],
             "support": {
                 "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues",
-                "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.8.0"
+                "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.10.0"
             },
-            "time": "2020-10-01T17:30:21+00:00"
+            "time": "2021-02-09T17:52:47+00:00"
         },
         {
             "name": "maxmind/web-service-common",
@@ -858,30 +1123,86 @@
             },
             "time": "2020-11-02T17:00:53+00:00"
         },
+        {
+            "name": "michalsn/codeigniter4-uuid",
+            "version": "v1.0.0-beta2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/michalsn/codeigniter4-uuid.git",
+                "reference": "a5f9751570a3b27e81deaa7548eef507499be888"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/michalsn/codeigniter4-uuid/zipball/a5f9751570a3b27e81deaa7548eef507499be888",
+                "reference": "a5f9751570a3b27e81deaa7548eef507499be888",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.2",
+                "ramsey/uuid": "^4.0"
+            },
+            "require-dev": {
+                "codeigniter4/codeigniter4": "dev-develop",
+                "phpunit/phpunit": "8.5.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Michalsn\\Uuid\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "michalsn",
+                    "homepage": "https://github.com/michalsn",
+                    "role": "Developer"
+                }
+            ],
+            "description": "UUID package for CodeIgniter 4 with support for Model and Entity.",
+            "homepage": "https://github.com/michalsn/codeigniter4-uuid",
+            "keywords": [
+                "codeigniter4",
+                "entity",
+                "model",
+                "uuid"
+            ],
+            "support": {
+                "issues": "https://github.com/michalsn/codeigniter4-uuid/issues",
+                "source": "https://github.com/michalsn/codeigniter4-uuid/tree/develop"
+            },
+            "time": "2020-08-16T07:56:20+00:00"
+        },
         {
             "name": "myth/auth",
             "version": "dev-develop",
             "source": {
                 "type": "git",
                 "url": "https://github.com/lonnieezell/myth-auth.git",
-                "reference": "26787ff2610089810c2b8e532f426cde1e83ae5e"
+                "reference": "a11dc6369177c932add936f1be3844c30fe45ed4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/26787ff2610089810c2b8e532f426cde1e83ae5e",
-                "reference": "26787ff2610089810c2b8e532f426cde1e83ae5e",
+                "url": "https://api.github.com/repos/lonnieezell/myth-auth/zipball/a11dc6369177c932add936f1be3844c30fe45ed4",
+                "reference": "a11dc6369177c932add936f1be3844c30fe45ed4",
                 "shasum": ""
             },
             "require": {
-                "php": ">=7.2"
+                "php": "^7.3 || ^8.0"
+            },
+            "provide": {
+                "codeigniter4/authentication-implementation": "1.0"
             },
             "require-dev": {
                 "codeigniter4/codeigniter4": "dev-develop",
                 "codeigniter4/codeigniter4-standard": "^1.0",
-                "fzaninotto/faker": "^1.9@dev",
+                "fakerphp/faker": "^1.9",
                 "mockery/mockery": "^1.0",
                 "phpstan/phpstan": "^0.12",
-                "phpunit/phpunit": "^8.5",
+                "phpunit/phpunit": "^9.0",
                 "squizlabs/php_codesniffer": "^3.5"
             },
             "default-branch": true,
@@ -889,7 +1210,10 @@
             "autoload": {
                 "psr-4": {
                     "Myth\\Auth\\": "src"
-                }
+                },
+                "exclude-from-classmap": [
+                    "**/Database/Migrations/**"
+                ]
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
@@ -924,7 +1248,7 @@
                     "type": "patreon"
                 }
             ],
-            "time": "2020-11-16T15:37:16+00:00"
+            "time": "2021-03-23T03:55:24+00:00"
         },
         {
             "name": "opawg/user-agents-php",
@@ -1034,42 +1358,151 @@
             "time": "2020-07-20T17:29:33+00:00"
         },
         {
-            "name": "podlibre/ipcat",
-            "version": "v1.0",
+            "name": "phpseclib/phpseclib",
+            "version": "2.0.30",
             "source": {
                 "type": "git",
-                "url": "https://github.com/podlibre/ipcat.git",
-                "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86"
+                "url": "https://github.com/phpseclib/phpseclib.git",
+                "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/podlibre/ipcat/zipball/1adfc821be508ddc8a742f6a5d5e6e42fdf28e86",
-                "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86",
+                "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/136b9ca7eebef78be14abf90d65c5e57b6bc5d36",
+                "reference": "136b9ca7eebef78be14abf90d65c5e57b6bc5d36",
                 "shasum": ""
             },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phing/phing": "~2.7",
+                "phpunit/phpunit": "^4.8.35|^5.7|^6.0|^9.4",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "suggest": {
+                "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+                "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+                "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+                "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+            },
             "type": "library",
             "autoload": {
+                "files": [
+                    "phpseclib/bootstrap.php"
+                ],
                 "psr-4": {
-                    "Podlibre\\Ipcat\\": ""
+                    "phpseclib\\": "phpseclib/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/",
             "license": [
-                "GPL-3.0-only"
+                "MIT"
             ],
             "authors": [
                 {
-                    "name": "Benjamin Bellamy",
-                    "email": "ben@podlibre.org",
-                    "homepage": "https://podlibre.org/"
+                    "name": "Jim Wigginton",
+                    "email": "terrafrost@php.net",
+                    "role": "Lead Developer"
+                },
+                {
+                    "name": "Patrick Monnerat",
+                    "email": "pm@datasphere.ch",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Andreas Fischer",
+                    "email": "bantu@phpbb.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Hans-Jürgen Petrich",
+                    "email": "petrich@tronic-media.com",
+                    "role": "Developer"
+                },
+                {
+                    "name": "Graham Campbell",
+                    "email": "graham@alt-three.com",
+                    "role": "Developer"
                 }
             ],
-            "description": "Categorization of IP Addresses forked from https://github.com/client9/ipcat",
-            "homepage": "https://github.com/podlibre/ipcat",
+            "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+            "homepage": "http://phpseclib.sourceforge.net",
+            "keywords": [
+                "BigInteger",
+                "aes",
+                "asn.1",
+                "asn1",
+                "blowfish",
+                "crypto",
+                "cryptography",
+                "encryption",
+                "rsa",
+                "security",
+                "sftp",
+                "signature",
+                "signing",
+                "ssh",
+                "twofish",
+                "x.509",
+                "x509"
+            ],
             "support": {
-                "source": "https://github.com/podlibre/ipcat/tree/v1.0"
+                "issues": "https://github.com/phpseclib/phpseclib/issues",
+                "source": "https://github.com/phpseclib/phpseclib/tree/2.0.30"
             },
-            "time": "2020-10-05T17:15:07+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/terrafrost",
+                    "type": "github"
+                },
+                {
+                    "url": "https://www.patreon.com/phpseclib",
+                    "type": "patreon"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2020-12-17T05:42:04+00:00"
+        },
+        {
+            "name": "podlibre/ipcat",
+            "version": "v1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/podlibre/ipcat.git",
+                "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/podlibre/ipcat/zipball/1adfc821be508ddc8a742f6a5d5e6e42fdf28e86",
+                "reference": "1adfc821be508ddc8a742f6a5d5e6e42fdf28e86",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Podlibre\\Ipcat\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "GPL-3.0-only"
+            ],
+            "authors": [
+                {
+                    "name": "Benjamin Bellamy",
+                    "email": "ben@podlibre.org",
+                    "homepage": "https://podlibre.org/"
+                }
+            ],
+            "description": "Categorization of IP Addresses forked from https://github.com/client9/ipcat",
+            "homepage": "https://github.com/podlibre/ipcat",
+            "support": {
+                "source": "https://github.com/podlibre/ipcat/tree/v1.0"
+            },
+            "time": "2020-10-05T17:15:07+00:00"
         },
         {
             "name": "podlibre/podcast-namespace",
@@ -1199,18 +1632,187 @@
             },
             "time": "2020-03-23T09:12:05+00:00"
         },
+        {
+            "name": "ramsey/collection",
+            "version": "1.1.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/collection.git",
+                "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/collection/zipball/28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1",
+                "reference": "28a5c4ab2f5111db6a60b2b4ec84057e0f43b9c1",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.2 || ^8"
+            },
+            "require-dev": {
+                "captainhook/captainhook": "^5.3",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+                "ergebnis/composer-normalize": "^2.6",
+                "fakerphp/faker": "^1.5",
+                "hamcrest/hamcrest-php": "^2",
+                "jangregor/phpstan-prophecy": "^0.8",
+                "mockery/mockery": "^1.3",
+                "phpstan/extension-installer": "^1",
+                "phpstan/phpstan": "^0.12.32",
+                "phpstan/phpstan-mockery": "^0.12.5",
+                "phpstan/phpstan-phpunit": "^0.12.11",
+                "phpunit/phpunit": "^8.5 || ^9",
+                "psy/psysh": "^0.10.4",
+                "slevomat/coding-standard": "^6.3",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "^4.4"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Ramsey\\Collection\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Ben Ramsey",
+                    "email": "ben@benramsey.com",
+                    "homepage": "https://benramsey.com"
+                }
+            ],
+            "description": "A PHP 7.2+ library for representing and manipulating collections.",
+            "keywords": [
+                "array",
+                "collection",
+                "hash",
+                "map",
+                "queue",
+                "set"
+            ],
+            "support": {
+                "issues": "https://github.com/ramsey/collection/issues",
+                "source": "https://github.com/ramsey/collection/tree/1.1.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ramsey",
+                    "type": "github"
+                },
+                {
+                    "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+                    "type": "tidelift"
+                }
+            ],
+            "time": "2021-01-21T17:40:04+00:00"
+        },
+        {
+            "name": "ramsey/uuid",
+            "version": "4.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/uuid.git",
+                "reference": "cd4032040a750077205918c86049aa0f43d22947"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/cd4032040a750077205918c86049aa0f43d22947",
+                "reference": "cd4032040a750077205918c86049aa0f43d22947",
+                "shasum": ""
+            },
+            "require": {
+                "brick/math": "^0.8 || ^0.9",
+                "ext-json": "*",
+                "php": "^7.2 || ^8",
+                "ramsey/collection": "^1.0",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "replace": {
+                "rhumsaa/uuid": "self.version"
+            },
+            "require-dev": {
+                "codeception/aspect-mock": "^3",
+                "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7.0",
+                "doctrine/annotations": "^1.8",
+                "goaop/framework": "^2",
+                "mockery/mockery": "^1.3",
+                "moontoast/math": "^1.1",
+                "paragonie/random-lib": "^2",
+                "php-mock/php-mock-mockery": "^1.3",
+                "php-mock/php-mock-phpunit": "^2.5",
+                "php-parallel-lint/php-parallel-lint": "^1.1",
+                "phpbench/phpbench": "^0.17.1",
+                "phpstan/extension-installer": "^1.0",
+                "phpstan/phpstan": "^0.12",
+                "phpstan/phpstan-mockery": "^0.12",
+                "phpstan/phpstan-phpunit": "^0.12",
+                "phpunit/phpunit": "^8.5",
+                "psy/psysh": "^0.10.0",
+                "slevomat/coding-standard": "^6.0",
+                "squizlabs/php_codesniffer": "^3.5",
+                "vimeo/psalm": "3.9.4"
+            },
+            "suggest": {
+                "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+                "ext-ctype": "Enables faster processing of character classification using ctype functions.",
+                "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+                "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+                "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+                "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Ramsey\\Uuid\\": "src/"
+                },
+                "files": [
+                    "src/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+            "homepage": "https://github.com/ramsey/uuid",
+            "keywords": [
+                "guid",
+                "identifier",
+                "uuid"
+            ],
+            "support": {
+                "issues": "https://github.com/ramsey/uuid/issues",
+                "rss": "https://github.com/ramsey/uuid/releases.atom",
+                "source": "https://github.com/ramsey/uuid"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/ramsey",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-08-18T17:17:46+00:00"
+        },
         {
             "name": "symfony/polyfill-ctype",
-            "version": "v1.20.0",
+            "version": "v1.22.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-ctype.git",
-                "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+                "reference": "c6c942b1ac76c82448322025e084cadc56048b4e"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
-                "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/c6c942b1ac76c82448322025e084cadc56048b4e",
+                "reference": "c6c942b1ac76c82448322025e084cadc56048b4e",
                 "shasum": ""
             },
             "require": {
@@ -1222,7 +1824,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.20-dev"
+                    "dev-main": "1.22-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -1260,7 +1862,7 @@
                 "portable"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0"
+                "source": "https://github.com/symfony/polyfill-ctype/tree/v1.22.1"
             },
             "funding": [
                 {
@@ -1276,20 +1878,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-10-23T14:02:19+00:00"
+            "time": "2021-01-07T16:49:33+00:00"
         },
         {
             "name": "symfony/polyfill-mbstring",
-            "version": "v1.20.0",
+            "version": "v1.22.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-mbstring.git",
-                "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
+                "reference": "5232de97ee3b75b0360528dae24e73db49566ab1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
-                "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/5232de97ee3b75b0360528dae24e73db49566ab1",
+                "reference": "5232de97ee3b75b0360528dae24e73db49566ab1",
                 "shasum": ""
             },
             "require": {
@@ -1301,7 +1903,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.20-dev"
+                    "dev-main": "1.22-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -1340,7 +1942,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
+                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.22.1"
             },
             "funding": [
                 {
@@ -1356,20 +1958,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-10-23T14:02:19+00:00"
+            "time": "2021-01-22T09:19:47+00:00"
         },
         {
             "name": "symfony/polyfill-php80",
-            "version": "v1.20.0",
+            "version": "v1.22.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/polyfill-php80.git",
-                "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de"
+                "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
-                "reference": "e70aa8b064c5b72d3df2abd5ab1e90464ad009de",
+                "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/dc3063ba22c2a1fd2f45ed856374d79114998f91",
+                "reference": "dc3063ba22c2a1fd2f45ed856374d79114998f91",
                 "shasum": ""
             },
             "require": {
@@ -1378,7 +1980,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-main": "1.20-dev"
+                    "dev-main": "1.22-dev"
                 },
                 "thanks": {
                     "name": "symfony/polyfill",
@@ -1423,7 +2025,7 @@
                 "shim"
             ],
             "support": {
-                "source": "https://github.com/symfony/polyfill-php80/tree/v1.20.0"
+                "source": "https://github.com/symfony/polyfill-php80/tree/v1.22.1"
             },
             "funding": [
                 {
@@ -1439,20 +2041,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-10-23T14:02:19+00:00"
+            "time": "2021-01-07T16:49:33+00:00"
         },
         {
             "name": "vlucas/phpdotenv",
-            "version": "v5.2.0",
+            "version": "v5.3.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/vlucas/phpdotenv.git",
-                "reference": "fba64139db67123c7a57072e5f8d3db10d160b66"
+                "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/fba64139db67123c7a57072e5f8d3db10d160b66",
-                "reference": "fba64139db67123c7a57072e5f8d3db10d160b66",
+                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
+                "reference": "b3eac5c7ac896e52deab4a99068e3f4ab12d9e56",
                 "shasum": ""
             },
             "require": {
@@ -1467,7 +2069,7 @@
             "require-dev": {
                 "bamarni/composer-bin-plugin": "^1.4.1",
                 "ext-filter": "*",
-                "phpunit/phpunit": "^7.5.20 || ^8.5.2 || ^9.0"
+                "phpunit/phpunit": "^7.5.20 || ^8.5.14 || ^9.5.1"
             },
             "suggest": {
                 "ext-filter": "Required to use the boolean validator."
@@ -1475,7 +2077,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "5.2-dev"
+                    "dev-master": "5.3-dev"
                 }
             },
             "autoload": {
@@ -1507,7 +2109,7 @@
             ],
             "support": {
                 "issues": "https://github.com/vlucas/phpdotenv/issues",
-                "source": "https://github.com/vlucas/phpdotenv/tree/v5.2.0"
+                "source": "https://github.com/vlucas/phpdotenv/tree/v5.3.0"
             },
             "funding": [
                 {
@@ -1519,20 +2121,20 @@
                     "type": "tidelift"
                 }
             ],
-            "time": "2020-09-14T15:57:31+00:00"
+            "time": "2021-01-20T15:23:13+00:00"
         },
         {
             "name": "whichbrowser/parser",
-            "version": "v2.0.42",
+            "version": "v2.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/WhichBrowser/Parser-PHP.git",
-                "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee"
+                "reference": "da24adc4f4f26002673d236e69b91a10f2fd594c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/4899110cd2f87b01e04ced62dbb9dec541031dee",
-                "reference": "4899110cd2f87b01e04ced62dbb9dec541031dee",
+                "url": "https://api.github.com/repos/WhichBrowser/Parser-PHP/zipball/da24adc4f4f26002673d236e69b91a10f2fd594c",
+                "reference": "da24adc4f4f26002673d236e69b91a10f2fd594c",
                 "shasum": ""
             },
             "require": {
@@ -1540,12 +2142,13 @@
                 "psr/cache": "^1.0"
             },
             "require-dev": {
+                "cache/array-adapter": "^1.1",
                 "icomefromthenet/reverse-regex": "0.0.6.3",
-                "phpunit/php-code-coverage": "^2.2 || ^3.0",
-                "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0",
-                "satooshi/php-coveralls": "^1.0",
-                "squizlabs/php_codesniffer": "2.5.*",
-                "symfony/yaml": "~2.8 || ~3.4 || ~4.2 || ~5.0"
+                "php-coveralls/php-coveralls": "^2.0",
+                "phpunit/php-code-coverage": "^5.0 || ^7.0",
+                "phpunit/phpunit": "^6.0 || ^8.0",
+                "squizlabs/php_codesniffer": "^3.5",
+                "symfony/yaml": "~3.4 || ~4.0"
             },
             "suggest": {
                 "cache/array-adapter": "Allows testing of the caching functionality"
@@ -1580,9 +2183,9 @@
             ],
             "support": {
                 "issues": "https://github.com/WhichBrowser/Parser-PHP/issues",
-                "source": "https://github.com/WhichBrowser/Parser-PHP/tree/v2.0.42"
+                "source": "https://github.com/WhichBrowser/Parser-PHP/tree/v2.1.1"
             },
-            "time": "2020-02-12T10:54:23+00:00"
+            "time": "2021-01-04T16:36:15+00:00"
         }
     ],
     "packages-dev": [
@@ -1764,30 +2367,87 @@
             ],
             "time": "2020-11-13T09:40:50+00:00"
         },
+        {
+            "name": "nikic/php-parser",
+            "version": "v4.10.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+                "reference": "c6d052fc58cb876152f89f532b95a8d7907e7f0e",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "ircmaxell/php-yacc": "^0.0.7",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.9-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov"
+                }
+            ],
+            "description": "A PHP parser written in PHP",
+            "keywords": [
+                "parser",
+                "php"
+            ],
+            "support": {
+                "issues": "https://github.com/nikic/PHP-Parser/issues",
+                "source": "https://github.com/nikic/PHP-Parser/tree/v4.10.4"
+            },
+            "time": "2020-12-20T10:01:03+00:00"
+        },
         {
             "name": "phar-io/manifest",
-            "version": "1.0.3",
+            "version": "2.0.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phar-io/manifest.git",
-                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4"
+                "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
-                "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4",
+                "url": "https://api.github.com/repos/phar-io/manifest/zipball/85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
+                "reference": "85265efd3af7ba3ca4b2a2c34dbfc5788dd29133",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
                 "ext-phar": "*",
-                "phar-io/version": "^2.0",
-                "php": "^5.6 || ^7.0"
+                "ext-xmlwriter": "*",
+                "phar-io/version": "^3.0.1",
+                "php": "^7.2 || ^8.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
@@ -1821,24 +2481,24 @@
                 "issues": "https://github.com/phar-io/manifest/issues",
                 "source": "https://github.com/phar-io/manifest/tree/master"
             },
-            "time": "2018-07-08T19:23:20+00:00"
+            "time": "2020-06-27T14:33:11+00:00"
         },
         {
             "name": "phar-io/version",
-            "version": "2.0.1",
+            "version": "3.1.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phar-io/version.git",
-                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6"
+                "reference": "bae7c545bef187884426f042434e561ab1ddb182"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6",
-                "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6",
+                "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182",
+                "reference": "bae7c545bef187884426f042434e561ab1ddb182",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0"
+                "php": "^7.2 || ^8.0"
             },
             "type": "library",
             "autoload": {
@@ -1870,9 +2530,9 @@
             "description": "Library for handling version information and constraints",
             "support": {
                 "issues": "https://github.com/phar-io/version/issues",
-                "source": "https://github.com/phar-io/version/tree/master"
+                "source": "https://github.com/phar-io/version/tree/3.1.0"
             },
-            "time": "2018-07-08T19:19:57+00:00"
+            "time": "2021-02-23T14:00:09+00:00"
         },
         {
             "name": "phpdocumentor/reflection-common",
@@ -2034,16 +2694,16 @@
         },
         {
             "name": "phpspec/prophecy",
-            "version": "1.12.1",
+            "version": "1.13.0",
             "source": {
                 "type": "git",
                 "url": "https://github.com/phpspec/prophecy.git",
-                "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d"
+                "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/8ce87516be71aae9b956f81906aaf0338e0d8a2d",
-                "reference": "8ce87516be71aae9b956f81906aaf0338e0d8a2d",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea",
+                "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea",
                 "shasum": ""
             },
             "require": {
@@ -2055,7 +2715,7 @@
             },
             "require-dev": {
                 "phpspec/phpspec": "^6.0",
-                "phpunit/phpunit": "^8.0 || ^9.0 <9.3"
+                "phpunit/phpunit": "^8.0 || ^9.0"
             },
             "type": "library",
             "extra": {
@@ -2095,46 +2755,50 @@
             ],
             "support": {
                 "issues": "https://github.com/phpspec/prophecy/issues",
-                "source": "https://github.com/phpspec/prophecy/tree/1.12.1"
+                "source": "https://github.com/phpspec/prophecy/tree/1.13.0"
             },
-            "time": "2020-09-29T09:10:42+00:00"
+            "time": "2021-03-17T13:42:18+00:00"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "7.0.12",
+            "version": "9.2.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
-                "reference": "52f55786aa2e52c26cd9e2db20aff2981e0f7399"
+                "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/52f55786aa2e52c26cd9e2db20aff2981e0f7399",
-                "reference": "52f55786aa2e52c26cd9e2db20aff2981e0f7399",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f3e026641cc91909d421802dd3ac7827ebfd97e1",
+                "reference": "f3e026641cc91909d421802dd3ac7827ebfd97e1",
                 "shasum": ""
             },
             "require": {
                 "ext-dom": "*",
+                "ext-libxml": "*",
                 "ext-xmlwriter": "*",
-                "php": "^7.2",
-                "phpunit/php-file-iterator": "^2.0.2",
-                "phpunit/php-text-template": "^1.2.1",
-                "phpunit/php-token-stream": "^3.1.1",
-                "sebastian/code-unit-reverse-lookup": "^1.0.1",
-                "sebastian/environment": "^4.2.2",
-                "sebastian/version": "^2.0.1",
-                "theseer/tokenizer": "^1.1.3"
+                "nikic/php-parser": "^4.10.2",
+                "php": ">=7.3",
+                "phpunit/php-file-iterator": "^3.0.3",
+                "phpunit/php-text-template": "^2.0.2",
+                "sebastian/code-unit-reverse-lookup": "^2.0.2",
+                "sebastian/complexity": "^2.0",
+                "sebastian/environment": "^5.1.2",
+                "sebastian/lines-of-code": "^1.0.3",
+                "sebastian/version": "^3.0.1",
+                "theseer/tokenizer": "^1.2.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^8.2.2"
+                "phpunit/phpunit": "^9.3"
             },
             "suggest": {
-                "ext-xdebug": "^2.7.2"
+                "ext-pcov": "*",
+                "ext-xdebug": "*"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "7.0-dev"
+                    "dev-master": "9.2-dev"
                 }
             },
             "autoload": {
@@ -2162,7 +2826,7 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
-                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.12"
+                "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.5"
             },
             "funding": [
                 {
@@ -2170,32 +2834,32 @@
                     "type": "github"
                 }
             ],
-            "time": "2020-11-27T06:08:35+00:00"
+            "time": "2020-11-28T06:44:49+00:00"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "2.0.2",
+            "version": "3.0.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
-                "reference": "050bedf145a257b1ff02746c31894800e5122946"
+                "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946",
-                "reference": "050bedf145a257b1ff02746c31894800e5122946",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
+                "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^7.1"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -2222,28 +2886,46 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
-                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.2"
+                "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5"
             },
-            "time": "2018-09-13T20:33:42+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:57:25+00:00"
         },
         {
-            "name": "phpunit/php-text-template",
-            "version": "1.2.1",
+            "name": "phpunit/php-invoker",
+            "version": "3.1.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-text-template.git",
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+                "url": "https://github.com/sebastianbergmann/php-invoker.git",
+                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+                "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "ext-pcntl": "*",
+                "phpunit/phpunit": "^9.3"
+            },
+            "suggest": {
+                "ext-pcntl": "*"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.1-dev"
+                }
+            },
             "autoload": {
                 "classmap": [
                     "src/"
@@ -2260,41 +2942,47 @@
                     "role": "lead"
                 }
             ],
-            "description": "Simple template engine.",
-            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "description": "Invoke callables with a timeout",
+            "homepage": "https://github.com/sebastianbergmann/php-invoker/",
             "keywords": [
-                "template"
+                "process"
             ],
             "support": {
-                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
-                "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+                "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+                "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
             },
-            "time": "2015-06-21T13:50:34+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:58:55+00:00"
         },
         {
-            "name": "phpunit/php-timer",
-            "version": "2.1.2",
+            "name": "phpunit/php-text-template",
+            "version": "2.0.4",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-timer.git",
-                "reference": "1038454804406b0b5f5f520358e78c1c2f71501e"
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/1038454804406b0b5f5f520358e78c1c2f71501e",
-                "reference": "1038454804406b0b5f5f520358e78c1c2f71501e",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+                "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^7.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.1-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
@@ -2313,42 +3001,47 @@
                     "role": "lead"
                 }
             ],
-            "description": "Utility class for timing",
-            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
             "keywords": [
-                "timer"
+                "template"
             ],
             "support": {
-                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
-                "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
+                "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+                "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
             },
-            "time": "2019-06-07T04:22:29+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T05:33:50+00:00"
         },
         {
-            "name": "phpunit/php-token-stream",
-            "version": "3.1.1",
+            "name": "phpunit/php-timer",
+            "version": "5.0.3",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
-                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff"
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/995192df77f63a59e47f025390d2d1fdf8f425ff",
-                "reference": "995192df77f63a59e47f025390d2d1fdf8f425ff",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+                "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
                 "shasum": ""
             },
             "require": {
-                "ext-tokenizer": "*",
-                "php": "^7.1"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^7.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1-dev"
+                    "dev-master": "5.0-dev"
                 }
             },
             "autoload": {
@@ -2363,33 +3056,39 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "Wrapper around PHP's tokenizer extension.",
-            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
             "keywords": [
-                "tokenizer"
+                "timer"
             ],
             "support": {
-                "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
-                "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.1"
+                "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+                "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
             },
-            "abandoned": true,
-            "time": "2019-09-17T06:23:10+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:16:10+00:00"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "8.5.11",
+            "version": "9.5.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "3123601e3b29339b20129acc3f989cfec3274566"
+                "reference": "c73c6737305e779771147af66c96ca6a7ed8a741"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3123601e3b29339b20129acc3f989cfec3274566",
-                "reference": "3123601e3b29339b20129acc3f989cfec3274566",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c73c6737305e779771147af66c96ca6a7ed8a741",
+                "reference": "c73c6737305e779771147af66c96ca6a7ed8a741",
                 "shasum": ""
             },
             "require": {
@@ -2400,32 +3099,35 @@
                 "ext-mbstring": "*",
                 "ext-xml": "*",
                 "ext-xmlwriter": "*",
-                "myclabs/deep-copy": "^1.10.0",
-                "phar-io/manifest": "^1.0.3",
-                "phar-io/version": "^2.0.1",
-                "php": "^7.2",
-                "phpspec/prophecy": "^1.10.3",
-                "phpunit/php-code-coverage": "^7.0.12",
-                "phpunit/php-file-iterator": "^2.0.2",
-                "phpunit/php-text-template": "^1.2.1",
-                "phpunit/php-timer": "^2.1.2",
-                "sebastian/comparator": "^3.0.2",
-                "sebastian/diff": "^3.0.2",
-                "sebastian/environment": "^4.2.3",
-                "sebastian/exporter": "^3.1.2",
-                "sebastian/global-state": "^3.0.0",
-                "sebastian/object-enumerator": "^3.0.3",
-                "sebastian/resource-operations": "^2.0.1",
-                "sebastian/type": "^1.1.3",
-                "sebastian/version": "^2.0.1"
+                "myclabs/deep-copy": "^1.10.1",
+                "phar-io/manifest": "^2.0.1",
+                "phar-io/version": "^3.0.2",
+                "php": ">=7.3",
+                "phpspec/prophecy": "^1.12.1",
+                "phpunit/php-code-coverage": "^9.2.3",
+                "phpunit/php-file-iterator": "^3.0.5",
+                "phpunit/php-invoker": "^3.1.1",
+                "phpunit/php-text-template": "^2.0.3",
+                "phpunit/php-timer": "^5.0.2",
+                "sebastian/cli-parser": "^1.0.1",
+                "sebastian/code-unit": "^1.0.6",
+                "sebastian/comparator": "^4.0.5",
+                "sebastian/diff": "^4.0.3",
+                "sebastian/environment": "^5.1.3",
+                "sebastian/exporter": "^4.0.3",
+                "sebastian/global-state": "^5.0.1",
+                "sebastian/object-enumerator": "^4.0.3",
+                "sebastian/resource-operations": "^3.0.3",
+                "sebastian/type": "^2.3",
+                "sebastian/version": "^3.0.2"
             },
             "require-dev": {
-                "ext-pdo": "*"
+                "ext-pdo": "*",
+                "phpspec/prophecy-phpunit": "^2.0.1"
             },
             "suggest": {
                 "ext-soap": "*",
-                "ext-xdebug": "*",
-                "phpunit/php-invoker": "^2.0.0"
+                "ext-xdebug": "*"
             },
             "bin": [
                 "phpunit"
@@ -2433,12 +3135,15 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "8.5-dev"
+                    "dev-master": "9.5-dev"
                 }
             },
             "autoload": {
                 "classmap": [
                     "src/"
+                ],
+                "files": [
+                    "src/Framework/Assert/Functions.php"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
@@ -2461,7 +3166,7 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/phpunit/issues",
-                "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.11"
+                "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.4"
             },
             "funding": [
                 {
@@ -2473,32 +3178,32 @@
                     "type": "github"
                 }
             ],
-            "time": "2020-11-27T12:46:45+00:00"
+            "time": "2021-03-23T07:16:29+00:00"
         },
         {
-            "name": "sebastian/code-unit-reverse-lookup",
+            "name": "sebastian/cli-parser",
             "version": "1.0.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+                "url": "https://github.com/sebastianbergmann/cli-parser.git",
+                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
-                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+                "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.6 || ^7.0"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^5.7 || ^6.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "1.0-dev"
                 }
             },
             "autoload": {
@@ -2513,43 +3218,161 @@
             "authors": [
                 {
                     "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
                 }
             ],
-            "description": "Looks up which function or method a line of code belongs to",
-            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "description": "Library for parsing CLI options",
+            "homepage": "https://github.com/sebastianbergmann/cli-parser",
             "support": {
-                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
-                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/master"
+                "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+                "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1"
             },
-            "time": "2017-03-04T06:30:41+00:00"
-        },
-        {
-            "name": "sebastian/comparator",
-            "version": "3.0.2",
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:08:49+00:00"
+        },
+        {
+            "name": "sebastian/code-unit",
+            "version": "1.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit.git",
+                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+                "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Collection of value objects that represent the PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/code-unit",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:08:54+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "2.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+                "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
+                "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:30:19+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "4.0.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/comparator.git",
-                "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da"
+                "reference": "55f4261989e546dc112258c7a75935a81a7ce382"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
-                "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382",
+                "reference": "55f4261989e546dc112258c7a75935a81a7ce382",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1",
-                "sebastian/diff": "^3.0",
-                "sebastian/exporter": "^3.1"
+                "php": ">=7.3",
+                "sebastian/diff": "^4.0",
+                "sebastian/exporter": "^4.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^7.1"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2562,6 +3385,10 @@
                 "BSD-3-Clause"
             ],
             "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
                 {
                     "name": "Jeff Welch",
                     "email": "whatthejeff@gmail.com"
@@ -2573,10 +3400,6 @@
                 {
                     "name": "Bernhard Schussek",
                     "email": "bschussek@2bepublished.at"
-                },
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@phpunit.de"
                 }
             ],
             "description": "Provides the functionality to compare PHP values for equality",
@@ -2588,35 +3411,98 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/comparator/issues",
-                "source": "https://github.com/sebastianbergmann/comparator/tree/master"
+                "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6"
             },
-            "time": "2018-07-12T15:12:46+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T15:49:45+00:00"
+        },
+        {
+            "name": "sebastian/complexity",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/complexity.git",
+                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88",
+                "reference": "739b35e53379900cc9ac327b2147867b8b6efd88",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.7",
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for calculating the complexity of PHP code units",
+            "homepage": "https://github.com/sebastianbergmann/complexity",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/complexity/issues",
+                "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T15:52:27+00:00"
         },
         {
             "name": "sebastian/diff",
-            "version": "3.0.2",
+            "version": "4.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/diff.git",
-                "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29"
+                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
-                "reference": "720fcc7e9b5cf384ea68d9d930d480907a0c1a29",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d",
+                "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^7.5 || ^8.0",
-                "symfony/process": "^2 || ^3.3 || ^4"
+                "phpunit/phpunit": "^9.3",
+                "symfony/process": "^4.2 || ^5"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2629,13 +3515,13 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Kore Nordmann",
-                    "email": "mail@kore-nordmann.de"
-                },
                 {
                     "name": "Sebastian Bergmann",
                     "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
                 }
             ],
             "description": "Diff implementation",
@@ -2648,29 +3534,35 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/diff/issues",
-                "source": "https://github.com/sebastianbergmann/diff/tree/master"
+                "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4"
             },
-            "time": "2019-02-04T06:01:07+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:10:38+00:00"
         },
         {
             "name": "sebastian/environment",
-            "version": "4.2.3",
+            "version": "5.1.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git",
-                "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368"
+                "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
-                "reference": "464c90d7bdf5ad4e8a6aea15c091fec0603d4368",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
+                "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^7.5"
+                "phpunit/phpunit": "^9.3"
             },
             "suggest": {
                 "ext-posix": "*"
@@ -2678,7 +3570,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.2-dev"
+                    "dev-master": "5.1-dev"
                 }
             },
             "autoload": {
@@ -2705,36 +3597,42 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/environment/issues",
-                "source": "https://github.com/sebastianbergmann/environment/tree/4.2.3"
+                "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3"
             },
-            "time": "2019-11-20T08:46:58+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:52:38+00:00"
         },
         {
             "name": "sebastian/exporter",
-            "version": "3.1.2",
+            "version": "4.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/exporter.git",
-                "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e"
+                "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/68609e1261d215ea5b21b7987539cbfbe156ec3e",
-                "reference": "68609e1261d215ea5b21b7987539cbfbe156ec3e",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+                "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0",
-                "sebastian/recursion-context": "^3.0"
+                "php": ">=7.3",
+                "sebastian/recursion-context": "^4.0"
             },
             "require-dev": {
                 "ext-mbstring": "*",
-                "phpunit/phpunit": "^6.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.1.x-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2776,32 +3674,38 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/exporter/issues",
-                "source": "https://github.com/sebastianbergmann/exporter/tree/master"
+                "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.3"
             },
-            "time": "2019-09-14T09:02:43+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T05:24:23+00:00"
         },
         {
             "name": "sebastian/global-state",
-            "version": "3.0.0",
+            "version": "5.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/global-state.git",
-                "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4"
+                "reference": "a90ccbddffa067b51f574dea6eb25d5680839455"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
-                "reference": "edf8a461cf1d4005f19fb0b6b8b95a9f7fa0adc4",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/a90ccbddffa067b51f574dea6eb25d5680839455",
+                "reference": "a90ccbddffa067b51f574dea6eb25d5680839455",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.2",
-                "sebastian/object-reflector": "^1.1.1",
-                "sebastian/recursion-context": "^3.0"
+                "php": ">=7.3",
+                "sebastian/object-reflector": "^2.0",
+                "sebastian/recursion-context": "^4.0"
             },
             "require-dev": {
                 "ext-dom": "*",
-                "phpunit/phpunit": "^8.0"
+                "phpunit/phpunit": "^9.3"
             },
             "suggest": {
                 "ext-uopz": "*"
@@ -2809,7 +3713,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0-dev"
+                    "dev-master": "5.0-dev"
                 }
             },
             "autoload": {
@@ -2834,36 +3738,99 @@
             ],
             "support": {
                 "issues": "https://github.com/sebastianbergmann/global-state/issues",
-                "source": "https://github.com/sebastianbergmann/global-state/tree/master"
+                "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.2"
             },
-            "time": "2019-02-01T05:30:01+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T15:55:19+00:00"
+        },
+        {
+            "name": "sebastian/lines-of-code",
+            "version": "1.0.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc",
+                "shasum": ""
+            },
+            "require": {
+                "nikic/php-parser": "^4.6",
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library for counting the lines of code in PHP source code",
+            "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+            "support": {
+                "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+                "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3"
+            },
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-11-28T06:42:11+00:00"
         },
         {
             "name": "sebastian/object-enumerator",
-            "version": "3.0.3",
+            "version": "4.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/object-enumerator.git",
-                "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
+                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5",
-                "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+                "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0",
-                "sebastian/object-reflector": "^1.1.1",
-                "sebastian/recursion-context": "^3.0"
+                "php": ">=7.3",
+                "sebastian/object-reflector": "^2.0",
+                "sebastian/recursion-context": "^4.0"
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0.x-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2885,34 +3852,40 @@
             "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
-                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master"
+                "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
             },
-            "time": "2017-08-03T12:35:26+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:12:34+00:00"
         },
         {
             "name": "sebastian/object-reflector",
-            "version": "1.1.1",
+            "version": "2.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/object-reflector.git",
-                "reference": "773f97c67f28de00d397be301821b06708fca0be"
+                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be",
-                "reference": "773f97c67f28de00d397be301821b06708fca0be",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+                "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.1-dev"
+                    "dev-master": "2.0-dev"
                 }
             },
             "autoload": {
@@ -2934,34 +3907,40 @@
             "homepage": "https://github.com/sebastianbergmann/object-reflector/",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
-                "source": "https://github.com/sebastianbergmann/object-reflector/tree/master"
+                "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
             },
-            "time": "2017-03-29T09:07:27+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:14:26+00:00"
         },
         {
             "name": "sebastian/recursion-context",
-            "version": "3.0.0",
+            "version": "4.0.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/recursion-context.git",
-                "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
-                "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172",
+                "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.0"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^6.0"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "3.0.x-dev"
+                    "dev-master": "4.0-dev"
                 }
             },
             "autoload": {
@@ -2974,14 +3953,14 @@
                 "BSD-3-Clause"
             ],
             "authors": [
-                {
-                    "name": "Jeff Welch",
-                    "email": "whatthejeff@gmail.com"
-                },
                 {
                     "name": "Sebastian Bergmann",
                     "email": "sebastian@phpunit.de"
                 },
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
                 {
                     "name": "Adam Harvey",
                     "email": "aharvey@php.net"
@@ -2991,31 +3970,40 @@
             "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
-                "source": "https://github.com/sebastianbergmann/recursion-context/tree/master"
+                "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4"
             },
-            "time": "2017-03-03T06:23:57+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:17:30+00:00"
         },
         {
             "name": "sebastian/resource-operations",
-            "version": "2.0.1",
+            "version": "3.0.3",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/resource-operations.git",
-                "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9"
+                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
-                "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9",
+                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
+                "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.1"
+                "php": ">=7.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^9.0"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -3037,34 +4025,40 @@
             "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
-                "source": "https://github.com/sebastianbergmann/resource-operations/tree/master"
+                "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3"
             },
-            "time": "2018-10-04T04:07:39+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:45:17+00:00"
         },
         {
             "name": "sebastian/type",
-            "version": "1.1.3",
+            "version": "2.3.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/type.git",
-                "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3"
+                "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/3aaaa15fa71d27650d62a948be022fe3b48541a3",
-                "reference": "3aaaa15fa71d27650d62a948be022fe3b48541a3",
+                "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
+                "reference": "81cd61ab7bbf2de744aba0ea61fae32f721df3d2",
                 "shasum": ""
             },
             "require": {
-                "php": "^7.2"
+                "php": ">=7.3"
             },
             "require-dev": {
-                "phpunit/phpunit": "^8.2"
+                "phpunit/phpunit": "^9.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.1-dev"
+                    "dev-master": "2.3-dev"
                 }
             },
             "autoload": {
@@ -3087,31 +4081,37 @@
             "homepage": "https://github.com/sebastianbergmann/type",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/type/issues",
-                "source": "https://github.com/sebastianbergmann/type/tree/master"
+                "source": "https://github.com/sebastianbergmann/type/tree/2.3.1"
             },
-            "time": "2019-07-02T08:10:15+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-10-26T13:18:59+00:00"
         },
         {
             "name": "sebastian/version",
-            "version": "2.0.1",
+            "version": "3.0.2",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/version.git",
-                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+                "reference": "c6c1022351a901512170118436c764e473f6de8c"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
-                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+                "reference": "c6c1022351a901512170118436c764e473f6de8c",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.6"
+                "php": ">=7.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.0.x-dev"
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -3134,9 +4134,15 @@
             "homepage": "https://github.com/sebastianbergmann/version",
             "support": {
                 "issues": "https://github.com/sebastianbergmann/version/issues",
-                "source": "https://github.com/sebastianbergmann/version/tree/master"
+                "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
             },
-            "time": "2016-10-03T07:35:21+00:00"
+            "funding": [
+                {
+                    "url": "https://github.com/sebastianbergmann",
+                    "type": "github"
+                }
+            ],
+            "time": "2020-09-28T06:39:44+00:00"
         },
         {
             "name": "squizlabs/php_codesniffer",
@@ -3246,30 +4252,35 @@
         },
         {
             "name": "webmozart/assert",
-            "version": "1.9.1",
+            "version": "1.10.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/webmozart/assert.git",
-                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+                "url": "https://github.com/webmozarts/assert.git",
+                "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
-                "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+                "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25",
+                "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25",
                 "shasum": ""
             },
             "require": {
-                "php": "^5.3.3 || ^7.0 || ^8.0",
+                "php": "^7.2 || ^8.0",
                 "symfony/polyfill-ctype": "^1.8"
             },
             "conflict": {
                 "phpstan/phpstan": "<0.12.20",
-                "vimeo/psalm": "<3.9.1"
+                "vimeo/psalm": "<4.6.1 || 4.6.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+                "phpunit/phpunit": "^8.5.13"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.10-dev"
+                }
+            },
             "autoload": {
                 "psr-4": {
                     "Webmozart\\Assert\\": "src/"
@@ -3292,10 +4303,10 @@
                 "validate"
             ],
             "support": {
-                "issues": "https://github.com/webmozart/assert/issues",
-                "source": "https://github.com/webmozart/assert/tree/master"
+                "issues": "https://github.com/webmozarts/assert/issues",
+                "source": "https://github.com/webmozarts/assert/tree/1.10.0"
             },
-            "time": "2020-07-08T17:02:28+00:00"
+            "time": "2021-03-09T10:59:23+00:00"
         }
     ],
     "aliases": [],
@@ -3303,12 +4314,13 @@
     "stability-flags": {
         "james-heinrich/getid3": 20,
         "myth/auth": 20,
-        "codeigniter4/codeigniter4": 20
+        "codeigniter4/codeigniter4": 20,
+        "michalsn/codeigniter4-uuid": 10
     },
     "prefer-stable": true,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=7.2"
+        "php": "^7.3||^8.0"
     },
     "platform-dev": [],
     "plugin-api-version": "2.0.0"
diff --git a/crontab b/crontab
new file mode 100644
index 0000000000..fc44ff63d3
--- /dev/null
+++ b/crontab
@@ -0,0 +1 @@
+* * * * * /usr/local/bin/php /castopod/public/index.php scheduled-activities
diff --git a/docker-compose.yml b/docker-compose.yml
index c8617b4893..c7f46e488e 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -9,7 +9,8 @@ services:
       context: .
       dockerfile: Dockerfile
     container_name: "castopod_app"
-    command: ["php", "spark", "serve", "--host", "0.0.0.0"]
+    command: >
+      sh -c "cron && php spark serve --host 0.0.0.0"
     ports:
       - 8080:8080
     volumes:
diff --git a/docs/setup-development.md b/docs/setup-development.md
index b4be5229ee..f39ba6b85e 100644
--- a/docs/setup-development.md
+++ b/docs/setup-development.md
@@ -11,6 +11,7 @@
 - [Going Further](#going-further)
   - [Useful docker / docker-compose commands](#useful-docker--docker-compose-commands)
 - [Developing inside a Container](#developing-inside-a-container)
+- [Known issues](#known-issues)
 
 ## Introduction
 
@@ -38,12 +39,12 @@ git clone https://code.podlibre.org/podlibre/castopod.git
    the database:
 
 ```ini
-CI_ENVIRONMENT = development
+CI_ENVIRONMENT="development"
 
-database.default.hostname = mariadb
-database.default.database = castopod
-database.default.username = podlibre
-database.default.password = castopod
+database.default.hostname="mariadb"
+database.default.database="castopod"
+database.default.username="podlibre"
+database.default.password="castopod"
 ```
 
 > _NB._ You can tweak your environment by setting more environment variables in
@@ -80,6 +81,8 @@ docker-compose run --rm node npm run build:js
 docker-compose run --rm node npm run build:css
 docker-compose run --rm node npm run build:icons
 docker-compose run --rm node npm run build:svg
+docker-compose run --rm node npm run copy:images
+docker-compose run --rm node npm run copy:fonts
 ```
 
 ## Start docker containers
@@ -258,3 +261,10 @@ git version
 
 For more info, see
 [VSCode Remote Containers](https://code.visualstudio.com/docs/remote/containers)
+
+## Known issues
+
+- `Allocation failed - JavaScript heap out of memory` when running `npm install`
+
+  👉 By default, docker might not have access to enough RAM. Allocate more
+  memory and run `npm install` again.
diff --git a/env b/env
index bc1a15671d..5893f099d6 100644
--- a/env
+++ b/env
@@ -35,6 +35,7 @@
 # app.cookiePath = '/'
 # app.cookieSecure = false
 # app.cookieHTTPOnly = false
+# app.cookieSameSite = 'Lax'
 
 # app.CSRFProtection  = false
 # app.CSRFTokenName   = 'csrf_test_name'
@@ -42,6 +43,7 @@
 # app.CSRFExpire      = 7200
 # app.CSRFRegenerate  = true
 # app.CSRFExcludeURIs = []
+# app.CSRFSameSite    = 'Lax'
 
 # app.CSPEnabled = false
 
@@ -83,11 +85,39 @@
 # contentsecuritypolicy.sandbox = false
 # contentsecuritypolicy.upgradeInsecureRequests = false
 
+#--------------------------------------------------------------------
+# ENCRYPTION
+#--------------------------------------------------------------------
+
+# encryption.key =
+# encryption.driver = OpenSSL
+# encryption.blockSize = 16
+# encryption.digest = SHA512
+
 #--------------------------------------------------------------------
 # HONEYPOT
 #--------------------------------------------------------------------
 
-#  honeypot.hidden = 'true'
-#  honeypot.label = 'Fill This Field'
-#  honeypot.name = 'honeypot'
-#  honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>'
+# honeypot.hidden = 'true'
+# honeypot.label = 'Fill This Field'
+# honeypot.name = 'honeypot'
+# honeypot.template = '<label>{label}</label><input type="text" name="{name}" value=""/>'
+# honeypot.container = '<div style="display:none">{template}</div>'
+
+#--------------------------------------------------------------------
+# SECURITY
+#--------------------------------------------------------------------
+
+# security.tokenName  = 'csrf_token_name'
+# security.headerName = 'X-CSRF-TOKEN'
+# security.cookieName = 'csrf_cookie_name'
+# security.expires    = 7200
+# security.regenerate = true
+# security.redirect   = true
+# security.samesite   = 'Lax'
+
+#--------------------------------------------------------------------
+# LOGGER
+#--------------------------------------------------------------------
+
+# logger.threshold = 4
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 46a056ec49..5a76b6ac1e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5,9 +5,9 @@
   "requires": true,
   "dependencies": {
     "@amcharts/amcharts4": {
-      "version": "4.10.8",
-      "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.8.tgz",
-      "integrity": "sha512-2xIPHkvuxhsN49btE+K0ThO0CxvEgHC+n2aFa05GLwIH2JKgSjFBmjSvELrEqlEYf2mEPjmKjuYe6d4TgHfGUA==",
+      "version": "4.10.17",
+      "resolved": "https://registry.npmjs.org/@amcharts/amcharts4/-/amcharts4-4.10.17.tgz",
+      "integrity": "sha512-7JQWiMZn/90RxJ+D862R4h3iVsF3cCuNqlBylBDxiOSfND2t6yD4ZBM9ZvM69DJgi2/lvc8BoazVyX98An81TQ==",
       "requires": {
         "@babel/runtime": "^7.6.3",
         "core-js": "^3.0.0",
@@ -26,16 +26,16 @@
       },
       "dependencies": {
         "tslib": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz",
-          "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ=="
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+          "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A=="
         }
       }
     },
     "@amcharts/amcharts4-geodata": {
-      "version": "4.1.17",
-      "resolved": "https://registry.npmjs.org/@amcharts/amcharts4-geodata/-/amcharts4-geodata-4.1.17.tgz",
-      "integrity": "sha512-ylzshiOq/aMRlVrRq8dOznZP7fp4xg/XkmhTjGm2dN6O1WqvoVBBOOnGyzrmb2gBlqN5zj59PQyOqSDyQUNe/Q=="
+      "version": "4.1.19",
+      "resolved": "https://registry.npmjs.org/@amcharts/amcharts4-geodata/-/amcharts4-geodata-4.1.19.tgz",
+      "integrity": "sha512-y100J6mp8H95qfHPPmeAat8oC+VXJrpt+rnwOt554sEW6cFCWY6BKgPKL2dVlVbnz0U3dqNsyENOqXmp3Pu7vg=="
     },
     "@babel/code-frame": {
       "version": "7.10.1",
@@ -47,78 +47,61 @@
       }
     },
     "@babel/compat-data": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.1.tgz",
-      "integrity": "sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz",
+      "integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==",
       "dev": true
     },
     "@babel/core": {
-      "version": "7.12.3",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.3.tgz",
-      "integrity": "sha512-0qXcZYKZp3/6N2jKYVxZv0aNCsxTSVCiK72DTiTYZAu7sjg73W0/aynWjMbiGd87EQL4WyA8reiJVh92AVla9g==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.1",
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helpers": "^7.12.1",
-        "@babel/parser": "^7.12.3",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.1",
-        "@babel/types": "^7.12.1",
+      "version": "7.13.10",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.10.tgz",
+      "integrity": "sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw==",
+      "dev": true,
+      "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.1",
+        "gensync": "^1.0.0-beta.2",
         "json5": "^2.1.2",
         "lodash": "^4.17.19",
-        "resolve": "^1.3.2",
-        "semver": "^5.4.1",
+        "semver": "^6.3.0",
         "source-map": "^0.5.0"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "version": "7.12.13",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+          "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/highlight": "^7.12.13"
           }
         },
         "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
           "dev": true
         },
         "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "version": "7.13.10",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+          "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
+            "@babel/helper-validator-identifier": "^7.12.11",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
-        "@babel/parser": {
-          "version": "7.12.3",
-          "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.3.tgz",
-          "integrity": "sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
         "chalk": {
           "version": "2.4.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -133,351 +116,245 @@
       }
     },
     "@babel/generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.1.tgz",
-      "integrity": "sha512-DB+6rafIdc9o72Yc3/Ph5h+6hUjeOp66pF0naQBgUFFuPqzQwIlPTm3xZR7YNvduIMtkDIj2t21LSQwnbCrXvg==",
+      "version": "7.13.9",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz",
+      "integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.12.1",
+        "@babel/types": "^7.13.0",
         "jsesc": "^2.5.1",
         "source-map": "^0.5.0"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
       }
     },
     "@babel/helper-annotate-as-pure": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz",
-      "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz",
+      "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/types": "^7.12.13"
       }
     },
     "@babel/helper-builder-binary-assignment-operator-visitor": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz",
-      "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz",
+      "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==",
       "dev": true,
       "requires": {
-        "@babel/helper-explode-assignable-expression": "^7.10.4",
-        "@babel/types": "^7.10.4"
+        "@babel/helper-explode-assignable-expression": "^7.12.13",
+        "@babel/types": "^7.12.13"
       }
     },
     "@babel/helper-compilation-targets": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.1.tgz",
-      "integrity": "sha512-jtBEif7jsPwP27GPHs06v4WBV0KrE8a/P7n0N0sSvHn2hwUCYnolP/CLmz51IzAW4NlN+HuoBtb9QcwnRo9F/g==",
+      "version": "7.13.10",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz",
+      "integrity": "sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA==",
       "dev": true,
       "requires": {
-        "@babel/compat-data": "^7.12.1",
-        "@babel/helper-validator-option": "^7.12.1",
-        "browserslist": "^4.12.0",
-        "semver": "^5.5.0"
+        "@babel/compat-data": "^7.13.8",
+        "@babel/helper-validator-option": "^7.12.17",
+        "browserslist": "^4.14.5",
+        "semver": "^6.3.0"
+      },
+      "dependencies": {
+        "browserslist": {
+          "version": "4.16.3",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+          "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+          "dev": true,
+          "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"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001204",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz",
+          "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.698",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz",
+          "integrity": "sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.71",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+          "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+          "dev": true
+        }
       }
     },
     "@babel/helper-create-class-features-plugin": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz",
-      "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==",
+      "version": "7.13.11",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.11.tgz",
+      "integrity": "sha512-ays0I7XYq9xbjCSvT+EvysLgfc3tOkwCULHjrnscGT3A9qD4sk3wXnJ3of0MAWsWGjdinFvajHU2smYuqXKMrw==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-member-expression-to-functions": "^7.12.1",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.10.4"
+        "@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.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.1.tgz",
-      "integrity": "sha512-rsZ4LGvFTZnzdNZR5HZdmJVuXK8834R5QkF3WvcnBhrlVtF0HSIUC6zbreL9MgjTywhKokn8RIYRiq99+DLAxA==",
+      "version": "7.12.17",
+      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz",
+      "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-regex": "^7.10.4",
+        "@babel/helper-annotate-as-pure": "^7.12.13",
         "regexpu-core": "^4.7.1"
       }
     },
-    "@babel/helper-define-map": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz",
-      "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==",
+    "@babel/helper-define-polyfill-provider": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz",
+      "integrity": "sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/types": "^7.10.5",
-        "lodash": "^4.17.19"
+        "@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"
       }
     },
     "@babel/helper-explode-assignable-expression": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz",
-      "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz",
+      "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.13.0"
       }
     },
     "@babel/helper-function-name": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz",
-      "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
+      "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
       "dev": true,
       "requires": {
-        "@babel/helper-get-function-arity": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/types": "^7.10.4"
+        "@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.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz",
-      "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
+      "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/types": "^7.12.13"
       }
     },
     "@babel/helper-hoist-variables": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz",
-      "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.0.tgz",
+      "integrity": "sha512-0kBzvXiIKfsCA0y6cFEIJf4OdzfpRuNk4+YTeHZpGGc666SATFKTz6sRncwFnQk7/ugJ4dSrCj6iJuvW4Qwr2g==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
       }
     },
     "@babel/helper-member-expression-to-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.1.tgz",
-      "integrity": "sha512-k0CIe3tXUKTRSoEx1LQEPFU9vRQfqHtl+kf8eNnDqb4AUJEy5pz6aIiog+YWtVm2jpggjS1laH68bPsR+KWWPQ==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
+      "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.13.12"
       }
     },
     "@babel/helper-module-imports": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz",
-      "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
+      "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/types": "^7.13.12"
       }
     },
     "@babel/helper-module-transforms": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz",
-      "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-simple-access": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/helper-validator-identifier": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.1",
-        "@babel/types": "^7.12.1",
-        "lodash": "^4.17.19"
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz",
+      "integrity": "sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-module-imports": "^7.13.12",
+        "@babel/helper-replace-supers": "^7.13.12",
+        "@babel/helper-simple-access": "^7.13.12",
+        "@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.12"
       },
       "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
-          "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.12.1"
-          }
-        },
         "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
           "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
         }
       }
     },
     "@babel/helper-optimise-call-expression": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz",
-      "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
+      "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.10.4"
+        "@babel/types": "^7.12.13"
       }
     },
     "@babel/helper-plugin-utils": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz",
-      "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
+      "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==",
       "dev": true
     },
-    "@babel/helper-regex": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz",
-      "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==",
-      "dev": true,
-      "requires": {
-        "lodash": "^4.17.19"
-      }
-    },
     "@babel/helper-remap-async-to-generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz",
-      "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz",
+      "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-wrap-function": "^7.10.4",
-        "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.1.tgz",
-      "integrity": "sha512-zJjTvtNJnCFsCXVi5rUInstLd/EIVNmIKA1Q9ynESmMBWPWd+7sdR+G4/wdu+Mppfep0XLyG2m7EBPvjCeFyrw==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
+      "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
       "dev": true,
       "requires": {
-        "@babel/helper-member-expression-to-functions": "^7.12.1",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/traverse": "^7.12.1",
-        "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/helper-member-expression-to-functions": "^7.13.12",
+        "@babel/helper-optimise-call-expression": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.12"
       }
     },
     "@babel/helper-simple-access": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz",
-      "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
+      "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.13.12"
       }
     },
     "@babel/helper-skip-transparent-expression-wrappers": {
@@ -487,53 +364,15 @@
       "dev": true,
       "requires": {
         "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
       }
     },
     "@babel/helper-split-export-declaration": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz",
-      "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
+      "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
       "dev": true,
       "requires": {
-        "@babel/types": "^7.11.0"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/types": "^7.12.13"
       }
     },
     "@babel/helper-validator-identifier": {
@@ -543,51 +382,32 @@
       "dev": true
     },
     "@babel/helper-validator-option": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz",
-      "integrity": "sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A==",
+      "version": "7.12.17",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
+      "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
       "dev": true
     },
     "@babel/helper-wrap-function": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz",
-      "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz",
+      "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.10.4",
-        "@babel/types": "^7.10.4"
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.1.tgz",
-      "integrity": "sha512-9JoDSBGoWtmbay98efmT2+mySkwjzeFeAL9BuWNoVQpkPFQF8SIIFUfY5os9u8wVzglzoiPRSW7cuJmBDUt43g==",
+      "version": "7.13.10",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz",
+      "integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==",
       "dev": true,
       "requires": {
-        "@babel/template": "^7.10.4",
-        "@babel/traverse": "^7.12.1",
-        "@babel/types": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@babel/template": "^7.12.13",
+        "@babel/traverse": "^7.13.0",
+        "@babel/types": "^7.13.0"
       }
     },
     "@babel/highlight": {
@@ -624,142 +444,155 @@
       }
     },
     "@babel/parser": {
-      "version": "7.12.2",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.2.tgz",
-      "integrity": "sha512-LMN+SqTiZEonUw4hQA0A3zG8DnN0E1F4K107LbDDUnC+0chML1rvWgsHloC9weB4RmZweE0uhFq0eGX7Nr/PBQ==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.12.tgz",
+      "integrity": "sha512-4T7Pb244rxH24yR116LAuJ+adxXXnHhZaLJjegJVKSdoNCe4x1eDBaud5YIcQFcqzsaD5BHvJw5BQ0AZapdCRw==",
       "dev": true
     },
+    "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz",
+      "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
+        "@babel/plugin-proposal-optional-chaining": "^7.13.12"
+      }
+    },
     "@babel/plugin-proposal-async-generator-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.1.tgz",
-      "integrity": "sha512-d+/o30tJxFxrA1lhzJqiUcEJdI6jKlNregCv5bASeGf2Q4MXmnwH7viDo7nhx1/ohf09oaH8j1GVYG/e3Yqk6A==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.8.tgz",
+      "integrity": "sha512-rPBnhj+WgoSmgq+4gQUtXx/vOcU+UYtjy1AA/aeD61Hwj410fwYyqfUcRP3lR8ucgliVJL/G7sXcNUecC75IXA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.12.1",
-        "@babel/plugin-syntax-async-generators": "^7.8.0"
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz",
-      "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz",
+      "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-class-features-plugin": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-proposal-dynamic-import": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz",
-      "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz",
+      "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-dynamic-import": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-export-namespace-from": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz",
-      "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz",
+      "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.12.13",
         "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-json-strings": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz",
-      "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz",
+      "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-json-strings": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-json-strings": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-logical-assignment-operators": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz",
-      "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz",
+      "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.13.0",
         "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-nullish-coalescing-operator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz",
-      "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz",
+      "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-numeric-separator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.1.tgz",
-      "integrity": "sha512-MR7Ok+Af3OhNTCxYVjJZHS0t97ydnJZt/DbR4WISO39iDnhiD8XHrY12xuSJ90FFEGjir0Fzyyn7g/zY6hxbxA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz",
+      "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.12.13",
         "@babel/plugin-syntax-numeric-separator": "^7.10.4"
       }
     },
     "@babel/plugin-proposal-object-rest-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz",
-      "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz",
+      "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
-        "@babel/plugin-transform-parameters": "^7.12.1"
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz",
-      "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz",
+      "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-optional-chaining": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.1.tgz",
-      "integrity": "sha512-c2uRpY6WzaVDzynVY9liyykS+kVU+WRZPMPYpkelXH8KBt1oXoI89kPbZKKG/jDT5UK92FTW2fZkZaJhdiBabw==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz",
+      "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.13.0",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.0"
+        "@babel/plugin-syntax-optional-chaining": "^7.8.3"
       }
     },
     "@babel/plugin-proposal-private-methods": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz",
-      "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz",
+      "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@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.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz",
-      "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz",
+      "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-syntax-async-generators": {
@@ -772,12 +605,12 @@
       }
     },
     "@babel/plugin-syntax-class-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz",
-      "integrity": "sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+      "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-syntax-dynamic-import": {
@@ -862,484 +695,429 @@
       }
     },
     "@babel/plugin-syntax-top-level-await": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz",
-      "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz",
+      "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-syntax-typescript": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.1.tgz",
-      "integrity": "sha512-UZNEcCY+4Dp9yYRCAHrHDU+9ZXLYaY9MgBXSRLkB9WjYFRR6quJBumfVrEkUxrePPBwFcpWfNKXqVRQQtm7mMA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz",
+      "integrity": "sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-arrow-functions": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz",
-      "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz",
+      "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-async-to-generator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz",
-      "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz",
+      "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-remap-async-to-generator": "^7.12.1"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
-          "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.12.1"
-          }
-        },
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@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.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz",
-      "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz",
+      "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-block-scoping": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.1.tgz",
-      "integrity": "sha512-zJyAC9sZdE60r1nVQHblcfCj29Dh2Y0DOvlMkcqSo0ckqjiCwNiUezUKw+RjOCwGfpLRwnAeQ2XlLpsnGkvv9w==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz",
+      "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-classes": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz",
-      "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz",
+      "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==",
       "dev": true,
       "requires": {
-        "@babel/helper-annotate-as-pure": "^7.10.4",
-        "@babel/helper-define-map": "^7.10.4",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-optimise-call-expression": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1",
-        "@babel/helper-split-export-declaration": "^7.10.4",
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz",
-      "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz",
+      "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-destructuring": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz",
-      "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.0.tgz",
+      "integrity": "sha512-zym5em7tePoNT9s964c0/KU3JPPnuq7VhIxPRefJ4/s82cD+q1mgKfuGRDMCPL0HTyKz4dISuQlCusfgCJ86HA==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-dotall-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz",
-      "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz",
+      "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-duplicate-keys": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz",
-      "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz",
+      "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-exponentiation-operator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz",
-      "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz",
+      "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==",
       "dev": true,
       "requires": {
-        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-for-of": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz",
-      "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz",
+      "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-function-name": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz",
-      "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz",
+      "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-function-name": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz",
-      "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz",
+      "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-member-expression-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz",
-      "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz",
+      "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-modules-amd": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz",
-      "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz",
+      "integrity": "sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz",
-      "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.13.8.tgz",
+      "integrity": "sha512-9QiOx4MEGglfYZ4XOnU79OHr6vIWUakIj9b4mioN8eQIoEh+pf5p/zEB36JpDFWA12nNMiRf7bfoRvl9Rn79Bw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-simple-access": "^7.12.1",
+        "@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.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz",
-      "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==",
+      "version": "7.13.8",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz",
+      "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==",
       "dev": true,
       "requires": {
-        "@babel/helper-hoist-variables": "^7.10.4",
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-validator-identifier": "^7.10.4",
+        "@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"
       },
       "dependencies": {
         "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
           "dev": true
         }
       }
     },
     "@babel/plugin-transform-modules-umd": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz",
-      "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.13.0.tgz",
+      "integrity": "sha512-D/ILzAh6uyvkWjKKyFE/W0FzWwasv6vPTSqPcjxFqn6QpX3u8DjRVliq4F2BamO2Wee/om06Vyy+vPkNrd4wxw==",
       "dev": true,
       "requires": {
-        "@babel/helper-module-transforms": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-module-transforms": "^7.13.0",
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-named-capturing-groups-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz",
-      "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz",
+      "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13"
       }
     },
     "@babel/plugin-transform-new-target": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz",
-      "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz",
+      "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-object-super": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz",
-      "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz",
+      "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-replace-supers": "^7.12.1"
+        "@babel/helper-plugin-utils": "^7.12.13",
+        "@babel/helper-replace-supers": "^7.12.13"
       }
     },
     "@babel/plugin-transform-parameters": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz",
-      "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz",
+      "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-property-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz",
-      "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz",
+      "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-regenerator": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz",
-      "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz",
+      "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==",
       "dev": true,
       "requires": {
         "regenerator-transform": "^0.14.2"
       }
     },
     "@babel/plugin-transform-reserved-words": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz",
-      "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz",
+      "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-shorthand-properties": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz",
-      "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz",
+      "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-spread": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz",
-      "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz",
+      "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
+        "@babel/helper-plugin-utils": "^7.13.0",
         "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
       }
     },
     "@babel/plugin-transform-sticky-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.1.tgz",
-      "integrity": "sha512-CiUgKQ3AGVk7kveIaPEET1jNDhZZEl1RPMWdTBE1799bdz++SwqDHStmxfCtDfBhQgCl38YRiSnrMuUMZIWSUQ==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz",
+      "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-regex": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-template-literals": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz",
-      "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz",
+      "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.13.0"
       }
     },
     "@babel/plugin-transform-typeof-symbol": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.1.tgz",
-      "integrity": "sha512-EPGgpGy+O5Kg5pJFNDKuxt9RdmTgj5sgrus2XVeMp/ZIbOESadgILUbm50SNpghOh3/6yrbsH+NB5+WJTmsA7Q==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz",
+      "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-typescript": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.12.1.tgz",
-      "integrity": "sha512-VrsBByqAIntM+EYMqSm59SiMEf7qkmI9dqMt6RbD/wlwueWmYcI0FFK5Fj47pP6DRZm+3teXjosKlwcZJ5lIMw==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz",
+      "integrity": "sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-class-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-syntax-typescript": "^7.12.1"
+        "@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.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz",
-      "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz",
+      "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/plugin-transform-unicode-regex": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz",
-      "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz",
+      "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==",
       "dev": true,
       "requires": {
-        "@babel/helper-create-regexp-features-plugin": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4"
+        "@babel/helper-create-regexp-features-plugin": "^7.12.13",
+        "@babel/helper-plugin-utils": "^7.12.13"
       }
     },
     "@babel/preset-env": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.1.tgz",
-      "integrity": "sha512-H8kxXmtPaAGT7TyBvSSkoSTUK6RHh61So05SyEbpmr0MCZrsNYn7mGMzzeYoOUCdHzww61k8XBft2TaES+xPLg==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.12.1",
-        "@babel/helper-compilation-targets": "^7.12.1",
-        "@babel/helper-module-imports": "^7.12.1",
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/helper-validator-option": "^7.12.1",
-        "@babel/plugin-proposal-async-generator-functions": "^7.12.1",
-        "@babel/plugin-proposal-class-properties": "^7.12.1",
-        "@babel/plugin-proposal-dynamic-import": "^7.12.1",
-        "@babel/plugin-proposal-export-namespace-from": "^7.12.1",
-        "@babel/plugin-proposal-json-strings": "^7.12.1",
-        "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1",
-        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1",
-        "@babel/plugin-proposal-numeric-separator": "^7.12.1",
-        "@babel/plugin-proposal-object-rest-spread": "^7.12.1",
-        "@babel/plugin-proposal-optional-catch-binding": "^7.12.1",
-        "@babel/plugin-proposal-optional-chaining": "^7.12.1",
-        "@babel/plugin-proposal-private-methods": "^7.12.1",
-        "@babel/plugin-proposal-unicode-property-regex": "^7.12.1",
-        "@babel/plugin-syntax-async-generators": "^7.8.0",
-        "@babel/plugin-syntax-class-properties": "^7.12.1",
-        "@babel/plugin-syntax-dynamic-import": "^7.8.0",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.13.12.tgz",
+      "integrity": "sha512-JzElc6jk3Ko6zuZgBtjOd01pf9yYDEIH8BcqVuYIuOkzOwDesoa/Nz4gIo4lBG6K861KTV9TvIgmFuT6ytOaAA==",
+      "dev": true,
+      "requires": {
+        "@babel/compat-data": "^7.13.12",
+        "@babel/helper-compilation-targets": "^7.13.10",
+        "@babel/helper-plugin-utils": "^7.13.0",
+        "@babel/helper-validator-option": "^7.12.17",
+        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12",
+        "@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.12",
+        "@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.0",
+        "@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.0",
+        "@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.0",
-        "@babel/plugin-syntax-optional-catch-binding": "^7.8.0",
-        "@babel/plugin-syntax-optional-chaining": "^7.8.0",
-        "@babel/plugin-syntax-top-level-await": "^7.12.1",
-        "@babel/plugin-transform-arrow-functions": "^7.12.1",
-        "@babel/plugin-transform-async-to-generator": "^7.12.1",
-        "@babel/plugin-transform-block-scoped-functions": "^7.12.1",
-        "@babel/plugin-transform-block-scoping": "^7.12.1",
-        "@babel/plugin-transform-classes": "^7.12.1",
-        "@babel/plugin-transform-computed-properties": "^7.12.1",
-        "@babel/plugin-transform-destructuring": "^7.12.1",
-        "@babel/plugin-transform-dotall-regex": "^7.12.1",
-        "@babel/plugin-transform-duplicate-keys": "^7.12.1",
-        "@babel/plugin-transform-exponentiation-operator": "^7.12.1",
-        "@babel/plugin-transform-for-of": "^7.12.1",
-        "@babel/plugin-transform-function-name": "^7.12.1",
-        "@babel/plugin-transform-literals": "^7.12.1",
-        "@babel/plugin-transform-member-expression-literals": "^7.12.1",
-        "@babel/plugin-transform-modules-amd": "^7.12.1",
-        "@babel/plugin-transform-modules-commonjs": "^7.12.1",
-        "@babel/plugin-transform-modules-systemjs": "^7.12.1",
-        "@babel/plugin-transform-modules-umd": "^7.12.1",
-        "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1",
-        "@babel/plugin-transform-new-target": "^7.12.1",
-        "@babel/plugin-transform-object-super": "^7.12.1",
-        "@babel/plugin-transform-parameters": "^7.12.1",
-        "@babel/plugin-transform-property-literals": "^7.12.1",
-        "@babel/plugin-transform-regenerator": "^7.12.1",
-        "@babel/plugin-transform-reserved-words": "^7.12.1",
-        "@babel/plugin-transform-shorthand-properties": "^7.12.1",
-        "@babel/plugin-transform-spread": "^7.12.1",
-        "@babel/plugin-transform-sticky-regex": "^7.12.1",
-        "@babel/plugin-transform-template-literals": "^7.12.1",
-        "@babel/plugin-transform-typeof-symbol": "^7.12.1",
-        "@babel/plugin-transform-unicode-escapes": "^7.12.1",
-        "@babel/plugin-transform-unicode-regex": "^7.12.1",
-        "@babel/preset-modules": "^0.1.3",
-        "@babel/types": "^7.12.1",
-        "core-js-compat": "^3.6.2",
-        "semver": "^5.5.0"
-      },
-      "dependencies": {
-        "@babel/helper-module-imports": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.1.tgz",
-          "integrity": "sha512-ZeC1TlMSvikvJNy1v/wPIazCu3NdOwgYZLIkmIyAsGhqkNpiDoQQRmaCK8YP4Pq3GPTLPV9WXaPCJKvx06JxKA==",
-          "dev": true,
-          "requires": {
-            "@babel/types": "^7.12.1"
-          }
-        },
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        }
+        "@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.12",
+        "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": {
@@ -1356,63 +1134,57 @@
       }
     },
     "@babel/preset-typescript": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.12.1.tgz",
-      "integrity": "sha512-hNK/DhmoJPsksdHuI/RVrcEws7GN5eamhi28JkO52MqIxU8Z0QpmiSOQxZHWOHV7I3P4UjHV97ay4TcamMA6Kw==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.13.0.tgz",
+      "integrity": "sha512-LXJwxrHy0N3f6gIJlYbLta1D9BDtHpQeqwzM0LIfjDlr6UE/D5Mc7W4iDiQzaE+ks0sTjT26ArcHWnJVt0QiHw==",
       "dev": true,
       "requires": {
-        "@babel/helper-plugin-utils": "^7.10.4",
-        "@babel/plugin-transform-typescript": "^7.12.1"
+        "@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.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.4.tgz",
-      "integrity": "sha512-UpTN5yUJr9b4EX2CnGNWIvER7Ab83ibv0pcvvHc4UOdrBI5jb8bj+32cCwPX6xu0mt2daFNjYhoi+X7beH0RSw==",
+      "version": "7.12.5",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz",
+      "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==",
       "requires": {
         "regenerator-runtime": "^0.13.4"
-      },
-      "dependencies": {
-        "regenerator-runtime": {
-          "version": "0.13.5",
-          "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
-          "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA=="
-        }
       }
     },
     "@babel/template": {
-      "version": "7.10.4",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz",
-      "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==",
+      "version": "7.12.13",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
+      "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/parser": "^7.10.4",
-        "@babel/types": "^7.10.4"
+        "@babel/code-frame": "^7.12.13",
+        "@babel/parser": "^7.12.13",
+        "@babel/types": "^7.12.13"
       },
       "dependencies": {
         "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "version": "7.12.13",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+          "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/highlight": "^7.12.13"
           }
         },
         "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
           "dev": true
         },
         "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "version": "7.13.10",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+          "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
+            "@babel/helper-validator-identifier": "^7.12.11",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
@@ -1431,59 +1203,48 @@
       }
     },
     "@babel/traverse": {
-      "version": "7.12.1",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.1.tgz",
-      "integrity": "sha512-MA3WPoRt1ZHo2ZmoGKNqi20YnPt0B1S0GTZEPhhd+hw2KGUzBlHuVunj6K4sNuK+reEvyiPwtp0cpaqLzJDmAw==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz",
+      "integrity": "sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "@babel/generator": "^7.12.1",
-        "@babel/helper-function-name": "^7.10.4",
-        "@babel/helper-split-export-declaration": "^7.11.0",
-        "@babel/parser": "^7.12.1",
-        "@babel/types": "^7.12.1",
+        "@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": {
         "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "version": "7.12.13",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+          "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "@babel/highlight": "^7.12.13"
           }
         },
         "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
           "dev": true
         },
         "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "version": "7.13.10",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+          "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
+            "@babel/helper-validator-identifier": "^7.12.11",
             "chalk": "^2.0.0",
             "js-tokens": "^4.0.0"
           }
         },
-        "@babel/types": {
-          "version": "7.12.1",
-          "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.1.tgz",
-          "integrity": "sha512-BzSY3NJBKM4kyatSOWh3D/JJ2O3CVzBybHWxtgxnggaxEuaSTTDqeiSb/xk9lrkw2Tbqyivw5ZU4rT+EfznQsA==",
-          "dev": true,
-          "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "lodash": "^4.17.19",
-            "to-fast-properties": "^2.0.0"
-          }
-        },
         "chalk": {
           "version": "2.4.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -1498,84 +1259,67 @@
       }
     },
     "@babel/types": {
-      "version": "7.10.5",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz",
-      "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==",
+      "version": "7.13.12",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.12.tgz",
+      "integrity": "sha512-K4nY2xFN4QMvQwkQ+zmBDp6ANMbVNw6BbxWmYA4qNjhR9W+Lj/8ky5MEY2Me5r+B2c6/v6F53oMndG+f9s3IiA==",
       "dev": true,
       "requires": {
-        "@babel/helper-validator-identifier": "^7.10.4",
+        "@babel/helper-validator-identifier": "^7.12.11",
         "lodash": "^4.17.19",
         "to-fast-properties": "^2.0.0"
       },
       "dependencies": {
         "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
-        },
-        "lodash": {
-          "version": "4.17.19",
-          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
-          "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
           "dev": true
         }
       }
     },
     "@commitlint/cli": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-11.0.0.tgz",
-      "integrity": "sha512-YWZWg1DuqqO5Zjh7vUOeSX76vm0FFyz4y0cpGMFhrhvUi5unc4IVfCXZ6337R9zxuBtmveiRuuhQqnRRer+13g==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-12.0.1.tgz",
+      "integrity": "sha512-V+cMYNHJOr40XT9Kvz3Vrz1Eh7QE1rjQrUbifawDAqcOrBJFuoXwU2SAcRtYFCSqFy9EhbreQGhZFs8dYb90KA==",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.11.2",
-        "@commitlint/format": "^11.0.0",
-        "@commitlint/lint": "^11.0.0",
-        "@commitlint/load": "^11.0.0",
-        "@commitlint/read": "^11.0.0",
-        "chalk": "4.1.0",
-        "core-js": "^3.6.1",
+        "@commitlint/format": "^12.0.1",
+        "@commitlint/lint": "^12.0.1",
+        "@commitlint/load": "^12.0.1",
+        "@commitlint/read": "^12.0.1",
+        "@commitlint/types": "^12.0.1",
         "get-stdin": "8.0.0",
         "lodash": "^4.17.19",
         "resolve-from": "5.0.0",
         "resolve-global": "1.0.0",
-        "yargs": "^15.1.0"
+        "yargs": "^16.2.0"
       },
       "dependencies": {
-        "@babel/runtime": {
-          "version": "7.11.2",
-          "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
-          "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
-          "dev": true,
-          "requires": {
-            "regenerator-runtime": "^0.13.4"
-          }
-        },
         "@commitlint/execute-rule": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-11.0.0.tgz",
-          "integrity": "sha512-g01p1g4BmYlZ2+tdotCavrMunnPFPhTzG1ZiLKTCYrooHRbmvqo42ZZn4QMStUEIcn+jfLb6BRZX3JzIwA1ezQ==",
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.0.1.tgz",
+          "integrity": "sha512-JzyweYfZlFLtXpgP+btzSY3YAkGPg61TqUSYQqBr4+5IaVf1FruMm5v4D5eLu9dAJuNKUfHbM3AEfuEPiZ79pg==",
           "dev": true
         },
         "@commitlint/load": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-11.0.0.tgz",
-          "integrity": "sha512-t5ZBrtgvgCwPfxmG811FCp39/o3SJ7L+SNsxFL92OR4WQxPcu6c8taD0CG2lzOHGuRyuMxZ7ps3EbngT2WpiCg==",
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-12.0.1.tgz",
+          "integrity": "sha512-dX8KdCWn7w0bTkkk3zKQpe9X8vsTRa5EM+1ffF313wCX9b6tGa9vujhEHCkSzKAbbE2tFV64CHZygE7rtlHdIA==",
           "dev": true,
           "requires": {
-            "@commitlint/execute-rule": "^11.0.0",
-            "@commitlint/resolve-extends": "^11.0.0",
-            "@commitlint/types": "^11.0.0",
-            "chalk": "4.1.0",
+            "@commitlint/execute-rule": "^12.0.1",
+            "@commitlint/resolve-extends": "^12.0.1",
+            "@commitlint/types": "^12.0.1",
+            "chalk": "^4.0.0",
             "cosmiconfig": "^7.0.0",
             "lodash": "^4.17.19",
             "resolve-from": "^5.0.0"
           }
         },
         "@commitlint/resolve-extends": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-11.0.0.tgz",
-          "integrity": "sha512-WinU6Uv6L7HDGLqn/To13KM1CWvZ09VHZqryqxXa1OY+EvJkfU734CwnOEeNlSCK7FVLrB4kmodLJtL1dkEpXw==",
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.0.1.tgz",
+          "integrity": "sha512-Mvg0GDi/68Cqw893ha8uhxE8myHfPmiSSSi7d1x4VJNR4hoS37lBdX89kyx4i9NPmLfviY2cUJKTyK8ZrFznZw==",
           "dev": true,
           "requires": {
             "import-fresh": "^3.0.0",
@@ -1585,46 +1329,14 @@
           }
         },
         "@commitlint/types": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
-          "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-          "dev": true,
-          "requires": {
-            "@types/color-name": "^1.1.1",
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
           "dev": true,
           "requires": {
-            "color-name": "~1.1.4"
+            "chalk": "^4.0.0"
           }
         },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "cosmiconfig": {
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
@@ -1638,16 +1350,10 @@
             "yaml": "^1.10.0"
           }
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
         "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
           "dev": true,
           "requires": {
             "parent-module": "^1.0.0",
@@ -1663,9 +1369,9 @@
           }
         },
         "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
@@ -1679,42 +1385,36 @@
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
           "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
     "@commitlint/config-conventional": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-11.0.0.tgz",
-      "integrity": "sha512-SNDRsb5gLuDd2PL83yCOQX6pE7gevC79UPFx+GLbLfw6jGnnbO9/tlL76MLD8MOViqGbo7ZicjChO9Gn+7tHhA==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-12.0.1.tgz",
+      "integrity": "sha512-1ZhB135lh47zVmf1orwcjxuKuam11fJIH/bdVxW9XiQv8XPwC6iIp19knfl8FcOT78AVBnes1z6EVxgUeP2/4Q==",
       "dev": true,
       "requires": {
         "conventional-changelog-conventionalcommits": "^4.3.1"
       }
     },
     "@commitlint/ensure": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-11.0.0.tgz",
-      "integrity": "sha512-/T4tjseSwlirKZdnx4AuICMNNlFvRyPQimbZIOYujp9DSO6XRtOy9NrmvWujwHsq9F5Wb80QWi4WMW6HMaENug==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-12.0.1.tgz",
+      "integrity": "sha512-XdBq+q1YBBDxWIAEjE3Y1YMbzhUnUuSLAEWD8SU1xsvEpQXWRYwDlMBRkjO7funNWTdL0ZQSkZDzme70imYjbw==",
       "dev": true,
       "requires": {
-        "@commitlint/types": "^11.0.0",
+        "@commitlint/types": "^12.0.1",
         "lodash": "^4.17.19"
       },
       "dependencies": {
         "@commitlint/types": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
-          "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
-          "dev": true
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
         }
       }
     },
@@ -1726,64 +1426,76 @@
       "optional": true
     },
     "@commitlint/format": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-11.0.0.tgz",
-      "integrity": "sha512-bpBLWmG0wfZH/svzqD1hsGTpm79TKJWcf6EXZllh2J/LSSYKxGlv967lpw0hNojme0sZd4a/97R3qA2QHWWSLg==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-12.0.1.tgz",
+      "integrity": "sha512-rF79ipAxR8yFzPzG5tRoEZ//MRkyxCXj4JhpEjtdaCMBAXMssI8uazn3e5D8z4UFgSDe9qOnL0OmQvql7HTMoA==",
       "dev": true,
       "requires": {
-        "@commitlint/types": "^11.0.0",
+        "@commitlint/types": "^12.0.1",
         "chalk": "^4.0.0"
       },
       "dependencies": {
         "@commitlint/types": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
-          "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
-          "dev": true
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
         }
       }
     },
     "@commitlint/is-ignored": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-11.0.0.tgz",
-      "integrity": "sha512-VLHOUBN+sOlkYC4tGuzE41yNPO2w09sQnOpfS+pSPnBFkNUUHawEuA44PLHtDvQgVuYrMAmSWFQpWabMoP5/Xg==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-12.0.1.tgz",
+      "integrity": "sha512-AplfLn5mX/kWTIiSolcOhTYcgphuGLX8FUr+HmyHBEqUkO36jt0z9caysH47fqU71ePtH63v1DWm+RYQ5RPDjg==",
       "dev": true,
       "requires": {
-        "@commitlint/types": "^11.0.0",
-        "semver": "7.3.2"
+        "@commitlint/types": "^12.0.1",
+        "semver": "7.3.4"
       },
       "dependencies": {
         "@commitlint/types": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
-          "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
-          "dev": true
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
         },
         "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
+          "version": "7.3.4",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+          "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
         }
       }
     },
     "@commitlint/lint": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-11.0.0.tgz",
-      "integrity": "sha512-Q8IIqGIHfwKr8ecVZyYh6NtXFmKw4YSEWEr2GJTB/fTZXgaOGtGFZDWOesCZllQ63f1s/oWJYtVv5RAEuwN8BQ==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-12.0.1.tgz",
+      "integrity": "sha512-1lKyRCq4ahJrY+Xxo8LsqCbALeJkodtEfpmYHeA5HpPMnK7lRSplLqOLcTCjoPfd4vO+gl6aDEZN+ow3YGQBOg==",
       "dev": true,
       "requires": {
-        "@commitlint/is-ignored": "^11.0.0",
-        "@commitlint/parse": "^11.0.0",
-        "@commitlint/rules": "^11.0.0",
-        "@commitlint/types": "^11.0.0"
+        "@commitlint/is-ignored": "^12.0.1",
+        "@commitlint/parse": "^12.0.1",
+        "@commitlint/rules": "^12.0.1",
+        "@commitlint/types": "^12.0.1"
       },
       "dependencies": {
         "@commitlint/types": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
-          "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
-          "dev": true
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
         }
       }
     },
@@ -1923,58 +1635,80 @@
       }
     },
     "@commitlint/message": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-11.0.0.tgz",
-      "integrity": "sha512-01ObK/18JL7PEIE3dBRtoMmU6S3ecPYDTQWWhcO+ErA3Ai0KDYqV5VWWEijdcVafNpdeUNrEMigRkxXHQLbyJA==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-12.0.1.tgz",
+      "integrity": "sha512-fXuoxRC+NT1wEQi6p8oHfT7wvWIRgTk+udlRJnWTjmMpiYzVnMmmZfasdShirWr4TtxQtMyL+5DVgh7Y98kURw==",
       "dev": true
     },
     "@commitlint/parse": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-11.0.0.tgz",
-      "integrity": "sha512-DekKQAIYWAXIcyAZ6/PDBJylWJ1BROTfDIzr9PMVxZRxBPc1gW2TG8fLgjZfBP5mc0cuthPkVi91KQQKGri/7A==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-12.0.1.tgz",
+      "integrity": "sha512-7oEGASmzBnHir5jSIR7KephXrKh7rIi9a6RpH1tOT+CIENYvhe8EDtIy29qMt+RLa2LlaPF7YrAgaJRfzG0YDQ==",
       "dev": true,
       "requires": {
-        "conventional-changelog-angular": "^5.0.0",
+        "@commitlint/types": "^12.0.1",
+        "conventional-changelog-angular": "^5.0.11",
         "conventional-commits-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "@commitlint/types": {
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
+        }
       }
     },
     "@commitlint/read": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-11.0.0.tgz",
-      "integrity": "sha512-37V0V91GSv0aDzMzJioKpCoZw6l0shk7+tRG8RkW1GfZzUIytdg3XqJmM+IaIYpaop0m6BbZtfq+idzUwJnw7g==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-12.0.1.tgz",
+      "integrity": "sha512-baa0YeD4QOctEuthLpExQSi9xPiw0kDPfUVHqp8I88iuIXJECeS8S1+1GBiz89e8dLN9zmEE+sN9vtJHdAp9YA==",
       "dev": true,
       "requires": {
-        "@commitlint/top-level": "^11.0.0",
+        "@commitlint/top-level": "^12.0.1",
+        "@commitlint/types": "^12.0.1",
         "fs-extra": "^9.0.0",
         "git-raw-commits": "^2.0.0"
       },
       "dependencies": {
+        "@commitlint/types": {
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
+        },
         "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
           "dev": true,
           "requires": {
             "at-least-node": "^1.0.0",
             "graceful-fs": "^4.2.0",
             "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
         "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
         "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
           "dev": true
         }
       }
@@ -2029,35 +1763,38 @@
       }
     },
     "@commitlint/rules": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-11.0.0.tgz",
-      "integrity": "sha512-2hD9y9Ep5ZfoNxDDPkQadd2jJeocrwC4vJ98I0g8pNYn/W8hS9+/FuNpolREHN8PhmexXbkjrwyQrWbuC0DVaA==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-12.0.1.tgz",
+      "integrity": "sha512-A5O0ubNGugZR9WWxk5IVOLo07lpdUwhG5WkAW2lYpgZ7Z/2U4PLob9b4Ih1eHbQu+gnVeFr91k7F0DrpM7B8EQ==",
       "dev": true,
       "requires": {
-        "@commitlint/ensure": "^11.0.0",
-        "@commitlint/message": "^11.0.0",
-        "@commitlint/to-lines": "^11.0.0",
-        "@commitlint/types": "^11.0.0"
+        "@commitlint/ensure": "^12.0.1",
+        "@commitlint/message": "^12.0.1",
+        "@commitlint/to-lines": "^12.0.1",
+        "@commitlint/types": "^12.0.1"
       },
       "dependencies": {
         "@commitlint/types": {
-          "version": "11.0.0",
-          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-11.0.0.tgz",
-          "integrity": "sha512-VoNqai1vR5anRF5Tuh/+SWDFk7xi7oMwHrHrbm1BprYXjB2RJsWLhUrStMssDxEl5lW/z3EUdg8RvH/IUBccSQ==",
-          "dev": true
+          "version": "12.0.1",
+          "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-12.0.1.tgz",
+          "integrity": "sha512-FsNDMV0W7D19/ZbR412klpqAilXASx75Neqh7jPtK278IEwdukOg3vth1r5kTm+BjDScM7wMUEOwIW3NNfAtwg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^4.0.0"
+          }
         }
       }
     },
     "@commitlint/to-lines": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-11.0.0.tgz",
-      "integrity": "sha512-TIDTB0Y23jlCNubDROUVokbJk6860idYB5cZkLWcRS9tlb6YSoeLn1NLafPlrhhkkkZzTYnlKYzCVrBNVes1iw==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-12.0.1.tgz",
+      "integrity": "sha512-XwcJ1jY7x2fhudzbGMpNQkTSMVrxWrI8bRMbVe3Abuu7RfYpFf7VXAlhtnLfxBoagaK7RxjC2+eRidp/3txQBg==",
       "dev": true
     },
     "@commitlint/top-level": {
-      "version": "11.0.0",
-      "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-11.0.0.tgz",
-      "integrity": "sha512-O0nFU8o+Ws+py5pfMQIuyxOtfR/kwtr5ybqTvR+C2lUPer2x6lnQU+OnfD7hPM+A+COIUZWx10mYQvkR3MmtAA==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-12.0.1.tgz",
+      "integrity": "sha512-rHdgt7U24GEau2/9i2vEAbksxkBRiVjHj5ECFL5dd0AJOIvaK++vMg4EF/ME0X/1yd9qVTHTNOl2Q4tTFK7VBQ==",
       "dev": true,
       "requires": {
         "find-up": "^5.0.0"
@@ -2083,12 +1820,12 @@
           }
         },
         "p-limit": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
-          "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+          "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
           "dev": true,
           "requires": {
-            "p-try": "^2.0.0"
+            "yocto-queue": "^0.1.0"
           }
         },
         "p-locate": {
@@ -2116,9 +1853,9 @@
       "dev": true
     },
     "@eslint/eslintrc": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
-      "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.0.tgz",
+      "integrity": "sha512-2ZPCc+uNbjV5ERJr+aKSPRwZgKd2z11x0EgLvb1PURmUrn9QNRXFqje0Ldq454PfAVyaJYyrDvvIKSFP4NnBog==",
       "dev": true,
       "requires": {
         "ajv": "^6.12.4",
@@ -2128,7 +1865,6 @@
         "ignore": "^4.0.6",
         "import-fresh": "^3.2.1",
         "js-yaml": "^3.13.1",
-        "lodash": "^4.17.19",
         "minimatch": "^3.0.4",
         "strip-json-comments": "^3.1.1"
       },
@@ -2149,9 +1885,9 @@
           "dev": true
         },
         "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
           "dev": true,
           "requires": {
             "parent-module": "^1.0.0",
@@ -2179,13 +1915,22 @@
       }
     },
     "@fullhuman/postcss-purgecss": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz",
-      "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==",
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-3.1.3.tgz",
+      "integrity": "sha512-kwOXw8fZ0Lt1QmeOOrd+o4Ibvp4UTEBFQbzvWldjlKv5n+G9sXfIPn1hh63IQIL8K8vbvv1oYMJiIUbuy9bGaA==",
+      "dev": true,
+      "requires": {
+        "purgecss": "^3.1.3"
+      }
+    },
+    "@mrmlnc/readdir-enhanced": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
+      "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
       "dev": true,
       "requires": {
-        "postcss": "7.0.32",
-        "purgecss": "^2.3.0"
+        "call-me-maybe": "^1.0.1",
+        "glob-to-regexp": "^0.3.0"
       }
     },
     "@nodelib/fs.scandir": {
@@ -2215,35 +1960,36 @@
       }
     },
     "@octokit/auth-token": {
-      "version": "2.4.2",
-      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.2.tgz",
-      "integrity": "sha512-jE/lE/IKIz2v1+/P0u4fJqv0kYwXOTujKemJMFr6FeopsxlIK3+wKDCJGnysg81XID5TgZQbIfuJ5J0lnTiuyQ==",
+      "version": "2.4.5",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.5.tgz",
+      "integrity": "sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA==",
       "dev": true,
       "requires": {
-        "@octokit/types": "^5.0.0"
+        "@octokit/types": "^6.0.3"
       }
     },
     "@octokit/core": {
-      "version": "2.5.4",
-      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-2.5.4.tgz",
-      "integrity": "sha512-HCp8yKQfTITYK+Nd09MHzAlP1v3Ii/oCohv0/TW9rhSLvzb98BOVs2QmVYuloE6a3l6LsfyGIwb6Pc4ycgWlIQ==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.3.1.tgz",
+      "integrity": "sha512-Dc5NNQOYjgZU5S1goN6A/E500yXOfDUFRGQB8/2Tl16AcfvS3H9PudyOe3ZNE/MaVyHPIfC0htReHMJb1tMrvw==",
       "dev": true,
       "requires": {
-        "@octokit/auth-token": "^2.4.0",
-        "@octokit/graphql": "^4.3.1",
-        "@octokit/request": "^5.4.0",
-        "@octokit/types": "^5.0.0",
-        "before-after-hook": "^2.1.0",
-        "universal-user-agent": "^5.0.0"
+        "@octokit/auth-token": "^2.4.4",
+        "@octokit/graphql": "^4.5.8",
+        "@octokit/request": "^5.4.12",
+        "@octokit/request-error": "^2.0.5",
+        "@octokit/types": "^6.0.3",
+        "before-after-hook": "^2.2.0",
+        "universal-user-agent": "^6.0.0"
       }
     },
     "@octokit/endpoint": {
-      "version": "6.0.8",
-      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.8.tgz",
-      "integrity": "sha512-MuRrgv+bM4Q+e9uEvxAB/Kf+Sj0O2JAOBA131uo1o6lgdq1iS8ejKwtqHgdfY91V3rN9R/hdGKFiQYMzVzVBEQ==",
+      "version": "6.0.11",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.11.tgz",
+      "integrity": "sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ==",
       "dev": true,
       "requires": {
-        "@octokit/types": "^5.0.0",
+        "@octokit/types": "^6.0.3",
         "is-plain-object": "^5.0.0",
         "universal-user-agent": "^6.0.0"
       },
@@ -2253,79 +1999,60 @@
           "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
           "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
           "dev": true
-        },
-        "universal-user-agent": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
-          "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
-          "dev": true
         }
       }
     },
     "@octokit/graphql": {
-      "version": "4.5.6",
-      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.6.tgz",
-      "integrity": "sha512-Rry+unqKTa3svswT2ZAuqenpLrzJd+JTv89LTeVa5UM/5OX8o4KTkPL7/1ABq4f/ZkELb0XEK/2IEoYwykcLXg==",
+      "version": "4.6.1",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.6.1.tgz",
+      "integrity": "sha512-2lYlvf4YTDgZCTXTW4+OX+9WTLFtEUc6hGm4qM1nlZjzxj+arizM4aHWzBVBCxY9glh7GIs0WEuiSgbVzv8cmA==",
       "dev": true,
       "requires": {
         "@octokit/request": "^5.3.0",
-        "@octokit/types": "^5.0.0",
+        "@octokit/types": "^6.0.3",
         "universal-user-agent": "^6.0.0"
-      },
-      "dependencies": {
-        "universal-user-agent": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
-          "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
-          "dev": true
-        }
       }
     },
+    "@octokit/openapi-types": {
+      "version": "5.3.2",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-5.3.2.tgz",
+      "integrity": "sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA==",
+      "dev": true
+    },
     "@octokit/plugin-paginate-rest": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.4.0.tgz",
-      "integrity": "sha512-YT6Klz3LLH6/nNgi0pheJnUmTFW4kVnxGft+v8Itc41IIcjl7y1C8TatmKQBbCSuTSNFXO5pCENnqg6sjwpJhg==",
+      "version": "2.13.3",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz",
+      "integrity": "sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg==",
       "dev": true,
       "requires": {
-        "@octokit/types": "^5.5.0"
+        "@octokit/types": "^6.11.0"
       }
     },
     "@octokit/plugin-request-log": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz",
-      "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz",
+      "integrity": "sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ==",
       "dev": true
     },
     "@octokit/plugin-rest-endpoint-methods": {
-      "version": "3.17.0",
-      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-3.17.0.tgz",
-      "integrity": "sha512-NFV3vq7GgoO2TrkyBRUOwflkfTYkFKS0tLAPym7RNpkwLCttqShaEGjthOsPEEL+7LFcYv3mU24+F2yVd3npmg==",
+      "version": "4.13.5",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.13.5.tgz",
+      "integrity": "sha512-kYKcWkFm4Ldk8bZai2RVEP1z97k1C/Ay2FN9FNTBg7JIyKoiiJjks4OtT6cuKeZX39tqa+C3J9xeYc6G+6g8uQ==",
       "dev": true,
       "requires": {
-        "@octokit/types": "^4.1.6",
+        "@octokit/types": "^6.12.2",
         "deprecation": "^2.3.1"
-      },
-      "dependencies": {
-        "@octokit/types": {
-          "version": "4.1.10",
-          "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.1.10.tgz",
-          "integrity": "sha512-/wbFy1cUIE5eICcg0wTKGXMlKSbaAxEr00qaBXzscLXpqhcwgXeS6P8O0pkysBhRfyjkKjJaYrvR1ExMO5eOXQ==",
-          "dev": true,
-          "requires": {
-            "@types/node": ">= 8"
-          }
-        }
       }
     },
     "@octokit/request": {
-      "version": "5.4.9",
-      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.9.tgz",
-      "integrity": "sha512-CzwVvRyimIM1h2n9pLVYfTDmX9m+KHSgCpqPsY8F1NdEK8IaWqXhSBXsdjOBFZSpEcxNEeg4p0UO9cQ8EnOCLA==",
+      "version": "5.4.14",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.14.tgz",
+      "integrity": "sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA==",
       "dev": true,
       "requires": {
         "@octokit/endpoint": "^6.0.1",
         "@octokit/request-error": "^2.0.0",
-        "@octokit/types": "^5.0.0",
+        "@octokit/types": "^6.7.1",
         "deprecation": "^2.0.0",
         "is-plain-object": "^5.0.0",
         "node-fetch": "^2.6.1",
@@ -2338,56 +2065,50 @@
           "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
           "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
           "dev": true
-        },
-        "universal-user-agent": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
-          "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
-          "dev": true
         }
       }
     },
     "@octokit/request-error": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.2.tgz",
-      "integrity": "sha512-2BrmnvVSV1MXQvEkrb9zwzP0wXFNbPJij922kYBTLIlIafukrGOb+ABBT2+c6wZiuyWDH1K1zmjGQ0toN/wMWw==",
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.5.tgz",
+      "integrity": "sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg==",
       "dev": true,
       "requires": {
-        "@octokit/types": "^5.0.1",
+        "@octokit/types": "^6.0.3",
         "deprecation": "^2.0.0",
         "once": "^1.4.0"
       }
     },
     "@octokit/rest": {
-      "version": "17.11.2",
-      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-17.11.2.tgz",
-      "integrity": "sha512-4jTmn8WossTUaLfNDfXk4fVJgbz5JgZE8eCs4BvIb52lvIH8rpVMD1fgRCrHbSd6LRPE5JFZSfAEtszrOq3ZFQ==",
+      "version": "18.3.5",
+      "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.3.5.tgz",
+      "integrity": "sha512-ZPeRms3WhWxQBEvoIh0zzf8xdU2FX0Capa7+lTca8YHmRsO3QNJzf1H3PcuKKsfgp91/xVDRtX91sTe1kexlbw==",
       "dev": true,
       "requires": {
-        "@octokit/core": "^2.4.3",
-        "@octokit/plugin-paginate-rest": "^2.2.0",
-        "@octokit/plugin-request-log": "^1.0.0",
-        "@octokit/plugin-rest-endpoint-methods": "3.17.0"
+        "@octokit/core": "^3.2.3",
+        "@octokit/plugin-paginate-rest": "^2.6.2",
+        "@octokit/plugin-request-log": "^1.0.2",
+        "@octokit/plugin-rest-endpoint-methods": "4.13.5"
       }
     },
     "@octokit/types": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-5.5.0.tgz",
-      "integrity": "sha512-UZ1pErDue6bZNjYOotCNveTXArOMZQFG6hKJfOnGnulVCMcVVi7YIIuuR4WfBhjo7zgpmzn/BkPDnUXtNx+PcQ==",
+      "version": "6.12.2",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.12.2.tgz",
+      "integrity": "sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA==",
       "dev": true,
       "requires": {
-        "@types/node": ">= 8"
+        "@octokit/openapi-types": "^5.3.2"
       }
     },
     "@popperjs/core": {
-      "version": "2.5.3",
-      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.5.3.tgz",
-      "integrity": "sha512-RFwCobxsvZ6j7twS7dHIZQZituMIDJJNHS/qY6iuthVebxS3zhRY+jaC2roEKiAYaVuTcGmX6Luc6YBcf6zJVg=="
+      "version": "2.9.1",
+      "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.1.tgz",
+      "integrity": "sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA=="
     },
     "@prettier/plugin-php": {
-      "version": "0.15.1",
-      "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.15.1.tgz",
-      "integrity": "sha512-uQiaGGXCs0uqpck1LyDU+V4Z50Qqml7ltajPQL+DB43r5aHVawDCSkgLGYZJSb1g+hK5eBmdVBqMa7ED8EBjbA==",
+      "version": "0.16.2",
+      "resolved": "https://registry.npmjs.org/@prettier/plugin-php/-/plugin-php-0.16.2.tgz",
+      "integrity": "sha512-0pqK5hIDTSy07O55sJu86sxqfLHlzoDYn64GyNVhft9unc/7UCQui/s2gpTTwfTpU26YHUDEqL8CT8p5Rl3s6Q==",
       "dev": true,
       "requires": {
         "linguist-languages": "^7.5.1",
@@ -2396,9 +2117,9 @@
       }
     },
     "@rollup/plugin-babel": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.2.1.tgz",
-      "integrity": "sha512-Jd7oqFR2dzZJ3NWANDyBjwTtX/lYbZpVcmkHrfQcpvawHs9E4c0nYk5U2mfZ6I/DZcIvy506KZJi54XK/jxH7A==",
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
+      "integrity": "sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==",
       "dev": true,
       "requires": {
         "@babel/helper-module-imports": "^7.10.4",
@@ -2406,9 +2127,9 @@
       }
     },
     "@rollup/plugin-commonjs": {
-      "version": "15.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-15.1.0.tgz",
-      "integrity": "sha512-xCQqz4z/o0h2syQ7d9LskIMvBSH4PX5PjYdpSSvgS+pQik3WahkQVNWg3D8XJeYjZoVWnIUQYDghuEMRGrmQYQ==",
+      "version": "17.1.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-17.1.0.tgz",
+      "integrity": "sha512-PoMdXCw0ZyvjpCMT5aV4nkL0QywxP29sODQsSGeDpr/oI49Qq9tRtAsb/LbYbDzFlOydVEqHmmZWFtXJEAX9ew==",
       "dev": true,
       "requires": {
         "@rollup/pluginutils": "^3.1.0",
@@ -2421,9 +2142,9 @@
       },
       "dependencies": {
         "estree-walker": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.1.tgz",
-          "integrity": "sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg==",
+          "version": "2.0.2",
+          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+          "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
           "dev": true
         }
       }
@@ -2448,9 +2169,9 @@
       }
     },
     "@rollup/plugin-node-resolve": {
-      "version": "9.0.0",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-9.0.0.tgz",
-      "integrity": "sha512-gPz+utFHLRrd41WMP13Jq5mqqzHL3OXrfj3/MkSyB6UBIcuNt9j60GCbarzMzdf1VHFpOxfQh/ez7wyadLMqkg==",
+      "version": "11.2.0",
+      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.0.tgz",
+      "integrity": "sha512-qHjNIKYt5pCcn+5RUBQxK8krhRvf1HnyVgUCcFFcweDS7fhkOLZeYh0mhHK6Ery8/bb9tvN/ubPzmfF0qjDCTA==",
       "dev": true,
       "requires": {
         "@rollup/pluginutils": "^3.1.0",
@@ -2458,7 +2179,19 @@
         "builtin-modules": "^3.1.0",
         "deepmerge": "^4.2.2",
         "is-module": "^1.0.0",
-        "resolve": "^1.17.0"
+        "resolve": "^1.19.0"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.20.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+          "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+          "dev": true,
+          "requires": {
+            "is-core-module": "^2.2.0",
+            "path-parse": "^1.0.6"
+          }
+        }
       }
     },
     "@rollup/plugin-virtual": {
@@ -2553,15 +2286,6 @@
             "to-regex-range": "^5.0.1"
           }
         },
-        "import-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
-          "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
-          "dev": true,
-          "requires": {
-            "resolve-from": "^5.0.0"
-          }
-        },
         "is-number": {
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -2578,12 +2302,6 @@
             "picomatch": "^2.0.5"
           }
         },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        },
         "to-regex-range": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2691,12 +2409,12 @@
       }
     },
     "@semantic-release/github": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.1.1.tgz",
-      "integrity": "sha512-w8CLCvGVKNe2FPOYQ68OFxFVNNha7YRzptnwTZYdjXYtgTDKw0XVfnMSd9NlJeQPYGfQmIhIVPNBU/cA6zUY0A==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/@semantic-release/github/-/github-7.2.0.tgz",
+      "integrity": "sha512-tMRnWiiWb43whRHvbDGXq4DGEbKRi56glDpXDJZit4PIiwDPX7Kx3QzmwRtDOcG+8lcpGjpdPabYZ9NBxoI2mw==",
       "dev": true,
       "requires": {
-        "@octokit/rest": "^17.0.0",
+        "@octokit/rest": "^18.0.0",
         "@semantic-release/error": "^2.2.0",
         "aggregate-error": "^3.0.0",
         "bottleneck": "^2.18.1",
@@ -2715,39 +2433,39 @@
       },
       "dependencies": {
         "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
           "dev": true,
           "requires": {
             "at-least-node": "^1.0.0",
             "graceful-fs": "^4.2.0",
             "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
         "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
         "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
           "dev": true
         }
       }
     },
     "@semantic-release/gitlab": {
-      "version": "6.0.5",
-      "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-6.0.5.tgz",
-      "integrity": "sha512-fPOldehLPolClGrE1am0PMa1gqOPe+wVeTwCvbr4z27fZkDLhRTbKYfEyhqzGL4cm+fVhqI5dyvzHpqBXTAZUw==",
+      "version": "6.0.9",
+      "resolved": "https://registry.npmjs.org/@semantic-release/gitlab/-/gitlab-6.0.9.tgz",
+      "integrity": "sha512-PUdtYksSZvSm11T3kenyxSJkJttvumnSlrK0NGFH0ERfPeDV1VlUOoNxjOQ/cUsOM6yyY3aZ//khNe0FpGAZ2Q==",
       "dev": true,
       "requires": {
         "@semantic-release/error": "^2.2.0",
@@ -2771,102 +2489,149 @@
           "dev": true
         },
         "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
           "dev": true,
           "requires": {
             "at-least-node": "^1.0.0",
             "graceful-fs": "^4.2.0",
             "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
         "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
         "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
           "dev": true
         }
       }
     },
     "@semantic-release/npm": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.6.tgz",
-      "integrity": "sha512-F4judxdeLe8f7+vDva1TkqNc5Tb2tcltZYW0tLtvP2Xt7CD/gGiz7UxAWEOPsXBvIqAP+uTidvGLPl9U3/uRoQ==",
+      "version": "7.0.10",
+      "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-7.0.10.tgz",
+      "integrity": "sha512-DXFEhgSt5u22imTWbw8wfcVGB90nFJNcjUBtJI3zswJojzZ7yXpY4i2Va5RBRQRTtj00BfG0stbilAtKrKp35g==",
       "dev": true,
       "requires": {
         "@semantic-release/error": "^2.2.0",
         "aggregate-error": "^3.0.0",
-        "execa": "^4.0.0",
+        "execa": "^5.0.0",
         "fs-extra": "^9.0.0",
         "lodash": "^4.17.15",
         "nerf-dart": "^1.0.0",
         "normalize-url": "^5.0.0",
-        "npm": "^6.13.0",
+        "npm": "^6.14.9",
         "rc": "^1.2.8",
         "read-pkg": "^5.0.0",
         "registry-auth-token": "^4.0.0",
         "semver": "^7.1.2",
-        "tempy": "^0.5.0"
+        "tempy": "^1.0.0"
       },
       "dependencies": {
+        "execa": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+          "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+          "dev": true,
+          "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"
+          }
+        },
         "fs-extra": {
-          "version": "9.0.1",
-          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-          "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
           "dev": true,
           "requires": {
             "at-least-node": "^1.0.0",
             "graceful-fs": "^4.2.0",
             "jsonfile": "^6.0.1",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
+        "get-stream": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+          "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+          "dev": true
+        },
+        "human-signals": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+          "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+          "dev": true
+        },
         "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
+            "universalify": "^2.0.0"
           }
         },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
         "normalize-url": {
           "version": "5.3.0",
           "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-5.3.0.tgz",
           "integrity": "sha512-9/nOVLYYe/dO/eJeQUNaGUF4m4Z5E7cb9oNTKabH+bNf19mqj60txTcveQxL0GlcWLXCxkOu2/LwL8oW0idIDA==",
           "dev": true
         },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
         "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
         },
         "universalify": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-          "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
           "dev": true
         }
       }
     },
     "@semantic-release/release-notes-generator": {
-      "version": "9.0.1",
-      "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.1.tgz",
-      "integrity": "sha512-bOoTiH6SiiR0x2uywSNR7uZcRDl22IpZhj+Q5Bn0v+98MFtOMhCxFhbrKQjhbYoZw7vps1mvMRmFkp/g6R9cvQ==",
+      "version": "9.0.2",
+      "resolved": "https://registry.npmjs.org/@semantic-release/release-notes-generator/-/release-notes-generator-9.0.2.tgz",
+      "integrity": "sha512-xGFSidhGqB27uwgWCU6y0gbf4r/no5flOAkJyFFc4+bPf8S+LfAVm7xhhlK5VPXLt2Iu1RBH8F+IgMK2ah5YpA==",
       "dev": true,
       "requires": {
         "conventional-changelog-angular": "^5.0.0",
@@ -2876,26 +2641,9 @@
         "debug": "^4.0.0",
         "get-stream": "^5.0.0",
         "import-from": "^3.0.0",
-        "into-stream": "^5.0.0",
+        "into-stream": "^6.0.0",
         "lodash": "^4.17.4",
         "read-pkg-up": "^7.0.0"
-      },
-      "dependencies": {
-        "import-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
-          "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
-          "dev": true,
-          "requires": {
-            "resolve-from": "^5.0.0"
-          }
-        },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        }
       }
     },
     "@sindresorhus/is": {
@@ -2914,13 +2662,13 @@
       }
     },
     "@stylelint/postcss-markdown": {
-      "version": "0.36.1",
-      "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.1.tgz",
-      "integrity": "sha512-iDxMBWk9nB2BPi1VFQ+Dc5+XpvODBHw2n3tYpaBZuEAFQlbtF9If0Qh5LTTwSi/XwdbJ2jt+0dis3i8omyggpw==",
+      "version": "0.36.2",
+      "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz",
+      "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==",
       "dev": true,
       "requires": {
-        "remark": "^12.0.0",
-        "unist-util-find-all-after": "^3.0.1"
+        "remark": "^13.0.0",
+        "unist-util-find-all-after": "^3.0.2"
       }
     },
     "@szmarczak/http-timer": {
@@ -2932,29 +2680,45 @@
         "defer-to-connect": "^2.0.0"
       }
     },
-    "@tailwindcss/custom-forms": {
+    "@tailwindcss/forms": {
       "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/custom-forms/-/custom-forms-0.2.1.tgz",
-      "integrity": "sha512-XdP5XY6kxo3x5o50mWUyoYWxOPV16baagLoZ5uM41gh6IhXzhz/vJYzqrTb/lN58maGIKlpkxgVsQUNSsbAS3Q==",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.2.1.tgz",
+      "integrity": "sha512-czfvEdY+J2Ogfd6RUSr/ZSUmDxTujr34M++YLnp2cCPC3oJ4kFvFMaRXA6cEXKw7F1hJuapdjXRjsXIEXGgORg==",
       "dev": true,
       "requires": {
-        "lodash": "^4.17.11",
-        "mini-svg-data-uri": "^1.0.3",
-        "traverse": "^0.6.6"
+        "mini-svg-data-uri": "^1.2.3"
       }
     },
-    "@tailwindcss/typography": {
+    "@tailwindcss/line-clamp": {
       "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.2.0.tgz",
-      "integrity": "sha512-aPgMH+CjQiScLZculoDNOQUrrK2ktkbl3D6uCLYp1jgYRlNDrMONu9nMu8LfwAeetYNpVNeIGx7WzHSu0kvECg==",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.2.0.tgz",
+      "integrity": "sha512-+jXSdRK3/9V/BCPCr+iNpMMhxWMMv62vn/AS2b3/ClmueGuhCijW3bUwO1IiHnE7uCaF74Sli8jUCv9djwvpLg==",
       "dev": true
     },
+    "@tailwindcss/typography": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.0.tgz",
+      "integrity": "sha512-3BfOYT5MYNEq81Ism3L2qu/HRP2Q5vWqZtZRQqQrthHuaTK9qpuPfbMT5WATjAM5J1OePKBaI5pLoX4S1JGNMQ==",
+      "dev": true,
+      "requires": {
+        "lodash.castarray": "^4.4.0",
+        "lodash.isplainobject": "^4.0.6",
+        "lodash.merge": "^4.6.2",
+        "lodash.uniq": "^4.5.0"
+      }
+    },
     "@tootallnate/once": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
       "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
       "dev": true
     },
+    "@trysound/sax": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.1.1.tgz",
+      "integrity": "sha512-Z6DoceYb/1xSg5+e+ZlPZ9v0N16ZvZ+wYMraFue4HYrE4ttONKtsvruIRf6t9TBR0YvSOfi1hUU0fJfBLCDYow==",
+      "dev": true
+    },
     "@types/cacheable-request": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz",
@@ -2979,6 +2743,22 @@
       "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
       "dev": true
     },
+    "@types/glob": {
+      "version": "7.1.3",
+      "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
+      "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
+      "dev": true,
+      "requires": {
+        "@types/minimatch": "*",
+        "@types/node": "*"
+      }
+    },
+    "@types/highlight.js": {
+      "version": "9.12.4",
+      "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.4.tgz",
+      "integrity": "sha512-t2szdkwmg2JJyuCM20e8kR2X59WCE5Zkl4bzm1u1Oukjm79zpbiAv+QjnwLnuuV0WHEcX2NgUItu0pAMKuOPww==",
+      "dev": true
+    },
     "@types/http-cache-semantics": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz",
@@ -2986,9 +2766,9 @@
       "dev": true
     },
     "@types/json-schema": {
-      "version": "7.0.6",
-      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
-      "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+      "version": "7.0.7",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
+      "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
       "dev": true
     },
     "@types/keyv": {
@@ -3001,31 +2781,47 @@
       }
     },
     "@types/linkify-it": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-2.1.0.tgz",
-      "integrity": "sha512-Q7DYAOi9O/+cLLhdaSvKdaumWyHbm7HAk/bFwwyTuU0arR5yyCeW5GOoqt4tJTpDRxhpx9Q8kQL6vMpuw9hDSw==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.0.tgz",
+      "integrity": "sha512-x9OaQQTb1N2hPZ/LWJsqushexDvz7NgzuZxiRmZio44WPuolTZNHDBCrOxCzRVOMwamJRO2dWax5NbygOf1OTQ==",
       "dev": true
     },
     "@types/markdown-it": {
-      "version": "10.0.1",
-      "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-10.0.1.tgz",
-      "integrity": "sha512-L1ibTdA5IUe/cRBlf3N3syAOBQSN1WCMGtAWir6mKxibiRl4LmpZM4jLz+7zAqiMnhQuAP1sqZOF9wXgn2kpEg==",
+      "version": "12.0.1",
+      "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.0.1.tgz",
+      "integrity": "sha512-mHfT8j/XkPb1uLEfs0/C3se6nd+webC2kcqcy8tgcVr0GDEONv/xaQzAN+aQvkxQXk/jC0Q6mPS+0xhFwRF35g==",
       "dev": true,
       "requires": {
+        "@types/highlight.js": "^9.7.0",
         "@types/linkify-it": "*",
         "@types/mdurl": "*"
       }
     },
+    "@types/mdast": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz",
+      "integrity": "sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw==",
+      "dev": true,
+      "requires": {
+        "@types/unist": "*"
+      }
+    },
     "@types/mdurl": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz",
       "integrity": "sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==",
       "dev": true
     },
+    "@types/minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==",
+      "dev": true
+    },
     "@types/minimist": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz",
-      "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.1.tgz",
+      "integrity": "sha512-fZQQafSREFyuZcdWFAExYjBiCL7AUCdgsk80iO0q4yihYYdcIiH28CcuPTGFgLOCC8RlW49GSQxdHwZP+I7CNg==",
       "dev": true
     },
     "@types/node": {
@@ -3053,9 +2849,9 @@
       "dev": true
     },
     "@types/prosemirror-markdown": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/@types/prosemirror-markdown/-/prosemirror-markdown-1.0.3.tgz",
-      "integrity": "sha512-kM5W28WKfzuZrGa9Z4hS+MtHI1WViQyJejIA7di37BwEKhw1nlD03fGaToPQU2fZXR+vVsKyG0WHHN8eX3J8DQ==",
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/@types/prosemirror-markdown/-/prosemirror-markdown-1.5.1.tgz",
+      "integrity": "sha512-AqHCy80J9HUF+9FHveOB9fbKZwOf+1Ds2Vm1pPN6bfZ/Y6vdgXDry/hoz74+K7fQZZ8+f1J4x16llFj3PAohVg==",
       "dev": true,
       "requires": {
         "@types/markdown-it": "*",
@@ -3063,18 +2859,18 @@
       }
     },
     "@types/prosemirror-model": {
-      "version": "1.7.2",
-      "resolved": "https://registry.npmjs.org/@types/prosemirror-model/-/prosemirror-model-1.7.2.tgz",
-      "integrity": "sha512-2l+yXvidg3AUHN07mO4Jd8Q84fo6ksFsy7LHUurLYrZ74uTahBp2fzcO49AKZMzww2EulXJ40Kl/OFaQ/7A1fw==",
+      "version": "1.11.2",
+      "resolved": "https://registry.npmjs.org/@types/prosemirror-model/-/prosemirror-model-1.11.2.tgz",
+      "integrity": "sha512-mohs15V+gxj10QWJGVooErzSE9ryTo1Wy92lULiQ0BSN5Po9K4vngPzfKmLft0+gAPbEghovTX+I2zQW3bZo1w==",
       "dev": true,
       "requires": {
         "@types/orderedmap": "*"
       }
     },
     "@types/prosemirror-state": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/@types/prosemirror-state/-/prosemirror-state-1.2.5.tgz",
-      "integrity": "sha512-a5DxAifiF6vmdSJ5jsDMkpykUgUJUy+T5Q5hCjFOKJ4cfd3m3q1lsFKr7Bc4r91Qb7rfqyiKCMDnASS8LIHrKw==",
+      "version": "1.2.6",
+      "resolved": "https://registry.npmjs.org/@types/prosemirror-state/-/prosemirror-state-1.2.6.tgz",
+      "integrity": "sha512-tJo0wC+/cQvbrPDVx01Fnng9Fs41bAMVxgJY1KLOyIsUPN0otUN1KdoQurLMmHNHTvIna9ZXxjZD//xJKLYfJw==",
       "dev": true,
       "requires": {
         "@types/prosemirror-model": "*",
@@ -3083,18 +2879,18 @@
       }
     },
     "@types/prosemirror-transform": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/@types/prosemirror-transform/-/prosemirror-transform-1.1.1.tgz",
-      "integrity": "sha512-yYCYSoiRH+Wcbl8GJc0PFCzeyMzNQ1vL2xrHHSXZuNcIlH75VoiKrZFeZ6BS9cl8mYXjZrlmdBe8YOxYvyKM6A==",
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@types/prosemirror-transform/-/prosemirror-transform-1.1.2.tgz",
+      "integrity": "sha512-Ozyvs5Dquc49gaFysmC4gNhv6E65r569HSzw4RXdZgIljZ5Y9K4kHFlDvsWBBDH19+1178X9LMmM9J620O6Bug==",
       "dev": true,
       "requires": {
         "@types/prosemirror-model": "*"
       }
     },
     "@types/prosemirror-view": {
-      "version": "1.16.1",
-      "resolved": "https://registry.npmjs.org/@types/prosemirror-view/-/prosemirror-view-1.16.1.tgz",
-      "integrity": "sha512-vsL7QB9Qmg9HcBTWsOkmBEGMF0CfA/SZgtqlUArQglnDWV40ZJYonkjBzyP+YhurMC/s4JT4T2vzfnv7rFF/cg==",
+      "version": "1.17.1",
+      "resolved": "https://registry.npmjs.org/@types/prosemirror-view/-/prosemirror-view-1.17.1.tgz",
+      "integrity": "sha512-PNiGGc6BffxHQzMR09UUilsBR8xFPDsKiPIXb4K/g56voPIvqq1pqySnWFfSR50Vo4ZL0tss3VBLWiiiKzVahQ==",
       "dev": true,
       "requires": {
         "@types/prosemirror-model": "*",
@@ -3139,101 +2935,107 @@
       "dev": true
     },
     "@typescript-eslint/eslint-plugin": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.5.0.tgz",
-      "integrity": "sha512-mjb/gwNcmDKNt+6mb7Aj/TjKzIJjOPcoCJpjBQC9ZnTRnBt1p4q5dJSSmIqAtsZ/Pff5N+hJlbiPc5bl6QN4OQ==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz",
+      "integrity": "sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/experimental-utils": "4.5.0",
-        "@typescript-eslint/scope-manager": "4.5.0",
+        "@typescript-eslint/experimental-utils": "4.19.0",
+        "@typescript-eslint/scope-manager": "4.19.0",
         "debug": "^4.1.1",
         "functional-red-black-tree": "^1.0.1",
+        "lodash": "^4.17.15",
         "regexpp": "^3.0.0",
         "semver": "^7.3.2",
         "tsutils": "^3.17.1"
       },
       "dependencies": {
         "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
         }
       }
     },
     "@typescript-eslint/experimental-utils": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.5.0.tgz",
-      "integrity": "sha512-bW9IpSAKYvkqDGRZzayBXIgPsj2xmmVHLJ+flGSoN0fF98pGoKFhbunIol0VF2Crka7z984EEhFi623Rl7e6gg==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz",
+      "integrity": "sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA==",
       "dev": true,
       "requires": {
         "@types/json-schema": "^7.0.3",
-        "@typescript-eslint/scope-manager": "4.5.0",
-        "@typescript-eslint/types": "4.5.0",
-        "@typescript-eslint/typescript-estree": "4.5.0",
+        "@typescript-eslint/scope-manager": "4.19.0",
+        "@typescript-eslint/types": "4.19.0",
+        "@typescript-eslint/typescript-estree": "4.19.0",
         "eslint-scope": "^5.0.0",
         "eslint-utils": "^2.0.0"
       }
     },
     "@typescript-eslint/parser": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.5.0.tgz",
-      "integrity": "sha512-xb+gmyhQcnDWe+5+xxaQk5iCw6KqXd8VQxGiTeELTMoYeRjpocZYYRP1gFVM2C8Yl0SpUvLa1lhprwqZ00w3Iw==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.19.0.tgz",
+      "integrity": "sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/scope-manager": "4.5.0",
-        "@typescript-eslint/types": "4.5.0",
-        "@typescript-eslint/typescript-estree": "4.5.0",
+        "@typescript-eslint/scope-manager": "4.19.0",
+        "@typescript-eslint/types": "4.19.0",
+        "@typescript-eslint/typescript-estree": "4.19.0",
         "debug": "^4.1.1"
       }
     },
     "@typescript-eslint/scope-manager": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.5.0.tgz",
-      "integrity": "sha512-C0cEO0cTMPJ/w4RA/KVe4LFFkkSh9VHoFzKmyaaDWAnPYIEzVCtJ+Un8GZoJhcvq+mPFXEsXa01lcZDHDG6Www==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz",
+      "integrity": "sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "4.5.0",
-        "@typescript-eslint/visitor-keys": "4.5.0"
+        "@typescript-eslint/types": "4.19.0",
+        "@typescript-eslint/visitor-keys": "4.19.0"
       }
     },
     "@typescript-eslint/types": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.5.0.tgz",
-      "integrity": "sha512-n2uQoXnyWNk0Les9MtF0gCK3JiWd987JQi97dMSxBOzVoLZXCNtxFckVqt1h8xuI1ix01t+iMY4h4rFMj/303g==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.19.0.tgz",
+      "integrity": "sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA==",
       "dev": true
     },
     "@typescript-eslint/typescript-estree": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.5.0.tgz",
-      "integrity": "sha512-gN1mffq3zwRAjlYWzb5DanarOPdajQwx5MEWkWCk0XvqC8JpafDTeioDoow2L4CA/RkYZu7xEsGZRhqrTsAG8w==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz",
+      "integrity": "sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "4.5.0",
-        "@typescript-eslint/visitor-keys": "4.5.0",
+        "@typescript-eslint/types": "4.19.0",
+        "@typescript-eslint/visitor-keys": "4.19.0",
         "debug": "^4.1.1",
         "globby": "^11.0.1",
         "is-glob": "^4.0.1",
-        "lodash": "^4.17.15",
         "semver": "^7.3.2",
         "tsutils": "^3.17.1"
       },
       "dependencies": {
         "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
         }
       }
     },
     "@typescript-eslint/visitor-keys": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.5.0.tgz",
-      "integrity": "sha512-UHq4FSa55NDZqscRU//O5ROFhHa9Hqn9KWTEvJGTArtTQp5GKv9Zqf6d/Q3YXXcFv4woyBml7fJQlQ+OuqRcHA==",
+      "version": "4.19.0",
+      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz",
+      "integrity": "sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A==",
       "dev": true,
       "requires": {
-        "@typescript-eslint/types": "4.5.0",
+        "@typescript-eslint/types": "4.19.0",
         "eslint-visitor-keys": "^2.0.0"
       }
     },
@@ -3283,9 +3085,9 @@
       }
     },
     "agent-base": {
-      "version": "6.0.1",
-      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz",
-      "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==",
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+      "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
       "dev": true,
       "requires": {
         "debug": "4"
@@ -3302,9 +3104,9 @@
       }
     },
     "ajv": {
-      "version": "6.12.5",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
-      "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
       "dev": true,
       "requires": {
         "fast-deep-equal": "^3.1.1",
@@ -3441,6 +3243,12 @@
       "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true
     },
+    "array-uniq": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+      "dev": true
+    },
     "array-unique": {
       "version": "0.3.2",
       "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
@@ -3512,9 +3320,9 @@
       "integrity": "sha1-kC0uDWDQcb3NRtwRXhgJ7RHBOKk="
     },
     "astral-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
-      "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+      "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
       "dev": true
     },
     "asynckit": {
@@ -3560,6 +3368,34 @@
             "escape-string-regexp": "^1.0.5",
             "supports-color": "^5.3.0"
           }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          },
+          "dependencies": {
+            "supports-color": {
+              "version": "6.1.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+              "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
@@ -3572,6 +3408,36 @@
         "object.assign": "^4.1.0"
       }
     },
+    "babel-plugin-polyfill-corejs2": {
+      "version": "0.1.10",
+      "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz",
+      "integrity": "sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA==",
+      "dev": true,
+      "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.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz",
+      "integrity": "sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==",
+      "dev": true,
+      "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.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz",
+      "integrity": "sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-define-polyfill-provider": "^0.1.5"
+      }
+    },
     "babel-runtime": {
       "version": "6.26.0",
       "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
@@ -3582,9 +3448,9 @@
       },
       "dependencies": {
         "core-js": {
-          "version": "2.6.11",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
-          "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
+          "version": "2.6.12",
+          "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
         },
         "regenerator-runtime": {
           "version": "0.11.1",
@@ -3665,9 +3531,9 @@
       "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg="
     },
     "before-after-hook": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz",
-      "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.0.tgz",
+      "integrity": "sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ==",
       "dev": true
     },
     "big.js": {
@@ -3763,9 +3629,9 @@
       },
       "dependencies": {
         "base64-js": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-          "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+          "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
         }
       }
     },
@@ -3817,9 +3683,9 @@
       "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
     },
     "builtin-modules": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
-      "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
+      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
       "dev": true
     },
     "bytes": {
@@ -3884,7 +3750,22 @@
       "integrity": "sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ==",
       "dev": true
     },
-    "caller-callsite": {
+    "call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "requires": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      }
+    },
+    "call-me-maybe": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+      "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
+      "dev": true
+    },
+    "caller-callsite": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
       "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
@@ -3959,12 +3840,6 @@
         "redeyed": "~2.1.0"
       }
     },
-    "ccount": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz",
-      "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==",
-      "dev": true
-    },
     "center-align": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
@@ -4042,12 +3917,6 @@
       "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
       "dev": true
     },
-    "character-entities-html4": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz",
-      "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==",
-      "dev": true
-    },
     "character-entities-legacy": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
@@ -4077,14 +3946,14 @@
       }
     },
     "chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz",
+      "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==",
       "dev": true,
       "requires": {
         "anymatch": "~3.1.1",
         "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
+        "fsevents": "~2.3.1",
         "glob-parent": "~5.1.0",
         "is-binary-path": "~2.1.0",
         "is-glob": "~4.0.1",
@@ -4127,12 +3996,6 @@
         }
       }
     },
-    "ci-info": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
-      "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
-      "dev": true
-    },
     "class-utils": {
       "version": "0.3.6",
       "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
@@ -4172,9 +4035,9 @@
       }
     },
     "cli-table": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz",
-      "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=",
+      "version": "0.3.6",
+      "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.6.tgz",
+      "integrity": "sha512-ZkNZbnZjKERTY5NwC2SeMeLeifSPq/pubeRoTpdr3WchLlnZg6hEgvHkK5zL7KNFdd9PmHN8lxrENUwI3cE8vQ==",
       "dev": true,
       "requires": {
         "colors": "1.0.3"
@@ -4205,12 +4068,6 @@
             "color-convert": "^2.0.1"
           }
         },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-          "dev": true
-        },
         "color-convert": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -4244,9 +4101,9 @@
           }
         },
         "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
           "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
@@ -4272,14 +4129,14 @@
       "dev": true
     },
     "cliui": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
-      "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+      "version": "7.0.4",
+      "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+      "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
       "dev": true,
       "requires": {
         "string-width": "^4.2.0",
         "strip-ansi": "^6.0.0",
-        "wrap-ansi": "^6.2.0"
+        "wrap-ansi": "^7.0.0"
       },
       "dependencies": {
         "ansi-regex": {
@@ -4295,9 +4152,9 @@
           "dev": true
         },
         "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
           "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
@@ -4395,12 +4252,6 @@
         }
       }
     },
-    "collapse-white-space": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
-      "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
-      "dev": true
-    },
     "collection-visit": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
@@ -4468,9 +4319,9 @@
       }
     },
     "commander": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-6.1.0.tgz",
-      "integrity": "sha512-wl7PNrYWd2y5mp1OK/LhTlv8Ff4kQJQRXXAvF+uU/TPNiVJUxZLRYGj/B0y/lPGAVcSbJqH2Za/cvHmrPMC8mA==",
+      "version": "6.2.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+      "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
       "dev": true
     },
     "commitizen": {
@@ -4559,12 +4410,6 @@
         "dot-prop": "^5.1.0"
       }
     },
-    "compare-versions": {
-      "version": "3.6.0",
-      "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz",
-      "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==",
-      "dev": true
-    },
     "component-emitter": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
@@ -4610,9 +4455,9 @@
       "integrity": "sha1-R1hw8DK44zhBKqX8UHiA8L9JXHc="
     },
     "conventional-changelog-angular": {
-      "version": "5.0.11",
-      "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.11.tgz",
-      "integrity": "sha512-nSLypht/1yEflhuTogC03i7DX7sOrXGsRn14g131Potqi6cbGbGEE9PSDEHKldabB6N76HiSyw9Ph+kLmC04Qw==",
+      "version": "5.0.12",
+      "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz",
+      "integrity": "sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw==",
       "dev": true,
       "requires": {
         "compare-func": "^2.0.0",
@@ -4620,9 +4465,9 @@
       }
     },
     "conventional-changelog-conventionalcommits": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz",
-      "integrity": "sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA==",
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.5.0.tgz",
+      "integrity": "sha512-buge9xDvjjOxJlyxUnar/+6i/aVEVGA7EEh4OafBCXPlLUQPGbRUBhBUveWRxzvR8TEjhKEP4BdepnpG2FSZXw==",
       "dev": true,
       "requires": {
         "compare-func": "^2.0.0",
@@ -4631,29 +4476,21 @@
       }
     },
     "conventional-changelog-writer": {
-      "version": "4.0.17",
-      "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.17.tgz",
-      "integrity": "sha512-IKQuK3bib/n032KWaSb8YlBFds+aLmzENtnKtxJy3+HqDq5kohu3g/UdNbIHeJWygfnEbZjnCKFxAW0y7ArZAw==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.1.0.tgz",
+      "integrity": "sha512-WwKcUp7WyXYGQmkLsX4QmU42AZ1lqlvRW9mqoyiQzdD+rJWbTepdWoKJuwXTS+yq79XKnQNa93/roViPQrAQgw==",
       "dev": true,
       "requires": {
         "compare-func": "^2.0.0",
-        "conventional-commits-filter": "^2.0.6",
+        "conventional-commits-filter": "^2.0.7",
         "dateformat": "^3.0.0",
         "handlebars": "^4.7.6",
         "json-stringify-safe": "^5.0.1",
         "lodash": "^4.17.15",
-        "meow": "^7.0.0",
+        "meow": "^8.0.0",
         "semver": "^6.0.0",
         "split": "^1.0.0",
-        "through2": "^3.0.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
+        "through2": "^4.0.0"
       }
     },
     "conventional-commit-types": {
@@ -4663,9 +4500,9 @@
       "dev": true
     },
     "conventional-commits-filter": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz",
-      "integrity": "sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw==",
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz",
+      "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==",
       "dev": true,
       "requires": {
         "lodash.ismatch": "^4.4.0",
@@ -4673,17 +4510,17 @@
       }
     },
     "conventional-commits-parser": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz",
-      "integrity": "sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA==",
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz",
+      "integrity": "sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.0.4",
         "is-text-path": "^1.0.1",
         "lodash": "^4.17.15",
-        "meow": "^7.0.0",
-        "split2": "^2.0.0",
-        "through2": "^3.0.0",
+        "meow": "^8.0.0",
+        "split2": "^3.0.0",
+        "through2": "^4.0.0",
         "trim-off-newlines": "^1.0.0"
       }
     },
@@ -4707,15 +4544,46 @@
       "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA=="
     },
     "core-js-compat": {
-      "version": "3.6.5",
-      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz",
-      "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==",
+      "version": "3.9.1",
+      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.9.1.tgz",
+      "integrity": "sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.8.5",
+        "browserslist": "^4.16.3",
         "semver": "7.0.0"
       },
       "dependencies": {
+        "browserslist": {
+          "version": "4.16.3",
+          "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
+          "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
+          "dev": true,
+          "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"
+          }
+        },
+        "caniuse-lite": {
+          "version": "1.0.30001204",
+          "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz",
+          "integrity": "sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ==",
+          "dev": true
+        },
+        "electron-to-chromium": {
+          "version": "1.3.698",
+          "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz",
+          "integrity": "sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ==",
+          "dev": true
+        },
+        "node-releases": {
+          "version": "1.1.71",
+          "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
+          "integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
+          "dev": true
+        },
         "semver": {
           "version": "7.0.0",
           "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz",
@@ -4741,6 +4609,233 @@
         "parse-json": "^4.0.0"
       }
     },
+    "cp-file": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-7.0.0.tgz",
+      "integrity": "sha512-0Cbj7gyvFVApzpK/uhCtQ/9kE9UnYpxMzaq5nQQC/Dh4iaj5fxp7iEFIullrYwzj8nf0qnsI1Qsx34hAeAebvw==",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "^4.1.2",
+        "make-dir": "^3.0.0",
+        "nested-error-stacks": "^2.0.0",
+        "p-event": "^4.1.0"
+      }
+    },
+    "cpy": {
+      "version": "8.1.2",
+      "resolved": "https://registry.npmjs.org/cpy/-/cpy-8.1.2.tgz",
+      "integrity": "sha512-dmC4mUesv0OYH2kNFEidtf/skUwv4zePmGeepjyyJ0qTo5+8KhA1o99oIAwVVLzQMAeDJml74d6wPPKb6EZUTg==",
+      "dev": true,
+      "requires": {
+        "arrify": "^2.0.1",
+        "cp-file": "^7.0.0",
+        "globby": "^9.2.0",
+        "has-glob": "^1.0.0",
+        "junk": "^3.1.0",
+        "nested-error-stacks": "^2.1.0",
+        "p-all": "^2.1.0",
+        "p-filter": "^2.1.0",
+        "p-map": "^3.0.0"
+      },
+      "dependencies": {
+        "@nodelib/fs.stat": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
+          "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
+          "dev": true
+        },
+        "array-union": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+          "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+          "dev": true,
+          "requires": {
+            "array-uniq": "^1.0.1"
+          }
+        },
+        "arrify": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+          "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+          "dev": true
+        },
+        "dir-glob": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz",
+          "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==",
+          "dev": true,
+          "requires": {
+            "path-type": "^3.0.0"
+          }
+        },
+        "fast-glob": {
+          "version": "2.2.7",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
+          "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
+          "dev": true,
+          "requires": {
+            "@mrmlnc/readdir-enhanced": "^2.2.1",
+            "@nodelib/fs.stat": "^1.1.2",
+            "glob-parent": "^3.1.0",
+            "is-glob": "^4.0.0",
+            "merge2": "^1.2.3",
+            "micromatch": "^3.1.10"
+          }
+        },
+        "glob-parent": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+          "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+          "dev": true,
+          "requires": {
+            "is-glob": "^3.1.0",
+            "path-dirname": "^1.0.0"
+          },
+          "dependencies": {
+            "is-glob": {
+              "version": "3.1.0",
+              "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+              "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+              "dev": true,
+              "requires": {
+                "is-extglob": "^2.1.0"
+              }
+            }
+          }
+        },
+        "globby": {
+          "version": "9.2.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz",
+          "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==",
+          "dev": true,
+          "requires": {
+            "@types/glob": "^7.1.1",
+            "array-union": "^1.0.2",
+            "dir-glob": "^2.2.2",
+            "fast-glob": "^2.2.6",
+            "glob": "^7.1.3",
+            "ignore": "^4.0.3",
+            "pify": "^4.0.1",
+            "slash": "^2.0.0"
+          }
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+          "dev": true
+        },
+        "p-map": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz",
+          "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==",
+          "dev": true,
+          "requires": {
+            "aggregate-error": "^3.0.0"
+          }
+        },
+        "path-type": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+          "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+          "dev": true,
+          "requires": {
+            "pify": "^3.0.0"
+          },
+          "dependencies": {
+            "pify": {
+              "version": "3.0.0",
+              "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+              "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+              "dev": true
+            }
+          }
+        },
+        "pify": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+          "dev": true
+        },
+        "slash": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+          "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+          "dev": true
+        }
+      }
+    },
+    "cpy-cli": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-3.1.1.tgz",
+      "integrity": "sha512-HCpNdBkQy3rw+uARLuIf0YurqsMXYzBa9ihhSAuxYJcNIrqrSq3BstPfr0cQN38AdMrQiO9Dp4hYy7GtGJsLPg==",
+      "dev": true,
+      "requires": {
+        "cpy": "^8.0.0",
+        "meow": "^6.1.1"
+      },
+      "dependencies": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "meow": {
+          "version": "6.1.1",
+          "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz",
+          "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==",
+          "dev": true,
+          "requires": {
+            "@types/minimist": "^1.2.0",
+            "camelcase-keys": "^6.2.2",
+            "decamelize-keys": "^1.1.0",
+            "hard-rejection": "^2.1.0",
+            "minimist-options": "^4.0.2",
+            "normalize-package-data": "^2.5.0",
+            "read-pkg-up": "^7.0.1",
+            "redent": "^3.0.0",
+            "trim-newlines": "^3.0.0",
+            "type-fest": "^0.13.1",
+            "yargs-parser": "^18.1.3"
+          }
+        },
+        "normalize-package-data": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "resolve": "^1.10.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.13.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+          "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+          "dev": true
+        },
+        "yargs-parser": {
+          "version": "18.1.3",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+          "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+          "dev": true,
+          "requires": {
+            "camelcase": "^5.0.0",
+            "decamelize": "^1.2.0"
+          }
+        }
+      }
+    },
     "crc-32": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz",
@@ -4756,9 +4851,9 @@
       "integrity": "sha512-l1cwMUOssGLEj5zgbut4lxJq95ZabOXVZnDybNqQRUtXh1lvUK7e7kJNm8SfvTQzYpE3AVJhIVUJKf382lMA7A=="
     },
     "cross-env": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.2.tgz",
-      "integrity": "sha512-KZP/bMEOJEDCkDQAyRhu3RL2ZO/SUVrxQVI0G3YEQ+OLbRA3c6zgixe8Mq8a/z7+HKlNEjo8oiLUs8iRijY2Rw==",
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+      "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
       "dev": true,
       "requires": {
         "cross-spawn": "^7.0.1"
@@ -4804,6 +4899,56 @@
       "dev": true,
       "requires": {
         "postcss": "^7.0.5"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "css-color-names": {
@@ -4820,117 +4965,131 @@
       "requires": {
         "postcss": "^7.0.1",
         "timsort": "^0.3.0"
-      }
-    },
-    "css-has-pseudo": {
-      "version": "0.10.0",
-      "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
-      "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.6",
-        "postcss-selector-parser": "^5.0.0-rc.4"
       },
       "dependencies": {
-        "cssesc": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
-          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
-          "dev": true
-        },
-        "postcss-selector-parser": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
-          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "dev": true,
           "requires": {
-            "cssesc": "^2.0.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        }
-      }
-    },
-    "css-modules-loader-core": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz",
-      "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=",
+            "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "css-has-pseudo": {
+      "version": "0.10.0",
+      "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz",
+      "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==",
       "dev": true,
       "requires": {
-        "icss-replace-symbols": "1.1.0",
-        "postcss": "6.0.1",
-        "postcss-modules-extract-imports": "1.1.0",
-        "postcss-modules-local-by-default": "1.2.0",
-        "postcss-modules-scope": "1.1.0",
-        "postcss-modules-values": "1.3.0"
+        "postcss": "^7.0.6",
+        "postcss-selector-parser": "^5.0.0-rc.4"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "2.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-          "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-          "dev": true
-        },
         "chalk": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^2.2.1",
-            "escape-string-regexp": "^1.0.2",
-            "has-ansi": "^2.0.0",
-            "strip-ansi": "^3.0.0",
-            "supports-color": "^2.0.0"
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
           },
           "dependencies": {
             "supports-color": {
-              "version": "2.0.0",
-              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-              "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-              "dev": true
+              "version": "5.5.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
             }
           }
         },
-        "has-flag": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
-          "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
           "dev": true
         },
         "postcss": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz",
-          "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=",
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "chalk": "^1.1.3",
-            "source-map": "^0.5.6",
-            "supports-color": "^3.2.3"
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
           }
         },
-        "strip-ansi": {
-          "version": "3.0.1",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^2.0.0"
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
           }
         },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
         "supports-color": {
-          "version": "3.2.3",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
-          "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
           "dev": true,
           "requires": {
-            "has-flag": "^1.0.0"
+            "has-flag": "^3.0.0"
           }
         }
       }
@@ -4942,6 +5101,56 @@
       "dev": true,
       "requires": {
         "postcss": "^7.0.5"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "css-select": {
@@ -4962,16 +5171,6 @@
       "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
       "dev": true
     },
-    "css-selector-tokenizer": {
-      "version": "0.7.3",
-      "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
-      "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
-      "dev": true,
-      "requires": {
-        "cssesc": "^3.0.0",
-        "fastparse": "^1.1.2"
-      }
-    },
     "css-tree": {
       "version": "1.0.0-alpha.37",
       "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
@@ -4997,9 +5196,9 @@
       "dev": true
     },
     "css-what": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.3.0.tgz",
-      "integrity": "sha512-pv9JPyatiPaQ6pf4OvD/dbfm0o5LviWmwxNWzblYf/1u9QZd0ihV+PMwy5jdQWQ3349kZmKEx9WXuSka2dM4cg==",
+      "version": "3.4.2",
+      "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
+      "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
       "dev": true
     },
     "cssdb": {
@@ -5024,6 +5223,56 @@
         "cssnano-preset-default": "^4.0.7",
         "is-resolvable": "^1.0.0",
         "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "cssnano-preset-default": {
@@ -5062,6 +5311,56 @@
         "postcss-reduce-transforms": "^4.0.2",
         "postcss-svgo": "^4.0.2",
         "postcss-unique-selectors": "^4.0.1"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "cssnano-util-get-arguments": {
@@ -5083,37 +5382,87 @@
       "dev": true,
       "requires": {
         "postcss": "^7.0.0"
-      }
-    },
-    "cssnano-util-same-parent": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
-      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
-      "dev": true
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "cssnano-util-same-parent": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
+      "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
+      "dev": true
     },
     "csso": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
-      "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
+      "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
       "dev": true,
       "requires": {
-        "css-tree": "1.0.0-alpha.39"
+        "css-tree": "^1.1.2"
       },
       "dependencies": {
         "css-tree": {
-          "version": "1.0.0-alpha.39",
-          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
-          "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
+          "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
           "dev": true,
           "requires": {
-            "mdn-data": "2.0.6",
+            "mdn-data": "2.0.14",
             "source-map": "^0.6.1"
           }
         },
         "mdn-data": {
-          "version": "2.0.6",
-          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
-          "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
+          "version": "2.0.14",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
           "dev": true
         },
         "source-map": {
@@ -5162,9 +5511,12 @@
       }
     },
     "d3-array": {
-      "version": "2.8.0",
-      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.8.0.tgz",
-      "integrity": "sha512-6V272gsOeg7+9pTW1jSYOR1QE37g95I3my1hBmY+vOUNHRrk9yt4OTz/gK7PMkVAVDrYYq4mq3grTiZ8iJdNIw=="
+      "version": "2.12.1",
+      "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz",
+      "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==",
+      "requires": {
+        "internmap": "^1.0.0"
+      }
     },
     "d3-color": {
       "version": "1.4.1",
@@ -5424,6 +5776,22 @@
       "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
       "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
     },
+    "del": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
+      "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
+      "dev": true,
+      "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"
+      }
+    },
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
@@ -5470,6 +5838,12 @@
       "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz",
       "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q=="
     },
+    "didyoumean": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz",
+      "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=",
+      "dev": true
+    },
     "dir-glob": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
@@ -5499,15 +5873,9 @@
       },
       "dependencies": {
         "domelementtype": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
-          "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
-          "dev": true
-        },
-        "entities": {
-          "version": "2.0.3",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
-          "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+          "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
           "dev": true
         }
       }
@@ -5605,9 +5973,9 @@
       }
     },
     "entities": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
-      "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
+      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
       "dev": true
     },
     "env-ci": {
@@ -5638,27 +6006,50 @@
       }
     },
     "es-abstract": {
-      "version": "1.17.6",
-      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
-      "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
+      "version": "1.18.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
+      "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
+      "dev": true,
       "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.1",
-        "is-callable": "^1.2.0",
-        "is-regex": "^1.1.0",
-        "object-inspect": "^1.7.0",
+        "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.0",
-        "string.prototype.trimend": "^1.0.1",
-        "string.prototype.trimstart": "^1.0.1"
+        "object.assign": "^4.1.2",
+        "string.prototype.trimend": "^1.0.4",
+        "string.prototype.trimstart": "^1.0.4",
+        "unbox-primitive": "^1.0.0"
       },
       "dependencies": {
-        "object-inspect": {
-          "version": "1.8.0",
-          "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-          "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+        "has-symbols": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+          "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+          "dev": true
+        },
+        "is-callable": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+          "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+          "dev": true
+        },
+        "is-regex": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
+          "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
+          "dev": true,
+          "requires": {
+            "call-bind": "^1.0.2",
+            "has-symbols": "^1.0.1"
+          }
         }
       }
     },
@@ -5804,13 +6195,13 @@
       }
     },
     "eslint": {
-      "version": "7.11.0",
-      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.11.0.tgz",
-      "integrity": "sha512-G9+qtYVCHaDi1ZuWzBsOWo2wSwd70TXnU6UHA3cTYHp7gCTXZcpggWFoUVAMRarg68qtPoNfFbzPh+VdOgmwmw==",
+      "version": "7.22.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.22.0.tgz",
+      "integrity": "sha512-3VawOtjSJUQiiqac8MQc+w457iGLfuNGLFn8JmF051tTKbh5/x/0vlcEj8OgDCaw7Ysa2Jn8paGshV7x2abKXg==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.0.0",
-        "@eslint/eslintrc": "^0.1.3",
+        "@babel/code-frame": "7.12.11",
+        "@eslint/eslintrc": "^0.4.0",
         "ajv": "^6.10.0",
         "chalk": "^4.0.0",
         "cross-spawn": "^7.0.2",
@@ -5820,13 +6211,13 @@
         "eslint-scope": "^5.1.1",
         "eslint-utils": "^2.1.0",
         "eslint-visitor-keys": "^2.0.0",
-        "espree": "^7.3.0",
-        "esquery": "^1.2.0",
+        "espree": "^7.3.1",
+        "esquery": "^1.4.0",
         "esutils": "^2.0.2",
-        "file-entry-cache": "^5.0.1",
+        "file-entry-cache": "^6.0.1",
         "functional-red-black-tree": "^1.0.1",
         "glob-parent": "^5.0.0",
-        "globals": "^12.1.0",
+        "globals": "^13.6.0",
         "ignore": "^4.0.6",
         "import-fresh": "^3.0.0",
         "imurmurhash": "^0.1.4",
@@ -5834,7 +6225,7 @@
         "js-yaml": "^3.13.1",
         "json-stable-stringify-without-jsonify": "^1.0.1",
         "levn": "^0.4.1",
-        "lodash": "^4.17.19",
+        "lodash": "^4.17.21",
         "minimatch": "^3.0.4",
         "natural-compare": "^1.4.0",
         "optionator": "^0.9.1",
@@ -5843,11 +6234,50 @@
         "semver": "^7.2.1",
         "strip-ansi": "^6.0.0",
         "strip-json-comments": "^3.1.0",
-        "table": "^5.2.3",
+        "table": "^6.0.4",
         "text-table": "^0.2.0",
         "v8-compile-cache": "^2.0.3"
       },
       "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
+          "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/helper-validator-identifier": {
+          "version": "7.12.11",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
+          "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
+          "dev": true
+        },
+        "@babel/highlight": {
+          "version": "7.13.10",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
+          "integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
+          "dev": true,
+          "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.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+              "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+              "dev": true,
+              "requires": {
+                "ansi-styles": "^3.2.1",
+                "escape-string-regexp": "^1.0.5",
+                "supports-color": "^5.3.0"
+              }
+            }
+          }
+        },
         "ansi-regex": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
@@ -5855,12 +6285,12 @@
           "dev": true
         },
         "globals": {
-          "version": "12.4.0",
-          "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
-          "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+          "version": "13.7.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-13.7.0.tgz",
+          "integrity": "sha512-Aipsz6ZKRxa/xQkZhNg0qIWXT6x6rD46f6x/PCnBomlttdIyAPak4YD9jTmKpZ72uROSMU87qJtcgpgHaVchiA==",
           "dev": true,
           "requires": {
-            "type-fest": "^0.8.1"
+            "type-fest": "^0.20.2"
           }
         },
         "ignore": {
@@ -5870,15 +6300,21 @@
           "dev": true
         },
         "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
           "dev": true,
           "requires": {
             "parent-module": "^1.0.0",
             "resolve-from": "^4.0.0"
           }
         },
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+          "dev": true
+        },
         "resolve-from": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
@@ -5886,10 +6322,13 @@
           "dev": true
         },
         "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
         },
         "strip-ansi": {
           "version": "6.0.0",
@@ -5907,34 +6346,23 @@
           "dev": true
         },
         "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "version": "0.20.2",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+          "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
           "dev": true
         }
       }
     },
     "eslint-config-prettier": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.14.0.tgz",
-      "integrity": "sha512-DbVwh0qZhAC7CNDWcq8cBdK6FcVHiMTKmCypOPWeZkp9hJ8xYwTaWSa6bb6cjfi8KOeJy0e9a8Izxyx+O4+gCQ==",
-      "dev": true,
-      "requires": {
-        "get-stdin": "^6.0.0"
-      },
-      "dependencies": {
-        "get-stdin": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz",
-          "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==",
-          "dev": true
-        }
-      }
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.1.0.tgz",
+      "integrity": "sha512-oKMhGv3ihGbCIimCAjqkdzx2Q+jthoqnXSP+d86M9tptwugycmTFdVR4IpLgq2c4SHifbwO90z2fQ8/Aio73yw==",
+      "dev": true
     },
     "eslint-plugin-prettier": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.4.tgz",
-      "integrity": "sha512-jZDa8z76klRqo+TdGDTFJSavwbnWK2ZpqGKNZ+VvweMW516pDUMmQ2koXvxEE4JhzNvTv+radye/bWGBmA6jmg==",
+      "version": "3.3.1",
+      "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.3.1.tgz",
+      "integrity": "sha512-Rq3jkcFY8RYeQLgk2cCwuc0P7SEFwDravPhsJZOQ5N4YI4DSg50NyqJ/9gdZHzQlHf8MvafSesbNJCcP/FF6pQ==",
       "dev": true,
       "requires": {
         "prettier-linter-helpers": "^1.0.0"
@@ -5974,13 +6402,13 @@
       "dev": true
     },
     "espree": {
-      "version": "7.3.0",
-      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
-      "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+      "version": "7.3.1",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
+      "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
       "dev": true,
       "requires": {
         "acorn": "^7.4.0",
-        "acorn-jsx": "^5.2.0",
+        "acorn-jsx": "^5.3.1",
         "eslint-visitor-keys": "^1.3.0"
       },
       "dependencies": {
@@ -5998,9 +6426,9 @@
       "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
     },
     "esquery": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-      "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+      "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
       "dev": true,
       "requires": {
         "estraverse": "^5.1.0"
@@ -6183,9 +6611,9 @@
       },
       "dependencies": {
         "type": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz",
-          "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA=="
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz",
+          "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw=="
         }
       }
     },
@@ -6380,12 +6808,6 @@
       "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==",
       "dev": true
     },
-    "fastparse": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
-      "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
-      "dev": true
-    },
     "fastq": {
       "version": "1.8.0",
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
@@ -6395,6 +6817,11 @@
         "reusify": "^1.0.4"
       }
     },
+    "fflate": {
+      "version": "0.3.11",
+      "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.3.11.tgz",
+      "integrity": "sha512-Rr5QlUeGN1mbOHlaqcSYMKVpPbgLy0AWT/W0EHxA6NGI12yO1jpoui2zBBvU2G824ltM6Ut8BFgfHSBGfkmS0A=="
+    },
     "figures": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
@@ -6405,12 +6832,12 @@
       }
     },
     "file-entry-cache": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
-      "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+      "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
       "dev": true,
       "requires": {
-        "flat-cache": "^2.0.1"
+        "flat-cache": "^3.0.4"
       }
     },
     "fill-range": {
@@ -6463,12 +6890,12 @@
       }
     },
     "find-versions": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz",
-      "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==",
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-4.0.0.tgz",
+      "integrity": "sha512-wgpWy002tA+wgmO27buH/9KzyEOQnKsG/R0yrcjPT9BOFm0zRBVQbZ95nRGXWMywS8YR5knRbpohio0bcJABxQ==",
       "dev": true,
       "requires": {
-        "semver-regex": "^2.0.0"
+        "semver-regex": "^3.1.2"
       }
     },
     "findup-sync": {
@@ -6484,25 +6911,24 @@
       }
     },
     "flat-cache": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
-      "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+      "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
       "dev": true,
       "requires": {
-        "flatted": "^2.0.0",
-        "rimraf": "2.6.3",
-        "write": "1.0.3"
+        "flatted": "^3.1.0",
+        "rimraf": "^3.0.2"
       }
     },
     "flatpickr": {
-      "version": "4.6.6",
-      "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.6.tgz",
-      "integrity": "sha512-EZ48CJMttMg3maMhJoX+GvTuuEhX/RbA1YeuI19attP3pwBdbYy6+yqAEVm0o0hSBFYBiLbVxscLW6gJXq6H3A=="
+      "version": "4.6.9",
+      "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.9.tgz",
+      "integrity": "sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw=="
     },
     "flatted": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
-      "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+      "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
       "dev": true
     },
     "flatten": {
@@ -6681,9 +7107,9 @@
       "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz",
+      "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==",
       "dev": true,
       "optional": true
     },
@@ -6713,9 +7139,9 @@
       }
     },
     "gensync": {
-      "version": "1.0.0-beta.1",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz",
-      "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==",
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
       "dev": true
     },
     "get-assigned-identifiers": {
@@ -6729,6 +7155,16 @@
       "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
       "dev": true
     },
+    "get-intrinsic": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/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.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -6792,16 +7228,16 @@
       }
     },
     "git-raw-commits": {
-      "version": "2.0.7",
-      "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz",
-      "integrity": "sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g==",
+      "version": "2.0.10",
+      "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz",
+      "integrity": "sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ==",
       "dev": true,
       "requires": {
         "dargs": "^7.0.0",
-        "lodash.template": "^4.0.2",
-        "meow": "^7.0.0",
-        "split2": "^2.0.0",
-        "through2": "^3.0.0"
+        "lodash": "^4.17.15",
+        "meow": "^8.0.0",
+        "split2": "^3.0.0",
+        "through2": "^4.0.0"
       }
     },
     "glob": {
@@ -6826,6 +7262,12 @@
         "is-glob": "^4.0.1"
       }
     },
+    "glob-to-regexp": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
+      "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
+      "dev": true
+    },
     "global-dirs": {
       "version": "0.1.1",
       "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
@@ -6932,9 +7374,9 @@
       "dev": true
     },
     "handlebars": {
-      "version": "4.7.6",
-      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
-      "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+      "version": "4.7.7",
+      "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
+      "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5",
@@ -6951,9 +7393,9 @@
           "dev": true
         },
         "uglify-js": {
-          "version": "3.11.2",
-          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.11.2.tgz",
-          "integrity": "sha512-G440NU6fewtnQftSgqRV1r2A5ChKbU1gqFCJ7I8S7MPpY/eZZfLGefaY6gUZYiWebMaO+txgiQ1ZyLDuNWJulg==",
+          "version": "3.13.2",
+          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.2.tgz",
+          "integrity": "sha512-SbMu4D2Vo95LMC/MetNaso1194M1htEA+JrqE9Hk+G2DhI+itfS9TRu9ZKeCahLDNa/J3n4MqUJ/fOHMzQpRWw==",
           "dev": true,
           "optional": true
         },
@@ -6994,12 +7436,37 @@
         }
       }
     },
+    "has-bigints": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
+      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA=="
+    },
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
       "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
       "dev": true
     },
+    "has-glob": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/has-glob/-/has-glob-1.0.0.tgz",
+      "integrity": "sha1-mqqe7b/7G6OZCnsAEPtnjuAIEgc=",
+      "dev": true,
+      "requires": {
+        "is-glob": "^3.0.0"
+      },
+      "dependencies": {
+        "is-glob": {
+          "version": "3.1.0",
+          "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+          "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+          "dev": true,
+          "requires": {
+            "is-extglob": "^2.1.0"
+          }
+        }
+      }
+    },
     "has-symbols": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
@@ -7059,10 +7526,13 @@
       "dev": true
     },
     "hosted-git-info": {
-      "version": "2.8.8",
-      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
-      "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
-      "dev": true
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+      "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+      "dev": true,
+      "requires": {
+        "lru-cache": "^6.0.0"
+      }
     },
     "hsl-regex": {
       "version": "1.0.0",
@@ -7102,6 +7572,12 @@
         "readable-stream": "^3.1.1"
       },
       "dependencies": {
+        "entities": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+          "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+          "dev": true
+        },
         "readable-stream": {
           "version": "3.6.0",
           "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -7149,115 +7625,74 @@
       "dev": true
     },
     "husky": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/husky/-/husky-4.3.0.tgz",
-      "integrity": "sha512-tTMeLCLqSBqnflBZnlVDhpaIMucSGaYyX6855jM4AguGeWCeSzNdb1mfyWduTZ3pe3SJVvVWGL0jO1iKZVPfTA==",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/husky/-/husky-5.2.0.tgz",
+      "integrity": "sha512-AM8T/auHXRBxlrfPVLKP6jt49GCM2Zz47m8G3FOMsLmTv8Dj/fKVWE0Rh2d4Qrvmy131xEsdQnb3OXRib67PGg==",
+      "dev": true
+    },
+    "iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
       "dev": true,
       "requires": {
-        "chalk": "^4.0.0",
-        "ci-info": "^2.0.0",
-        "compare-versions": "^3.6.0",
-        "cosmiconfig": "^7.0.0",
-        "find-versions": "^3.2.0",
-        "opencollective-postinstall": "^2.0.2",
-        "pkg-dir": "^4.2.0",
-        "please-upgrade-node": "^3.2.0",
-        "slash": "^3.0.0",
-        "which-pm-runs": "^1.0.0"
+        "safer-buffer": ">= 2.1.2 < 3"
+      }
+    },
+    "icss-replace-symbols": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
+      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
+      "dev": true
+    },
+    "icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+      "dev": true
+    },
+    "ignore": {
+      "version": "5.1.8",
+      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
+      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
+      "dev": true
+    },
+    "import-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+      "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+      "dev": true,
+      "requires": {
+        "import-from": "^3.0.0"
+      }
+    },
+    "import-fresh": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
+      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
+      "dev": true,
+      "requires": {
+        "caller-path": "^2.0.0",
+        "resolve-from": "^3.0.0"
+      }
+    },
+    "import-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+      "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+      "dev": true,
+      "requires": {
+        "resolve-from": "^5.0.0"
       },
       "dependencies": {
-        "cosmiconfig": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-          "dev": true,
-          "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"
-          }
-        },
-        "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
-          "dev": true,
-          "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          }
-        },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
-          "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"
-          }
-        },
         "resolve-from": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
         }
       }
     },
-    "iconv-lite": {
-      "version": "0.4.24",
-      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
-      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
-      "dev": true,
-      "requires": {
-        "safer-buffer": ">= 2.1.2 < 3"
-      }
-    },
-    "icss-replace-symbols": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
-      "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
-      "dev": true
-    },
-    "ignore": {
-      "version": "5.1.8",
-      "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-      "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-      "dev": true
-    },
-    "import-cwd": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
-      "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=",
-      "dev": true,
-      "requires": {
-        "import-from": "^2.1.0"
-      }
-    },
-    "import-fresh": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
-      "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
-      "dev": true,
-      "requires": {
-        "caller-path": "^2.0.0",
-        "resolve-from": "^3.0.0"
-      }
-    },
-    "import-from": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz",
-      "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=",
-      "dev": true,
-      "requires": {
-        "resolve-from": "^3.0.0"
-      }
-    },
     "import-lazy": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
@@ -7297,9 +7732,9 @@
       "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
     },
     "ini": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
-      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+      "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
       "dev": true
     },
     "inquirer": {
@@ -7336,10 +7771,15 @@
         }
       }
     },
+    "internmap": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz",
+      "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="
+    },
     "into-stream": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-5.1.1.tgz",
-      "integrity": "sha512-krrAJ7McQxGGmvaYbB7Q1mcA+cRwg9Ij2RfWIeVesNBgVDZmzY/Fa4IpZUT3bmdRzMzdf/mzltCG2Dq99IZGBA==",
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz",
+      "integrity": "sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==",
       "dev": true,
       "requires": {
         "from2": "^2.3.0",
@@ -7378,12 +7818,6 @@
       "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
       "dev": true
     },
-    "is-alphanumeric": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz",
-      "integrity": "sha1-Spzvcdr0wAHB2B1j0UDPU/1oifQ=",
-      "dev": true
-    },
     "is-alphanumerical": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
@@ -7395,9 +7829,12 @@
       }
     },
     "is-arguments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
-      "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA=="
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz",
+      "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==",
+      "requires": {
+        "call-bind": "^1.0.0"
+      }
     },
     "is-arrayish": {
       "version": "0.3.2",
@@ -7405,6 +7842,11 @@
       "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
       "dev": true
     },
+    "is-bigint": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz",
+      "integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg=="
+    },
     "is-binary-path": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -7414,6 +7856,14 @@
         "binary-extensions": "^2.0.0"
       }
     },
+    "is-boolean-object": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/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.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
@@ -7438,6 +7888,15 @@
         "rgba-regex": "^1.0.0"
       }
     },
+    "is-core-module": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
     "is-data-descriptor": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
@@ -7534,9 +7993,9 @@
       "dev": true
     },
     "is-negative-zero": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
-      "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE="
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+      "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w=="
     },
     "is-number": {
       "version": "3.0.0",
@@ -7558,12 +8017,29 @@
         }
       }
     },
+    "is-number-object": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
+      "integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw=="
+    },
     "is-obj": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
       "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
       "dev": true
     },
+    "is-path-cwd": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+      "dev": true
+    },
+    "is-path-inside": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+      "dev": true
+    },
     "is-plain-obj": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
@@ -7623,6 +8099,11 @@
       "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
       "dev": true
     },
+    "is-string": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/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.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
@@ -7655,30 +8136,24 @@
       "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
       "dev": true
     },
+    "is-unicode-supported": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+      "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+      "dev": true
+    },
     "is-utf8": {
       "version": "0.2.1",
       "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
       "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
       "dev": true
     },
-    "is-whitespace-character": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
-      "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
-      "dev": true
-    },
     "is-windows": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
       "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
       "dev": true
     },
-    "is-word-character": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
-      "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
-      "dev": true
-    },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -7809,9 +8284,9 @@
       }
     },
     "json5": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
-      "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
+      "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
       "dev": true,
       "requires": {
         "minimist": "^1.2.5"
@@ -7832,6 +8307,12 @@
       "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=",
       "dev": true
     },
+    "junk": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz",
+      "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==",
+      "dev": true
+    },
     "keyv": {
       "version": "4.0.3",
       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz",
@@ -7848,9 +8329,9 @@
       "dev": true
     },
     "known-css-properties": {
-      "version": "0.19.0",
-      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.19.0.tgz",
-      "integrity": "sha512-eYboRV94Vco725nKMlpkn3nV2+96p9c3gKXRsYqAJSswSENvBhN7n5L+uDhY58xQa0UukWsDMTGELzmD8Q+wTA==",
+      "version": "0.21.0",
+      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz",
+      "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==",
       "dev": true
     },
     "lazy-cache": {
@@ -7885,9 +8366,9 @@
       "dev": true
     },
     "linguist-languages": {
-      "version": "7.11.1",
-      "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.11.1.tgz",
-      "integrity": "sha512-+cRUk+1WTbydcdzipXQER2iilX+wMrb1LPkbkGuDP/IcGPJRDmOZH6Olf1iH6sHlHwPnJYiNJH39YsFCVZxvUQ==",
+      "version": "7.13.0",
+      "resolved": "https://registry.npmjs.org/linguist-languages/-/linguist-languages-7.13.0.tgz",
+      "integrity": "sha512-n1X6l+YYbEDtXE9tDr8nYZAgeuKw+qBFvYGzIGltw3Z3oJwS+4vyVtFG5UFa71kvmPWMS3RT/yB95RWzD7MrVQ==",
       "dev": true
     },
     "linkify-it": {
@@ -7899,20 +8380,20 @@
       }
     },
     "lint-staged": {
-      "version": "10.4.2",
-      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.4.2.tgz",
-      "integrity": "sha512-OLCA9K1hS+Sl179SO6kX0JtnsaKj/MZalEhUj5yAgXsb63qPI/Gfn6Ua1KuZdbfkZNEu3/n5C/obYCu70IMt9g==",
+      "version": "10.5.4",
+      "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz",
+      "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==",
       "dev": true,
       "requires": {
         "chalk": "^4.1.0",
         "cli-truncate": "^2.1.0",
-        "commander": "^6.0.0",
+        "commander": "^6.2.0",
         "cosmiconfig": "^7.0.0",
-        "debug": "^4.1.1",
+        "debug": "^4.2.0",
         "dedent": "^0.7.0",
         "enquirer": "^2.3.6",
-        "execa": "^4.0.3",
-        "listr2": "^2.6.0",
+        "execa": "^4.1.0",
+        "listr2": "^3.2.2",
         "log-symbols": "^4.0.0",
         "micromatch": "^4.0.2",
         "normalize-path": "^3.0.0",
@@ -7977,6 +8458,32 @@
             "yaml": "^1.10.0"
           }
         },
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+          "dev": true,
+          "requires": {
+            "ms": "2.1.2"
+          }
+        },
+        "execa": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
+          "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
+          "dev": true,
+          "requires": {
+            "cross-spawn": "^7.0.0",
+            "get-stream": "^5.0.0",
+            "human-signals": "^1.1.1",
+            "is-stream": "^2.0.0",
+            "merge-stream": "^2.0.0",
+            "npm-run-path": "^4.0.0",
+            "onetime": "^5.1.0",
+            "signal-exit": "^3.0.2",
+            "strip-final-newline": "^2.0.0"
+          }
+        },
         "fill-range": {
           "version": "7.0.1",
           "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
@@ -7993,9 +8500,9 @@
           "dev": true
         },
         "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
           "dev": true,
           "requires": {
             "parent-module": "^1.0.0",
@@ -8018,10 +8525,25 @@
             "picomatch": "^2.0.5"
           }
         },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
         "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.0.0",
@@ -8057,9 +8579,9 @@
       }
     },
     "listr2": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/listr2/-/listr2-2.6.2.tgz",
-      "integrity": "sha512-6x6pKEMs8DSIpA/tixiYY2m/GcbgMplMVmhQAaLFxEtNSKLeWTGjtmU57xvv6QCm2XcqzyNXL/cTSVf4IChCRA==",
+      "version": "3.4.3",
+      "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.4.3.tgz",
+      "integrity": "sha512-wZmkzNiuinOfwrGqAwTCcPw6aKQGTAMGXwG5xeU1WpDjJNeBA35jGBeWxR3OF+R6Yl5Y3dRG+3vE8t6PDcSNHA==",
       "dev": true,
       "requires": {
         "chalk": "^4.1.0",
@@ -8068,8 +8590,9 @@
         "indent-string": "^4.0.0",
         "log-update": "^4.0.0",
         "p-map": "^4.0.0",
-        "rxjs": "^6.6.2",
-        "through": "^2.3.8"
+        "rxjs": "^6.6.6",
+        "through": "^2.3.8",
+        "wrap-ansi": "^7.0.0"
       },
       "dependencies": {
         "ansi-styles": {
@@ -8121,6 +8644,15 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
+        "rxjs": {
+          "version": "6.6.6",
+          "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz",
+          "integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==",
+          "dev": true,
+          "requires": {
+            "tslib": "^1.9.0"
+          }
+        },
         "supports-color": {
           "version": "7.2.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
@@ -8213,6 +8745,18 @@
       "integrity": "sha1-+CbJtOKoUR2E46yinbBeGk87cqk=",
       "dev": true
     },
+    "lodash.castarray": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz",
+      "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=",
+      "dev": true
+    },
+    "lodash.debounce": {
+      "version": "4.0.8",
+      "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
+      "dev": true
+    },
     "lodash.difference": {
       "version": "4.5.0",
       "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
@@ -8273,6 +8817,12 @@
       "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
       "dev": true
     },
+    "lodash.merge": {
+      "version": "4.6.2",
+      "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+      "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+      "dev": true
+    },
     "lodash.sortby": {
       "version": "4.7.0",
       "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
@@ -8317,12 +8867,64 @@
       "dev": true
     },
     "log-symbols": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
-      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+      "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
       "dev": true,
       "requires": {
-        "chalk": "^4.0.0"
+        "chalk": "^4.1.0",
+        "is-unicode-supported": "^0.1.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        }
       }
     },
     "log-update": {
@@ -8338,14 +8940,20 @@
       },
       "dependencies": {
         "ansi-escapes": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
-          "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+          "version": "4.3.2",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+          "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
           "dev": true,
           "requires": {
-            "type-fest": "^0.11.0"
+            "type-fest": "^0.21.3"
           }
         },
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
         "ansi-styles": {
           "version": "4.3.0",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -8355,12 +8963,6 @@
             "color-convert": "^2.0.1"
           }
         },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
-          "dev": true
-        },
         "cli-cursor": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
@@ -8416,22 +9018,42 @@
             "signal-exit": "^3.0.2"
           }
         },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
+            "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.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
         },
         "type-fest": {
-          "version": "0.11.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
-          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
           "dev": true
+        },
+        "wrap-ansi": {
+          "version": "6.2.0",
+          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+          "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.0.0",
+            "string-width": "^4.1.0",
+            "strip-ansi": "^6.0.0"
+          }
         }
       }
     },
@@ -8470,12 +9092,6 @@
         "yallist": "^4.0.0"
       }
     },
-    "macos-release": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz",
-      "integrity": "sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg==",
-      "dev": true
-    },
     "magic-string": {
       "version": "0.25.7",
       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
@@ -8485,6 +9101,15 @@
         "sourcemap-codec": "^1.4.4"
       }
     },
+    "make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dev": true,
+      "requires": {
+        "semver": "^6.0.0"
+      }
+    },
     "map-age-cleaner": {
       "version": "0.1.3",
       "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
@@ -8501,9 +9126,9 @@
       "dev": true
     },
     "map-obj": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz",
-      "integrity": "sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g==",
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.0.tgz",
+      "integrity": "sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ==",
       "dev": true
     },
     "map-visit": {
@@ -8515,12 +9140,6 @@
         "object-visit": "^1.0.0"
       }
     },
-    "markdown-escapes": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
-      "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
-      "dev": true
-    },
     "markdown-it": {
       "version": "10.0.0",
       "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
@@ -8540,48 +9159,88 @@
         }
       }
     },
-    "markdown-table": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz",
-      "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==",
-      "dev": true,
-      "requires": {
-        "repeat-string": "^1.0.0"
-      }
-    },
     "marked": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-1.2.0.tgz",
-      "integrity": "sha512-tiRxakgbNPBr301ihe/785NntvYyhxlqcL3YaC8CaxJQh7kiaEtrN9B/eK2I2943Yjkh5gw25chYFDQhOMCwMA==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.1.tgz",
+      "integrity": "sha512-5+/fKgMv2hARmMW7DOpykr2iLhl0NgjyELk5yn92iE7z8Se1IS9n3UsFm86hFXIkvMBmVxki8+ckcpjBeyo/hw==",
       "dev": true
     },
     "marked-terminal": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.0.tgz",
-      "integrity": "sha512-5KllfAOW02WS6hLRQ7cNvGOxvKW1BKuXELH4EtbWfyWgxQhROoMxEvuQ/3fTgkNjledR0J48F4HbapvYp1zWkQ==",
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-4.1.1.tgz",
+      "integrity": "sha512-t7Mdf6T3PvOEyN01c3tYxDzhyKZ8xnkp8Rs6Fohno63L/0pFTJ5Qtwto2AQVuDtbQiWzD+4E5AAu1Z2iLc8miQ==",
       "dev": true,
       "requires": {
         "ansi-escapes": "^4.3.1",
         "cardinal": "^2.1.1",
-        "chalk": "^4.0.0",
+        "chalk": "^4.1.0",
         "cli-table": "^0.3.1",
         "node-emoji": "^1.10.0",
         "supports-hyperlinks": "^2.1.0"
       },
       "dependencies": {
         "ansi-escapes": {
-          "version": "4.3.1",
-          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
-          "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
+          "version": "4.3.2",
+          "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+          "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+          "dev": true,
+          "requires": {
+            "type-fest": "^0.21.3"
+          }
+        },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
-            "type-fest": "^0.11.0"
+            "has-flag": "^4.0.0"
           }
         },
         "type-fest": {
-          "version": "0.11.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
-          "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
+          "version": "0.21.3",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+          "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
           "dev": true
         }
       }
@@ -8602,15 +9261,39 @@
       "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
       "dev": true
     },
-    "mdast-util-compact": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-2.0.1.tgz",
-      "integrity": "sha512-7GlnT24gEwDrdAwEHrU4Vv5lLWrEer4KOkAiKT9nYstsTad7Oc1TwqT2zIMKRdZF7cTuaf+GA1E4Kv7jJh8mPA==",
+    "mdast-util-from-markdown": {
+      "version": "0.8.5",
+      "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz",
+      "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==",
       "dev": true,
       "requires": {
-        "unist-util-visit": "^2.0.0"
+        "@types/mdast": "^3.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "micromark": "~2.11.0",
+        "parse-entities": "^2.0.0",
+        "unist-util-stringify-position": "^2.0.0"
+      }
+    },
+    "mdast-util-to-markdown": {
+      "version": "0.6.5",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz",
+      "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==",
+      "dev": true,
+      "requires": {
+        "@types/unist": "^2.0.0",
+        "longest-streak": "^2.0.0",
+        "mdast-util-to-string": "^2.0.0",
+        "parse-entities": "^2.0.0",
+        "repeat-string": "^1.0.0",
+        "zwitch": "^1.0.0"
       }
     },
+    "mdast-util-to-string": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz",
+      "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==",
+      "dev": true
+    },
     "mdn-data": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
@@ -8623,9 +9306,9 @@
       "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4="
     },
     "mem": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz",
-      "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==",
+      "version": "8.1.0",
+      "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.0.tgz",
+      "integrity": "sha512-FIkgXo0kTi3XpvaznV5Muk6Y6w8SkdmRXcY7ZLonQesuYezp59UooLxAVBcGuN6PH2tXN84mR3vyzSc6oSMUfA==",
       "dev": true,
       "requires": {
         "map-age-cleaner": "^0.1.3",
@@ -8633,9 +9316,9 @@
       }
     },
     "meow": {
-      "version": "7.1.1",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-7.1.1.tgz",
-      "integrity": "sha512-GWHvA5QOcS412WCo8vwKDlTelGLsCGBVevQB5Kva961rmNfun0PCbv5+xta2kUMFJyR8/oWnn7ddeKdosbAPbA==",
+      "version": "8.1.2",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz",
+      "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==",
       "dev": true,
       "requires": {
         "@types/minimist": "^1.2.0",
@@ -8643,12 +9326,12 @@
         "decamelize-keys": "^1.1.0",
         "hard-rejection": "^2.1.0",
         "minimist-options": "4.1.0",
-        "normalize-package-data": "^2.5.0",
+        "normalize-package-data": "^3.0.0",
         "read-pkg-up": "^7.0.1",
         "redent": "^3.0.0",
         "trim-newlines": "^3.0.0",
-        "type-fest": "^0.13.1",
-        "yargs-parser": "^18.1.3"
+        "type-fest": "^0.18.0",
+        "yargs-parser": "^20.2.3"
       }
     },
     "merge": {
@@ -8677,6 +9360,16 @@
       "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
       "dev": true
     },
+    "micromark": {
+      "version": "2.11.4",
+      "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz",
+      "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==",
+      "dev": true,
+      "requires": {
+        "debug": "^4.0.0",
+        "parse-entities": "^2.0.0"
+      }
+    },
     "micromatch": {
       "version": "3.1.10",
       "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
@@ -8699,24 +9392,24 @@
       }
     },
     "mime": {
-      "version": "2.4.6",
-      "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz",
-      "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==",
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz",
+      "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==",
       "dev": true
     },
     "mime-db": {
-      "version": "1.44.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-      "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+      "version": "1.45.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+      "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.27",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-      "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+      "version": "2.1.28",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+      "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
       "dev": true,
       "requires": {
-        "mime-db": "1.44.0"
+        "mime-db": "1.45.0"
       }
     },
     "mimic-fn": {
@@ -8797,6 +9490,12 @@
         "minimist": "^1.2.5"
       }
     },
+    "modern-normalize": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.0.0.tgz",
+      "integrity": "sha512-1lM+BMLGuDfsdwf3rsgBSrxJwAZHFIrQ8YR61xIqdHo0uNKI9M52wNpHSrliZATJp51On6JD0AfRxd4YGSU0lw==",
+      "dev": true
+    },
     "modify-values": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
@@ -8815,6 +9514,12 @@
       "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
       "dev": true
     },
+    "nanoid": {
+      "version": "3.1.22",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.22.tgz",
+      "integrity": "sha512-/2ZUaJX2ANuLtTvqTlgqBQNJoQO398KyJgZloL0PZkC0dpysjncRUPsFe3DUPzz/y3h+u7C46np8RMuvF3jsSQ==",
+      "dev": true
+    },
     "nanomatch": {
       "version": "1.2.13",
       "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -8852,17 +9557,17 @@
       "integrity": "sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=",
       "dev": true
     },
+    "nested-error-stacks": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz",
+      "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==",
+      "dev": true
+    },
     "next-tick": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
       "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
     },
-    "nice-try": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
-    },
     "node-emoji": {
       "version": "1.10.0",
       "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz",
@@ -8885,15 +9590,36 @@
       "dev": true
     },
     "normalize-package-data": {
-      "version": "2.5.0",
-      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-      "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.2.tgz",
+      "integrity": "sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg==",
       "dev": true,
       "requires": {
-        "hosted-git-info": "^2.1.4",
-        "resolve": "^1.10.0",
-        "semver": "2 || 3 || 4 || 5",
+        "hosted-git-info": "^4.0.1",
+        "resolve": "^1.20.0",
+        "semver": "^7.3.4",
         "validate-npm-package-license": "^3.0.1"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.20.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+          "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+          "dev": true,
+          "requires": {
+            "is-core-module": "^2.2.0",
+            "path-parse": "^1.0.6"
+          }
+        },
+        "semver": {
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        }
       }
     },
     "normalize-path": {
@@ -8920,16 +9646,10 @@
       "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
       "dev": true
     },
-    "normalize.css": {
-      "version": "8.0.1",
-      "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz",
-      "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==",
-      "dev": true
-    },
     "npm": {
-      "version": "6.14.8",
-      "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.8.tgz",
-      "integrity": "sha512-HBZVBMYs5blsj94GTeQZel7s9odVuuSUHy1+AlZh7rPVux1os2ashvEGLy/STNK7vUjbrCg5Kq9/GXisJgdf6A==",
+      "version": "6.14.11",
+      "resolved": "https://registry.npmjs.org/npm/-/npm-6.14.11.tgz",
+      "integrity": "sha512-1Zh7LjuIoEhIyjkBflSSGzfjuPQwDlghNloppjruOH5bmj9midT9qcNT0tRUZRR04shU9ekrxNy9+UTBrqeBpQ==",
       "dev": true,
       "requires": {
         "JSONStream": "^1.3.5",
@@ -8969,7 +9689,7 @@
         "infer-owner": "^1.0.4",
         "inflight": "~1.0.6",
         "inherits": "^2.0.4",
-        "ini": "^1.3.5",
+        "ini": "^1.3.8",
         "init-package-json": "^1.10.3",
         "is-cidr": "^3.0.0",
         "json-parse-better-errors": "^1.0.2",
@@ -9012,10 +9732,10 @@
         "npm-pick-manifest": "^3.0.2",
         "npm-profile": "^4.0.4",
         "npm-registry-fetch": "^4.0.7",
-        "npm-user-validate": "~1.0.0",
+        "npm-user-validate": "^1.0.1",
         "npmlog": "~4.1.2",
         "once": "~1.4.0",
-        "opener": "^1.5.1",
+        "opener": "^1.5.2",
         "osenv": "^0.1.5",
         "pacote": "^9.5.12",
         "path-is-inside": "~1.0.2",
@@ -9087,17 +9807,6 @@
             "humanize-ms": "^1.2.1"
           }
         },
-        "ajv": {
-          "version": "5.5.2",
-          "bundled": true,
-          "dev": true,
-          "requires": {
-            "co": "^4.6.0",
-            "fast-deep-equal": "^1.0.0",
-            "fast-json-stable-stringify": "^2.0.0",
-            "json-schema-traverse": "^0.3.0"
-          }
-        },
         "ansi-align": {
           "version": "2.0.0",
           "bundled": true,
@@ -9428,11 +10137,6 @@
             "mkdirp": "~0.5.0"
           }
         },
-        "co": {
-          "version": "4.6.0",
-          "bundled": true,
-          "dev": true
-        },
         "code-point-at": {
           "version": "1.1.0",
           "bundled": true,
@@ -9881,11 +10585,6 @@
           "bundled": true,
           "dev": true
         },
-        "fast-deep-equal": {
-          "version": "1.1.0",
-          "bundled": true,
-          "dev": true
-        },
         "fast-json-stable-stringify": {
           "version": "2.0.0",
           "bundled": true,
@@ -10206,12 +10905,35 @@
           "dev": true
         },
         "har-validator": {
-          "version": "5.1.0",
+          "version": "5.1.5",
           "bundled": true,
           "dev": true,
           "requires": {
-            "ajv": "^5.3.0",
+            "ajv": "^6.12.3",
             "har-schema": "^2.0.0"
+          },
+          "dependencies": {
+            "ajv": {
+              "version": "6.12.6",
+              "bundled": true,
+              "dev": true,
+              "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"
+              }
+            },
+            "fast-deep-equal": {
+              "version": "3.1.3",
+              "bundled": true,
+              "dev": true
+            },
+            "json-schema-traverse": {
+              "version": "0.4.1",
+              "bundled": true,
+              "dev": true
+            }
           }
         },
         "has": {
@@ -10334,7 +11056,7 @@
           "dev": true
         },
         "ini": {
-          "version": "1.3.5",
+          "version": "1.3.8",
           "bundled": true,
           "dev": true
         },
@@ -10498,11 +11220,6 @@
           "bundled": true,
           "dev": true
         },
-        "json-schema-traverse": {
-          "version": "0.3.1",
-          "bundled": true,
-          "dev": true
-        },
         "json-stringify-safe": {
           "version": "5.0.1",
           "bundled": true,
@@ -11145,7 +11862,7 @@
           }
         },
         "npm-user-validate": {
-          "version": "1.0.0",
+          "version": "1.0.1",
           "bundled": true,
           "dev": true
         },
@@ -11198,7 +11915,7 @@
           }
         },
         "opener": {
-          "version": "1.5.1",
+          "version": "1.5.2",
           "bundled": true,
           "dev": true
         },
@@ -12149,6 +12866,21 @@
             "xdg-basedir": "^3.0.0"
           }
         },
+        "uri-js": {
+          "version": "4.4.0",
+          "bundled": true,
+          "dev": true,
+          "requires": {
+            "punycode": "^2.1.0"
+          },
+          "dependencies": {
+            "punycode": {
+              "version": "2.1.1",
+              "bundled": true,
+              "dev": true
+            }
+          }
+        },
         "url-parse-lax": {
           "version": "1.0.0",
           "bundled": true,
@@ -12505,68 +13237,23 @@
       }
     },
     "object-hash": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
-      "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg==",
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.1.1.tgz",
+      "integrity": "sha512-VOJmgmS+7wvXf8CjbQmimtCnEx3IAoLxI3fp2fbWehxrWBcAQFbk+vcwb6vzR0VZv/eNCJ/27j151ZTwqW/JeQ==",
       "dev": true
     },
     "object-inspect": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-      "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA=="
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
+      "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw=="
     },
     "object-is": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz",
-      "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==",
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+      "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
       "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.1"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-          "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
-          }
-        },
-        "is-callable": {
-          "version": "1.2.2",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-          "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
-        },
-        "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-          "requires": {
-            "has-symbols": "^1.0.1"
-          }
-        },
-        "object.assign": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
-          "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
-          "requires": {
-            "define-properties": "^1.1.3",
-            "es-abstract": "^1.18.0-next.0",
-            "has-symbols": "^1.0.1",
-            "object-keys": "^1.1.1"
-          }
-        }
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
       }
     },
     "object-keys": {
@@ -12584,24 +13271,26 @@
       }
     },
     "object.assign": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
-      "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+      "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
+      "dev": true,
       "requires": {
-        "define-properties": "^1.1.2",
-        "function-bind": "^1.1.1",
-        "has-symbols": "^1.0.0",
-        "object-keys": "^1.0.11"
+        "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.0",
-      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
-      "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
+      "integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
       "dev": true,
       "requires": {
+        "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1"
+        "es-abstract": "^1.18.0-next.2"
       }
     },
     "object.pick": {
@@ -12614,14 +13303,14 @@
       }
     },
     "object.values": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
-      "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz",
+      "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
       "dev": true,
       "requires": {
+        "call-bind": "^1.0.2",
         "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1",
-        "function-bind": "^1.1.1",
+        "es-abstract": "^1.18.0-next.2",
         "has": "^1.0.3"
       }
     },
@@ -12650,12 +13339,6 @@
         }
       }
     },
-    "opencollective-postinstall": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz",
-      "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==",
-      "dev": true
-    },
     "optionator": {
       "version": "0.9.1",
       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@@ -12675,38 +13358,45 @@
       "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-1.1.1.tgz",
       "integrity": "sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ=="
     },
-    "os-name": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz",
-      "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==",
-      "dev": true,
-      "requires": {
-        "macos-release": "^2.2.0",
-        "windows-release": "^3.1.0"
-      }
-    },
     "os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
       "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
       "dev": true
     },
-    "p-cancelable": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz",
-      "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==",
-      "dev": true
-    },
-    "p-defer": {
-      "version": "1.0.0",
+    "p-all": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/p-all/-/p-all-2.1.0.tgz",
+      "integrity": "sha512-HbZxz5FONzz/z2gJfk6bFca0BCiSRF8jU3yCsWOen/vR6lZjfPOu/e7L3uFzTW1i0H8TlC3vqQstEJPQL4/uLA==",
+      "dev": true,
+      "requires": {
+        "p-map": "^2.0.0"
+      },
+      "dependencies": {
+        "p-map": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+          "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+          "dev": true
+        }
+      }
+    },
+    "p-cancelable": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz",
+      "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==",
+      "dev": true
+    },
+    "p-defer": {
+      "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
       "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
       "dev": true
     },
     "p-each-series": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.1.0.tgz",
-      "integrity": "sha512-ZuRs1miPT4HrjFa+9fRfOFXxGJfORgelKV9f9nNOWw2gl6gVsRaVDOQP0+MI0G0wGKns1Yacsu0GjOFbTK0JFQ==",
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz",
+      "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==",
       "dev": true
     },
     "p-event": {
@@ -12775,13 +13465,13 @@
       }
     },
     "p-queue": {
-      "version": "6.6.1",
-      "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.1.tgz",
-      "integrity": "sha512-miQiSxLYPYBxGkrldecZC18OTLjdUqnlRebGzPRiVxB8mco7usCmm7hFuxiTvp93K18JnLtE4KMMycjAu/cQQg==",
+      "version": "6.6.2",
+      "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
+      "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
       "dev": true,
       "requires": {
         "eventemitter3": "^4.0.4",
-        "p-timeout": "^3.1.0"
+        "p-timeout": "^3.2.0"
       }
     },
     "p-reduce": {
@@ -12791,9 +13481,9 @@
       "dev": true
     },
     "p-retry": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.2.0.tgz",
-      "integrity": "sha512-jPH38/MRh263KKcq0wBNOGFJbm+U6784RilTmHjB/HM9kH9V8WlCpVUcdOmip9cjXOh6MxZ5yk1z2SjDUJfWmA==",
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.4.0.tgz",
+      "integrity": "sha512-gVB/tBsG+3AHI1SyDHRrX6n9ZL0Bcbifps9W9/Bgu3Oyu4/OrAh8SvDzDsvpP0oxfCt3oWNT+0fQ9LyUGwBTLg==",
       "dev": true,
       "requires": {
         "@types/retry": "^0.12.0",
@@ -12868,13 +13558,15 @@
       "dev": true
     },
     "parse-path": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.2.tgz",
-      "integrity": "sha512-HSqVz6iuXSiL8C1ku5Gl1Z5cwDd9Wo0q8CoffdAghP6bz8pJa1tcMC+m4N+z6VAS8QdksnIGq1TB6EgR4vPR6w==",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-4.0.3.tgz",
+      "integrity": "sha512-9Cepbp2asKnWTJ9x2kpw6Fe8y9JDbqwahGCTvklzd/cEq5C5JC59x2Xb0Kx+x0QZ8bvNquGO8/BWP0cwBHzSAA==",
       "dev": true,
       "requires": {
         "is-ssh": "^1.3.0",
-        "protocols": "^1.4.0"
+        "protocols": "^1.4.0",
+        "qs": "^6.9.4",
+        "query-string": "^6.13.8"
       }
     },
     "pascalcase": {
@@ -12883,6 +13575,12 @@
       "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
       "dev": true
     },
+    "path-dirname": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+      "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+      "dev": true
+    },
     "path-exists": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -12923,9 +13621,9 @@
       }
     },
     "pdfmake": {
-      "version": "0.1.68",
-      "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.68.tgz",
-      "integrity": "sha512-oE1VEjkluro3+QqvLbFgFU/rRgyKdbPy/Fh8SS/nsUxnsiUcm85ChpmD6YD0hQW1E0d3hppAo4Yh+xdXucenIA==",
+      "version": "0.1.70",
+      "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.1.70.tgz",
+      "integrity": "sha512-xPhkblaQ71U97qhRTPj/1HknAHHFZ3cPRmRdrqEWD2xXBcEjEM3Yw0MIjML8DRy9Dt9n6QRjHVf662f0eLtd7Q==",
       "requires": {
         "iconv-lite": "^0.6.2",
         "linebreak": "^1.0.2",
@@ -13028,15 +13726,6 @@
         }
       }
     },
-    "pkg-dir": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
-      "dev": true,
-      "requires": {
-        "find-up": "^4.0.0"
-      }
-    },
     "pkg-up": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
@@ -13126,14 +13815,38 @@
       "dev": true
     },
     "postcss": {
-      "version": "7.0.32",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
-      "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+      "version": "8.2.8",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.2.8.tgz",
+      "integrity": "sha512-1F0Xb2T21xET7oQV9eKuctbM9S7BC0fetoHCc4H13z0PT6haiRLP4T0ZY4XWh7iLP0usgqykT6p9B2RtOf4FPw==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
+        "colorette": "^1.2.2",
+        "nanoid": "^3.1.20",
+        "source-map": "^0.6.1"
+      },
+      "dependencies": {
+        "colorette": {
+          "version": "1.2.2",
+          "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
+          "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        }
+      }
+    },
+    "postcss-attribute-case-insensitive": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
+      "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^6.0.2"
       },
       "dependencies": {
         "chalk": {
@@ -13158,6 +13871,17 @@
             }
           }
         },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -13175,16 +13899,6 @@
         }
       }
     },
-    "postcss-attribute-case-insensitive": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz",
-      "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2",
-        "postcss-selector-parser": "^6.0.2"
-      }
-    },
     "postcss-calc": {
       "version": "7.0.2",
       "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz",
@@ -13194,12 +13908,62 @@
         "postcss": "^7.0.27",
         "postcss-selector-parser": "^6.0.2",
         "postcss-value-parser": "^4.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "postcss-cli": {
-      "version": "8.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.1.0.tgz",
-      "integrity": "sha512-FYuV5zyYX53X5RywInxjWLqHZ4oCBC3nDwrHYU3Z75mFqUo5IHfbeY593heWSagG90nPnXq3tXCck8+2CUl8EA==",
+      "version": "8.3.1",
+      "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz",
+      "integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==",
       "dev": true,
       "requires": {
         "chalk": "^4.0.0",
@@ -13212,6 +13976,7 @@
         "postcss-reporter": "^7.0.0",
         "pretty-hrtime": "^1.0.3",
         "read-cache": "^1.0.0",
+        "slash": "^3.0.0",
         "yargs": "^16.0.0"
       },
       "dependencies": {
@@ -13231,9 +13996,9 @@
           }
         },
         "cliui": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.1.tgz",
-          "integrity": "sha512-rcvHOWyGyid6I1WjT/3NatKj2kDt9OdSHSXpyLXaMWFbKpGACNW8pRhhdPUq9MWUOdwn8Rz9AVETjF4105rZZQ==",
+          "version": "7.0.4",
+          "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+          "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
           "dev": true,
           "requires": {
             "string-width": "^4.2.0",
@@ -13256,19 +14021,6 @@
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "cosmiconfig": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
-          "dev": true,
-          "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"
-          }
-        },
         "fs-extra": {
           "version": "9.0.1",
           "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
@@ -13281,42 +14033,6 @@
             "universalify": "^1.0.0"
           }
         },
-        "import-cwd": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
-          "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
-          "dev": true,
-          "requires": {
-            "import-from": "^3.0.0"
-          }
-        },
-        "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
-          "dev": true,
-          "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          }
-        },
-        "import-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
-          "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
-          "dev": true,
-          "requires": {
-            "resolve-from": "^5.0.0"
-          },
-          "dependencies": {
-            "resolve-from": {
-              "version": "5.0.0",
-              "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-              "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-              "dev": true
-            }
-          }
-        },
         "is-fullwidth-code-point": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
@@ -13324,43 +14040,23 @@
           "dev": true
         },
         "jsonfile": {
-          "version": "6.0.1",
-          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
-          "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.1.6",
-            "universalify": "^1.0.0"
-          }
-        },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
-          "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"
-          }
-        },
-        "postcss-load-config": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.0.tgz",
-          "integrity": "sha512-lErrN8imuEF1cSiHBV8MiR7HeuzlDpCGNtaMyYHlOBuJHHOGw6S4xOMZp8BbXPr7AGQp14L6PZDlIOpfFJ6f7w==",
-          "dev": true,
-          "requires": {
-            "cosmiconfig": "^7.0.0",
-            "import-cwd": "^3.0.0"
+            "universalify": "^2.0.0"
+          },
+          "dependencies": {
+            "universalify": {
+              "version": "2.0.0",
+              "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+              "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+              "dev": true
+            }
           }
         },
-        "resolve-from": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-          "dev": true
-        },
         "string-width": {
           "version": "4.2.0",
           "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
@@ -13399,30 +14095,30 @@
           }
         },
         "y18n": {
-          "version": "5.0.2",
-          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.2.tgz",
-          "integrity": "sha512-CkwaeZw6dQgqgPGeTWKMXCRmMcBgETFlTml1+ZOO+q7kGst8NREJ+eWwFNPVUQ4QGdAaklbqCZHH6Zuep1RjiA==",
+          "version": "5.0.5",
+          "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+          "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
           "dev": true
         },
         "yargs": {
-          "version": "16.0.3",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.0.3.tgz",
-          "integrity": "sha512-6+nLw8xa9uK1BOEOykaiYAJVh6/CjxWXK/q9b5FpRgNslt8s22F2xMBqVIKgCRjNgGvGPBy8Vog7WN7yh4amtA==",
+          "version": "16.2.0",
+          "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+          "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
           "dev": true,
           "requires": {
-            "cliui": "^7.0.0",
-            "escalade": "^3.0.2",
+            "cliui": "^7.0.2",
+            "escalade": "^3.1.1",
             "get-caller-file": "^2.0.5",
             "require-directory": "^2.1.1",
             "string-width": "^4.2.0",
-            "y18n": "^5.0.1",
-            "yargs-parser": "^20.0.0"
+            "y18n": "^5.0.5",
+            "yargs-parser": "^20.2.2"
           }
         },
         "yargs-parser": {
-          "version": "20.2.1",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.1.tgz",
-          "integrity": "sha512-yYsjuSkjbLMBp16eaOt7/siKTjNVjMm3SoJnIg3sEh/JsvqVVDyjRKmaJV4cl+lNIgq6QEco2i3gDebJl7/vLA==",
+          "version": "20.2.4",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+          "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
           "dev": true
         }
       }
@@ -13435,6 +14131,56 @@
       "requires": {
         "postcss": "^7.0.2",
         "postcss-values-parser": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "postcss-color-gray": {
@@ -13446,17 +14192,117 @@
         "@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.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
-      "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.14",
-        "postcss-values-parser": "^2.0.1"
-      }
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-color-hex-alpha": {
+      "version": "5.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz",
+      "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.14",
+        "postcss-values-parser": "^2.0.1"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
     },
     "postcss-color-mod-function": {
       "version": "3.0.3",
@@ -13467,6 +14313,56 @@
         "@csstools/convert-colors": "^1.4.0",
         "postcss": "^7.0.2",
         "postcss-values-parser": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "postcss-color-rebeccapurple": {
@@ -13477,6 +14373,56 @@
       "requires": {
         "postcss": "^7.0.2",
         "postcss-values-parser": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "postcss-colormin": {
@@ -13492,11 +14438,59 @@
         "postcss-value-parser": "^3.0.0"
       },
       "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
         "postcss-value-parser": {
           "version": "3.3.1",
           "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
           "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
           "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -13510,31 +14504,179 @@
         "postcss-value-parser": "^3.0.0"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-custom-media": {
-      "version": "7.0.8",
-      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
-      "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.14"
-      }
-    },
-    "postcss-custom-properties": {
-      "version": "8.0.11",
-      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
-      "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
-      "dev": true,
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-custom-media": {
+      "version": "7.0.8",
+      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz",
+      "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.14"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-custom-properties": {
+      "version": "8.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz",
+      "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==",
+      "dev": true,
       "requires": {
         "postcss": "^7.0.17",
         "postcss-values-parser": "^2.0.1"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
     "postcss-custom-selectors": {
@@ -13547,12 +14689,45 @@
         "postcss-selector-parser": "^5.0.0-rc.3"
       },
       "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
         "cssesc": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
           "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
           "dev": true
         },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
         "postcss-selector-parser": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
@@ -13563,6 +14738,21 @@
             "indexes-of": "^1.0.1",
             "uniq": "^1.0.1"
           }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -13576,12 +14766,45 @@
         "postcss-selector-parser": "^5.0.0-rc.3"
       },
       "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
         "cssesc": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
           "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
           "dev": true
         },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
         "postcss-selector-parser": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
@@ -13592,6 +14815,21 @@
             "indexes-of": "^1.0.1",
             "uniq": "^1.0.1"
           }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
@@ -13602,92 +14840,65 @@
       "dev": true,
       "requires": {
         "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "postcss-discard-duplicates": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
-      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      }
-    },
-    "postcss-discard-empty": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
-      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      }
-    },
-    "postcss-discard-overridden": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
-      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+    "postcss-discard-duplicates": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
+      "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
       "dev": true,
       "requires": {
         "postcss": "^7.0.0"
-      }
-    },
-    "postcss-double-position-gradients": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
-      "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.5",
-        "postcss-values-parser": "^2.0.0"
-      }
-    },
-    "postcss-env-function": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
-      "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      }
-    },
-    "postcss-focus-visible": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
-      "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-focus-within": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
-      "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-font-variant": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz",
-      "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-functions": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz",
-      "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.2",
-        "object-assign": "^4.1.1",
-        "postcss": "^6.0.9",
-        "postcss-value-parser": "^3.3.0"
       },
       "dependencies": {
         "chalk": {
@@ -13699,337 +14910,173 @@
             "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
         "postcss": {
-          "version": "6.0.23",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "chalk": "^2.4.1",
+            "chalk": "^2.4.2",
             "source-map": "^0.6.1",
-            "supports-color": "^5.4.0"
+            "supports-color": "^6.1.0"
           }
         },
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        },
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-gap-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
-      "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-html": {
-      "version": "0.36.0",
-      "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
-      "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
-      "dev": true,
-      "requires": {
-        "htmlparser2": "^3.10.0"
-      }
-    },
-    "postcss-image-set-function": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
-      "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      }
-    },
-    "postcss-import": {
-      "version": "12.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz",
-      "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==",
+    "postcss-discard-empty": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
+      "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
       "dev": true,
       "requires": {
-        "postcss": "^7.0.1",
-        "postcss-value-parser": "^3.2.3",
-        "read-cache": "^1.0.0",
-        "resolve": "^1.1.7"
+        "postcss": "^7.0.0"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-initial": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz",
-      "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
-      "dev": true,
-      "requires": {
-        "lodash.template": "^4.5.0",
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-js": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz",
-      "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==",
-      "dev": true,
-      "requires": {
-        "camelcase-css": "^2.0.1",
-        "postcss": "^7.0.18"
-      }
-    },
-    "postcss-lab-function": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
-      "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
+    "postcss-discard-overridden": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
+      "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
       "dev": true,
       "requires": {
-        "@csstools/convert-colors": "^1.4.0",
-        "postcss": "^7.0.2",
-        "postcss-values-parser": "^2.0.0"
-      }
-    },
-    "postcss-less": {
-      "version": "3.1.4",
-      "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
-      "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.14"
-      }
-    },
-    "postcss-load-config": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz",
-      "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==",
-      "dev": true,
-      "requires": {
-        "cosmiconfig": "^5.0.0",
-        "import-cwd": "^2.0.0"
-      }
-    },
-    "postcss-logical": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
-      "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-media-minmax": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
-      "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-media-query-parser": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
-      "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
-      "dev": true
-    },
-    "postcss-merge-longhand": {
-      "version": "4.0.11",
-      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
-      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
-      "dev": true,
-      "requires": {
-        "css-color-names": "0.0.4",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0",
-        "stylehacks": "^4.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-merge-rules": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
-      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
-      "dev": true,
-      "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": "^7.0.0"
       },
       "dependencies": {
-        "dot-prop": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
-          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "dev": true,
           "requires": {
-            "is-obj": "^2.0.0"
+            "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
-          "dev": true
-        },
-        "postcss-selector-parser": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
-          "dev": true,
-          "requires": {
-            "dot-prop": "^5.2.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
-          }
-        }
-      }
-    },
-    "postcss-minify-font-values": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
-      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-minify-gradients": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
-      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "is-color-stop": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-minify-params": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
-      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
-      "dev": true,
-      "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"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-minify-selectors": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
-      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
-      "dev": true,
-      "requires": {
-        "alphanum-sort": "^1.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "dot-prop": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
-          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "is-obj": "^2.0.0"
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
           }
         },
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
-        "postcss-selector-parser": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
           "dev": true,
           "requires": {
-            "dot-prop": "^5.2.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
+            "has-flag": "^3.0.0"
           }
         }
       }
     },
-    "postcss-modules": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-2.0.0.tgz",
-      "integrity": "sha512-eqp+Bva+U2cwQO7dECJ8/V+X+uH1HduNeITB0CPPFAu6d/8LKQ32/j+p9rQ2YL1QytVcrNU0X+fBqgGmQIA1Rw==",
-      "dev": true,
-      "requires": {
-        "css-modules-loader-core": "^1.1.0",
-        "generic-names": "^2.0.1",
-        "lodash.camelcase": "^4.3.0",
-        "postcss": "^7.0.1",
-        "string-hash": "^1.1.1"
-      }
-    },
-    "postcss-modules-extract-imports": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz",
-      "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=",
+    "postcss-double-position-gradients": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz",
+      "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==",
       "dev": true,
       "requires": {
-        "postcss": "^6.0.1"
+        "postcss": "^7.0.5",
+        "postcss-values-parser": "^2.0.0"
       },
       "dependencies": {
         "chalk": {
@@ -14041,17 +15088,28 @@
             "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
         "postcss": {
-          "version": "6.0.23",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "chalk": "^2.4.1",
+            "chalk": "^2.4.2",
             "source-map": "^0.6.1",
-            "supports-color": "^5.4.0"
+            "supports-color": "^6.1.0"
           }
         },
         "source-map": {
@@ -14059,17 +15117,26 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
-        }
-      }
-    },
-    "postcss-modules-local-by-default": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
-      "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-env-function": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz",
+      "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==",
       "dev": true,
       "requires": {
-        "css-selector-tokenizer": "^0.7.0",
-        "postcss": "^6.0.1"
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
       },
       "dependencies": {
         "chalk": {
@@ -14081,17 +15148,28 @@
             "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
         "postcss": {
-          "version": "6.0.23",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "chalk": "^2.4.1",
+            "chalk": "^2.4.2",
             "source-map": "^0.6.1",
-            "supports-color": "^5.4.0"
+            "supports-color": "^6.1.0"
           }
         },
         "source-map": {
@@ -14099,17 +15177,25 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-modules-scope": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
-      "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
+    "postcss-focus-visible": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz",
+      "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==",
       "dev": true,
       "requires": {
-        "css-selector-tokenizer": "^0.7.0",
-        "postcss": "^6.0.1"
+        "postcss": "^7.0.2"
       },
       "dependencies": {
         "chalk": {
@@ -14121,17 +15207,28 @@
             "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
         "postcss": {
-          "version": "6.0.23",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "chalk": "^2.4.1",
+            "chalk": "^2.4.2",
             "source-map": "^0.6.1",
-            "supports-color": "^5.4.0"
+            "supports-color": "^6.1.0"
           }
         },
         "source-map": {
@@ -14139,17 +15236,25 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-modules-values": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
-      "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
+    "postcss-focus-within": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz",
+      "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==",
       "dev": true,
       "requires": {
-        "icss-replace-symbols": "^1.1.0",
-        "postcss": "^6.0.1"
+        "postcss": "^7.0.2"
       },
       "dependencies": {
         "chalk": {
@@ -14161,17 +15266,28 @@
             "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
         "postcss": {
-          "version": "6.0.23",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
-          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "chalk": "^2.4.1",
+            "chalk": "^2.4.2",
             "source-map": "^0.6.1",
-            "supports-color": "^5.4.0"
+            "supports-color": "^6.1.0"
           }
         },
         "source-map": {
@@ -14179,1756 +15295,4919 @@
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
           "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-nested": {
-      "version": "4.2.3",
-      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz",
-      "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.32",
-        "postcss-selector-parser": "^6.0.2"
-      }
-    },
-    "postcss-nesting": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
-      "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+    "postcss-font-variant": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz",
+      "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==",
       "dev": true,
       "requires": {
         "postcss": "^7.0.2"
-      }
-    },
-    "postcss-normalize-charset": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
-      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.0"
-      }
-    },
-    "postcss-normalize-display-values": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
-      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-normalize-positions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
-      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+    "postcss-functions": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz",
+      "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=",
       "dev": true,
       "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
+        "glob": "^7.1.2",
+        "object-assign": "^4.1.1",
+        "postcss": "^6.0.9",
+        "postcss-value-parser": "^3.3.0"
       },
       "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/postcss/-/postcss-6.0.23.tgz",
+          "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.1",
+            "source-map": "^0.6.1",
+            "supports-color": "^5.4.0"
+          }
+        },
         "postcss-value-parser": {
           "version": "3.3.1",
           "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
           "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
           "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
         }
       }
     },
-    "postcss-normalize-repeat-style": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
-      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+    "postcss-gap-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz",
+      "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==",
       "dev": true,
       "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": "^7.0.2"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-normalize-string": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
-      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
-      }
-    },
-    "postcss-normalize-timing-functions": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
-      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
-      "dev": true,
-      "requires": {
-        "cssnano-util-get-match": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-normalize-unicode": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
-      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+    "postcss-html": {
+      "version": "0.36.0",
+      "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz",
+      "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
+        "htmlparser2": "^3.10.0"
       }
     },
-    "postcss-normalize-url": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
-      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+    "postcss-image-set-function": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz",
+      "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==",
       "dev": true,
       "requires": {
-        "is-absolute-url": "^2.0.0",
-        "normalize-url": "^3.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-normalize-whitespace": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
-      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+    "postcss-import": {
+      "version": "14.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.0.tgz",
+      "integrity": "sha512-gFDDzXhqr9ELmnLHgCC3TbGfA6Dm/YMb/UN8/f7Uuq4fL7VTk2vOIj6hwINEwbokEmp123bLD7a5m+E+KIetRg==",
       "dev": true,
       "requires": {
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
-      },
-      "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
-          "dev": true
-        }
+        "postcss-value-parser": "^4.0.0",
+        "read-cache": "^1.0.0",
+        "resolve": "^1.1.7"
       }
     },
-    "postcss-ordered-values": {
-      "version": "4.1.2",
-      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
-      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+    "postcss-initial": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz",
+      "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==",
       "dev": true,
       "requires": {
-        "cssnano-util-get-arguments": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
+        "lodash.template": "^4.5.0",
+        "postcss": "^7.0.2"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-overflow-shorthand": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
-      "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-page-break": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
-      "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+    "postcss-js": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz",
+      "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==",
       "dev": true,
       "requires": {
-        "postcss": "^7.0.2"
+        "camelcase-css": "^2.0.1",
+        "postcss": "^8.1.6"
       }
     },
-    "postcss-place": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
-      "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+    "postcss-lab-function": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz",
+      "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==",
       "dev": true,
       "requires": {
+        "@csstools/convert-colors": "^1.4.0",
         "postcss": "^7.0.2",
         "postcss-values-parser": "^2.0.0"
-      }
-    },
-    "postcss-preset-env": {
-      "version": "6.7.0",
-      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
-      "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
-      "dev": true,
-      "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.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
-      "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2",
-        "postcss-selector-parser": "^5.0.0-rc.3"
       },
       "dependencies": {
-        "cssesc": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
-          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
-        "postcss-selector-parser": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
-          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
           "dev": true,
           "requires": {
-            "cssesc": "^2.0.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
+            "has-flag": "^3.0.0"
           }
         }
       }
     },
-    "postcss-reduce-initial": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
-      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+    "postcss-less": {
+      "version": "3.1.4",
+      "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz",
+      "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.0.0",
-        "caniuse-api": "^3.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0"
+        "postcss": "^7.0.14"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "postcss-reduce-transforms": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
-      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+    "postcss-load-config": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.0.tgz",
+      "integrity": "sha512-lErrN8imuEF1cSiHBV8MiR7HeuzlDpCGNtaMyYHlOBuJHHOGw6S4xOMZp8BbXPr7AGQp14L6PZDlIOpfFJ6f7w==",
       "dev": true,
       "requires": {
-        "cssnano-util-get-match": "^4.0.0",
-        "has": "^1.0.0",
-        "postcss": "^7.0.0",
-        "postcss-value-parser": "^3.0.0"
+        "cosmiconfig": "^7.0.0",
+        "import-cwd": "^3.0.0"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "cosmiconfig": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+          "dev": true,
+          "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"
+          }
+        },
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.1.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
+          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+          "dev": true,
+          "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"
+          }
+        },
+        "resolve-from": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+          "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
           "dev": true
         }
       }
     },
-    "postcss-replace-overflow-wrap": {
+    "postcss-logical": {
       "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
-      "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+      "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz",
+      "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==",
       "dev": true,
       "requires": {
         "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "postcss-reporter": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.1.tgz",
-      "integrity": "sha512-R9AK80KIqqMb+lwGRBcRkXS7r96VCTxrZvvrfibyA/dWjqctwx7leHMCC05A9HbW8PnChwOWwrmISwp5HQu5wg==",
-      "dev": true,
-      "requires": {
-        "colorette": "^1.2.1",
-        "lodash.difference": "^4.5.0",
-        "lodash.forown": "^4.4.0",
-        "lodash.get": "^4.4.2",
-        "lodash.groupby": "^4.6.0",
-        "lodash.sortby": "^4.7.0",
-        "log-symbols": "^4.0.0"
-      }
-    },
-    "postcss-resolve-nested-selector": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
-      "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
-      "dev": true
-    },
-    "postcss-safe-parser": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
-      "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.26"
-      }
-    },
-    "postcss-sass": {
-      "version": "0.4.4",
-      "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
-      "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
-      "dev": true,
-      "requires": {
-        "gonzales-pe": "^4.3.0",
-        "postcss": "^7.0.21"
-      }
-    },
-    "postcss-scss": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
-      "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.6"
-      }
-    },
-    "postcss-selector-matches": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
-      "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "postcss": "^7.0.2"
-      }
-    },
-    "postcss-selector-not": {
+    "postcss-media-minmax": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz",
-      "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==",
+      "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz",
+      "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==",
       "dev": true,
       "requires": {
-        "balanced-match": "^1.0.0",
         "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
       }
     },
-    "postcss-selector-parser": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
-      "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
-      "dev": true,
-      "requires": {
-        "cssesc": "^3.0.0",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
-      }
+    "postcss-media-query-parser": {
+      "version": "0.2.3",
+      "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+      "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
+      "dev": true
     },
-    "postcss-svgo": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
-      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+    "postcss-merge-longhand": {
+      "version": "4.0.11",
+      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
+      "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
       "dev": true,
       "requires": {
-        "is-svg": "^3.0.0",
+        "css-color-names": "0.0.4",
         "postcss": "^7.0.0",
         "postcss-value-parser": "^3.0.0",
-        "svgo": "^1.0.0"
+        "stylehacks": "^4.0.0"
       },
       "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
         "postcss-value-parser": {
           "version": "3.3.1",
           "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
           "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
           "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "postcss-syntax": {
-      "version": "0.36.2",
-      "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
-      "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
-      "dev": true
-    },
-    "postcss-unique-selectors": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
-      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+    "postcss-merge-rules": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
+      "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
       "dev": true,
       "requires": {
-        "alphanum-sort": "^1.0.0",
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "cssnano-util-same-parent": "^4.0.0",
         "postcss": "^7.0.0",
-        "uniqs": "^2.0.0"
-      }
-    },
-    "postcss-value-parser": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
-      "dev": true
-    },
-    "postcss-values-parser": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
-      "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
-      "dev": true,
-      "requires": {
-        "flatten": "^1.0.2",
-        "indexes-of": "^1.0.1",
-        "uniq": "^1.0.1"
-      }
-    },
-    "prelude-ls": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
-      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
-      "dev": true
-    },
-    "prettier": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz",
-      "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==",
-      "dev": true
-    },
-    "prettier-linter-helpers": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
-      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
-      "dev": true,
-      "requires": {
-        "fast-diff": "^1.1.2"
-      }
-    },
-    "prettier-plugin-organize-imports": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-1.1.1.tgz",
-      "integrity": "sha512-rFA1lnek1FYkMGthm4xBKME41qUKItTovuo24bCGZu/Vu1n3gW71UPLAkIdwewwkZCe29gRVweSOPXvAdckFuw==",
-      "dev": true
-    },
-    "pretty-hrtime": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
-      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
-      "dev": true
-    },
-    "printj": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
-      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
-    },
-    "process-nextick-args": {
-      "version": "2.0.1",
+        "postcss-selector-parser": "^3.0.0",
+        "vendors": "^1.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "dot-prop": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+          "dev": true,
+          "requires": {
+            "is-obj": "^2.0.0"
+          }
+        },
+        "is-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-font-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
+      "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-gradients": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
+      "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "is-color-stop": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-params": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
+      "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+      "dev": true,
+      "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"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-minify-selectors": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
+      "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "dot-prop": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+          "dev": true,
+          "requires": {
+            "is-obj": "^2.0.0"
+          }
+        },
+        "is-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+          "dev": true,
+          "requires": {
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-modules": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-4.0.0.tgz",
+      "integrity": "sha512-ghS/ovDzDqARm4Zj6L2ntadjyQMoyJmi0JkLlYtH2QFLrvNlxH5OAVRPWPeKilB0pY7SbuhO173KOWkPAxRJcw==",
+      "dev": true,
+      "requires": {
+        "generic-names": "^2.0.1",
+        "icss-replace-symbols": "^1.1.0",
+        "lodash.camelcase": "^4.3.0",
+        "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",
+        "string-hash": "^1.1.1"
+      }
+    },
+    "postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "dev": true
+    },
+    "postcss-modules-local-by-default": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz",
+      "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==",
+      "dev": true,
+      "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.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.4"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+          "dev": true,
+          "requires": {
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
+          }
+        }
+      }
+    },
+    "postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "dev": true,
+      "requires": {
+        "icss-utils": "^5.0.0"
+      }
+    },
+    "postcss-nested": {
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.5.tgz",
+      "integrity": "sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==",
+      "dev": true,
+      "requires": {
+        "postcss-selector-parser": "^6.0.4"
+      },
+      "dependencies": {
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+          "dev": true,
+          "requires": {
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
+          }
+        }
+      }
+    },
+    "postcss-nesting": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz",
+      "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-charset": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
+      "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-display-values": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
+      "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-positions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
+      "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-repeat-style": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
+      "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+      "dev": true,
+      "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"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-string": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
+      "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-timing-functions": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
+      "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-unicode": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
+      "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-url": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
+      "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+      "dev": true,
+      "requires": {
+        "is-absolute-url": "^2.0.0",
+        "normalize-url": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-normalize-whitespace": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
+      "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-ordered-values": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
+      "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-arguments": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-overflow-shorthand": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz",
+      "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-page-break": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz",
+      "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-place": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz",
+      "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-values-parser": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-preset-env": {
+      "version": "6.7.0",
+      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz",
+      "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==",
+      "dev": true,
+      "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"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-pseudo-class-any-link": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz",
+      "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2",
+        "postcss-selector-parser": "^5.0.0-rc.3"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "cssesc": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz",
+          "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-selector-parser": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz",
+          "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==",
+          "dev": true,
+          "requires": {
+            "cssesc": "^2.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-initial": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
+      "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+      "dev": true,
+      "requires": {
+        "browserslist": "^4.0.0",
+        "caniuse-api": "^3.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reduce-transforms": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
+      "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+      "dev": true,
+      "requires": {
+        "cssnano-util-get-match": "^4.0.0",
+        "has": "^1.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-replace-overflow-wrap": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz",
+      "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-reporter": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz",
+      "integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==",
+      "dev": true,
+      "requires": {
+        "colorette": "^1.2.1",
+        "lodash.difference": "^4.5.0",
+        "lodash.forown": "^4.4.0",
+        "lodash.get": "^4.4.2",
+        "lodash.groupby": "^4.6.0",
+        "lodash.sortby": "^4.7.0"
+      }
+    },
+    "postcss-resolve-nested-selector": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
+      "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
+      "dev": true
+    },
+    "postcss-safe-parser": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz",
+      "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.26"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-sass": {
+      "version": "0.4.4",
+      "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz",
+      "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==",
+      "dev": true,
+      "requires": {
+        "gonzales-pe": "^4.3.0",
+        "postcss": "^7.0.21"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-scss": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz",
+      "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==",
+      "dev": true,
+      "requires": {
+        "postcss": "^7.0.6"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-selector-matches": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz",
+      "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-selector-not": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz",
+      "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==",
+      "dev": true,
+      "requires": {
+        "balanced-match": "^1.0.0",
+        "postcss": "^7.0.2"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-selector-parser": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
+      "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+      "dev": true,
+      "requires": {
+        "cssesc": "^3.0.0",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "postcss-svgo": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
+      "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
+      "dev": true,
+      "requires": {
+        "is-svg": "^3.0.0",
+        "postcss": "^7.0.0",
+        "postcss-value-parser": "^3.0.0",
+        "svgo": "^1.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "svgo": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
+          "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
+          "dev": true,
+          "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"
+          }
+        }
+      }
+    },
+    "postcss-syntax": {
+      "version": "0.36.2",
+      "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz",
+      "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==",
+      "dev": true
+    },
+    "postcss-unique-selectors": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
+      "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+      "dev": true,
+      "requires": {
+        "alphanum-sort": "^1.0.0",
+        "postcss": "^7.0.0",
+        "uniqs": "^2.0.0"
+      },
+      "dependencies": {
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
+          }
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        }
+      }
+    },
+    "postcss-value-parser": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
+      "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+      "dev": true
+    },
+    "postcss-values-parser": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz",
+      "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==",
+      "dev": true,
+      "requires": {
+        "flatten": "^1.0.2",
+        "indexes-of": "^1.0.1",
+        "uniq": "^1.0.1"
+      }
+    },
+    "prelude-ls": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+      "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+      "dev": true
+    },
+    "prettier": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.2.1.tgz",
+      "integrity": "sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==",
+      "dev": true
+    },
+    "prettier-linter-helpers": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+      "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+      "dev": true,
+      "requires": {
+        "fast-diff": "^1.1.2"
+      }
+    },
+    "prettier-plugin-organize-imports": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-1.1.1.tgz",
+      "integrity": "sha512-rFA1lnek1FYkMGthm4xBKME41qUKItTovuo24bCGZu/Vu1n3gW71UPLAkIdwewwkZCe29gRVweSOPXvAdckFuw==",
+      "dev": true
+    },
+    "pretty-hrtime": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
+      "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
+      "dev": true
+    },
+    "printj": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz",
+      "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ=="
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
       "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
     },
-    "progress": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
-      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+    "progress": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+      "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+      "dev": true
+    },
+    "promise.series": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz",
+      "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=",
+      "dev": true
+    },
+    "prosemirror-commands": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.4.tgz",
+      "integrity": "sha512-kj4Qi+8h3EpJtZuuEDwZ9h2/QNGWDsIX/CzjmClxi9GhxWyBUMVUvIFk0mgdqHyX20lLeGmOpc0TLA5aPzgpWg==",
+      "requires": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.0.0"
+      }
+    },
+    "prosemirror-dropcursor": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz",
+      "integrity": "sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==",
+      "requires": {
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.1.0",
+        "prosemirror-view": "^1.1.0"
+      }
+    },
+    "prosemirror-example-setup": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.1.2.tgz",
+      "integrity": "sha512-MTpIMyqk08jFnzxeRMCinCEMtVSTUtxKgQBGxfCbVe9C6zIOqp9qZZJz5Ojaad1GETySyuj8+OIHHvQsIaaaGQ==",
+      "requires": {
+        "prosemirror-commands": "^1.0.0",
+        "prosemirror-dropcursor": "^1.0.0",
+        "prosemirror-gapcursor": "^1.0.0",
+        "prosemirror-history": "^1.0.0",
+        "prosemirror-inputrules": "^1.0.0",
+        "prosemirror-keymap": "^1.0.0",
+        "prosemirror-menu": "^1.0.0",
+        "prosemirror-schema-list": "^1.0.0",
+        "prosemirror-state": "^1.0.0"
+      }
+    },
+    "prosemirror-gapcursor": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz",
+      "integrity": "sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==",
+      "requires": {
+        "prosemirror-keymap": "^1.0.0",
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-view": "^1.0.0"
+      }
+    },
+    "prosemirror-history": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.3.tgz",
+      "integrity": "sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==",
+      "requires": {
+        "prosemirror-state": "^1.2.2",
+        "prosemirror-transform": "^1.0.0",
+        "rope-sequence": "^1.3.0"
+      }
+    },
+    "prosemirror-inputrules": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz",
+      "integrity": "sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==",
+      "requires": {
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.0.0"
+      }
+    },
+    "prosemirror-keymap": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz",
+      "integrity": "sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==",
+      "requires": {
+        "prosemirror-state": "^1.0.0",
+        "w3c-keyname": "^2.2.0"
+      }
+    },
+    "prosemirror-markdown": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.5.1.tgz",
+      "integrity": "sha512-QvucPHx+gKOQW1SETKUysrful9VBjKqpCFmPotgLfVZ3BdQEGy/NEIFhaXXo3TcuW316MMnKfA90K7GE5I7z8A==",
+      "requires": {
+        "markdown-it": "^10.0.0",
+        "prosemirror-model": "^1.0.0"
+      }
+    },
+    "prosemirror-menu": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.1.4.tgz",
+      "integrity": "sha512-2ROsji/X9ciDnVSRvSTqFygI34GEdHfQSsK4zBKjPxSEroeiHHcdRMS1ofNIf2zM0Vpp5/YqfpxynElymQkqzg==",
+      "requires": {
+        "crelt": "^1.0.0",
+        "prosemirror-commands": "^1.0.0",
+        "prosemirror-history": "^1.0.0",
+        "prosemirror-state": "^1.0.0"
+      }
+    },
+    "prosemirror-model": {
+      "version": "1.11.0",
+      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.11.0.tgz",
+      "integrity": "sha512-GqoAz/mIYjdv8gVYJ8mWFKpHoTxn/lXq4tXJ6bTVxs+rem2LzMYXrNVXfucGtfsgqsJlRIgng/ByG9j7Q8XDrg==",
+      "requires": {
+        "orderedmap": "^1.1.0"
+      }
+    },
+    "prosemirror-schema-list": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz",
+      "integrity": "sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==",
+      "requires": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-transform": "^1.0.0"
+      }
+    },
+    "prosemirror-state": {
+      "version": "1.3.4",
+      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.4.tgz",
+      "integrity": "sha512-Xkkrpd1y/TQ6HKzN3agsQIGRcLckUMA9u3j207L04mt8ToRgpGeyhbVv0HI7omDORIBHjR29b7AwlATFFf2GLA==",
+      "requires": {
+        "prosemirror-model": "^1.0.0",
+        "prosemirror-transform": "^1.0.0"
+      }
+    },
+    "prosemirror-transform": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.7.tgz",
+      "integrity": "sha512-/107Lo2zeDgXuJBxb8s/clNu0Z2W8Gv3MKmkuSS/68Mcr7LBaUnN/Hj2g+GUxEJ7MpExCzFs65GrsNo2K9rxUQ==",
+      "requires": {
+        "prosemirror-model": "^1.0.0"
+      }
+    },
+    "prosemirror-view": {
+      "version": "1.18.1",
+      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.18.1.tgz",
+      "integrity": "sha512-TZd8byDRfdopLiokBY7T27msCSfWqqRxWs/LnBbdI030F+iI2kS+tO59/XFnpZxMLFKlJgOgGGhM9SzD1Nwdxw==",
+      "requires": {
+        "prosemirror-model": "^1.1.0",
+        "prosemirror-state": "^1.0.0",
+        "prosemirror-transform": "^1.1.0"
+      }
+    },
+    "protocols": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz",
+      "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==",
+      "dev": true
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "dev": true,
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "punycode": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
       "dev": true
     },
-    "promise.series": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/promise.series/-/promise.series-0.2.0.tgz",
-      "integrity": "sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=",
+    "purgecss": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-3.1.3.tgz",
+      "integrity": "sha512-hRSLN9mguJ2lzlIQtW4qmPS2kh6oMnA9RxdIYK8sz18QYqd6ePp4GNDl18oWHA1f2v2NEQIh51CO8s/E3YGckQ==",
+      "dev": true,
+      "requires": {
+        "commander": "^6.0.0",
+        "glob": "^7.0.0",
+        "postcss": "^8.2.1",
+        "postcss-selector-parser": "^6.0.2"
+      }
+    },
+    "q": {
+      "version": "1.5.1",
+      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
+      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
       "dev": true
     },
-    "prosemirror-commands": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.1.4.tgz",
-      "integrity": "sha512-kj4Qi+8h3EpJtZuuEDwZ9h2/QNGWDsIX/CzjmClxi9GhxWyBUMVUvIFk0mgdqHyX20lLeGmOpc0TLA5aPzgpWg==",
+    "qs": {
+      "version": "6.9.6",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz",
+      "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==",
+      "dev": true
+    },
+    "query-string": {
+      "version": "6.13.8",
+      "resolved": "https://registry.npmjs.org/query-string/-/query-string-6.13.8.tgz",
+      "integrity": "sha512-jxJzQI2edQPE/NPUOusNjO/ZOGqr1o2OBa/3M00fU76FsLXDVbJDv/p7ng5OdQyorKrkRz1oqfwmbe5MAMePQg==",
+      "dev": true,
       "requires": {
-        "prosemirror-model": "^1.0.0",
-        "prosemirror-state": "^1.0.0",
-        "prosemirror-transform": "^1.0.0"
+        "decode-uri-component": "^0.2.0",
+        "split-on-first": "^1.0.0",
+        "strict-uri-encode": "^2.0.0"
       }
     },
-    "prosemirror-dropcursor": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.2.tgz",
-      "integrity": "sha512-4c94OUGyobGnwcQI70OXyMhE/9T4aTgjU+CHxkd5c7D+jH/J0mKM/lk+jneFVKt7+E4/M0D9HzRPifu8U28Thw==",
+    "quick-lru": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+      "dev": true
+    },
+    "quote-stream": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
+      "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=",
       "requires": {
-        "prosemirror-state": "^1.0.0",
-        "prosemirror-transform": "^1.1.0",
-        "prosemirror-view": "^1.1.0"
+        "buffer-equal": "0.0.1",
+        "minimist": "^1.1.3",
+        "through2": "^2.0.0"
+      },
+      "dependencies": {
+        "through2": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+          "requires": {
+            "readable-stream": "~2.3.6",
+            "xtend": "~4.0.1"
+          }
+        }
+      }
+    },
+    "raf": {
+      "version": "3.4.1",
+      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+      "requires": {
+        "performance-now": "^2.1.0"
+      }
+    },
+    "randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dev": true,
+      "requires": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "dev": true,
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      },
+      "dependencies": {
+        "strip-json-comments": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+          "dev": true
+        }
+      }
+    },
+    "read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+      "dev": true,
+      "requires": {
+        "pify": "^2.3.0"
+      }
+    },
+    "read-pkg": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+      "dev": true,
+      "requires": {
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      },
+      "dependencies": {
+        "hosted-git-info": {
+          "version": "2.8.8",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz",
+          "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==",
+          "dev": true
+        },
+        "normalize-package-data": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+          "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^2.1.4",
+            "resolve": "^1.10.0",
+            "semver": "2 || 3 || 4 || 5",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "parse-json": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+          "dev": true,
+          "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"
+          }
+        },
+        "semver": {
+          "version": "5.7.1",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+          "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+          "dev": true
+        }
+      }
+    },
+    "read-pkg-up": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+      "dev": true,
+      "requires": {
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
+        }
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.7",
+      "resolved": "https://registry.npmjs.org/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"
+      }
+    },
+    "readdirp": {
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
+      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+      "dev": true,
+      "requires": {
+        "picomatch": "^2.2.1"
+      }
+    },
+    "redent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+      "dev": true,
+      "requires": {
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
+      }
+    },
+    "redeyed": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
+      "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
+      "dev": true,
+      "requires": {
+        "esprima": "~4.0.0"
+      }
+    },
+    "reduce-css-calc": {
+      "version": "2.1.8",
+      "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz",
+      "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==",
+      "dev": true,
+      "requires": {
+        "css-unit-converter": "^1.1.1",
+        "postcss-value-parser": "^3.3.0"
+      },
+      "dependencies": {
+        "postcss-value-parser": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
+          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+          "dev": true
+        }
+      }
+    },
+    "redux": {
+      "version": "4.0.5",
+      "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz",
+      "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==",
+      "requires": {
+        "loose-envify": "^1.4.0",
+        "symbol-observable": "^1.2.0"
       }
     },
-    "prosemirror-example-setup": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-example-setup/-/prosemirror-example-setup-1.1.2.tgz",
-      "integrity": "sha512-MTpIMyqk08jFnzxeRMCinCEMtVSTUtxKgQBGxfCbVe9C6zIOqp9qZZJz5Ojaad1GETySyuj8+OIHHvQsIaaaGQ==",
+    "regenerate": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+      "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+      "dev": true
+    },
+    "regenerate-unicode-properties": {
+      "version": "8.2.0",
+      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
+      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+      "dev": true,
       "requires": {
-        "prosemirror-commands": "^1.0.0",
-        "prosemirror-dropcursor": "^1.0.0",
-        "prosemirror-gapcursor": "^1.0.0",
-        "prosemirror-history": "^1.0.0",
-        "prosemirror-inputrules": "^1.0.0",
-        "prosemirror-keymap": "^1.0.0",
-        "prosemirror-menu": "^1.0.0",
-        "prosemirror-schema-list": "^1.0.0",
-        "prosemirror-state": "^1.0.0"
+        "regenerate": "^1.4.0"
       }
     },
-    "prosemirror-gapcursor": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.1.5.tgz",
-      "integrity": "sha512-SjbUZq5pgsBDuV3hu8GqgIpZR5eZvGLM+gPQTqjVVYSMUCfKW3EGXTEYaLHEl1bGduwqNC95O3bZflgtAb4L6w==",
+    "regenerator-runtime": {
+      "version": "0.13.7",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+    },
+    "regenerator-transform": {
+      "version": "0.14.5",
+      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
+      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
+      "dev": true,
       "requires": {
-        "prosemirror-keymap": "^1.0.0",
-        "prosemirror-model": "^1.0.0",
-        "prosemirror-state": "^1.0.0",
-        "prosemirror-view": "^1.0.0"
+        "@babel/runtime": "^7.8.4"
       }
     },
-    "prosemirror-history": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.1.3.tgz",
-      "integrity": "sha512-zGDotijea+vnfnyyUGyiy1wfOQhf0B/b6zYcCouBV8yo6JmrE9X23M5q7Nf/nATywEZbgRLG70R4DmfSTC+gfg==",
+    "regex-not": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+      "dev": true,
       "requires": {
-        "prosemirror-state": "^1.2.2",
-        "prosemirror-transform": "^1.0.0",
-        "rope-sequence": "^1.3.0"
+        "extend-shallow": "^3.0.2",
+        "safe-regex": "^1.1.0"
       }
     },
-    "prosemirror-inputrules": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.1.2.tgz",
-      "integrity": "sha512-Ja5Z3BWestlHYGvtSGqyvxMeB8QEuBjlHM8YnKtLGUXMDp965qdDV4goV8lJb17kIWHk7e7JNj6Catuoa3302g==",
+    "regexp.prototype.flags": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
+      "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
       "requires": {
-        "prosemirror-state": "^1.0.0",
-        "prosemirror-transform": "^1.0.0"
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
       }
     },
-    "prosemirror-keymap": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.1.4.tgz",
-      "integrity": "sha512-Al8cVUOnDFL4gcI5IDlG6xbZ0aOD/i3B17VT+1JbHWDguCgt/lBHVTHUBcKvvbSg6+q/W4Nj1Fu6bwZSca3xjg==",
+    "regexpp": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+      "dev": true
+    },
+    "regexpu-core": {
+      "version": "4.7.1",
+      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
+      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+      "dev": true,
       "requires": {
-        "prosemirror-state": "^1.0.0",
-        "w3c-keyname": "^2.2.0"
+        "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"
       }
     },
-    "prosemirror-markdown": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.5.0.tgz",
-      "integrity": "sha512-ugTyZfTu1l2E3EI6+DwD917mz2Sk5E4R01Nh67yMffGg4S9ZetC81g1VIKGCaak4jnoP4BMUIOUJyXAS6xFLaA==",
+    "registry-auth-token": {
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz",
+      "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==",
+      "dev": true,
       "requires": {
-        "markdown-it": "^10.0.0",
-        "prosemirror-model": "^1.0.0"
+        "rc": "^1.2.8"
       }
     },
-    "prosemirror-menu": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.1.4.tgz",
-      "integrity": "sha512-2ROsji/X9ciDnVSRvSTqFygI34GEdHfQSsK4zBKjPxSEroeiHHcdRMS1ofNIf2zM0Vpp5/YqfpxynElymQkqzg==",
+    "regjsgen": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
+      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
+      "dev": true
+    },
+    "regjsparser": {
+      "version": "0.6.9",
+      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
+      "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
+      "dev": true,
       "requires": {
-        "crelt": "^1.0.0",
-        "prosemirror-commands": "^1.0.0",
-        "prosemirror-history": "^1.0.0",
-        "prosemirror-state": "^1.0.0"
+        "jsesc": "~0.5.0"
+      },
+      "dependencies": {
+        "jsesc": {
+          "version": "0.5.0",
+          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+          "dev": true
+        }
       }
     },
-    "prosemirror-model": {
-      "version": "1.11.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.11.0.tgz",
-      "integrity": "sha512-GqoAz/mIYjdv8gVYJ8mWFKpHoTxn/lXq4tXJ6bTVxs+rem2LzMYXrNVXfucGtfsgqsJlRIgng/ByG9j7Q8XDrg==",
+    "regression": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz",
+      "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc="
+    },
+    "remark": {
+      "version": "13.0.0",
+      "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz",
+      "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==",
+      "dev": true,
       "requires": {
-        "orderedmap": "^1.1.0"
+        "remark-parse": "^9.0.0",
+        "remark-stringify": "^9.0.0",
+        "unified": "^9.1.0"
       }
     },
-    "prosemirror-schema-list": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.1.2.tgz",
-      "integrity": "sha512-dgM9PwtM4twa5WsgSYMB+J8bwjnR43DAD3L9MsR9rKm/nZR5Y85xcjB7gusVMSsbQ2NomMZF03RE6No6mTnclQ==",
+    "remark-parse": {
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+      "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
+      "dev": true,
       "requires": {
-        "prosemirror-model": "^1.0.0",
-        "prosemirror-transform": "^1.0.0"
+        "mdast-util-from-markdown": "^0.8.0"
       }
     },
-    "prosemirror-state": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.3.3.tgz",
-      "integrity": "sha512-PLXh2VJsIgvlgSTH6I2Yg6vk1CzPDp21DFreVpQtDMY2S6WaMmrQgDTLRcsrD8X38v8Yc873H7+ogdGzyIPn+w==",
+    "remark-stringify": {
+      "version": "9.0.1",
+      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz",
+      "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==",
+      "dev": true,
       "requires": {
-        "prosemirror-model": "^1.0.0",
-        "prosemirror-transform": "^1.0.0"
+        "mdast-util-to-markdown": "^0.6.0"
       }
     },
-    "prosemirror-transform": {
-      "version": "1.2.7",
-      "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.2.7.tgz",
-      "integrity": "sha512-/107Lo2zeDgXuJBxb8s/clNu0Z2W8Gv3MKmkuSS/68Mcr7LBaUnN/Hj2g+GUxEJ7MpExCzFs65GrsNo2K9rxUQ==",
+    "repeat-element": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+      "dev": true
+    },
+    "repeat-string": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+    },
+    "require-directory": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+      "dev": true
+    },
+    "require-from-string": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+      "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.17.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
+      "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
       "requires": {
-        "prosemirror-model": "^1.0.0"
+        "path-parse": "^1.0.6"
       }
     },
-    "prosemirror-view": {
-      "version": "1.16.0",
-      "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.16.0.tgz",
-      "integrity": "sha512-iFtStCw2byF0yLc3mm1ezGdFSd6SWM4pnJod+ZaJiU5ju36QdYM4Xwa+qNm/AaI2/MgxpJqi8jsGWOJNkeBQ/Q==",
+    "resolve-dir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
+      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+      "dev": true,
       "requires": {
-        "prosemirror-model": "^1.1.0",
-        "prosemirror-state": "^1.0.0",
-        "prosemirror-transform": "^1.1.0"
+        "expand-tilde": "^2.0.0",
+        "global-modules": "^1.0.0"
       }
     },
-    "protocols": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/protocols/-/protocols-1.4.8.tgz",
-      "integrity": "sha512-IgjKyaUSjsROSO8/D49Ab7hP8mJgTYcqApOqdPhLoPxAplXmkp+zRvsrSQjFn5by0rhm4VH0GAUELIPpx7B1yg==",
+    "resolve-from": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
+      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
       "dev": true
     },
-    "pump": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
-      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+    "resolve-global": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
+      "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
       "dev": true,
       "requires": {
-        "end-of-stream": "^1.1.0",
-        "once": "^1.3.1"
+        "global-dirs": "^0.1.1"
       }
     },
-    "punycode": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+    "resolve-url": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
       "dev": true
     },
-    "purgecss": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz",
-      "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==",
+    "responselike": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
+      "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
       "dev": true,
       "requires": {
-        "commander": "^5.0.0",
-        "glob": "^7.0.0",
-        "postcss": "7.0.32",
-        "postcss-selector-parser": "^6.0.2"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
-          "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
-          "dev": true
-        }
+        "lowercase-keys": "^2.0.0"
+      }
+    },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "dev": true,
+      "requires": {
+        "onetime": "^2.0.0",
+        "signal-exit": "^3.0.2"
+      }
+    },
+    "restructure": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz",
+      "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=",
+      "requires": {
+        "browserify-optional": "^1.0.0"
+      }
+    },
+    "resumer": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
+      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
+      "requires": {
+        "through": "~2.3.4"
       }
     },
-    "q": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
-      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
+    "ret": {
+      "version": "0.1.15",
+      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+      "dev": true
+    },
+    "retry": {
+      "version": "0.12.0",
+      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
       "dev": true
     },
-    "quick-lru": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
-      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+    "reusify": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
       "dev": true
     },
-    "quote-stream": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
-      "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=",
+    "rgb-regex": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
+      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
+      "dev": true
+    },
+    "rgba-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
+      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
+      "dev": true
+    },
+    "rgbcolor": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
+      "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0="
+    },
+    "right-align": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
       "requires": {
-        "buffer-equal": "0.0.1",
-        "minimist": "^1.1.3",
-        "through2": "^2.0.0"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
-          "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
+        "align-text": "^0.1.1"
       }
     },
-    "raf": {
-      "version": "3.4.1",
-      "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
-      "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+    "rimraf": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+      "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+      "dev": true,
       "requires": {
-        "performance-now": "^2.1.0"
+        "glob": "^7.1.3"
       }
     },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+    "rollup": {
+      "version": "2.42.4",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.42.4.tgz",
+      "integrity": "sha512-Zqv3EvNfcllBHyyEUM754npqsZw82VIjK34cDQMwrQ1d6aqxzeYu5yFb7smGkPU4C1Bj7HupIMeT6WU7uIdnMw==",
       "dev": true,
       "requires": {
-        "safe-buffer": "^5.1.0"
+        "fsevents": "~2.3.1"
       }
     },
-    "rc": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
-      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+    "rollup-plugin-inject": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz",
+      "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==",
       "dev": true,
       "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
+        "estree-walker": "^0.6.1",
+        "magic-string": "^0.25.3",
+        "rollup-pluginutils": "^2.8.1"
       },
       "dependencies": {
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
-          "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
+        "estree-walker": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+          "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
           "dev": true
         }
       }
     },
-    "read-cache": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
-      "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=",
+    "rollup-plugin-multi-input": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-multi-input/-/rollup-plugin-multi-input-1.2.0.tgz",
+      "integrity": "sha512-jLmVLYpIB9sFk3JmzwKFryPqZYv1Dib/GzQEy708hfD/xauwgOyKWk7qhKMQp71mbGTuF59neUst/cnveIii+A==",
       "dev": true,
       "requires": {
-        "pify": "^2.3.0"
+        "@babel/runtime": "^7.0.0-beta.55",
+        "core-js": "^3.1.3",
+        "fast-glob": "^3.0.0",
+        "lodash": "^4.17.11"
       }
     },
-    "read-pkg": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+    "rollup-plugin-node-polyfills": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz",
+      "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==",
       "dev": true,
       "requires": {
-        "@types/normalize-package-data": "^2.4.0",
-        "normalize-package-data": "^2.5.0",
-        "parse-json": "^5.0.0",
-        "type-fest": "^0.6.0"
+        "rollup-plugin-inject": "^3.0.0"
+      }
+    },
+    "rollup-plugin-postcss": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-4.0.0.tgz",
+      "integrity": "sha512-OQzT+YspV01/6dxfyEw8lBO2px3hyL8Xn+k2QGctL7V/Yx2Z1QaMKdYVslP1mqv7RsKt6DROIlnbpmgJ3yxf6g==",
+      "dev": true,
+      "requires": {
+        "chalk": "^4.1.0",
+        "concat-with-sourcemaps": "^1.1.0",
+        "cssnano": "^4.1.10",
+        "import-cwd": "^3.0.0",
+        "p-queue": "^6.6.2",
+        "pify": "^5.0.0",
+        "postcss-load-config": "^3.0.0",
+        "postcss-modules": "^4.0.0",
+        "promise.series": "^0.2.0",
+        "resolve": "^1.19.0",
+        "rollup-pluginutils": "^2.8.2",
+        "safe-identifier": "^0.4.2",
+        "style-inject": "^0.3.0"
       },
       "dependencies": {
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "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"
+            "color-convert": "^2.0.1"
           }
         },
-        "type-fest": {
-          "version": "0.6.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
-        }
-      }
-    },
-    "read-pkg-up": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
-      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
-      "dev": true,
-      "requires": {
-        "find-up": "^4.1.0",
-        "read-pkg": "^5.2.0",
-        "type-fest": "^0.8.1"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "0.8.1",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
-          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true
+        },
+        "pify": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
+          "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
           "dev": true
+        },
+        "resolve": {
+          "version": "1.19.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+          "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
+          "dev": true,
+          "requires": {
+            "is-core-module": "^2.1.0",
+            "path-parse": "^1.0.6"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
         }
       }
     },
-    "readable-stream": {
-      "version": "2.3.7",
-      "resolved": "https://registry.npmjs.org/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"
-      }
-    },
-    "readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "redent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
-      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
-      "dev": true,
-      "requires": {
-        "indent-string": "^4.0.0",
-        "strip-indent": "^3.0.0"
-      }
-    },
-    "redeyed": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz",
-      "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=",
+    "rollup-plugin-terser": {
+      "version": "7.0.2",
+      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
+      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
       "dev": true,
       "requires": {
-        "esprima": "~4.0.0"
+        "@babel/code-frame": "^7.10.4",
+        "jest-worker": "^26.2.1",
+        "serialize-javascript": "^4.0.0",
+        "terser": "^5.0.0"
+      },
+      "dependencies": {
+        "@babel/code-frame": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
+          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+          "dev": true,
+          "requires": {
+            "@babel/highlight": "^7.10.4"
+          }
+        },
+        "@babel/helper-validator-identifier": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
+          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
+          "dev": true
+        },
+        "@babel/highlight": {
+          "version": "7.10.4",
+          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
+          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+          "dev": true,
+          "requires": {
+            "@babel/helper-validator-identifier": "^7.10.4",
+            "chalk": "^2.0.0",
+            "js-tokens": "^4.0.0"
+          }
+        },
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
+        }
       }
     },
-    "reduce-css-calc": {
-      "version": "2.1.7",
-      "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz",
-      "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==",
+    "rollup-pluginutils": {
+      "version": "2.8.2",
+      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
+      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
       "dev": true,
       "requires": {
-        "css-unit-converter": "^1.1.1",
-        "postcss-value-parser": "^3.3.0"
+        "estree-walker": "^0.6.1"
       },
       "dependencies": {
-        "postcss-value-parser": {
-          "version": "3.3.1",
-          "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
-          "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
+        "estree-walker": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
+          "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
           "dev": true
         }
       }
     },
-    "redux": {
-      "version": "4.0.5",
-      "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz",
-      "integrity": "sha512-VSz1uMAH24DM6MF72vcojpYPtrTUu3ByVWfPL1nPfVRb5mZVTve5GnNCUV53QM/BZ66xfWrm0CTWoM+Xlz8V1w==",
-      "requires": {
-        "loose-envify": "^1.4.0",
-        "symbol-observable": "^1.2.0"
-      }
+    "rope-sequence": {
+      "version": "1.3.2",
+      "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
+      "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg=="
     },
-    "regenerate": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz",
-      "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==",
+    "run-async": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
       "dev": true
     },
-    "regenerate-unicode-properties": {
-      "version": "8.2.0",
-      "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
-      "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
-      "dev": true,
-      "requires": {
-        "regenerate": "^1.4.0"
-      }
-    },
-    "regenerator-runtime": {
-      "version": "0.13.7",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-      "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+    "run-parallel": {
+      "version": "1.1.9",
+      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
+      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
       "dev": true
     },
-    "regenerator-transform": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
-      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
-      "dev": true,
-      "requires": {
-        "@babel/runtime": "^7.8.4"
-      }
+    "rw": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
+      "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
     },
-    "regex-not": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
-      "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+    "rxjs": {
+      "version": "6.6.2",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
+      "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
       "dev": true,
       "requires": {
-        "extend-shallow": "^3.0.2",
-        "safe-regex": "^1.1.0"
+        "tslib": "^1.9.0"
       }
     },
-    "regexp.prototype.flags": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
-      "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.0-next.1"
-      }
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
     },
-    "regexpp": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-      "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+    "safe-identifier": {
+      "version": "0.4.2",
+      "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
+      "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==",
       "dev": true
     },
-    "regexpu-core": {
-      "version": "4.7.1",
-      "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
-      "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+    "safe-regex": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
       "dev": true,
       "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"
+        "ret": "~0.1.10"
       }
     },
-    "registry-auth-token": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
-      "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
-      "dev": true,
+    "safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "sax": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    },
+    "scope-analyzer": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz",
+      "integrity": "sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg==",
       "requires": {
-        "rc": "^1.2.8"
+        "array-from": "^2.1.1",
+        "dash-ast": "^1.0.0",
+        "es6-map": "^0.1.5",
+        "es6-set": "^0.1.5",
+        "es6-symbol": "^3.1.1",
+        "estree-is-function": "^1.0.0",
+        "get-assigned-identifiers": "^1.1.0"
       }
     },
-    "regjsgen": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
-      "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
-      "dev": true
-    },
-    "regjsparser": {
-      "version": "0.6.4",
-      "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
-      "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
+    "semantic-release": {
+      "version": "17.4.2",
+      "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.4.2.tgz",
+      "integrity": "sha512-TPLWuoe2L2DmgnQEh+OLWW5V1T+ZAa1xWuHXsuPAWEko0BqSdLPl+5+BlQ+D5Bp27S5gDJ1//Y1tgbmvUhnOCw==",
       "dev": true,
       "requires": {
-        "jsesc": "~0.5.0"
+        "@semantic-release/commit-analyzer": "^8.0.0",
+        "@semantic-release/error": "^2.2.0",
+        "@semantic-release/github": "^7.0.0",
+        "@semantic-release/npm": "^7.0.0",
+        "@semantic-release/release-notes-generator": "^9.0.0",
+        "aggregate-error": "^3.0.0",
+        "cosmiconfig": "^7.0.0",
+        "debug": "^4.0.0",
+        "env-ci": "^5.0.0",
+        "execa": "^5.0.0",
+        "figures": "^3.0.0",
+        "find-versions": "^4.0.0",
+        "get-stream": "^6.0.0",
+        "git-log-parser": "^1.2.0",
+        "hook-std": "^2.0.0",
+        "hosted-git-info": "^4.0.0",
+        "lodash": "^4.17.15",
+        "marked": "^2.0.0",
+        "marked-terminal": "^4.1.1",
+        "micromatch": "^4.0.2",
+        "p-each-series": "^2.1.0",
+        "p-reduce": "^2.0.0",
+        "read-pkg-up": "^7.0.0",
+        "resolve-from": "^5.0.0",
+        "semver": "^7.3.2",
+        "semver-diff": "^3.1.1",
+        "signale": "^1.2.1",
+        "yargs": "^16.2.0"
       },
       "dependencies": {
-        "jsesc": {
-          "version": "0.5.0",
-          "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
-          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "cosmiconfig": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+          "dev": true,
+          "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"
+          }
+        },
+        "execa": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+          "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+          "dev": true,
+          "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"
+          }
+        },
+        "figures": {
+          "version": "3.2.0",
+          "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+          "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+          "dev": true,
+          "requires": {
+            "escape-string-regexp": "^1.0.5"
+          }
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+          "dev": true,
+          "requires": {
+            "to-regex-range": "^5.0.1"
+          }
+        },
+        "get-stream": {
+          "version": "6.0.0",
+          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+          "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+          "dev": true
+        },
+        "human-signals": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+          "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+          "dev": true
+        },
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "dev": true,
+          "requires": {
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          },
+          "dependencies": {
+            "resolve-from": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+              "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+              "dev": true
+            }
+          }
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
+          "requires": {
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
+          }
+        },
+        "mimic-fn": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+          "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+          "dev": true
+        },
+        "onetime": {
+          "version": "5.1.2",
+          "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+          "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+          "dev": true,
+          "requires": {
+            "mimic-fn": "^2.1.0"
+          }
+        },
+        "parse-json": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+          "dev": true,
+          "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"
+          }
+        },
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
+        },
+        "semver": {
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
         }
       }
     },
-    "regression": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/regression/-/regression-2.0.1.tgz",
-      "integrity": "sha1-jSnD6CJKEIUMNeM36FqLL6w7DIc="
-    },
-    "remark": {
-      "version": "12.0.1",
-      "resolved": "https://registry.npmjs.org/remark/-/remark-12.0.1.tgz",
-      "integrity": "sha512-gS7HDonkdIaHmmP/+shCPejCEEW+liMp/t/QwmF0Xt47Rpuhl32lLtDV1uKWvGoq+kxr5jSgg5oAIpGuyULjUw==",
-      "dev": true,
-      "requires": {
-        "remark-parse": "^8.0.0",
-        "remark-stringify": "^8.0.0",
-        "unified": "^9.0.0"
-      }
-    },
-    "remark-parse": {
-      "version": "8.0.3",
-      "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz",
-      "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==",
-      "dev": true,
-      "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-stringify": {
-      "version": "8.1.1",
-      "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-8.1.1.tgz",
-      "integrity": "sha512-q4EyPZT3PcA3Eq7vPpT6bIdokXzFGp9i85igjmhRyXWmPs0Y6/d2FYwUNotKAWyLch7g0ASZJn/KHHcHZQ163A==",
-      "dev": true,
-      "requires": {
-        "ccount": "^1.0.0",
-        "is-alphanumeric": "^1.0.0",
-        "is-decimal": "^1.0.0",
-        "is-whitespace-character": "^1.0.0",
-        "longest-streak": "^2.0.1",
-        "markdown-escapes": "^1.0.0",
-        "markdown-table": "^2.0.0",
-        "mdast-util-compact": "^2.0.0",
-        "parse-entities": "^2.0.0",
-        "repeat-string": "^1.5.4",
-        "state-toggle": "^1.0.0",
-        "stringify-entities": "^3.0.0",
-        "unherit": "^1.0.4",
-        "xtend": "^4.0.1"
-      }
-    },
-    "repeat-element": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
-      "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
+    "semver": {
+      "version": "6.3.0",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
       "dev": true
     },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
-    },
-    "replace-ext": {
+    "semver-compare": {
       "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
-      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
-      "dev": true
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.17.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
-      "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
-      "requires": {
-        "path-parse": "^1.0.6"
-      }
-    },
-    "resolve-dir": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-      "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-      "dev": true,
-      "requires": {
-        "expand-tilde": "^2.0.0",
-        "global-modules": "^1.0.0"
-      }
-    },
-    "resolve-from": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-      "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
       "dev": true
     },
-    "resolve-global": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz",
-      "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==",
+    "semver-diff": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
       "dev": true,
       "requires": {
-        "global-dirs": "^0.1.1"
+        "semver": "^6.3.0"
       }
     },
-    "resolve-url": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
-      "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
+    "semver-regex": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-3.1.2.tgz",
+      "integrity": "sha512-bXWyL6EAKOJa81XG1OZ/Yyuq+oT0b2YLlxx7c+mrdYPaPbnj6WgVULXhinMIeZGufuUBu/eVRqXEhiv4imfwxA==",
       "dev": true
     },
-    "responselike": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz",
-      "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==",
+    "serialize-javascript": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
+      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
       "dev": true,
       "requires": {
-        "lowercase-keys": "^2.0.0"
+        "randombytes": "^2.1.0"
       }
     },
-    "restore-cursor": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
-      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+    "set-value": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
       "dev": true,
       "requires": {
-        "onetime": "^2.0.0",
-        "signal-exit": "^3.0.2"
-      }
-    },
-    "restructure": {
-      "version": "0.5.4",
-      "resolved": "https://registry.npmjs.org/restructure/-/restructure-0.5.4.tgz",
-      "integrity": "sha1-9U591WNZD7NP1r9Vh2EJrsyyjeg=",
-      "requires": {
-        "browserify-optional": "^1.0.0"
-      }
-    },
-    "resumer": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz",
-      "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=",
-      "requires": {
-        "through": "~2.3.4"
-      }
-    },
-    "ret": {
-      "version": "0.1.15",
-      "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
-      "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
-      "dev": true
-    },
-    "retry": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
-      "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
-      "dev": true
-    },
-    "reusify": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
-      "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
-      "dev": true
-    },
-    "rgb-regex": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
-      "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
-      "dev": true
-    },
-    "rgba-regex": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
-      "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
-      "dev": true
-    },
-    "rgbcolor": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/rgbcolor/-/rgbcolor-1.0.1.tgz",
-      "integrity": "sha1-1lBezbMEplldom+ktDMHMGd1lF0="
-    },
-    "right-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
-      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
-      "requires": {
-        "align-text": "^0.1.1"
+        "extend-shallow": "^2.0.1",
+        "is-extendable": "^0.1.1",
+        "is-plain-object": "^2.0.3",
+        "split-string": "^3.0.1"
+      },
+      "dependencies": {
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
+        }
       }
     },
-    "rimraf": {
-      "version": "2.6.3",
-      "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
-      "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
-      "dev": true,
-      "requires": {
-        "glob": "^7.1.3"
-      }
+    "shallow-copy": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
+      "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA="
     },
-    "rollup": {
-      "version": "2.32.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.32.1.tgz",
-      "integrity": "sha512-Op2vWTpvK7t6/Qnm1TTh7VjEZZkN8RWgf0DHbkKzQBwNf748YhXbozHVefqpPp/Fuyk/PQPAnYsBxAEtlMvpUw==",
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
       "dev": true,
       "requires": {
-        "fsevents": "~2.1.2"
+        "shebang-regex": "^3.0.0"
       }
     },
-    "rollup-plugin-inject": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz",
-      "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==",
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
+    },
+    "signale": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
+      "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
       "dev": true,
       "requires": {
-        "estree-walker": "^0.6.1",
-        "magic-string": "^0.25.3",
-        "rollup-pluginutils": "^2.8.1"
+        "chalk": "^2.3.2",
+        "figures": "^2.0.0",
+        "pkg-conf": "^2.1.0"
       },
       "dependencies": {
-        "estree-walker": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
-          "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
-          "dev": true
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^3.2.1",
+            "escape-string-regexp": "^1.0.5",
+            "supports-color": "^5.3.0"
+          }
         }
       }
     },
-    "rollup-plugin-multi-input": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-multi-input/-/rollup-plugin-multi-input-1.1.1.tgz",
-      "integrity": "sha512-q/sFiS7h7AQk0V/fFREt5Gizewov01V1RZgORFmXL6W9emkJOPu94GFJ21KYtSob4bmEmDq9Hpr+3ukKNi84CA==",
+    "simple-swizzle": {
+      "version": "0.2.2",
+      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
       "dev": true,
       "requires": {
-        "@babel/runtime": "^7.0.0-beta.55",
-        "core-js": "^3.1.3",
-        "fast-glob": "^3.0.0",
-        "lodash": "^4.17.11"
-      },
-      "dependencies": {
-        "core-js": {
-          "version": "3.6.5",
-          "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
-          "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
-          "dev": true
-        }
+        "is-arrayish": "^0.3.1"
       }
     },
-    "rollup-plugin-node-polyfills": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz",
-      "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==",
+    "slash": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+      "dev": true
+    },
+    "slice-ansi": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+      "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
       "dev": true,
       "requires": {
-        "rollup-plugin-inject": "^3.0.0"
+        "ansi-styles": "^4.0.0",
+        "astral-regex": "^2.0.0",
+        "is-fullwidth-code-point": "^3.0.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        }
       }
     },
-    "rollup-plugin-postcss": {
-      "version": "3.1.8",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-postcss/-/rollup-plugin-postcss-3.1.8.tgz",
-      "integrity": "sha512-JHnGfW8quNc6ePxEkZ05HEZ1YiRxDgY9RKEetMfsrwxR2kh/d90OVScTc6b1c2Q17Cs/5TRYL+1uddG21lQe3w==",
+    "snapdragon": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
       "dev": true,
       "requires": {
-        "chalk": "^4.0.0",
-        "concat-with-sourcemaps": "^1.1.0",
-        "cssnano": "^4.1.10",
-        "import-cwd": "^3.0.0",
-        "p-queue": "^6.3.0",
-        "pify": "^5.0.0",
-        "postcss": "^7.0.27",
-        "postcss-load-config": "^2.1.0",
-        "postcss-modules": "^2.0.0",
-        "promise.series": "^0.2.0",
-        "resolve": "^1.16.1",
-        "rollup-pluginutils": "^2.8.2",
-        "safe-identifier": "^0.4.1",
-        "style-inject": "^0.3.0"
+        "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": {
-        "import-cwd": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
-          "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+        "debug": {
+          "version": "2.6.9",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
           "dev": true,
           "requires": {
-            "import-from": "^3.0.0"
+            "ms": "2.0.0"
           }
         },
-        "import-from": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
-          "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
           "dev": true,
           "requires": {
-            "resolve-from": "^5.0.0"
+            "is-descriptor": "^0.1.0"
           }
         },
-        "pify": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz",
-          "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==",
-          "dev": true
+        "extend-shallow": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+          "dev": true,
+          "requires": {
+            "is-extendable": "^0.1.0"
+          }
         },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+        "ms": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
           "dev": true
         }
       }
     },
-    "rollup-plugin-terser": {
-      "version": "7.0.2",
-      "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz",
-      "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==",
+    "snapdragon-node": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
       "dev": true,
       "requires": {
-        "@babel/code-frame": "^7.10.4",
-        "jest-worker": "^26.2.1",
-        "serialize-javascript": "^4.0.0",
-        "terser": "^5.0.0"
+        "define-property": "^1.0.0",
+        "isobject": "^3.0.0",
+        "snapdragon-util": "^3.0.1"
       },
       "dependencies": {
-        "@babel/code-frame": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
-          "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
+        "define-property": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
           "dev": true,
           "requires": {
-            "@babel/highlight": "^7.10.4"
+            "is-descriptor": "^1.0.0"
           }
         },
-        "@babel/helper-validator-identifier": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
-          "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
-          "dev": true
+        "is-accessor-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+          "dev": true,
+          "requires": {
+            "kind-of": "^6.0.0"
+          }
         },
-        "@babel/highlight": {
-          "version": "7.10.4",
-          "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-          "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+        "is-data-descriptor": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
           "dev": true,
           "requires": {
-            "@babel/helper-validator-identifier": "^7.10.4",
-            "chalk": "^2.0.0",
-            "js-tokens": "^4.0.0"
+            "kind-of": "^6.0.0"
           }
         },
-        "chalk": {
-          "version": "2.4.2",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+        "is-descriptor": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+          "dev": true,
+          "requires": {
+            "is-accessor-descriptor": "^1.0.0",
+            "is-data-descriptor": "^1.0.0",
+            "kind-of": "^6.0.2"
+          }
+        }
+      }
+    },
+    "snapdragon-util": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+      "dev": true,
+      "requires": {
+        "kind-of": "^3.2.0"
+      },
+      "dependencies": {
+        "kind-of": {
+          "version": "3.2.2",
+          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
           "dev": true,
           "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
+            "is-buffer": "^1.1.5"
           }
         }
       }
     },
-    "rollup-pluginutils": {
-      "version": "2.8.2",
-      "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz",
-      "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==",
+    "source-map": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+    },
+    "source-map-resolve": {
+      "version": "0.5.3",
+      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
       "dev": true,
       "requires": {
-        "estree-walker": "^0.6.1"
+        "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.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+      "dev": true,
+      "requires": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
       },
       "dependencies": {
-        "estree-walker": {
+        "source-map": {
           "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz",
-          "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         }
       }
     },
-    "rope-sequence": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.2.tgz",
-      "integrity": "sha512-ku6MFrwEVSVmXLvy3dYph3LAMNS0890K7fabn+0YIRQ2T96T9F4gkFf0vf0WW0JUraNWwGRtInEpH7yO4tbQZg=="
-    },
-    "run-async": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
-      "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+    "source-map-url": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
       "dev": true
     },
-    "run-parallel": {
-      "version": "1.1.9",
-      "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz",
-      "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==",
+    "sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+    },
+    "spawn-error-forwarder": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz",
+      "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=",
       "dev": true
     },
-    "rw": {
-      "version": "1.3.3",
-      "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
-      "integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
+    "spdx-correct": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
+      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
+      "dev": true,
+      "requires": {
+        "spdx-expression-parse": "^3.0.0",
+        "spdx-license-ids": "^3.0.0"
+      }
     },
-    "rxjs": {
-      "version": "6.6.2",
-      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.2.tgz",
-      "integrity": "sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==",
+    "spdx-exceptions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+      "dev": true
+    },
+    "spdx-expression-parse": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
       "dev": true,
       "requires": {
-        "tslib": "^1.9.0"
+        "spdx-exceptions": "^2.1.0",
+        "spdx-license-ids": "^3.0.0"
       }
     },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    "spdx-license-ids": {
+      "version": "3.0.7",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
+      "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
+      "dev": true
     },
-    "safe-identifier": {
-      "version": "0.4.2",
-      "resolved": "https://registry.npmjs.org/safe-identifier/-/safe-identifier-0.4.2.tgz",
-      "integrity": "sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==",
+    "specificity": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
+      "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
       "dev": true
     },
-    "safe-regex": {
+    "split": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+      "dev": true,
+      "requires": {
+        "through": "2"
+      }
+    },
+    "split-on-first": {
       "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
-      "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+      "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz",
+      "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==",
+      "dev": true
+    },
+    "split-string": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
       "dev": true,
       "requires": {
-        "ret": "~0.1.10"
+        "extend-shallow": "^3.0.0"
       }
     },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    "split2": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
+      "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==",
+      "dev": true,
+      "requires": {
+        "readable-stream": "^3.0.0"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
     },
-    "sax": {
-      "version": "1.2.4",
-      "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
-      "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+    "sprintf-js": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
     },
-    "scope-analyzer": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/scope-analyzer/-/scope-analyzer-2.1.1.tgz",
-      "integrity": "sha512-azEAihtQ9mEyZGhfgTJy3IbOWEzeOrYbg7NcYEshPKnKd+LZmC3TNd5dmDxbLBsTG/JVWmCp+vDJ03vJjeXMHg==",
+    "ssf": {
+      "version": "0.11.2",
+      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
+      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
       "requires": {
-        "array-from": "^2.1.1",
-        "dash-ast": "^1.0.0",
-        "es6-map": "^0.1.5",
-        "es6-set": "^0.1.5",
-        "es6-symbol": "^3.1.1",
-        "estree-is-function": "^1.0.0",
-        "get-assigned-identifiers": "^1.1.0"
+        "frac": "~1.1.2"
       }
     },
-    "semantic-release": {
-      "version": "17.2.1",
-      "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-17.2.1.tgz",
-      "integrity": "sha512-+xbLWsT9NoibeMMJw4te0pbY4q/Z1gt/vzhB0z9RRNGVyqCgQiK5NUJ11eW6etSyPZ9QFeAMnqO2dzscWUTy2w==",
+    "stable": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
+      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
+      "dev": true
+    },
+    "stackblur-canvas": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.5.0.tgz",
+      "integrity": "sha512-EeNzTVfj+1In7aSLPKDD03F/ly4RxEuF/EX0YcOG0cKoPXs+SLZxDawQbexQDBzwROs4VKLWTOaZQlZkGBFEIQ=="
+    },
+    "static-eval": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
+      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
+      "requires": {
+        "escodegen": "^1.11.1"
+      }
+    },
+    "static-extend": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
       "dev": true,
       "requires": {
-        "@semantic-release/commit-analyzer": "^8.0.0",
-        "@semantic-release/error": "^2.2.0",
-        "@semantic-release/github": "^7.0.0",
-        "@semantic-release/npm": "^7.0.0",
-        "@semantic-release/release-notes-generator": "^9.0.0",
-        "aggregate-error": "^3.0.0",
-        "cosmiconfig": "^6.0.0",
-        "debug": "^4.0.0",
-        "env-ci": "^5.0.0",
-        "execa": "^4.0.0",
-        "figures": "^3.0.0",
-        "find-versions": "^3.0.0",
-        "get-stream": "^5.0.0",
-        "git-log-parser": "^1.2.0",
-        "hook-std": "^2.0.0",
-        "hosted-git-info": "^3.0.0",
-        "lodash": "^4.17.15",
-        "marked": "^1.0.0",
-        "marked-terminal": "^4.0.0",
-        "micromatch": "^4.0.2",
-        "p-each-series": "^2.1.0",
-        "p-reduce": "^2.0.0",
-        "read-pkg-up": "^7.0.0",
-        "resolve-from": "^5.0.0",
-        "semver": "^7.3.2",
-        "semver-diff": "^3.1.1",
-        "signale": "^1.2.1",
-        "yargs": "^15.0.1"
+        "define-property": "^0.2.5",
+        "object-copy": "^0.1.0"
+      },
+      "dependencies": {
+        "define-property": {
+          "version": "0.2.5",
+          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+          "dev": true,
+          "requires": {
+            "is-descriptor": "^0.1.0"
+          }
+        }
+      }
+    },
+    "static-module": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz",
+      "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==",
+      "requires": {
+        "acorn-node": "^1.3.0",
+        "concat-stream": "~1.6.0",
+        "convert-source-map": "^1.5.1",
+        "duplexer2": "~0.1.4",
+        "escodegen": "^1.11.1",
+        "has": "^1.0.1",
+        "magic-string": "0.25.1",
+        "merge-source-map": "1.0.4",
+        "object-inspect": "^1.6.0",
+        "readable-stream": "~2.3.3",
+        "scope-analyzer": "^2.0.1",
+        "shallow-copy": "~0.0.1",
+        "static-eval": "^2.0.5",
+        "through2": "~2.0.3"
       },
       "dependencies": {
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-          "dev": true,
+        "magic-string": {
+          "version": "0.25.1",
+          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz",
+          "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==",
           "requires": {
-            "fill-range": "^7.0.1"
+            "sourcemap-codec": "^1.4.1"
           }
         },
-        "cosmiconfig": {
-          "version": "6.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz",
-          "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==",
-          "dev": true,
+        "through2": {
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
           "requires": {
-            "@types/parse-json": "^4.0.0",
-            "import-fresh": "^3.1.0",
-            "parse-json": "^5.0.0",
-            "path-type": "^4.0.0",
-            "yaml": "^1.7.2"
+            "readable-stream": "~2.3.6",
+            "xtend": "~4.0.1"
           }
-        },
-        "figures": {
-          "version": "3.2.0",
-          "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
-          "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+        }
+      }
+    },
+    "stream-combiner2": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+      "dev": true,
+      "requires": {
+        "duplexer2": "~0.1.0",
+        "readable-stream": "^2.0.2"
+      }
+    },
+    "strict-uri-encode": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz",
+      "integrity": "sha1-ucczDHBChi9rFC3CdLvMWGbONUY=",
+      "dev": true
+    },
+    "string-argv": {
+      "version": "0.3.1",
+      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+      "dev": true
+    },
+    "string-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
+      "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
+      "dev": true
+    },
+    "string-width": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+      "dev": true,
+      "requires": {
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^4.0.0"
+      },
+      "dependencies": {
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
           "dev": true,
           "requires": {
-            "escape-string-regexp": "^1.0.5"
+            "ansi-regex": "^3.0.0"
           }
-        },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-          "dev": true,
+        }
+      }
+    },
+    "string.prototype.trim": {
+      "version": "1.2.4",
+      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz",
+      "integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==",
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3",
+        "es-abstract": "^1.18.0-next.2"
+      },
+      "dependencies": {
+        "es-abstract": {
+          "version": "1.18.0",
+          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
+          "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
           "requires": {
-            "to-regex-range": "^5.0.1"
+            "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"
           }
         },
-        "hosted-git-info": {
-          "version": "3.0.6",
-          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.6.tgz",
-          "integrity": "sha512-VRvqVD5T6t9HdmNDWTwbi8H/EC722MemAhOSP5QvYAXpDAY0Nhu2I/i+bXsktu4sU5LVHSh/wmXtVU8bDtjedQ==",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
+        "has-symbols": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+          "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
         },
-        "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
-          "dev": true,
+        "is-callable": {
+          "version": "1.2.3",
+          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
+          "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ=="
+        },
+        "is-regex": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
+          "integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
           "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          },
-          "dependencies": {
-            "resolve-from": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-              "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-              "dev": true
-            }
+            "call-bind": "^1.0.2",
+            "has-symbols": "^1.0.1"
           }
         },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-          "dev": true
-        },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-          "dev": true,
+        "object.assign": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+          "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
           "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
+            "call-bind": "^1.0.0",
+            "define-properties": "^1.1.3",
+            "has-symbols": "^1.0.1",
+            "object-keys": "^1.1.1"
           }
         },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
-          "dev": true,
+        "string.prototype.trimend": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+          "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
           "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"
+            "call-bind": "^1.0.2",
+            "define-properties": "^1.1.3"
           }
         },
-        "resolve-from": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.2",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
-          "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
-          "dev": true
-        },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-          "dev": true,
+        "string.prototype.trimstart": {
+          "version": "1.0.4",
+          "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+          "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
           "requires": {
-            "is-number": "^7.0.0"
+            "call-bind": "^1.0.2",
+            "define-properties": "^1.1.3"
           }
         }
       }
     },
-    "semver": {
-      "version": "5.7.1",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-      "dev": true
-    },
-    "semver-compare": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
-      "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=",
-      "dev": true
+    "string.prototype.trimend": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+      "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+      "dev": true,
+      "requires": {
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
+      }
     },
-    "semver-diff": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
-      "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+    "string.prototype.trimstart": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+      "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
       "dev": true,
       "requires": {
-        "semver": "^6.3.0"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "6.3.0",
-          "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-          "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
-          "dev": true
-        }
+        "call-bind": "^1.0.2",
+        "define-properties": "^1.1.3"
       }
     },
-    "semver-regex": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz",
-      "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==",
-      "dev": true
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
     },
-    "serialize-javascript": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
-      "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
+    "stringify-object": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
+      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
       "dev": true,
       "requires": {
-        "randombytes": "^2.1.0"
+        "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.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+          "dev": true
+        }
       }
     },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "set-value": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
-      "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+    "strip-ansi": {
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
       "dev": true,
       "requires": {
-        "extend-shallow": "^2.0.1",
-        "is-extendable": "^0.1.1",
-        "is-plain-object": "^2.0.3",
-        "split-string": "^3.0.1"
+        "ansi-regex": "^4.1.0"
       },
       "dependencies": {
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-          "dev": true,
-          "requires": {
-            "is-extendable": "^0.1.0"
-          }
+        "ansi-regex": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+          "dev": true
         }
       }
     },
-    "shallow-copy": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
-      "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA="
+    "strip-bom": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+      "dev": true
     },
-    "shebang-command": {
+    "strip-final-newline": {
       "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
-      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
+    "strip-indent": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
       "dev": true,
       "requires": {
-        "shebang-regex": "^3.0.0"
+        "min-indent": "^1.0.0"
       }
     },
-    "shebang-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
-      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+    "strip-json-comments": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
+      "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
       "dev": true
     },
-    "signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+    "style-inject": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
+      "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==",
       "dev": true
     },
-    "signale": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/signale/-/signale-1.4.0.tgz",
-      "integrity": "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==",
+    "style-search": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+      "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
+      "dev": true
+    },
+    "stylehacks": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
+      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
       "dev": true,
       "requires": {
-        "chalk": "^2.3.2",
-        "figures": "^2.0.0",
-        "pkg-conf": "^2.1.0"
+        "browserslist": "^4.0.0",
+        "postcss": "^7.0.0",
+        "postcss-selector-parser": "^3.0.0"
       },
       "dependencies": {
         "chalk": {
@@ -15940,743 +20219,612 @@
             "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
-        }
-      }
-    },
-    "simple-swizzle": {
-      "version": "0.2.2",
-      "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
-      "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
-      "dev": true,
-      "requires": {
-        "is-arrayish": "^0.3.1"
-      }
-    },
-    "slash": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
-      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
-      "dev": true
-    },
-    "slice-ansi": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
-      "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.0",
-        "astral-regex": "^1.0.0",
-        "is-fullwidth-code-point": "^2.0.0"
-      }
-    },
-    "snapdragon": {
-      "version": "0.8.2",
-      "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
-      "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
-      "dev": true,
-      "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": {
-        "debug": {
-          "version": "2.6.9",
-          "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-          "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+        },
+        "dot-prop": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
+          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
           "dev": true,
           "requires": {
-            "ms": "2.0.0"
+            "is-obj": "^2.0.0"
           }
         },
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+        "is-obj": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+          "dev": true
+        },
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
           "dev": true,
           "requires": {
-            "is-descriptor": "^0.1.0"
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
           }
         },
-        "extend-shallow": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-          "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+        "postcss-selector-parser": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
+          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
           "dev": true,
           "requires": {
-            "is-extendable": "^0.1.0"
+            "dot-prop": "^5.2.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1"
           }
         },
-        "ms": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
         }
       }
     },
-    "snapdragon-node": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
-      "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+    "stylelint": {
+      "version": "13.12.0",
+      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.12.0.tgz",
+      "integrity": "sha512-P8O1xDy41B7O7iXaSlW+UuFbE5+ZWQDb61ndGDxKIt36fMH50DtlQTbwLpFLf8DikceTAb3r6nPrRv30wBlzXw==",
       "dev": true,
       "requires": {
-        "define-property": "^1.0.0",
-        "isobject": "^3.0.0",
-        "snapdragon-util": "^3.0.1"
+        "@stylelint/postcss-css-in-js": "^0.37.2",
+        "@stylelint/postcss-markdown": "^0.36.2",
+        "autoprefixer": "^9.8.6",
+        "balanced-match": "^1.0.0",
+        "chalk": "^4.1.0",
+        "cosmiconfig": "^7.0.0",
+        "debug": "^4.3.1",
+        "execall": "^2.0.0",
+        "fast-glob": "^3.2.5",
+        "fastest-levenshtein": "^1.0.12",
+        "file-entry-cache": "^6.0.1",
+        "get-stdin": "^8.0.0",
+        "global-modules": "^2.0.0",
+        "globby": "^11.0.2",
+        "globjoin": "^0.1.4",
+        "html-tags": "^3.1.0",
+        "ignore": "^5.1.8",
+        "import-lazy": "^4.0.0",
+        "imurmurhash": "^0.1.4",
+        "known-css-properties": "^0.21.0",
+        "lodash": "^4.17.21",
+        "log-symbols": "^4.0.0",
+        "mathml-tag-names": "^2.1.3",
+        "meow": "^9.0.0",
+        "micromatch": "^4.0.2",
+        "normalize-selector": "^0.2.0",
+        "postcss": "^7.0.35",
+        "postcss-html": "^0.36.0",
+        "postcss-less": "^3.1.4",
+        "postcss-media-query-parser": "^0.2.3",
+        "postcss-resolve-nested-selector": "^0.1.1",
+        "postcss-safe-parser": "^4.0.2",
+        "postcss-sass": "^0.4.4",
+        "postcss-scss": "^2.1.1",
+        "postcss-selector-parser": "^6.0.4",
+        "postcss-syntax": "^0.36.2",
+        "postcss-value-parser": "^4.1.0",
+        "resolve-from": "^5.0.0",
+        "slash": "^3.0.0",
+        "specificity": "^0.4.1",
+        "string-width": "^4.2.2",
+        "strip-ansi": "^6.0.0",
+        "style-search": "^0.1.0",
+        "sugarss": "^2.0.0",
+        "svg-tags": "^1.0.0",
+        "table": "^6.0.7",
+        "v8-compile-cache": "^2.2.0",
+        "write-file-atomic": "^3.0.3"
       },
       "dependencies": {
-        "define-property": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
-          "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+        "ansi-regex": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+          "dev": true
+        },
+        "autoprefixer": {
+          "version": "9.8.6",
+          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
+          "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+          "dev": true,
+          "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"
+          }
+        },
+        "braces": {
+          "version": "3.0.2",
+          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+          "dev": true,
+          "requires": {
+            "fill-range": "^7.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+          "dev": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          },
+          "dependencies": {
+            "ansi-styles": {
+              "version": "4.3.0",
+              "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+              "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+              "dev": true,
+              "requires": {
+                "color-convert": "^2.0.1"
+              }
+            },
+            "has-flag": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+              "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+              "dev": true
+            },
+            "supports-color": {
+              "version": "7.2.0",
+              "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+              "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^4.0.0"
+              }
+            }
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
-            "is-descriptor": "^1.0.0"
+            "color-name": "~1.1.4"
           }
         },
-        "is-accessor-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
-          "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "cosmiconfig": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
+          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.0"
+            "@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"
           }
         },
-        "is-data-descriptor": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
-          "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+        "debug": {
+          "version": "4.3.1",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+          "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
           "dev": true,
           "requires": {
-            "kind-of": "^6.0.0"
+            "ms": "2.1.2"
           }
         },
-        "is-descriptor": {
-          "version": "1.0.2",
-          "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
-          "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+        "fast-glob": {
+          "version": "3.2.5",
+          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
+          "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
           "dev": true,
           "requires": {
-            "is-accessor-descriptor": "^1.0.0",
-            "is-data-descriptor": "^1.0.0",
-            "kind-of": "^6.0.2"
+            "@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"
           }
-        }
-      }
-    },
-    "snapdragon-util": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
-      "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
-      "dev": true,
-      "requires": {
-        "kind-of": "^3.2.0"
-      },
-      "dependencies": {
-        "kind-of": {
-          "version": "3.2.2",
-          "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-          "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+        },
+        "fill-range": {
+          "version": "7.0.1",
+          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
           "dev": true,
           "requires": {
-            "is-buffer": "^1.1.5"
+            "to-regex-range": "^5.0.1"
           }
-        }
-      }
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-    },
-    "source-map-resolve": {
-      "version": "0.5.3",
-      "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
-      "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
-      "dev": true,
-      "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.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
-      "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
-      "dev": true,
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "source-map": "^0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-          "dev": true
-        }
-      }
-    },
-    "source-map-url": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-      "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
-      "dev": true
-    },
-    "sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
-    },
-    "spawn-error-forwarder": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/spawn-error-forwarder/-/spawn-error-forwarder-1.0.0.tgz",
-      "integrity": "sha1-Gv2Uc46ZmwNG17n8NzvlXgdXcCk=",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
-      "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
-      "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
-      "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.6",
-      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
-      "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
-      "dev": true
-    },
-    "specificity": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz",
-      "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
-      "dev": true
-    },
-    "split": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
-      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
-      "dev": true,
-      "requires": {
-        "through": "2"
-      }
-    },
-    "split-string": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
-      "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
-      "dev": true,
-      "requires": {
-        "extend-shallow": "^3.0.0"
-      }
-    },
-    "split2": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
-      "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
-      "dev": true,
-      "requires": {
-        "through2": "^2.0.2"
-      },
-      "dependencies": {
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+        },
+        "global-modules": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+          "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
           "dev": true,
           "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
-          }
-        }
-      }
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
-    },
-    "ssf": {
-      "version": "0.11.2",
-      "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz",
-      "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==",
-      "requires": {
-        "frac": "~1.1.2"
-      }
-    },
-    "stable": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
-      "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
-      "dev": true
-    },
-    "stackblur-canvas": {
-      "version": "2.4.0",
-      "resolved": "https://registry.npmjs.org/stackblur-canvas/-/stackblur-canvas-2.4.0.tgz",
-      "integrity": "sha512-Z+HixfgYV0ss3C342DxPwc+UvN1SYWqoz7Wsi3xEDWEnaBkSCL3Ey21gF4io+WlLm8/RIrSnCrDBIEcH4O+q5Q=="
-    },
-    "state-toggle": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
-      "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
-      "dev": true
-    },
-    "static-eval": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
-      "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
-      "requires": {
-        "escodegen": "^1.11.1"
-      }
-    },
-    "static-extend": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
-      "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
-      "dev": true,
-      "requires": {
-        "define-property": "^0.2.5",
-        "object-copy": "^0.1.0"
-      },
-      "dependencies": {
-        "define-property": {
-          "version": "0.2.5",
-          "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
-          "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+            "global-prefix": "^3.0.0"
+          }
+        },
+        "global-prefix": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
           "dev": true,
           "requires": {
-            "is-descriptor": "^0.1.0"
+            "ini": "^1.3.5",
+            "kind-of": "^6.0.2",
+            "which": "^1.3.1"
           }
-        }
-      }
-    },
-    "static-module": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/static-module/-/static-module-3.0.4.tgz",
-      "integrity": "sha512-gb0v0rrgpBkifXCa3yZXxqVmXDVE+ETXj6YlC/jt5VzOnGXR2C15+++eXuMDUYsePnbhf+lwW0pE1UXyOLtGCw==",
-      "requires": {
-        "acorn-node": "^1.3.0",
-        "concat-stream": "~1.6.0",
-        "convert-source-map": "^1.5.1",
-        "duplexer2": "~0.1.4",
-        "escodegen": "^1.11.1",
-        "has": "^1.0.1",
-        "magic-string": "0.25.1",
-        "merge-source-map": "1.0.4",
-        "object-inspect": "^1.6.0",
-        "readable-stream": "~2.3.3",
-        "scope-analyzer": "^2.0.1",
-        "shallow-copy": "~0.0.1",
-        "static-eval": "^2.0.5",
-        "through2": "~2.0.3"
-      },
-      "dependencies": {
-        "magic-string": {
-          "version": "0.25.1",
-          "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz",
-          "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==",
+        },
+        "globby": {
+          "version": "11.0.3",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz",
+          "integrity": "sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==",
+          "dev": true,
           "requires": {
-            "sourcemap-codec": "^1.4.1"
+            "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"
           }
         },
-        "through2": {
-          "version": "2.0.5",
-          "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
-          "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+        "import-fresh": {
+          "version": "3.3.0",
+          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+          "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+          "dev": true,
           "requires": {
-            "readable-stream": "~2.3.6",
-            "xtend": "~4.0.1"
+            "parent-module": "^1.0.0",
+            "resolve-from": "^4.0.0"
+          },
+          "dependencies": {
+            "resolve-from": {
+              "version": "4.0.0",
+              "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+              "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+              "dev": true
+            }
           }
-        }
-      }
-    },
-    "stream-combiner2": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
-      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
-      "dev": true,
-      "requires": {
-        "duplexer2": "~0.1.0",
-        "readable-stream": "^2.0.2"
-      }
-    },
-    "string-argv": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
-      "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
-      "dev": true
-    },
-    "string-hash": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
-      "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=",
-      "dev": true
-    },
-    "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-      "dev": true,
-      "requires": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
-      },
-      "dependencies": {
-        "strip-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+        },
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "is-number": {
+          "version": "7.0.0",
+          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+          "dev": true
+        },
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+          "dev": true
+        },
+        "meow": {
+          "version": "9.0.0",
+          "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+          "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
           "dev": true,
           "requires": {
-            "ansi-regex": "^3.0.0"
+            "@types/minimist": "^1.2.0",
+            "camelcase-keys": "^6.2.2",
+            "decamelize": "^1.2.0",
+            "decamelize-keys": "^1.1.0",
+            "hard-rejection": "^2.1.0",
+            "minimist-options": "4.1.0",
+            "normalize-package-data": "^3.0.0",
+            "read-pkg-up": "^7.0.1",
+            "redent": "^3.0.0",
+            "trim-newlines": "^3.0.0",
+            "type-fest": "^0.18.0",
+            "yargs-parser": "^20.2.3"
           }
-        }
-      }
-    },
-    "string.prototype.trim": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.2.tgz",
-      "integrity": "sha512-b5yrbl3BXIjHau9Prk7U0RRYcUYdN4wGSVaqoBQS50CCE3KBuYU0TYRNPFCP7aVoNMX87HKThdMRVIP3giclKg==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.18.0-next.0"
-      },
-      "dependencies": {
-        "es-abstract": {
-          "version": "1.18.0-next.1",
-          "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-          "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+        },
+        "micromatch": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+          "dev": true,
           "requires": {
-            "es-to-primitive": "^1.2.1",
-            "function-bind": "^1.1.1",
-            "has": "^1.0.3",
-            "has-symbols": "^1.0.1",
-            "is-callable": "^1.2.2",
-            "is-negative-zero": "^2.0.0",
-            "is-regex": "^1.1.1",
-            "object-inspect": "^1.8.0",
-            "object-keys": "^1.1.1",
-            "object.assign": "^4.1.1",
-            "string.prototype.trimend": "^1.0.1",
-            "string.prototype.trimstart": "^1.0.1"
+            "braces": "^3.0.1",
+            "picomatch": "^2.0.5"
           }
         },
-        "is-callable": {
-          "version": "1.2.2",
-          "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-          "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA=="
+        "parse-json": {
+          "version": "5.2.0",
+          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+          "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+          "dev": true,
+          "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"
+          }
         },
-        "is-regex": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-          "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
           "requires": {
-            "has-symbols": "^1.0.1"
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          },
+          "dependencies": {
+            "chalk": {
+              "version": "2.4.2",
+              "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+              "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+              "dev": true,
+              "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+                  "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+                  "dev": true,
+                  "requires": {
+                    "has-flag": "^3.0.0"
+                  }
+                }
+              }
+            }
           }
         },
-        "object.assign": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
-          "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
+          "dev": true,
           "requires": {
-            "define-properties": "^1.1.3",
-            "es-abstract": "^1.18.0-next.0",
-            "has-symbols": "^1.0.1",
-            "object-keys": "^1.1.1"
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
           }
-        }
-      }
-    },
-    "string.prototype.trimend": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
-      "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
-      }
-    },
-    "string.prototype.trimstart": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
-      "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
-      "requires": {
-        "define-properties": "^1.1.3",
-        "es-abstract": "^1.17.5"
-      }
-    },
-    "string_decoder": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-      "requires": {
-        "safe-buffer": "~5.1.0"
-      }
-    },
-    "stringify-entities": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-3.0.1.tgz",
-      "integrity": "sha512-Lsk3ISA2++eJYqBMPKcr/8eby1I6L0gP0NlxF8Zja6c05yr/yCYyb2c9PwXjd08Ib3If1vn1rbs1H5ZtVuOfvQ==",
-      "dev": true,
-      "requires": {
-        "character-entities-html4": "^1.0.0",
-        "character-entities-legacy": "^1.0.0",
-        "is-alphanumerical": "^1.0.0",
-        "is-decimal": "^1.0.2",
-        "is-hexadecimal": "^1.0.0"
-      }
-    },
-    "stringify-object": {
-      "version": "3.3.0",
-      "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz",
-      "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==",
-      "dev": true,
-      "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.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
-          "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+        },
+        "resolve-from": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
           "dev": true
-        }
-      }
-    },
-    "strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^4.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
+        },
+        "string-width": {
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+          "dev": true,
+          "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.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+          "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^5.0.0"
+          }
+        },
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+          "dev": true,
+          "requires": {
+            "has-flag": "^3.0.0"
+          }
+        },
+        "to-regex-range": {
+          "version": "5.0.1",
+          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+          "dev": true,
+          "requires": {
+            "is-number": "^7.0.0"
+          }
         }
       }
     },
-    "strip-bom": {
+    "stylelint-config-recommended": {
       "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
-      "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
-      "dev": true
-    },
-    "strip-eof": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
-      "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
-      "dev": true
-    },
-    "strip-final-newline": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
-      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-4.0.0.tgz",
+      "integrity": "sha512-sgna89Ng+25Hr9kmmaIxpGWt2LStVm1xf1807PdcWasiPDaOTkOHRL61sINw0twky7QMzafCGToGDnHT/kTHtQ==",
       "dev": true
     },
-    "strip-indent": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
-      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+    "stylelint-config-standard": {
+      "version": "21.0.0",
+      "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-21.0.0.tgz",
+      "integrity": "sha512-Yf6mx5oYEbQQJxWuW7X3t1gcxqbUx52qC9SMS3saC2ruOVYEyqmr5zSW6k3wXflDjjFrPhar3kp68ugRopmlzg==",
       "dev": true,
       "requires": {
-        "min-indent": "^1.0.0"
+        "stylelint-config-recommended": "^4.0.0"
       }
     },
-    "strip-json-comments": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
-      "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
-      "dev": true
-    },
-    "style-inject": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/style-inject/-/style-inject-0.3.0.tgz",
-      "integrity": "sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==",
-      "dev": true
-    },
-    "style-search": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
-      "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=",
-      "dev": true
-    },
-    "stylehacks": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
-      "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+    "sugarss": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
+      "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
       "dev": true,
       "requires": {
-        "browserslist": "^4.0.0",
-        "postcss": "^7.0.0",
-        "postcss-selector-parser": "^3.0.0"
+        "postcss": "^7.0.2"
       },
       "dependencies": {
-        "dot-prop": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
-          "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
+        "chalk": {
+          "version": "2.4.2",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
           "dev": true,
           "requires": {
-            "is-obj": "^2.0.0"
+            "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.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+              "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+              "dev": true,
+              "requires": {
+                "has-flag": "^3.0.0"
+              }
+            }
           }
         },
-        "is-obj": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
-          "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+        "postcss": {
+          "version": "7.0.35",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+          "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+          "dev": true,
+          "requires": {
+            "chalk": "^2.4.2",
+            "source-map": "^0.6.1",
+            "supports-color": "^6.1.0"
+          }
+        },
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
-        "postcss-selector-parser": {
-          "version": "3.1.2",
-          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
-          "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+        "supports-color": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
           "dev": true,
           "requires": {
-            "dot-prop": "^5.2.0",
-            "indexes-of": "^1.0.1",
-            "uniq": "^1.0.1"
+            "has-flag": "^3.0.0"
           }
         }
       }
     },
-    "stylelint": {
-      "version": "13.7.2",
-      "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.7.2.tgz",
-      "integrity": "sha512-mmieorkfmO+ZA6CNDu1ic9qpt4tFvH2QUB7vqXgrMVHe5ENU69q7YDq0YUg/UHLuCsZOWhUAvcMcLzLDIERzSg==",
+    "supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
       "dev": true,
       "requires": {
-        "@stylelint/postcss-css-in-js": "^0.37.2",
-        "@stylelint/postcss-markdown": "^0.36.1",
-        "autoprefixer": "^9.8.6",
-        "balanced-match": "^1.0.0",
-        "chalk": "^4.1.0",
-        "cosmiconfig": "^7.0.0",
-        "debug": "^4.1.1",
-        "execall": "^2.0.0",
-        "fast-glob": "^3.2.4",
-        "fastest-levenshtein": "^1.0.12",
-        "file-entry-cache": "^5.0.1",
-        "get-stdin": "^8.0.0",
-        "global-modules": "^2.0.0",
-        "globby": "^11.0.1",
-        "globjoin": "^0.1.4",
-        "html-tags": "^3.1.0",
-        "ignore": "^5.1.8",
-        "import-lazy": "^4.0.0",
-        "imurmurhash": "^0.1.4",
-        "known-css-properties": "^0.19.0",
-        "lodash": "^4.17.20",
-        "log-symbols": "^4.0.0",
-        "mathml-tag-names": "^2.1.3",
-        "meow": "^7.1.1",
-        "micromatch": "^4.0.2",
-        "normalize-selector": "^0.2.0",
-        "postcss": "^7.0.32",
-        "postcss-html": "^0.36.0",
-        "postcss-less": "^3.1.4",
-        "postcss-media-query-parser": "^0.2.3",
-        "postcss-resolve-nested-selector": "^0.1.1",
-        "postcss-safe-parser": "^4.0.2",
-        "postcss-sass": "^0.4.4",
-        "postcss-scss": "^2.1.1",
-        "postcss-selector-parser": "^6.0.2",
-        "postcss-syntax": "^0.36.2",
-        "postcss-value-parser": "^4.1.0",
-        "resolve-from": "^5.0.0",
-        "slash": "^3.0.0",
-        "specificity": "^0.4.1",
-        "string-width": "^4.2.0",
-        "strip-ansi": "^6.0.0",
-        "style-search": "^0.1.0",
-        "sugarss": "^2.0.0",
-        "svg-tags": "^1.0.0",
-        "table": "^6.0.1",
-        "v8-compile-cache": "^2.1.1",
-        "write-file-atomic": "^3.0.3"
+        "has-flag": "^3.0.0"
+      }
+    },
+    "supports-hyperlinks": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
+      "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
+      "dev": true,
+      "requires": {
+        "has-flag": "^4.0.0",
+        "supports-color": "^7.0.0"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
-          "dev": true,
-          "requires": {
-            "@types/color-name": "^1.1.1",
-            "color-convert": "^2.0.1"
-          }
-        },
-        "astral-regex": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
-          "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "autoprefixer": {
-          "version": "9.8.6",
-          "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
-          "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "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"
+            "has-flag": "^4.0.0"
           }
-        },
-        "braces": {
-          "version": "3.0.2",
-          "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-          "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+        }
+      }
+    },
+    "svg-tags": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+      "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
+      "dev": true
+    },
+    "svg-to-pdfkit": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz",
+      "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==",
+      "requires": {
+        "pdfkit": ">=0.8.1"
+      }
+    },
+    "svgo": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.2.2.tgz",
+      "integrity": "sha512-kJugY2d0yrsONnG4YavppVkKmKULMw2iFRbB9+usyWqzTaqoBuUaqdMnQ2G1n5P1dmOA2tZvc5zmMM6sPOVBSQ==",
+      "dev": true,
+      "requires": {
+        "@trysound/sax": "0.1.1",
+        "chalk": "^4.1.0",
+        "commander": "^7.1.0",
+        "css-select": "^3.1.2",
+        "css-tree": "^1.1.2",
+        "csso": "^4.2.0",
+        "stable": "^0.1.8"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
-            "fill-range": "^7.0.1"
+            "color-convert": "^2.0.1"
           }
         },
         "chalk": {
@@ -16704,60 +20852,76 @@
           "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
           "dev": true
         },
-        "cosmiconfig": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz",
-          "integrity": "sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA==",
+        "commander": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+          "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+          "dev": true
+        },
+        "css-select": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/css-select/-/css-select-3.1.2.tgz",
+          "integrity": "sha512-qmss1EihSuBNWNNhHjxzxSfJoFBM/lERB/Q4EnsJQQC62R2evJDW481091oAdOr9uh46/0n4nrg0It5cAnj1RA==",
           "dev": true,
           "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"
+            "boolbase": "^1.0.0",
+            "css-what": "^4.0.0",
+            "domhandler": "^4.0.0",
+            "domutils": "^2.4.3",
+            "nth-check": "^2.0.0"
           }
         },
-        "fast-glob": {
-          "version": "3.2.4",
-          "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
-          "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
+        "css-tree": {
+          "version": "1.1.2",
+          "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.2.tgz",
+          "integrity": "sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ==",
           "dev": true,
           "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"
+            "mdn-data": "2.0.14",
+            "source-map": "^0.6.1"
           }
         },
-        "fill-range": {
-          "version": "7.0.1",
-          "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-          "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+        "css-what": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/css-what/-/css-what-4.0.0.tgz",
+          "integrity": "sha512-teijzG7kwYfNVsUh2H/YN62xW3KK9YhXEgSlbxMlcyjPNvdKJqFx5lrwlJgoFP1ZHlB89iGDlo/JyshKeRhv5A==",
+          "dev": true
+        },
+        "dom-serializer": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.2.0.tgz",
+          "integrity": "sha512-n6kZFH/KlCrqs/1GHMOd5i2fd/beQHuehKdWvNNffbGHTr/almdhuVvTVFb3V7fglz+nC50fFusu3lY33h12pA==",
           "dev": true,
           "requires": {
-            "to-regex-range": "^5.0.1"
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.0.0",
+            "entities": "^2.0.0"
           }
         },
-        "global-modules": {
-          "version": "2.0.0",
-          "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-          "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+        "domelementtype": {
+          "version": "2.1.0",
+          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz",
+          "integrity": "sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w==",
+          "dev": true
+        },
+        "domhandler": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.0.0.tgz",
+          "integrity": "sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA==",
           "dev": true,
           "requires": {
-            "global-prefix": "^3.0.0"
+            "domelementtype": "^2.1.0"
           }
         },
-        "global-prefix": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-          "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+        "domutils": {
+          "version": "2.5.0",
+          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.5.0.tgz",
+          "integrity": "sha512-Ho16rzNMOFk2fPwChGh3D2D9OEHAfG19HgmRR2l+WLSsIstNsAYBzePH412bL0y5T44ejABIVfTHQ8nqi/tBCg==",
           "dev": true,
           "requires": {
-            "ini": "^1.3.5",
-            "kind-of": "^6.0.2",
-            "which": "^1.3.1"
+            "dom-serializer": "^1.0.1",
+            "domelementtype": "^2.0.1",
+            "domhandler": "^4.0.0"
           }
         },
         "has-flag": {
@@ -16766,79 +20930,89 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "import-fresh": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
-          "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+        "mdn-data": {
+          "version": "2.0.14",
+          "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+          "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+          "dev": true
+        },
+        "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==",
           "dev": true,
           "requires": {
-            "parent-module": "^1.0.0",
-            "resolve-from": "^4.0.0"
-          },
-          "dependencies": {
-            "resolve-from": {
-              "version": "4.0.0",
-              "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
-              "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
-              "dev": true
-            }
+            "boolbase": "^1.0.0"
           }
         },
-        "is-fullwidth-code-point": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-          "dev": true
-        },
-        "is-number": {
-          "version": "7.0.0",
-          "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-          "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+        "source-map": {
+          "version": "0.6.1",
+          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
-        "micromatch": {
-          "version": "4.0.2",
-          "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-          "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
-            "braces": "^3.0.1",
-            "picomatch": "^2.0.5"
+            "has-flag": "^4.0.0"
           }
-        },
-        "parse-json": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-          "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+        }
+      }
+    },
+    "symbol-observable": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
+      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
+    },
+    "table": {
+      "version": "6.0.7",
+      "resolved": "https://registry.npmjs.org/table/-/table-6.0.7.tgz",
+      "integrity": "sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g==",
+      "dev": true,
+      "requires": {
+        "ajv": "^7.0.2",
+        "lodash": "^4.17.20",
+        "slice-ansi": "^4.0.0",
+        "string-width": "^4.2.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "7.2.3",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.2.3.tgz",
+          "integrity": "sha512-idv5WZvKVXDqKralOImQgPM9v6WOdLNa0IY3B3doOjw/YxRGT8I+allIJ6kd7Uaj+SF1xZUSU+nPM5aDNBVtnw==",
           "dev": true,
           "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"
+            "fast-deep-equal": "^3.1.1",
+            "json-schema-traverse": "^1.0.0",
+            "require-from-string": "^2.0.2",
+            "uri-js": "^4.2.2"
           }
         },
-        "resolve-from": {
+        "ansi-regex": {
           "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-          "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+          "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
           "dev": true
         },
-        "slice-ansi": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
-          "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.0.0",
-            "astral-regex": "^2.0.0",
-            "is-fullwidth-code-point": "^3.0.0"
-          }
+        "is-fullwidth-code-point": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+          "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+          "dev": true
+        },
+        "json-schema-traverse": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+          "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+          "dev": true
         },
         "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
           "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
@@ -16854,213 +21028,181 @@
           "requires": {
             "ansi-regex": "^5.0.0"
           }
+        }
+      }
+    },
+    "tailwindcss": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.0.4.tgz",
+      "integrity": "sha512-WhgR0oiBxGOZ9jY0yVfaJCHnckR7U74Fs/BMsYxGdwGJQ5Hd/HlaKD26bEJFZOvYScJo0QcUj2ImldzedsG7Bw==",
+      "dev": true,
+      "requires": {
+        "@fullhuman/postcss-purgecss": "^3.1.3",
+        "bytes": "^3.0.0",
+        "chalk": "^4.1.0",
+        "color": "^3.1.3",
+        "detective": "^5.2.0",
+        "didyoumean": "^1.2.1",
+        "fs-extra": "^9.1.0",
+        "html-tags": "^3.1.0",
+        "lodash": "^4.17.21",
+        "modern-normalize": "^1.0.0",
+        "node-emoji": "^1.8.1",
+        "object-hash": "^2.1.1",
+        "postcss-functions": "^3",
+        "postcss-js": "^3.0.3",
+        "postcss-nested": "^5.0.5",
+        "postcss-selector-parser": "^6.0.4",
+        "postcss-value-parser": "^4.1.0",
+        "pretty-hrtime": "^1.0.3",
+        "reduce-css-calc": "^2.1.8",
+        "resolve": "^1.20.0"
+      },
+      "dependencies": {
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        "chalk": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+          "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
           }
         },
-        "table": {
-          "version": "6.0.3",
-          "resolved": "https://registry.npmjs.org/table/-/table-6.0.3.tgz",
-          "integrity": "sha512-8321ZMcf1B9HvVX/btKv8mMZahCjn2aYrDlpqHaBFCfnox64edeH9kEid0vTLTRR8gWR2A20aDgeuTTea4sVtw==",
+        "color": {
+          "version": "3.1.3",
+          "resolved": "https://registry.npmjs.org/color/-/color-3.1.3.tgz",
+          "integrity": "sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ==",
           "dev": true,
           "requires": {
-            "ajv": "^6.12.4",
-            "lodash": "^4.17.20",
-            "slice-ansi": "^4.0.0",
-            "string-width": "^4.2.0"
+            "color-convert": "^1.9.1",
+            "color-string": "^1.5.4"
+          },
+          "dependencies": {
+            "color-convert": {
+              "version": "1.9.3",
+              "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+              "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+              "dev": true,
+              "requires": {
+                "color-name": "1.1.3"
+              }
+            },
+            "color-name": {
+              "version": "1.1.3",
+              "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+              "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+              "dev": true
+            }
           }
         },
-        "to-regex-range": {
-          "version": "5.0.1",
-          "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-          "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
           "dev": true,
           "requires": {
-            "is-number": "^7.0.0"
+            "color-name": "~1.1.4"
           }
-        }
-      }
-    },
-    "stylelint-config-recommended": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz",
-      "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==",
-      "dev": true
-    },
-    "stylelint-config-standard": {
-      "version": "20.0.0",
-      "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz",
-      "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==",
-      "dev": true,
-      "requires": {
-        "stylelint-config-recommended": "^3.0.0"
-      }
-    },
-    "sugarss": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
-      "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==",
-      "dev": true,
-      "requires": {
-        "postcss": "^7.0.2"
-      }
-    },
-    "supports-color": {
-      "version": "5.5.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^3.0.0"
-      }
-    },
-    "supports-hyperlinks": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz",
-      "integrity": "sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0",
-        "supports-color": "^7.0.0"
-      },
-      "dependencies": {
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true
+        },
+        "color-string": {
+          "version": "1.5.5",
+          "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.5.tgz",
+          "integrity": "sha512-jgIoum0OfQfq9Whcfc2z/VhCNcmQjWbey6qBX0vqt7YICflUmBCh9E9CiQD5GSJ+Uehixm3NUwHVhqUAWRivZg==",
+          "dev": true,
+          "requires": {
+            "color-name": "^1.0.0",
+            "simple-swizzle": "^0.2.2"
+          }
+        },
+        "fs-extra": {
+          "version": "9.1.0",
+          "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+          "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+          "dev": true,
+          "requires": {
+            "at-least-node": "^1.0.0",
+            "graceful-fs": "^4.2.0",
+            "jsonfile": "^6.0.1",
+            "universalify": "^2.0.0"
+          }
+        },
         "has-flag": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+        "jsonfile": {
+          "version": "6.1.0",
+          "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+          "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+          "dev": true,
+          "requires": {
+            "graceful-fs": "^4.1.6",
+            "universalify": "^2.0.0"
+          }
+        },
+        "lodash": {
+          "version": "4.17.21",
+          "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+          "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+          "dev": true
+        },
+        "postcss-selector-parser": {
+          "version": "6.0.4",
+          "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
+          "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
           "dev": true,
           "requires": {
-            "has-flag": "^4.0.0"
+            "cssesc": "^3.0.0",
+            "indexes-of": "^1.0.1",
+            "uniq": "^1.0.1",
+            "util-deprecate": "^1.0.2"
           }
-        }
-      }
-    },
-    "svg-tags": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
-      "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
-      "dev": true
-    },
-    "svg-to-pdfkit": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/svg-to-pdfkit/-/svg-to-pdfkit-0.1.8.tgz",
-      "integrity": "sha512-QItiGZBy5TstGy+q8mjQTMGRlDDOARXLxH+sgVm1n/LYeo0zFcQlcCh8m4zi8QxctrxB9Kue/lStc/RD5iLadQ==",
-      "requires": {
-        "pdfkit": ">=0.8.1"
-      }
-    },
-    "svgo": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
-      "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
-      "dev": true,
-      "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.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+        },
+        "resolve": {
+          "version": "1.20.0",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+          "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^3.2.1",
-            "escape-string-regexp": "^1.0.5",
-            "supports-color": "^5.3.0"
+            "is-core-module": "^2.2.0",
+            "path-parse": "^1.0.6"
           }
-        }
-      }
-    },
-    "symbol-observable": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
-      "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
-    },
-    "table": {
-      "version": "5.4.6",
-      "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
-      "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
-      "dev": true,
-      "requires": {
-        "ajv": "^6.10.2",
-        "lodash": "^4.17.14",
-        "slice-ansi": "^2.1.0",
-        "string-width": "^3.0.0"
-      },
-      "dependencies": {
-        "emoji-regex": {
-          "version": "7.0.3",
-          "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-          "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-          "dev": true
         },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
           "dev": true,
           "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
+            "has-flag": "^4.0.0"
           }
+        },
+        "universalify": {
+          "version": "2.0.0",
+          "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+          "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+          "dev": true
         }
       }
     },
-    "tailwindcss": {
-      "version": "1.9.5",
-      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.5.tgz",
-      "integrity": "sha512-Je5t1fAfyW333YTpSxF+8uJwbnrkpyBskDtZYgSMMKQbNp6QUhEKJ4g/JIevZjD2Zidz9VxLraEUq/yWOx6nQg==",
-      "dev": true,
-      "requires": {
-        "@fullhuman/postcss-purgecss": "^2.1.2",
-        "autoprefixer": "^9.4.5",
-        "browserslist": "^4.12.0",
-        "bytes": "^3.0.0",
-        "chalk": "^3.0.0 || ^4.0.0",
-        "color": "^3.1.2",
-        "detective": "^5.2.0",
-        "fs-extra": "^8.0.0",
-        "html-tags": "^3.1.0",
-        "lodash": "^4.17.20",
-        "node-emoji": "^1.8.1",
-        "normalize.css": "^8.0.1",
-        "object-hash": "^2.0.3",
-        "postcss": "^7.0.11",
-        "postcss-functions": "^3.0.0",
-        "postcss-js": "^2.0.0",
-        "postcss-nested": "^4.1.1",
-        "postcss-selector-parser": "^6.0.0",
-        "postcss-value-parser": "^4.1.0",
-        "pretty-hrtime": "^1.0.3",
-        "reduce-css-calc": "^2.1.6",
-        "resolve": "^1.14.2"
-      }
-    },
     "tape": {
       "version": "4.13.3",
       "resolved": "https://registry.npmjs.org/tape/-/tape-4.13.3.tgz",
@@ -17105,21 +21247,22 @@
       "dev": true
     },
     "tempy": {
-      "version": "0.5.0",
-      "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.5.0.tgz",
-      "integrity": "sha512-VEY96x7gbIRfsxqsafy2l5yVxxp3PhwAGoWMyC2D2Zt5DmEv+2tGiPOrquNRpf21hhGnKLVEsuqleqiZmKG/qw==",
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/tempy/-/tempy-1.0.1.tgz",
+      "integrity": "sha512-biM9brNqxSc04Ee71hzFbryD11nX7VPhQQY32AdDmjFvodsRFz/3ufeoTZ6uYkRFfGo188tENcASNs3vTdsM0w==",
       "dev": true,
       "requires": {
+        "del": "^6.0.0",
         "is-stream": "^2.0.0",
         "temp-dir": "^2.0.0",
-        "type-fest": "^0.12.0",
+        "type-fest": "^0.16.0",
         "unique-string": "^2.0.0"
       },
       "dependencies": {
         "type-fest": {
-          "version": "0.12.0",
-          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz",
-          "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==",
+          "version": "0.16.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz",
+          "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==",
           "dev": true
         }
       }
@@ -17167,13 +21310,25 @@
       "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
     },
     "through2": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz",
-      "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==",
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz",
+      "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==",
       "dev": true,
       "requires": {
-        "inherits": "^2.0.4",
-        "readable-stream": "2 || 3"
+        "readable-stream": "3"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+          "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+          "dev": true,
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
       }
     },
     "timsort": {
@@ -17261,12 +21416,6 @@
       "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=",
       "dev": true
     },
-    "trim": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
-      "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
-      "dev": true
-    },
     "trim-newlines": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz",
@@ -17279,12 +21428,6 @@
       "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
       "dev": true
     },
-    "trim-trailing-lines": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz",
-      "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==",
-      "dev": true
-    },
     "trough": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
@@ -17298,9 +21441,9 @@
       "dev": true
     },
     "tsutils": {
-      "version": "3.17.1",
-      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
-      "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
+      "version": "3.21.0",
+      "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+      "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
       "dev": true,
       "requires": {
         "tslib": "^1.8.1"
@@ -17321,9 +21464,9 @@
       }
     },
     "type-fest": {
-      "version": "0.13.1",
-      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
-      "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+      "version": "0.18.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+      "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
       "dev": true
     },
     "typedarray": {
@@ -17341,9 +21484,9 @@
       }
     },
     "typescript": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz",
-      "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==",
+      "version": "4.2.3",
+      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
+      "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
       "dev": true
     },
     "uc.micro": {
@@ -17395,14 +21538,15 @@
       "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
       "optional": true
     },
-    "unherit": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
-      "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
-      "dev": true,
+    "unbox-primitive": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.0.tgz",
+      "integrity": "sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA==",
       "requires": {
-        "inherits": "^2.0.0",
-        "xtend": "^4.0.0"
+        "function-bind": "^1.1.1",
+        "has-bigints": "^1.0.0",
+        "has-symbols": "^1.0.0",
+        "which-boxed-primitive": "^1.0.1"
       }
     },
     "unicode-canonical-property-names-ecmascript": {
@@ -17437,9 +21581,9 @@
       },
       "dependencies": {
         "base64-js": {
-          "version": "1.3.1",
-          "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
-          "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g=="
+          "version": "1.5.1",
+          "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+          "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
         },
         "unicode-trie": {
           "version": "2.0.0",
@@ -17468,9 +21612,9 @@
       }
     },
     "unified": {
-      "version": "9.2.0",
-      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz",
-      "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==",
+      "version": "9.2.1",
+      "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz",
+      "integrity": "sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA==",
       "dev": true,
       "requires": {
         "bail": "^1.0.0",
@@ -17482,9 +21626,9 @@
       },
       "dependencies": {
         "is-buffer": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
-          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
           "dev": true
         },
         "is-plain-obj": {
@@ -17529,29 +21673,20 @@
       }
     },
     "unist-util-find-all-after": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.1.tgz",
-      "integrity": "sha512-0GICgc++sRJesLwEYDjFVJPJttBpVQaTNgc6Jw0Jhzvfs+jtKePEMu+uD+PqkRUrAvGQqwhpDwLGWo1PK8PDEw==",
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+      "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
       "dev": true,
       "requires": {
         "unist-util-is": "^4.0.0"
       }
     },
     "unist-util-is": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.2.tgz",
-      "integrity": "sha512-Ofx8uf6haexJwI1gxWMGg6I/dLnF2yE+KibhD3/diOqY2TinLcqHXCV6OI5gFVn3xQqDH+u0M625pfKwIwgBKQ==",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+      "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
       "dev": true
     },
-    "unist-util-remove-position": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz",
-      "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==",
-      "dev": true,
-      "requires": {
-        "unist-util-visit": "^2.0.0"
-      }
-    },
     "unist-util-stringify-position": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
@@ -17561,35 +21696,11 @@
         "@types/unist": "^2.0.2"
       }
     },
-    "unist-util-visit": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz",
-      "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==",
-      "dev": true,
-      "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.0",
-      "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.0.tgz",
-      "integrity": "sha512-0g4wbluTF93npyPrp/ymd3tCDTMnP0yo2akFD2FIBAYXq/Sga3lwaU1D8OYKbtpioaI6CkDcQ6fsMnmtzt7htw==",
-      "dev": true,
-      "requires": {
-        "@types/unist": "^2.0.0",
-        "unist-util-is": "^4.0.0"
-      }
-    },
     "universal-user-agent": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz",
-      "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==",
-      "dev": true,
-      "requires": {
-        "os-name": "^3.1.0"
-      }
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+      "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==",
+      "dev": true
     },
     "universalify": {
       "version": "0.1.2",
@@ -17644,9 +21755,9 @@
       }
     },
     "uri-js": {
-      "version": "4.4.0",
-      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
-      "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
       "dev": true,
       "requires": {
         "punycode": "^2.1.0"
@@ -17688,9 +21799,9 @@
       }
     },
     "v8-compile-cache": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
-      "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+      "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
       "dev": true
     },
     "validate-npm-package-license": {
@@ -17720,32 +21831,25 @@
       }
     },
     "vfile": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.0.tgz",
-      "integrity": "sha512-a/alcwCvtuc8OX92rqqo7PflxiCgXRFjdyoGVuYV+qbgCb0GgZJRvIgCD4+U/Kl1yhaRsaTwksF88xbPyGsgpw==",
+      "version": "4.2.1",
+      "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+      "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
       "dev": true,
       "requires": {
         "@types/unist": "^2.0.0",
         "is-buffer": "^2.0.0",
-        "replace-ext": "1.0.0",
         "unist-util-stringify-position": "^2.0.0",
         "vfile-message": "^2.0.0"
       },
       "dependencies": {
         "is-buffer": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
-          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
+          "version": "2.0.5",
+          "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+          "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
           "dev": true
         }
       }
     },
-    "vfile-location": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.1.0.tgz",
-      "integrity": "sha512-FCZ4AN9xMcjFIG1oGmZKo61PjwJHRVA+0/tPUP2ul4uIwjGGndIxavEMRpWn5p4xwm/ZsdXp9YNygf1ZyE4x8g==",
-      "dev": true
-    },
     "vfile-message": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
@@ -17770,107 +21874,23 @@
         "isexe": "^2.0.0"
       }
     },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "which-pm-runs": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
-      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=",
-      "dev": true
+    "which-boxed-primitive": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/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"
+      }
     },
     "window-size": {
       "version": "0.1.0",
       "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
       "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
     },
-    "windows-release": {
-      "version": "3.3.3",
-      "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.3.tgz",
-      "integrity": "sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg==",
-      "dev": true,
-      "requires": {
-        "execa": "^1.0.0"
-      },
-      "dependencies": {
-        "cross-spawn": {
-          "version": "6.0.5",
-          "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-          "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-          "dev": true,
-          "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.npmjs.org/execa/-/execa-1.0.0.tgz",
-          "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
-          "dev": true,
-          "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"
-          }
-        },
-        "get-stream": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
-          "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
-          "dev": true,
-          "requires": {
-            "pump": "^3.0.0"
-          }
-        },
-        "is-stream": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-          "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-          "dev": true
-        },
-        "npm-run-path": {
-          "version": "2.0.2",
-          "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
-          "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
-          "dev": true,
-          "requires": {
-            "path-key": "^2.0.0"
-          }
-        },
-        "path-key": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-          "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-          "dev": true
-        },
-        "shebang-command": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
-          "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-          "dev": true,
-          "requires": {
-            "shebang-regex": "^1.0.0"
-          }
-        },
-        "shebang-regex": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-          "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-          "dev": true
-        }
-      }
-    },
     "wmf": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz",
@@ -17892,9 +21912,9 @@
       "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
     },
     "wrap-ansi": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
-      "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+      "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
       "dev": true,
       "requires": {
         "ansi-styles": "^4.0.0",
@@ -17909,12 +21929,11 @@
           "dev": true
         },
         "ansi-styles": {
-          "version": "4.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
-          "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
+          "version": "4.3.0",
+          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
           "dev": true,
           "requires": {
-            "@types/color-name": "^1.1.1",
             "color-convert": "^2.0.1"
           }
         },
@@ -17940,9 +21959,9 @@
           "dev": true
         },
         "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
           "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
@@ -17966,15 +21985,6 @@
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
       "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
     },
-    "write": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
-      "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^0.5.1"
-      }
-    },
     "write-file-atomic": {
       "version": "3.0.3",
       "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
@@ -17988,9 +21998,9 @@
       }
     },
     "xlsx": {
-      "version": "0.16.8",
-      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.8.tgz",
-      "integrity": "sha512-qWub4YCn0xLEGHI7WWhk6IJ73MDu7sPSJQImxN6/LiI8wsHi0hUhICEDbyqBT+jgFgORZxrii0HvhNSwBNAPoQ==",
+      "version": "0.16.9",
+      "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.16.9.tgz",
+      "integrity": "sha512-gxi1I3EasYvgCX1vN9pGyq920Ron4NO8PNfhuoA3Hpq6Y8f0ECXiy4OLrK4QZBnj1jx3QD+8Fq5YZ/3mPZ5iXw==",
       "requires": {
         "adler-32": "~1.2.0",
         "cfb": "^1.1.4",
@@ -17998,6 +22008,7 @@
         "commander": "~2.17.1",
         "crc-32": "~1.2.0",
         "exit-on-epipe": "~1.0.1",
+        "fflate": "^0.3.8",
         "ssf": "~0.11.2",
         "wmf": "~1.0.1",
         "word": "~0.3.0"
@@ -18024,9 +22035,9 @@
       "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
     },
     "y18n": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-      "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+      "version": "5.0.5",
+      "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz",
+      "integrity": "sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==",
       "dev": true
     },
     "yallist": {
@@ -18042,22 +22053,18 @@
       "dev": true
     },
     "yargs": {
-      "version": "15.4.1",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
-      "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+      "version": "16.2.0",
+      "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+      "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
       "dev": true,
       "requires": {
-        "cliui": "^6.0.0",
-        "decamelize": "^1.2.0",
-        "find-up": "^4.1.0",
-        "get-caller-file": "^2.0.1",
+        "cliui": "^7.0.2",
+        "escalade": "^3.1.1",
+        "get-caller-file": "^2.0.5",
         "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
         "string-width": "^4.2.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^18.1.2"
+        "y18n": "^5.0.5",
+        "yargs-parser": "^20.2.2"
       },
       "dependencies": {
         "ansi-regex": {
@@ -18073,9 +22080,9 @@
           "dev": true
         },
         "string-width": {
-          "version": "4.2.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-          "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+          "version": "4.2.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
+          "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
           "dev": true,
           "requires": {
             "emoji-regex": "^8.0.0",
@@ -18095,14 +22102,22 @@
       }
     },
     "yargs-parser": {
-      "version": "18.1.3",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
-      "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
+      "version": "20.2.7",
+      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
+      "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+      "dev": true
+    },
+    "yocto-queue": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+      "dev": true
+    },
+    "zwitch": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
+      "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==",
+      "dev": true
     }
   }
 }
diff --git a/package.json b/package.json
index 1744ab89fe..99f61e00db 100644
--- a/package.json
+++ b/package.json
@@ -9,13 +9,15 @@
     "url": "https://code.podlibre.org/podlibre/castopod.git"
   },
   "scripts": {
-    "build": "npm run build:js && cross-env NODE_ENV=production npm run build:css && npm run build:icons && npm run build:svg",
+    "build": "npm run build:js && cross-env NODE_ENV=production npm run build:css && npm run build:icons && npm run build:svg && npm run copy:images && npm run copy:fonts",
     "watch:js": "rollup --config --watch",
     "build:js": "rollup --config",
     "watch:css": "postcss app/Views/_assets/styles/index.css -o public/assets/index.css -w",
     "build:css": "postcss app/Views/_assets/styles/index.css -o public/assets/index.css",
-    "build:icons": "svgo -f app/Views/_assets/icons -o public/assets/icons --config=./.svgo.icons.yml",
-    "build:svg": "svgo -f app/Views/_assets/images -o public/assets/images -r --config=./.svgo.yml",
+    "build:icons": "svgo -f app/Views/_assets/icons -o public/assets/icons -r --config=./.svgo.icons.js",
+    "build:svg": "svgo -f app/Views/_assets/images -o public/assets/images -r --config=./.svgo.js",
+    "copy:images": "cpy app/Views/_assets/images/*.jpg public/assets/images",
+    "copy:fonts": "cpy app/Views/_assets/fonts public/assets/fonts",
     "lint": "eslint --ext js,ts app/Views/_assets",
     "lint:fix": "eslint --ext js,ts app/Views/_assets --fix",
     "lint:css": "stylelint \"app/Views/_assets/**/*.css\"",
@@ -25,63 +27,66 @@
     "release": "semantic-release"
   },
   "dependencies": {
-    "@amcharts/amcharts4": "^4.10.8",
-    "@amcharts/amcharts4-geodata": "^4.1.17",
-    "@popperjs/core": "^2.5.3",
+    "@amcharts/amcharts4": "^4.10.17",
+    "@amcharts/amcharts4-geodata": "^4.1.19",
+    "@popperjs/core": "^2.9.1",
     "choices.js": "^9.0.1",
-    "flatpickr": "^4.6.6",
+    "flatpickr": "^4.6.9",
     "prosemirror-example-setup": "^1.1.2",
-    "prosemirror-markdown": "^1.5.0",
-    "prosemirror-state": "^1.3.3",
-    "prosemirror-view": "^1.16.0"
+    "prosemirror-markdown": "^1.5.1",
+    "prosemirror-state": "^1.3.4",
+    "prosemirror-view": "^1.18.1"
   },
   "devDependencies": {
-    "@babel/core": "^7.12.3",
-    "@babel/plugin-proposal-class-properties": "^7.12.1",
-    "@babel/preset-env": "^7.12.1",
-    "@babel/preset-typescript": "^7.12.1",
-    "@commitlint/cli": "^11.0.0",
-    "@commitlint/config-conventional": "^11.0.0",
-    "@prettier/plugin-php": "^0.15.1",
-    "@rollup/plugin-babel": "^5.2.1",
-    "@rollup/plugin-commonjs": "^15.1.0",
+    "@babel/core": "^7.13.10",
+    "@babel/plugin-proposal-class-properties": "^7.13.0",
+    "@babel/preset-env": "^7.13.12",
+    "@babel/preset-typescript": "^7.13.0",
+    "@commitlint/cli": "^12.0.1",
+    "@commitlint/config-conventional": "^12.0.1",
+    "@prettier/plugin-php": "^0.16.2",
+    "@rollup/plugin-babel": "^5.3.0",
+    "@rollup/plugin-commonjs": "^17.1.0",
     "@rollup/plugin-json": "^4.1.0",
     "@rollup/plugin-multi-entry": "^4.0.0",
-    "@rollup/plugin-node-resolve": "^9.0.0",
+    "@rollup/plugin-node-resolve": "^11.2.0",
     "@semantic-release/changelog": "^5.0.1",
     "@semantic-release/exec": "^5.0.0",
     "@semantic-release/git": "^9.0.0",
-    "@semantic-release/gitlab": "^6.0.5",
-    "@tailwindcss/custom-forms": "^0.2.1",
-    "@tailwindcss/typography": "^0.2.0",
-    "@types/prosemirror-markdown": "^1.0.3",
-    "@types/prosemirror-view": "^1.16.1",
-    "@typescript-eslint/eslint-plugin": "^4.5.0",
-    "@typescript-eslint/parser": "^4.5.0",
-    "cross-env": "^7.0.2",
+    "@semantic-release/gitlab": "^6.0.9",
+    "@tailwindcss/forms": "^0.2.1",
+    "@tailwindcss/line-clamp": "^0.2.0",
+    "@tailwindcss/typography": "^0.4.0",
+    "@types/prosemirror-markdown": "^1.5.1",
+    "@types/prosemirror-view": "^1.17.1",
+    "@typescript-eslint/eslint-plugin": "^4.19.0",
+    "@typescript-eslint/parser": "^4.19.0",
+    "cpy-cli": "^3.1.1",
+    "cross-env": "^7.0.3",
     "cssnano": "^4.1.10",
     "cz-conventional-changelog": "^3.3.0",
-    "eslint": "^7.11.0",
-    "eslint-config-prettier": "^6.14.0",
-    "eslint-plugin-prettier": "^3.1.4",
-    "husky": "^4.3.0",
-    "lint-staged": "^10.4.2",
-    "postcss-cli": "^8.1.0",
-    "postcss-import": "^12.0.1",
+    "eslint": "^7.22.0",
+    "eslint-config-prettier": "^8.1.0",
+    "eslint-plugin-prettier": "^3.3.1",
+    "husky": "^5.2.0",
+    "lint-staged": "^10.5.4",
+    "postcss": "^8.2.8",
+    "postcss-cli": "^8.3.1",
+    "postcss-import": "^14.0.0",
     "postcss-preset-env": "^6.7.0",
-    "prettier": "2.1.2",
+    "prettier": "2.2.1",
     "prettier-plugin-organize-imports": "^1.1.1",
-    "rollup": "^2.32.1",
-    "rollup-plugin-multi-input": "^1.1.1",
+    "rollup": "^2.42.4",
+    "rollup-plugin-multi-input": "^1.2.0",
     "rollup-plugin-node-polyfills": "^0.2.1",
-    "rollup-plugin-postcss": "^3.1.8",
+    "rollup-plugin-postcss": "^4.0.0",
     "rollup-plugin-terser": "^7.0.2",
-    "semantic-release": "^17.2.1",
-    "stylelint": "^13.7.2",
-    "stylelint-config-standard": "^20.0.0",
-    "svgo": "^1.3.2",
-    "tailwindcss": "^1.9.5",
-    "typescript": "^4.0.3"
+    "semantic-release": "^17.4.2",
+    "stylelint": "^13.12.0",
+    "stylelint-config-standard": "^21.0.0",
+    "svgo": "^2.2.2",
+    "tailwindcss": "^2.0.4",
+    "typescript": "^4.2.3"
   },
   "husky": {
     "hooks": {
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
index 80664cbbfe..c05e50146f 100644
--- a/phpunit.xml.dist
+++ b/phpunit.xml.dist
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<phpunit bootstrap="vendor/codeigniter4/codeigniter4/system/Test/bootstrap.php"
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		bootstrap="vendor/codeigniter4/framework/system/Test/bootstrap.php"
 		backupGlobals="false"
 		colors="true"
 		convertErrorsToExceptions="true"
@@ -8,53 +9,49 @@
 		stopOnError="false"
 		stopOnFailure="false"
 		stopOnIncomplete="false"
-		stopOnSkipped="false">
+		stopOnSkipped="false"
+		xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
+	<coverage includeUncoveredFiles="true" processUncoveredFiles="true">
+		<include>
+			<directory suffix=".php">./app</directory>
+		</include>
+		<exclude>
+			<directory suffix=".php">./app/Views</directory>
+			<file>./app/Config/Routes.php</file>
+		</exclude>
+		<report>
+			<clover outputFile="build/logs/clover.xml"/>
+			<html outputDirectory="build/logs/html"/>
+			<php outputFile="build/logs/coverage.serialized"/>
+			<text outputFile="php://stdout" showUncoveredFiles="false"/>
+		</report>
+	</coverage>
 	<testsuites>
-		<testsuite name="app">
+		<testsuite name="App">
 			<directory>./tests</directory>
 		</testsuite>
 	</testsuites>
-
-	<filter>
-		<whitelist addUncoveredFilesFromWhitelist="true" processUncoveredFilesFromWhitelist="true">
-			<directory suffix=".php">./app</directory>
-			<exclude>
-				<directory suffix=".php">./app/Views</directory>
-				<file>./app/Config/Routes.php</file>
-			</exclude>
-		</whitelist>
-	</filter>
-
 	<logging>
-		<log type="coverage-html" target="build/logs/html"/>
-		<log type="coverage-clover" target="build/logs/clover.xml"/>
-		<log type="coverage-php" target="build/logs/coverage.serialized"/>
-		<log type="coverage-text" target="php://stdout" showUncoveredFiles="false"/>
-		<log type="testdox-html" target="build/logs/testdox.html"/>
-		<log type="testdox-text" target="build/logs/testdox.txt"/>
-		<log type="junit" target="build/logs/logfile.xml"/>
+		<testdoxHtml outputFile="build/logs/testdox.html"/>
+		<testdoxText outputFile="build/logs/testdox.txt"/>
+		<junit outputFile="build/logs/logfile.xml"/>
 	</logging>
-
 	<php>
-		<server name="app.baseURL" value="http://example.com"/>
-
+		<server name="app.baseURL" value="http://example.com/"/>
 		<!-- Directory containing phpunit.xml -->
 		<const name="HOMEPATH" value="./"/>
-
 		<!-- Directory containing the Paths config file -->
 		<const name="CONFIGPATH" value="./app/Config/"/>
-
 		<!-- Directory containing the front controller (index.php) -->
 		<const name="PUBLICPATH" value="./public/"/>
-
 		<!-- Database configuration -->
-<!--	<env name="database.tests.hostname" value="localhost"/>  -->
-<!--	<env name="database.tests.database" value="tests"/>	     -->
-<!--	<env name="database.tests.username" value="tests_user"/> -->
-<!--	<env name="database.tests.password" value=""/>		     -->
-<!--	<env name="database.tests.DBDriver" value="MySQLi"/>	 -->
-<!--	<env name="database.tests.DBPrefix" value="tests_"/>	 -->
-		<env name="database.tests.database" value=":memory:"/>
-		<env name="database.tests.DBDriver" value="SQLite3"/>
+		<!-- Uncomment to provide your own database for testing
+		<env name="database.tests.hostname" value="localhost"/>
+		<env name="database.tests.database" value="tests"/>
+		<env name="database.tests.username" value="tests_user"/>
+		<env name="database.tests.password" value=""/>
+		<env name="database.tests.DBDriver" value="MySQLi"/>
+		<env name="database.tests.DBPrefix" value="tests_"/>
+		-->
 	</php>
-</phpunit>
+</phpunit>
\ No newline at end of file
diff --git a/public/.htaccess b/public/.htaccess
index bc84dae6d0..4ae666b78b 100644
--- a/public/.htaccess
+++ b/public/.htaccess
@@ -18,4 +18,4 @@ ServerSignature Off
 	# If we don't have mod_rewrite installed, all 404's
 	# can be sent to index.php, and everything works as normal.
 	ErrorDocument 404 /index.php
-</IfModule>
\ No newline at end of file
+</IfModule>
diff --git a/public/index.php b/public/index.php
index 9e1f9d1a44..b48871b015 100644
--- a/public/index.php
+++ b/public/index.php
@@ -1,11 +1,11 @@
 <?php
 
 // Valid PHP Version?
-$minPHPVersion = '7.2';
-if (phpversion() < $minPHPVersion) {
+$minPHPVersion = '7.3';
+if (version_compare(PHP_VERSION, $minPHPVersion, '<')) {
     die(
         "Your PHP version must be {$minPHPVersion} or higher to run CodeIgniter. Current version: " .
-            phpversion()
+            PHP_VERSION
     );
 }
 unset($minPHPVersion);
@@ -13,11 +13,6 @@ unset($minPHPVersion);
 // Path to the front controller (this file)
 define('FCPATH', __DIR__ . DIRECTORY_SEPARATOR);
 
-// Location of the Paths config file.
-// This is the line that might need to be changed, depending on your folder structure.
-$pathsPath = realpath(FCPATH . '../app/Config/Paths.php');
-// ^^^ Change this if you move your application folder
-
 /*
  *---------------------------------------------------------------
  * BOOTSTRAP THE APPLICATION
@@ -31,11 +26,19 @@ $pathsPath = realpath(FCPATH . '../app/Config/Paths.php');
 chdir(__DIR__);
 
 // Load our paths config file
-require $pathsPath;
+// This is the line that might need to be changed, depending on your folder structure.
+require realpath(FCPATH . '../app/Config/Paths.php') ?:
+    FCPATH . '../app/Config/Paths.php';
+// ^^^ Change this if you move your application folder
+
 $paths = new Config\Paths();
 
 // Location of the framework bootstrap file.
-$app = require rtrim($paths->systemDirectory, '/ ') . '/bootstrap.php';
+$bootstrap =
+    rtrim($paths->systemDirectory, '\\/ ') .
+    DIRECTORY_SEPARATOR .
+    'bootstrap.php';
+$app = require realpath($bootstrap) ?: $bootstrap;
 
 /*
  *---------------------------------------------------------------
diff --git a/public/media/persons/index.html b/public/media/persons/index.html
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/public/media/podcasts/index.html b/public/media/podcasts/index.html
new file mode 100644
index 0000000000..eebf8ecb2b
--- /dev/null
+++ b/public/media/podcasts/index.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <title>403 Forbidden</title>
+  </head>
+  <body>
+    <p>Directory access is forbidden.</p>
+  </body>
+</html>
diff --git a/spark b/spark
index a02ea6e43e..83a5cc25c3 100644
--- a/spark
+++ b/spark
@@ -1,5 +1,15 @@
 #!/usr/bin/env php
 <?php
+// Valid PHP Version?
+$minPHPVersion = "7.3";
+if (version_compare(PHP_VERSION, $minPHPVersion, "<")) {
+    die(
+        "Your PHP version must be {$minPHPVersion} or higher to run CodeIgniter. Current version: " .
+            PHP_VERSION
+    );
+}
+unset($minPHPVersion);
+
 /*
  * --------------------------------------------------------------------
  * CodeIgniter command-line tools
@@ -11,7 +21,7 @@
  * this class mainly acts as a passthru to the framework itself.
  */
 
-define('SPARKED', true);
+define("SPARKED", true);
 
 /*
  *---------------------------------------------------------------
@@ -23,17 +33,20 @@ define('SPARKED', true);
  */
 
 // Refuse to run when called from php-cgi
-if (substr(php_sapi_name(), 0, 3) === 'cgi') {
+if (strpos(PHP_SAPI, "cgi") === 0) {
     die(
         "The cli tool is not supported when running php-cgi. It needs php-cli to function!\n\n"
     );
 }
 
 // Path to the front controller
-define('FCPATH', __DIR__ . '/public' . DIRECTORY_SEPARATOR);
+define(
+    "FCPATH",
+    __DIR__ . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR
+);
 
 // Load our paths config file
-require 'app/Config/Paths.php';
+require realpath("app/Config/Paths.php") ?: "app/Config/Paths.php";
 // ^^^ Change this line if you move your application folder
 
 $paths = new Config\Paths();
@@ -41,14 +54,18 @@ $paths = new Config\Paths();
 // Ensure the current directory is pointing to the front controller's directory
 chdir(FCPATH);
 
-$app = require rtrim($paths->systemDirectory, '/ ') . '/bootstrap.php';
+$bootstrap =
+    rtrim($paths->systemDirectory, "\\/ ") .
+    DIRECTORY_SEPARATOR .
+    "bootstrap.php";
+$app = require realpath($bootstrap) ?: $bootstrap;
 
 // Grab our Console
-$console = new \CodeIgniter\CLI\Console($app);
+$console = new CodeIgniter\CLI\Console($app);
 
 // We want errors to be shown when using it from the CLI.
 error_reporting(-1);
-ini_set('display_errors', 1);
+ini_set("display_errors", "1");
 
 // Show basic information before we do anything else.
 $console->showHeader();
diff --git a/tailwind.config.js b/tailwind.config.js
index 7d19c1261a..9d3bc16212 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -2,18 +2,51 @@
 
 module.exports = {
   purge: ["./app/Views/**/*.php", "./app/Views/**/*.ts", "./app/Helpers/*.php"],
-  theme: {},
-  variants: {
-    textDecoration: ["responsive", "hover", "focus", "group-hover"],
+  theme: {
+    extend: {
+      fontFamily: {
+        sans: ["Montserrat", "sans-serif"],
+        display: ["Kumbh Sans", "sans-serif"],
+        body: ["Montserrat", "sans-serif"],
+      },
+      colors: {
+        pine: {
+          50: "#ebf8f8",
+          100: "#cff7f3",
+          200: "#9df2e4",
+          300: "#5ee8d4",
+          400: "#1cd7ba",
+          500: "#08c09a",
+          600: "#07a57d",
+          700: "#009486",
+          800: "#006D60",
+          900: "#00564A",
+        },
+        rose: {
+          50: "#fcf9f8",
+          100: "#fdeef2",
+          200: "#fbcfe4",
+          300: "#faa7cd",
+          400: "#fb6ea5",
+          500: "#fc437c",
+          600: "#f24664",
+          700: "#dd1f47",
+          800: "#b21a39",
+          900: "#8e162e",
+        },
+      },
+      spacing: {
+        112: "28rem",
+      },
+      gridTemplateColumns: {
+        podcasts: "repeat(auto-fill, minmax(14rem, 1fr))",
+      },
+    },
   },
+  variants: {},
   plugins: [
-    require("@tailwindcss/custom-forms"),
+    require("@tailwindcss/forms"),
     require("@tailwindcss/typography"),
+    require("@tailwindcss/line-clamp"),
   ],
-  future: {
-    removeDeprecatedGapUtilities: true,
-    purgeLayersByDefault: true,
-    defaultLineHeights: true,
-    standardFontWeights: true,
-  },
 };
-- 
GitLab