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. +<<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. + + <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 +<<http://www.gnu.org/licenses/>>. 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.  @@ -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 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 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 zcmXT-cQayOWME)m@OEGj1kpQ|Ffe%ChKPaqs8}jO`l*ym2M1dML#qHsV+!Z2TtN=5 z#)ArtEA+TqG#D7om{gcM>{t|7o2%G6Gk6+9rSGpWJ+&>?h$~B7VC{ahpRKZ;0%m+o z=E>iCoDv>0JlOpI(x(6adlnb=lwB@!xbj_K^Vumz6Q2e|XRlqz?N_N`u_Ak&_2IA? zbLCr0oy0=4HoAA;44EwdZNWX2hjM8qdCR;)171Fm4&}NmAaYjw$h<&fxig>69_yB` ziplg)T)enK>EUbpeKWnKPOr9?`5XG>Me9A*;>W?AbqB?_tY3FwZmZ_4Bf%w0j8{D2 z$&vm!dCnf2`;YH`erNpMu11j|qGW>B^*0g6OT$j>Sp2->*{WA3Rs5!CDDucPc{WuG za6j6mb*^jkyET90vQHJh$$uaz{wdB?rT$Feu7{OBeg{6k_g$T9wP$*c8FP0~3GZT_ z@PfCzABtaZydXJ4S!Mdkh$px2MPH5Hq!4CsqeHApW6Pa~tsm{f7CnkR&%M{+)v7iB zkG@#l_J7}ByL$T-cebB%;15~AEc?P?cJ`qq?mHIrr9Hf$Q50D?-$AhP-_zz@cGZ(o z6Fi?KMsH%b`O+vRo1pdU%F9hJXYD`uP2kn*RlDcEvyC&)NH^WvvUb<HMPfhm8vg&c z`ubOYb;107wN{_azP*v>@f4XRJ>5B_bj$Ti9t^?@g!BXsDZiWketV-_QhrNTkx*<) zmqA|G`e*6o=g%BIEaji?cg@X&FGfs1(J-oUO})jR0KKcHJ{)p*$hz>7%h&TWQ}5PB zyYKdPP2S0;`FMie!v^MiqPK+QpNaK5C|{7M+mp_<{cb|ry*Gh5U%4OL|Mh3*O_h!t zO5eXJnfp4k?OAeY|30}t7rveC5~`Uc&KB?ZCS~Ir@ekJX7o6O_XxWO(q59p@JMzL` z-<c%m!pQLN|FT=rKj)OEb8y}{5&3fd(|<mn*-y@tuJZC;{_1~>WqaAPyOK6%V$L*3 z2xup0bSP|SR1kG=U{neJHHXoISL0WG*Y0YOIZt$+^GxLWIOA7Q-^!w=mv<L^^$uU# zeJfP&)UD<If1K}pzx@B1&trKDF2#o>(RuS19lyBk(zfPw3A3BeYl}8*zQesD<*ugf z?}$UM@4T$oP|`SMmFBT7)^|qJGKJ<nx_sDZR`Ce|!(HEZfBw7tzNh8gz2{}zOXEWW z7b__x^+*^dx!m2K{dD#3H=Rc`McSX4FdhngGTBOQf7t&8|M$<ow*1AJoKx4b8YP;h zXo(;EWb=OeU-N*5qYNTqa|D#qxC<XJUcBJ2=ZC|e7N<k5PK%B@3%yW?T&1`*N+H)u zkt0IGgYVKq_hTx}4`+XC(^9Z|Vt%zjR^~!gL;T;1%i9!V%Uzv$CI0pP6pX0}4w|;N zeW79^ug)*dh;N4-?|ILazpTkoX`O#|Qsllod)?D1Ig_${!|NZlKL6Nbdnit~P<%tn z_XVP>|97R|vu0SgHBnBag=v}8-V?b(K8eX47HpPG&u32H;mBTBuz}<C?)!IVGDtBx zH=K1kZME;Al250^%WrFX*2nF9D`TnDGWE!1+oMlyj#loptnn6;lYX)1x$^zrH`o9B zuzX?az0dO+`)g8WzOT)H624#R_hI=n^SvW^kKMZwX=voPP<lOwZvcy$mdRw1l_$F< zYI2<qIeNpyHO)KzOxSIYocG<g6V*4yavjZU&04Rt%|G$x{p$x9*$ZWZ3fe{YDR-SH zY<;rCsc6^wJC@=eJQ_m0PefCfhEI)LuX*zIsWs+Pp7^FN?f<R!<H+)`pE13s%=bNA z`h3}+o>K?(mvEi<=bQQO>-?P;9nMI-i%ss?pJ$qG>|uK~=l$GcLa{frHyWp|TO#;9 zQ0e!_DYF&l>#Pajcvb4Ad?=~1Ytmbu>Yi=R3D?TIqj$1&7>r?)jEm{uW(%)>5 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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 zcmXT-cXMN4WME)mh~B{<2%@)IFfc+yKs;pZ?&9jkz`)qRz`)?nz`zi}oX#BQ9^fC$ zz`%HdfkEgT1B20`duJaAxd(?jF))bCU|?W8%)r3Hu}9~8gMYBT5d(u*3<Cp$9|HqJ zLhzhbp~<<41q=*gYZw?94>B+?P3YW_p_g1%qQJl)QNX~!08;xzKS<Ogtsp&@fkEO7 z0|T2I0|RfauS#D{dSY<_1B1K>0|NsG6bq#1RHiX7$jdM=7)LNL#LDT+f3A{|nwY}C z5LCjzz+eW#d~RFwGBQ#V85n}rFfcGEFfcHvupMJvlaX6e!N3r7hJk@em4Si9PP&5s zZccu3A_GIn7X}6<c?Je14dLTj2Dyn91q=+~AbUZ26__&kBJ&b+QyCb-O&Ay$-Z3yR zap;<Q>@3JHE@5DZP+?$Ty2`-7^1@|9RZBrpY5@a7)E@>0hFuH{3|G&3uQ^b0OZ6Bd zTSI`vfd_v%1stqgSWZl4QQ_oNh*f0l)VrVYqlba(pOOA@l@%+tF1+e;sV|P*ZSIWH z#H+or{C<0Pe0`{DcSN7<7(>OaGc!s{q&<b&_e(B3-j%A|C7UmER62cg9LHrtV>r04 zyC+q@B{@CPv3SmnF5%}v->bj6@1GpE$LH(bcQ02iTlI2YR&Pf`3;PF|ApWWoi|4ug zY|XDfy!u7m)zA08NS#yRO?bA}DYC`LaAo+uAH3@q{`qey(0o0u+xgVzB^pb(eE%!< z{d198#J$L{DCEGhx8-KZ?r*(jZ<5*=y7vCBlQ-nw?1){v+fMp1&(!ssC8re%AIZuH ziOFFSx7P8UR~6|kaJItgLf-SBZJQZ1HlNX3Ai9EKLb~S53w6t%?`Dk1QBIIwzUbSH zjvKnOm4!Zph%Jzcm0lWBKAq#lWzGjnFC5NZV1DQLjw`=C4{p2ib%n!(t16#_i#Ba& zyB;ALGku}Y^mjskIB!jeU+!_mNa=XkubYPz4)+-LU7NaAX;FO2P30h-Zj)rC!#g^T z8rdm`eQ>;Zq}|0@UM$s4=~GQe$tS~&4gK9h^98tnF0tsG-#sJ#gZHz~+7q8$|I@~_ zUo^5#z37jl$dAP{4$pVtu79S#<zx87XZcBb_2ROBqL)~BFR^ehDU=g8nBRS*Mo*CS zm&-(NSMBMYO4GZ;)(Nn(9f>I`T6!y9_gQf2^iQ^nW;zNQst6rBVsp&3&DrOYm};QY zM2o+cmnPhs_mgd{4x?9@n61v{&o5NBWzO1a6{;2Xc<H6kH%SXu$NEilS=!=%lS6&N zhHHj5R2JMk!LYz4=Jb~zyN;AFZG7grLRh-}=6xOU`%53@`W&*pqEUD^HfVXT?1}4< z91|A%y?OMju<83oS@+5nZ&|NDaoTOQk=w~o|HHNi=NIUinJ^!WyK34om(}r8*yh6D zk~jRUrRFjGyH}y}Vd{zBI?e&+{`@no<_r1h+-+Dds@MDWjrF|w-aKU;H`LxL*Y(GG zB|UzWG(lGX>v#J=J6E0T)dFGi(md1rn`7nD0wXtm=ib6CzPf75!M209f6cv`GleC` z=Ud8~9nV;Dc3+)R$5$q|aj$o6drkfEZFjG~&Pv#t8~D5K?97dhFB#=anOpwu5suJW zaQ#?hR;U%Liq2&p*+miiALp>WSXelxyJ4!j%yRF?Q(i2SImWsAaoyX;aVZ{q?DGHG zoy+=AXIsX~aJr%N)0QJaR)3FlHf~y<FLiadx~SHstfg~Vzv;hT%vAFDbw+)ftn`lQ zx5PvHpB=DUVg2U*mtXUwxa9V=`w1zyC+(ifcl&+k-Vo*wS6?#O=}7A@KfabBBsz%K z!O6$i{(1QU`5)Gm|5T%X_GdiK34CO;E<uku=A_a(vF?>!a{XD}Hmh`1m)%}ma&2+R zn?S4gfmTlgt=@tdyG|}Hc@$XH=l=4>;*xInmy4nWcCt>4p77Y_ocd{2rNgaCuLZ3S zA60r?Xzf2g<J*qd4?FIjdAjI9q4oKOjE_6!mdbB>=X|Yp#$!7Z;g5`V=a_`7UMl$e zJ*}MM!@oTyNvz96cTu;_i>M`2cPjZ>t2cUg9rX%eNLYCJ$;wtUuX#}%9}iqs(%Mq( zZ6o;WkW4{m#xkA*HAXvr+%b>6)e)S$MA3Av-o+zq8zimMOsx|RKa!|ieQV2Ak0sI@ zB`>L@`0DQHJ(Bfkh40P8J$ED~zwMA^oIN3yeQMf{QlZ<aWh;;UY4trl|MbCCQ*0;k ztuzV$>~pGXmCc@*r^#~q;+I?_Q#=LMY2UEBdc7m3CGyC><lT)uZYO{4o^``u<JX_N z=Lc+@^+$4v!!5Uif90o!GH>(!9G|P46cQ%G(tmx^LA4jG27j5hu9DdJ|5oI->(5U% z+n>(ddT6qZ3Zp^h)!!SoD6V7oR9M2p;CpAs635kH#*7X31+QIsuRc*WtMEnG`e+}= zdp?b_3<bZ19Vcvg&0rn&JX-a|->O5ktF68sVmr9r{g24)^y{68pS1j&eSe;0tDN%W zsz~OQ;H8gutgw5-n$KDxt8&Lw<(tJ1&kxy7eKwIs>-;A(WrlQ3F=tTkbX$4-NU3RQ z%QbF~!ZZb4qZC)Z7g-F`E^*Aec6A~HORh72=7$>90;|`|s)pg78@R4^?rFF>$4mWl zr1$PqvO3R1@>V{{T;yI7EO0u4Z`Zkntzj3>I%z%F#AfsG(&IHBLKd9JoX5rR?)*ue zfGDS#t@nidTlT%qV5@)D{bK3a>koLIJ$zJrzeH2$x1FZz>F9kyRn9-1=Q_LG={31< zP`g5S{)6mC{EuwPHb-W5F#G9h73gG%7lw4)>U^<a?$b3%&2Br`zdtFonYjD|Pu$7s zN_qRo{(pM+Up}7tCPBfgBXst|l@4yE%U7(MUcb6#+NFkf!K>D<*mvS`rt)dwT%TEa z*KN+OT35?9A?&Q))sj`qd~bDqk6E_6`sF*vC8qx$SIob3e#$=&eL?%}r#r7yn@+rC z=lAn=4#(3eogX*;d0W|%`=nFL)h=&N$>g>ts%QNdImbC&%<6g}TsBqd6yNWObKMu! zxcy{teObE6^S`y&ZF`OCJ2$n?J`LG(_Wqh<wmIv!q`7D8TKQZnqi0rH!Zl+pHV(la zfz3-Er*+m?<Qx~}J#G?zvt-fa8;<s#{oS*8Crwz+8Zv*;)P%|IcMOH5bUQ9ht~0wn z#oxGl#q{WPk^IanmQK3C`D(Qw!=Imz9&OEAKEFpq^t}2MK8F{&Y2W*Jb}S80W7OKT z<=J!Nl%@KUUepCyFLV*#`)_upbi;NT#pJ`g<hEqLo#7Qab@^G7<VCYOe?8ab=W7e~ zSrM>F>xQY-<g%=`Rr6g`yY>Y&pGw|P_sL}SGPnM>%buu5?7x*iG4yZJrSn-Gj;6|I z^xmcJJ@e^ojkfE(`;L#!FIrZzH208e`QZfVzx$8Rdb>Qw_@Bte&JR4Fw%x9`?ER#$ zcQ>=ylBu^JzkkiaAUJ{X|IrxMrWHpc%TD}S^1u7<;rp*P*Gzw_qQCdswy<aCL*D%U zC%RYifZp<8vm^ID?K6Au_PgL~sqULcb-#VDji?LD{Ig$?|H0Q==3c@{A_vN!ib#Hl zo7}s4b&+7hamE`D7wl)-(x3jO;o0ZH#!a$EkAIA<<Ty~K`IR;L%a)6A>=%sZU(;yF zb^MlX(jRW7TK%D-@#SBxvI-~T)}LJs)6Z}ubycJ&cpUpKF@=F+ZC=!$FQs!nM3_82 zf5W38Xv6Y1rN5`FTG)R6`7bH+z&*K-mOF%Q3tjPI-}U`F>e42c$=*2n#jD!Z(z;)7 z;zmXjYeUY}Zxy117s{1wo%c}hse7YRfY@8bc|A-&^zO6E&0k#?um14lyYRnuO)GNU zjAhy%<ZD!Z+O{xl%fDWZdFQmscG#(z)C5-ecD&fUe)+8%8(wcvjNCY*i}&KvyHQso ztu*fj?w-Llw@ma#{L2OGZ=8f)e~-A8ef_ui2h(lt+0|3sc1ILG;9!uvb=A-RW-aHo z6|te;oy}IPuK&B@>;{wRS-!`8jVCj_keaN-zi+blCT^{5)2B*3%(@)a-JE5AslsjX zlCLwEYVQ8Yk-z%YB30|tk~Keny>;L8t?H|Nf8HJY-=?m+4*Yw&yR?O8wdv(8Z#SH- z-6s30aN4QId4aS1PGwm#JXoF@F>`|wr@(JXnctPx4_ESdeJ#{_pB)w$$N682$>m>e zuXmepSG7@c^jiKm@tfz#a++(IojN=D$hlSBYuFF&pR2emP^sYMn)^35<$e3CyKJV( zcQ!fwcL#+l*}gxS`lxYFpZQ0Hdnb2SSlqsGQ2C~=+~K;95p72vOC*N;P4ZhBxkRJm z#D2}Bt}T-;9J6_O+jSP-#8f-(lYxS3b%ZK+xlaDiJS~}X`Q(DO59^I*MXGh_h;wSY zG)_(8TkXQVI?{jj|EB!M?-o7T|Kxd*e&Dlvi>}trZm$W}yFcZ$`P26zZ})hgNuE99 zaGBs{=af6QE8pcly7%nPZI=I9Pp`0D6YMVKy^_6X*DNci*Kt8hm?bBws$X06ZVQ`P zz#_pZW*c_(g&t^Iko#uiEZ%wg7q%Wc*(kTs#j}7bK(Lb0d**2)v5SW!waNn*ybY_J zx~;3F(&;tVu5FhOdMYI<b{|Y-&7N}Y|N78khDoZNhd$Up%k%&K?aM9W;%&LNx8*9o z;l7>z`%pUjd9!)B`^~5Sc75-1{@xLrG&kPtWvi@L8)^Ty->UuIYlXA+YWKZcHnmg; zvK3F5w@7i%{mmPh%ciWKyYXNLmy<;G<)!W)Zz!oQ>^L?hEyca;o2mUb;pHFe*XSy5 zziBq<Y8a>8*+*6xi#DuXKkL(}$1}xqpZdsJ+q<dWIF-%v+(|Glx9I|ZuG^6vuLLb8 zerLXA(|OR_z4FzR2P<zITv69p>GVRj`^O=rYOQr$WkG`c;$L$)_e2S;zt$P<{qX7~ ztB~Uwi<5n|t^AgsJb2jB>hhLFn@bv3?YdABBmP<_v}C1Tcxd>GD$895x2%%()&Ak+ zZazD#v^&#t`>e2%*_nLuk(X_Eg;(B9kGk-;Dxh-Dv$86eel2#tNv*~2+lu8|i{%@O z^$&06e_451hi5l;x$uFzB?s?*Idu2O1Jk`5%xX87{oP>JyumDXgW2H?X2}Jw<?ifa z-+qsIyWD{*ECnWeHyAU2Fk=2-wD;GwD}r`%eQ6SXY7L7yA6#SpQ!82@f8?@wVlJEL z^{EfM&0m)t-NIa*Zn^WrjJJyNVrST=O9kChD!F)X{<^}`x7b212mIBq{wp-?+t%8@ zc^BrreHy(!He|~3HA!AA9l<f1%6xVNMaZt{V9{1O+2yfO>C&1G9&M%5S|1`=?Y@2A zu(SPaZO*&IT>0$khzge5VH<OKZ-*&wlTCE1T&1<`_@PuCo4!`}jT@Y8kA6FJE+nWV z@vTi+*~S8Xv3Exf*+%RT=l;&g?Vb~Ta2sn*^nq1+Ix(ELcWo$8)w#pWeO><z5BGKX zjb;4TzTND1&6%gLPF#6f`NlonPh)l7Z!F%ua_tGh_srkkOZ?vMyoOa`Pu)>r^}`{y z(`=&W?Q+d&QQf#lj=#!$M@;m?-wm%icC1^*w(Rdo!FPLN^;Oo-vXGt}{pZ?;`75v8 z?5jF7^GT)O_W$|86MO$2p6cb^!sDY|XyT%l-#cgPjgB2_3)fbjy7oWm9=G}?xsTD3 z(ripgmYLdX7AmH%+I!$l{-hqsLzd^$HcXmxv>-_OH~$Q?lg!7ndw7zJ?k-xo<5a6z zvU-!DPpZJrW1lvh*L`hxXUD&=zoD|x|HYOVsczul+?GGJ;<!D3L$3OfzgK3YYWMxn zpTPTZ<%?MU>VEC)^UjKP2mZG0ba$Hbard*H<$tqSH_ke4-`4wUXZf3!&x#wr&h=dS zyU}X-KmQqt@A=ZJnP=R$xq9Novdj}wb0k(cuHMza|1?N2V3|_Fl)q7pzUw!MXTLf6 zR`hcBt|sB4rmr(Yy6W`~gjy)<S=VuMi-o$M=N~oMZ8m{7qfYCrbBVtw5VuwI*u9dM z3xc@T`}2t!h;O!>8N5BSX^$pH@}UjKL{|u<dG6MD@MVI6Jy(Z>s-WSC{-7hhCWXq* zcTNbI%Y0hg@Y!Xe#3Lc+n52&Ll1lz6A3Ig_CLU3rw8KScezEh+ic1GO7j~}*Qdm_Y z6w2iy+P~tGW5`KC)uJDn;{36P*nhj+XSry;u;Nvu>e4IaFT1Zg+8z*YdnLlF9-H@D zdF>^Zbl$Limo9Yd{N(5n%PL&4>ypA9;rn_I3Y}%ynBJraw`fU*m2F<1=<hGgp;Ys! zs!_KoeO*G!R;LGFJ|~!c&iONQK|*fpWS7%-Ii&e7%dFg<Ih%Wn`_+$Yf4?Z0aU$;O zlLFtvU#EV{+<!Ldz`pzb%e`*3$}K<5eY|Xm+WT$YHt+mo_!8Xb-s`cu{Q14Wd9`B) zv!dm*1a7RhIi`Nm_*mhY)#n!bg)82-Ww&n<C>1Dp=^A~I>B!crPP{Cumo#b?+VhyF zO^t{?Ws}~$@4=z9m5uf0R+mmET%5dEw`-keQpOIoO8&G{U32owM3=YE??_qw`t{r0 zncvQu_)dKBZ^MZ%*3YGWvupJv35!~I9h91p`{t^Cf_dfCryJ}ZPd<N4@Z2`Rx-E70 zZ@+MUIO{O;;ex*`x4&_3?mqJImwI5&G||SXi+u#HZ(};QTC^?u`d-hl=#z6@R&f6h zPBJTwoNX2rk!>h^C0FY8`bs%%CF|Td|8!et*tze%5PYRP{p@5;6(i<$!zAk@pLre9 zZ<=^G{%{p|uan%C8~DU8&DrNe{Ea@ziBVtlb5%Z1p1kHR%X*bP9YGggi2gkK%OLKs z-T}^Y6Q$DIqndk<y8FKK;_OZ@(O7e4=Casb5$2Op?<_04yO@3JTshObtnvF-Ctdr_ zv2?bH*tzyw{cUPXrY#R#Wpcr1^05jQf2DcK9*vtF7)2*>8Sb%N{vz(d#A?&mQ~X8# zE{l}j`#r3uwy|kxsL3+Jy6Cx!SWEx-r><QPySPhU&%|!-ukP5;2ZiOLSA3tiU(L5# zP*)Nlq|O<f=`r_JFn`4B2~1Bzu847UJhga{>#3?0ePre7%ioqszFj8UlCXQqH_pW; zEOr^MU847M%Ort!hwt&eSs$8ua^0=I>xa8mFEcWG5gNvkoWHB&FFSu$a5w`)#jQCL z4o`~>6mflScV16=BdE%}?Kf*<uKL{tUzop2Ue&L0$~1kq<88U2`8BH}4Hmh1tc{kR zr>$9-@cn48`-}3F=QERi6gVziTqv=;Vc)*Ki3=vw@hBS=U%n&fGt;)%mw(!sxT{BX zyVLVt9h{iz{p`zwQ?u6Dm0w>Ib*Fjzf{lGDu3y4Ml^nW~R!K0dYF?tba8~02E0?yQ zDg%y?_LB>H=JBvy6)e(RF7E75I>koo#o2%WS>^d&zYKaFR`<!;XNle{yuWhp?zQ1% zHbn*h{iG+U_P@7FT6~1_kx60S4v!ecb=GCyUTEH)B+IDG#nK_DzR*gu%~jZWk+2|h zQb5myh3uy*-t6tId7dvmJEvjo24@z>*Ak%?k3=%wgvf-RTKC|_646r;-V#q<IWtTy zm*{ffI($QGDNm`WqVCh}H<&+%@dyXyZ(VQRu;c#4i%RZm_q#LlJr*lJa63?c?d*0# zwwl#-Uw?_l-A}ypR8ph*9Q%j6&NCM&`%GGG5mwB5Jd7uqmCZxFFPWEjhRyz3FL|Sw z=WYLX-+64uUvWZN?sLm>o5ga<&J*l>lGV>w9`ug;IP2V5wr9t8@_cT17s<+CWwL4= zL&dG+gv3?pa}FFhb>P62qap_n9C*OHQ1Y=vkHp%>ngt><8<-7^dxT#-UU8tHq0!NE z%FiS93zVh>xY@C?9eb%@sTQ})*1@Z>QIg^6b<XFYG*Nn*xhFQ7f%QUZd~S65z3sWT zSLEJKyTi7%`PR1F+fvuuV%WdB?GbRcdNSRw<<F(#yB=mcRvn#qxO(4(!*^daugJ-% z%t?Ne@uuR0(5BWu3o|q%A3ePKA@GOMADLUNFF8N9Fmg6Os(j4)?jEZp%lqG#Ui{wW zlXElKDqcgT%l?XdoBq7Ti+67iV0*WZrMzzU=bLl=h0WFTlnNO;YlW)S*Ll8~9-;kl z?-6tVT>H>}Av-5W`>hjiJRf+jaM8ny9t?{b`Tsv!VtksZSZ2brIjv#Q$(t6ZMdYtL zx-44dqUZ86#bH%9pHA?WV-*dG5LBHiq|#A+^Y*>3^S;+UaGwA3j`+SWTc<9Ic)Ck9 zQ1AY)tNH&vO#eSM%q=oBBsiAW^y;;U;Ik&zgS6k4UI<i=)h)lub+T-B?tJHO)^BEU z2l|PB-4fWvtLM5ic4A7;#z3=`=VnW#nn&r+_AxoA@;P;yqg!O^Bv&&_(Fx&pKc@zS z7#@B4ZPN9<k3#dS&KBnXxZ-a2t#kdJ#jWzS&#Uc!AM~&LxcmQ~xAOm2t=Yq+^($ES z>(#(;=dW`vI9RXUdNC~Bx8&nAx4>%}-KE!VrR`q(ouTJ<PXq%f4wDtcD;O5aHp^a? zV`EdZV{7|g=F|S~f0EFz|G)RE#+(z;NdNp_yoq0kv1?|N%fUw+#`6?sev-K=<M#T0 zal)sbZ~xOBp1ytXYrf&G!(aC&m9)K{-r&Gc5NEWd;?|n5>t&DKcw|@Y{64KE`oP?& zk2{>#ZQm^(G-cD>uQGmGnVH{hD^KaS#4~IC)txWaFy)T-tZsv5qXT;x+MO0M98HwS zXb9imeerI1#LfRoN7U8yUc6vdX;&0m^-=!sqWCRQpH6Ji5s_-ue=VEHVgE_SM8xUK z!GldrW)J3DN6h-aXmbM3Pe<(oUII}OYhLZuclM4-6JmPzW<r+t>;~^WQJ17H-LcMl z%(QZs^#Rvy`jgb>N->2_KGM)^o#-N!a9d&hypOLUQ{1AmC$Bo{xW6??-{oW1T-{r< z*MHz!|87rLy}Y>Yw;y|T`nKd9m*S1i?o3jzS--W}m37L_kX}yjoA)_4>e#OF=$|k- z`$>YQrxVlLEj3RVqa_y4ynbf>4RKaooohNqza}_1ab7xFG&SQU?_ycwdzTkpnZ|bK z7XQgKA<4ae_@;?|`&s5LQk18?W$HW@kxShh3%)S+iiI{loz+~+wc|?Sp&%jm1L_aL zmfTcbmA>@bYQOs%J}|FOlP%A7nEUo#LS0v)_a)(X98E6AF1$0+@p;G8)ERwTC(u4M z=6o<utYF`FO|O6}sg8%Wn6F4m>0GLqap{uj>4Sn(#kd%^J>J#4xJ!ny;7I++hg&Ah zI~I8F?Zvz)Wqf^_2R`-)DX>LN5kLNiV-iO}k4JGq%w8*w%R#%>y?=b7`e$>q@T;qN zKeFt@XNkRBZuEDF*U=sI63ZSxwv*b}o^0lC={tFP--qKGwF?Zj8w=jFXij#|*sH?m zXC1X!rS<Ezw7lg4zs{S?nqac>pIYYmZLhl6mO1%&CY^TQc+rqY`SsN)LMt^`*cJP{ z`I%&<$?<tgS@0`){XhL=iQ=)A=c<8LksCj{-`?YH;w!vO^Y%f>sZu)Wo$1qxwRAWA z@mQ)lO@8&3GoOT~hDFTMdYfG7z4Wh6{_2v3r|DkbDvo=(@OT$o{4q;jfIWM8&*tOD z-WM&dJ!Mg!^T*EoULceEoBGE0dJlIymoh#~&J?tp_MJoC+w(`nJ@p!$)h+!`Z5}57 z)O?t{)8R*i7Hjs+8CG4F{M;UR-}-gOYto8}u-MkVUOwAaeh~-ZbuSk6Ojo(T@OssZ zp1O_KZ<SQ2Jn%fszI98^85YI6^*x^w{myT->ld*(t5v_o<+}Qg8N$4?vv$Vlr`3!7 z3BEtU`=xSn+eSM@y9Jf5e>MJ8oIJSv)ZFOe4>x_+W&F@Bs`t|s+8kQ2u+!;N@FykD zS(`MIIr=;JO<t5$q)8ZGKJsDGqD=)&cf3M>oxXF)@!`XU{QdqhoExTHn0Y$=?t!!C z4^R41b+1A2zH0RDhyJV@O+SMZ_x<Sn_M`6Ycg2a3Ejca`i}L2Lp7(yoAJ&i$i?<zF zB)`4f>DCdowaWYMpF4g;NaOFGoPd7S)C>VXp~z_*dfrNw-74NLLZ?j%o^mh0)Y-FY zmZ;-=>z}+;lf12WTzbsp5k2pHk>d4^Wmo5Q8l-<~%P9(a_bBT8w8oP&-3kSEZBWyl zY+|b_TXlzPO-SbVM_;bD?CG5DTfIGcl6&3X5Y@W%v4Zu}E%<j{f5fYLFjY+2;$geB z+Fs8@-`y*-eQxvR&D;2Hrgi$7=;_De#5b-jIJr-6;qro;ek;u888VeF)i%B2I$h}x zkJ0((HRo!2nlGJR__@I=f;n8T^!)nEM_t}aaQ!q_zWZnYvKfXSZMUhtTxDgdKkeN$ z$rT|wH*LeDwnT5!z4_EtZ|>3sD+A6v>92MFAZ+*ak#N;1`~6P;oBE8GE&rgoHeRd7 z?~&+c34yy8JW}o?zux+&@mP5M*9h@ryv%_juHgc&l$!&kI6eo=m?@i9GUMRY8B$+% z|4!wdcXwx!$ni;C#m<Lz2sCsq5wbAQWJ%~si<q&D(byzm8rvDw(C0DxP4rpgxIIlb z>~uZ(Y}yN^Ek4h;Iz8X&^?d6wGxpX}MF!~{;T$f;8;c|bw`CsS<Grzz(Q?~!wk5Wj zA8w^r$FWa3D|?CcMaQ|<GtRwkIrlo``3~jX4e50uuLRHc?tR3nez*UZ$u6H$j<;eQ zv)5&sY<lL#U7nV`H#Nokj$`yAxu|*9t1dlYjQYT#TM=}7>e}}+CqC7`@F_gw=j>@d z&E**f*|$6h&Mn`zPv31?z4Ph%1yA=!8S(yG!216}lT%P`=iy)SZylmnT84K;sek_J zUsBDRqkQ=U0|RLO`~QCi{)$_3BG?_IJvXg=$0@|btUPfegW)8Dgh_0jJjoLTxDsZk zBn#*4NtkoFa(e3CgN2u$&N=+7#PWV&wdMV1d*>9NEAN~CFudPw(}hF)=@%llc-_6a zK5p--yagK=8%~u7S{OJkeZ|IbigE5kPInITrvHU0OdtB|<~{e_b5bjn`}L>QxqK%d zPLjFAR^%&u;_<EKlERbsy<bnC$GX7b<44~)ms!MCgqbf9oHuEMLj^<4S*E3T1?SBD zGGWEdoNY67C#j@%PixAWepp4g^@OO5yY|-BhjokEI;;wwOmw&Vo4M_Ps?qwpTldJ! zo^Q?ev>}+u&o!QX!zqhcLpxdd_NS(A5|92U-dLE_wA$idok9JCOZ<EOGkcXDdKB<z zwoH_S_49d$=B79D{&}S);NT;CWM;{vw$Do@N*X_`%ww`xXPu;|ChQZybb<Neo1BK6 z=xt}U9)@pTa$`S_ci~p;>km^`SQLGgU+FZ-@}1_{Re%3P*jLW+x>Z-?Q0=Vo+JDt4 zgP`>#ng72Q7RBvuef!yh;i%(@mKu%LvaPDY{VV|wSWlhra4YaEKjOl|sOIo}=>i4q z)eE*PI1)E!>intU4-01L{=7P2`fTM>5~cjr$x1uBjz7;WIUQDWYSWSnizj|g-=gmM z_T*(<xwoeFvXb)hI}5K*o~}1hHhHgg+2x}rFJ4<~sp5b8%FUgbFFmi;hwWx!k($2# z((jkz3na3xzH0hY!u_kAPlzd);et4$*G^5hLjvNg4x5#>U)Eh<zvuSb+%G>x{NwhW z)Scd)l;;;W?@{I{ao3q!>}*WGp15;h=dE1_qubxTdcQyW#kRGjTc5KZ`S?3M?VWu7 zmn*!k=Xv?&b@N@X+;jT$i`L-pi)607{1dTge)7eXAB9Sf(i>w6RvWeX9$#U7NZ3oV zsOOO6OUr9t?)1cz&rCSEdYhsHkK&P2Pd^%V+~GK1m}LLy#*-(>?pxv~9r{?k=wkJ; z`3t*~-_M#`dwqtKm90&U)s`=+$82Kedmk4)t>~Sw=g~=128AjWK^Kp9t5W3x3H!eJ zj9$GTIz1mUJFG65>!9YXs60VLo&WAy&nM{~GymR_4!xSdy>8X{b<Z19o?Kqd5GJ`? z``Gfwk2maTv)xd5__yO1yR!ijPK{?ct_L$}yj}RhLTZWO{+VJoRGw|@Iq&)`Z^oaV zd6)jJ$-3{l{b0hmWC>$ylU2MyW~}G@H2F<>xIc4T$h9z@%j7lD#m0YG!vuj&rRpa+ zjERa}Erwe0&8{U{HwqN@yq_4mTkhumr%t(VFUTsF^Yh#>Ei!OY+gcxf{aD44idSsP z&n5e77*r<az6@As)p%TR-kA=jRO=-vTW<(#v#-(ov1C49=EH&+H9efNFE83Ti*H>& z@!5?%8&+s<@jZL(rMR+O-Yh}CiBBFsH25v%mLSql@=8#n$8}Q8MAx*R@)q~znfN6? zPB{EADbLD|?{wSW`wS1NJ-;0|)~FL7z0d32wXeC0qfQ2LZOmCJylcf`&!BCK0+*$f zZpt}Z9B!hxE{^l4kCUvWZS=N{rH{@SO}KDRa^uE(#=pWob*vJVw@Z5Pqf+*GP-(4H zmq>Jr(6M4Yw#8SqA}gP87(O-n(BahKqqN@X%RRG2w(fs!d%iH8@9^i?iNm+Vw_ZLr zr*2MggOjO#pW@sOLH^bJ?S8jJ+;%=rESetHT`(^=`Tk?4AA5P0`M*>;F4&hlBYDCd zwGWyb&o=OI)+T>RU8rhQy{I@wW5wUdYyV{4D12Sg*4lL~d+L*;OT|C@70vQW^Ov#+ zZJ)W=!E?rQjpnH;VhKMJr%EhxF;a7XRFX0GA>Sw0+I!EIuD|G7V|x7a$IDeywaiyt z5oc(RcvoOnGoN*-PM^a{#qCV1IV2pXX>XhrGAlM{!f~aSV!Asyul8ogsHZYb_mH{t z@5PlXi;Ii--{1QB;m(EDj4y{ST$ua!Z#iG5@b|N4?wAXD&(51>{9JjXdezG6#l>ec zSMZw&uI{-k`uOt4!ic!Tazc;iA1a(BA#P!M@?SvGoaApjvJCfHCvIqxjk>yQ$E_|E z#qF7D#^tdExn>Nr?{2fxXWyT6^h%kvj^V@J)7~-lshW(U@1u4V{3r|)deJyTq5b`> z%6yfg_kN+W)z9C=t>N~WlUe=Z%!dmz?G{U2G=FvV1l!lF-i$B7#y&69Se!CrBraWM zyp;PgOp`nJvdZ$4lhUu`OMX6@c$M4yao@LR=J63c!iC>HJlyGD+ogA}@XL$0_Q&?j zyk}{$DR{Sj=2@N-saD!T%sj$^3?EFHuTPI{Kbjr;ZkNpLmS-A8Yw|s!!cT?<h4bl4 zX}>=<^}U6!czM?Da=yox-gj>NqOx4UyL$nbO;)U&VvXQK4qoQthxW0vD7rpa?DN2U z$J(chmad4p@OAH^X==vTj$Dxys9$rI^Hq`8O|zw+JrbVn`zTTEobLWhnc3I7ec~=o zsqLX5WnT&>zrQD}{OQ|u-}L;@lfQ~DMrb$sGq3;t;#UO2*;VF~8ypUCZn)s@tm)dP zl;+kan(|z^e8c-<kEcAw?yfwBi?5$rUU=ihv~uy=kq7klRId2{QUBGAzjJ<ba^HEd z@z8$3-#;es$u(N7={wsIYihD$D{IRnr@pOUO?vcYSM3wo=yqBwyjNTCTII%ndYt=f zCi96W=htywz5M_B`c)ft=f9pgC*;uG+3MA^;>~W=Em~FZnD^^rVXyzo{;hmBP1@bn zKec<e-i45-n&-|Hx|&yRH??|`TUNbcr<dlrZ9A1#mCrturOJ?d^*qnfEXK(p%GW2{ zwT+oFS764Y+bQdrCr(@+w`5;;VwG3u^m7X}Wsdx{>$^Ygz`|((NgOqw{;9lKpBlZU z^h?sk6N%PW?sphHyf0&Cv;BR+{n_t??*C)^B=z>kp+A3^Dwmc$;mvnn+HrQBcK7js z75)dZ9+w>bQBor_?fM3GGd>pG53*JIM(<e<y^?j;yj{C!sj%Y|6*=LVQ>|Jn7t|^* zsZHiSsW8*$$H%XEySO=aFjTar>b!QkbXMj#SLcD^JEy#wmY&j*T-r6+@=s`v*`KFV z?Rjm!mi(W;=zfLXhcCgu&M13#yt(9Da{SU?k>o>F)>YQ4&#zJ6HlyNDy#9rVjgzEg zS6@BFQ2yYH%Y1poRez42ckg(5>IC=s{GC3RJQsh{HF9s;8b3kkZS5^-Nhy{Fy$65N zHmr74V)y(i|LE!btJ&e}-l*n;8OdI%+x|1Zp8Nk}`Tq*{FXSneD_{GiV|8t<+nH}K zBd$OA!5Eevsh)c*k?-SjPhTGY9y9x`Pc|)<C{*~*VY}fA>!&r>Tvl&o3k}Wi2%Tof zXXB$EzgWD`w`|(E_N0KTeI?va&z`AOC=lB#a3a!Rb}MJugI8&XRQ;9;2KIDSi0J8Q z=@>kp{W&Mkt(-e+hOgmCy&6XElPZUbZhVQA*|omc?4k4T&%Ik!LpR^M>HN@q{@+B4 zGqTpDudYmbp_i?zIeWhP`b&O$9>#w8EHzmzBWj=9Kex33EPfU%)1EvJJav;*i_1jj zr^DN6Z?hz&IF&>rLLV;oX?d<JXl%t1%vRnN`dmwmNAIrQy2Hs?d4+}!8#hPjX&-#b zmAX8~+j(1}<AfCb%V}ZKqOG3MJ2O@}^ltn$Yfq6SSC7*<nQ!7gD{en8dtYxM^{L1D zl$p%iDelGcdp2+Hj{1HsW4_dyHL`qPc&7bq=G(pf&Qi-+Qts;6duOB`ldEr;`2LFj z`{|h+9M*d$^9$JQU7u8#%G<qMNbG-K^o6a@c5L}2GiT0*9lMUn-1m-%iMC`fIMY<k z^mwb_o&|?ihpt||X3FE%UX~v|n>z!=A3r;=W9ONc?E-t{Pk1bDQb<a0F%*iN?#H<> z*k|@4k>>F2ZL%tBlwNyORXvhU&YE~WJos^NZEUWt>AhLUYHq4p&plV9c{yo4+hpa! zSI44uXNB1Qbo*JF^t1FzkYr6<{+bCIJIr-8WbW5FA7^_W6JBy~>%WSEr23!>*7sr} z>sDBoY>KWfTOF>T-g@j{)!Rl{ezvO#;tw~qr!j90mA1ZRecP?-s$;ujTeDYpz1^qY zRgC$MpK0Y5WiME@aMd|>k#7lg=PuuG5EY#NJ7QWZmyKaXKD*an9r>M_Wx7J0cROAz z={LG$9b}(w+n>mChHc`hi`EB=W-s0$Fnxl`Z0l=`iK6`v7taqXS@b*X+u82Vb^mL2 zRLd{^9CvlIb6}Z?X}{*F2;;5aba;4le$3um{Kfp%bdmMj9B1a_&ksrRUzV|T$Lf-< zyIR(ZMMRg~S?IFv{z8{XMVHNA^QK4Ze>u7Q{*uS*{rjKC=f8ZrH}ydMf-BKmmaa=( zzUWQP%G*ItbZu`a|Hyy&KK?_sXu2!wu8W2XcWBSyI&J&q=*r(ge2$ORQdt;Qyi4|H zs_gW3oA+>~^Xl^AlPA8vII+BrkHPSXaMa|cJy&(Tc`Aj(XB{z9oz-OX_T%)oulZho zSY0jq-RR8Y6aUjzW}LhICjG<rijO&)P4);?Zd<+D#A!a8q|}2QQBO3Y&j<SHol9p_ zH|b8e$va)x%V{Ei$Rj`Rh}p^lb?fB>AMDuIA)y}7ky~oJA?xhLy@iLL^dG<Cb7nVN zdhOPjx6^KZWqe?Ca(8m{Y5}cT1=Y*Ard9a<R7*bWw(sJJ==h7(A))=Pi`2U^oY#I^ zKj*$#iOVmeU)yB+`kt1|kzTt}`cvP#nfIJNi_8D;xy*a_uJOKxS+C`y3gmNdOr3mv zV)XkgjhL!UY9X!rZ#&iAetdE5(G|~~Ie&y4%}IKy$8+pwORm%XbqkFaaC<vCI(jzR zo`0)#{@VJLGMvv;b2~fRPBy-~EVb6(X5ZSx4Jplg)@Q$7yVq9TdExZZZ27y{O6tDV zzyI4=C{JH3!XhSN{MVe{W^Z*ug1OP954|r-j;vs_4lc2}`skFDn7^vdKiTaIvd<P~ zK9$+HuJew|e~!uvi+<&}h!k;jn4Gy1K7+}T<8}BWgM-2i4v*Y;&IX!%n18nCZA0jp zv!NgI|9o6@<k<VQb&=)wcQ;R-?0j)jTC`)PZ0-K#3pdBERz1Hx|CRK#O?zE8N^HGg zur;YA>tV~R#Pf$1oo8~5e5&tMHjSBka_8O5BVPODR?hQ?@%Sa_eEI|P0+%J#lh;o6 z+3;@qG^Q!nrd<o!QLs^H`)Sq9yZlw$uDQrho;2g$bd|IpZ+2d|>9zcKz;E8keay2D znX@x}o;a_$FT8)T(AHyLI?}S{aW7wecVE%>BPIRI3ooB6_>sEGf96Fd-rKWhZ#TX2 zxVV~G;0Cip^9p;j6@jZaedUub2~}*FFBHK&xuiFld38%VtKq%19=%onJld)zKlf*2 zU#wi+<oG+seCs@mHMY*H*xb{PZLweIQos6IbBzR3ga6~Irv_`v=PUg*a5%$X(UYe3 z?h}*#&eMl8GoM|uFX)S75PE#2pl7EA`(u&L&qY6_`fjg_7ARiDD#Cog{^fQdv1L14 zn|9v5@aXZE-JPL&`%<RPUwHKTq(3{p2z9qli+)i2WqZcP;CNS+`5xOC7Dexo|33F* zUV|l5ix5}U^<EB!Be#0%j#ZdMrWbFT+}Dxf`Kr?RR!-|uuTb9t?;ootJ<<MV67c?# z`QgQGCEJy5y;NA8`m0w_H7C#h^x^}vwzsLx_PMjX$??*zzt6?D3x57+p7iIE$IJ4q z>*M>c<_m57v|dVkjgVpVyVYynZJa&xlG7=UW1k{t7|nL^6JQdYcg)`{<H-ccgAvX# zbDTD+tb2Mah<W~<7aJcu+jsEfgJ&16tz1z5mv{EAa`7AdUxQwMRK9+4x<cZ!b-#{1 zTXt+4%lown$vdR?q(4vk`^xA;{o|TEqvwCW?foZmF8$rQ^sV<Jx=S|)yO~$J8*%qo z2`;#HrTVzXrM<}|SF4Zj`Tz6YM}6+Sd$}*Za8lSHkSq7O;@GTY)fj_QjMZ$rCao^t zW5iMt_ufqFuus>!<xw$_haatMIlBL`Sjk#Ty|qTi)h{L)Brd$zY%!}%Y<@(X+vL~# z>hu$fbD!!QFy!`g&PiR-6vnao;8z!uqvtqGc$63f6OZLAR11#zaOv`-ezvPu{nAUb zOS>;USW^`C%<`_^nlqBq9!)tFvoUCUcvz-~U}2socbEExtlQ=%iesI(Tb_ExzNl)= zuY5giTgi*sKjw7a$(Yrhr9O#CT>tsPb?X9j+G^*{tzEOm|ND3UY-4SwlfQoXS^2N6 zD!;kROuBdPJ;N>;S5A+tE0IF%o?q&-ua-Vqe|6P;k%MuDC#;T7-|}j9<oXqVC)inE zzaf)-Rb5J2ebQf(T@UoO-u+<wHRYrHPp!Y__pzORc4ceLQ@M-#-h5nUae9;J-nTpZ zRvlToK*}@g(98~Y#a&_2dVlk;?rWc0tz<5_d_lO{_J=dQzaCjyQ7vYcEPwBg#qwOA zGLvP6PZWO5JeYUh$m7w6!zuPjB|($UDjL4s{%gvet{v-Y^ZY%eX7T(w*<ZtGWWDZh zciN_NyE*)y#vlJ_wqf_>nmOwgp1upQZ&Hz6d12F`orP<62QT*Y-e)=0zTi^evmFPo zix+Iawwl?uefiW#_m|6L|2ep>z9jl}?hMhG*R#82OsAH$r<~Ks`Ci5^{(S3|E8$Zt zmTu|!zwW6v!>v=(+Ro3BKJ2Z)DWE98?9`y*(7+-!hb`NiyCiyn+rnQ_t6qo2X1*+* z{w})w{&VgB-(H?7E-#OLxzFs6@$+YwOt#+r|9{`K>d7*@i=Ul2BWb;Tf#!{!ErtT$ z-k4p{Jbm-)Cf%vAd@)|k53CXtj-ENmnxzw=XuesqtnGunVXvCn>VmAJw{-V9FmJV5 z$gTA(Z<q4<nXgNBY}wMO+F`gcdGhXEerq;vTCKS$`n0d|*=Va<wKGK*?h9SbKD+JM z^lv)*7X3ajt?%S7Hu*Pk*LN38t#?$}y?*iD?UG{UE>*|e9$WpmzE7I@@WNw)!pgBy z;TiJ#C(b<4p3c;J;n|Lo%~B`2moq)8V2NT34O`&N={Nn&B7tAU0WU87blP!n-=7V( z+bU}I{GL32%{r55&u@IK>=t+QPI-RL<4?*~d+Y9b)_p(np54^x|7z>`QR!&Q*~4!` zY=S3E;t8J|)U|)*t2H}kshY)HVwe)KFra<%-%ERT9^O>;@JigB()O^)PCIrj%X_~2 zfc*b^7d|`@onUW1y`ima+S|^*uUCn@)!%w_W%rhf%za0*y}0W(8s4)g?`he8?bPP; zpX18oPE_k!&)WIbzx$s=^~cjDh9Qp@f6(bYIm6`WX8k8S-_=OZ%g%gt`fd5$t96?m zpR1nze&=krw)V%~1z*B`2*vVf+&Zf|ua@zA>2p_`>vC(A{kdj2IcoCD?fyOQ==ymv ze?Io}&-ruBzmDnVfw;QLzN4C3?7sir>DI_>dsBSpO)JhFViE<GEw^XpC>pwLGQ9tC z0XsuS>-3vyB9jV*?Nj5$%C?J6nPO_u>~?v6vbz7H61o1ZA|h9&PQA)fDRwqJPw!($ z)a+VLt`Dl~&(?HLe-^!G*_H>VUWF$7{9f_x=%0sk^N-8(-S5_KzW3w#gUKJ&4?oP> zp&TR|e>6m=%|HK<z1Y7GJYh%5TrU?pEI!9Jw{4A|{HDHWrUTO!?CN7)dE<%SJ0A|| zUbpshg>%=%x8Hd(qkQ4&2hX~<L<ycfd*+PJDV;OLf~P0*-!*#ge0|ZOJe%uFe!RQT z$x*`-`y#)zyk2Wkd;)jH>VS*S?A_RZO)~y3l;*a9?QD<!cO7Nj9wqt58u{Kgla9@3 z)@`;<dF>~a)>&m?9N!<&toZP+R{QUXXa1?|dAIhW*u&E8C*sPFPG6_2dCVl|?w;V< zs8_)@FOFWT<gZ$G;XJSS=LPK|=e0h_)%z_`l8L>sapS60DmexsM{NW@TgAJkO8yV_ zKE2sg&3nO~JNp;hnLPjX3H^@$>ohYo4Q>m}3u^f$)ne8@^JG>)^Ae^B33C^%^DmBc zHP_cLdUjf?YT3cn{(%=oU-}=Ysk!i6`pfU5d-v^Kyl&m%y>jpL<3mEP2FKkC4&A!q zjyNyd;*yK&)V}oPq%G*#YSOt{r6W+P*K5~I!-Jcz8}ilcSC~D~<xMzib5Ei;b7a`g zTWg$LS84s4s1$zNx+|>x^>mT4a{agQyV{N%xs|Z?wrKt2{a%|&4|AQEZmjZSSNS}} z!btC@YhUl)y*_@^lV9`Zy`F9|neVdBebdA9Z|(XTeE8GewU3vDuFiWk;e8L|Cz<5+ z!QZ%2k8qq*S!%0kwIVGma^Ew~`xjo@D#;5UUVJ6`yu|g#F+M4?(^88#pGC&>&0oH0 zN9W8r^ET_ui|}+zC~}E9{k4$U!fD>q=J0Zs)9d5+{Jb^m+x~~Y8n@PMShKWv!KP(p zMO*4>U(aXx(&5dy(0uc>j2#>+Pcp>Jop-F!+mLsKB)jQ+rA_jOw~7=-AAPE6^zY0J z=O;y+_3Cypg45Hl_6T$;=$?6(Gb{2|`HDLaZ(KFAv9lAbu=|%-@lWN>rb-K=u=o1; zCBLd}M<tj3?_={944Lx1s-sBRGbvjmoVziwP(X84QP`}gwNHL5)Va9WLQtxOc_#lx zp%$S_3O^R!u6ndP@p)2Bl<)Q2^ERJ-blupL)%`9Q_gH+Esc{pmbUoUWSa)o)k7vF2 zOv9q8ymw2}=CrR=xux)C|JK5^71PyhE}I!`{Q2v<<-=b;HnWBwIKFLNZk();v0TR6 z&Vw#ro^y8P3D2DNbjr+K3>HtCj&Qe3jym~zhShAj1-?bL(K<bmr*u=7mYq6KvLlE` zVCDl+)$1-r9E!f1ob5JQUfQ(v@wM-I^I~o9Ch_vTzojpF_Q)<ZwP{y$SANpVZnDl& z7jwIQ&9?UYJ7MQ{%O-ul6PA%5BT@f8ApQBJO?vr}?72Z_&PnKt7CwyiXKHY{6)u&h z*xD1;yZN<*Sf8M-_MF6bwJNgGA}4sa&5y6|+@~GpVk~*M{bj-1qhY-w{Hi;C>@oTG zm~q2#`x|HN<!v@kk1zhr?UQ8Mai8%>zGAVV{o3+GHGi*dbAv<<6xaUC+kX4~x{ns8 zwI*GUUSOi4(z(dYdg@bmk<BU>Pi?)M8_pkVe*0$F{epz*H?g|DUq9xriQ1HslT`3g zVoClTi)~qtzeuc+$jyv<dEaPT!I2D!HSzoIZC|sn?t;O+ix(x{y~yag{$=a7Z{N0E zx?`z*Z03(inyzcDvV$^2+vb`_RCm+`YaWf%Dk_!LTQnu)vBJ&v1@`K8jPhO!C;B;B zo^A5_H6iZD=k&}aD|Qqv^fCYV{Zxq47boKl=jXO9-eI0@AndGk(nZQZMd<eOb6f@H zUuNou#JOqhvJ(!szdR-LivEGbOBW9|Zkp>Lru5;?+qVavJh`;A!u0DGlZ#7l?Myp+ z=FBWp>(y@TY;JCBY;KYq_g|L%U^!KEeNUz7%4Gp_C+tzxvHTwzt>B`crBiY6+mHNp zb9P>T{@HQ4eqG2jmK*J#jRTM9Tfbi8@|?%Lb!BB`+$5dzTQ}M8Yc9yP{rpMh^Q-wk z7oC>L`k-^B{A!+bMA)P1_2-}OSbij1OHbP%O5Bb4+p$fvJGr|Bw^tX+x#k$n3huaM zBfrDS*Zq=BV-|O?A?MOlPxcgqa~$c_Dert`B=|%~X+uZLzTnlmU#tWVeNNryeBw{n zzp37@k8}AfJGiP~iDpdU+w2P!hvOG*{Th3%$;dgd^>XMtt0%>G+zMuYH0v%<KUvMf z9LlxTtG0O36Lt+t?e|+bE8nj;d`C3V@X(u#xAO6QHD4QNUG$x8W~pfY@7SrSCUu&R zo_fjbpRl&dYXS4Kiwji*v?ke0%1&P~&)r>7`^4G3ELKh$Q@8Ap?~OAIu}?D+GMg36 zzD=B=#(ekN_uSG>bGfWy?7!YUW3k#HqW^%bQ&?_iS~_#P%!D0+ma&m8+RVpP9|V7n zZoVNPvOzyo|G_zZtwW_HqLy#Xn&g$ITdnnMv^(g2(z?yCbH0MXrbX3PckPwV>8-4M z=WyR^-d*t(JngTWE<Rhf-OAb5cJ}q$8#8AHPBg!>{``jB`-0zo3%S0-+tuVw^Y+_? zvL!hQb<-mngpJh97@zR|nUD~)fqmx7Q(_Z>iu?XtpY&(COr;A?!S8To{Xfgu>>hT! zZ=V@wvPR{g=y8F?ZegcZO<?MgjG5}fcx0}EuV!_ln&i~!E2e24cvui(StGZ6x6(|e zN!vMeF7BFa#!+izbp6*gUj6vjs|$97ef!?8`^&GmcEwWFko$i!!o$6ntX}-|_11O2 zGPc|cojo@+_q+M_AJN^1Qss8veY@%S|EHx^TH3OH`ktZU=L-KvuJXJm{%ob%OsR9v z|8`%ApOSUQ=<0?eJ(Iul&#LFTI%P?Kk9trbbC8dM%*tl#bE=X`i{1;J4B36xG-Kz@ zg#vw_(j8BGL_}QteeQ>Gf~xS$6!VD0-IHef8qMaqZg8%ZDgC+TBIzJk^COc|%=@<X z+n@GPX`hs09w<NghLo#z`N5rwr0+GpXuIK>Vt%e@{RQ{gi+wdW&2Idlp;fhGuFUdR zoJvQ7?oC&keA9aBNt?Gd3w<tn9yzM>-zKRx?4Z@0qg9$t)v8X>CtfXLj9j7>ptY-* zYs&L3uWx>?s^@*CPUT2ubt-fTIJR5gK~iqc!M9H8u{C{L3^ldXlg-bro>mrQ!6i~S zIjA(U^058-6VfeRVV`C+yxPkZGKoj@>aGoC`&ZP)Yn_SM&9iIbtort?+mmz4nO@)R zjIzG=?s5I0TZ_e4=(d&J(EcU2+hMKb?{i(ZZeEFEE4HnOF1}c-Q}T}g&clk#89w2R z>dBY1AL(3SZ`uCz@`ni@R>?e7_F4J=FYBvx;jc$Of0eh|KW~lk4z_IxCTi17Hr-*h zoGJM-Q)KPa3965lbc#ITyB0n{UumD3ZdyU>mU$D@Q$DfqDqgl<XBZpJdR;80yFQ?F zZRhXZT4J)cyH+e(eOlVO%EWEr`}yZ;MV6_aiZplqEV*-o1;ZPm2_8FzcJW-XDE)9` zepc&^s+S8dd#}8x^o{u&OUXu_wC+jIn0yY{G}cO1TDACj&3!$&<dWv>vng77W`7s# zSg>G*UgZ+;o97eX%<bK>d();J66?jaz2C&Gzxz(P=33&ugX%lyRo+PMIaqt(rSZmN z-&KDstjm-Btuj09W=pWF%AM5_#)llQl{9`m?O3<CVuj8Tna;Uy)Mkf82L|s_xSuvl z&nz|S%XXRY*`Ixme!Bcqpf5&i-m3$@`C0kog=dP+`Knyv&-v<<pj4UD`aEm(zrIU@ zp03ywThSIe=levNlUjdYY??D+*^M-#TRCnvEQx>WHXh8_D#d#==?kyLF1d+QovRsM zz88u=EHT-)E$-6h;!T^4Sk10l7}ic&*4+2+0efLUa^c2}Ns(n8uXEj+&!!pNI;Ye8 z-ss$#o{#+8{GNupSACzDB%+XNDRu6O5c|1?zW!xfzozM*n6xG8ZbX{Z^_M5~wUwfu zt(eW_qIx;ge9m?M%pFQu$!l(;ZGDieae2n3E1!y<|4%ei&oESI%2r&rYr&4Ds68uW zj;dW3k*%G-^4^yq$GtCK{O;=8dtXGWLbCq;zpc~H=pUZGU-XyKKW<HV9+sm5rYRRz zYPY`9V437nc2au-k6_A{+r3%47bFX-DyJu|d9J@H*7vtV8ryT9h^t#zR9vP$=9#3z zzU_BNt*h%2=N(+KsUoTw4^Qp0+@G7Z<;5(E^pF2@^fp(YZm(XSxjy>e%iim=Y|HXp zb=bwvrf8e}+rISDqdXn{t@@g?<>F)ZZMgI*^V?iiewJnBd8X?HzC2uJ?Ci%r-NKPm zNMOn&wvb6#d!?o<@p&QqZK?I;&@6LFR--K)JkwYNr|YIP+0JONh(EWr)Il#$IPT#~ zH_4#Q%a26c2?<{~{MRMQB`JO0nit$tT(!=uQ(LbdlULY!>QCSt=E7oi8^)_nR(7s6 zE#H50&I~#CO*^P+Ubl#*ug&G10kQ3WJ}%P{-nR5a3wv-X(=i1*E@LOAXKtHYSyD6@ zCNJ5yU$k|;$YfRd+0~-|lodAFuZq0y$Y#Y5J#WG>o?lP<`m-Y1<z*8;%&$n}{c6oo zeN+Cy@#zzbqn?~mk-49^^_jGe81tL0Qaxhb7ah`k8~)BZ>-74myVtZCf76QV?Be!M zv;U;S5}dM*RjROkV_;6}7M)F&oh7cn=43HlozWL(xJ~ATe&K`qez%lgnHS$DpWs(| zKK0r~!PmPI80?ScH$RL%cE~At{>{=O;Zd)w9~pf==#(Bc>+;uQk3KY37zp*qbLiJK zD;OxSR5dkJq%#_9ebbN<bM}Pt(uM;&nV6DqT#E{7Z0HbP^{DXYsmCWD1uRf};Sm4I z`i<H5lMi<A|6ZW>u^?Q?rev4kLk)L}El&=Ht?;smcu{!QQ@ut*qx<@q%eS}NpRE_S z`&$$-kNr2>SM{6gjx1w&*YeMW*`RG}luTR7Zq0=a(ghQq9}ZHenN?$OnWI(K{iN5q z7l%Bhd0m2>WLlb<&inNFyDRa^J`B*fv+?13_r5=$yH486Sbb^td}!$wQRlgsW2M{T zf`EeQQ*T`Nae7qIwCVFYojVr<-eqL;nb_I?{C&8+-oEmveZS1l<6dk}u228R@YE-X zReW)Y)fBD24@(%Qu+O~1{IB?@+!66kIl*uI8O^J_zbZ^GVlnx+eZi{Kyu5wv>Hpm` zf*8e`mp^o!A{wvQ^Z2h};Jag=e!Kn*Un%oG;+(^l@Z_DdEIgF9buP6FpRYZyySn?N zpvAqiFB#Gq`+pqOPq6Jh<rkPAl`Z;V$~&1A`(?gd5MJl3=r0h<X>sJ^<Bj?c6gVVb zDGCVRI;71adGCF)Q{2J$h3-#M_o<wU_nLD3@O}j~rE>l5Pt#Y<VceQ7fBf6cE!S>N zSR^hr*P`>uTDz9dJ5A50>1<e4y5jf;)n|K{q_vFH9_w!Ad7=4c@{cJwkC-B@gH*Wd zUVC5a{_^~#t5klkviMh}f9W#k*X&OX^G*J*|0+g_`Gvvx2kbLjEstncPuQ{dMv|U^ zXUuVpwJn~8K`j9bjBlLRSR8O}#|hn2rUJ&+uD520^-BDdNaTpka4WoZVDjr@B{fe> zcWgQxk{)~e&HG!o?(Erm`u?V4QR%N%{dgFW|30Go_QN&nCYQav^zF^7mp8Ajy}Q>t zH2iHz#gZRi_N{&S;op~B=N_eLPW8KHO*OF3?sq%Orq}2@|7d88S9o!YLE6?Q&sQ!` zH)h_Rcx~>Jg2WmX!8?z0F1%e^CVazZv1@GnjlQUU2jP`}irxjCaG4Z2wWwvv`6(j) z;W_VSu8=Cr(VV~S=IrIC%&ps2uXdXwt-UNqwb1$Uu4Nx~6;#v;*EP-&JiaBr_(ar} zo91sNR?5Af`zhDx_L^tC`!xUDG`Qzbzxrjr=NhT-g^sI4XV%tTlYOhf)Vu50V?DF< zr7ue+9pmr#8DX~~Q80LAXy;LnB~!nj@YL*d@psN!$f&AvbmN?)$UBFu%${~V^^B91 zHaGCOa!F+ouN-s!4P)VmlEtTA-MDyZ=c>xz+Z-OJ`6vF=iqEl;iobMU_%-X}M@#=k zn`M`sTk+@Ju}fN_8O64Hb^l6VE<5)@sCdVTV~_J+#MbI2tU6!qeOa=@{Z`Z0A5$4O zC!Tr8d*xG2j=`;Ty+>NS?DH6>$gjV|c(g(Na>H`wl!6&H*4uqfobce9`!gcdwQ?r= zUy&19J1fuWgk;S<HIa$`9s8C^KQ116zPCSWO3jm|BmAeFZ*N|*tm^-R6V>XU%W@|! z(cS$??Y_0qj{UpRUYbhVrL;}_aa@)2+OhYh^%>47k)<29)!uhlx^lsV2+IxY=ibxW zl<T@w(Dd~w(c2k*Js;OD*%@@q{;91F!&JAKg2A4ipBFrx*>C#HQbws#k#`~gRE>Qq zNujF8(hgjbKk(2v{?5ka<8KbG{(Uyr`r2A{=RfB!W{6yAOf_bIH7om=+jLf;o0ci! zlAK*N37G<y880^(2$&qu+;e{E$&y5^1!fo49eQivzkUWQw~+wXfxkB##48UqmrOj_ zb#az>-KWX(bq>95{jr{1L3-1#1q+Mzd|Ed91KaP%?;F=@L_hy(f9}cUb+K>6ERHf4 ziSa#R3^^^xA@q5Yg_3VafaCr@6+vwdl?FfW``4B|O#jHg$lq49?pLOvoXbOznA(ef zb-nN1-}T^Qg?)^yT5gLii+-n#!r8}Ge5P>@Wz*mOn!qXcR^Pf{L(czyo0{2ACH!gl z{=o4)V_~|`p?$oG@&aWGW^PiFyvz|YNk_25MJ%Ly4a?USF@tRe6=vZ{_Z+S)UGdAM z<>WDrlm%Rw2GO7DJq-4HtXg_>5`X>H1)H+Wo<*k}y1z++CvEe=ghZLdD$eKs%O|D= zOX-H)TYqSW%Ezaiyxrb^yP8~g7-;+uxPJdIf6LKbGKY7D8uBK&DsM;%xV|%{w1De& zPXGBsUvv4l%GmFluyoth6>Fn%3$E_m@K$Hr(ZYxCkN0o4x$@0GSimU9R%3%$&$Sm< z{=6wNzOaJDJNx*Iu-ofGc`~2cYG!T{v+`#YYMQ6e6wLIi-%YMw=KrJl3oN%BVB-6r z@ac|8B>&$2iVM@sRyP<QVO+U~;Zg_3(X1;eb9iShe(G~nGCYtYBFKBezP`D+Ys7k6 zn*)RR&$%amITy5d@|EOGPBU&l7MpZLF<&4lUBUDc<7=j+X)Sx^T>tPbAalW%6D$8T zu!eP?6j&2u(lGy6)SoFEtE|^OG2L{}h4r^2yFj<clQRqLKdurIU#g%WC3Y;o`FMW4 zl8w3feAB}>d!5Wz9jN(W^Dm|;$X4e>-sH)mv9oyA9djx02tI6bY2_ZvFJICYvP@7j z+8QIX!`!`j#}2CtFP0fQ%;mc>YZG%zPe9zc7F}2Kw=QZKTWh1f816WIN=HoT=ca_n z1*<MS+PK5}t>%;YbL-ZLy16A3ooI?xIal@ggh%=H7a8JrobwK?EVv<`k;QdDM65Jf z^zVmc#ge?3eKn82eE4AU#`ZF!@n2clzszsnGJjMK@tfXX7i4&oB}efObKUupGXhr^ z|Mp+Yv@F%OXJc&D38RX}OYK`qHN^iFmj75M9>?<g+K*&|9lBL71isxnI_rVSAFYeh zhtua&l?Uf9evx~j>XlE)ttVf&_3z2D-K%;L@Y+nG!~T?upIh@6+dGPf)=b}PJuBJk z@v1FZ7dA*;$ePl;H*|;N3pFE$<<2e3m!ACjYwq3`pBI)gEHEj2G>`MiygJ==(W+(% znOgJAre67+bT-_DTUqd!(%y*??$U=YJ}KHQQ#s@J{Hb}KDHU_(e~Dk760DkTwsg*2 z@3XGYx7Synf6=f%a+B}&(zhA8cQ1<0)ymV|8q&VZe*61V=Y9Qa)8fB|xUMUAzxy!% z?Y+-;4_`gpc%Yy*<H&n?&X3RUf4wTb-u{}%n%tcG!rgE4xLMU6v!9xC`}+H;lDAJT z?=H9Bd@$pSG<VtFqR;=Pm(9B=86nBJ{tNp$j`nc2nMeK<um2eNghg9Bo$-|8sxMYL zuB~dxR!h9^%<9;u(W$R=*!!ZUmR8QTE{E3pVR_o0r)34)4Cmfzp!%cjmC`x6_dYlJ zjLyDtmb;mHc=@$87WXz<ZmK9fu(!(dea7_<o4?IjX7m2nk9iyR?pnWc-?OfH`TV*v zuTMwVKa39AT~NECEU@zTrHJge0S{6hH`MK^?ef1~)h(T+6&;g$HT|9JpTyGm(&Xhi z_v@!*pAcI**}tdL<?HJVBlC$9gwwhV*3NyjG`!O2gz8SdU;kH!T9>VFU37w3aEItI z!`LTZf+zj^a$h2S+D`rh<^su%*E}WJ^d?lKAIUxG@jU9!ED^0qpN}uuSJc1wNb9Q2 z6R&u+W&{a86m40$<Z$*AHJ6k{Co-BQPhIz6cbM5Z5pl8goNl}C@;07Wl(6)6(4J!F zvu%$KZR?z87v5|ywEAw;(@dUeB0E;w&e)q#yVv&o))mz=PfHnD|Giq~Ul-Q5b?3F) z^VYBb`bB5+j907wUOoEm&l=Wk({_nEmV53r^j>|MW7msrwO-E?{pmkm|M6COt$*fN z>;KFZici)CWL`NG@>t7lroPYGz?I8qsL5`b<YqmUEh*YlSW?AmLGIB!b;%6=+p}La zUEOC?9yBe%ZI|O4>FJfzFR|X+z377ki=C-iS<>BI{%fV|H<p!@-Mo~n9VR0$HA|M) z=gM{emS*SHIOiibchyv`Hct8=#>cw!qj2`MITG<-S8mOIFHx>*Z)a7NlX3Io#EFkj zZ@c2_q9k1U)Nl7yqdQkkb2f_YE^xMC7rwg2@t*JE<fRMzge!}(PCeM6C)-e{tKhZ8 zXZo_MzG+TUhgWQ<GIDk?b~h5*qq6bfEU7~tzRtcY_Fa4KYI^r=iAtiXcB80bv7Vy) zmlLUdM}8M}d^ahI=@)Ts?Ayv@df3yWa?dU6IQvDXXRiC3ky9a^CYW>Mz<!m*PHv}X zmY$SoT)NhBbNd5@J=>S3hWaku{!4Sx6|D_k+q<@3esVe5w#fLhhNfBDQ<;!IyG-Ur zInBGAwIjg(<>Z4iRBS}8=IX^y@7H`?sibUq+DU3gg2RF*rGJz@T@T&xR(WB+mvce= z!@s5b()WjO{`nmGF?j>?`iwvK7xd0=@jtSkdFn?~4u6Jkhxz`^xp7<i$gLlfgl2X~ zO|4N|bnHsWU6ytFQ#VyVU)0s*I(6#CuC9os`}f{`pP&8taGlPlpw{g|@82@6;@Dz* zbN}&q9=6&yYtLD~x^?Tv`wQI1C*O*@C+%U&Ta^Dw-u~nC9VgbvIQ{*+{?2ieGs<cC zj5lXDeV?s*uJE_-9IFefh0Z03D@kAE>EHYN?!)%k@>XowkLEY@AHTlOdA|AMuIF<e zET1ut<w_&-*MJ9NwNvWKRev@4ed*VKR{hNFr@2d6l!L?jhYEMjm~i;4P@U>B@7WX{ zlhmt|wk~$K^!>-NLr%4MfeZglZk1Sh{C$nTqg<_4cpPK0z<(3F*rWU1uZi3KzGQgt z%JZZ1w??$+9{PSkJ=SDdzyBFYmwEMyy)$1u6+i57;Yr7DwZ4+XGTX0}{NHx|GOAVa zx&8m_5zdROkFMT$?Dgj3x9c&V7EIU9`1NX6X|DOVJ15lJ+ScuC3rjGTpVjTLbPLn; z=kvC2<~un@c)zyH$~8HCKXUT=uf8g~`6FP-q1%@pt?jV56P8^$^X#i*H?Mp?xl{6A zZP<xxdt$wpmfQ>4nX$M$Ytfm;%L~j?X6Zb5YMQFnp4n)4Ipg7%W`C(qMVq{G8$Igk z%E~&g%Db(Y{iAVb?w`)>!gCo-t~~Pn(xm>+#dPhDWtPulO!WfnvIT3KZ!*LL*m)e9 zc%q?jM$(fFQh|Oq3_D*K&VTx}i`n?oxtS%Wcx2bP%{0j`e-agIW_^s8dynPQsk#T} z&$v^`s^<Lgl-ktoTh`1vIP?Aa+Ol_+b|sRtn2&FJRT0iBZ)NOyM=SMQuU9tf+K@fI zen)Ryxcw|h^RrXTtH<llN-mLoe*DZ9xA!*cp4KUThqi^sFIjuY@rsBgM|51LuIZW| zL3f(}23b5eJ!sjK_21fDIoFjd`s04*jWf1?{_nQ-|6YczuNGFn`&)3?)z-PiXHk%? z)#`PPvk&oP9%(W8wBm?<lW)NtA-iHFrH_}-Klm~KiTSygKi)t2VHV!BTlV>p?dJvO z$NL<~{n=~gyzlI+{4I*DzKdP@KCR!c%yoJfOY7Z$fCcAuHBQ{^oG!Qjv#m#AE2~H3 zDfP7}{9c!@{y9E<aqF7Os2{HJ@g>RE-Rw4|bS_}M#&O=@Ojot_riN{Yo+X5_{@+t^ zzd&9-#ox<zL8AW5YmYKb*!tH@^_TuP)BnKsqw7AX$%{^$`TY5uf{x4$Pka_V5!m)~ zSw^u|U=ja)=Kc@)2`95VCo$hhTb=RQZPAmve;DS7OnP0i=n1PG%loMs;=k9roD8(% zjCY=?v+;k>$^WdUnKc?1K<7=e8ynwf*xVS;Z}XLbo%sdmoXKn4|J=Z|oCC|BlmC9P z8L<d6Ffgz)Fo8tDdq)#e5)$k_&Y#-YsQcpl$^UXWZVrMX2Tm|EbnauVuDI2EiMdD4 zQHJ${`Tx7SY;SL?4ZjUKY~}8PZGu-Fb8q)%DX-YK@9vzrPo|sCtTgt{>=0lGQ0;so zwM3yx@|k(h1ZfY0j7*7zp{}fv{eqP}&!afYlnk9*XWm+&aoT*D?dR@anLl;KZ)Bgj z$Jyl*F3!n%aksMLx@4A_wmT0O#=CfnzL>?$_Ehco!k4*%8mAMqg%|p83!eOIyM%KR z_afW0cMkrY?o%?^dzbrFuAFA`o8kEFi@~7|-bS1HRwevATe5tc%>IzFX|imY=S$1J zILzB`d)LE7)TKY+Q`{xjl~3>d7t7n!x3lf~y&k>F3dc<6z^FM1`f<~)OHN@;eALTU z)bV@Q!D;EOt9U;cpO0&1xhkKk!df=zKuoWIXVYYf_j?R$Qn->VzJ;+ra9(@q^6Wb& z`wwYY)aq^6vG<Pbn{8JvdoK_be4ci|({!uNVficJ2Uqm(_E@4av)g6q;*E}dhc3^U zo)WU4Ez2b9u~A`Pb^L1ihOBN&i6)DyEK^Seh92Z73i*1m-)W0^!_C=;N)H<!37o){ z-e$a9p;M^$%ntTuEzSfrMuY!TCx0;h=XsVt&S++zgXDLG&_MOO9LAqlC8_Oi4U<f~ z#P>I2N*o*KCb^A9ecyla$wg@h`P465y>`#`gdPJA(=8_RZq}6j$#%P~F)1v_gm;OG z*J8#4_u1X_!__<A?09zOj?3Q_a%IY)Q(cwsov)sAEauIjoHYj|b$;@z@3_4jya!q5 zAalZF1_p)$CTVYv-D%pM3r;2w@~kxj!<ql98F(Aa9QYGB3`8S1_7prV`C8apAX_q* z)$s!FF-KV+<}l{x&C3tAKZyRI?&2u8!r+RS6zALKIEVNLcM1x37{$ov@s_u<AAT;# zA0!jmVdMIFVd+J~7d$1LyBO~_+Z{@ZNL(X%jWfET_K5W3*bfVTnABMAW48A!QOKLj zHgnn>$CDx2tISQ?W_hn&eD7lJ%cWo3ep%Eu*PUeO>7O`ri;rxYh4J*tm)Gt{-nn~M z`Hu13)pvH^O~3oyrqo7yPtW#k<r}`Yt?$ZjdcW&^>-**RUr+z@^RMim;=ks9^qCzL zToarU920yeaES5o@y_Gi$G4QPlzT15Uhe7q=eq?as!c4NsC_YGOKeHp7w<KJIe9iB z@1^C1?~DAOaAKmyJc+3@X6~3(G3m#dM>#E5Z+^)s+-7xq&f9bAlKMBT-yx7*@N`Gj zorpaC`Azyq&p+MIxkG_tWvi2uZQ_OvP8FKVL{E3g9y$5Q@8hH&QA(=&k9aQ&iOA9_ zo$|{|c`5Iu+?#*vWq)p&6dt*5Pf+mcnOARRiI*;_igw=8GR-Y}h3tiQndiU6{qm`8 zzj$lMOcym?k7bjNtHqm&8gGug`X<@W%zXBIotvl9rf%OAar;fj+<Wg5`Zx98+WwZ` z??~oDo}x61-E;Fbcf?=be5v?4_l52&-j_~a)4sU+YWC&V><nS*^A~~k|1mHMGx#vD zGlVj*GB7ciF?cX^GcYhT^X4+JFfdl!>Yc!x$KoK-y8l+Ml<A6G?G?F4Pu}`=Z&mvX z&TlTijUufVFTcpo^Jr1~x_gQb__=m;a~d|kOq=tc>D|LAF^u1h?wdv(sP!q!6))KT z<v5dE`hM*rqKQf=oez)pwzFJ*v*~Q#EtC5}bE4v>aGmV#K6+)1+IKyXW9nz~ez1D3 zl{<9l@uSm+IJb7((2UN?+oQ2?POtA9FSez2UF=URo<{x@+~$>A^4!b$Yw(TSa~r%Y zlZ5{|yzP;nw=*GX#l?NSv*z;FM^64}8Yi><q~G-X*Du<fY`Ly>B%7D^&xoCUq?I}9 zaM0aP_jf$C<Uh0^NElS^<}@?+h%qp@-7o(>ACyae>)qaVchlV|xwp-xTjt+1ZI84~ zU}31|n|z{v!sY$F28U)OtSg?H_hy-Ob%YPc!Y>Lv+gmPA&c5?NP0&Ti)nxmQv$F4m zoOKG1Om@&0+IhUT>T`qYn^bwv8kLzML7vKU+ie!{_n%alth1@ozpqDgnf_l%2YWWd z38hm4P9>bGaJO`pI9AXW<fs}N^0`H@Cus{$&k{GaD?#qIygdsiZtO{CdK_`y<=f>W z>a#KziWX=1N~;;RuJl=^`!>U$-L9ai&*-Vl^T@MOGat4X>+N{dW-V9osCE09R7LN| zlTl`yrp|ryRKeZyWTalv)Y*5QD*9KRjJEqURet%8gZ_1i&T`^2Tlvf0968|TQ>ZY3 zcSb^|exJyxc*c@N+&iBnx0<qBHtc1(d5-T~!L-vdj||)`PN}kLMkx9`H%a44Wz!aI z)1CkGkl`QB1O2Hbsgn;GhPNnj9%{OICPl7z=6MsV&uvVuno)*bp>rNhUErds8L8<N zI_uKZg+8g8(Uzw|=Y0xY;3W28)^eRC9nbeXnz?Y>(p|UqEz15rQMsyYU5~86j^7Qp zUOn2M8|3JB*g#;<0x{)~!bgYX7d<fXs`g=0&s!nS@$r(B;O?R~EFY_~&Wnk5UOrRh zW*m9kNqt*&Z6w>`;>eJ4scHS2RXJTRcjXtE1s~(PeodfbeqqsL{=NdWd$|Q?z8u*X zSbxy`k_+3EFaI7Sn#^Lpn0V+x61&HnjuvYrSN0n#nfKig<g{|QD5z<r<o)}}*=d1B zVuGo0Yvuc%YzeiM^zRGV)wb<kYOVRDzyGC_Ua23G3H&*2<IXC+bITm<rrinGvwr?Y zrcY_%rp=K&w^;nUCst*PytBP;5SH|Q*UKe5`AYv59*LOTv-QKT;8?Bf1#23PKARSN z*=qHDkDfWFm7`TnRQ_M>`c&kw?7{i7UtYzeUTU-PlKXgX*0ha38IOCregW45p}x$M zSOR%`Unl3@-Zt}X)a`9+x!3e={*n|i>(iX9H%lhi9O@8UbGh5T>BHV7oN8=5WqS1u zt4=&jNnIk_r8#Bi{~6welYNa+c$YYxTQsHeVYY=zcgln<Cry(UK5AQhMQ&cB=8OhI ziOz=}x(<!joi6H(5}Wdzn(obKdRUqjc=-BJ`ONL#m!J4L^QJC`(Y|+Q^meIupDX;D oJ2`XFB(<GhX96=^W(IDs&-`?~pJQ+RDZR#faqRspdMOMH0LQR0%m4rY 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 zcmex=<NpH&0WUXCHwH#V1_nk3Mh1rew;5U(7>Nf=2*3;nQ0+{Nj7&^Sj7&^$31S)l z4>1UGFn(dZ!^|kiz$D1XEXer(2!k90BLfo?Gb6~c3=qJ^&dR~e!pX$Q_5T(F2Snmu zX#+%ZlpGBKJR!im-SiCu1N)OY18j<-gc2ASME<E@kz>q#cK7YVwtxhNbDpmct?b8^ z+;sQcdb`FTm}djyN5NMyJ8LUK4L@Kpigo*JUER+c4lp-IZK-n=#Hq-0ujiRB8-HHl z+agwfa?LI!oC<Tx-n!JBIFLW@MC0dYzVX#ns@Ff+%dJX&fW>m|e6u^X2N!OMSIv39 zY3rt4AGF06KUKMA|7!8cieEUrb??jS?$_^^-^muKX5ajIJG;HSYVI?}kmCoi*dTT< z=dSE_1}59*qFFedEVlLO6b5_6sJBg`J~dbjVa$DYfPn$0b_NFAmNPK02FqhHk|8?s z00RRK>-0C)wZw@rl<E8n>|3!5Tfni~8@w)T;JbeF=hdIsOdk~+4FS{;VE=!FL7I_~ z0aSY-$*{08F|#qUgX=CP0R{$!UkXUFqs-9|z!3uJ#tIA!?mgIKBTq6gFb1x`BE^`y zv)^9p0fW@yvs#a_R$AM&)|ef;#-Q>va@EUl8LUR^SpP(kfqnblw3%Exu$7J6xo73= zuTHCKFq+PP`rVGzeOOFk*mmc6Wu)!9cXmDO)pm=!zQ2@Qg~LIX^V06GyB>Rdx#PDK zoqe6+<>%ww?%*<X?ZeuS)3pEI-ua`y=KIOJA8~o%>CX)e=H<d&I6QD@-{J_yH>>w9 zT4#a9@l3Z17#MK*{Qv_4uApULV8G>W1_mbVR>gL>wlSopzqlUUfyE_^@0{fs*y6CJ z0xZf$g+_J={6E4V3#x)p>mXJ(7IsEv4kk`;CBzJ>g#N4_*#R}`d*VWXr|NtF1B2>w zY^u3T6c`wIJFzxru3zkXJDuN+fh}hWW9@Woy0c##J-4-4cM3zH=+*pF3)XMKR@3m- zN<?n&`N2?=y;gs|$iCCqYBbX?N$!^;Yi%VL$QDfAA9dej`pp6?7P9T@$(21V`s|JD z;|&KMpZ&Ue-+zW5pXNLL*2AKh;rhkio!eIY@>jaLXX<V7BcjdAPj9x6n^&2P+c%pp z#@l?pdh6N^iD<3dkKd1*-Z#bR5_7(*49v{uLoea7z3F1<Nd}Ad>pyV1uYrL<A6J+$ zFfidV7`L{1F$M;vzdG1LW8LK)!qWnnSM^^rHWSAdxQth?S?@c*?tbFL6KwiN#YRH_ zH3a1UA7StmU|?coWM&rNU}j@s2gx%sF|#nR3bF|)3J8lDnm7gqhb9(IoV@wsC3X=p zaRsG<Nk&c!l~oKJf*O;GHXbl`Zd$bI;0JK6#>l{E&-kAqDVs+q#G+62$iFU&i1*y8 zXJ*u0N>l&Cz<BNEjoXPUf1KQP`DAX}^2chg{Z+R~&F`7L)@Is`tU9B-EuW$Xg>-Z8 z?0@G~SFJml5cHz-#<6?M?16{E{S<0db}b57DpZ&0EoO7-Xh=!M-};&BIuln-6?S^W zAtU)pn(++hFZc314J-LQwNY7_uhqMzO;ew@sGL(IuqX1yd%oV!TUZyI&|dUrS>JN4 z^-GsjvMJ4)7qN)p{enp$)4ZlhygcLB&bjq>$&;86p{p_5pKJ;}7HrfPlPdh^m1Ow$ z43(Z%mFGfk{g3Zn&&_=sG9^Ud^;aXd)P6gQe<4BVyidJoU@$+sdQ-5*x*NB$cCT8f z<k)>uuxqKH+imNhlLoFb>Wm-as<*{;{N4(8WlZ1xcXQ^Mx2C4*d=+nY5^6XmaE$%z zI=9Ff5<dO2yA$qf{5$q(&uaawldD&!8lBfp-alI^`O{IMe;yNZdA(}p?a!KGYkRTc zM0@5@m4p1wn^?`hxohqe+r3$ih73#9DXR?4b?d*iY<v~tyK05@ioV=b*-%Amr)BdZ zIA2^BE!-k}-dD@t*JR6Qx5B=Rl#Hd$Z4#>&^6cVWSF?A2-m8wYu_4o^N+zf`E$39x z{5ebW#Pu)-vyG~LKeolkOqnt{Fg`qK)!pw$s-EQ}b4)7g)~LAd;IgvwbHhD_SNBju zu)bNXC}_8)y4C%6Uko;gimuzSYVO`F(TnSS+rC+7+_sLmb5pnIPR73F9=#Uwrl}6X zp@t8I1b^#P2x$B>+30Fy66`kV*kiW7kZ?B{o*u4=Ig7s(yGBe3xzm`D&7k{g#zS|@ ze^c0tcHTSu<e7BYiskbrRc5YAsz`4=Q*>0}Y)R>DmiljIEBEVL?cOx$#flZzH8SRS z`b+lNJk?s)!LzXRSj4q32H`DLrunwF^<8Rj{Z-z*T|}1up55B>Wxh3WA=68w<dy}j z`H`g5=~%f`xyD^+^7-t2O|xDvZfff@l(n^Daoksa^Ul9am0X?jlUL>~n>W?;*35^? zJ91CjtmLZwWVCkWdhcypH*36?lG-jmZPq%@+p9Ds{xfi8E?nNbY+l5JPBwj=a~qE} zx6VBgDi*Wm<hIFC;#b+qERxc=<+E<M{<<lv5?XOHR)Q_uNix#!Vwgk|-|{6nbG%Lo z*IssGP37v3IxCf>aqPA^_ocUw|4Mw|Z~A<9(--%<>n~aFE_A%`_wlP=+Ka>2?$y4L zbmhv2U^l;ytIErj=ja;9vIqU$yJ)B0uHB~s=dV!^bnlaT^GRUB@xBjww<^SivoC#H zzfWu4x(_QVmn0R3Oj2s~|Fc8+kKr*3_V1Td%6q3iPIGsXjO7dqlXBMP;ZVBQ|7ltE zBh7WU4}QJ%%HqgIzj|3;y#nWT{~1Cy>}H7m%qIO~^2bRcVo3}Ep6VHlOD3PuooeYF zI>q#p<-}|6yWFC*Vmw@XGK8)EWj>Yiw2pXSl9gf?9CBBDsx8l@&3C76*5MbP6gDq1 z+RUnB<9~+s&lBgjHSKwj<t^kdvf<Ri#k0)2T&;a3X}SlW3Awe7**i4Yr({-D=K}S4 zno`F98T!^f-<|rRe|P+n^0G(G3x6NK`Xx~7VeP@68y8L~UjN?Xe&*rz!Ix}pHb1%2 zE1?n`dO5_4UG(!IKN+si%vsvgzVB%(<-HpjG$$p%vRjU~qEW#9-qlFs`il!EEqbxe z<GQ!iflG_}#4<Ktb@$yX5p-7dcVNhZj?9dd$mnXj^4_GL&l}wGf0br_nl)*$M%JhD zsA*PR5nB%$Pr3FyVWP*!V>_NFDNmOxSRND^#Ia;n7^jTko=t|gLVCTe<q{U%G@TNd zsw(rfFxb;eVO3SmN!fU7Q{{;<Mhzxwng#ciY9$$84sqbioW+^MdmyEEvi#fLg}dHs zb*;>J`64TQRpTwog>B*!AC)BasGMOpV3SUF?Q?nR;ai;e{Os)mo<8xLglF1&2gI7b zt+^0;>C%<ptKQ*EuZx{kg0x;Y>{%Kcx>?y($DiTq-ldW6y-$@~nj9xOY5mWX6%&uY zC`HdT>s;bBi{meN8m9$a(_FMN`A1-Cs-f477fhBD3$0K0Enei+E3;ygyV8`3yUvSO z^GHTUi>4}9om%J+${6a#waS2jcLBo%hAUn3=CMs(*d!5EeqAkNv5T>1L(EUE#(6&% z=e&B_=M$G-adgT|yXX`p!Pg&-h4`H1dgg9pd0%IFq-0<FM~zz+6EpTI$6d)@bML0L z=89OJ6X}c2DYtR1T&6HD?ccTa`#x>g3AlT`^r9{+&kxS~oW`++mo{HNHQ|WTeXUiJ z+qS%oR(t31sqR(N`*0x-Zr@-73C^sP!?siEom#o}KMY(o@wi-NpNX@wq>9F>o$t!- zeqgrjlTHs<G%ZYP>13H>3Su!28_!xN3$C0x{Z!0!)mXm@QKN;+7RA)1t(@t#nsNV{ zb$XT4AME*_vsdtY_LshQcLGZ6EB-UExja4MD`IZ@)u1opKwsakutSys86H|OFFb=Y zV_qaKc=;#(_@4Js((|Ui*5|y$F+E$>$m>Uva-028mG*}ErJLq!Y86e|9bb^Nq}ftq zW#RFtp1FEIGK^0*oU>)F#<Y(2?6mT?r&f!IDlMB@!WDHOt<#+)cg|)P%c)JDqvl`Q zl-3wpY>@kH`5IP#Cr<|L@6y#*cmLGdysiDvy{~!yyw<#3_+k6r=>3ycTW8ehz7Ko< zWYxJ_^4ydv(y7(D@IKZw<@0%tzs0_*|7zYdS{c3X{j$Z!-FDjahATV|oarxNtJu1p z``o^-bFSPI4Z7;PMau0$^RHybmO^!-20Q8VWv4I7m+kj>_x32e^Y{KgXVEhLzcjQ0 z@;`%d<-40z%I~hfl)b%U!Hc?&{~2b&qv!3qi26jsLq>(}_ngWO{%7F)tHY7Nq0qd= z@rYdWhkK^SX6O_quG==rZ_d$&2VNYRozt5xS9j&p?UZbbZ@+_2=T2Pn`1V_W-ED50 z`}4QjY`ZCS&UPQk(u?=Jn%G!=U0i-<WVpvO1t#8!*IdG#yLRwc@gEKh6*Wq?uDL&z z{ZU@y!Sk6ZnM*3;KUyC7&+vjT!ETbyB=ra7{+~9+e=+;o)n}J?^-u0=QJI>%tAE_S zre*PSclgKcYeEV?m#u%CmR3CH&6$dbNmb`RhGkAjTeC^4cfq;?rOf#eD;__48-MKH z#=zreZ|(2ho3yxp_SSmos-y1m<{AIYR3>*?%oASnpJAi<|04_<0-&)SMkZDkCT37` znSp^(P|=V<z|kNuv7k`Fp>g8I0}~EjgtvzU{&lWhQ5nwKyh8l*VjF|4Msn2+3YCW+ zzwMoEmUDA++F1m3TZZ{&NL}NfPnxf8xka&;^qDojRp2nZY$^Rj`qREAe4TF?3*K~8 z$z67ObCYQo4+E<U(+chr3l=4CC=^W0FzVc6FQRgKangO+{*x<KdT(xevCiU6N8l;R zvnwiphw=$!sBM<a3EtXpU)+6Z%)&yqg|Bl%9Rpay7^lWE-mTy$@cq93vDJ@>Nk_ZI zbRsq;9ZhJcKcif?gSS+m=jA%<!T`Z3lj5gH%t)7+t9F%P=_`?(8ypW!IvZGo+?&|9 z8axatlSnW!+s()nQpgy?Sv#HS%e{3qS%!~fw}d|F7qa2v(RRG-ZDHo!P@<u9f1`$= zh<lSjAiIJ@2S-MKmg1qfHGB>{33D}=H4pFD*!|2TFmj5m)Ov-h-2yx|KQ08U+>jdN zkS`||T-L7^-FM|#l*Br-tp0U2OzTxoEh(GmzO2`oWg*|Au)@{Cw`LUdd$7p#m!^F7 zd+(UML1k)4X;X{jse~k^rR!5qywwcRx)i%&okmB$_%7o+rJqhDE<V7Y*vBwMh9SIB z(Pgghftbg$nisTeUEl4=X0X(i-8dwnjd|DN&qw(-Cx%G&?7On?&@M&&ZZ+A<$`3Cc zpB~!UIF<W^cJs``o~k^d3Yq)ZG@QJXr$1|+;24?v=t{$<TAxYc&00NPZxUD^`zS6t zQWjcgF>}?*sZ53EvzAoFa;6@Yc&`0m$+?IOlSK`)AAM=K@b{tj%lXRTZV^wICUJaq zX3<od<>OMjvYlh<>J6bCQD*n1?>x1NT~VpU_k-<$#upL{4GAx|6nwh5XR<Qi)_)Gc z>~nYp_!J)cT@%^;T0`97z(fv5kK_bL#zP;LOm<7|nX)Csa&MTk!g4l)Ll@J%(({h^ z${MR$F+8l$Sa<lNa^~9@3+JP8Oac#>7+W|#C~;goF;nne#Y2`03seLTKQKsb^f_AO zq59fdjDd^w+d3J=8wr13JUY##yG}#UsQH=6mp}Vdv#zcVTN|}C>uQ@_1nZwx`<SLL z{oea8Jg>CzsK}Ug<+tRS-SxdE3Kkw}=aSmb{7Zl5-}ong7n?4)89zzs+4p>2KI4Ff z@2tWvGZ;@92Z*>G72-2}r0v!#Ws-4mv0K0FUE#?VC6`lge0t6DOI$tWQd!-!Ljmjb zZ`=sG#%C#Nbg}S-fL!~QxnIry?fR8_dwXt{jMxSRjWsrbrcdHS6P(um(!ITHn~2S{ zr$UppG=8oQ|E2by;r|f^TR{fUG8%3!Ru*PPaPDSgVrF0w44lX+Afjk!>=>NbxKT)0 zR7^oBs9@m-10#pRgKWx97o870{0PqROpJ{74F4Hiu5tu-Jz1`!<`Z~NZSKUzMVlq0 zv<<038NAsvTV`ReU69uT)pcQ$zv?ehyfkt0Da)EuwJ-NQ?#N_4&cVSf*?PBgX6v+f z#W4#^CipK{!23*9EpO30-m^x`=|6cws%F($zu&5Jv-GiZay>`di<5Tiyz^96yfEoA zDN`#xUe2%a^t0yoWq&VEo;ml4$)%>q<$HfvXB_X^k=V9$7S9$9hp)HF?!~-WoYuOd zq3)5DmvdBi@{%Q{E4Go$Oo-KF{udI>yXW+xX;Y^1w#W%=Q9Lq5hgIQ)#Sx!7mF^QN zx3pL<=n3nYQg!tBtimJf!V>;{cI&CkIQgP5vM$}Gyx>z`ywUusYT@s$GeydGpO@+U zGpl{0aJW-e&c9dv%7+a3fA4>+>gD)UVZy>CNuAQ$Ub~o^-_P3r#D1Sa>%t@K(h3WD zT%1%Ta=-d4G_hIObEzWbB9giJXMNN{TkZCAip^!NY`<5Oc-7|R(k#0-ds=i4pUe@} zTA=xm&wJm6rB`&7Gn6}icsfm6=f$XH#b(U*>^#e-ol7r%`;*$l<;x`^SoO$XZ0^Ar z`z?EBi~eV*xOijcdD%NQi>IGiesA`Fh83}j%Wg`FEb@E*cdw?-%AGA6=7h{iTVOO} z`n0sr4Yw6oe$8F-vWcmcOQcym?fIfm$8WB@8W&vM(+<D<z@T!$=;-;0d7cwAWIoD1 z-nM?je}?Vrwlt|l1g~VUYxFg3oFaeh_Q^n}rpuq1J?`?ZpOdRsF^PB4pK}%O9zK=X zmumOr{$H2L-rg7Q$>_(JE){;D{Zpm!`{^I;X-j7u`E+S=pv9Zhyys8us?;cCjjyse zdcRO}vUmEkprg_&mwedv>xqoZr1VTyE=!Z1MUzvXELrQwd2CUJ^rJe@AicIL3l;_Y z=|28gxwS~f>y^Td#9$u94X>_E+2*P++12pUcDq@YS1y0E$yg*eGsSD|mz7#MDv#Ob zN}AuF?&-2S!_rAehY8u8yDlxu@@Yvfw0*c+<DP9kQ;^dnkATZ8lQJ#yHM1iaQzo!7 zO`edmzgYe0VK%pNqs#?!W_*#__?S(!P<5`&%Jk#PMSC3u&MZB<vweQ;f$eTS^EyRl zmCg5<H#_9X!HO>730w`|eLpSL>hd(<316uYz^7dG+-v5}EsOddn5=$dzh`deoR4=8 zLo(Z&*yu?M78`46dLCQSEA4jbSpPQvz9YLY>#@!B)cPXr>!hL*Ju!WP;f}iG$bW5p zM-ZX?Ep1)QoQqF&ZKm^0d1U=XTCsk)ul=@nx{H6=cf9(1>&T7d)#tN?6Z_WNuJLWN z+VgFrnFP_oyS_~qPHe09-!R$xbkH_Nhd(n?+fpx{NLAFl`Ez}J8Y0KkEyK@_Hk$hf zrY7=3-=lwV0vt*cCvP_TnZK)l#xa5K-7Sgy6+7IBWvHcI$W)ui84%>u=6tj8iiu`e z)Iu-qz`#>AOSl3~c=Q#P&Q6{an|9;5c;q(Aqt|kqJWb}LKWbgW#b{Fd7+IpPuueJu zmpW+h(j8P>Gc$7Xa4@s8GJ?u$(BLJjAOo9_qM>78;lxP-VoIh#!6AtSn=W2r7Zwo} zS7=;lVC0~z;*?a>w9)v$!G|B5!38%nq~K1<78W_9?E3ty@OO0s$v1B=S%v;)yCnSQ z$mDNJ?Y`YtNmtzK^*Op`;+(dx+Gle=xfMxYS#P@iq~wYGpgq?HfpkQyN^HTxUG?R? z3(|XBbxdA-&6^XE#UEM_@Kv_-&7_)Ncl&gOf14d($YhxOefj0DM%%9oGTdI57|UT> zq7wev>zljfWAl=}7kAs*>U6&xc2-#Xb(X5Kr2TKnBW%J=XJSm2Mf1(*Uf#p28!=(3 zs=e0=jWs>nSBji-llFTWE_a3LQOd>DAwijLR}bww#K_z*$spv)m4xMwPd~jlIbz8{ z2c>_i4imK47_@vt97JTx`gUe7m~Ix=-CAJ6>goIHfaFQXQ1-~5Dm4-Jrk3}o6wfm* z_juQPd*ZxPOW2h3beHaw3t$des@b++QiZ9>sucxcGkcCDi<@@G<YaZti~PknQBzXL zi2vs{YeR*(N7epzc(f`!{hGD>!bIoXSF!TW^=Y@S?6Pb7cXs>Al3L!sv-5*q{F44{ zc5ms$FXrEJ_j)gWk^km))pYj@_it|ds@K18|7NV(q^Isu>6&5wE&HFYFtapEezIig z;y*8f>Q9KJeqT73|L|JhJ#)M~HI*GjlrDAentS?@P}1EH7ugEWSgw^*mPQ;r8{}4) zy=$`5p*?4wMKLsV`)05*1Tuy)D@6HbPH0V8aChRz<f_nnwiC})oV}~O%g%ew&WhU$ zD}L?2c~IfQ9c6}pA^nfS!xRiAX=!WhoM|(a`KA=>$KInCz3qc6tb`a|{YjU~eIho` zE9~Ym4i;I32WGqE-7f@Yg!oKhQ~G$X{&RT16PYUyo-8<?(NX>|KE%Y!OWtwOqyho= zf4^=il^b<W+p1Z6`h{3%2p3lu6Fb*b1y%t@i~fLRPx`y1FRlCdrmy%|-b>kwyEUin zHJ`CnKbh%HDCd(Ui9!1sgs*p95HPrO!^Po{+Sj(r4)!N4Pg;1M@_YPI;KPZp8}$^o zeO~FP9H|f`m9Ezl`b5T=Z@rO>SKpG!Km2XZSf@U}HpOI4Rv-hf$^$XqD|cSa`RZiY z{r=U0TQ>50Cv35pu<b+;#|nijf>+$0FOi<_k|H?gu=@9H?0oZ&+$+A;Q~KoEj#l#& z)U<QoO&~KSC8VgGbK9lHzfUHAbC8ccdFSd%osBoU7j18Dvh-5xlsYGKXu0aL;E0!d zJiGb})*kMt=W<Kw@sxG;TzNP}H+O~Zrl1X393~3S*;UsGy}Unr%g&Oj^@}5YKZO*o z6<xUR+>%L*mX4x_IPI-EJhZ}C8r!b>mIMa>c&f9~iIGcjOA50<pk&CJlsTab4w&od zy;M>S7JD!+(CGR!p&&mNO}EC(v+bW#l$JbXF1$A3w^!=Luxpbh88>OTt#&m?Tolt5 z{w(*XddkHA4APtIbn?A+AKzqoUUK)6a<})3o(Fqev+rB0{qit-7;p8w2@mhqJr`N_ z$~kXg*1tKLzeSn9ZxNZ5Z76=h;Jro9L$&YOpZ>lTE}neDr0PV6`{86sPAz6nUx#0} zFK#hj=Xa;m!*1y^j=+<l0z!6M)PI*JzMCYbRQLA$JxxPirR~S21TOMqNItUaYeU_( z(klj+=9OGrqOxMn0j|kk#CD!uko97rxY*^a48==bLcAG_Y>QVslr)}uVp{iya|XOz z7nWT2P&#v3%}`LQxjpsjk%carnx3jEQc{;iIZihnd#pD{`I?05z5fhB+N*x;&vrPq z_^L%x+-pB`q3uB$OQuZFZn@Bq!Jsnda9P%?_?buc^q<&%C*VSu2U=z^&(q86bosb- zPbSxgui2Iif#R#IL|FY?t`}xFuh8AWG&^7+ONc;W6CV>_wyLHFrw5}#0(0StGKrum zrvzGcLjygSemq*a%-Cmn+3R&#DNhcHyDF;RzUcj=i&bc%!;<SvJ8VQ%9y0_;O-$RX z=$ml)RobSnza5S_2A5u%su*(p%a)R7uh#99dq4e<W{2p5z{5_)npatteYfynd34Ai z>iLqjCsH#SJognX^$yoemy~sC;9H>GUdp@ers|fZs&2~~xaK^YaX#{nhG#$^!-^zJ z*W$E0yJqfExs;xi?a|78>{!rNF6O_BR$1A3%8QvVjeUGm=6TQEOV*2@>^QwO(^o0j zBKGylMbU*3Q;by8mD&^*H}tUFPYi#2W?6yJj9_uO2hPq>eJMRDa}IkhSh@AmT@lv{ z$E&_Jb-09>^?97~E7jJ#z{dE=<HyFmTJPmfJhw@EH}S5#&Z0N!lTzAd6j*W@DxMQ^ zYYte_w_t(Qn&V4F;x1|N+)wwOVJh<ATJA?D=0$tA%&rM&c(FcL?Y@YDmG*7V?MFHI zy1rc^LvrJng{*!&%3J>}`62CI<vYV_(hQEWo9jY_9$qp~3HMOC_*vrR?0*;KUfnIX z>eE|bs8Y(nep>m_u`jFlR4dQ<ID40SN!>E{qrES~D`2(SUmw&W?AJ_KD8BBwduiSa zgnX%XjQ{(9N9!4#jC&rhsXf-C<uzf^R3;H4nR=aBVKc6Z&tJcJIjdp3tYuqN^qo)l zGP1*a_ny~%*0#0cHWj$@Cmyi4>7B8sXa<Km;{{Ka$ZOM1cV!-QU2@^ih5|#ub8#jX zqKDQr|NFJ^mh2Q~qiNEAIz|37>|bYhQtY(ee}+{pt3BBN+`jSP=dy3X5A&0opUuAM z-@3Pte^!2~o!B=EyUe{)enj#v+;Y#1DR>4K|Mo}gq$H2V@3<whdCC&uHQm)R@+S9A q)#$z{sJUFN`C<FUgP(ohEI)LJPap}TGlF4a)dYtB3`zO_Zvp`C$Otn4 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"><description></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"><itunes:summary></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"><itunes:subtitle> + <itunes:summary></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"><content:encoded></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 →</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'])): ?> - — <?= $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']) - ): ?> - — <?= $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') ?> — - PHP: <?= phpversion() ?> — - 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 →</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'])): ?> + — <?= 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'])): ?> + — <?= 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')) ?> — + PHP: <?= esc(phpversion()) ?> — + 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