diff --git a/pod/chapter/static/js/videojs-chapters.js b/pod/chapter/static/js/videojs-chapters.js index 791b9170c8..f9298a4828 100644 --- a/pod/chapter/static/js/videojs-chapters.js +++ b/pod/chapter/static/js/videojs-chapters.js @@ -54,15 +54,28 @@ * Initialize the plugin. */ var Plugin = videojs.getPlugin("plugin"); + + /** + * Custom Video.js plugin for handling chapters in a video player. + * + * @class podVideoJsChapters + * @extends {Plugin} + * @param {Object} player - The Video.js player instance. + * @param {Object} options - Configuration options for the plugin. + */ class podVideoJsChapters extends Plugin { constructor(player, options) { super(player, options); - var settings = videojs.mergeOptions(defaults, options), + var settings = videojs.obj.merge(defaults, options), chapters = {}, currentChapter = document.createElement("li"); /** - * Create the list of chapters + * Create the list of chapters. + * + * @memberof podVideoJsChapters + * @param {Array} data - Chapter data to be displayed. + * @returns {boolean} - Returns false if no chapter data is provided. */ player.createChapters = function (data) { if (!data) { @@ -95,20 +108,14 @@ false, ); } - /* What is the purpose of this code ?? - var oldList = document.getElementById("chapters"); - var newList = document.getElementsByClassName( - "chapters-list inactive" - ); - oldList.parentNode.removeChild(oldList); - - let podPlayer = document.getElementById(player.id()); - podPlayer.append(newList); - **/ }; /** - * Return a list of chapters useable by other functions + * Return a list of chapters usable by other functions. + * + * @memberof podVideoJsChapters + * @param {Array} data - Chapter data to be grouped. + * @returns {Object} - Object containing arrays of chapter information. */ function groupedChapters(data) { var chapters = { @@ -124,10 +131,23 @@ return chapters; } + /** + * Get the grouped chapters. + * + * @memberof podVideoJsChapters + * @returns {Object} - Object containing arrays of chapter information. + */ player.getGroupedChapters = function () { return this.chapters; }; + /** + * Update the current chapter based on the current time. + * + * @memberof podVideoJsChapters + * @param {number} time - Current time in seconds. + * @param {Object} chapters - Object containing arrays of chapter information. + */ player.getCurrentChapter = function (time, chapters) { const currentTime = Math.floor(time); @@ -145,6 +165,11 @@ } }; + /** + * Main function for initializing the plugin. + * + * @memberof podVideoJsChapters + */ player.main = function () { var data = document.querySelectorAll("#chapters li"); if ( diff --git a/pod/chapter/templates/video_chapter.html b/pod/chapter/templates/video_chapter.html index ede38a9524..90ba6282fd 100644 --- a/pod/chapter/templates/video_chapter.html +++ b/pod/chapter/templates/video_chapter.html @@ -5,7 +5,6 @@ {% block page_title %}{% trans 'Chapter video' %} "{{video.title}}" {% endblock page_title %} {% block page_extra_head %} {% include 'videos/video-header.html' %} - diff --git a/pod/enrichment/static/js/videojs-slides.js b/pod/enrichment/static/js/videojs-slides.js index 69a95454d4..519281b50e 100644 --- a/pod/enrichment/static/js/videojs-slides.js +++ b/pod/enrichment/static/js/videojs-slides.js @@ -476,7 +476,7 @@ const onPlayerReady = function (player, options) { */ const slides = function (options) { this.ready(function () { - onPlayerReady(this, videojs.mergeOptions(slides_defaults, options)); + onPlayerReady(this, videojs.obj.merge(slides_defaults, options)); }); }; diff --git a/pod/live/models.py b/pod/live/models.py index 804ff795fc..175a24f694 100644 --- a/pod/live/models.py +++ b/pod/live/models.py @@ -556,8 +556,13 @@ def is_past(self): else: return False - def is_coming(self): - """Test if event will happen in future.""" + def is_coming(self) -> bool: + """ + Chack if event will happen in future. + + Returns: + bool: `True` if the event is scheduled to happen in the future, otherwise `False`. + """ if self.start_date: return timezone.localtime(timezone.now()) < self.start_date else: diff --git a/pod/live/static/js/viewcounter.js b/pod/live/static/js/viewcounter.js index a38d9aaa42..3106d7bf7c 100644 --- a/pod/live/static/js/viewcounter.js +++ b/pod/live/static/js/viewcounter.js @@ -132,7 +132,7 @@ document.addEventListener("DOMContentLoaded", function () { // Initialize the plugin videoJsViewerCount = function (options) { - const settings = videojs.mergeOptions(defaults, options), + const settings = videojs.obj.merge(defaults, options), player = this; player.ready(function () { if (settings.ui) { diff --git a/pod/live/templates/live/direct.html b/pod/live/templates/live/direct.html index 190539fd39..dfa0ec2766 100644 --- a/pod/live/templates/live/direct.html +++ b/pod/live/templates/live/direct.html @@ -188,7 +188,7 @@

} // Management of the end of the stream (for Firefox, Chrome... not working for Edge, Safari) - videojs.Hls.xhr.beforeRequest = function(options) { + videojs.Hls.xhr.onRequest = function(options) { // Reset counter if video state is ok if (started && player.readyState() > 2) { nbLoop = 0; } if (started && player.readyState() <= 2) { diff --git a/pod/live/templates/live/event-iframe.html b/pod/live/templates/live/event-iframe.html index 3c478f743a..7fe2634657 100644 --- a/pod/live/templates/live/event-iframe.html +++ b/pod/live/templates/live/event-iframe.html @@ -140,7 +140,6 @@

{{ event.title }}

{# affichage du bouton d'info sur le player #} {% if event.is_coming and event.video_on_hold.is_video or event.is_current %} - +{% endif %} + + - {% endif %} {% if event.is_current and event.enable_transcription and event.broadcaster.status and event.broadcaster.transcription_file %} @@ -83,7 +83,6 @@

- {% if event.aside_iframe_url %} @@ -152,6 +151,10 @@

+ {% get_setting "USE_VIDEO_P2P" False as use_video_p2p %} + {% if use_video_p2p and event.is_current %} + {% include 'videos/video_p2p_stats.html' %} + {% endif %}

{{ event.title|capfirst }}

@@ -161,13 +164,12 @@

title="{% trans 'Report the event' %}"> - {% if event.is_current and can_record %} {% if can_manage_stream %}

-
{% include 'live/event-all-info.html' %}
{% endif %} diff --git a/pod/locale/fr/LC_MESSAGES/django.mo b/pod/locale/fr/LC_MESSAGES/django.mo index b3ea4a4218..68b79450fd 100644 Binary files a/pod/locale/fr/LC_MESSAGES/django.mo and b/pod/locale/fr/LC_MESSAGES/django.mo differ diff --git a/pod/locale/fr/LC_MESSAGES/django.po b/pod/locale/fr/LC_MESSAGES/django.po index aa02cfbf35..b8cb5e7a53 100644 --- a/pod/locale/fr/LC_MESSAGES/django.po +++ b/pod/locale/fr/LC_MESSAGES/django.po @@ -815,7 +815,6 @@ msgstr "Le direct BigBlueButton a été publié et va bientôt démarrer." #: pod/chapter/apps.py pod/chapter/models.py #: pod/chapter/templates/video_chapter.html -#: pod/video/templates/videos/video-element.html msgid "Chapters" msgstr "Chapitres" @@ -2147,10 +2146,6 @@ msgstr "Vous ne pouvez faire des enrichissements qui se chevauchent." msgid "You must save your enrichments to view the result." msgstr "Vous devez sauvegarder vos enrichissements pour voir le résultat." -#: pod/enrichment/templates/enrichment/enrichment_informations_card_aside.html -msgid "Informations" -msgstr "Informations" - #: pod/enrichment/templates/enrichment/enrichment_informations_card_aside.html msgid "To help you, the different types of enrichments have specific colors:" msgstr "" @@ -2200,6 +2195,37 @@ msgstr "Supprimer l’enrichissement « %(enrich_title)s »" msgid "Enriched" msgstr "Enrichi" +#: pod/enrichment/templates/enrichment/video_enrichment.html +#: pod/live/templates/live/event-info.html +#: pod/video/templates/videos/video-info.html +#: pod/video/templates/videos/video_opengraph.html +#: pod/video/templates/videos/video_page_content.html +msgid "Added by:" +msgstr "Ajouté par :" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +#: pod/video/templates/videos/video-script.html +msgid "Informations" +msgstr "Informations" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "To help you, the different types of enrichments have specific colors:" +msgstr "" +"Pour vous aider, les différents types d’enrichissements ont des couleurs " +"spécifiques :" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "Weblink" +msgstr "Lien web" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "Embed" +msgstr "Intégrer" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "They are visible on the video playback bar." +msgstr "Ils sont visibles sur la barre de lecture de la vidéo." + #: pod/enrichment/views.py msgid "You cannot enrich this video." msgstr "Vous ne pouvez pas enrichir cette vidéo." @@ -8298,6 +8324,18 @@ msgstr "Télécharger les notes" msgid "New note" msgstr "Nouvelle note" +#: pod/video/templates/videos/video_p2p_stats.html +msgid "Number of people sharing this resource." +msgstr "Nombre de personnes partageant cette ressource." + +#: pod/video/templates/videos/video_p2p_stats.html +msgid "Video data downloaded from the server or another peer." +msgstr "Données vidéo téléchargées à partir du serveur ou d'un autre pair." + +#: pod/video/templates/videos/video_p2p_stats.html +msgid "Video data shared with other peer." +msgstr "Données vidéo partagées avec d'autres pairs." + #: pod/video/templates/videos/video_page_content.html msgid "Channel description" msgstr "Description de la chaîne" @@ -8381,6 +8419,10 @@ msgstr "-- désolé, aucune traduction fournie --" msgid "You cannot edit this channel." msgstr "Vous ne pouvez éditer cette chaîne." +#: pod/video/views.py +msgid "Sorry, you can't access to the video chapter." +msgstr "Désolé, vous ne pouvez pas accéder au chapitrage de la vidéo." + #: pod/video/views.py msgid "You cannot watch this video." msgstr "Vous ne pouvez pas voir cette vidéo." @@ -8761,6 +8803,9 @@ msgstr "Résultats de la recherche" msgid "Esup-Pod xAPI" msgstr "xAPI Esup-Pod" +#~ msgid "Information" +#~ msgstr "Informations" + #~ msgid "Toggle navigation" #~ msgstr "Basculer le menu" diff --git a/pod/locale/fr/LC_MESSAGES/djangojs.mo b/pod/locale/fr/LC_MESSAGES/djangojs.mo index cd10823003..91f3844e89 100644 Binary files a/pod/locale/fr/LC_MESSAGES/djangojs.mo and b/pod/locale/fr/LC_MESSAGES/djangojs.mo differ diff --git a/pod/locale/fr/LC_MESSAGES/djangojs.po b/pod/locale/fr/LC_MESSAGES/djangojs.po index e8819c4fa5..b86972261b 100644 --- a/pod/locale/fr/LC_MESSAGES/djangojs.po +++ b/pod/locale/fr/LC_MESSAGES/djangojs.po @@ -7,7 +7,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-01-08 12:08+0100\n" "PO-Revision-Date: \n" -"Last-Translator: obado \n" +"Last-Translator: ptitloup \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -179,19 +179,11 @@ msgstr "Mettez en pause pour entrer le texte du segment entre %s et %s." msgid "A caption cannot has more than 80 characters." msgstr "Une légende / sous-titre ne peut comporter plus de 80 caractères." -#: pod/completion/static/js/caption_maker.js -msgid "Add a caption/subtitle after this one" -msgstr "Ajouter un(e) légende/sous-titre ci-dessous" - #: pod/completion/static/js/caption_maker.js #: pod/podfile/static/podfile/js/filewidget.js msgid "Add" msgstr "Ajouter" -#: pod/completion/static/js/caption_maker.js -msgid "Delete this caption/subtitle" -msgstr "Supprimer ce(tte) légende/sous-titre" - #: pod/completion/static/js/caption_maker.js #: pod/video/static/js/comment-script.js msgid "Delete" @@ -525,11 +517,6 @@ msgstr "Sauvegarder" msgid "Network response was not ok." msgstr "La réponse du réseau n’était pas correcte." -#: pod/podfile/static/podfile/js/filewidget.js -#: pod/video/static/js/change_video_owner.js -msgid "Loading…" -msgstr "Chargement en cours…" - #: pod/podfile/static/podfile/js/filewidget.js msgid "Change image" msgstr "Changer d’image" @@ -619,26 +606,18 @@ msgstr "Souscription aux notifications réussie." msgid "Error while subscribing to push notifications." msgstr "Une erreur est survenue lors de la souscription aux notifications." -#: pod/video/static/js/ajax-display-channels.js -msgid "%(count)s channel" -msgid_plural "%(count)s channels" -msgstr[0] "%(count)s chaîne" -msgstr[1] "%(count)s chaînes" - #: pod/video/static/js/ajax-display-channels.js msgid "No channels found" msgstr "Aucun chaîne trouvée" -#: pod/video/static/js/ajax-display-channels.js -msgid "%(count)s video" -msgid_plural "%(count)s videos" -msgstr[0] "%(count)s vidéo" -msgstr[1] "%(count)s vidéos" - #: pod/video/static/js/change_video_owner.js msgid "No element found" msgstr "Aucun élément trouvé" +#: pod/video/static/js/change_video_owner.js +msgid "Loading…" +msgstr "Chargement en cours…" + #: pod/video/static/js/change_video_owner.js msgid "An error occurred during the change of owner" msgstr "Une erreur s’est produite lors du changement de propriétaire" @@ -659,37 +638,14 @@ msgstr "Réponses" msgid "Cancel" msgstr "Annuler" -#: pod/video/static/js/comment-script.js -#, javascript-format -msgid "%s vote" -msgid_plural "%s votes" -msgstr[0] "%s vote" -msgstr[1] "%s votes" - #: pod/video/static/js/comment-script.js msgid "Agree with the comment" msgstr "D’accord avec ce commentaire" -#: pod/video/static/js/comment-script.js -msgid "Reply to comment" -msgstr "Répondre au commentaire" - -#: pod/video/static/js/comment-script.js -msgid "Reply" -msgstr "Répondre" - #: pod/video/static/js/comment-script.js msgid "Remove this comment" msgstr "Supprimer ce commentaire" -#: pod/video/static/js/comment-script.js -msgid "Add a public comment" -msgstr "Ajouter un commentaire public" - -#: pod/video/static/js/comment-script.js -msgid "Send" -msgstr "Envoyer" - #: pod/video/static/js/comment-script.js msgid "Show answers" msgstr "Afficher les réponses" @@ -702,6 +658,13 @@ msgstr "Mauvaise réponse du serveur." msgid "Sorry, you're not allowed to vote by now." msgstr "Désolé, vous n’êtes pas autorisé à voter maintenant." +#: pod/video/static/js/comment-script.js +#, javascript-format +msgid "%s vote" +msgid_plural "%s votes" +msgstr[0] "%s vote" +msgstr[1] "%s votes" + #: pod/video/static/js/comment-script.js msgid "Sorry, you can't comment this video by now." msgstr "Désolé, vous ne pouvez pas commenter cette vidéo maintenant." @@ -722,47 +685,38 @@ msgstr[0] "%s commentaire" msgstr[1] "%s commentaires" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is password protected." msgstr "Ce contenu est protégé par mot de passe." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is chaptered." msgstr "Ce contenu est chapitré." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is in draft." msgstr "Ce contenu est en brouillon." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Video content." msgstr "Contenu vidéo." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Audio content." msgstr "Contenu audio." #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Edit the video" msgstr "Éditer la vidéo" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Complete the video" msgstr "Compléter la vidéo" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Chapter the video" msgstr "Chapitrer la vidéo" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Delete the video" msgstr "Supprimer la vidéo" @@ -835,18 +789,6 @@ msgstr "Désolé, aucune vidéo trouvée" msgid "Edit the category" msgstr "Éditer la catégorie" -#: pod/video/static/js/video_category.js -msgid "Delete the category" -msgstr "Supprimer la catégorie" - -#: pod/video/static/js/video_category.js -msgid "Success!" -msgstr "Succès !" - -#: pod/video/static/js/video_category.js -msgid "Error…" -msgstr "Erreur…" - #: pod/video/static/js/video_category.js msgid "Category created successfully" msgstr "Catégorie créée avec succès" @@ -922,3 +864,20 @@ msgstr "Ajouts en favoris total depuis la création" #: pod/video/static/js/video_stats_view.js msgid "Slug" msgstr "Titre court" + +#~ msgid "Add a caption/subtitle after this one" +#~ msgstr "Ajouter un(e) légende/sous-titre ci-dessous" + +#~ msgid "Delete this caption/subtitle" +#~ msgstr "Supprimer ce(tte) légende/sous-titre" + +#~ msgid "Channel" +#~ msgstr "Chaîne" + +#~ msgid "%(count)s channel" +#~ msgid_plural "%(count)s channels" +#~ msgstr[0] "%(count)s chaîne" +#~ msgstr[1] "%(count)s chaînes" + +#~ msgid "videos" +#~ msgstr "vidéos" diff --git a/pod/locale/nl/LC_MESSAGES/django.po b/pod/locale/nl/LC_MESSAGES/django.po index e82da49e23..a2834c6238 100644 --- a/pod/locale/nl/LC_MESSAGES/django.po +++ b/pod/locale/nl/LC_MESSAGES/django.po @@ -765,7 +765,6 @@ msgstr "" #: pod/chapter/apps.py pod/chapter/models.py #: pod/chapter/templates/video_chapter.html -#: pod/video/templates/videos/video-element.html msgid "Chapters" msgstr "" @@ -2090,6 +2089,35 @@ msgstr "" msgid "Enriched" msgstr "" +#: pod/enrichment/templates/enrichment/video_enrichment.html +#: pod/live/templates/live/event-info.html +#: pod/video/templates/videos/video-info.html +#: pod/video/templates/videos/video_opengraph.html +#: pod/video/templates/videos/video_page_content.html +msgid "Added by:" +msgstr "" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +#: pod/video/templates/videos/video-script.html +msgid "Informations" +msgstr "" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "To help you, the different types of enrichments have specific colors:" +msgstr "" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "Weblink" +msgstr "" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "Embed" +msgstr "" + +#: pod/enrichment/templates/enrichment/video_enrichment.html +msgid "They are visible on the video playback bar." +msgstr "" + #: pod/enrichment/views.py msgid "You cannot enrich this video." msgstr "" @@ -7779,6 +7807,18 @@ msgstr "" msgid "New note" msgstr "" +#: pod/video/templates/videos/video_p2p_stats.html +msgid "Number of people sharing this resource." +msgstr "" + +#: pod/video/templates/videos/video_p2p_stats.html +msgid "Video data downloaded from the server or another peer." +msgstr "" + +#: pod/video/templates/videos/video_p2p_stats.html +msgid "Video data shared with other peer." +msgstr "" + #: pod/video/templates/videos/video_page_content.html msgid "Channel description" msgstr "" @@ -7857,6 +7897,10 @@ msgstr "" msgid "You cannot edit this channel." msgstr "" +#: pod/video/views.py +msgid "Sorry, you can't access to the video chapter." +msgstr "" + #: pod/video/views.py msgid "You cannot watch this video." msgstr "" diff --git a/pod/locale/nl/LC_MESSAGES/djangojs.po b/pod/locale/nl/LC_MESSAGES/djangojs.po index b2f69eac53..cbb4e46bb7 100644 --- a/pod/locale/nl/LC_MESSAGES/djangojs.po +++ b/pod/locale/nl/LC_MESSAGES/djangojs.po @@ -163,19 +163,11 @@ msgstr "" msgid "A caption cannot has more than 80 characters." msgstr "" -#: pod/completion/static/js/caption_maker.js -msgid "Add a caption/subtitle after this one" -msgstr "" - #: pod/completion/static/js/caption_maker.js #: pod/podfile/static/podfile/js/filewidget.js msgid "Add" msgstr "" -#: pod/completion/static/js/caption_maker.js -msgid "Delete this caption/subtitle" -msgstr "" - #: pod/completion/static/js/caption_maker.js #: pod/video/static/js/comment-script.js msgid "Delete" @@ -499,11 +491,6 @@ msgstr "" msgid "Network response was not ok." msgstr "" -#: pod/podfile/static/podfile/js/filewidget.js -#: pod/video/static/js/change_video_owner.js -msgid "Loading…" -msgstr "" - #: pod/podfile/static/podfile/js/filewidget.js msgid "Change image" msgstr "" @@ -588,26 +575,18 @@ msgstr "" msgid "Error while subscribing to push notifications." msgstr "" -#: pod/video/static/js/ajax-display-channels.js -msgid "%(count)s channel" -msgid_plural "%(count)s channels" -msgstr[0] "" -msgstr[1] "" - #: pod/video/static/js/ajax-display-channels.js msgid "No channels found" msgstr "" -#: pod/video/static/js/ajax-display-channels.js -msgid "%(count)s video" -msgid_plural "%(count)s videos" -msgstr[0] "" -msgstr[1] "" - #: pod/video/static/js/change_video_owner.js msgid "No element found" msgstr "" +#: pod/video/static/js/change_video_owner.js +msgid "Loading…" +msgstr "" + #: pod/video/static/js/change_video_owner.js msgid "An error occurred during the change of owner" msgstr "" @@ -628,37 +607,14 @@ msgstr "" msgid "Cancel" msgstr "" -#: pod/video/static/js/comment-script.js -#, javascript-format -msgid "%s vote" -msgid_plural "%s votes" -msgstr[0] "" -msgstr[1] "" - #: pod/video/static/js/comment-script.js msgid "Agree with the comment" msgstr "" -#: pod/video/static/js/comment-script.js -msgid "Reply to comment" -msgstr "" - -#: pod/video/static/js/comment-script.js -msgid "Reply" -msgstr "" - #: pod/video/static/js/comment-script.js msgid "Remove this comment" msgstr "" -#: pod/video/static/js/comment-script.js -msgid "Add a public comment" -msgstr "" - -#: pod/video/static/js/comment-script.js -msgid "Send" -msgstr "" - #: pod/video/static/js/comment-script.js msgid "Show answers" msgstr "" @@ -671,6 +627,13 @@ msgstr "" msgid "Sorry, you're not allowed to vote by now." msgstr "" +#: pod/video/static/js/comment-script.js +#, javascript-format +msgid "%s vote" +msgid_plural "%s votes" +msgstr[0] "" +msgstr[1] "" + #: pod/video/static/js/comment-script.js msgid "Sorry, you can't comment this video by now." msgstr "" @@ -691,47 +654,38 @@ msgstr[0] "" msgstr[1] "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is password protected." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is chaptered." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "This content is in draft." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Video content." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Audio content." msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Edit the video" msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Complete the video" msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Chapter the video" msgstr "" #: pod/video/static/js/regroup_videos_by_theme.js -#: pod/video/static/js/video_category.js msgid "Delete the video" msgstr "" @@ -803,18 +757,6 @@ msgstr "" msgid "Edit the category" msgstr "" -#: pod/video/static/js/video_category.js -msgid "Delete the category" -msgstr "" - -#: pod/video/static/js/video_category.js -msgid "Success!" -msgstr "" - -#: pod/video/static/js/video_category.js -msgid "Error…" -msgstr "" - #: pod/video/static/js/video_category.js msgid "Category created successfully" msgstr "" diff --git a/pod/main/configuration.json b/pod/main/configuration.json index 98a9efbd23..51729814b1 100644 --- a/pod/main/configuration.json +++ b/pod/main/configuration.json @@ -1590,6 +1590,18 @@ "fr": "Configuration application meeting" } }, + "peer_to_peer": { + "description" : { + "en": [ + "Peer to peer app for the peer to peer management.", + "Set `USE_PEER_TO_PEER` to True to activate this application." + ], + "fr": [ + "Application Peer to peer pour la gestion du pair à pair.", + "Mettre `USE_PEER_TO_PEER` à True pour activer cette application." + ] + } + }, "playlist": { "description": { "en": [ @@ -2310,6 +2322,36 @@ "pod_version_end": "", "pod_version_init": "3.1.0" }, + "P2P_TRACKERS": { + "default_value": "[]", + "description": { + "en": [ + "", + "Array of trackers for the peer to peer file sharing" + ], + "fr": [ + "", + "list des trackers pour le partage de fichier en mode pair à pair" + ] + }, + "pod_version_end": "", + "pod_version_init": "3.4.0" + }, + "P2P_STUNS": { + "default_value": "[]", + "description": { + "en": [ + "", + "Array of stun server for the peer to peer file sharing" + ], + "fr": [ + "", + "list des serveurs stun pour le partage de fichier en mode pair à pair" + ] + }, + "pod_version_end": "", + "pod_version_init": "3.4.0" + }, "RESTRICT_EDIT_VIDEO_ACCESS_TO_STAFF_ONLY": { "default_value": false, "description": { @@ -2430,6 +2472,21 @@ "pod_version_end": "", "pod_version_init": "3.1.0" }, + "USE_VIDEO_P2P": { + "default_value": false, + "description": { + "en": [ + "", + "active the peer to peer function for video player" + ], + "fr": [ + "", + "Active la fonction pair à pair dans le lecteur vidéo de Pod" + ] + }, + "pod_version_end": "", + "pod_version_init": "3.4.0" + }, "USE_XAPI_VIDEO": { "default_value": false, "description": { diff --git a/pod/main/test_settings.py b/pod/main/test_settings.py index d8123d382f..93f40ac9e7 100644 --- a/pod/main/test_settings.py +++ b/pod/main/test_settings.py @@ -74,6 +74,7 @@ USE_MEETING = True +USE_PEER_TO_PEER = True def get_shared_secret(): api_mate_url = "https://bigbluebutton.org/api-mate/" diff --git a/pod/package-lock.json b/pod/package-lock.json new file mode 100644 index 0000000000..91eb0723ba --- /dev/null +++ b/pod/package-lock.json @@ -0,0 +1,4496 @@ +{ + "name": "pod", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "license": "LGPL-3.0", + "dependencies": { + "@peertube/p2p-media-loader-core": "^1.0.14", + "@peertube/p2p-media-loader-hlsjs": "^1.0.14", + "@silvermine/videojs-quality-selector": "^1.3.0", + "blueimp-file-upload": "^10.32.0", + "bootstrap": "^5.3.2", + "bootstrap-icons": "^1.10.5", + "dayjs": "^1.11.8", + "hls.js": "^1.4.12", + "jqGrid": "^5.8.2", + "jquery": "^3.7.0", + "jquery-ui-dist": "^1.13.2", + "js-cookie": "^3.0.5", + "peerjs": "^1.5.2", + "spark-md5": "^3.0.2", + "video.js": "^8.5.2", + "videojs-overlay": "^3.1.0", + "videojs-quality-selector-hls": "^1.1.1", + "videojs-vr": "^2.0.0", + "videojs-vtt-thumbnails": "^0.0.13", + "videojs-wavesurfer": "^3.9.0", + "wavesurfer.js": "^6.6.4", + "waypoints": "^4.0.1" + }, + "engines": { + "yarn": ">= 1.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cbor-extract/cbor-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@cbor-extract/cbor-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@msgpack/msgpack": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.8.0.tgz", + "integrity": "sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@peertube/p2p-media-loader-core": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@peertube/p2p-media-loader-core/-/p2p-media-loader-core-1.0.15.tgz", + "integrity": "sha512-RgUi3v4jT1+/8TEHj9NWCXVJW+p/m8fFJtcvh6FQxXZpz4u24pYbMFuM60gfboItuEA7xqo5C3XN8Y4kmOyXmw==", + "dependencies": { + "bittorrent-tracker": "^9.19.0", + "debug": "^4.3.4", + "events": "^3.3.0", + "sha.js": "^2.4.11", + "simple-peer": "^9.11.1" + } + }, + "node_modules/@peertube/p2p-media-loader-hlsjs": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@peertube/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-1.0.15.tgz", + "integrity": "sha512-A2GkuSHqXTjVMglx5rXwsEYgopE/yCyc7lrESdOhtpSx41tWYF7Oad37jyITfb2rTYqh2Mr2/b5iFOo4EgyAbg==", + "dependencies": { + "@peertube/p2p-media-loader-core": "^1.0.15", + "debug": "^4.3.4", + "events": "^3.3.0", + "m3u8-parser": "^4.7.1" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@silvermine/videojs-quality-selector": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@silvermine/videojs-quality-selector/-/videojs-quality-selector-1.3.1.tgz", + "integrity": "sha512-uo6gs2HVG2TD0bpZAl0AT6RkDXzk9PnAxtmmW5zXexa2uJvkdFT64QvJoMlEUd2FUUwqYqqAuWGFDJdBh5+KcQ==", + "dependencies": { + "underscore": "1.13.1" + }, + "peerDependencies": { + "video.js": ">=6.0.0" + } + }, + "node_modules/@videojs/http-streaming": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.9.1.tgz", + "integrity": "sha512-bNKlbs+b4NTyZlU3iLXj2glEHfAErjKqQryeEoDQ8FqnlFHzza7ijhMB+d/5BMrfRyiL2SvKrTDjD1CbH8QOFQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "4.0.0", + "aes-decrypter": "4.0.1", + "global": "^4.4.0", + "m3u8-parser": "^7.1.0", + "mpd-parser": "^1.3.0", + "mux.js": "7.0.2", + "video.js": "^7 || ^8" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^7 || ^8" + } + }, + "node_modules/@videojs/http-streaming/node_modules/@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/http-streaming/node_modules/m3u8-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", + "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "node_modules/@videojs/http-streaming/node_modules/m3u8-parser/node_modules/@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/@videojs/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "node_modules/addr-to-ip-port": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-1.5.4.tgz", + "integrity": "sha512-ByxmJgv8vjmDcl3IDToxL2yrWFrRtFpZAToY0f46XFXl8zS081t7El5MXIodwm7RC6DhHBRoOSMLFSPKCtHukg==" + }, + "node_modules/aes-decrypter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.1.tgz", + "integrity": "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bencode": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", + "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" + }, + "node_modules/bittorrent-peerid": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/bittorrent-peerid/-/bittorrent-peerid-1.3.6.tgz", + "integrity": "sha512-VyLcUjVMEOdSpHaCG/7odvCdLbAB1y3l9A2V6WIje24uV7FkJPrQrH/RrlFmKxP89pFVDEnE+YlHaFujlFIZsg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bittorrent-tracker": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-9.19.0.tgz", + "integrity": "sha512-09d0aD2b+MC+zWvWajkUAKkYMynYW4tMbTKiRSthKtJZbafzEoNQSUHyND24SoCe3ZOb2fKfa6fu2INAESL9wA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "bencode": "^2.0.1", + "bittorrent-peerid": "^1.3.3", + "bn.js": "^5.2.0", + "chrome-dgram": "^3.0.6", + "clone": "^2.0.0", + "compact2string": "^1.4.1", + "debug": "^4.1.1", + "ip": "^1.1.5", + "lru": "^3.1.0", + "minimist": "^1.2.5", + "once": "^1.4.0", + "queue-microtask": "^1.2.3", + "random-iterate": "^1.0.1", + "randombytes": "^2.1.0", + "run-parallel": "^1.2.0", + "run-series": "^1.1.9", + "simple-get": "^4.0.0", + "simple-peer": "^9.11.0", + "simple-websocket": "^9.1.0", + "socks": "^2.0.0", + "string2compact": "^1.3.0", + "unordered-array-remove": "^1.0.2", + "ws": "^7.4.5" + }, + "bin": { + "bittorrent-tracker": "bin/cmd.js" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "bufferutil": "^4.0.3", + "utf-8-validate": "^5.0.5" + } + }, + "node_modules/blueimp-canvas-to-blob": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz", + "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==", + "optional": true + }, + "node_modules/blueimp-file-upload": { + "version": "10.32.0", + "resolved": "https://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-10.32.0.tgz", + "integrity": "sha512-3WMJw5Cbfz94Adl1OeyH+rRpGwHiNHzja+CR6aRWPoAtwrUwvP5gXKo0XdX+sdPE+iCU63Xmba88hoHQmzY8RQ==", + "optionalDependencies": { + "blueimp-canvas-to-blob": "3", + "blueimp-load-image": "5", + "blueimp-tmpl": "3" + }, + "peerDependencies": { + "jquery": ">=1.7" + } + }, + "node_modules/blueimp-load-image": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-5.16.0.tgz", + "integrity": "sha512-3DUSVdOtlfNRk7moRZuTwDmA3NnG8KIJuLcq3c0J7/BIr6X3Vb/EpX3kUH1joxUhmoVF4uCpDfz7wHkz8pQajA==", + "optional": true + }, + "node_modules/blueimp-tmpl": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-3.20.0.tgz", + "integrity": "sha512-g6ln9L+VX8ZA4WA8mgKMethYH+5teroJ2uOkCvcthy9Y9d9LrQ42OAMn+r3ECKu9CB+xe9GOChlIUJBSxwkI6g==", + "optional": true, + "bin": { + "tmpl.js": "js/compile.js" + } + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/bootstrap-icons": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", + "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ] + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/cardboard-vr-display": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/cardboard-vr-display/-/cardboard-vr-display-1.0.19.tgz", + "integrity": "sha512-+MjcnWKAkb95p68elqZLDPzoiF/dGncQilLGvPBM5ZorABp/ao3lCs7nnRcYBckmuNkg1V/5rdGDKoUaCVsHzQ==", + "dependencies": { + "gl-preserve-state": "^1.0.0", + "nosleep.js": "^0.7.0", + "webvr-polyfill-dpdb": "^1.0.17" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/cbor-extract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.1.1" + }, + "bin": { + "download-cbor-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0" + } + }, + "node_modules/cbor-x": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.4.tgz", + "integrity": "sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==", + "optionalDependencies": { + "cbor-extract": "^2.1.1" + } + }, + "node_modules/chrome-dgram": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", + "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "inherits": "^2.0.4", + "run-series": "^1.1.9" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compact2string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.1.tgz", + "integrity": "sha512-3D+EY5nsRhqnOwDxveBv5T8wGo4DEvYxjDtPGmdOX+gfr5gE92c2RC0w2wa+xEefm07QuVqqcF3nZJUZ92l/og==", + "dependencies": { + "ipaddr.js": ">= 0.1.5" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-browser-rtc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", + "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==" + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/gl-preserve-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz", + "integrity": "sha512-zQZ25l3haD4hvgJZ6C9+s0ebdkW9y+7U2qxvGu1uWOJh8a4RU+jURIKEQhf8elIlFpMH6CrAY2tH0mYrRjet3Q==" + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dependencies": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hls.js": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.14.tgz", + "integrity": "sha512-UppQjyvPVclg+6t2KY/Rv03h0+bA5u6zwqVoz4LAC/L0fgYmIaCD7ZCrwe8WI1Gv01be1XL0QFsRbSdIHV/Wbw==" + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/individual": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", + "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==" + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dependencies": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dependencies": { + "is-unc-path": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dependencies": { + "unc-path-regex": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jqGrid": { + "version": "5.8.4", + "resolved": "https://registry.npmjs.org/jqGrid/-/jqGrid-5.8.4.tgz", + "integrity": "sha512-iamfBPJ0CWtP6OF3RFMtzcpteek2Ylo1OMo3kgmi++svo+V2Eb6l9r06Ddr4QP7zsXZuThOG3ut6JuPjycxbPw==", + "dependencies": { + "grunt-cli": "^1.3.2" + } + }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "node_modules/jquery-ui-dist": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.13.2.tgz", + "integrity": "sha512-oVDRd1NLtTbBwpRKAYdIRgpWVDzeBhfy7Gu0RmY6JEaZtmBq6kDn1pm5SgDiAotrnDS+RoTRXO6xvcNTxA9tOA==", + "dependencies": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "node_modules/js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", + "dependencies": { + "inherits": "^2.0.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/m3u8-parser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.8.0.tgz", + "integrity": "sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mpd-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.0.tgz", + "integrity": "sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, + "node_modules/mpd-parser/node_modules/@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mux.js": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.2.tgz", + "integrity": "sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/node-gyp-build": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dependencies": { + "abbrev": "1", + "osenv": "^0.1.4" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/nosleep.js": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.7.0.tgz", + "integrity": "sha512-Z4B1HgvzR+en62ghwZf6BwAR6x4/pjezsiMcbF9KMLh7xoscpoYhaSXfY3lLkqC68AtW+/qLJ1lzvBIj0FGaTA==" + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dependencies": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dependencies": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dependencies": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dependencies": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dependencies": { + "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/peerjs": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/peerjs/-/peerjs-1.5.2.tgz", + "integrity": "sha512-pPrtNwPyWJHRPxy2y+rHcdlrG8UwUBB1nl+3Yj6r7FLwcbBpcB2NvGNvLvcrxAVGGGX9fsdA5VT5zBKTZcm1DQ==", + "dependencies": { + "@msgpack/msgpack": "^2.8.0", + "cbor-x": "1.5.4", + "eventemitter3": "^4.0.7", + "peerjs-js-binarypack": "^2.1.0", + "webrtc-adapter": "^8.0.0" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/peer" + } + }, + "node_modules/peerjs-js-binarypack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/peerjs-js-binarypack/-/peerjs-js-binarypack-2.1.0.tgz", + "integrity": "sha512-YIwCC+pTzp3Bi8jPI9UFKO0t0SLo6xALnHkiNt/iUFmUUZG0fEEmEyFKvjsDKweiFitzHRyhuh6NvyJZ4nNxMg==", + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/peer" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkcs7": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz", + "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", + "dependencies": { + "@babel/runtime": "^7.5.5" + }, + "bin": { + "pkcs7": "bin/cli.js" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/random-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", + "integrity": "sha512-Jdsdnezu913Ot8qgKgSgs63XkAjEsnMcS1z+cC6D6TNXsUXsMxy0RpclF2pzGZTEiTXL9BiArdGTEexcv4nqcA==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/rust-result": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", + "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", + "dependencies": { + "individual": "^2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", + "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", + "dependencies": { + "rust-result": "^1.0.0" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sdp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", + "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-peer": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", + "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "buffer": "^6.0.3", + "debug": "^4.3.2", + "err-code": "^3.0.1", + "get-browser-rtc": "^1.1.0", + "queue-microtask": "^1.2.3", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0" + } + }, + "node_modules/simple-websocket": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz", + "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "debug": "^4.3.1", + "queue-microtask": "^1.2.2", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0", + "ws": "^7.4.2" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + }, + "node_modules/spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + }, + "node_modules/sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string2compact": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-1.3.2.tgz", + "integrity": "sha512-3XUxUgwhj7Eqh2djae35QHZZT4mN3fsO7kagZhSGmhhlrQagVvWSFuuFIWnpxFS0CdTB2PlQcaL16RDi14I8uw==", + "dependencies": { + "addr-to-ip-port": "^1.0.1", + "ipaddr.js": "^2.0.0" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/three": { + "version": "0.125.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", + "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" + }, + "node_modules/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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "node_modules/unordered-array-remove": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", + "integrity": "sha512-45YsfD6svkgaCBNyvD+dFHm4qFX9g3wRSIVgWVPtm2OCnphvPxzJoe20ATsiNpNJrmzHifnxm+BN5F7gFT/4gw==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-toolkit": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", + "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/video.js": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.9.0.tgz", + "integrity": "sha512-zkDymz4aCGSdPgOoG48W+UqoYU/JYXIr78HLWkjkXvIs0rrvx0hay3w+X9/OzWNM0/5M75somsdxrvQGr/U1TA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "3.9.1", + "@videojs/vhs-utils": "^4.0.0", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "^4.0.1", + "global": "4.4.0", + "keycode": "2.2.0", + "m3u8-parser": "^7.1.0", + "mpd-parser": "^1.2.2", + "mux.js": "^7.0.1", + "safe-json-parse": "4.0.0", + "videojs-contrib-quality-levels": "4.0.0", + "videojs-font": "4.1.0", + "videojs-vtt.js": "0.15.5" + } + }, + "node_modules/video.js/node_modules/@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/video.js/node_modules/m3u8-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", + "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "node_modules/video.js/node_modules/m3u8-parser/node_modules/@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/videojs-contrib-quality-levels": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz", + "integrity": "sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==", + "dependencies": { + "global": "^4.4.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6" + }, + "peerDependencies": { + "video.js": "^8" + } + }, + "node_modules/videojs-font": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.1.0.tgz", + "integrity": "sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==" + }, + "node_modules/videojs-overlay": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/videojs-overlay/-/videojs-overlay-3.1.0.tgz", + "integrity": "sha512-P863Z4ghWgf7Z4A4uzmHlqIixRb8v5220JuQ4pfb/uorbWSBCt5D+czrp/eTxXXLtSmrSUKn596QswVYZuMzPg==", + "dependencies": { + "global": "^4.3.2", + "video.js": "^6 || ^7 || ^8" + } + }, + "node_modules/videojs-quality-selector-hls": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/videojs-quality-selector-hls/-/videojs-quality-selector-hls-1.1.1.tgz", + "integrity": "sha512-GR7Bs/pL4nioq+jlSASqy4nUlnnmY7NnjXY6vBPlmBJA7OuYD80ceyejuCbNeaXX7cC11WOtKTeC8QBJcKuMtA==", + "dependencies": { + "global": "^4.4.0", + "video.js": "^8.3.0", + "videojs-contrib-quality-levels": "^4.0.0" + }, + "engines": { + "node": ">=18", + "npm": ">=9" + } + }, + "node_modules/videojs-vr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/videojs-vr/-/videojs-vr-2.0.0.tgz", + "integrity": "sha512-ix4iN8XHaDSEe89Jqybj9DuLKYuK33EIzcSI0IEdnv1KJuH8bd0PYlQEgqIZTOmWruFpW/+rjYFCVUQ9PTypJw==", + "dependencies": { + "@babel/runtime": "^7.14.5", + "global": "^4.4.0", + "three": "0.125.2", + "video.js": "^6 || ^7", + "webvr-polyfill": "0.10.12" + } + }, + "node_modules/videojs-vr/node_modules/@videojs/http-streaming": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.16.2.tgz", + "integrity": "sha512-etPTUdCFu7gUWc+1XcbiPr+lrhOcBu3rV5OL1M+3PDW89zskScAkkcdqYzP4pFodBPye/ydamQoTDScOnElw5A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "3.0.5", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "^0.22.1", + "mux.js": "6.0.1", + "video.js": "^6 || ^7" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^6 || ^7" + } + }, + "node_modules/videojs-vr/node_modules/aes-decrypter": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-3.1.3.tgz", + "integrity": "sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/videojs-vr/node_modules/mpd-parser": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.22.1.tgz", + "integrity": "sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, + "node_modules/videojs-vr/node_modules/mux.js": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-6.0.1.tgz", + "integrity": "sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/videojs-vr/node_modules/video.js": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.5.tgz", + "integrity": "sha512-WRq86tXZKrThA9mK+IR+v4tIQVVvnb5LhvL71fD2AX7TxVOPdaeK1X/wyuUruBqWaOG3w2sZXoMY6HF2Jlo9qA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "2.16.2", + "@videojs/vhs-utils": "^3.0.4", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "keycode": "^2.2.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "0.22.1", + "mux.js": "6.0.1", + "safe-json-parse": "4.0.0", + "videojs-font": "3.2.0", + "videojs-vtt.js": "^0.15.5" + } + }, + "node_modules/videojs-vr/node_modules/videojs-font": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", + "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" + }, + "node_modules/videojs-vtt-thumbnails": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/videojs-vtt-thumbnails/-/videojs-vtt-thumbnails-0.0.13.tgz", + "integrity": "sha512-7VGcpTRF+ppIss/NiZcDkVOE02k/GoMltxUumQ2jaTpR1ZieYTM+dPopmTXubLxOgUP3F71uTLMZVnWEtiHjVA==", + "dependencies": { + "global": "^4.3.2", + "request": "^2.83.0", + "video.js": "^5.19.2 || ^6.6.0 || ^7.2.0" + } + }, + "node_modules/videojs-vtt-thumbnails/node_modules/@videojs/http-streaming": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.16.2.tgz", + "integrity": "sha512-etPTUdCFu7gUWc+1XcbiPr+lrhOcBu3rV5OL1M+3PDW89zskScAkkcdqYzP4pFodBPye/ydamQoTDScOnElw5A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "3.0.5", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "^0.22.1", + "mux.js": "6.0.1", + "video.js": "^6 || ^7" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "video.js": "^6 || ^7" + } + }, + "node_modules/videojs-vtt-thumbnails/node_modules/aes-decrypter": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-3.1.3.tgz", + "integrity": "sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "node_modules/videojs-vtt-thumbnails/node_modules/mpd-parser": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.22.1.tgz", + "integrity": "sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "bin": { + "mpd-to-m3u8-json": "bin/parse.js" + } + }, + "node_modules/videojs-vtt-thumbnails/node_modules/mux.js": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-6.0.1.tgz", + "integrity": "sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==", + "dependencies": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + }, + "bin": { + "muxjs-transmux": "bin/transmux.js" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + } + }, + "node_modules/videojs-vtt-thumbnails/node_modules/video.js": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.5.tgz", + "integrity": "sha512-WRq86tXZKrThA9mK+IR+v4tIQVVvnb5LhvL71fD2AX7TxVOPdaeK1X/wyuUruBqWaOG3w2sZXoMY6HF2Jlo9qA==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "2.16.2", + "@videojs/vhs-utils": "^3.0.4", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "keycode": "^2.2.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "0.22.1", + "mux.js": "6.0.1", + "safe-json-parse": "4.0.0", + "videojs-font": "3.2.0", + "videojs-vtt.js": "^0.15.5" + } + }, + "node_modules/videojs-vtt-thumbnails/node_modules/videojs-font": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", + "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" + }, + "node_modules/videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "dependencies": { + "global": "^4.3.1" + } + }, + "node_modules/videojs-wavesurfer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/videojs-wavesurfer/-/videojs-wavesurfer-3.9.0.tgz", + "integrity": "sha512-gAQUFLlAmNXW8hCQwlJRsMl98Q4LyPzd318yDmuzzWLlupBpV3b4riAguYIHLC0d3svt1pgX8Vz8cX91OaPgWQ==", + "dependencies": { + "video.js": ">=7.0.5", + "wavesurfer.js": ">=6.3.0" + } + }, + "node_modules/wavesurfer.js": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-6.6.4.tgz", + "integrity": "sha512-nBbc0pD/3FdClxKUKL1UW2V9AJPL+JOjC8T6/YF9/FCAn4uo+H6Y8VBkXo9UJXIHoBewoc7iXj3tPeL0UCJhjA==" + }, + "node_modules/waypoints": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz", + "integrity": "sha512-PbydbsTvCFYoE1DaRAKBM4xPQi+7ULcULZ7vK79NLM55da5g46oyY62Xv9X5Z9F7O/qXmcS/XJ7Ae2pYij4bpw==" + }, + "node_modules/webrtc-adapter": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-8.2.3.tgz", + "integrity": "sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==", + "dependencies": { + "sdp": "^3.2.0" + }, + "engines": { + "node": ">=6.0.0", + "npm": ">=3.10.0" + } + }, + "node_modules/webvr-polyfill": { + "version": "0.10.12", + "resolved": "https://registry.npmjs.org/webvr-polyfill/-/webvr-polyfill-0.10.12.tgz", + "integrity": "sha512-trDJEVUQnRIVAnmImjEQ0BlL1NfuWl8+eaEdu+bs4g59c7OtETi/5tFkgEFDRaWEYwHntXs/uFF3OXZuutNGGA==", + "dependencies": { + "cardboard-vr-display": "^1.0.19" + } + }, + "node_modules/webvr-polyfill-dpdb": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/webvr-polyfill-dpdb/-/webvr-polyfill-dpdb-1.0.18.tgz", + "integrity": "sha512-O0S1ZGEWyPvyZEkS2VbyV7mtir/NM9MNK3EuhbHPoJ8EHTky2pTXehjIl+IiDPr+Lldgx129QGt3NGly7rwRPw==" + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + }, + "dependencies": { + "@babel/runtime": { + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz", + "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@cbor-extract/cbor-extract-darwin-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-arm64/-/cbor-extract-darwin-arm64-2.2.0.tgz", + "integrity": "sha512-P7swiOAdF7aSi0H+tHtHtr6zrpF3aAq/W9FXx5HektRvLTM2O89xCyXF3pk7pLc7QpaY7AoaE8UowVf9QBdh3w==", + "optional": true + }, + "@cbor-extract/cbor-extract-darwin-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-darwin-x64/-/cbor-extract-darwin-x64-2.2.0.tgz", + "integrity": "sha512-1liF6fgowph0JxBbYnAS7ZlqNYLf000Qnj4KjqPNW4GViKrEql2MgZnAsExhY9LSy8dnvA4C0qHEBgPrll0z0w==", + "optional": true + }, + "@cbor-extract/cbor-extract-linux-arm": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm/-/cbor-extract-linux-arm-2.2.0.tgz", + "integrity": "sha512-QeBcBXk964zOytiedMPQNZr7sg0TNavZeuUCD6ON4vEOU/25+pLhNN6EDIKJ9VLTKaZ7K7EaAriyYQ1NQ05s/Q==", + "optional": true + }, + "@cbor-extract/cbor-extract-linux-arm64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-arm64/-/cbor-extract-linux-arm64-2.2.0.tgz", + "integrity": "sha512-rQvhNmDuhjTVXSPFLolmQ47/ydGOFXtbR7+wgkSY0bdOxCFept1hvg59uiLPT2fVDuJFuEy16EImo5tE2x3RsQ==", + "optional": true + }, + "@cbor-extract/cbor-extract-linux-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-linux-x64/-/cbor-extract-linux-x64-2.2.0.tgz", + "integrity": "sha512-cWLAWtT3kNLHSvP4RKDzSTX9o0wvQEEAj4SKvhWuOVZxiDAeQazr9A+PSiRILK1VYMLeDml89ohxCnUNQNQNCw==", + "optional": true + }, + "@cbor-extract/cbor-extract-win32-x64": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cbor-extract/cbor-extract-win32-x64/-/cbor-extract-win32-x64-2.2.0.tgz", + "integrity": "sha512-l2M+Z8DO2vbvADOBNLbbh9y5ST1RY5sqkWOg/58GkUPBYou/cuNZ68SGQ644f1CvZ8kcOxyZtw06+dxWHIoN/w==", + "optional": true + }, + "@msgpack/msgpack": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.8.0.tgz", + "integrity": "sha512-h9u4u/jiIRKbq25PM+zymTyW6bhTzELvOoUd+AvYriWOAKpLGnIamaET3pnHYoI5iYphAHBI4ayx0MehR+VVPQ==" + }, + "@peertube/p2p-media-loader-core": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@peertube/p2p-media-loader-core/-/p2p-media-loader-core-1.0.15.tgz", + "integrity": "sha512-RgUi3v4jT1+/8TEHj9NWCXVJW+p/m8fFJtcvh6FQxXZpz4u24pYbMFuM60gfboItuEA7xqo5C3XN8Y4kmOyXmw==", + "requires": { + "bittorrent-tracker": "^9.19.0", + "debug": "^4.3.4", + "events": "^3.3.0", + "sha.js": "^2.4.11", + "simple-peer": "^9.11.1" + } + }, + "@peertube/p2p-media-loader-hlsjs": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@peertube/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-1.0.15.tgz", + "integrity": "sha512-A2GkuSHqXTjVMglx5rXwsEYgopE/yCyc7lrESdOhtpSx41tWYF7Oad37jyITfb2rTYqh2Mr2/b5iFOo4EgyAbg==", + "requires": { + "@peertube/p2p-media-loader-core": "^1.0.15", + "debug": "^4.3.4", + "events": "^3.3.0", + "m3u8-parser": "^4.7.1" + } + }, + "@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "peer": true + }, + "@silvermine/videojs-quality-selector": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@silvermine/videojs-quality-selector/-/videojs-quality-selector-1.3.1.tgz", + "integrity": "sha512-uo6gs2HVG2TD0bpZAl0AT6RkDXzk9PnAxtmmW5zXexa2uJvkdFT64QvJoMlEUd2FUUwqYqqAuWGFDJdBh5+KcQ==", + "requires": { + "underscore": "1.13.1" + } + }, + "@videojs/http-streaming": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.9.1.tgz", + "integrity": "sha512-bNKlbs+b4NTyZlU3iLXj2glEHfAErjKqQryeEoDQ8FqnlFHzza7ijhMB+d/5BMrfRyiL2SvKrTDjD1CbH8QOFQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "4.0.0", + "aes-decrypter": "4.0.1", + "global": "^4.4.0", + "m3u8-parser": "^7.1.0", + "mpd-parser": "^1.3.0", + "mux.js": "7.0.2", + "video.js": "^7 || ^8" + }, + "dependencies": { + "@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + }, + "m3u8-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", + "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + }, + "dependencies": { + "@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + } + } + } + } + }, + "@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + }, + "@videojs/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", + "requires": { + "@babel/runtime": "^7.5.5", + "global": "~4.4.0", + "is-function": "^1.0.1" + } + }, + "@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "addr-to-ip-port": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/addr-to-ip-port/-/addr-to-ip-port-1.5.4.tgz", + "integrity": "sha512-ByxmJgv8vjmDcl3IDToxL2yrWFrRtFpZAToY0f46XFXl8zS081t7El5MXIodwm7RC6DhHBRoOSMLFSPKCtHukg==" + }, + "aes-decrypter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.1.tgz", + "integrity": "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "bencode": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/bencode/-/bencode-2.0.3.tgz", + "integrity": "sha512-D/vrAD4dLVX23NalHwb8dSvsUsxeRPO8Y7ToKA015JQYq69MLDOMkC0uGZYA/MPpltLO8rt8eqFC2j8DxjTZ/w==" + }, + "bittorrent-peerid": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/bittorrent-peerid/-/bittorrent-peerid-1.3.6.tgz", + "integrity": "sha512-VyLcUjVMEOdSpHaCG/7odvCdLbAB1y3l9A2V6WIje24uV7FkJPrQrH/RrlFmKxP89pFVDEnE+YlHaFujlFIZsg==" + }, + "bittorrent-tracker": { + "version": "9.19.0", + "resolved": "https://registry.npmjs.org/bittorrent-tracker/-/bittorrent-tracker-9.19.0.tgz", + "integrity": "sha512-09d0aD2b+MC+zWvWajkUAKkYMynYW4tMbTKiRSthKtJZbafzEoNQSUHyND24SoCe3ZOb2fKfa6fu2INAESL9wA==", + "requires": { + "bencode": "^2.0.1", + "bittorrent-peerid": "^1.3.3", + "bn.js": "^5.2.0", + "bufferutil": "^4.0.3", + "chrome-dgram": "^3.0.6", + "clone": "^2.0.0", + "compact2string": "^1.4.1", + "debug": "^4.1.1", + "ip": "^1.1.5", + "lru": "^3.1.0", + "minimist": "^1.2.5", + "once": "^1.4.0", + "queue-microtask": "^1.2.3", + "random-iterate": "^1.0.1", + "randombytes": "^2.1.0", + "run-parallel": "^1.2.0", + "run-series": "^1.1.9", + "simple-get": "^4.0.0", + "simple-peer": "^9.11.0", + "simple-websocket": "^9.1.0", + "socks": "^2.0.0", + "string2compact": "^1.3.0", + "unordered-array-remove": "^1.0.2", + "utf-8-validate": "^5.0.5", + "ws": "^7.4.5" + } + }, + "blueimp-canvas-to-blob": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz", + "integrity": "sha512-0pcSSGxC0QxT+yVkivxIqW0Y4VlO2XSDPofBAqoJ1qJxgH9eiUDLv50Rixij2cDuEfx4M6DpD9UGZpRhT5Q8qg==", + "optional": true + }, + "blueimp-file-upload": { + "version": "10.32.0", + "resolved": "https://registry.npmjs.org/blueimp-file-upload/-/blueimp-file-upload-10.32.0.tgz", + "integrity": "sha512-3WMJw5Cbfz94Adl1OeyH+rRpGwHiNHzja+CR6aRWPoAtwrUwvP5gXKo0XdX+sdPE+iCU63Xmba88hoHQmzY8RQ==", + "requires": { + "blueimp-canvas-to-blob": "3", + "blueimp-load-image": "5", + "blueimp-tmpl": "3" + } + }, + "blueimp-load-image": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/blueimp-load-image/-/blueimp-load-image-5.16.0.tgz", + "integrity": "sha512-3DUSVdOtlfNRk7moRZuTwDmA3NnG8KIJuLcq3c0J7/BIr6X3Vb/EpX3kUH1joxUhmoVF4uCpDfz7wHkz8pQajA==", + "optional": true + }, + "blueimp-tmpl": { + "version": "3.20.0", + "resolved": "https://registry.npmjs.org/blueimp-tmpl/-/blueimp-tmpl-3.20.0.tgz", + "integrity": "sha512-g6ln9L+VX8ZA4WA8mgKMethYH+5teroJ2uOkCvcthy9Y9d9LrQ42OAMn+r3ECKu9CB+xe9GOChlIUJBSxwkI6g==", + "optional": true + }, + "bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "bootstrap": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", + "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", + "requires": {} + }, + "bootstrap-icons": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.11.3.tgz", + "integrity": "sha512-+3lpHrCw/it2/7lBL15VR0HEumaBss0+f/Lb6ZvHISn1mlK83jjFpooTLsMWbIjJMDjDjOExMsTxnXSIT4k4ww==" + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "optional": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "cardboard-vr-display": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/cardboard-vr-display/-/cardboard-vr-display-1.0.19.tgz", + "integrity": "sha512-+MjcnWKAkb95p68elqZLDPzoiF/dGncQilLGvPBM5ZorABp/ao3lCs7nnRcYBckmuNkg1V/5rdGDKoUaCVsHzQ==", + "requires": { + "gl-preserve-state": "^1.0.0", + "nosleep.js": "^0.7.0", + "webvr-polyfill-dpdb": "^1.0.17" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "cbor-extract": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cbor-extract/-/cbor-extract-2.2.0.tgz", + "integrity": "sha512-Ig1zM66BjLfTXpNgKpvBePq271BPOvu8MR0Jl080yG7Jsl+wAZunfrwiwA+9ruzm/WEdIV5QF/bjDZTqyAIVHA==", + "optional": true, + "requires": { + "@cbor-extract/cbor-extract-darwin-arm64": "2.2.0", + "@cbor-extract/cbor-extract-darwin-x64": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm": "2.2.0", + "@cbor-extract/cbor-extract-linux-arm64": "2.2.0", + "@cbor-extract/cbor-extract-linux-x64": "2.2.0", + "@cbor-extract/cbor-extract-win32-x64": "2.2.0", + "node-gyp-build-optional-packages": "5.1.1" + } + }, + "cbor-x": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/cbor-x/-/cbor-x-1.5.4.tgz", + "integrity": "sha512-PVKILDn+Rf6MRhhcyzGXi5eizn1i0i3F8Fe6UMMxXBnWkalq9+C5+VTmlIjAYM4iF2IYF2N+zToqAfYOp+3rfw==", + "requires": { + "cbor-extract": "^2.1.1" + } + }, + "chrome-dgram": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/chrome-dgram/-/chrome-dgram-3.0.6.tgz", + "integrity": "sha512-bqBsUuaOiXiqxXt/zA/jukNJJ4oaOtc7ciwqJpZVEaaXwwxqgI2/ZdG02vXYWUhHGziDlvGMQWk0qObgJwVYKA==", + "requires": { + "inherits": "^2.0.4", + "run-series": "^1.1.9" + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compact2string": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/compact2string/-/compact2string-1.4.1.tgz", + "integrity": "sha512-3D+EY5nsRhqnOwDxveBv5T8wGo4DEvYxjDtPGmdOX+gfr5gE92c2RC0w2wa+xEefm07QuVqqcF3nZJUZ92l/og==", + "requires": { + "ipaddr.js": ">= 0.1.5" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + }, + "detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "optional": true + }, + "dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "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==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "get-browser-rtc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", + "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gl-preserve-state": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gl-preserve-state/-/gl-preserve-state-1.0.0.tgz", + "integrity": "sha512-zQZ25l3haD4hvgJZ6C9+s0ebdkW9y+7U2qxvGu1uWOJh8a4RU+jURIKEQhf8elIlFpMH6CrAY2tH0mYrRjet3Q==" + }, + "global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + } + }, + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "requires": { + "function-bind": "^1.1.2" + } + }, + "hls.js": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.4.14.tgz", + "integrity": "sha512-UppQjyvPVclg+6t2KY/Rv03h0+bA5u6zwqVoz4LAC/L0fgYmIaCD7ZCrwe8WI1Gv01be1XL0QFsRbSdIHV/Wbw==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "individual": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", + "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==" + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "requires": { + "hasown": "^2.0.0" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + }, + "is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "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==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "jqGrid": { + "version": "5.8.4", + "resolved": "https://registry.npmjs.org/jqGrid/-/jqGrid-5.8.4.tgz", + "integrity": "sha512-iamfBPJ0CWtP6OF3RFMtzcpteek2Ylo1OMo3kgmi++svo+V2Eb6l9r06Ddr4QP7zsXZuThOG3ut6JuPjycxbPw==", + "requires": { + "grunt-cli": "^1.3.2" + } + }, + "jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" + }, + "jquery-ui-dist": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/jquery-ui-dist/-/jquery-ui-dist-1.13.2.tgz", + "integrity": "sha512-oVDRd1NLtTbBwpRKAYdIRgpWVDzeBhfy7Gu0RmY6JEaZtmBq6kDn1pm5SgDiAotrnDS+RoTRXO6xvcNTxA9tOA==", + "requires": { + "jquery": ">=1.8.0 <4.0.0" + } + }, + "js-cookie": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", + "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "keycode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", + "integrity": "sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + } + }, + "lru": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lru/-/lru-3.1.0.tgz", + "integrity": "sha512-5OUtoiVIGU4VXBOshidmtOsvBIvcQR6FD/RzWSvaeHyxCGB+PCUCu+52lqMfdc0h/2CLvHhZS4TwUmMQrrMbBQ==", + "requires": { + "inherits": "^2.0.1" + } + }, + "m3u8-parser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-4.8.0.tgz", + "integrity": "sha512-UqA2a/Pw3liR6Df3gwxrqghCP17OpPlQj6RBPLYygf/ZSQ4MoSgvdvhvt35qV+3NaaA0FSZx93Ix+2brT1U7cA==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "requires": { + "dom-walk": "^0.1.0" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mpd-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.0.tgz", + "integrity": "sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^4.0.0", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + }, + "dependencies": { + "@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "mux.js": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.2.tgz", + "integrity": "sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==", + "requires": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + } + }, + "node-gyp-build": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", + "optional": true + }, + "node-gyp-build-optional-packages": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.1.1.tgz", + "integrity": "sha512-+P72GAjVAbTxjjwUmwjVrqrdZROD4nf8KgpBoDxqXXTiYZZt/ud60dE5yvCSr9lRO8e8yv6kgJIC0K0PfZFVQw==", + "optional": true, + "requires": { + "detect-libc": "^2.0.1" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "nosleep.js": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/nosleep.js/-/nosleep.js-0.7.0.tgz", + "integrity": "sha512-Z4B1HgvzR+en62ghwZf6BwAR6x4/pjezsiMcbF9KMLh7xoscpoYhaSXfY3lLkqC68AtW+/qLJ1lzvBIj0FGaTA==" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + }, + "peerjs": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/peerjs/-/peerjs-1.5.2.tgz", + "integrity": "sha512-pPrtNwPyWJHRPxy2y+rHcdlrG8UwUBB1nl+3Yj6r7FLwcbBpcB2NvGNvLvcrxAVGGGX9fsdA5VT5zBKTZcm1DQ==", + "requires": { + "@msgpack/msgpack": "^2.8.0", + "cbor-x": "1.5.4", + "eventemitter3": "^4.0.7", + "peerjs-js-binarypack": "^2.1.0", + "webrtc-adapter": "^8.0.0" + } + }, + "peerjs-js-binarypack": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/peerjs-js-binarypack/-/peerjs-js-binarypack-2.1.0.tgz", + "integrity": "sha512-YIwCC+pTzp3Bi8jPI9UFKO0t0SLo6xALnHkiNt/iUFmUUZG0fEEmEyFKvjsDKweiFitzHRyhuh6NvyJZ4nNxMg==" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pkcs7": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz", + "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", + "requires": { + "@babel/runtime": "^7.5.5" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==" + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "random-iterate": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/random-iterate/-/random-iterate-1.0.1.tgz", + "integrity": "sha512-Jdsdnezu913Ot8qgKgSgs63XkAjEsnMcS1z+cC6D6TNXsUXsMxy0RpclF2pzGZTEiTXL9BiArdGTEexcv4nqcA==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "requires": { + "resolve": "^1.9.0" + } + }, + "regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "requires": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-series": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-series/-/run-series-1.1.9.tgz", + "integrity": "sha512-Arc4hUN896vjkqCYrUXquBFtRZdv1PfLbTYP71efP6butxyQ0kWpiNJyAgsxscmQg1cqvHY32/UCBzXedTpU2g==" + }, + "rust-result": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", + "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", + "requires": { + "individual": "^2.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-json-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", + "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", + "requires": { + "rust-result": "^1.0.0" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sdp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/sdp/-/sdp-3.2.0.tgz", + "integrity": "sha512-d7wDPgDV3DDiqulJjKiV2865wKsJ34YI+NDREbm+FySq6WuKOikwyNQcm+doLAZ1O6ltdO0SeKle2xMpN3Brgw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "simple-peer": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", + "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", + "requires": { + "buffer": "^6.0.3", + "debug": "^4.3.2", + "err-code": "^3.0.1", + "get-browser-rtc": "^1.1.0", + "queue-microtask": "^1.2.3", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0" + } + }, + "simple-websocket": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/simple-websocket/-/simple-websocket-9.1.0.tgz", + "integrity": "sha512-8MJPnjRN6A8UCp1I+H/dSFyjwJhp6wta4hsVRhjf8w9qBHRzxYt14RaOcjvQnhD1N4yKOddEjflwMnQM4VtXjQ==", + "requires": { + "debug": "^4.3.1", + "queue-microtask": "^1.2.2", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0", + "ws": "^7.4.2" + } + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + } + } + }, + "spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + }, + "sshpk": { + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + } + }, + "string2compact": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/string2compact/-/string2compact-1.3.2.tgz", + "integrity": "sha512-3XUxUgwhj7Eqh2djae35QHZZT4mN3fsO7kagZhSGmhhlrQagVvWSFuuFIWnpxFS0CdTB2PlQcaL16RDi14I8uw==", + "requires": { + "addr-to-ip-port": "^1.0.1", + "ipaddr.js": "^2.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "three": { + "version": "0.125.2", + "resolved": "https://registry.npmjs.org/three/-/three-0.125.2.tgz", + "integrity": "sha512-7rIRO23jVKWcAPFdW/HREU2NZMGWPBZ4XwEMt0Ak0jwLUKVJhcKM55eCBWyGZq/KiQbeo1IeuAoo/9l2dzhTXA==" + }, + "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==", + "requires": { + "is-number": "^7.0.0" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + }, + "underscore": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.1.tgz", + "integrity": "sha512-hzSoAVtJF+3ZtiFX0VgfFPHEDRm7Y/QPjGyNo4TVdnDTdft3tr8hEkD25a1jC+TjTuE7tkHGKkhwCgs9dgBB2g==" + }, + "unordered-array-remove": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unordered-array-remove/-/unordered-array-remove-1.0.2.tgz", + "integrity": "sha512-45YsfD6svkgaCBNyvD+dFHm4qFX9g3wRSIVgWVPtm2OCnphvPxzJoe20ATsiNpNJrmzHifnxm+BN5F7gFT/4gw==" + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-toolkit": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", + "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" + }, + "utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "optional": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "video.js": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.9.0.tgz", + "integrity": "sha512-zkDymz4aCGSdPgOoG48W+UqoYU/JYXIr78HLWkjkXvIs0rrvx0hay3w+X9/OzWNM0/5M75somsdxrvQGr/U1TA==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "3.9.1", + "@videojs/vhs-utils": "^4.0.0", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "^4.0.1", + "global": "4.4.0", + "keycode": "2.2.0", + "m3u8-parser": "^7.1.0", + "mpd-parser": "^1.2.2", + "mux.js": "^7.0.1", + "safe-json-parse": "4.0.0", + "videojs-contrib-quality-levels": "4.0.0", + "videojs-font": "4.1.0", + "videojs-vtt.js": "0.15.5" + }, + "dependencies": { + "@videojs/vhs-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", + "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + }, + "m3u8-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", + "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0" + }, + "dependencies": { + "@videojs/vhs-utils": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", + "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", + "requires": { + "@babel/runtime": "^7.12.5", + "global": "^4.4.0", + "url-toolkit": "^2.2.1" + } + } + } + } + } + }, + "videojs-contrib-quality-levels": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz", + "integrity": "sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==", + "requires": { + "global": "^4.4.0" + } + }, + "videojs-font": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.1.0.tgz", + "integrity": "sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==" + }, + "videojs-overlay": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/videojs-overlay/-/videojs-overlay-3.1.0.tgz", + "integrity": "sha512-P863Z4ghWgf7Z4A4uzmHlqIixRb8v5220JuQ4pfb/uorbWSBCt5D+czrp/eTxXXLtSmrSUKn596QswVYZuMzPg==", + "requires": { + "global": "^4.3.2", + "video.js": "^6 || ^7 || ^8" + } + }, + "videojs-quality-selector-hls": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/videojs-quality-selector-hls/-/videojs-quality-selector-hls-1.1.1.tgz", + "integrity": "sha512-GR7Bs/pL4nioq+jlSASqy4nUlnnmY7NnjXY6vBPlmBJA7OuYD80ceyejuCbNeaXX7cC11WOtKTeC8QBJcKuMtA==", + "requires": { + "global": "^4.4.0", + "video.js": "^8.3.0", + "videojs-contrib-quality-levels": "^4.0.0" + } + }, + "videojs-vr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/videojs-vr/-/videojs-vr-2.0.0.tgz", + "integrity": "sha512-ix4iN8XHaDSEe89Jqybj9DuLKYuK33EIzcSI0IEdnv1KJuH8bd0PYlQEgqIZTOmWruFpW/+rjYFCVUQ9PTypJw==", + "requires": { + "@babel/runtime": "^7.14.5", + "global": "^4.4.0", + "three": "0.125.2", + "video.js": "^6 || ^7", + "webvr-polyfill": "0.10.12" + }, + "dependencies": { + "@videojs/http-streaming": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.16.2.tgz", + "integrity": "sha512-etPTUdCFu7gUWc+1XcbiPr+lrhOcBu3rV5OL1M+3PDW89zskScAkkcdqYzP4pFodBPye/ydamQoTDScOnElw5A==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "3.0.5", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "^0.22.1", + "mux.js": "6.0.1", + "video.js": "^6 || ^7" + } + }, + "aes-decrypter": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-3.1.3.tgz", + "integrity": "sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "mpd-parser": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.22.1.tgz", + "integrity": "sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + } + }, + "mux.js": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-6.0.1.tgz", + "integrity": "sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==", + "requires": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + } + }, + "video.js": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.5.tgz", + "integrity": "sha512-WRq86tXZKrThA9mK+IR+v4tIQVVvnb5LhvL71fD2AX7TxVOPdaeK1X/wyuUruBqWaOG3w2sZXoMY6HF2Jlo9qA==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "2.16.2", + "@videojs/vhs-utils": "^3.0.4", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "keycode": "^2.2.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "0.22.1", + "mux.js": "6.0.1", + "safe-json-parse": "4.0.0", + "videojs-font": "3.2.0", + "videojs-vtt.js": "^0.15.5" + } + }, + "videojs-font": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", + "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" + } + } + }, + "videojs-vtt-thumbnails": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/videojs-vtt-thumbnails/-/videojs-vtt-thumbnails-0.0.13.tgz", + "integrity": "sha512-7VGcpTRF+ppIss/NiZcDkVOE02k/GoMltxUumQ2jaTpR1ZieYTM+dPopmTXubLxOgUP3F71uTLMZVnWEtiHjVA==", + "requires": { + "global": "^4.3.2", + "request": "^2.83.0", + "video.js": "^5.19.2 || ^6.6.0 || ^7.2.0" + }, + "dependencies": { + "@videojs/http-streaming": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-2.16.2.tgz", + "integrity": "sha512-etPTUdCFu7gUWc+1XcbiPr+lrhOcBu3rV5OL1M+3PDW89zskScAkkcdqYzP4pFodBPye/ydamQoTDScOnElw5A==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "3.0.5", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "^0.22.1", + "mux.js": "6.0.1", + "video.js": "^6 || ^7" + } + }, + "aes-decrypter": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-3.1.3.tgz", + "integrity": "sha512-VkG9g4BbhMBy+N5/XodDeV6F02chEk9IpgRTq/0bS80y4dzy79VH2Gtms02VXomf3HmyRe3yyJYkJ990ns+d6A==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "global": "^4.4.0", + "pkcs7": "^1.0.4" + } + }, + "mpd-parser": { + "version": "0.22.1", + "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-0.22.1.tgz", + "integrity": "sha512-fwBebvpyPUU8bOzvhX0VQZgSohncbgYwUyJJoTSNpmy7ccD2ryiCvM7oRkn/xQH5cv73/xU7rJSNCLjdGFor0Q==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/vhs-utils": "^3.0.5", + "@xmldom/xmldom": "^0.8.3", + "global": "^4.4.0" + } + }, + "mux.js": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-6.0.1.tgz", + "integrity": "sha512-22CHb59rH8pWGcPGW5Og7JngJ9s+z4XuSlYvnxhLuc58cA1WqGDQPzuG8I+sPm1/p0CdgpzVTaKW408k5DNn8w==", + "requires": { + "@babel/runtime": "^7.11.2", + "global": "^4.4.0" + } + }, + "video.js": { + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/video.js/-/video.js-7.21.5.tgz", + "integrity": "sha512-WRq86tXZKrThA9mK+IR+v4tIQVVvnb5LhvL71fD2AX7TxVOPdaeK1X/wyuUruBqWaOG3w2sZXoMY6HF2Jlo9qA==", + "requires": { + "@babel/runtime": "^7.12.5", + "@videojs/http-streaming": "2.16.2", + "@videojs/vhs-utils": "^3.0.4", + "@videojs/xhr": "2.6.0", + "aes-decrypter": "3.1.3", + "global": "^4.4.0", + "keycode": "^2.2.0", + "m3u8-parser": "4.8.0", + "mpd-parser": "0.22.1", + "mux.js": "6.0.1", + "safe-json-parse": "4.0.0", + "videojs-font": "3.2.0", + "videojs-vtt.js": "^0.15.5" + } + }, + "videojs-font": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-3.2.0.tgz", + "integrity": "sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==" + } + } + }, + "videojs-vtt.js": { + "version": "0.15.5", + "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", + "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", + "requires": { + "global": "^4.3.1" + } + }, + "videojs-wavesurfer": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/videojs-wavesurfer/-/videojs-wavesurfer-3.9.0.tgz", + "integrity": "sha512-gAQUFLlAmNXW8hCQwlJRsMl98Q4LyPzd318yDmuzzWLlupBpV3b4riAguYIHLC0d3svt1pgX8Vz8cX91OaPgWQ==", + "requires": { + "video.js": ">=7.0.5", + "wavesurfer.js": ">=6.3.0" + } + }, + "wavesurfer.js": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-6.6.4.tgz", + "integrity": "sha512-nBbc0pD/3FdClxKUKL1UW2V9AJPL+JOjC8T6/YF9/FCAn4uo+H6Y8VBkXo9UJXIHoBewoc7iXj3tPeL0UCJhjA==" + }, + "waypoints": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz", + "integrity": "sha512-PbydbsTvCFYoE1DaRAKBM4xPQi+7ULcULZ7vK79NLM55da5g46oyY62Xv9X5Z9F7O/qXmcS/XJ7Ae2pYij4bpw==" + }, + "webrtc-adapter": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/webrtc-adapter/-/webrtc-adapter-8.2.3.tgz", + "integrity": "sha512-gnmRz++suzmvxtp3ehQts6s2JtAGPuDPjA1F3a9ckNpG1kYdYuHWYpazoAnL9FS5/B21tKlhkorbdCXat0+4xQ==", + "requires": { + "sdp": "^3.2.0" + } + }, + "webvr-polyfill": { + "version": "0.10.12", + "resolved": "https://registry.npmjs.org/webvr-polyfill/-/webvr-polyfill-0.10.12.tgz", + "integrity": "sha512-trDJEVUQnRIVAnmImjEQ0BlL1NfuWl8+eaEdu+bs4g59c7OtETi/5tFkgEFDRaWEYwHntXs/uFF3OXZuutNGGA==", + "requires": { + "cardboard-vr-display": "^1.0.19" + } + }, + "webvr-polyfill-dpdb": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/webvr-polyfill-dpdb/-/webvr-polyfill-dpdb-1.0.18.tgz", + "integrity": "sha512-O0S1ZGEWyPvyZEkS2VbyV7mtir/NM9MNK3EuhbHPoJ8EHTky2pTXehjIl+IiDPr+Lldgx129QGt3NGly7rwRPw==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + } + } +} diff --git a/pod/package.json b/pod/package.json index 5ec9f1d0cf..5108951c15 100644 --- a/pod/package.json +++ b/pod/package.json @@ -1,21 +1,22 @@ { "license": "LGPL-3.0", "dependencies": { + "@peertube/p2p-media-loader-core": "^1.0.14", + "@peertube/p2p-media-loader-hlsjs": "^1.0.14", "@silvermine/videojs-quality-selector": "^1.3.0", "blueimp-file-upload": "^10.32.0", "bootstrap": "^5.3.2", "bootstrap-icons": "^1.10.5", "dayjs": "^1.11.8", + "hls.js": "^1.4.12", "jqGrid": "^5.8.2", "jquery": "^3.7.0", "jquery-ui-dist": "^1.13.2", "js-cookie": "^3.0.5", "spark-md5": "^3.0.2", - "video.js": "7.20.3", - "videojs-contrib-quality-levels": "^3.0.0", - "videojs-hls-quality-selector": "^1.1.4", + "video.js": "^8.5.2", "videojs-overlay": "^3.1.0", - "videojs-seek-buttons": "latest7", + "videojs-quality-selector-hls": "^1.1.1", "videojs-vr": "^2.0.0", "videojs-vtt-thumbnails": "^0.0.13", "videojs-wavesurfer": "^3.9.0", diff --git a/pod/peer_to_peer/__init__.py b/pod/peer_to_peer/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/pod/peer_to_peer/admin.py b/pod/peer_to_peer/admin.py new file mode 100644 index 0000000000..8c38f3f3da --- /dev/null +++ b/pod/peer_to_peer/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/pod/peer_to_peer/apps.py b/pod/peer_to_peer/apps.py new file mode 100644 index 0000000000..fa46023cf1 --- /dev/null +++ b/pod/peer_to_peer/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig +from django.utils.translation import gettext_lazy as _ + + +class PeerToPeerConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'pod.peer_to_peer' + verbose_name = _("Peer to peer") diff --git a/pod/peer_to_peer/context_processors.py b/pod/peer_to_peer/context_processors.py new file mode 100644 index 0000000000..8bd126a43e --- /dev/null +++ b/pod/peer_to_peer/context_processors.py @@ -0,0 +1,9 @@ +from django.conf import settings as django_settings + +USE_PEER_TO_PEER = getattr(django_settings, "USE_PEER_TO_PEER", True) + +def context_settings(request): + """Return all context settings for playlist app""" + new_settings = {} + new_settings["USE_PEER_TO_PEER"] = USE_PEER_TO_PEER + return new_settings \ No newline at end of file diff --git a/pod/peer_to_peer/models.py b/pod/peer_to_peer/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/pod/peer_to_peer/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/pod/peer_to_peer/static/peer_to_peer/js/p2p-script.js b/pod/peer_to_peer/static/peer_to_peer/js/p2p-script.js new file mode 100644 index 0000000000..ef3fbcfa1e --- /dev/null +++ b/pod/peer_to_peer/static/peer_to_peer/js/p2p-script.js @@ -0,0 +1,430 @@ +console.log("P2P SCRIPT LOADED"); + +console.log("player", player); + +/** + * Number of connections established. + * @type {number} + * @default 0 + */ +let numberOfConnections = 0; + +/** + * Current index in the list of peer identifiers. + * @type {number} + * @default 0 + */ +let currentIndex = 0; + +/** + * Video identifier for the current session. + * @type {string} + * @default string // TODO Set true ID + */ +let videoSlug = "47858-rabbit-and-others"; + +/** + * List of URLs related to the video. + * @type {Array} + * @default [] + */ +let urlList = []; + +/** + * Cache for storing core data associated with URLs. + * @type {Object} + * @default {} + */ +let coreCache = []; + +/** + * Peer object for peer-to-peer communication. + * @type {Peer} + * @default undefined // TODO Update this ? + */ +let peer; + +/** + * Flag indicating whether it's the first time performing an action. + * @type {boolean} + * @default false + */ +let firstTime = false; + +/** + * The connected identifier. + * @type {string} + * @default "" + */ +let connectedId = ""; + +/** + * Connection to any peer. + * + * @async + * + * @returns {Promise} - A promise that resolves when the connection is successful. + */ +async function connectToAnyPeers() { + const functionName = "connectToAnyPeers()"; + try { + const idList = await getIds(); + console.log(`[p2p-script.js] [${functionName}] idList:`, idList); + await connectToNextPeer(idList); + console.log(`[p2p-script.js] [${functionName}] No successful connection TODO Update this`); // TODO Update this + // location.reload(); + } catch (err) { + console.error( + `[p2p-script.js] [${functionName}] An error occurred: ${err}`, + ); + } +} + +/** + * Attempts to connect to the next peer in the list. + * If the connection is unsuccessful, the function is called again with the next peer in the list. + * + * @async + * + * @param idList - The list of peer identifiers. + * @param index - The index of the current peer identifier. + * + * @returns {Promise} - A promise that resolves when the connection is successful. + */ +async function connectToNextPeer(idList, index = 0) { + const functionName = "connectToNextPeer()"; + if (index >= idList.length) { + return; + } + const peerId = idList[index]; + + if (peerId !== peer.id) { + console.log( + `[p2p-script.js] [${functionName}] Attempting to connect to peer: ${peerId}`, + ); + + const conn = peer.connect(peerId); + conn.on("open", () => { + console.log( + `[p2p-script.js] [${functionName}] Connection to peer successful: ${peerId}`, + ); + }); + + conn.on("error", (err) => { + console.error( + `[p2p-script.js] [${functionName}] Connection error: ${err}`, + ); + connectToNextPeer(idList, index + 1); + }); + } + currentIndex++; +} + +/** + * Removes a peer from the cache. + * + * @param {string} idPeer - The peer identifier with format: {videoSlug}_ID_{peerUuid}. + * + * @returns {void} + */ +function removePeerFromCache(idPeer) { + console.log("[p2p-script.js] [removePeerFromCache] idPeer:", idPeer); + fetch(`http://localhost:9090/peer-to-peer/clear-invalid-peer/`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + }, + body: JSON.stringify({ peer_id: idPeer }), + }) + .then((response) => response.json()) + .then((response) => { + console.log("[p2p-script.js] [removePeerFromCache] response:", response); + }) + .catch((err) => console.error(err)); +} + +/** + * Extracts the peer identifier from an error message. + * + * @param {string} err - The error message returned by the Peer object. + * + * @returns {string} - The peer identifier. + */ +function extractPeerIdFromError(err) { + const match = err.message.match(/Could not connect to peer (\S+)/); + return match ? match[1] : null; +} + +/** + * Establishes a peer-to-peer connection using the provided options. + * + * @async + * + * @param {Object} options - Configuration options for the Peer object. + * + * @returns {void} - A promise that resolves when the connection is successful. + */ +async function startConnect(options) { + console.log("[p2p-script.js] startConnect()"); + let uuid = crypto.randomUUID(); + let peerId = `${videoSlug}_ID_${uuid}`; + peer = new Peer(peerId, options); + console.log("Peer:", peer); + + const idList = await getIds(); + console.log("idList", idList); + console.log("[p2p-script.js] [startConnect()] idList.length:", idList.length); + if (idList.length <= 0) { + console.log( + "[p2p-script.js] [startConnect()] CDN connection | Cause: idList.length <= 1", + ); + // TODO Make CDN live function and call this here + } else { + connectToAnyPeers(); + } + + peer.on("connection", function (conn) { + console.log("CONNECTION"); + conn.on("data", function (data) { + console.log(data); + }); + }); + + peer.on("error", function (err) { + const peerId = extractPeerIdFromError(err); + if (peerId) { + fetch("/peer-to-peer/clear-invalid-peer/", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ peer_id: peerId }), + }) + .then((response) => { + console.log(response); + if (!response.ok) { + throw new Error("Error while clearing invalid peer"); + } + return response.json(); + }) + .then((data) => { + console.log(data.message); + }) + .catch((error) => { + console.error( + "Error during the request to clear invalid peer", + error, + ); + }); + } + connectToNextPeer(idList, currentIndex); + }); +} + +/** + * Retrieves peer identifiers associated with the current video. + * + * @async + * + * @returns {Array} - A list of peer identifiers. + */ +async function getIds() { + console.log("[p2p-script.js] getIds()"); + let idList = []; + let postData = { + url: videoSlug, + }; + // console.log('[p2p-script.js] postData:', postData); + await fetch("/peer-to-peer/get-ids/", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(postData), + }) + .then((response) => response.json()) + .then((response) => { + idList = [].concat(response); + }) + .catch((err) => console.error(err)); + return idList; +} + +/** + * Stores URLs associated with the current peer's ID on the server. + * + * @async + * + * @returns {void} + */ +async function storeUrlsId() { + console.log("[p2p-script.js] storeUrlsId()"); + let fetch_status; + let postData = {}; + for (let i = 0; i < urlList.length; i++) { + postData[urlList[i]] = 1; + } + // console.log('[p2p-script.js] postData:', postData); + // console.log('[p2p-script.js] JSON.stringify(postData):', JSON.stringify(postData)); + fetch(`/peer-to-peer/store/${peer.id}/`, { + method: "POST", + headers: { + Accept: "application/json", + "Content-Type": "application/json", + // TODO Add CSRF cookie + }, + body: JSON.stringify(postData), + }) + .then(function (response) { + fetch_status = response.status; + // console.log("JSON", response); + return response.json(); + }) + .then(function (json) { + // console.log("FETCH-STATUS:", fetch_status); + if (fetch_status === 200) { + // console.log(json); + } + }) + .catch(function (error) { + console.log(error); + }); +} + +// TODO Call the function + + +/** + * Initializes peer-to-peer communication. + * + * @returns {void} + */ +function initP2p() { + console.log("[p2p-script.js] initP2p()"); + + /** + * Sets up event hooks and overrides XHR behavior when the 'xhr-hooks-ready' event is triggered on the video player. + * @listens player#xhr-hooks-ready + * @returns {void} + */ + player.on("xhr-hooks-ready", () => { + console.log("[p2p-script.js] xhr-hooks-ready event"); + + /** + * Handles the response hook for XHR requests. + * @param {Object} request - The XHR request object. + * @param {Object} error - The XHR error object. + * @param {Object} response - The XHR response object. + */ + const playerOnResponseHook = (request, error, response) => { + // console.log('[p2p-script.js] Inside playerOnResponseHook'); + // console.log('[p2p-script.js] content_type:', content_type); + // console.log('[p2p-script.js] request: ', request); + // console.log('[p2p-script.js] response: ', response); + // if (content_type.includes(response.headers['content-type'])) { + // console.log('[p2p-script.js] Condition met'); + urlList.push(peer.id); + coreCache[`${response.url}_ID_${peer.id}`] = response; + if (urlList.length > 10) { + delete coreCache[urlList[0]]; + urlList.splice(0, 1); + } + storeUrlsId(); + // } + }; + + /** + * Handles the request hook for XHR requests. + * @param {Object} options - The XHR options object. + * @returns {Object} - Modified XHR options object. + */ + const playerOnRequestHook = (options) => { + let headers = options["headers"]; + if (headers && headers["Range"]) { + let add = "?"; + if (options.uri.indexOf("?") > -1) add = "&"; + options.uri = options.uri + add + headers["Range"]; + } + return options; + }; + + console.log("[p2p-script.js] player.tech().vhs.xhr:", player.tech().vhs.xhr); + + /** + * Overrides the XHR behavior on the video player. + * @param {string|Object} urlC - The URL or XHR options. + * @param {Function} callback - The XHR callback function. + * @returns {Object} - XHR result. + */ + player.tech().vhs.xhr = function (urlC, callback) { + let url = ""; + // console.log('[p2p-script.js] player.tech().vhs.xhr'); + if (typeof urlC === "object") { + url = urlC.uri; + // console.log('[p2p-script.js] url:', url); + // console.log('[p2p-script.js] urlC:', urlC); + // console.log('[p2p-script.js] urlC.responseType:', urlC.responseType); + if (urlC.responseType === "arraybuffer") { + firstTime = true; + if (nbLog < 10) { + console.log("urlC", urlC); + nbLog++; + } + let ids = []; // TODO Go the search ID in the server + if (ids.length > 0) { + // console.log('youpi'); + } + videojs.Vhs.xhr.onResponse(playerOnResponseHook); + return videojs.Vhs.xhr(urlC, callback); + } else if (!firstTime) { + firstTime = true; + url = urlC.url; + videojs.Vhs.xhr.onResponse(playerOnResponseHook); + return videojs.Vhs.xhr(urlC, callback); + } + // } else { + // url = urlC.url; + // videojs.Vhs.xhr.onResponse(playerOnResponseHook); + // return videojs.Vhs.xhr(urlC, callback); + // } + } else { + url = urlC; + videojs.Vhs.xhr.onResponse(playerOnResponseHook); + return videojs.Vhs.xhr(urlC, callback); + } + }; + + player.tech().vhs.xhr.beforeRequest = function (options) { + console.log("HLS Request:", options); + return options; + }; + + console.log("[p2p-script.js>initP2p()] startConnect"); + }); +} + +if (player.tech() && player.tech().vhs) { + console.log("[p2p-script.js] player.tech().vhs:", player.tech().vhs); + initP2p(); + startConnect({ + host: "134.206.5.156", + port: "9000", + path: "/", + key: "peerjs", + debug: 3, + }); +} else { + console.log("[p2p-script.js] player.tech().vhs not ready"); + player.one("loadedmetadata", () => { + console.log("[p2p-script.js] loadedmetadata event"); + initP2p(); + startConnect({ + host: "134.206.5.156", + port: "9000", + path: "/", + key: "peerjs", + debug: 3, + }); + }); +} diff --git a/pod/peer_to_peer/static/peer_to_peer/js/p2p.js b/pod/peer_to_peer/static/peer_to_peer/js/p2p.js new file mode 100644 index 0000000000..f6ebbfd10a --- /dev/null +++ b/pod/peer_to_peer/static/peer_to_peer/js/p2p.js @@ -0,0 +1,80 @@ +class P2p { + + /** + * Video identifier for the current session. + * + * @type {string} + * + * @default undefined + */ + videoSlug; + + + + /** + * List of URLs related to the video. + * + * @type {Array} + * + * @default [] + */ + urlList = []; + + + + /** + * Peer object for peer-to-peer communication. + * + * @type {Peer} + * + * @default undefined // TODO Update this ? + */ + peer; + + + + /** + * Flag indicating whether it's the first time performing an action. + * + * @type {boolean} + * + * @default false + */ + firstTime = false; + + + + constructor(videoSlug) { + this.videoSlug = videoSlug; + } + + + + /** + * Retrieves peer identifiers associated with the current video. + * @async + * @returns {Array} - A list of peer identifiers. + */ + async getIds() { + let idList = []; + let postData = { + 'url': this.videoSlug, + }; + await fetch('http://localhost:9090/peer-to-peer/get-ids/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(postData), + }).then(response => response.json()) + .then(response => { + idList = [].concat(response); + }) + .catch(err => console.error(err)); + return idList; + } + + + + // TODO Add the other functions +} \ No newline at end of file diff --git a/pod/peer_to_peer/templates/peer_to_peer/test.html b/pod/peer_to_peer/templates/peer_to_peer/test.html new file mode 100644 index 0000000000..542179c9ca --- /dev/null +++ b/pod/peer_to_peer/templates/peer_to_peer/test.html @@ -0,0 +1,33 @@ +{% load static %} + + + + + + Document + + + + + + + + + + + diff --git a/pod/peer_to_peer/tests.py b/pod/peer_to_peer/tests.py new file mode 100644 index 0000000000..7ce503c2dd --- /dev/null +++ b/pod/peer_to_peer/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/pod/peer_to_peer/urls.py b/pod/peer_to_peer/urls.py new file mode 100644 index 0000000000..5bbfdec14a --- /dev/null +++ b/pod/peer_to_peer/urls.py @@ -0,0 +1,19 @@ +from django.urls import path + +from .views import ( + get_csrf_token, + get_ids_by_urls, + store_urls_id, + test, + clear_invalid_peer_in_caches, +) + +app_name = "peer_to_peer" + +urlpatterns = [ + path("get-ids/", get_ids_by_urls, name="get-ids-by-urls"), + path("store//", store_urls_id, name="store-urls-id"), + path("get-csrf/", get_csrf_token, name="get-csrf"), + path("test/", test, name="test"), + path("clear-invalid-peer/", clear_invalid_peer_in_caches, name="clear-invalid-peer") +] diff --git a/pod/peer_to_peer/views.py b/pod/peer_to_peer/views.py new file mode 100644 index 0000000000..6965117afb --- /dev/null +++ b/pod/peer_to_peer/views.py @@ -0,0 +1,76 @@ +from django.http import JsonResponse +from django.http import HttpResponseForbidden +from django.core.cache import cache +from django.middleware.csrf import get_token +from django.shortcuts import render +from django.views.decorators.csrf import ( + csrf_exempt, +) +from django.utils.translation import ugettext_lazy as _ + +import json +# ou cache dedié ? +# from django.core.cache import caches +# cache = caches['video_p2p'] +# keys format : _ID_ + + +@csrf_exempt # TODO Add csrf cookie +def store_urls_id(request, id): # TODO Add documentation + uuid = id.split("_ID_")[-1] + cache.delete_pattern("*_ID_%s" % uuid) + if request.body: + body_unicode = request.body.decode('utf-8') + body = json.loads(body_unicode) + expiration_time = 12 * 60 * 60 # 12 hours + cache.set_many(body, timeout=expiration_time) + return JsonResponse(body) + return HttpResponseForbidden(_("You must provide data to store")) + + +# @csrf_protect +# @ensure_csrf_cookie +@csrf_exempt # TODO Add csrf cookie +def get_ids_by_urls(request): # TODO Add documentation + if request.body: + body_unicode = request.body.decode('utf-8') + body = json.loads(body_unicode) + all_keys = cache.keys("*") + + # Afficher le contenu associé à chaque clé + for key in all_keys: + value = cache.get(key) + print(f"Key: {key}, Value: {value}") + + all_keys = cache.keys("%s*" % body["url"]) + print("all_keys : ", all_keys) + response = JsonResponse(all_keys, safe=False) + return response + return HttpResponseForbidden(_("You must provide url to get keys")) + + +def get_csrf_token(request): + print(get_token(request)) + return JsonResponse({"csrf_token": get_token(request)}) + + +def test(request): + return render(request, "peer_to_peer/test.html") + + +@csrf_exempt +def clear_invalid_peer_in_caches(request): + if request.method == "POST": + try: + data = json.loads(request.body) + peer_id = data["peer_id"] + + if peer_id: + cache.delete(peer_id) + return JsonResponse({"message": "Peer deleted from cache", "deleted_peer": peer_id}, status=200) + else: + return JsonResponse({"message": "No peer_id provided"}, status=400) + except Exception as e: + return JsonResponse({"message": "Error while deleting peer from cache"}, status=500) + else: + return JsonResponse({"message": "Only POST method is allowed"}, status=405) diff --git a/pod/settings.py b/pod/settings.py index bb1a0447f3..c08bd9f359 100644 --- a/pod/settings.py +++ b/pod/settings.py @@ -67,6 +67,7 @@ "pod.video_encode_transcript", "pod.import_video", "pod.progressive_web_app", + "pod.peer_to_peer", "pod.custom", ] diff --git a/pod/urls.py b/pod/urls.py index 0c1ce88d3b..517d6a57ca 100644 --- a/pod/urls.py +++ b/pod/urls.py @@ -149,6 +149,12 @@ path("playlist/", include("pod.playlist.urls", namespace="playlist")), ] +# PEER_TO_PEER +if getattr(settings, "USE_PEER_TO_PEER", True): + urlpatterns += [ + path("peer-to-peer/", include("pod.peer_to_peer.urls", namespace="peer_to_peer")), + ] + # IMPORT_VIDEO if getattr(settings, "USE_IMPORT_VIDEO", True): urlpatterns += [ diff --git a/pod/video/static/js/hls-plugin.js b/pod/video/static/js/hls-plugin.js new file mode 100644 index 0000000000..c79bfb188f --- /dev/null +++ b/pod/video/static/js/hls-plugin.js @@ -0,0 +1,653 @@ +/** + * @file Esup-Pod functions for hls plugin, + * @since 3.5.0 + */ + +// Thanks https://github.com/streamroot/videojs-hlsjs-plugin +// We duplicated this plugin to choose the hls.js version we want, because streamroot only provide a bundled file + +import "/static/hls.js/dist/hls.js"; +import "/static/video.js/dist/video.min.js"; + +let alreadyRegistered = false; + +/** + * Registers an Hls.js source handler for HTML5 video playback in Video.js. + * + * @function registerSourceHandler + * @param {Object} vjs - The Video.js library object. + * @throws {Error} Throws an error if Hls.js is not supported in the browser or if the "Html5" tech is not found in Video.js. + * @returns {void} + */ +const registerSourceHandler = function (vjs) { + if (!Hls.isSupported()) { + console.log("Hls.js is not supported in this browser."); + return; + } + + const html5 = vjs.getTech("Html5"); + + if (!html5) { + console.error('No "Html5" tech found in videojs'); + return; + } + + if (alreadyRegistered) return; + + alreadyRegistered = true; + + // FIXME: typings + html5.registerSourceHandler( + { + /** + * Determines if the source can be handled by Hls.js. + * + * @param {Object} source - The video source object. + * @returns {string} - Returns "probably" if the source type or extension indicates Hls.js support, otherwise returns an empty string. + */ + canHandleSource: function (source) { + const hlsTypeRE = + /^application\/x-mpegURL|application\/vnd\.apple\.mpegurl$/i; + const hlsExtRE = /\.m3u8/i; + + if (hlsTypeRE.test(source.type)) return "probably"; + if (hlsExtRE.test(source.src)) return "maybe"; + + return ""; + }, + + /** + * Handles the given video source by disposing of any existing Hls.js provider and creating a new one. + * + * @param {Object} source - The video source object. + * @param {Object} tech - The Video.js tech object. + * @returns {Object} - Returns the new Hls.js provider. + */ + handleSource: function (source, tech) { + if (tech.hlsProvider) { + tech.hlsProvider.dispose(); + } + + tech.hlsProvider = new Html5Hlsjs(vjs, source, tech); + + return tech.hlsProvider; + }, + }, + 0, + ); + + // FIXME: typings + vjs.Html5Hlsjs = Html5Hlsjs; +}; + +// --------------------------------------------------------------------------- +// HLS options plugin +// --------------------------------------------------------------------------- + +const Plugin = videojs.getPlugin("plugin"); + +/** + * HLSJSConfigHandler plugin for Video.js. + * + * @class HLSJSConfigHandler + * @extends {Plugin} + */ +class HLSJSConfigHandler extends Plugin { + /** + * Constructor for HLSJSConfigHandler plugin. + * + * @param {Player} player - The Video.js player instance. + * @param {Object} options - Configuration options for the HLSJSConfigHandler plugin. + */ + constructor(player, options) { + super(player, options); + + if (!options) return; + + if (!player.srOptions_) { + player.srOptions_ = {}; + } + + if (!player.srOptions_.hlsjsConfig) { + player.srOptions_.hlsjsConfig = options.hlsjsConfig; + } + + if (options.levelLabelHandler && !player.srOptions_.levelLabelHandler) { + player.srOptions_.levelLabelHandler = options.levelLabelHandler; + } + + registerSourceHandler(videojs); + } + + /** + * Dispose method for cleaning up the HLSJSConfigHandler plugin. + * + * @memberof HLSJSConfigHandler + * @method dispose + * @returns {void} + */ + dispose() { + this.player.srOptions_ = undefined; + + const tech = this.player.tech(true); + if (tech.hlsProvider) { + tech.hlsProvider.dispose(); + tech.hlsProvider = undefined; + } + + super.dispose(); + } +} + +videojs.registerPlugin("hlsjs", HLSJSConfigHandler); + +// --------------------------------------------------------------------------- +// Pod resolutions plugin +// --------------------------------------------------------------------------- + +/** + * PodResolutionsPlugin class for managing video resolutions in a Video.js player. + * + * @class PodResolutionsPlugin + * @extends {Plugin} + */ +class PodResolutionsPlugin extends Plugin { + currentSelection = null; + resolutions = []; + autoResolutionChosenId = null; + + /** + * Creates an instance of PodResolutionsPlugin. + * + * @param {Player} player - The Video.js player instance. + */ + constructor(player) { + super(player); + + player.on("video-change", function () { + this.resolutions = []; + this.trigger("resolutions-removed"); + }); + } + + /** + * Adds resolutions to the list of available resolutions. + * + * @param {Array} resolutions - An array of resolution objects to be added. + * @returns {void} + */ + add(resolutions) { + for (let r of resolutions) { + this.resolutions.push(r); + } + this.currentSelection = this.getSelected(); + + this._sort(); + this.trigger("resolutions-added"); + } + + /** + * Removes a resolution from the list of available resolutions. + * + * @param {number} resolutionIndex - The index of the resolution to be removed. + * @returns {void} + */ + remove(resolutionIndex) { + this.resolutions = this.resolutions.filter((r) => r.id !== resolutionIndex); + this.trigger("resolutions-removed"); + } + + /** + * Gets the list of available resolutions. + * + * @returns {Array} - An array of resolution objects. + */ + getResolutions() { + return this.resolutions; + } + + /** + * Gets the currently selected resolution. + * + * @returns {Object|null} - The currently selected resolution object or null if none selected. + */ + getSelected() { + return this.resolutions.find((r) => r.id === this.autoResolutionChosenId); + } + + /** + * Selects a resolution based on the provided options. + * + * @param {Object} options - Options for selecting a resolution. + * @param {number} options.id - The ID of the resolution to be selected. + * @param {number} options.autoResolutionChosenId - The ID indicating auto-selected resolution. + * @param {boolean} options.fireCallback - Whether to fire the selectCallback of the selected resolution. + * @returns {void} + */ + select(options) { + const { id, autoResolutionChosenId, fireCallback } = options; + + if ( + this.currentSelection?.id === id && + this.autoResolutionChosenId === autoResolutionChosenId + ) + return; + + this.autoResolutionChosenId = autoResolutionChosenId; + + for (const r of this.resolutions) { + r.selected = r.id === id; + + if (r.selected) { + this.currentSelection = r; + + if (fireCallback) r.selectCallback(); + } + } + + this.trigger("resolutions-changed"); + } + + /** + * Sorts the resolutions array based on resolution height. + * + * @private + * @returns {void} + */ + _sort() { + this.resolutions.sort((a, b) => { + if (a.id === -1) return 1; + if (b.id === -1) return -1; + + if (a.height > b.height) return -1; + if (a.height === b.height) return 0; + return 1; + }); + } +} + +videojs.registerPlugin("podResolutions", PodResolutionsPlugin); + +// --------------------------------------------------------------------------- +// HLS JS source handler +// --------------------------------------------------------------------------- + +export class Html5Hlsjs { + static hooks = {}; + + errorCounts = {}; + + maxNetworkErrorRecovery = 5; + + hlsjsConfig = null; + + _duration = null; + metadata = null; + isLive = null; + dvrDuration = null; + edgeMargin = null; + + handlers = { + play: null, + error: null, + }; + + constructor(vjs, source, tech) { + this.vjs = vjs; + this.source = source; + + this.tech = tech; + this.tech.name_ = "Hlsjs"; + + this.videoElement = tech.el(); + this.player = vjs(tech.options_.playerId); + + this.handlers.error = (event) => { + let errorTxt; + const mediaError = (event.currentTarget || event.target).error; + + if (!mediaError) return; + + console.log(mediaError); + switch (mediaError.code) { + case mediaError.MEDIA_ERR_ABORTED: + errorTxt = "You aborted the video playback"; + break; + case mediaError.MEDIA_ERR_DECODE: + errorTxt = + "The video playback was aborted due to a corruption problem or because the video used features " + + "your browser did not support"; + this._handleMediaError(mediaError); + break; + case mediaError.MEDIA_ERR_NETWORK: + errorTxt = + "A network error caused the video download to fail part-way"; + break; + case mediaError.MEDIA_ERR_SRC_NOT_SUPPORTED: + errorTxt = + "The video could not be loaded, either because the server or network failed or because the format is not supported"; + break; + + default: + errorTxt = mediaError.message; + } + + console.error(`MEDIA_ERROR: ${errorTxt}`); + }; + this.videoElement.addEventListener("error", this.handlers.error); + + this.initialize(); + } + + duration() { + if (this._duration === Infinity) return Infinity; + if (!isNaN(this.videoElement.duration)) return this.videoElement.duration; + + return this._duration || 0; + } + + seekable() { + if (this.hls.media) { + if (!this.isLive) { + return this.vjs.time.createTimeRanges(0, this.hls.media.duration); + } + + // Video.js doesn't seem to like floating point timeranges + const startTime = Math.round(this.hls.media.duration - this.dvrDuration); + const endTime = Math.round(this.hls.media.duration - this.edgeMargin); + + return this.vjs.time.createTimeRanges(startTime, endTime); + } + + return this.vjs.time.createTimeRanges(); + } + + // See comment for `initialize` method. + dispose() { + this.videoElement.removeEventListener("play", this.handlers.play); + this.videoElement.removeEventListener("error", this.handlers.error); + + // FIXME: https://github.com/video-dev/hls.js/issues/4092 + const untypedHLS = this.hls; + untypedHLS.log = untypedHLS.warn = () => { + // empty + }; + + this.hls.destroy(); + } + + static addHook(type, callback) { + Html5Hlsjs.hooks[type] = this.hooks[type] || []; + Html5Hlsjs.hooks[type].push(callback); + } + + static removeHook(type, callback) { + if (Html5Hlsjs.hooks[type] === undefined) return false; + + const index = Html5Hlsjs.hooks[type].indexOf(callback); + if (index === -1) return false; + + Html5Hlsjs.hooks[type].splice(index, 1); + + return true; + } + + static removeAllHooks() { + Html5Hlsjs.hooks = {}; + } + + _executeHooksFor(type) { + if (Html5Hlsjs.hooks[type] === undefined) { + return; + } + + // ES3 and IE < 9 + for (let i = 0; i < Html5Hlsjs.hooks[type].length; i++) { + Html5Hlsjs.hooks[type][i](this.player, this.hls); + } + } + + _getHumanErrorMsg(error) { + switch (error.code) { + default: + return error.message; + } + } + + _handleUnrecovarableError(error) { + if (this.hls.levels.filter((l) => l.id > -1).length > 1) { + this._removeQuality(this.hls.loadLevel); + return; + } + + this.hls.destroy(); + console.log("bubbling error up to VIDEOJS"); + this.tech.error = () => ({ + ...error, + message: this._getHumanErrorMsg(error), + }); + this.tech.trigger("error"); + } + + _handleMediaError(error) { + if (this.errorCounts[Hls.ErrorTypes.MEDIA_ERROR] === 1) { + console.log("trying to recover media error"); + this.hls.recoverMediaError(); + return; + } + + if (this.errorCounts[Hls.ErrorTypes.MEDIA_ERROR] === 2) { + console.log("2nd try to recover media error (by swapping audio codec"); + this.hls.swapAudioCodec(); + this.hls.recoverMediaError(); + return; + } + + if (this.errorCounts[Hls.ErrorTypes.MEDIA_ERROR] > 2) { + this._handleUnrecovarableError(error); + } + } + + _handleNetworkError(error) { + if (navigator.onLine === false) return; + + if ( + this.errorCounts[Hls.ErrorTypes.NETWORK_ERROR] <= + this.maxNetworkErrorRecovery + ) { + console.log("trying to recover network error"); + + // Wait 1 second and retry + setTimeout(() => this.hls.startLoad(), 1000); + + // Reset error count on success + this.hls.once(Hls.Events.FRAG_LOADED, () => { + this.errorCounts[Hls.ErrorTypes.NETWORK_ERROR] = 0; + }); + + return; + } + + this._handleUnrecovarableError(error); + } + + _onError(_event, data) { + const error = { + message: `HLS.js error: ${data.type} - fatal: ${data.fatal} - ${data.details}`, + }; + + // increment/set error count + if (this.errorCounts[data.type]) this.errorCounts[data.type] += 1; + else this.errorCounts[data.type] = 1; + + if (data.fatal) + console.error(error.message, { + currentTime: this.player.currentTime(), + data, + }); + else console.log(error.message); + + if (data.type === Hls.ErrorTypes.NETWORK_ERROR) { + error.code = 2; + this._handleNetworkError(error); + } else if ( + data.fatal && + data.type === Hls.ErrorTypes.MEDIA_ERROR && + data.details !== "manifestIncompatibleCodecsError" + ) { + error.code = 3; + this._handleMediaError(error); + } else if (data.fatal) { + this._handleUnrecovarableError(error); + } + } + + buildLevelLabel(level) { + if (this.player.srOptions_.levelLabelHandler) { + return this.player.srOptions_.levelLabelHandler(level); + } + + if (level.height) return level.height + "p"; + if (level.width) return Math.round((level.width * 9) / 16) + "p"; + if (level.bitrate) return level.bitrate / 1000 + "kbps"; + + return "0"; + } + + _removeQuality(index) { + this.hls.removeLevel(index); + this.player.podResolutions().remove(index); + this.hls.currentLevel = -1; + } + + _notifyVideoQualities() { + if (!this.metadata) return; + + const resolutions = []; + + this.metadata.levels.forEach((level, index) => { + resolutions.push({ + id: index, + height: level.height, + width: level.width, + bitrate: level.bitrate, + label: this.buildLevelLabel(level), + selected: level.id === this.hls.manualLevel, + + selectCallback: () => { + this.hls.currentLevel = index; + }, + }); + }); + + resolutions.push({ + id: -1, + label: this.player.localize("Auto"), + selected: true, + selectCallback: () => (this.hls.currentLevel = -1), + }); + + this.player.podResolutions().add(resolutions); + } + + _startLoad() { + this.hls.startLoad(-1); + this.videoElement.removeEventListener("play", this.handlers.play); + } + + _oneLevelObjClone(obj) { + const result = {}; + const objKeys = Object.keys(obj); + for (let i = 0; i < objKeys.length; i++) { + result[objKeys[i]] = obj[objKeys[i]]; + } + + return result; + } + + _onMetaData(_event, data) { + // This could arrive before 'loadedqualitydata' handlers is registered, remember it so we can raise it later + this.metadata = data; + this._notifyVideoQualities(); + } + + _initHlsjs() { + const techOptions = this.tech.options_; + const srOptions_ = this.player.srOptions_; + + const hlsjsConfigRef = srOptions_?.hlsjsConfig || techOptions.hlsjsConfig; + // Hls.js will write to the reference thus change the object for later streams + this.hlsjsConfig = hlsjsConfigRef + ? this._oneLevelObjClone(hlsjsConfigRef) + : {}; + + if ( + ["", "auto"].includes(this.videoElement.preload) && + !this.videoElement.autoplay && + this.hlsjsConfig.autoStartLoad === undefined + ) { + this.hlsjsConfig.autoStartLoad = false; + } + + // If the user explicitly sets autoStartLoad to false, we're not going to enter the if block above + // That's why we have a separate if block here to set the 'play' listener + if (this.hlsjsConfig.autoStartLoad === false) { + this.handlers.play = this._startLoad.bind(this); + this.videoElement.addEventListener("play", this.handlers.play); + } + + this.hls = new Hls(this.hlsjsConfig); + + this._executeHooksFor("beforeinitialize"); + + this.hls.on(Hls.Events.ERROR, (event, data) => this._onError(event, data)); + this.hls.on(Hls.Events.MANIFEST_PARSED, (event, data) => + this._onMetaData(event, data), + ); + this.hls.on(Hls.Events.LEVEL_LOADED, (event, data) => { + // The DVR plugin will auto seek to "live edge" on start up + if (this.hlsjsConfig.liveSyncDuration) { + this.edgeMargin = this.hlsjsConfig.liveSyncDuration; + } else if (this.hlsjsConfig.liveSyncDurationCount) { + this.edgeMargin = + this.hlsjsConfig.liveSyncDurationCount * data.details.targetduration; + } + + this.isLive = data.details.live; + this.dvrDuration = data.details.totalduration; + + this._duration = this.isLive ? Infinity : data.details.totalduration; + + // Increase network error recovery for lives since they can be broken (server restart, stream interruption etc) + if (this.isLive) this.maxNetworkErrorRecovery = 30; + }); + + this.hls.once(Hls.Events.FRAG_LOADED, () => { + // Emit custom 'loadedmetadata' event for parity with `videojs-contrib-hls` + // Ref: https://github.com/videojs/videojs-contrib-hls#loadedmetadata + // this.tech.trigger("loadedmetadata"); // TODO Faut il retirer ça ??? Cela cause l'execution de `player.on("loadedmetadata", function()` et fait en double plein de chose... + }); + + this.hls.on(Hls.Events.LEVEL_SWITCHING, (_e, data) => { + const resolutionId = this.hls.autoLevelEnabled ? -1 : data.level; + + const autoResolutionChosenId = this.hls.autoLevelEnabled + ? data.level + : -1; + + this.player.podResolutions().select({ + id: resolutionId, + autoResolutionChosenId, + fireCallback: false, + }); + }); + + this.hls.attachMedia(this.videoElement); + + this.hls.loadSource(this.source.src); + } + + initialize() { + this._initHlsjs(); + } +} diff --git a/pod/video/static/js/video-p2p-stats.js b/pod/video/static/js/video-p2p-stats.js new file mode 100644 index 0000000000..e357aacc57 --- /dev/null +++ b/pod/video/static/js/video-p2p-stats.js @@ -0,0 +1,101 @@ +/** + * Show the p2p stats. + */ +function updateStats() { + let httpMb = window.downloadTotals.http / 1048576; + let p2pMb = window.downloadTotals.p2p / 1048576; + let totalMb = httpMb + p2pMb; + let uploadMb = uploadTotal / 1048576; + if (totalMb != 0 || uploadMb != 0) { + let statInfoDownload = + ' ' + + Number(totalMb).toFixed(1) + + " MiB "; + statInfoDownload += + '[ : ' + + Number(httpMb).toFixed(1) + + " MiB / " + + Number((httpMb * 100) / totalMb).toFixed(0) + + "%"; + statInfoDownload += + ' - : ' + + Number(p2pMb).toFixed(1) + + " MiB / " + + Number((p2pMb * 100) / totalMb).toFixed(0) + + "% ] "; + var stat_info_download = document.getElementById("p2p-stat-info-download"); + if (stat_info_download) { + stat_info_download.innerHTML = statInfoDownload; + } + + let statInfoUpload = + ' ' + + Number(uploadMb).toFixed(1) + + " MiB"; + var stat_info_upload = document.getElementById("p2p-stat-info-upload"); + if (stat_info_upload) { + stat_info_upload.innerHTML = statInfoUpload; + } + } +} + +/** + * Show the number of peers sharing file with the user. + */ +function updatePeers() { + let statPeer = + ' ' + nb_peers; + document.querySelector("#p2p-stat-peers").innerHTML = statPeer; +} + +/** + * Saves the bytes just download by the player by the download method. + * This method is called by the bytes download event. + * + * @param {string} method method used to download bytes : http or p2p. + * @param {string} segment current segment of video downloaded. + * @param {number} bytes umber of bytes downloaded. + */ +function onBytesDownloaded(method, segment, bytes) { + // console.log("onBytesDownloaded", method, size) + window.downloadTotals[method] += bytes; + updateStats(); +} + +/** + * Saves the bytes just upload by the player. + * This method is called by the bytes upload event. + * + * @param {string} method method used to upload bytes : only p2p. + * @param {string} segment current segment of video uploaded. + * @param {number} bytes umber of bytes uploaded. + */ +function onBytesUploaded(method, segment, bytes) { + // console.log("onBytesUploaded", method, size) + uploadTotal += bytes; + updateStats(); +} + +/** + * Increments the number of peer connected. + * This method is called by the peer connect event. + * + * @param {object} peer the current peer connected. + */ +function onPeerConnect(peer) { + nb_peers += 1; + // console.log("peer_connect", peer.id, peer.remoteAddress); + updatePeers(); +} + +/** + * Decrements the number of connected peers. + * This method is called by the peer close event. + * + * @param {number} peerId the id of the peer who are no more available. + */ +function onPeerClose(peerId) { + // console.log("peer_close", peerId); + nb_peers -= 1; + updatePeers(); +} diff --git a/pod/video/static/js/video-show.js b/pod/video/static/js/video-show.js index c6599a4380..472dfa9a93 100644 --- a/pod/video/static/js/video-show.js +++ b/pod/video/static/js/video-show.js @@ -1,8 +1,7 @@ -var translationDone = false; - -document - .getElementById("podvideoplayer_html5_api") - .addEventListener("play", function () { +let translationDone = false; +let video_player = document.getElementById("podvideoplayer_html5_api"); +if (video_player) { + video_player.addEventListener("play", function () { if (!translationDone) { const elementToTranslateList = [ [".skip-back", gettext("Seek back 10 seconds in the video")], @@ -26,6 +25,7 @@ document } } }); +} /** * Translate the title of the video player button. diff --git a/pod/video/static/js/videojs-hls-plugin-readme.md b/pod/video/static/js/videojs-hls-plugin-readme.md new file mode 100644 index 0000000000..b53723b08f --- /dev/null +++ b/pod/video/static/js/videojs-hls-plugin-readme.md @@ -0,0 +1,15 @@ +[FR] +Le plugin videojs-hlsjs-plugin a été compilé et est fourni avec le code source pour être compatible avec la version 1.3 de la lib hls.js. +Une issue est créée avec la PR correspondante. Voici le lien : https://github.com/streamroot/videojs-hlsjs-plugin/issues/116 +Pour compiler le plugin, voici les commandes lancées : +[EN] +The videojs-hlsjs-plugin has been compiled and comes with the source code to be compatible with version 1.3 of the hls.js lib. +An issue is created with the corresponding PR. Here is the link: https://github.com/streamroot/videojs-hlsjs-plugin/issues/116 +To compile the plugin, here are the commands launched: + +> git clone https://github.com/ptitloup/videojs-hlsjs-plugin.git +> cd videojs-hlsjs-plugin/ +> git checkout ptitloup-patch-bump-hls.js +> export NODE_OPTIONS=--openssl-legacy-provider +> npm install +> npm run build diff --git a/pod/video/static/js/videojs-hlsjs-plugin.min.js b/pod/video/static/js/videojs-hlsjs-plugin.min.js new file mode 100644 index 0000000000..5448022baf --- /dev/null +++ b/pod/video/static/js/videojs-hlsjs-plugin.min.js @@ -0,0 +1 @@ +!function(r){var i={};function n(t){var e;return(i[t]||(e=i[t]={i:t,l:!1,exports:{}},r[t].call(e.exports,e,e.exports,n),e.l=!0,e)).exports}n.m=r,n.c=i,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=0)}([function(t,e,r){"use strict";var r=r(1),r=(window.videojs&&(r.registerConfigPlugin(window.videojs),r.registerSourceHandler(window.videojs)),{register:r.registerSourceHandler}),i="hlsSourceHandler";window[i]||(window[i]=r)},function(t,e,r){"use strict";var w="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},O=r(2);function i(t){var e=this;t&&(e.srOptions_||(e.srOptions_={}),e.srOptions_.hlsjsConfig||(e.srOptions_.hlsjsConfig=t.hlsjsConfig),e.srOptions_.captionConfig||(e.srOptions_.captionConfig=t.captionConfig))}t.exports={registerSourceHandler:function(C){var t,_={};function r(i,n){n.name_="StreamrootHlsjs";var s,a=n.el(),o={},l=null,u=null,d=null,c=null,f=null,g=null,p=C(n.options_.playerId),h=p.qualityLevels&&p.qualityLevels(),m=(h&&p.hlsQualitySelector&&(n.hls={}),!1);function v(t){1===o[O.ErrorTypes.MEDIA_ERROR]?s.recoverMediaError():2===o[O.ErrorTypes.MEDIA_ERROR]?(s.swapAudioCodec(),s.recoverMediaError()):2{return r={"./src/config.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{enableStreamingMode:()=>function(t){var e=t.loader;e!==g.default&&e!==f.default?(v.logger.log("[config]: Custom loader detected, cannot enable progressive streaming"),t.progressive=!1):(0,g.fetchSupported)()&&(t.loader=g.default,t.progressive=!0,t.enableSoftwareAES=!0,v.logger.log("[config]: Progressive streaming enabled, using FetchLoader"))},hlsDefaultConfig:()=>S,mergeConfig:()=>function(t,e){if((e.liveSyncDurationCount||e.liveMaxLatencyDurationCount)&&(e.liveSyncDuration||e.liveMaxLatencyDuration))throw new Error("Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration");if(void 0!==e.liveMaxLatencyDurationCount&&(void 0===e.liveSyncDurationCount||e.liveMaxLatencyDurationCount<=e.liveSyncDurationCount))throw new Error('Illegal hls.js config: "liveMaxLatencyDurationCount" must be greater than "liveSyncDurationCount"');if(void 0!==e.liveMaxLatencyDuration&&(void 0===e.liveSyncDuration||e.liveMaxLatencyDuration<=e.liveSyncDuration))throw new Error('Illegal hls.js config: "liveMaxLatencyDuration" must be greater than "liveSyncDuration"');return y({},t,e)}});var e=r("./src/controller/abr-controller.ts"),i=r("./src/controller/audio-stream-controller.ts"),n=r("./src/controller/audio-track-controller.ts"),s=r("./src/controller/subtitle-stream-controller.ts"),a=r("./src/controller/subtitle-track-controller.ts"),o=r("./src/controller/buffer-controller.ts"),l=r("./src/controller/timeline-controller.ts"),u=r("./src/controller/cap-level-controller.ts"),d=r("./src/controller/fps-controller.ts"),c=r("./src/controller/eme-controller.ts"),h=r("./src/controller/cmcd-controller.ts"),f=r("./src/utils/xhr-loader.ts"),g=r("./src/utils/fetch-loader.ts"),p=r("./src/utils/cues.ts"),m=r("./src/utils/mediakeys-helper.ts"),v=r("./src/utils/logger.ts");function y(){return(y=Object.assign?Object.assign.bind():function(t){for(var e=1;e{"use strict";r.r(e),r.d(e,{default:()=>i});var T=r("./src/polyfills/number.ts"),n=r("./src/utils/ewma-bandwidth-estimator.ts"),y=r("./src/events.ts"),s=r("./src/errors.ts"),o=r("./src/types/loader.ts"),S=r("./src/utils/logger.ts");function a(t,e){for(var r=0;r{"use strict";r.r(e),r.d(e,{default:()=>n});var s=r("./src/polyfills/number.ts"),f=r("./src/controller/base-stream-controller.ts"),g=r("./src/events.ts"),a=r("./src/utils/buffer-helper.ts"),o=r("./src/controller/fragment-tracker.ts"),i=r("./src/types/level.ts"),d=r("./src/types/loader.ts"),p=r("./src/loader/fragment.ts"),c=r("./src/demux/chunk-cache.ts"),h=r("./src/demux/transmuxer-interface.ts"),m=r("./src/types/transmuxer.ts"),l=r("./src/controller/fragment-finders.ts"),u=r("./src/utils/discontinuities.ts"),v=r("./src/errors.ts");function y(){return(y=Object.assign?Object.assign.bind():function(t){for(var e=1;et||s.nextStart)&&(this.log("Alt audio track ahead of main track, seek to start of alt audio track"),n.currentTime=t+.05),r&&e>r.end+a.targetduration)||(r&&r.len||!s.len)&&((i=this.getNextFragment(e,a))?this.loadFragment(i,a,e):this.bufferFlushed=!0)))))},r.getMaxBufferLength=function(t){var e=n.prototype.getMaxBufferLength.call(this);return t?Math.max(e,t):e},r.onMediaDetaching=function(){this.videoBuffer=null,n.prototype.onMediaDetaching.call(this)},r.onAudioTracksUpdated=function(t,e){e=e.audioTracks;this.resetTransmuxer(),this.levels=e.map(function(t){return new i.Level(t)})},r.onAudioTrackSwitching=function(t,e){var r=!!e.url,e=(this.trackId=e.id,this.fragCurrent);e&&e.abortRequests(),this.fragCurrent=null,this.clearWaitingFragment(),r?this.setInterval(100):this.resetTransmuxer(),r?(this.audioSwitch=!0,this.state=f.State.IDLE):this.state=f.State.STOPPED,this.tick()},r.onManifestLoading=function(){this.mainDetails=null,this.fragmentTracker.removeAllFragments(),this.startPosition=this.lastCurrentTime=0,this.bufferFlushed=!1},r.onLevelLoaded=function(t,e){this.mainDetails=e.details,null!==this.cachedTrackLoadedData&&(this.hls.trigger(g.Events.AUDIO_TRACK_LOADED,this.cachedTrackLoadedData),this.cachedTrackLoadedData=null)},r.onAudioTrackLoaded=function(t,e){if(null==this.mainDetails)this.cachedTrackLoadedData=e;else{var r=this.levels,i=e.details,e=e.id;if(r){this.log("Track "+e+" loaded ["+i.startSN+","+i.endSN+"],duration:"+i.totalduration);var r=r[e],n=0;if(i.live||null!=(s=r.details)&&s.live){var s=this.mainDetails;if(i.fragments[0]||(i.deltaUpdateFailed=!0),i.deltaUpdateFailed||!s)return;n=!r.details&&i.hasProgramDateTime&&s.hasProgramDateTime?((0,u.alignMediaPlaylistByPDT)(i,s),i.fragments[0].start):this.alignPlaylists(i,r.details)}r.details=i,this.levelLastLoaded=e,this.startFragRequested||!this.mainDetails&&i.live||this.setStartPosition(r.details,n),this.state!==f.State.WAITING_TRACK||this.waitForCdnTuneIn(i)||(this.state=f.State.IDLE),this.tick()}else this.warn("Audio tracks were reset while loading level "+e)}},r._handleFragmentLoadProgress=function(t){var e,r,i,n,s=t.frag,a=t.part,t=t.payload,o=this.config,l=this.trackId,u=this.levels;u?(e=(u=u[l]).details,o=o.defaultAudioCodec||u.audioCodec||"mp4a.40.2",u=(u=this.transmuxer)||(this.transmuxer=new h.default(this.hls,d.PlaylistLevelType.AUDIO,this._handleTransmuxComplete.bind(this),this._handleTransmuxerFlush.bind(this))),r=this.initPTS[s.cc],i=null==(i=s.initSegment)?void 0:i.data,void 0!==r?(n=a?a.index:-1,n=new m.ChunkMetadata(s.level,s.sn,s.stats.chunkCount,t.byteLength,n,-1!==n),u.push(t,i,o,"",s,a,e.totalduration,!1,n,r)):(this.log("Unknown video PTS for cc "+s.cc+", waiting for video PTS before demuxing audio frag "+s.sn+" of ["+e.startSN+" ,"+e.endSN+"],track "+l),(this.waitingData=this.waitingData||{frag:s,part:a,cache:new c.default,complete:!1}).cache.push(new Uint8Array(t)),this.waitingVideoCC=this.videoTrackCC,this.state=f.State.WAITING_INIT_PTS)):this.warn("Audio tracks were reset while fragment load was in progress. Fragment "+s.sn+" of level "+s.level+" will not be buffered")},r._handleFragmentLoadComplete=function(t){this.waitingData?this.waitingData.complete=!0:n.prototype._handleFragmentLoadComplete.call(this,t)},r.onBufferReset=function(){this.mediaBuffer=this.videoBuffer=null,this.loadedmetadata=!1},r.onBufferCreated=function(t,e){var r=e.tracks.audio;r&&(this.mediaBuffer=r.buffer||null),e.tracks.video&&(this.videoBuffer=e.tracks.video.buffer||null)},r.onFragBuffered=function(t,e){var r,i=e.frag,e=e.part;i.type!==d.PlaylistLevelType.AUDIO?this.loadedmetadata||i.type!==d.PlaylistLevelType.MAIN||null!=(r=this.videoBuffer||this.media)&&r.buffered.length&&(this.loadedmetadata=!0):this.fragContextChanged(i)?this.warn("Fragment "+i.sn+(e?" p: "+e.index:"")+" of level "+i.level+" finished buffering, but was aborted. state: "+this.state+", audioSwitch: "+this.audioSwitch):("initSegment"!==i.sn&&(this.fragPrevious=i,this.audioSwitch)&&(this.audioSwitch=!1,this.hls.trigger(g.Events.AUDIO_TRACK_SWITCHED,{id:this.trackId})),this.fragBufferedComplete(i,e))},r.onError=function(t,e){if(e.type===v.ErrorTypes.KEY_SYSTEM_ERROR)this.onFragmentOrKeyLoadError(d.PlaylistLevelType.AUDIO,e);else switch(e.details){case v.ErrorDetails.FRAG_LOAD_ERROR:case v.ErrorDetails.FRAG_LOAD_TIMEOUT:case v.ErrorDetails.FRAG_PARSING_ERROR:case v.ErrorDetails.KEY_LOAD_ERROR:case v.ErrorDetails.KEY_LOAD_TIMEOUT:this.onFragmentOrKeyLoadError(d.PlaylistLevelType.AUDIO,e);break;case v.ErrorDetails.AUDIO_TRACK_LOAD_ERROR:case v.ErrorDetails.AUDIO_TRACK_LOAD_TIMEOUT:this.state!==f.State.ERROR&&this.state!==f.State.STOPPED&&(this.state=e.fatal?f.State.ERROR:f.State.IDLE,this.warn(e.details+" while loading frag, switching to "+this.state+" state"));break;case v.ErrorDetails.BUFFER_FULL_ERROR:var r,i;"audio"!==e.parent||this.state!==f.State.PARSING&&this.state!==f.State.PARSED||(r=!0,(r=(i=this.getFwdBufferInfo(this.mediaBuffer,d.PlaylistLevelType.AUDIO))&&.5{"use strict";r.r(e),r.d(e,{default:()=>i});var l=r("./src/events.ts"),s=r("./src/errors.ts"),e=r("./src/controller/base-playlist-controller.ts"),a=r("./src/types/loader.ts");function o(t,e){for(var r=0;r=o.length?this.warn("Invalid id passed to audio-track controller"):(this.clearTimer(),e=o[this.trackId],this.log("Now switching to audio-track index "+t),r=(o=o[t]).id,i=void 0===(i=o.groupId)?"":i,n=o.name,s=o.type,a=o.url,this.trackId=t,this.trackName=n,this.selectDefaultTrack=!1,this.hls.trigger(l.Events.AUDIO_TRACK_SWITCHING,{id:r,groupId:i,name:n,type:s,url:a}),o.details&&!o.details.live||(t=this.switchParams(o.url,null==e?void 0:e.details),this.loadPlaylist(t)))},i.selectInitialTrack=function(){this.tracksInGroup;var t=this.trackName,t=this.findTrackId(t)||this.findTrackId();-1!==t?this.setAudioTrack(t):(this.warn("No track found for running audio group-ID: "+this.groupId),this.hls.trigger(l.Events.ERROR,{type:s.ErrorTypes.MEDIA_ERROR,details:s.ErrorDetails.AUDIO_TRACK_LOAD_ERROR,fatal:!0}))},i.findTrackId=function(t){for(var e=this.tracksInGroup,r=0;r{"use strict";r.r(e),r.d(e,{default:()=>n});var o=r("./src/types/level.ts"),p=r("./src/controller/level-helper.ts"),l=r("./src/utils/logger.ts"),i=r("./src/errors.ts"),n=function(){function t(t,e){this.hls=void 0,this.timer=-1,this.requestScheduled=-1,this.canLoad=!1,this.retryCount=0,this.log=void 0,this.warn=void 0,this.log=l.logger.log.bind(l.logger,e+":"),this.warn=l.logger.warn.bind(l.logger,e+":"),this.hls=t}var e=t.prototype;return e.destroy=function(){this.clearTimer(),this.hls=this.log=this.warn=null},e.onError=function(t,e){!e.fatal||e.type!==i.ErrorTypes.NETWORK_ERROR&&e.type!==i.ErrorTypes.KEY_SYSTEM_ERROR||this.stopLoad()},e.clearTimer=function(){clearTimeout(this.timer),this.timer=-1},e.startLoad=function(){this.canLoad=!0,this.retryCount=0,this.requestScheduled=-1,this.loadPlaylist()},e.stopLoad=function(){this.canLoad=!1,this.clearTimer()},e.switchParams=function(t,e){var r=null==e?void 0:e.renditionReports;if(r)for(var i=0;ie.partTarget&&(s+=1),new o.HlsUrlParameters(a,0<=s?s:void 0,o.HlsSkip.No)}},e.loadPlaylist=function(t){-1===this.requestScheduled&&(this.requestScheduled=self.performance.now())},e.shouldLoadTrack=function(t){return this.canLoad&&t&&!!t.url&&(!t.details||t.details.live)},e.playlistLoaded=function(t,e,r){var i=this,n=e.details,s=e.stats,a=self.performance.now(),o=s.loading.first?Math.max(0,a-s.loading.first):0;if(n.advancedDateTime=Date.now()-o,n.live||null!=r&&r.live){if(n.reloaded(r),r&&this.log("live playlist "+t+" "+(n.advanced?"REFRESHED "+n.lastPartSn+"-"+n.lastPartIndex:"MISSED")),r&&0r.tuneInGoal?(this.warn("CDN Tune-in goal increased from: "+r.tuneInGoal+" to: "+h+" with playlist age: "+n.age),h=0):(o+=f=Math.floor(h/n.targetduration),void 0!==u&&(u+=Math.round(h%n.targetduration/n.partTarget)),this.log("CDN Tune-in age: "+n.ageHeader+"s last advanced "+c.toFixed(2)+"s goal: "+h+" skip sn "+f+" to part "+u)),n.tuneInGoal=h),l=this.getDeliveryDirectives(n,e.deliveryDirectives,o,u),d||!g)return void this.loadPlaylist(l)}else l=this.getDeliveryDirectives(n,e.deliveryDirectives,o,u);r=this.hls.mainForwardBufferInfo,c=r?r.end-r.len:0,f=1e3*(n.edge-c),h=(0,p.computeReloadInterval)(n,f),d=(n.updated?a>this.requestScheduled+h&&(this.requestScheduled=s.loading.start):this.requestScheduled=-1,void 0!==o&&n.canBlockReload?this.requestScheduled=s.loading.first+h-(1e3*n.partTarget||1e3):this.requestScheduled=(-1===this.requestScheduled?a:this.requestScheduled)+h,this.requestScheduled-a),d=Math.max(0,d);this.log("reload live playlist "+t+" in "+Math.round(d)+" ms"),this.timer=self.setTimeout(function(){return i.loadPlaylist(l)},d)}}else this.clearTimer()},e.getDeliveryDirectives=function(t,e,r,i){var n=(0,o.getSkipValue)(t,r);return null!=e&&e.skip&&t.deltaUpdateFailed&&(r=e.msn,i=e.part,n=o.HlsSkip.No),new o.HlsUrlParameters(r,i,n)},e.retryLoadingOrFail=function(t){var e,r=this,i=this.hls.config,n=this.retryCount{"use strict";r.r(e),r.d(e,{State:()=>b,default:()=>i});var d=r("./src/polyfills/number.ts"),e=r("./src/task-loop.ts"),u=r("./src/controller/fragment-tracker.ts"),a=r("./src/utils/buffer-helper.ts"),o=r("./src/utils/logger.ts"),c=r("./src/events.ts"),n=r("./src/errors.ts"),l=r("./src/types/transmuxer.ts"),h=r("./src/utils/mp4-tools.ts"),f=r("./src/utils/discontinuities.ts"),g=r("./src/controller/fragment-finders.ts"),p=r("./src/controller/level-helper.ts"),m=r("./src/loader/fragment-loader.ts"),v=r("./src/crypt/decrypter.ts"),y=r("./src/utils/time-ranges.ts"),E=r("./src/types/loader.ts");function T(t,e){for(var r=0;ri.end)&&(n=n buffer:"+(r?y.default.toString(a.BufferHelper.getBuffered(r)):"(detached)")+")"),this.state=b.IDLE,r&&(!this.loadedmetadata&&t.type==E.PlaylistLevelType.MAIN&&r.buffered.length&&(null==(e=this.fragCurrent)?void 0:e.sn)===(null==(t=this.fragPrevious)?void 0:t.sn)&&(this.loadedmetadata=!0,this.seekToStartPos()),this.tick())},i.seekToStartPos=function(){},i._handleFragmentLoadComplete=function(t){var e,r,i=this.transmuxer;i&&(r=t.frag,e=t.part,t=!(t=t.partsLoaded)||0===t.length||t.some(function(t){return!t}),r=new l.ChunkMetadata(r.level,r.sn,r.stats.chunkCount+1,0,e?e.index:-1,!t),i.flush(r))},i._handleFragmentLoadProgress=function(t){},i._doFragLoad=function(e,t,r,i){var n=this;if(void 0===r&&(r=null),!this.levels)throw new Error("frag load aborted, missing levels");var s=null;if(!e.encrypted||null!=(o=e.decryptdata)&&o.key?!e.encrypted&&t.encryptedFragments.length&&this.keyLoader.loadClear(e,t.encryptedFragments):(this.log("Loading key for "+e.sn+" of ["+t.startSN+"-"+t.endSN+"], "+("[stream-controller]"===this.logPrefix?"level":"track")+" "+e.level),this.state=b.KEY_LOADING,this.fragCurrent=e,s=this.keyLoader.load(e).then(function(t){if(!n.fragContextChanged(t.frag))return n.hls.trigger(c.Events.KEY_LOADED,t),n.state===b.KEY_LOADING&&(n.state=b.IDLE),t}),this.hls.trigger(c.Events.KEY_LOADING,{frag:e}),this.throwIfFragContextChanged("KEY_LOADING")),r=Math.max(e.start,r||0),this.config.lowLatencyMode&&t){var a=t.partList;if(a&&i){r>e.end&&t.fragmentHint&&(e=t.fragmentHint);var o,l=this.getNextPart(a,e,r);if(-1r&&this.flushMainBuffer(i,t.start)):this.flushMainBuffer(0,t.start))},i.getFwdBufferInfo=function(t,e){var r=this.config,i=this.getLoadPosition();if(!(0,d.isFiniteNumber)(i))return null;var n=a.BufferHelper.bufferInfo(t,i,r.maxBufferHole);if(0===n.len&&void 0!==n.nextStart){e=this.fragmentTracker.getBufferedFrag(i,e);if(e&&n.nextStart=t&&(e.maxMaxBufferLength/=2,this.warn("Reduce max buffer length to "+e.maxMaxBufferLength+"s"),!0)},i.getNextFragment=function(t,e){var r=e.fragments,i=r.length;if(!i)return null;var n,s=this.config,a=r[0].start;if(e.live){var o=s.initialLiveManifestSize;if(it.start&&t.loaded},i.getInitialLiveFragment=function(t,e){var r,i=this.fragPrevious,n=null;return i?(t.hasProgramDateTime&&(this.log("Live playlist, switching playlist, load frag with same PDT: "+i.programDateTime),n=(0,g.findFragmentByPDT)(e,i.endProgramDateTime,this.config.maxFragLookUpTolerance)),n||((r=i.sn+1)>=t.startSN&&r<=t.endSN&&(r=e[r-t.startSN],i.cc===r.cc)&&this.log("Live playlist, switching playlist, load frag with next SN: "+(n=r).sn),n)||(n=(0,g.findFragWithCC)(e,i.cc))&&this.log("Live playlist, switching playlist, load frag with same CC: "+n.sn)):null!==(r=this.hls.liveSyncPosition)&&(n=this.getFragmentAtPosition(r,this.bitrateTest?t.fragmentEnd:t.edge,t)),n},i.getFragmentAtPosition=function(t,e,r){var i=this.config,n=this.fragPrevious,s=r.fragments,a=r.endSN,o=r.fragmentHint,l=i.maxFragLookUpTolerance,i=!!(i.lowLatencyMode&&r.partList&&o);return i&&o&&!this.bitrateTest&&(s=s.concat(o),a=o.sn),(o=t=n-s.maxFragLookUpTolerance&&r<=i,null!==e)&&a.duration>e&&(r"+t.startSN+" prev-sn: "+(o?o.sn:"na")+" fragments: "+a),n):r):(this.warn("No fragments in live playlist"),0)},i.waitForCdnTuneIn=function(t){return t.live&&t.canBlockReload&&t.partTarget&&t.tuneInGoal>Math.max(t.partHoldBack,3*t.partTarget)},i.setStartPosition=function(t,e){var r,i=this.startPosition;-1!==(i=i"+t))}}])&&T(e.prototype,i),r&&T(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}(e.default)},"./src/controller/buffer-controller.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>s});var u=r("./src/polyfills/number.ts"),m=r("./src/events.ts"),v=r("./src/utils/logger.ts"),y=r("./src/errors.ts"),E=r("./src/utils/buffer-helper.ts"),e=r("./src/utils/mediasource-helper.ts"),a=r("./src/loader/fragment.ts"),i=r("./src/controller/buffer-operation-queue.ts"),n=(0,e.getMediaSource)(),h=/([ha]vc.)(?:\.[^.,]+)+/,s=function(){function t(t){var r=this;this.details=null,this._objectUrl=null,this.operationQueue=void 0,this.listeners=void 0,this.hls=void 0,this.bufferCodecEventsExpected=0,this._bufferCodecEventsTotal=0,this.media=null,this.mediaSource=null,this.lastMpegAudioChunk=null,this.appendError=0,this.tracks={},this.pendingTracks={},this.sourceBuffer=void 0,this._onMediaSourceOpen=function(){var t=r.media,e=r.mediaSource;v.logger.log("[buffer-controller]: Media source opened"),t&&(t.removeEventListener("emptied",r._onMediaEmptied),r.updateMediaElementDuration(),r.hls.trigger(m.Events.MEDIA_ATTACHED,{media:t})),e&&e.removeEventListener("sourceopen",r._onMediaSourceOpen),r.checkPendingTracks()},this._onMediaSourceClose=function(){v.logger.log("[buffer-controller]: Media source closed")},this._onMediaSourceEnded=function(){v.logger.log("[buffer-controller]: Media source ended")},this._onMediaEmptied=function(){var t=r.media,e=r._objectUrl;t&&t.src!==e&&v.logger.error("Media element src was set while attaching MediaSource ("+e+" > "+t.src+")")},this.hls=t,this._initSourceBuffer(),this.registerListeners()}var e=t.prototype;return e.hasSourceTypes=function(){return 0r.config.appendErrorMaxRetry&&(v.logger.error("[buffer-controller]: Failed "+r.config.appendErrorMaxRetry+" times to append segment in sourceBuffer"),e.fatal=!0,r.stopLoad())),r.trigger(m.Events.ERROR,e)}},o)},e.onBufferFlushing=function(t,r){function e(e){return{execute:i.removeExecutor.bind(i,e,r.startOffset,r.endOffset),onStart:function(){},onComplete:function(){i.hls.trigger(m.Events.BUFFER_FLUSHED,{type:e})},onError:function(t){v.logger.warn("[buffer-controller]: Failed to remove from "+e+" SourceBuffer",t)}}}var i=this,n=this.operationQueue;r.type?n.append(e(r.type),r.type):this.getSourceBufferTypes().forEach(function(t){n.append(e(t),t)})},e.onFragParsed=function(t,e){var r=this,i=e.frag,n=e.part,e=[],s=(n||i).elementaryStreams;s[a.ElementaryStreamTypes.AUDIOVIDEO]?e.push("audiovideo"):(s[a.ElementaryStreamTypes.AUDIO]&&e.push("audio"),s[a.ElementaryStreamTypes.VIDEO]&&e.push("video"));0===e.length&&v.logger.warn("Fragments must have at least one ElementaryStreamType set. type: "+i.type+" level: "+i.level+" sn: "+i.sn),this.blockBuffers(function(){var t=self.performance.now(),t=(i.stats.buffering.end=t,n&&(n.stats.buffering.end=t),(n||i).stats);r.hls.trigger(m.Events.FRAG_BUFFERED,{frag:i,part:n,stats:t,id:i.type})},e)},e.onFragChanged=function(t,e){this.flushBackBuffer()},e.onBufferEos=function(t,i){var n=this;this.getSourceBufferTypes().reduce(function(t,e){var r=n.sourceBuffer[e];return!r||i.type&&i.type!==e||(r.ending=!0,r.ended)||(r.ended=!0,v.logger.log("[buffer-controller]: "+e+" sourceBuffer now EOS")),t&&!(r&&!r.ended)},!0)&&(v.logger.log("[buffer-controller]: Queueing mediaSource.endOfStream()"),this.blockBuffers(function(){n.getSourceBufferTypes().forEach(function(t){t=n.sourceBuffer[t];t&&(t.ending=!1)});var t=n.mediaSource;t&&"open"===t.readyState?(v.logger.log("[buffer-controller]: Calling mediaSource.endOfStream()"),t.endOfStream()):t&&v.logger.info("[buffer-controller]: Could not call mediaSource.endOfStream(). mediaSource.readyState: "+t.readyState)}))},e.onLevelUpdated=function(t,e){e=e.details;e.fragments.length&&(this.details=e,this.getSourceBufferTypes().length?this.blockBuffers(this.updateMediaElementDuration.bind(this)):this.updateMediaElementDuration())},e.flushBackBuffer=function(){var t,e,i,n,s,a=this.hls,o=this.details,r=this.media,l=this.sourceBuffer;r&&null!==o&&(t=this.getSourceBufferTypes()).length&&(e=o.live&&null!==a.config.liveBackBufferLength?a.config.liveBackBufferLength:a.config.backBufferLength,!(0,u.isFiniteNumber)(e)||e<0||(i=r.currentTime,n=o.levelTargetDuration,r=Math.max(e,n),s=Math.floor(i/n)*n-r,t.forEach(function(t){var e=l[t];if(e){var r=E.BufferHelper.getBuffered(e);if(0r.start(0)){if(a.trigger(m.Events.BACK_BUFFER_REACHED,{bufferEnd:s}),o.live)a.trigger(m.Events.LIVE_BACK_BUFFER_REACHED,{bufferEnd:s});else if(e.ended&&r.end(r.length-1)-i<2*n)return void v.logger.info("[buffer-controller]: Cannot flush "+t+" back buffer while SourceBuffer is in ended state");a.trigger(m.Events.BUFFER_FLUSHING,{startOffset:0,endOffset:s,type:t})}}})))},e.updateMediaElementDuration=function(){var t,e,r,i,n,s;this.details&&this.media&&this.mediaSource&&"open"===this.mediaSource.readyState&&(t=this.details,e=this.hls,n=this.media,r=this.mediaSource,i=t.fragments[0].start+t.totalduration,n=n.duration,s=(0,u.isFiniteNumber)(r.duration)?r.duration:0,t.live&&e.config.liveDurationInfinity?(v.logger.log("[buffer-controller]: Media Source duration is set to Infinity"),r.duration=1/0,this.updateSeekableRange(t)):(s{"use strict";r.r(e),r.d(e,{default:()=>i});var s=r("./src/utils/logger.ts"),i=function(){function t(t){this.buffers=void 0,this.queues={video:[],audio:[],audiovideo:[]},this.buffers=t}var e=t.prototype;return e.append=function(t,e){var r=this.queues[e];r.push(t),1===r.length&&this.buffers[e]&&this.executeNext(e)},e.insertAbort=function(t,e){this.queues[e].unshift(t),this.executeNext(e)},e.appendBlocker=function(t){var e,r=new Promise(function(t){e=t}),i={execute:e,onStart:function(){},onComplete:function(){},onError:function(){}};return this.append(i,t),r},e.executeNext=function(e){var r=this.buffers,i=this.queues,r=r[e],i=i[e];if(i.length){var n=i[0];try{n.execute()}catch(t){s.logger.warn("[buffer-operation-queue]: Unhandled exception executing the current operation"),n.onError(t),r&&r.updating||(i.shift(),this.executeNext(e))}}},e.shiftAndExecuteNext=function(t){this.queues[t].shift(),this.executeNext(t)},e.current=function(t){return this.queues[t][0]},t}()},"./src/controller/cap-level-controller.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>n});var i=r("./src/events.ts");function s(t,e){for(var r=0;rthis.autoLevelCapping&&this.streamController&&this.streamController.nextLevelSwitch(),this.autoLevelCapping=e.autoLevelCapping)},r.getMaxLevel=function(r){var i=this,t=this.hls.levels;return t.length?(t=t.filter(function(t,e){return n.isLevelAllowed(e,i.restrictedLevels)&&e<=r}),this.clientRect=null,n.getMaxLevelByMediaSize(t,this.mediaWidth,this.mediaHeight)):-1},r.startCapping=function(){this.timer||(this.autoLevelCapping=Number.POSITIVE_INFINITY,this.hls.firstLevel=this.getMaxLevel(this.firstLevel),self.clearInterval(this.timer),this.timer=self.setInterval(this.detectPlayerSize.bind(this),1e3),this.detectPlayerSize())},r.stopCapping=function(){this.restrictedLevels=[],this.firstLevel=-1,this.autoLevelCapping=Number.POSITIVE_INFINITY,this.timer&&(self.clearInterval(this.timer),this.timer=void 0)},r.getDimensions=function(){var t,e,r;return this.clientRect||(e={width:0,height:0},(t=this.media)&&(r=t.getBoundingClientRect(),e.width=r.width,e.height=r.height,e.width||e.height||(e.width=r.right-r.left||t.width||0,e.height=r.bottom-r.top||t.height||0)),this.clientRect=e)},n.isLevelAllowed=function(t,e){return-1===(e=void 0===e?[]:e).indexOf(t)},n.getMaxLevelByMediaSize=function(t,e,r){if(!t||!t.length)return-1;for(var i,n=t.length-1,s=0;s=e||a.height>=r)&&(a=a,!(i=t[s+1])||a.width!==i.width||a.height!==i.height)){n=s;break}}return n},r=n,(t=[{key:"mediaWidth",get:function(){return this.getDimensions().width*this.contentScaleFactor}},{key:"mediaHeight",get:function(){return this.getDimensions().height*this.contentScaleFactor}},{key:"contentScaleFactor",get:function(){var t=1;if(!this.hls.config.ignoreDevicePixelRatio)try{t=self.devicePixelRatio}catch(t){}return t}}])&&s(r.prototype,t),e&&s(r,e),Object.defineProperty(r,"prototype",{writable:!1}),n}()},"./src/controller/cmcd-controller.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>d});var i=r("./src/events.ts"),a=r("./src/types/cmcd.ts"),n=r("./src/utils/buffer-helper.ts"),o=r("./src/utils/logger.ts");function s(t,e){for(var r=0;r=t.length?{done:!0}:{done:!1,value:t[r++]}};throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function u(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,i=new Array(e);re&&(e=n.bitrate)}return 0{"use strict";r.r(e),r.d(e,{default:()=>E});var i=r("./src/events.ts"),d=r("./src/errors.ts"),s=r("./src/utils/logger.ts"),g=r("./src/utils/mediakeys-helper.ts"),c=r("./src/utils/keysystem-util.ts"),p=r("./src/utils/numeric-encoding-utils.ts"),m=r("./src/loader/level-key.ts"),v=r("./src/utils/hex.ts"),y=r("./src/utils/mp4-tools.ts"),e=r("./node_modules/eventemitter3/index.js"),h=r.n(e);function n(t){var r="function"==typeof Map?new Map:void 0;return function(t){if(null===t||-1===Function.toString.call(t).indexOf("[native code]"))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(t))return r.get(t);r.set(t,e)}function e(){return a(t,arguments,l(this).constructor)}return e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),o(e,t)}(t)}function a(t,e,r){return(a=function(){if("undefined"==typeof Reflect||!Reflect.construct)return;if(Reflect.construct.sham)return;if("function"==typeof Proxy)return 1;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),1}catch(t){}}()?Reflect.construct.bind():function(t,e,r){var i=[null];i.push.apply(i,e);e=new(Function.bind.apply(t,i));return r&&o(e,r.prototype),e}).apply(null,arguments)}function o(t,e){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}function l(t){return(l=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var u="[eme]",r=function(){function n(t){this.hls=void 0,this.config=void 0,this.media=null,this.keyFormatPromise=null,this.keySystemAccessPromises={},this._requestLicenseFailureCount=0,this.mediaKeySessions=[],this.keyIdToKeySessionPromise={},this.setMediaKeysQueue=n.CDMCleanupPromise?[n.CDMCleanupPromise]:[],this.onMediaEncrypted=this._onMediaEncrypted.bind(this),this.onWaitingForKey=this._onWaitingForKey.bind(this),this.debug=s.logger.debug.bind(s.logger,u),this.log=s.logger.log.bind(s.logger,u),this.warn=s.logger.warn.bind(s.logger,u),this.error=s.logger.error.bind(s.logger,u),this.hls=t,this.config=t.config,this.registerListeners()}var t=n.prototype;return t.destroy=function(){this.unregisterListeners(),this.onMediaDetached(),this.hls=this.onMediaEncrypted=this.onWaitingForKey=this.keyIdToKeySessionPromise=null},t.registerListeners=function(){this.hls.on(i.Events.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.on(i.Events.MEDIA_DETACHED,this.onMediaDetached,this),this.hls.on(i.Events.MANIFEST_LOADED,this.onManifestLoaded,this)},t.unregisterListeners=function(){this.hls.off(i.Events.MEDIA_ATTACHED,this.onMediaAttached,this),this.hls.off(i.Events.MEDIA_DETACHED,this.onMediaDetached,this),this.hls.off(i.Events.MANIFEST_LOADED,this.onManifestLoaded,this)},t.getLicenseServerUrl=function(t){var e=this.config,r=e.drmSystems,e=e.widevineLicenseUrl,r=r[t];if(r)return r.licenseUrl;if(t===g.KeySystems.WIDEVINE&&e)return e;throw new Error('no license server URL configured for key-system "'+t+'"')},t.getServerCertificateUrl=function(t){var e=this.config.drmSystems[t];if(e)return e.serverCertificateUrl;this.log('No Server Certificate in config.drmSystems["'+t+'"]')},t.attemptKeySystemAccess=function(t){function e(t,e,r){return!!t&&r.indexOf(t)===e}var a=this,r=this.hls.levels,o=r.map(function(t){return t.audioCodec}).filter(e),l=r.map(function(t){return t.videoCodec}).filter(e);return o.length+l.length===0&&l.push("avc1.42e01e"),new Promise(function(n,s){(function e(r){var i=r.shift();a.getMediaKeysPromise(i,o,l).then(function(t){return n({keySystem:i,mediaKeys:t})}).catch(function(t){r.length?e(r):t instanceof f?s(t):s(new f({type:d.ErrorTypes.KEY_SYSTEM_ERROR,details:d.ErrorDetails.KEY_SYSTEM_NO_ACCESS,error:t,fatal:!0},t.message))})})(t)})},t.requestMediaKeySystemAccess=function(t,e){var r,i=this.config.requestMediaKeySystemAccessFunc;return"function"!=typeof i?(r="Configured requestMediaKeySystemAccess is not a function "+i,null===g.requestMediaKeySystemAccess&&"http:"===self.location.protocol&&(r="navigator.requestMediaKeySystemAccess is not available over insecure protocol "+location.protocol),Promise.reject(new Error(r))):i(t,e)},t.getMediaKeysPromise=function(i,t,e){var n,s=this,t=(0,g.getSupportedMediaKeySystemConfigurations)(i,t,e,this.config.drmSystemOptions),r=this.keySystemAccessPromises[i],e=null==r?void 0:r.keySystemAccess;return e?e.then(function(){return r.mediaKeys}):(this.log('Requesting encrypted media "'+i+'" key-system access with config: '+JSON.stringify(t)),e=this.requestMediaKeySystemAccess(i,t),n=this.keySystemAccessPromises[i]={keySystemAccess:e},e.catch(function(t){s.log('Failed to obtain access to key-system "'+i+'": '+t)}),e.then(function(t){s.log('Access for key-system "'+t.keySystem+'" obtained');var r=s.fetchServerCertificate(i);return s.log('Create media-keys for "'+i+'"'),n.mediaKeys=t.createMediaKeys().then(function(e){return s.log('Media-keys created for "'+i+'"'),r.then(function(t){return t?s.setMediaKeysServerCertificate(e,i,t):e})}),n.mediaKeys.catch(function(t){s.error('Failed to create media-keys for "'+i+'"}: '+t)}),n.mediaKeys}))},t.createMediaKeySessionContext=function(t){var e=t.decryptdata,r=t.keySystem,t=t.mediaKeys,i=(this.log('Creating key-system session "'+r+'" keyId: '+v.default.hexDump(e.keyId||[])),t.createSession()),e={decryptdata:e,keySystem:r,mediaKeys:t,mediaKeysSession:i,keyStatus:"status-pending"};return this.mediaKeySessions.push(e),e},t.renewKeySession=function(t){var e,r,i=t.decryptdata;i.pssh?(e=this.createMediaKeySessionContext(t),r=this.getKeyIdString(i),this.keyIdToKeySessionPromise[r]=this.generateRequestWithPreferredKeySession(e,"cenc",i.pssh,"expired")):this.warn("Could not renew expired session. Missing pssh initData."),this.removeSession(t)},t.getKeyIdString=function(t){if(!t)throw new Error("Could not read keyId of undefined decryptdata");if(null===t.keyId)throw new Error("keyId is null");return v.default.hexDump(t.keyId)},t.updateKeySession=function(t,e){var r=t.mediaKeysSession;return this.log('Updating key-session "'+r.sessionId+'" for keyID '+v.default.hexDump((null==(t=t.decryptdata)?void 0:t.keyId)||[])+"\n } (data length: "+(e&&e.byteLength)+")"),r.update(e)},t.selectKeySystemFormat=function(t){var e=Object.keys(t.levelkeys||{});return this.keyFormatPromise||(this.log("Selecting key-system from fragment (sn: "+t.sn+" "+t.type+": "+t.level+") key formats "+e.join(", ")),this.keyFormatPromise=this.getKeyFormatPromise(e)),this.keyFormatPromise},t.getKeyFormatPromise=function(n){var s=this;return new Promise(function(r,i){var e=(0,g.getKeySystemsForConfig)(s.config),t=n.map(g.keySystemFormatToKeySystemDomain).filter(function(t){return!!t&&-1!==e.indexOf(t)});return s.getKeySystemSelectionPromise(t).then(function(t){var t=t.keySystem,e=(0,g.keySystemDomainToKeySystemFormat)(t);e?r(e):i(new Error('Unable to find format for key-system "'+t+'"'))}).catch(i)})},t.loadKey=function(i){var n=this,s=i.keyInfo.decryptdata,t=this.getKeyIdString(s),a="(keyId: "+t+' format: "'+s.keyFormat+'" method: '+s.method+" uri: "+s.uri+")",e=(this.log("Starting session for key "+a),this.keyIdToKeySessionPromise[t]);return e||(e=this.keyIdToKeySessionPromise[t]=this.getKeySystemForKeyPromise(s).then(function(t){var e=t.keySystem,r=t.mediaKeys;return n.throwIfDestroyed(),n.log("Handle encrypted media sn: "+i.frag.sn+" "+i.frag.type+": "+i.frag.level+" using key "+a),n.attemptSetMediaKeys(e,r).then(function(){n.throwIfDestroyed();var t=n.createMediaKeySessionContext({keySystem:e,mediaKeys:r,decryptdata:s});return n.generateRequestWithPreferredKeySession(t,"cenc",s.pssh,"playlist-key")})})).catch(function(t){return n.handleError(t)}),e},t.throwIfDestroyed=function(t){if(void 0===t&&(t="Invalid state"),!this.hls)throw new Error("invalid state")},t.handleError=function(t){this.hls&&(this.error(t.message),t instanceof f?this.hls.trigger(i.Events.ERROR,t.data):this.hls.trigger(i.Events.ERROR,{type:d.ErrorTypes.KEY_SYSTEM_ERROR,details:d.ErrorDetails.KEY_SYSTEM_NO_KEYS,error:t,fatal:!0}))},t.getKeySystemForKeyPromise=function(t){var e=this.getKeyIdString(t),e=this.keyIdToKeySessionPromise[e];return e||(t=(e=(0,g.keySystemFormatToKeySystemDomain)(t.keyFormat))?[e]:(0,g.getKeySystemsForConfig)(this.config),this.attemptKeySystemAccess(t))},t.getKeySystemSelectionPromise=function(t){if(0===(t=t.length?t:(0,g.getKeySystemsForConfig)(this.config)).length)throw new f({type:d.ErrorTypes.KEY_SYSTEM_ERROR,details:d.ErrorDetails.KEY_SYSTEM_NO_CONFIGURED_LICENSE,fatal:!0},"Missing key-system license configuration options "+JSON.stringify({drmSystems:this.config.drmSystems}));return this.attemptKeySystemAccess(t)},t._onMediaEncrypted=function(t){var n,e,s=this,a=t.initDataType,o=t.initData;if(this.debug('"'+t.type+'" event: init data type: "'+a+'"'),null!==o){if("sinf"===a&&this.config.drmSystems[g.KeySystems.FAIRPLAY]){t=(0,y.bin2str)(new Uint8Array(o));try{var r=(0,p.base64Decode)(JSON.parse(t).sinf),i=(0,y.parseSinf)(new Uint8Array(r));if(!i)return;n=i.subarray(8,24),e=g.KeySystems.FAIRPLAY}catch(t){return void this.warn('Failed to parse sinf "encrypted" event message initData')}}else{t=(0,y.parsePssh)(o);if(null===t)return;0===t.version&&t.systemId===g.KeySystemIds.WIDEVINE&&t.data&&(n=t.data.subarray(8,24)),e=(0,g.keySystemIdToKeySystemDomain)(t.systemId)}if(e&&n){for(var l=v.default.hexDump(n),u=this.keyIdToKeySessionPromise,d=this.mediaKeySessions,c=u[l],h=0;h{"use strict";r.r(e),r.d(e,{default:()=>i});var l=r("./src/events.ts"),u=r("./src/utils/logger.ts");const i=function(){function t(t){this.hls=void 0,this.isVideoPlaybackQualityAvailable=!1,this.timer=void 0,this.media=null,this.lastTime=void 0,this.lastDroppedFrames=0,this.lastDecodedFrames=0,this.streamController=void 0,this.hls=t,this.registerListeners()}var e=t.prototype;return e.setStreamController=function(t){this.streamController=t},e.registerListeners=function(){this.hls.on(l.Events.MEDIA_ATTACHING,this.onMediaAttaching,this)},e.unregisterListeners=function(){this.hls.off(l.Events.MEDIA_ATTACHING,this.onMediaAttaching)},e.destroy=function(){this.timer&&clearInterval(this.timer),this.unregisterListeners(),this.isVideoPlaybackQualityAvailable=!1,this.media=null},e.onMediaAttaching=function(t,e){var r=this.hls.config;r.capLevelOnFPSDrop&&(e=e.media instanceof self.HTMLVideoElement?e.media:null,(this.media=e)&&"function"==typeof e.getVideoPlaybackQuality&&(this.isVideoPlaybackQualityAvailable=!0),self.clearInterval(this.timer),this.timer=self.setInterval(this.checkFPSInterval.bind(this),r.fpsDroppedMonitoringPeriod))},e.checkFPS=function(t,e,r){var i,n,s,a,o=performance.now();e&&(this.lastTime&&(a=o-this.lastTime,i=r-this.lastDroppedFrames,n=e-this.lastDecodedFrames,a=1e3*i/a,(s=this.hls).trigger(l.Events.FPS_DROP,{currentDropped:i,currentDecoded:n,totalDroppedFrames:r}),0s.config.fpsDroppedMonitoringThreshold*n&&(a=s.currentLevel,u.logger.warn("drop FPS ratio greater than max allowed value for currentLevel: "+a),0=a)&&(s.trigger(l.Events.FPS_DROP_LEVEL_CAPPING,{level:a-=1,droppedLevel:s.currentLevel}),s.autoLevelCapping=a,this.streamController.nextLevelSwitch()),this.lastTime=o,this.lastDroppedFrames=r,this.lastDecodedFrames=e)},e.checkFPSInterval=function(){var t,e=this.media;e&&(this.isVideoPlaybackQualityAvailable?(t=e.getVideoPlaybackQuality(),this.checkFPS(e,t.totalVideoFrames,t.droppedVideoFrames)):this.checkFPS(e,e.webkitDecodedFrameCount,e.webkitDroppedFrameCount))},t}()},"./src/controller/fragment-finders.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{findFragWithCC:()=>function(t,e){return s.default.search(t,function(t){return t.cce?-1:0})},findFragmentByPDT:()=>function(t,e,r){if(null!==e&&Array.isArray(t)&&t.length&&(0,a.isFiniteNumber)(e)){var i=t[0].programDateTime;if(!(e<(i||0))){i=t[t.length-1].endProgramDateTime;if(!((i||0)<=e)){r=r||0;for(var n=0;nfunction(t,e,r,i){void 0===r&&(r=0);void 0===i&&(i=0);var n=null;t?n=e[t.sn-e[0].sn+1]||null:0===r&&0===e[0].start&&(n=e[0]);if(n&&0===o(r,i,n))return n;e=s.default.search(e,o.bind(null,r,i));return!e||e===t&&n?n:e},fragmentWithinToleranceTest:()=>o,pdtWithinToleranceTest:()=>l});var a=r("./src/polyfills/number.ts"),s=r("./src/utils/binary-search.ts");function o(t,e,r){return void 0===e&&(e=0),r.start<=(t=void 0===t?0:t)&&r.start+r.duration>t?0:(e=Math.min(e,r.duration+(r.deltaPTS||0)),r.start+r.duration-e<=t?1:r.start-e>t&&r.start?-1:0)}function l(t,e,r){e=1e3*Math.min(e,r.duration+(r.deltaPTS||0));return t<(r.endProgramDateTime||0)-e}},"./src/controller/fragment-tracker.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{FragmentState:()=>i,FragmentTracker:()=>s});var i,n=r("./src/events.ts"),u=r("./src/types/loader.ts"),s=((e=i=i||{}).NOT_LOADED="NOT_LOADED",e.APPENDING="APPENDING",e.PARTIAL="PARTIAL",e.OK="OK",function(){function t(t){this.activeFragment=null,this.activeParts=null,this.endListFragments=Object.create(null),this.fragments=Object.create(null),this.timeRanges=Object.create(null),this.bufferPadding=.2,this.hls=void 0,this.hls=t,this._registerListeners()}var e=t.prototype;return e._registerListeners=function(){var t=this.hls;t.on(n.Events.BUFFER_APPENDED,this.onBufferAppended,this),t.on(n.Events.FRAG_BUFFERED,this.onFragBuffered,this),t.on(n.Events.FRAG_LOADED,this.onFragLoaded,this)},e._unregisterListeners=function(){var t=this.hls;t.off(n.Events.BUFFER_APPENDED,this.onBufferAppended,this),t.off(n.Events.FRAG_BUFFERED,this.onFragBuffered,this),t.off(n.Events.FRAG_LOADED,this.onFragLoaded,this)},e.destroy=function(){this._unregisterListeners(),this.fragments=this.endListFragments=this.timeRanges=this.activeFragment=this.activeParts=null},e.getAppendedFrag=function(t,e){if(e===u.PlaylistLevelType.MAIN){var r=this.activeFragment,i=this.activeParts;if(!r)return null;if(i)for(var n=i.length;n--;){var s=i[n],a=s?s.end:r.appendedPTS;if(s.start<=t&&void 0!==a&&t<=a)return 9r.startPTS?a.appendedPTS=Math.max(n,a.appendedPTS||0):a.appendedPTS=r.endPTS}}})},e.onFragBuffered=function(t,e){this.detectPartialFragments(e)},e.hasFragment=function(t){t=d(t);return!!this.fragments[t]},e.removeFragmentsInRange=function(e,r,i){var n=this;Object.keys(this.fragments).forEach(function(t){var t=n.fragments[t];t&&t.buffered&&(t=t.body).type===i&&t.starte&&n.removeFragment(t)})},e.removeFragment=function(t){var e=d(t);t.stats.loaded=0,t.clearElementaryStreamInfo(),t.appendedPTS=void 0,delete this.fragments[e],t.endList&&delete this.endListFragments[t.type]},e.removeAllFragments=function(){this.fragments=Object.create(null),this.endListFragments=Object.create(null),this.activeFragment=null,this.activeParts=null},t}());function l(t){var e;return t.buffered&&((null==(e=t.range.video)?void 0:e.partial)||(null==(e=t.range.audio)?void 0:e.partial))}function d(t){return t.type+"_"+t.level+"_"+t.urlId+"_"+t.sn}},"./src/controller/gap-controller.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{MAX_START_GAP_JUMP:()=>g,SKIP_BUFFER_HOLE_STEP_SECONDS:()=>p,SKIP_BUFFER_RANGE_START:()=>m,STALL_MINIMUM_DURATION_MS:()=>f,default:()=>i});var u=r("./src/utils/buffer-helper.ts"),d=r("./src/errors.ts"),c=r("./src/events.ts"),h=r("./src/utils/logger.ts"),f=250,g=2,p=.1,m=.05,i=function(){function t(t,e,r,i){this.config=void 0,this.media=null,this.fragmentTracker=void 0,this.hls=void 0,this.nudgeRetry=0,this.stallReported=!1,this.stalled=null,this.moved=!1,this.seeking=!1,this.config=t,this.media=e,this.fragmentTracker=r,this.hls=i}var e=t.prototype;return e.destroy=function(){this.media=null,this.hls=this.fragmentTracker=null},e.poll=function(t,e){var r=this.config,i=this.media,n=this.stalled;if(null!==i){var s=i.currentTime,a=i.seeking,o=this.seeking&&!a,l=!this.seeking&&a;if(this.seeking=a,s!==t)this.moved=!0,null!==n&&(this.stallReported&&(t=self.performance.now()-n,h.logger.warn("playback not stuck anymore @"+s+", after "+Math.round(t)+"ms"),this.stallReported=!1),this.stalled=null,this.nudgeRetry=0);else if((l||o)&&(this.stalled=null),!(i.paused&&!a||i.ended||0===i.playbackRate)&&u.BufferHelper.getBuffered(i).length){t=u.BufferHelper.bufferInfo(i,s,0),l=0g,e=!o||e&&e.start<=s||gr.maxBufferHole&&e>1e3*r.highBufferWatchdogPeriod&&(h.logger.warn("Trying to nudge playhead over buffer-hole"),this.stalled=null,this._tryNudgeBuffer())}},e._reportStall=function(t){var e=this.hls,r=this.media;!this.stallReported&&r&&(this.stallReported=!0,h.logger.warn("Playback stalling at @"+r.currentTime+" due to low buffer ("+JSON.stringify(t)+")"),e.trigger(c.Events.ERROR,{type:d.ErrorTypes.MEDIA_ERROR,details:d.ErrorDetails.BUFFER_STALLED_ERROR,fatal:!1,buffer:t.len}))},e._trySkipBufferHole=function(t){var e=this.config,r=this.hls,i=this.media;if(null!==i)for(var n=i.currentTime,s=0,a=u.BufferHelper.getBuffered(i),o=0;o=s&&n{"use strict";r.r(e),r.d(e,{default:()=>n});var o=r("./src/polyfills/number.ts"),i=r("./src/events.ts"),l=r("./src/utils/texttrack-utils.ts"),p=r("./src/demux/id3.ts"),T=r("./src/loader/date-range.ts"),S=r("./src/types/demuxer.ts");function b(){return self.WebKitDataCue||self.VTTCue||self.TextTrackCue}var L=function(){var t=b();try{new t(0,Number.POSITIVE_INFINITY,"")}catch(t){return Number.MAX_VALUE}return Number.POSITIVE_INFINITY}();function D(t,e){return t.getTime()/1e3-e}const n=function(){function t(t){this.hls=void 0,this.id3Track=null,this.media=null,this.dateRangeCuesAppended={},this.hls=t,this._registerListeners()}var e=t.prototype;return e.destroy=function(){this._unregisterListeners(),this.id3Track=null,this.media=null,this.dateRangeCuesAppended={},this.hls=null},e._registerListeners=function(){var t=this.hls;t.on(i.Events.MEDIA_ATTACHED,this.onMediaAttached,this),t.on(i.Events.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(i.Events.MANIFEST_LOADING,this.onManifestLoading,this),t.on(i.Events.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),t.on(i.Events.BUFFER_FLUSHING,this.onBufferFlushing,this),t.on(i.Events.LEVEL_UPDATED,this.onLevelUpdated,this)},e._unregisterListeners=function(){var t=this.hls;t.off(i.Events.MEDIA_ATTACHED,this.onMediaAttached,this),t.off(i.Events.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(i.Events.MANIFEST_LOADING,this.onManifestLoading,this),t.off(i.Events.FRAG_PARSING_METADATA,this.onFragParsingMetadata,this),t.off(i.Events.BUFFER_FLUSHING,this.onBufferFlushing,this),t.off(i.Events.LEVEL_UPDATED,this.onLevelUpdated,this)},e.onMediaAttached=function(t,e){this.media=e.media},e.onMediaDetaching=function(){this.id3Track&&((0,l.clearCurrentCues)(this.id3Track),this.id3Track=null,this.media=null,this.dateRangeCuesAppended={})},e.onManifestLoading=function(){this.dateRangeCuesAppended={}},e.createTrack=function(t){t=this.getID3Track(t.textTracks);return t.mode="hidden",t},e.getID3Track=function(t){if(this.media){for(var e=0;ei.startDate&&t.push(r),t},[]).sort(function(t,e){return t.startDate.getTime()-e.startDate.getTime()})[0])&&(o=D(l.startDate,y),s=!0),Object.keys(i.attr)),d=0;d{"use strict";r.r(e),r.d(e,{default:()=>i});var n=r("./src/errors.ts"),s=r("./src/events.ts"),a=r("./src/utils/logger.ts");function o(t,e){for(var r=0;r{"use strict";r.r(e),r.d(e,{default:()=>i});var f=r("./src/types/level.ts"),g=r("./src/events.ts"),p=r("./src/errors.ts"),m=r("./src/utils/codecs.ts"),v=r("./src/controller/level-helper.ts"),e=r("./src/controller/base-playlist-controller.ts"),d=r("./src/types/loader.ts");function n(){return(n=Object.assign?Object.assign.bind():function(t){for(var e=1;e(e.attrs["HDCP-LEVEL"]||"")?1:-1:t.bitrate!==e.bitrate?t.bitrate-e.bitrate:t.attrs.SCORE!==e.attrs.SCORE?t.attrs.decimalFloatingPoint("SCORE")-e.attrs.decimalFloatingPoint("SCORE"):l&&t.height!==e.height?t.height-e.height:0}),this._levels=n;for(var c=0;cthis.hls.config.fragLoadingMaxRetry))&&(n=s);break;case p.ErrorDetails.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:var l=i.attrs["HDCP-LEVEL"];l&&(this.hls.maxHdcpLevel=f.HdcpLevels[f.HdcpLevels.indexOf(l)-1],this.warn('Restricting playback to HDCP-LEVEL of "'+this.hls.maxHdcpLevel+'" or lower'));case p.ErrorDetails.FRAG_PARSING_ERROR:case p.ErrorDetails.KEY_SYSTEM_NO_SESSION:n=(null==(s=e.frag)?void 0:s.type)===d.PlaylistLevelType.MAIN?e.frag.level:this.currentLevelIndex,e.levelRetry=!1;break;case p.ErrorDetails.LEVEL_LOAD_ERROR:case p.ErrorDetails.LEVEL_LOAD_TIMEOUT:r&&(r.deliveryDirectives&&(o=!1),n=r.level),a=!0;break;case p.ErrorDetails.REMUX_ALLOC_ERROR:n=null!=(l=e.level)?l:this.currentLevelIndex,a=!0}void 0!==n&&this.recoverLevel(e,n,a,o)}}},i.recoverLevel=function(t,e,r,i){var n=t.details,s=this._levels[e];if(s.loadError++,r){if(!this.retryLoadingOrFail(t))return void(this.currentLevelIndex=-1);t.levelRetry=!0}if(i){r=s.url.length;if(1=e.length){var r=t<0;if(this.hls.trigger(g.Events.ERROR,{type:p.ErrorTypes.OTHER_ERROR,details:p.ErrorDetails.LEVEL_SWITCH_ERROR,level:t,fatal:r,reason:"invalid level idx"}),r)return;t=Math.min(t,e.length-1)}this.clearTimer();var r=this.currentLevelIndex,i=e[r],e=e[t],r=(this.log("switching to level "+t+" from "+r),n({},e,{level:this.currentLevelIndex=t,maxBitrate:e.maxBitrate,uri:e.uri,urlId:e.urlId})),t=(delete r._urlId,this.hls.trigger(g.Events.LEVEL_SWITCHING,r),e.details);t&&!t.live||(r=this.switchParams(e.uri,null==i?void 0:i.details),this.loadPlaylist(r))}}},{key:"manualLevel",get:function(){return this.manualLevelIndex},set:function(t){this.manualLevelIndex=t,void 0===this._startLevel&&(this._startLevel=t),-1!==t&&(this.level=t)}},{key:"firstLevel",get:function(){return this._firstLevel},set:function(t){this._firstLevel=t}},{key:"startLevel",get:function(){var t;return void 0===this._startLevel?void 0!==(t=this.hls.config.startLevel)?t:this._firstLevel:this._startLevel},set:function(t){this._startLevel=t}},{key:"nextLoadLevel",get:function(){return-1!==this.manualLevelIndex?this.manualLevelIndex:this.hls.nextAutoLevel},set:function(t){this.level=t,-1===this.manualLevelIndex&&(this.hls.nextAutoLevel=t)}}])&&s(e.prototype,i),r&&s(e,r),Object.defineProperty(e,"prototype",{writable:!1}),t}(e.default)},"./src/controller/level-helper.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{addGroupId:()=>function(t,e,r){switch(e){case"audio":t.audioGroupIds||(t.audioGroupIds=[]),t.audioGroupIds.push(r);break;case"text":t.textGroupIds||(t.textGroupIds=[]),t.textGroupIds.push(r)}},addSliding:()=>i,adjustSliding:()=>S,assignTrackIdsByGroup:()=>function(t){var r={};t.forEach(function(t){var e=t.groupId||"";t.id=r[e]=r[e]||0,r[e]++})},computeReloadInterval:()=>function(t,e){void 0===e&&(e=1/0);var r=1e3*t.targetduration;t.updated?(t=t.fragments,t.length&&e<4*r&&(e=1e3*t[t.length-1].duration)function(t,e,r){if(t&&t.details){var t=t.details,i=t.fragments[e-t.startSN];if(i)return i;if((i=t.fragmentHint)&&i.sn===e)return i;if(efunction(t,e,r){if(t&&t.details){var i=t.details.partList;if(i)for(var n=i.length;n--;){var s=i[n];if(s.index===r&&s.fragment.sn===e)return s}}return null},mapFragmentIntersection:()=>T,mapPartIntersection:()=>E,mergeDetails:()=>function(t,r){for(var i=null,e=t.fragments,n=e.length-1;0<=n;n--){var s=e[n].initSegment;if(s){i=s;break}}t.fragmentHint&&delete t.fragmentHint.endPTS;var a,o=0;T(t,r,function(t,e){t.relurl&&(o=t.cc-e.cc),(0,f.isFiniteNumber)(t.startPTS)&&(0,f.isFiniteNumber)(t.endPTS)&&(e.start=e.startPTS=t.startPTS,e.startDTS=t.startDTS,e.appendedPTS=t.appendedPTS,e.maxStartPTS=t.maxStartPTS,e.endPTS=t.endPTS,e.endDTS=t.endDTS,e.minEndPTS=t.minEndPTS,e.duration=t.endPTS-t.startPTS,e.duration&&(a=e),r.PTSKnown=r.alignedSliding=!0),e.elementaryStreams=t.elementaryStreams,e.loader=t.loader,e.stats=t.stats,e.urlId=t.urlId,t.initSegment&&(e.initSegment=t.initSegment,i=t.initSegment)}),i&&(r.fragmentHint?r.fragments.concat(r.fragmentHint):r.fragments).forEach(function(t){var e;t.initSegment&&t.initSegment.relurl!==(null==(e=i)?void 0:e.relurl)||(t.initSegment=i)});if(r.skippedSegments)if(r.deltaUpdateFailed=r.fragments.some(function(t){return!t}),r.deltaUpdateFailed){g.logger.warn("[level-helper] Previous playlist missing segments skipped in delta playlist");for(var l=r.skippedSegments;l--;)r.fragments.shift();r.startSN=r.fragments[0].sn,r.startCC=r.fragments[0].cc}else r.canSkipDateRanges&&(r.dateRanges=function(t,r,e){var i=m({},t);e&&e.forEach(function(t){delete i[t]});return Object.keys(r).forEach(function(t){var e=new p.DateRange(r[t].attr,i[t]);e.isValid?i[t]=e:g.logger.warn('Ignoring invalid Playlist Delta Update DATERANGE tag: "'+JSON.stringify(r[t].attr)+'"')}),i}(t.dateRanges,r.dateRanges,r.recentlyRemovedDateranges));var u=r.fragments;if(o){g.logger.warn("discontinuity sliding from playlist, take drift into account");for(var d=0;dy,updatePTS:()=>function(t,e,r){e=t[e],t=t[r];v(e,t)}});var f=r("./src/polyfills/number.ts"),g=r("./src/utils/logger.ts"),p=r("./src/loader/date-range.ts");function m(){return(m=Object.assign?Object.assign.bind():function(t){for(var e=1;et.sn?(r=i-t.start,t):(r=t.start-i,e)).duration!==r&&(i.duration=r)):e.sn>t.sn?t.cc===e.cc&&t.minEndPTS?e.start=t.start+(t.minEndPTS-t.start):e.start=t.start+t.duration:e.start=Math.max(t.start-e.duration,0)}function y(t,e,r,i,n,s){i-r<=0&&(g.logger.warn("Fragment should have a positive duration",e),i=r+e.duration,s=n+e.duration);var a,o=r,l=i,u=e.startPTS,d=e.endPTS,c=((0,f.isFiniteNumber)(u)&&(c=Math.abs(u-r),(0,f.isFiniteNumber)(e.deltaPTS)?e.deltaPTS=Math.max(c,e.deltaPTS):e.deltaPTS=c,o=Math.max(r,u),r=Math.min(r,u),n=Math.min(n,e.startDTS),l=Math.min(i,d),i=Math.max(i,d),s=Math.max(s,e.endDTS)),e.duration=i-r,r-e.start),u=(e.start=e.startPTS=r,e.maxStartPTS=o,e.startDTS=n,e.endPTS=i,e.minEndPTS=l,e.endDTS=s,e.sn);if(!t||ut.endSN)return 0;var d=u-t.startSN,h=t.fragments;for(h[d]=e,a=d;0=t.length||i(e,t[r].start)}function i(t,e){if(e){for(var r=t.fragments,i=t.skippedSegments;i{"use strict";r.r(e),r.d(e,{default:()=>i});var m=r("./src/polyfills/number.ts"),v=r("./src/controller/base-stream-controller.ts"),s=r("./src/is-supported.ts"),y=r("./src/events.ts"),a=r("./src/utils/buffer-helper.ts"),o=r("./src/controller/fragment-tracker.ts"),c=r("./src/types/loader.ts"),E=r("./src/loader/fragment.ts"),h=r("./src/demux/transmuxer-interface.ts"),f=r("./src/types/transmuxer.ts"),l=r("./src/controller/gap-controller.ts"),u=r("./src/errors.ts");function d(t,e){for(var r=0;ri.end&&(this.backtrackFragment=null),t=this.backtrackFragment?this.backtrackFragment.start:i.end,s=this.getNextFragment(t,n),this.couldBacktrack&&!this.fragPrevious&&s&&"initSegment"!==s.sn&&this.fragmentTracker.getState(s)!==o.FragmentState.OK?(r=(null!=(e=this.backtrackFragment)?e:s).sn-n.startSN,(e=n.fragments[r-1])&&s.cc===e.cc&&this.fragmentTracker.removeFragment(s=e)):this.backtrackFragment&&i.len&&(this.backtrackFragment=null),s&&this.fragmentTracker.getState(s)===o.FragmentState.OK&&this.nextLoadPosition>t&&((e=((r=this.audioOnly&&!this.altAudio?E.ElementaryStreamTypes.AUDIO:E.ElementaryStreamTypes.VIDEO)===E.ElementaryStreamTypes.VIDEO?this.videoBuffer:this.mediaBuffer)||this.media)&&this.afterBufferFlushed(e,r,c.PlaylistLevelType.MAIN),s=this.getNextFragment(this.nextLoadPosition,n)),s&&(!s.initSegment||s.initSegment.data||this.bitrateTest||(s=s.initSegment),this.loadFragment(s,n,t))))))},i.loadFragment=function(t,e,r){var i=this.fragmentTracker.getState(t);this.fragCurrent=t,i===o.FragmentState.NOT_LOADED?"initSegment"===t.sn?this._loadInitSegment(t,e):this.bitrateTest?(this.log("Fragment "+t.sn+" of level "+t.level+" is being downloaded to test bitrate and will not be buffered"),this._loadBitrateTestFrag(t,e)):(this.startFragRequested=!0,n.prototype.loadFragment.call(this,t,e,r)):i===o.FragmentState.APPENDING?this.reduceMaxBufferLength(t.duration)&&this.fragmentTracker.removeFragment(t):0===(null==(e=this.media)?void 0:e.buffered.length)&&this.fragmentTracker.removeAllFragments()},i.getAppendedFrag=function(t){t=this.fragmentTracker.getAppendedFrag(t,c.PlaylistLevelType.MAIN);return t&&"fragment"in t?t.fragment:t},i.getBufferedFrag=function(t){return this.fragmentTracker.getBufferedFrag(t,c.PlaylistLevelType.MAIN)},i.followingBufferedFrag=function(t){return t?this.getBufferedFrag(t.end+.5):null},i.immediateLevelSwitch=function(){this.abortCurrentFrag(),this.flushMainBuffer(0,Number.POSITIVE_INFINITY)},i.nextLevelSwitch=function(){var t,e=this.levels,r=this.media;null!=r&&r.readyState&&((t=this.getAppendedFrag(r.currentTime))&&1{"use strict";r.r(e),r.d(e,{SubtitleStreamController:()=>i});var a=r("./src/events.ts"),l=r("./src/utils/buffer-helper.ts"),u=r("./src/controller/fragment-finders.ts"),o=r("./src/utils/discontinuities.ts"),d=r("./src/controller/level-helper.ts"),c=r("./src/controller/fragment-tracker.ts"),h=r("./src/controller/base-stream-controller.ts"),f=r("./src/types/loader.ts"),s=r("./src/types/level.ts");function g(t,e){for(var r=0;r=i[a].start&&s<=i[a].end){n=i[a];break}e=r.start+r.duration;n?n.end=e:i.push(n={start:s,end:e}),this.fragmentTracker.fragBuffered(r)}}},n.onBufferFlushing=function(t,e){var r,i,n,s=e.startOffset,a=e.endOffset;0===s&&a!==Number.POSITIVE_INFINITY&&(r=this.currentTrackId,(i=this.levels).length)&&i[r]&&i[r].details&&((n=a-i[r].details.targetduration)<=0||(e.endOffsetSubtitles=Math.max(0,n),this.tracksBuffered.forEach(function(t){for(var e=0;e=n.length||e!==i)&&s){this.mediaBuffer=this.mediaBufferTimeRanges;n=0;if(r.live||null!=(i=s.details)&&i.live){i=this.mainDetails;if(r.deltaUpdateFailed||!i)return;var a=i.fragments[0];s.details?0===(n=this.alignPlaylists(r,s.details))&&a&&(n=a.start,(0,d.addSliding)(r,n)):r.hasProgramDateTime&&i.hasProgramDateTime?((0,o.alignMediaPlaylistByPDT)(r,i),n=r.fragments[0].start):a&&(n=a.start,(0,d.addSliding)(r,n))}s.details=r,this.levelLastLoaded=e,this.startFragRequested||!this.mainDetails&&r.live||this.setStartPosition(s.details,n),this.tick(),r.live&&!this.fragCurrent&&this.media&&this.state===h.State.IDLE&&!(0,u.findFragmentByPTS)(null,r.fragments,this.media.currentTime,0)&&(this.warn("Subtitle playlist not aligned with playback"),s.details=void 0)}}},n._handleFragmentLoadComplete=function(t){var r,e=this,i=t.frag,t=t.payload,n=i.decryptdata,s=this.hls;this.fragContextChanged(i)||t&&0>>=0))throw new DOMException("Failed to execute '"+t+"' on 'TimeRanges': The index provided ("+e+") is greater than the maximum bound ("+r+")");return i[e][t]}this.buffered={get length(){return i.length},end:function(t){return e("end",t,i.length)},start:function(t){return e("start",t,i.length)}}}},"./src/controller/subtitle-track-controller.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});var l=r("./src/events.ts"),s=r("./src/utils/texttrack-utils.ts"),e=r("./src/controller/base-playlist-controller.ts"),a=r("./src/types/loader.ts");function o(t,e){for(var r=0;r=o.length||(this.clearTimer(),r=o[t],this.log("Switching to subtitle track "+t),this.trackId=t,r?(o=r.id,i=r.groupId,n=r.name,s=r.type,a=r.url,this.hls.trigger(l.Events.SUBTITLE_TRACK_SWITCH,{id:o,groupId:void 0===i?"":i,name:n,type:s,url:a}),o=this.switchParams(r.url,null==e?void 0:e.details),this.loadPlaylist(o)):this.hls.trigger(l.Events.SUBTITLE_TRACK_SWITCH,{id:t}))):this.queuedDefaultTrack=t},i.onTextTracksChanged=function(){if(this.useTextTrackPolling||self.clearInterval(this.subtitlePollingInterval),this.media&&this.hls.config.renderTextTracksNatively){for(var t=-1,e=d(this.media.textTracks),r=0;r{"use strict";r.r(e),r.d(e,{TimelineController:()=>i});var l=r("./src/polyfills/number.ts"),h=r("./src/events.ts"),s=r("./src/utils/cea-608-parser.ts"),a=r("./src/utils/output-filter.ts"),o=r("./src/utils/webvtt-parser.ts"),u=r("./src/utils/texttrack-utils.ts"),d=r("./src/utils/imsc1-ttml-parser.ts"),c=r("./src/utils/mp4-tools.ts"),f=r("./src/types/loader.ts"),g=r("./src/utils/logger.ts"),i=function(){function t(t){var e,r,i,n;this.hls=void 0,this.media=null,this.config=void 0,this.enabled=!0,this.Cues=void 0,this.textTracks=[],this.tracks=[],this.initPTS=[],this.timescale=[],this.unparsedVttFrags=[],this.captionsTracks={},this.nonNativeCaptionsTracks={},this.cea608Parser1=void 0,this.cea608Parser2=void 0,this.lastSn=-1,this.lastPartIndex=-1,this.prevCC=-1,this.vttCCs=p(),this.captionsProperties=void 0,this.hls=t,this.config=t.config,this.Cues=t.config.cueHandler,this.captionsProperties={textTrack1:{label:this.config.captionsTextTrack1Label,languageCode:this.config.captionsTextTrack1LanguageCode},textTrack2:{label:this.config.captionsTextTrack2Label,languageCode:this.config.captionsTextTrack2LanguageCode},textTrack3:{label:this.config.captionsTextTrack3Label,languageCode:this.config.captionsTextTrack3LanguageCode},textTrack4:{label:this.config.captionsTextTrack4Label,languageCode:this.config.captionsTextTrack4LanguageCode}},this.config.enableCEA708Captions&&(e=new a.default(this,"textTrack1"),r=new a.default(this,"textTrack2"),i=new a.default(this,"textTrack3"),n=new a.default(this,"textTrack4"),this.cea608Parser1=new s.default(1,e,r),this.cea608Parser2=new s.default(3,i,n)),t.on(h.Events.MEDIA_ATTACHING,this.onMediaAttaching,this),t.on(h.Events.MEDIA_DETACHING,this.onMediaDetaching,this),t.on(h.Events.MANIFEST_LOADING,this.onManifestLoading,this),t.on(h.Events.MANIFEST_LOADED,this.onManifestLoaded,this),t.on(h.Events.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.on(h.Events.FRAG_LOADING,this.onFragLoading,this),t.on(h.Events.FRAG_LOADED,this.onFragLoaded,this),t.on(h.Events.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),t.on(h.Events.FRAG_DECRYPTED,this.onFragDecrypted,this),t.on(h.Events.INIT_PTS_FOUND,this.onInitPtsFound,this),t.on(h.Events.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),t.on(h.Events.BUFFER_FLUSHING,this.onBufferFlushing,this)}var e=t.prototype;return e.destroy=function(){var t=this.hls;t.off(h.Events.MEDIA_ATTACHING,this.onMediaAttaching,this),t.off(h.Events.MEDIA_DETACHING,this.onMediaDetaching,this),t.off(h.Events.MANIFEST_LOADING,this.onManifestLoading,this),t.off(h.Events.MANIFEST_LOADED,this.onManifestLoaded,this),t.off(h.Events.SUBTITLE_TRACKS_UPDATED,this.onSubtitleTracksUpdated,this),t.off(h.Events.FRAG_LOADING,this.onFragLoading,this),t.off(h.Events.FRAG_LOADED,this.onFragLoaded,this),t.off(h.Events.FRAG_PARSING_USERDATA,this.onFragParsingUserdata,this),t.off(h.Events.FRAG_DECRYPTED,this.onFragDecrypted,this),t.off(h.Events.INIT_PTS_FOUND,this.onInitPtsFound,this),t.off(h.Events.SUBTITLE_TRACKS_CLEARED,this.onSubtitleTracksCleared,this),t.off(h.Events.BUFFER_FLUSHING,this.onBufferFlushing,this),this.hls=this.config=this.cea608Parser1=this.cea608Parser2=null},e.addCues=function(t,e,r,i,n){for(var s,a,o,l=!1,u=n.length;u--;){var d=n[u],c=(s=d[0],c=d[1],a=e,Math.min(c,r)-Math.max(s,a));if(0<=c&&(d[0]=Math.min(d[0],e),d[1]=Math.max(d[1],r),l=!0,.5{"use strict";r.r(e),r.d(e,{default:()=>i});var i=function(){function t(t,e){this.subtle=void 0,this.aesIV=void 0,this.subtle=t,this.aesIV=e}return t.prototype.decrypt=function(t,e){return this.subtle.decrypt({name:"AES-CBC",iv:this.aesIV},e,t)},t}()},"./src/crypt/aes-decryptor.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>n,removePadding:()=>function(t){var e=t.byteLength,r=e&&new DataView(t.buffer).getUint8(e-1);if(r)return(0,i.sliceUint8)(t,0,e-r);return t}});var i=r("./src/utils/typed-array.ts");var n=function(){function t(){this.rcon=[0,1,2,4,8,16,32,64,128,27,54],this.subMix=[new Uint32Array(256),new Uint32Array(256),new Uint32Array(256),new Uint32Array(256)],this.invSubMix=[new Uint32Array(256),new Uint32Array(256),new Uint32Array(256),new Uint32Array(256)],this.sBox=new Uint32Array(256),this.invSBox=new Uint32Array(256),this.key=new Uint32Array(0),this.ksRows=0,this.keySize=0,this.keySchedule=void 0,this.invKeySchedule=void 0,this.initTable()}var e=t.prototype;return e.uint8ArrayToUint32Array_=function(t){for(var e=new DataView(t),r=new Uint32Array(4),i=0;i<4;i++)r[i]=e.getUint32(4*i);return r},e.initTable=function(){for(var t=this.sBox,e=this.invSBox,r=this.subMix,i=r[0],n=r[1],s=r[2],a=r[3],r=this.invSubMix,o=r[0],l=r[1],u=r[2],d=r[3],c=new Uint32Array(256),h=0,f=0,g=0,g=0;g<256;g++)c[g]=g<128?g<<1:g<<1^283;for(g=0;g<256;g++){var p=f^f<<1^f<<2^f<<3^f<<4,m=(t[h]=p=p>>>8^255&p^99,c[e[p]=h]),v=c[m],y=c[v],E=257*c[p]^16843008*p;i[h]=E<<24|E>>>8,n[h]=E<<16|E>>>16,s[h]=E<<8|E>>>24,a[h]=E,o[p]=(E=16843009*y^65537*v^257*m^16843008*h)<<24|E>>>8,l[p]=E<<16|E>>>16,u[p]=E<<8|E>>>24,d[p]=E,h?(h=m^c[c[c[y^m]]],f^=c[c[f]]):h=f=1}},e.expandKey=function(t){for(var e=this.uint8ArrayToUint32Array_(t),r=!0,i=0;i{"use strict";r.r(e),r.d(e,{default:()=>i});var a=r("./src/crypt/aes-crypto.ts"),o=r("./src/crypt/fast-aes-key.ts"),l=r("./src/crypt/aes-decryptor.ts"),u=r("./src/utils/logger.ts"),d=r("./src/utils/mp4-tools.ts"),c=r("./src/utils/typed-array.ts"),i=function(){function t(t,e){e=(void 0===e?{}:e).removePKCS7Padding,e=void 0===e||e;if(this.logEnabled=!0,this.removePKCS7Padding=void 0,this.subtle=null,this.softwareDecrypter=null,this.key=null,this.fastAesKey=null,this.remainderData=null,this.currentIV=null,this.currentResult=null,this.useSoftware=void 0,this.useSoftware=t.enableSoftwareAES,this.removePKCS7Padding=e)try{var r=self.crypto;r&&(this.subtle=r.subtle||r.webkitSubtle)}catch(t){}null===this.subtle&&(this.useSoftware=!0)}var e=t.prototype;return e.destroy=function(){this.subtle=null,this.softwareDecrypter=null,this.key=null,this.fastAesKey=null,this.remainderData=null,this.currentIV=null,this.currentResult=null},e.isSync=function(){return this.useSoftware},e.flush=function(){var t=this.currentResult,e=this.remainderData;return!t||e?(this.reset(),null):(e=new Uint8Array(t),this.reset(),this.removePKCS7Padding?(0,l.removePadding)(e):e)},e.reset=function(){this.currentResult=null,this.currentIV=null,this.remainderData=null,this.softwareDecrypter&&(this.softwareDecrypter=null)},e.decrypt=function(i,n,s){var a=this;return this.useSoftware?new Promise(function(t,e){a.softwareDecrypt(new Uint8Array(i),n,s);var r=a.flush();r?t(r.buffer):e(new Error("[softwareDecrypt] Failed to decrypt data"))}):this.webCryptoDecrypt(new Uint8Array(i),n,s)},e.softwareDecrypt=function(t,e,r){var i=this.currentIV,n=this.currentResult,s=this.remainderData,s=(this.logOnce("JS AES decrypt"),s&&(t=(0,d.appendUint8Array)(s,t),this.remainderData=null),this.getValidChunk(t));if(!s.length)return null;i&&(r=i);t=this.softwareDecrypter,(t=t||(this.softwareDecrypter=new l.default)).expandKey(e),i=n;return this.currentResult=t.decrypt(s.buffer,0,r),this.currentIV=(0,c.sliceUint8)(s,-16).buffer,i||null},e.webCryptoDecrypt=function(e,r,i){var n=this,s=this.subtle;return this.key===r&&this.fastAesKey||(this.key=r,this.fastAesKey=new o.default(s,r)),this.fastAesKey.expandKey().then(function(t){return s?(n.logOnce("WebCrypto AES decrypt"),new a.default(s,new Uint8Array(i)).decrypt(e.buffer,t)):Promise.reject(new Error("web crypto not initialized"))}).catch(function(t){return u.logger.warn("[decrypter]: WebCrypto Error, disable WebCrypto API, "+t.name+": "+t.message),n.onWebCryptoError(e,r,i)})},e.onWebCryptoError=function(t,e,r){this.useSoftware=!0,this.logEnabled=!0,this.softwareDecrypt(t,e,r);t=this.flush();if(t)return t.buffer;throw new Error("WebCrypto and softwareDecrypt: failed to decrypt data")},e.getValidChunk=function(t){var e=t,r=t.length-t.length%16;return r!==t.length&&(e=(0,c.sliceUint8)(t,0,r),this.remainderData=(0,c.sliceUint8)(t,r)),e},e.logOnce=function(t){this.logEnabled&&(u.logger.log("[decrypter]: "+t),this.logEnabled=!1)},t}()},"./src/crypt/fast-aes-key.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});var i=function(){function t(t,e){this.subtle=void 0,this.key=void 0,this.subtle=t,this.key=e}return t.prototype.expandKey=function(){return this.subtle.importKey("raw",this.key,{name:"AES-CBC"},!1,["encrypt","decrypt"])},t}()},"./src/demux/aacdemuxer.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>n});var e=r("./src/demux/base-audio-demuxer.ts"),i=r("./src/demux/adts.ts"),s=r("./src/utils/logger.ts"),a=r("./src/demux/id3.ts");function o(t,e){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}const n=function(n){var t;function e(t,e){var r=n.call(this)||this;return r.observer=void 0,r.config=void 0,r.observer=t,r.config=e,r}t=n,(r=e).prototype=Object.create(t.prototype),o(r.prototype.constructor=r,t);var r=e.prototype;return r.resetInitSegment=function(t,e,r,i){n.prototype.resetInitSegment.call(this,t,e,r,i),this._audioTrack={container:"audio/adts",type:"audio",id:2,pid:-1,sequenceNumber:0,segmentCodec:"aac",samples:[],manifestCodec:e,duration:i,inputTimeScale:9e4,dropped:0}},e.probe=function(t){if(t)for(var e=(a.getID3Data(t,0)||[]).length,r=t.length;e{"use strict";r.r(e),r.d(e,{appendFrame:()=>function(t,e,r,i,n){var s,a=u(t.samplerate),i=i+n*a,n=d(e,r);{var o;if(n)return a=n.frameLength,n=n.headerLength,a=n+a,(o=Math.max(0,r+a-e.length))?(s=new Uint8Array(a-n)).set(e.subarray(r+n,e.length),0):s=e.subarray(r+n,r+a),n={unit:s,pts:i},o||t.samples.push(n),{sample:n,length:a,missing:o}}t=e.length-r;return(s=new Uint8Array(t)).set(e.subarray(r,e.length),0),{sample:{unit:s,pts:i},length:t,missing:-1}},canGetFrameLength:()=>o,canParse:()=>function(t,e){return o(t,e)&&i(t,e)&&a(t,e)<=t.length-e},getAudioConfig:()=>s,getFrameDuration:()=>u,getFullFrameLength:()=>a,getHeaderLength:()=>n,initTrackConfig:()=>function(t,e,r,i,n){t.samplerate||(e=s(e,r,i,n))&&(t.config=e.config,t.samplerate=e.samplerate,t.channelCount=e.channelCount,t.codec=e.codec,t.manifestCodec=e.manifestCodec,c.logger.log("parsed codec:"+t.codec+", rate:"+e.samplerate+", channels:"+e.channelCount))},isHeader:()=>l,isHeaderPattern:()=>i,parseFrameHeader:()=>d,probe:()=>function(t,e){{var r,i;if(l(t,e))return i=n(t,e),!(e+i>=t.length||(r=a(t,e))<=i)&&((i=e+r)===t.length||l(t,i))}return!1}});var c=r("./src/utils/logger.ts"),h=r("./src/errors.ts"),f=r("./src/events.ts");function s(t,e,r,i){var n,s,a=navigator.userAgent.toLowerCase(),o=i,l=[96e3,88200,64e3,48e3,44100,32e3,24e3,22050,16e3,12e3,11025,8e3,7350],u=1+((192&e[r+2])>>>6),d=(60&e[r+2])>>>2;if(!(l.length-1>>6,c.logger.log("manifest codec:"+i+", ADTS type:"+u+", samplingIndex:"+d),e=/firefox/i.test(a)?6<=d?(u=5,s=new Array(4),d-3):(u=2,s=new Array(2),d):-1!==a.indexOf("android")?(u=2,s=new Array(2),d):(u=5,s=new Array(4),i&&(-1!==i.indexOf("mp4a.40.29")||-1!==i.indexOf("mp4a.40.5"))||!i&&6<=d?d-3:((i&&-1!==i.indexOf("mp4a.40.2")&&(6<=d&&1==n||/vivaldi/i.test(a))||!i&&1==n)&&(u=2,s=new Array(2)),d)),s[0]=u<<3,s[0]|=(14&d)>>1,s[1]|=(1&d)<<7,s[1]|=n<<3,5===u&&(s[1]|=(14&e)>>1,s[2]=(1&e)<<7,s[2]|=8,s[3]=0),{config:s,samplerate:l[d],channelCount:n,codec:"mp4a.40."+u,manifestCodec:o};t.trigger(f.Events.ERROR,{type:h.ErrorTypes.MEDIA_ERROR,details:h.ErrorDetails.FRAG_PARSING_ERROR,fatal:!0,reason:"invalid ADTS sampling index:"+d})}function i(t,e){return 255===t[e]&&240==(246&t[e+1])}function n(t,e){return 1&t[e+1]?7:9}function a(t,e){return(3&t[e+3])<<11|t[e+4]<<3|(224&t[e+5])>>>5}function o(t,e){return e+5{"use strict";r.r(e),r.d(e,{default:()=>i,initPTSFn:()=>m});var d=r("./src/polyfills/number.ts"),c=r("./src/demux/id3.ts"),h=r("./src/types/demuxer.ts"),f=r("./src/demux/dummy-demuxed-track.ts"),g=r("./src/utils/mp4-tools.ts"),p=r("./src/utils/typed-array.ts"),m=function(t,e,r){return(0,d.isFiniteNumber)(t)?90*t:9e4*e+(r||0)};const i=function(){function t(){this._audioTrack=void 0,this._id3Track=void 0,this.frameIndex=0,this.cachedData=null,this.basePTS=null,this.initPTS=null,this.lastPTS=null}var e=t.prototype;return e.resetInitSegment=function(t,e,r,i){this._id3Track={type:"id3",id:3,pid:-1,inputTimeScale:9e4,sequenceNumber:0,samples:[],dropped:0}},e.resetTimeStamp=function(t){this.initPTS=t,this.resetContiguity()},e.resetContiguity=function(){this.basePTS=null,this.lastPTS=null,this.frameIndex=0},e.canParse=function(t,e){return!1},e.appendFrame=function(t,e,r){},e.demux=function(t,e){this.cachedData&&(t=(0,g.appendUint8Array)(this.cachedData,t),this.cachedData=null);var r,i,n=c.getID3Data(t,0),s=n?n.length:0,a=this._audioTrack,o=this._id3Track,l=n?c.getTimeStamp(n):void 0,u=t.length;for((null===this.basePTS||0===this.frameIndex&&(0,d.isFiniteNumber)(l))&&(this.basePTS=m(l,e,this.initPTS),this.lastPTS=this.basePTS),null===this.lastPTS&&(this.lastPTS=this.basePTS),n&&0{"use strict";r.r(e),r.d(e,{default:()=>i});var i=function(){function t(){this.chunks=[],this.dataLength=0}var e=t.prototype;return e.push=function(t){this.chunks.push(t),this.dataLength+=t.length},e.flush=function(){var t=this.chunks,e=this.dataLength;return t.length?(t=1===t.length?t[0]:function(t,e){for(var r=new Uint8Array(e),i=0,n=0;n{"use strict";r.r(e),r.d(e,{dummyTrack:()=>function(t,e){void 0===t&&(t="");void 0===e&&(e=9e4);return{type:t,id:-1,pid:-1,inputTimeScale:e,sequenceNumber:-1,samples:[],dropped:0}}})},"./src/demux/exp-golomb.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>n});var i=r("./src/utils/logger.ts");const n=function(){function t(t){this.data=void 0,this.bytesAvailable=void 0,this.word=void 0,this.bitsAvailable=void 0,this.data=t,this.bytesAvailable=t.byteLength,this.word=0,this.bitsAvailable=0}var e=t.prototype;return e.loadWord=function(){var t=this.data,e=this.bytesAvailable,r=t.byteLength-e,i=new Uint8Array(4),e=Math.min(4,e);if(0===e)throw new Error("no bytes available");i.set(t.subarray(r,r+e)),this.word=new DataView(i.buffer).getUint32(0),this.bitsAvailable=8*e,this.bytesAvailable-=e},e.skipBits=function(t){var e;t=Math.min(t,8*this.bytesAvailable+this.bitsAvailable),this.bitsAvailable>t||(t=(t-=this.bitsAvailable)-((e=t>>3)<<3),this.bytesAvailable-=e,this.loadWord()),this.word<<=t,this.bitsAvailable-=t},e.readBits=function(t){var e=Math.min(this.bitsAvailable,t),r=this.word>>>32-e;if(32>>t))return this.word<<=t,this.bitsAvailable-=t,t;return this.loadWord(),t+this.skipLZ()},e.skipUEG=function(){this.skipBits(1+this.skipLZ())},e.skipEG=function(){this.skipBits(1+this.skipLZ())},e.readUEG=function(){var t=this.skipLZ();return this.readBits(t+1)-1},e.readEG=function(){var t=this.readUEG();return 1&t?1+t>>>1:-1*(t>>>1)},e.readBoolean=function(){return 1===this.readBits(1)},e.readUByte=function(){return this.readBits(8)},e.readUShort=function(){return this.readBits(16)},e.readUInt=function(){return this.readBits(32)},e.skipScalingList=function(t){for(var e=8,r=8,i=0;i{"use strict";r.r(e),r.d(e,{canParse:()=>n,decodeFrame:()=>h,getID3Data:()=>i,getID3Frames:()=>o,getTimeStamp:()=>s,isFooter:()=>u,isHeader:()=>l,isTimeStampFrame:()=>a,testables:()=>y,utf8ArrayToStr:()=>v});var d,l=function(t,e){return e+10<=t.length&&73===t[e]&&68===t[e+1]&&51===t[e+2]&&t[e+3]<255&&t[e+4]<255&&t[e+6]<128&&t[e+7]<128&&t[e+8]<128&&t[e+9]<128},u=function(t,e){return e+10<=t.length&&51===t[e]&&68===t[e+1]&&73===t[e+2]&&t[e+3]<255&&t[e+4]<255&&t[e+6]<128&&t[e+7]<128&&t[e+8]<128&&t[e+9]<128},i=function(t,e){for(var r=e,i=0;l(t,e);){i=(i+=10)+c(t,e+6);u(t,e+10)&&(i+=10),e+=i}if(0>4){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:l+=String.fromCharCode(n);break;case 12:case 13:s=t[u++],l+=String.fromCharCode((31&n)<<6|63&s);break;case 14:s=t[u++],a=t[u++],l+=String.fromCharCode((15&n)<<12|(63&s)<<6|(63&a)<<0)}}return l},y={decodeTextFrame:g}},"./src/demux/mp3demuxer.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>n});var e=r("./src/demux/base-audio-demuxer.ts"),i=r("./src/demux/id3.ts"),s=r("./src/utils/logger.ts"),a=r("./src/demux/mpegaudio.ts");function o(t,e){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}const n=function(n){var t;function e(){return n.apply(this,arguments)||this}t=n,(r=e).prototype=Object.create(t.prototype),o(r.prototype.constructor=r,t);var r=e.prototype;return r.resetInitSegment=function(t,e,r,i){n.prototype.resetInitSegment.call(this,t,e,r,i),this._audioTrack={container:"audio/mpeg",type:"audio",id:2,pid:-1,sequenceNumber:0,segmentCodec:"mp3",samples:[],manifestCodec:e,duration:i,inputTimeScale:9e4,dropped:0}},e.probe=function(t){if(t)for(var e=(i.getID3Data(t,0)||[]).length,r=t.length;e{"use strict";r.r(e),r.d(e,{default:()=>i});var s=r("./src/polyfills/number.ts"),a=r("./src/types/demuxer.ts"),d=r("./src/utils/mp4-tools.ts"),c=r("./src/demux/dummy-demuxed-track.ts"),o=/\/emsg[-/]ID3/i;const i=function(){function t(t,e){this.remainderData=null,this.timeOffset=0,this.config=void 0,this.videoTrack=void 0,this.audioTrack=void 0,this.id3Track=void 0,this.txtTrack=void 0,this.config=e}var e=t.prototype;return e.resetTimeStamp=function(){},e.resetInitSegment=function(t,e,r,i){var n,s,a,o=this.videoTrack=(0,c.dummyTrack)("video",1),l=this.audioTrack=(0,c.dummyTrack)("audio",1),u=this.txtTrack=(0,c.dummyTrack)("text",1);this.id3Track=(0,c.dummyTrack)("id3",1),this.timeOffset=0,t&&t.byteLength&&((t=(0,d.parseInitSegment)(t)).video&&(n=(a=t.video).id,s=a.timescale,a=a.codec,o.id=n,o.timescale=u.timescale=s,o.codec=a),t.audio&&(s=(n=t.audio).id,a=n.timescale,t=n.codec,l.id=s,l.timescale=a,l.codec=t),u.id=d.RemuxerTrackIdConfig.text,o.sampleDuration=0,o.duration=l.duration=i)},e.resetContiguity=function(){},t.probe=function(t){return t=16384{"use strict";r.r(e),r.d(e,{appendFrame:()=>function(t,e,r,i,n){if(!(r+24>e.length)){var s,a=o(e,r);if(a&&r+a.frameLength<=e.length)return s=9e4*a.samplesPerFrame/a.sampleRate,i=i+n*s,n={unit:e.subarray(r,r+a.frameLength),pts:i,dts:i},t.config=[],t.channelCount=a.channelCount,t.samplerate=a.sampleRate,t.samples.push(n),{sample:n,length:a.frameLength,missing:0}}},canParse:()=>function(t,e){return n(t,e)&&4<=t.length-e},isHeader:()=>s,isHeaderPattern:()=>n,parseHeader:()=>o,probe:()=>function(t,e){{var r,i;if(e+1>3&3,l=t[e+1]>>1&3,u=t[e+2]>>4&15,d=t[e+2]>>2&3;if(1!=o&&0!=u&&15!=u&&3!=d)return a=t[e+2]>>1&1,r=t[e+3]>>6,u=1e3*h[14*(3==o?3-l:3==l?3:4)+u-1],d=f[3*(3==o?0:2==o?1:2)+d],i=3==r?1:2,s=8*(o=g[o][l])*(n=p[l]),o=Math.floor(o*u/d+a)*n,null===c&&(a=(navigator.userAgent||"").match(/Chrome\/(\d+)/i),c=a?parseInt(a[1]):0),!!c&&c<=87&&2==l&&224e3<=u&&0==r&&(t[e+3]=128|t[e+3]),{sampleRate:d,channelCount:i,frameLength:o,samplesPerFrame:s}}function n(t,e){return 255===t[e]&&224==(224&t[e+1])&&0!=(6&t[e+1])}function s(t,e){return e+1{"use strict";r.r(e),r.d(e,{default:()=>n});var i=r("./src/crypt/decrypter.ts"),l=r("./src/utils/mp4-tools.ts");const n=function(){function t(t,e,r){this.keyData=void 0,this.decrypter=void 0,this.keyData=r,this.decrypter=new i.default(e,{removePKCS7Padding:!1})}var e=t.prototype;return e.decryptBuffer=function(t){return this.decrypter.decrypt(t,this.keyData.key.buffer,this.keyData.iv.buffer)},e.decryptAacSample=function(e,r,i){var t,n=this,s=e[r].unit;s.length<=16||(t=(t=s.subarray(16,s.length-s.length%16)).buffer.slice(t.byteOffset,t.byteOffset+t.length),this.decryptBuffer(t).then(function(t){t=new Uint8Array(t);s.set(t,16),n.decrypter.isSync()||n.decryptAacSamples(e,r+1,i)}))},e.decryptAacSamples=function(t,e,r){for(;;e++){if(e>=t.length)return void r();if(!(t[e].unit.length<32)&&(this.decryptAacSample(t,e,r),!this.decrypter.isSync()))return}},e.getAvcEncryptedData=function(t){for(var e=16*Math.floor((t.length-48)/160)+16,r=new Int8Array(e),i=0,n=32;n=t.length)return void i();for(var n=t[e].units;!(r>=n.length);r++){var s=n[r];if(!(s.data.length<=48||1!==s.type&&5!==s.type||(this.decryptAvcSample(t,e,r,i,s),this.decrypter.isSync())))return}}},t}()},"./src/demux/transmuxer-interface.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});var l=r("./src/demux/webworkify-webpack.js"),u=r("./src/events.ts"),b=r("./src/demux/transmuxer.ts"),L=r("./src/utils/logger.ts"),d=r("./src/errors.ts"),e=r("./src/utils/mediasource-helper.ts"),c=r("./node_modules/eventemitter3/index.js"),h=(0,e.getMediaSource)()||{isTypeSupported:function(){return!1}},i=function(){function t(e,r,i,t){function n(t,e){(e=e||{}).frag=a.frag,e.id=a.id,a.hls.trigger(t,e)}var s,a=this,o=(this.hls=void 0,this.id=void 0,this.observer=void 0,this.frag=null,this.part=null,this.useWorker=void 0,this.worker=void 0,this.onwmsg=void 0,this.transmuxer=null,this.onTransmuxComplete=void 0,this.onFlush=void 0,e.config),e=(this.hls=e,this.id=r,this.useWorker=!!o.enableWorker,this.onTransmuxComplete=i,this.onFlush=t,this.observer=new c.EventEmitter,this.observer.on(u.Events.FRAG_DECRYPTED,n),this.observer.on(u.Events.ERROR,n),{mp4:h.isTypeSupported("video/mp4"),mpeg:h.isTypeSupported("audio/mpeg"),mp3:h.isTypeSupported('audio/mp4; codecs="mp3"')}),i=navigator.vendor;if(this.useWorker&&"undefined"!=typeof Worker){L.logger.log("demuxing in webworker");try{s=this.worker=(0,l.default)("./src/demux/transmuxer-worker.ts"),this.onwmsg=this.onWorkerMessage.bind(this),s.addEventListener("message",this.onwmsg),s.onerror=function(t){a.useWorker=!1,L.logger.warn("Exception in webworker, fallback to inline"),a.hls.trigger(u.Events.ERROR,{type:d.ErrorTypes.OTHER_ERROR,details:d.ErrorDetails.INTERNAL_EXCEPTION,fatal:!1,event:"demuxerWorker",error:new Error(t.message+" ("+t.filename+":"+t.lineno+")")})},s.postMessage({cmd:"init",typeSupported:e,vendor:i,id:r,config:JSON.stringify(o)})}catch(t){L.logger.warn("Error in worker:",t),L.logger.error("Error while initializing DemuxerWorker, fallback to inline"),s&&self.URL.revokeObjectURL(s.objectURL),this.transmuxer=new b.default(this.observer,e,o,i,r),this.worker=null}}else this.transmuxer=new b.default(this.observer,e,o,i,r)}var e=t.prototype;return e.destroy=function(){var t=this.worker,t=(t?(t.removeEventListener("message",this.onwmsg),t.terminate(),this.worker=null,this.onwmsg=void 0):(t=this.transmuxer)&&(t.destroy(),this.transmuxer=null),this.observer);t&&t.removeAllListeners(),this.frag=null,this.observer=null,this.hls=null},e.push=function(t,e,r,i,n,s,a,o,l,u){var d=this,c=(l.transmuxing.start=self.performance.now(),this.transmuxer),h=this.worker,f=(s||n).start,g=n.decryptdata,p=this.frag,m=!(p&&n.cc===p.cc),v=!(p&&l.level===p.level),y=p?l.sn-p.sn:-1,E=this.part?l.part-this.part.index:-1,T=0==y&&1{"use strict";r.r(e),r.d(e,{default:()=>function(n){function s(t,e){n.postMessage({event:t,data:e})}function a(){for(var t in d.logger)!function(e){d.logger[e]=function(t){s("workerLog",{logType:e,message:t})}}(t)}var o=new i.EventEmitter;o.on(u.Events.FRAG_DECRYPTED,s),o.on(u.Events.ERROR,s);n.addEventListener("message",function(t){var e=t.data;switch(e.cmd){case"init":var r=JSON.parse(e.config);n.transmuxer=new l.default(o,e.typeSupported,r,e.vendor,e.id),(0,d.enableLogs)(r.debug,e.id),a(),s("init",null);break;case"configure":n.transmuxer.configure(e.config);break;case"demux":r=n.transmuxer.push(e.data,e.decryptdata,e.chunkMeta,e.state);(0,l.isPromise)(r)?(n.transmuxer.async=!0,r.then(function(t){h(n,t)}).catch(function(t){s(u.Events.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.FRAG_PARSING_ERROR,chunkMeta:e.chunkMeta,fatal:!1,error:t,err:t,reason:"transmuxer-worker push error"})})):(n.transmuxer.async=!1,h(n,r));break;case"flush":var i=e.chunkMeta,r=n.transmuxer.flush(i);(0,l.isPromise)(r)||n.transmuxer.async?(r=(0,l.isPromise)(r)?r:Promise.resolve(r)).then(function(t){f(n,t,i)}).catch(function(t){s(u.Events.ERROR,{type:c.ErrorTypes.MEDIA_ERROR,details:c.ErrorDetails.FRAG_PARSING_ERROR,chunkMeta:e.chunkMeta,fatal:!1,error:t,err:t,reason:"transmuxer-worker flush error"})}):f(n,r,i)}})}});var l=r("./src/demux/transmuxer.ts"),u=r("./src/events.ts"),d=r("./src/utils/logger.ts"),i=r("./node_modules/eventemitter3/index.js"),c=r("./src/errors.ts");function h(t,e){var r,i,n;return!!((r=e.remuxResult).audio||r.video||r.text||r.id3||r.initSegment)&&(r=[],i=(n=e.remuxResult).audio,n=n.video,i&&s(r,i),n&&s(r,n),t.postMessage({event:"transmuxComplete",data:e},r),!0)}function s(t,e){e.data1&&t.push(e.data1.buffer),e.data2&&t.push(e.data2.buffer)}function f(r,t,e){t.reduce(function(t,e){return h(r,e)||t},!1)||r.postMessage({event:"transmuxComplete",data:t[0]}),r.postMessage({event:"flush",data:e})}},"./src/demux/transmuxer.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{TransmuxConfig:()=>c,TransmuxState:()=>m,default:()=>u,isPromise:()=>d});var E,o=r("./src/events.ts"),l=r("./src/errors.ts"),i=r("./src/crypt/decrypter.ts"),e=r("./src/demux/aacdemuxer.ts"),h=r("./src/demux/mp4demuxer.ts"),n=r("./src/demux/tsdemuxer.ts"),s=r("./src/demux/mp3demuxer.ts"),a=r("./src/remux/mp4-remuxer.ts"),f=r("./src/remux/passthrough-remuxer.ts"),g=r("./src/utils/logger.ts");try{E=self.performance.now.bind(self.performance)}catch(t){g.logger.debug("Unable to use Performance API on this environment"),E=self.Date.now}var p=[{demux:h.default,remux:f.default},{demux:n.default,remux:a.default},{demux:e.default,remux:a.default},{demux:s.default,remux:a.default}],u=function(){function t(t,e,r,i,n){this.async=!1,this.observer=void 0,this.typeSupported=void 0,this.config=void 0,this.vendor=void 0,this.id=void 0,this.demuxer=void 0,this.remuxer=void 0,this.decrypter=void 0,this.probe=void 0,this.decryptionPromise=null,this.transmuxConfig=void 0,this.currentTransmuxState=void 0,this.observer=t,this.typeSupported=e,this.config=r,this.vendor=i,this.id=n}var e=t.prototype;return e.configure=function(t){this.transmuxConfig=t,this.decrypter&&this.decrypter.reset()},e.push=function(t,e,r,i){var n=this,s=r.transmuxing,t=(s.executeStart=E(),new Uint8Array(t)),a=this.currentTransmuxState,o=this.transmuxConfig,i=(i&&(this.currentTransmuxState=i),i||a),a=i.contiguous,l=i.discontinuity,u=i.trackSwitch,d=i.accurateTimeOffset,c=i.timeOffset,i=i.initSegmentChange,h=o.audioCodec,f=o.videoCodec,g=o.defaultInitPts,p=o.duration,o=o.initSegmentData,m=function(t,e){var r=null;0{"use strict";r.r(e),r.d(e,{default:()=>a});var g=r("./src/demux/adts.ts"),l=r("./src/demux/mpegaudio.ts"),f=r("./src/demux/exp-golomb.ts"),i=r("./src/demux/sample-aes.ts"),_=r("./src/events.ts"),w=r("./src/utils/mp4-tools.ts"),O=r("./src/utils/logger.ts"),P=r("./src/errors.ts"),n=r("./src/types/demuxer.ts");function s(){return(s=Object.assign?Object.assign.bind():function(t){for(var e=1;et.size-6)return null;var o=h[7],l=(192&o&&(r=536870912*(14&h[9])+4194304*(255&h[10])+16384*(254&h[11])+128*(255&h[12])+(254&h[13])/2,64&o?54e5>4,k=void 0;if(1{"use strict";h.r(e),h.d(e,{default:()=>function(t,e){e=e||{};var r={main:h.m},i=e.all?{main:Object.keys(r.main)}:function(t,e){var r={main:[e]},i={main:[]},n={main:{}};for(;function(r){return Object.keys(r).reduce(function(t,e){return t||0/);if(e){for(var s,e=e[1],a=new RegExp("(\\\\n|\\W)"+p(e)+g,"g");s=a.exec(n);)"dll-reference"!==s[3]&&i[r].push(s[3]);for(a=new RegExp("\\("+p(e)+'\\("(dll-reference\\s('+f+'))"\\)\\)'+g,"g");s=a.exec(n);)t[s[2]]||(i[r].push(s[1]),t[s[2]]=h(s[1]).m),i[s[2]]=i[s[2]]||[],i[s[2]].push(s[4]);for(var o=Object.keys(i),l=0;l{"use strict";var i,n;r.r(e),r.d(e,{ErrorDetails:()=>n,ErrorTypes:()=>i}),(r=i=i||{}).NETWORK_ERROR="networkError",r.MEDIA_ERROR="mediaError",r.KEY_SYSTEM_ERROR="keySystemError",r.MUX_ERROR="muxError",r.OTHER_ERROR="otherError",(e=n=n||{}).KEY_SYSTEM_NO_KEYS="keySystemNoKeys",e.KEY_SYSTEM_NO_ACCESS="keySystemNoAccess",e.KEY_SYSTEM_NO_SESSION="keySystemNoSession",e.KEY_SYSTEM_NO_CONFIGURED_LICENSE="keySystemNoConfiguredLicense",e.KEY_SYSTEM_LICENSE_REQUEST_FAILED="keySystemLicenseRequestFailed",e.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED="keySystemServerCertificateRequestFailed",e.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED="keySystemServerCertificateUpdateFailed",e.KEY_SYSTEM_SESSION_UPDATE_FAILED="keySystemSessionUpdateFailed",e.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED="keySystemStatusOutputRestricted",e.KEY_SYSTEM_STATUS_INTERNAL_ERROR="keySystemStatusInternalError",e.MANIFEST_LOAD_ERROR="manifestLoadError",e.MANIFEST_LOAD_TIMEOUT="manifestLoadTimeOut",e.MANIFEST_PARSING_ERROR="manifestParsingError",e.MANIFEST_INCOMPATIBLE_CODECS_ERROR="manifestIncompatibleCodecsError",e.LEVEL_EMPTY_ERROR="levelEmptyError",e.LEVEL_LOAD_ERROR="levelLoadError",e.LEVEL_LOAD_TIMEOUT="levelLoadTimeOut",e.LEVEL_SWITCH_ERROR="levelSwitchError",e.AUDIO_TRACK_LOAD_ERROR="audioTrackLoadError",e.AUDIO_TRACK_LOAD_TIMEOUT="audioTrackLoadTimeOut",e.SUBTITLE_LOAD_ERROR="subtitleTrackLoadError",e.SUBTITLE_TRACK_LOAD_TIMEOUT="subtitleTrackLoadTimeOut",e.FRAG_LOAD_ERROR="fragLoadError",e.FRAG_LOAD_TIMEOUT="fragLoadTimeOut",e.FRAG_DECRYPT_ERROR="fragDecryptError",e.FRAG_PARSING_ERROR="fragParsingError",e.REMUX_ALLOC_ERROR="remuxAllocError",e.KEY_LOAD_ERROR="keyLoadError",e.KEY_LOAD_TIMEOUT="keyLoadTimeOut",e.BUFFER_ADD_CODEC_ERROR="bufferAddCodecError",e.BUFFER_INCOMPATIBLE_CODECS_ERROR="bufferIncompatibleCodecsError",e.BUFFER_APPEND_ERROR="bufferAppendError",e.BUFFER_APPENDING_ERROR="bufferAppendingError",e.BUFFER_STALLED_ERROR="bufferStalledError",e.BUFFER_FULL_ERROR="bufferFullError",e.BUFFER_SEEK_OVER_HOLE="bufferSeekOverHole",e.BUFFER_NUDGE_ON_STALL="bufferNudgeOnStall",e.INTERNAL_EXCEPTION="internalException",e.INTERNAL_ABORTED="aborted",e.UNKNOWN="unknown"},"./src/events.ts":(t,e,r)=>{"use strict";var i;r.r(e),r.d(e,{Events:()=>i}),(r=i=i||{}).MEDIA_ATTACHING="hlsMediaAttaching",r.MEDIA_ATTACHED="hlsMediaAttached",r.MEDIA_DETACHING="hlsMediaDetaching",r.MEDIA_DETACHED="hlsMediaDetached",r.BUFFER_RESET="hlsBufferReset",r.BUFFER_CODECS="hlsBufferCodecs",r.BUFFER_CREATED="hlsBufferCreated",r.BUFFER_APPENDING="hlsBufferAppending",r.BUFFER_APPENDED="hlsBufferAppended",r.BUFFER_EOS="hlsBufferEos",r.BUFFER_FLUSHING="hlsBufferFlushing",r.BUFFER_FLUSHED="hlsBufferFlushed",r.MANIFEST_LOADING="hlsManifestLoading",r.MANIFEST_LOADED="hlsManifestLoaded",r.MANIFEST_PARSED="hlsManifestParsed",r.LEVEL_SWITCHING="hlsLevelSwitching",r.LEVEL_SWITCHED="hlsLevelSwitched",r.LEVEL_LOADING="hlsLevelLoading",r.LEVEL_LOADED="hlsLevelLoaded",r.LEVEL_UPDATED="hlsLevelUpdated",r.LEVEL_PTS_UPDATED="hlsLevelPtsUpdated",r.LEVELS_UPDATED="hlsLevelsUpdated",r.AUDIO_TRACKS_UPDATED="hlsAudioTracksUpdated",r.AUDIO_TRACK_SWITCHING="hlsAudioTrackSwitching",r.AUDIO_TRACK_SWITCHED="hlsAudioTrackSwitched",r.AUDIO_TRACK_LOADING="hlsAudioTrackLoading",r.AUDIO_TRACK_LOADED="hlsAudioTrackLoaded",r.SUBTITLE_TRACKS_UPDATED="hlsSubtitleTracksUpdated",r.SUBTITLE_TRACKS_CLEARED="hlsSubtitleTracksCleared",r.SUBTITLE_TRACK_SWITCH="hlsSubtitleTrackSwitch",r.SUBTITLE_TRACK_LOADING="hlsSubtitleTrackLoading",r.SUBTITLE_TRACK_LOADED="hlsSubtitleTrackLoaded",r.SUBTITLE_FRAG_PROCESSED="hlsSubtitleFragProcessed",r.CUES_PARSED="hlsCuesParsed",r.NON_NATIVE_TEXT_TRACKS_FOUND="hlsNonNativeTextTracksFound",r.INIT_PTS_FOUND="hlsInitPtsFound",r.FRAG_LOADING="hlsFragLoading",r.FRAG_LOAD_EMERGENCY_ABORTED="hlsFragLoadEmergencyAborted",r.FRAG_LOADED="hlsFragLoaded",r.FRAG_DECRYPTED="hlsFragDecrypted",r.FRAG_PARSING_INIT_SEGMENT="hlsFragParsingInitSegment",r.FRAG_PARSING_USERDATA="hlsFragParsingUserdata",r.FRAG_PARSING_METADATA="hlsFragParsingMetadata",r.FRAG_PARSED="hlsFragParsed",r.FRAG_BUFFERED="hlsFragBuffered",r.FRAG_CHANGED="hlsFragChanged",r.FPS_DROP="hlsFpsDrop",r.FPS_DROP_LEVEL_CAPPING="hlsFpsDropLevelCapping",r.ERROR="hlsError",r.DESTROYING="hlsDestroying",r.KEY_LOADING="hlsKeyLoading",r.KEY_LOADED="hlsKeyLoaded",r.LIVE_BACK_BUFFER_REACHED="hlsLiveBackBufferReached",r.BACK_BUFFER_REACHED="hlsBackBufferReached"},"./src/hls.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>u});var n=r("./node_modules/url-toolkit/src/url-toolkit.js"),h=r("./src/loader/playlist-loader.ts"),f=r("./src/controller/id3-track-controller.ts"),g=r("./src/controller/latency-controller.ts"),p=r("./src/controller/level-controller.ts"),m=r("./src/controller/fragment-tracker.ts"),v=r("./src/loader/key-loader.ts"),y=r("./src/controller/stream-controller.ts"),i=r("./src/is-supported.ts"),E=r("./src/utils/logger.ts"),T=r("./src/config.ts"),S=r("./node_modules/eventemitter3/index.js"),s=r("./src/events.ts"),a=r("./src/errors.ts"),o=r("./src/types/level.ts");function l(t,e){for(var r=0;r=e)return i;return 0}},{key:"maxAutoLevel",get:function(){var t=this.levels,e=this.autoLevelCapping,r=this.maxHdcpLevel,e=-1===e&&t&&t.length?t.length-1:e;if(r)for(var i=e;i--;){var n=t[i].attrs["HDCP-LEVEL"];if(n&&n<=r)return i}return e}},{key:"nextAutoLevel",get:function(){return Math.min(Math.max(this.abrController.nextAutoLevel,this.minAutoLevel),this.maxAutoLevel)},set:function(t){this.abrController.nextAutoLevel=Math.max(this.minAutoLevel,t)}},{key:"playingDate",get:function(){return this.streamController.currentProgramDateTime}},{key:"mainForwardBufferInfo",get:function(){return this.streamController.getMainFwdBufferInfo()}},{key:"audioTracks",get:function(){var t=this.audioTrackController;return t?t.audioTracks:[]}},{key:"audioTrack",get:function(){var t=this.audioTrackController;return t?t.audioTrack:-1},set:function(t){var e=this.audioTrackController;e&&(e.audioTrack=t)}},{key:"subtitleTracks",get:function(){var t=this.subtitleTrackController;return t?t.subtitleTracks:[]}},{key:"subtitleTrack",get:function(){var t=this.subtitleTrackController;return t?t.subtitleTrack:-1},set:function(t){var e=this.subtitleTrackController;e&&(e.subtitleTrack=t)}},{key:"media",get:function(){return this._media}},{key:"subtitleDisplay",get:function(){var t=this.subtitleTrackController;return!!t&&t.subtitleDisplay},set:function(t){var e=this.subtitleTrackController;e&&(e.subtitleDisplay=t)}},{key:"lowLatencyMode",get:function(){return this.config.lowLatencyMode},set:function(t){this.config.lowLatencyMode=t}},{key:"liveSyncPosition",get:function(){return this.latencyController.liveSyncPosition}},{key:"latency",get:function(){return this.latencyController.latency}},{key:"maxLatency",get:function(){return this.latencyController.maxLatency}},{key:"targetLatency",get:function(){return this.latencyController.targetLatency}},{key:"drift",get:function(){return this.latencyController.drift}},{key:"forceStartLoad",get:function(){return this.streamController.forceStartLoad}}])&&l(r.prototype,t),e&&l(r,e),Object.defineProperty(r,"prototype",{writable:!1}),c}();u.defaultConfig=void 0},"./src/is-supported.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{changeTypeSupported:()=>function(){var t=n();return"function"==typeof(null==t||null==(t=t.prototype)?void 0:t.changeType)},isSupported:()=>function(){var t,e=(0,i.getMediaSource)();return!!e&&(t=n(),e=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),t=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove,!!e)&&!!t}});var i=r("./src/utils/mediasource-helper.ts");function n(){return self.SourceBuffer||self.WebKitSourceBuffer}},"./src/loader/date-range.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{DateRange:()=>i,DateRangeAttribute:()=>n});var n,s=r("./src/polyfills/number.ts"),a=r("./src/utils/attr-list.ts"),o=r("./src/utils/logger.ts");function l(){return(l=Object.assign?Object.assign.bind():function(t){for(var e=1;e{"use strict";r.r(e),r.d(e,{LoadError:()=>p,default:()=>l});var a=r("./src/polyfills/number.ts"),h=r("./src/errors.ts");function i(t){var r="function"==typeof Map?new Map:void 0;return function(t){if(null===t||-1===Function.toString.call(t).indexOf("[native code]"))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(t))return r.get(t);r.set(t,e)}function e(){return n(t,arguments,s(this).constructor)}return e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),o(e,t)}(t)}function n(t,e,r){return(n=function(){if("undefined"==typeof Reflect||!Reflect.construct)return;if(Reflect.construct.sham)return;if("function"==typeof Proxy)return 1;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),1}catch(t){}}()?Reflect.construct.bind():function(t,e,r){var i=[null];i.push.apply(i,e);e=new(Function.bind.apply(t,i));return r&&o(e,r.prototype),e}).apply(null,arguments)}function o(t,e){return(o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}function s(t){return(s=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}var f=Math.pow(2,17),l=function(){function t(t){this.config=void 0,this.loader=null,this.partLoadTimeout=-1,this.config=t}var e=t.prototype;return e.destroy=function(){this.loader&&(this.loader.destroy(),this.loader=null)},e.abort=function(){this.loader&&this.loader.abort()},e.load=function(a,o){var l=this,t=a.url;if(!t)return Promise.reject(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:a,networkDetails:null},"Fragment does not have a "+(t?"part list":"url")));this.abort();var r=this.config,u=r.fLoader,d=r.loader;return new Promise(function(n,i){l.loader&&l.loader.destroy();var s=l.loader=a.loader=new(u||d)(r),t=g(a),e={timeout:r.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:r.fragLoadingMaxRetryTimeout,highWaterMark:"initSegment"===a.sn?1/0:f};a.stats=s.stats,s.load(t,e,{onSuccess:function(t,e,r,i){l.resetLoader(a,s);t=t.data;r.resetIV&&a.decryptdata&&(a.decryptdata.iv=new Uint8Array(t.slice(0,16)),t=t.slice(16)),n({frag:a,part:null,payload:t,networkDetails:i})},onError:function(t,e,r){l.resetLoader(a,s),i(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:a,response:t,networkDetails:r}))},onAbort:function(t,e,r){l.resetLoader(a,s),i(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.INTERNAL_ABORTED,fatal:!1,frag:a,networkDetails:r}))},onTimeout:function(t,e,r){l.resetLoader(a,s),i(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.FRAG_LOAD_TIMEOUT,fatal:!1,frag:a,networkDetails:r}))},onProgress:function(t,e,r,i){o&&o({frag:a,part:null,payload:r,networkDetails:i})}})})},e.loadPart=function(a,o,l){var u=this,r=(this.abort(),this.config),d=r.fLoader,c=r.loader;return new Promise(function(n,i){u.loader&&u.loader.destroy();var s=u.loader=a.loader=new(d||c)(r),t=g(a,o),e={timeout:r.fragLoadingTimeOut,maxRetry:0,retryDelay:0,maxRetryDelay:r.fragLoadingMaxRetryTimeout,highWaterMark:f};o.stats=s.stats,s.load(t,e,{onSuccess:function(t,e,r,i){u.resetLoader(a,s),u.updateStatsFromPart(a,o);t={frag:a,part:o,payload:t.data,networkDetails:i};l(t),n(t)},onError:function(t,e,r){u.resetLoader(a,s),i(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.FRAG_LOAD_ERROR,fatal:!1,frag:a,part:o,response:t,networkDetails:r}))},onAbort:function(t,e,r){a.stats.aborted=o.stats.aborted,u.resetLoader(a,s),i(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.INTERNAL_ABORTED,fatal:!1,frag:a,part:o,networkDetails:r}))},onTimeout:function(t,e,r){u.resetLoader(a,s),i(new p({type:h.ErrorTypes.NETWORK_ERROR,details:h.ErrorDetails.FRAG_LOAD_TIMEOUT,fatal:!1,frag:a,part:o,networkDetails:r}))}})})},e.updateStatsFromPart=function(t,e){var r=t.stats,i=e.stats,n=i.total,t=(r.loaded+=i.loaded,n?(n=((t=Math.round(t.duration/e.duration))-(e=Math.min(Math.round(r.loaded/n),t)))*Math.round(r.loaded/e),r.total=r.loaded+n):r.total=Math.max(r.loaded,r.total),r.loading),e=i.loading;t.start?t.first+=e.first-e.start:(t.start=e.start,t.first=e.first),t.end=e.end},e.resetLoader=function(t,e){t.loader=null,this.loader===e&&(self.clearTimeout(this.partLoadTimeout),this.loader=null),e.destroy()},t}();function g(t,e){var r,i,n=(e=void 0===e?null:e)||t,e={frag:t,part:e,responseType:"arraybuffer",url:n.url,headers:{},rangeStart:0,rangeEnd:0},s=n.byteRangeStartOffset,n=n.byteRangeEndOffset;return(0,a.isFiniteNumber)(s)&&(0,a.isFiniteNumber)(n)&&(r=s,i=n,"initSegment"===t.sn&&"AES-128"===(null==(t=t.decryptdata)?void 0:t.method)&&((t=n-s)%16&&(i=n+(16-t%16)),0!==s)&&(e.resetIV=!0,r=s-16),e.rangeStart=r,e.rangeEnd=i),e}var p=function(s){var t,e;function r(t){for(var e,r=arguments.length,i=new Array(1{"use strict";r.r(e),r.d(e,{BaseSegment:()=>c,ElementaryStreamTypes:()=>i,Fragment:()=>h,Part:()=>f});var i,n=r("./src/polyfills/number.ts"),s=r("./node_modules/url-toolkit/src/url-toolkit.js"),a=r("./src/loader/load-stats.ts");function o(t,e){t.prototype=Object.create(e.prototype),l(t.prototype.constructor=t,e)}function l(t,e){return(l=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}function u(t,e){for(var r=0;r{"use strict";r.r(e),r.d(e,{default:()=>i});var u=r("./src/errors.ts"),n=r("./src/loader/fragment-loader.ts"),i=function(){function t(t){this.config=void 0,this.keyUriToKeyInfo={},this.emeController=null,this.config=t}var e=t.prototype;return e.abort=function(){for(var t in this.keyUriToKeyInfo){t=this.keyUriToKeyInfo[t].loader;t&&t.abort()}},e.detach=function(){for(var t in this.keyUriToKeyInfo){var e=this.keyUriToKeyInfo[t];(e.mediaKeySessionContext||e.decryptdata.isCommonEncryption)&&delete this.keyUriToKeyInfo[t]}},e.destroy=function(){for(var t in this.detach(),this.keyUriToKeyInfo){t=this.keyUriToKeyInfo[t].loader;t&&t.destroy()}this.keyUriToKeyInfo={}},e.createKeyLoadError=function(t,e,r,i){return void 0===e&&(e=u.ErrorDetails.KEY_LOAD_ERROR),new n.LoadError({type:u.ErrorTypes.NETWORK_ERROR,details:e,fatal:!1,frag:t,networkDetails:r})},e.loadClear=function(t,r){var i=this;if(this.emeController&&this.config.emeEnabled)for(var n=t.sn,s=t.cc,e=0;e{"use strict";r.r(e),r.d(e,{LevelDetails:()=>i});var n=r("./src/polyfills/number.ts");function s(t,e){for(var r=0;rt.endSN||0{"use strict";r.r(e),r.d(e,{LevelKey:()=>i});var a=r("./src/utils/keysystem-util.ts"),o=r("./src/utils/mediakeys-helper.ts"),l=r("./src/utils/mp4-tools.ts"),u=r("./src/utils/logger.ts"),d=r("./src/utils/numeric-encoding-utils.ts"),c={},i=function(){function s(t,e,r,i,n){void 0===i&&(i=[1]),void 0===n&&(n=null),this.uri=void 0,this.method=void 0,this.keyFormat=void 0,this.keyFormatVersions=void 0,this.encrypted=void 0,this.isCommonEncryption=void 0,this.iv=null,this.key=null,this.keyId=null,this.pssh=null,this.method=t,this.uri=e,this.keyFormat=r,this.keyFormatVersions=i,this.iv=n,this.encrypted=!!t&&"NONE"!==t,this.isCommonEncryption=this.encrypted&&"AES-128"!==t}s.clearKeyUriToKeyIdMap=function(){c={}};var t=s.prototype;return t.isSupported=function(){if(this.method){if("AES-128"===this.method||"NONE"===this.method)return!0;switch(this.keyFormat){case"identity":return"SAMPLE-AES"===this.method;case o.KeySystemFormats.FAIRPLAY:case o.KeySystemFormats.WIDEVINE:case o.KeySystemFormats.PLAYREADY:case o.KeySystemFormats.CLEARKEY:return-1!==["ISO-23001-7","SAMPLE-AES","SAMPLE-AES-CENC","SAMPLE-AES-CTR"].indexOf(this.method)}}return!1},t.getDecryptData=function(t){if(!this.encrypted||!this.uri)return null;if("AES-128"===this.method&&this.uri&&!this.iv)return"number"!=typeof t&&("AES-128"!==this.method||this.iv||u.logger.warn('missing IV for initialization segment with method="'+this.method+'" - compliance issue'),t=0),t=function(t){for(var e=new Uint8Array(16),r=12;r<16;r++)e[r]=t>>8*(15-r)&255;return e}(t),new s(this.method,this.uri,"identity",this.keyFormatVersions,t);var e,r=(0,a.convertDataUriToArrayBytes)(this.uri);if(r)switch(this.keyFormat){case o.KeySystemFormats.WIDEVINE:22<=(this.pssh=r).length&&(this.keyId=r.subarray(r.length-22,r.length-6));break;case o.KeySystemFormats.PLAYREADY:var i=new Uint8Array([154,4,240,121,152,64,66,134,171,146,230,91,224,136,95,149]),i=(this.pssh=(0,l.mp4pssh)(i,null,r),new Uint16Array(r.buffer,r.byteOffset,r.byteLength/2)),i=String.fromCharCode.apply(null,Array.from(i)),i=i.substring(i.indexOf("<"),i.length),i=(new DOMParser).parseFromString(i,"text/xml").getElementsByTagName("KID")[0];i&&(i=i.childNodes[0]?i.childNodes[0].nodeValue:i.getAttribute("VALUE"))&&(i=(0,d.base64Decode)(i).subarray(0,16),(0,a.changeEndianness)(i),this.keyId=i);break;default:var n,i=r.subarray(0,16);16!==i.length&&((n=new Uint8Array(16)).set(i,16-i.length),i=n),this.keyId=i}return this.keyId&&16===this.keyId.byteLength||((t=c[this.uri])||(e=Object.keys(c).length%Number.MAX_SAFE_INTEGER,t=new Uint8Array(16),new DataView(t.buffer,12,4).setUint32(0,e),c[this.uri]=t),this.keyId=t),this},s}()},"./src/loader/load-stats.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{LoadStats:()=>i});var i=function(){this.aborted=!1,this.loaded=0,this.retry=0,this.total=0,this.chunkCount=0,this.bwEstimate=0,this.loading={start:0,first:0,end:0},this.parsing={start:0,end:0},this.buffering={start:0,first:0,end:0}}},"./src/loader/m3u8-parser.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>u});var M=r("./src/polyfills/number.ts"),i=r("./node_modules/url-toolkit/src/url-toolkit.js"),N=r("./src/loader/date-range.ts"),U=r("./src/loader/fragment.ts"),B=r("./src/loader/level-details.ts"),o=r("./src/loader/level-key.ts"),G=r("./src/utils/attr-list.ts"),K=r("./src/utils/logger.ts"),h=r("./src/utils/codecs.ts");function H(){return(H=Object.assign?Object.assign.bind():function(t){for(var e=1;e{"use strict";r.r(e),r.d(e,{default:()=>i});var d=r("./src/polyfills/number.ts"),h=r("./src/events.ts"),c=r("./src/errors.ts"),f=r("./src/utils/logger.ts"),g=r("./src/loader/m3u8-parser.ts"),p=r("./src/types/loader.ts"),m=r("./src/utils/attr-list.ts");function v(t,e){t=t.url;return t=void 0!==t&&0!==t.indexOf("data:")?t:e.url}const i=function(){function t(t){this.hls=void 0,this.loaders=Object.create(null),this.hls=t,this.registerListeners()}var e=t.prototype;return e.startLoad=function(t){},e.stopLoad=function(){this.destroyInternalLoaders()},e.registerListeners=function(){var t=this.hls;t.on(h.Events.MANIFEST_LOADING,this.onManifestLoading,this),t.on(h.Events.LEVEL_LOADING,this.onLevelLoading,this),t.on(h.Events.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),t.on(h.Events.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},e.unregisterListeners=function(){var t=this.hls;t.off(h.Events.MANIFEST_LOADING,this.onManifestLoading,this),t.off(h.Events.LEVEL_LOADING,this.onLevelLoading,this),t.off(h.Events.AUDIO_TRACK_LOADING,this.onAudioTrackLoading,this),t.off(h.Events.SUBTITLE_TRACK_LOADING,this.onSubtitleTrackLoading,this)},e.createInternalLoader=function(t){var e=this.hls.config,r=e.pLoader,i=e.loader,r=new(r||i)(e);return t.loader=r,this.loaders[t.type]=r},e.getInternalLoader=function(t){return this.loaders[t.type]},e.resetInternalLoader=function(t){this.loaders[t]&&delete this.loaders[t]},e.destroyInternalLoaders=function(){for(var t in this.loaders){var e=this.loaders[t];e&&e.destroy(),this.resetInternalLoader(t)}},e.destroy=function(){this.unregisterListeners(),this.destroyInternalLoaders()},e.onManifestLoading=function(t,e){e=e.url;this.load({id:null,groupId:null,level:0,responseType:"text",type:p.PlaylistContextType.MANIFEST,url:e,deliveryDirectives:null})},e.onLevelLoading=function(t,e){var r=e.id,i=e.level,n=e.url,e=e.deliveryDirectives;this.load({id:r,groupId:null,level:i,responseType:"text",type:p.PlaylistContextType.LEVEL,url:n,deliveryDirectives:e})},e.onAudioTrackLoading=function(t,e){var r=e.id,i=e.groupId,n=e.url,e=e.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:p.PlaylistContextType.AUDIO_TRACK,url:n,deliveryDirectives:e})},e.onSubtitleTrackLoading=function(t,e){var r=e.id,i=e.groupId,n=e.url,e=e.deliveryDirectives;this.load({id:r,groupId:i,level:null,responseType:"text",type:p.PlaylistContextType.SUBTITLE_TRACK,url:n,deliveryDirectives:e})},e.load=function(t){var e,r,i,n,s=this.hls.config;if(o=this.getInternalLoader(t)){var a=o.context;if(a&&a.url===t.url)return void f.logger.trace("[playlist-loader]: playlist request ongoing");f.logger.log("[playlist-loader]: aborting previous loader for type: "+t.type),o.abort()}switch(t.type){case p.PlaylistContextType.MANIFEST:e=s.manifestLoadingMaxRetry,r=s.manifestLoadingTimeOut,i=s.manifestLoadingRetryDelay,n=s.manifestLoadingMaxRetryTimeout;break;case p.PlaylistContextType.LEVEL:case p.PlaylistContextType.AUDIO_TRACK:case p.PlaylistContextType.SUBTITLE_TRACK:e=0,r=s.levelLoadingTimeOut;break;default:e=s.levelLoadingMaxRetry,r=s.levelLoadingTimeOut,i=s.levelLoadingRetryDelay,n=s.levelLoadingMaxRetryTimeout}var o=this.createInternalLoader(t),a={timeout:r=null!=(a=t.deliveryDirectives)&&a.part&&(t.type===p.PlaylistContextType.LEVEL&&null!==t.level?l=this.hls.levels[t.level].details:t.type===p.PlaylistContextType.AUDIO_TRACK&&null!==t.id?l=this.hls.audioTracks[t.id].details:t.type===p.PlaylistContextType.SUBTITLE_TRACK&&null!==t.id&&(l=this.hls.subtitleTracks[t.id].details),l)&&(a=l.partTarget,l=l.targetduration,a)&&l?Math.min(1e3*Math.max(3*a,.8*l),r):r,maxRetry:e,retryDelay:i,maxRetryDelay:n,highWaterMark:0},l={onSuccess:this.loadsuccess.bind(this),onError:this.loaderror.bind(this),onTimeout:this.loadtimeout.bind(this)};o.load(t,a,l)},e.loadsuccess=function(t,e,r,i){void 0===i&&(i=null),this.resetInternalLoader(r.type);var n=t.data;0!==n.indexOf("#EXTM3U")?this.handleManifestParsingError(t,r,"no EXTM3U delimiter",i):(e.parsing.start=performance.now(),0{"use strict";r.r(e),r.d(e,{MAX_SAFE_INTEGER:()=>n,isFiniteNumber:()=>i});var i=Number.isFinite||function(t){return"number"==typeof t&&isFinite(t)},n=Number.MAX_SAFE_INTEGER||9007199254740991},"./src/remux/aac-helper.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});const i=function(){function t(){}return t.getSilentFrame=function(t,e){if("mp4a.40.2"===t){if(1===e)return new Uint8Array([0,200,0,128,35,128]);if(2===e)return new Uint8Array([33,0,73,144,2,25,0,35,128]);if(3===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,142]);if(4===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,128,44,128,8,2,56]);if(5===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,56]);if(6===e)return new Uint8Array([0,200,0,128,32,132,1,38,64,8,100,0,130,48,4,153,0,33,144,2,0,178,0,32,8,224])}else{if(1===e)return new Uint8Array([1,64,34,128,163,78,230,128,186,8,0,0,0,28,6,241,193,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(2===e)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94]);if(3===e)return new Uint8Array([1,64,34,128,163,94,230,128,186,8,0,0,0,0,149,0,6,241,161,10,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,90,94])}},t}()},"./src/remux/mp4-generator.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});var s=Math.pow(2,32)-1,r=function(){function c(){}return c.init=function(){for(var t in c.types={avc1:[],avcC:[],btrt:[],dinf:[],dref:[],esds:[],ftyp:[],hdlr:[],mdat:[],mdhd:[],mdia:[],mfhd:[],minf:[],moof:[],moov:[],mp4a:[],".mp3":[],mvex:[],mvhd:[],pasp:[],sdtp:[],stbl:[],stco:[],stsc:[],stsd:[],stsz:[],stts:[],tfdt:[],tfhd:[],traf:[],trak:[],trun:[],trex:[],tkhd:[],vmhd:[],smhd:[]})c.types.hasOwnProperty(t)&&(c.types[t]=[t.charCodeAt(0),t.charCodeAt(1),t.charCodeAt(2),t.charCodeAt(3)]);var e=new Uint8Array([0,0,0,0,0,0,0,0,118,105,100,101,0,0,0,0,0,0,0,0,0,0,0,0,86,105,100,101,111,72,97,110,100,108,101,114,0]),r=new Uint8Array([0,0,0,0,0,0,0,0,115,111,117,110,0,0,0,0,0,0,0,0,0,0,0,0,83,111,117,110,100,72,97,110,100,108,101,114,0]),e=(c.HDLR_TYPES={video:e,audio:r},new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,12,117,114,108,32,0,0,0,1])),r=new Uint8Array([0,0,0,0,0,0,0,0]),r=(c.STTS=c.STSC=c.STCO=r,c.STSZ=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0]),c.VMHD=new Uint8Array([0,0,0,1,0,0,0,0,0,0,0,0]),c.SMHD=new Uint8Array([0,0,0,0,0,0,0,0]),c.STSD=new Uint8Array([0,0,0,0,0,0,0,1]),new Uint8Array([105,115,111,109])),i=new Uint8Array([97,118,99,49]),n=new Uint8Array([0,0,0,1]);c.FTYP=c.box(c.types.ftyp,r,n,r,i),c.DINF=c.box(c.types.dinf,c.box(c.types.dref,e))},c.box=function(t){for(var e=8,r=arguments.length,i=new Array(1>24&255,o[1]=e>>16&255,o[2]=e>>8&255,o[3]=255&e,o.set(t,4),s=0,e=8;s>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,e>>24,e>>16&255,e>>8&255,255&e,85,196,0,0]))},c.mdia=function(t){return c.box(c.types.mdia,c.mdhd(t.timescale,t.duration),c.hdlr(t.type),c.minf(t))},c.mfhd=function(t){return c.box(c.types.mfhd,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t]))},c.minf=function(t){return"audio"===t.type?c.box(c.types.minf,c.box(c.types.smhd,c.SMHD),c.DINF,c.stbl(t)):c.box(c.types.minf,c.box(c.types.vmhd,c.VMHD),c.DINF,c.stbl(t))},c.moof=function(t,e,r){return c.box(c.types.moof,c.mfhd(t),c.traf(r,e))},c.moov=function(t){for(var e=t.length,r=[];e--;)r[e]=c.trak(t[e]);return c.box.apply(null,[c.types.moov,c.mvhd(t[0].timescale,t[0].duration)].concat(r).concat(c.mvex(t)))},c.mvex=function(t){for(var e=t.length,r=[];e--;)r[e]=c.trex(t[e]);return c.box.apply(null,[c.types.mvex].concat(r))},c.mvhd=function(t,e){e*=t;var r=Math.floor(e/(1+s)),e=Math.floor(e%(1+s)),t=new Uint8Array([1,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,t>>24&255,t>>16&255,t>>8&255,255&t,r>>24,r>>16&255,r>>8&255,255&r,e>>24,e>>16&255,e>>8&255,255&e,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255]);return c.box(c.types.mvhd,t)},c.sdtp=function(t){for(var e,r=t.samples||[],i=new Uint8Array(4+r.length),n=0;n>>8&255),i.push(255&r),i=i.concat(Array.prototype.slice.call(e));for(s=0;s>>8&255),n.push(255&r),n=n.concat(Array.prototype.slice.call(e));var a=c.box(c.types.avcC,new Uint8Array([1,i[3],i[4],i[5],255,224|t.sps.length].concat(i).concat([t.pps.length]).concat(n))),o=t.width,l=t.height,u=t.pixelRatio[0],d=t.pixelRatio[1];return c.box(c.types.avc1,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,o>>8&255,255&o,l>>8&255,255&l,0,72,0,0,0,72,0,0,0,0,0,0,0,1,18,100,97,105,108,121,109,111,116,105,111,110,47,104,108,115,46,106,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,17]),a,c.box(c.types.btrt,new Uint8Array([0,28,156,128,0,45,198,192,0,45,198,192])),c.box(c.types.pasp,new Uint8Array([u>>24,u>>16&255,u>>8&255,255&u,d>>24,d>>16&255,d>>8&255,255&d])))},c.esds=function(t){var e=t.config.length;return new Uint8Array([0,0,0,0,3,23+e,0,1,0,4,15+e,64,21,0,0,0,0,0,0,0,0,0,0,0,5].concat([e]).concat(t.config).concat([6,1,2]))},c.mp4a=function(t){var e=t.samplerate;return c.box(c.types.mp4a,new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,e>>8&255,255&e,0,0]),c.box(c.types.esds,c.esds(t)))},c.mp3=function(t){var e=t.samplerate;return c.box(c.types[".mp3"],new Uint8Array([0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,t.channelCount,0,16,0,0,0,0,e>>8&255,255&e,0,0]))},c.stsd=function(t){return"audio"===t.type?"mp3"===t.segmentCodec&&"mp3"===t.codec?c.box(c.types.stsd,c.STSD,c.mp3(t)):c.box(c.types.stsd,c.STSD,c.mp4a(t)):c.box(c.types.stsd,c.STSD,c.avc1(t))},c.tkhd=function(t){var e=t.id,r=t.duration*t.timescale,i=t.width,t=t.height,n=Math.floor(r/(1+s)),r=Math.floor(r%(1+s));return c.box(c.types.tkhd,new Uint8Array([1,0,0,7,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,3,e>>24&255,e>>16&255,e>>8&255,255&e,0,0,0,0,n>>24,n>>16&255,n>>8&255,255&n,r>>24,r>>16&255,r>>8&255,255&r,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,i>>8&255,255&i,0,0,t>>8&255,255&t,0,0]))},c.traf=function(t,e){var r=c.sdtp(t),i=t.id,n=Math.floor(e/(1+s)),e=Math.floor(e%(1+s));return c.box(c.types.traf,c.box(c.types.tfhd,new Uint8Array([0,0,0,0,i>>24,i>>16&255,i>>8&255,255&i])),c.box(c.types.tfdt,new Uint8Array([1,0,0,0,n>>24,n>>16&255,n>>8&255,255&n,e>>24,e>>16&255,e>>8&255,255&e])),c.trun(t,r.length+16+20+8+16+8+8),r)},c.trak=function(t){return t.duration=t.duration||4294967295,c.box(c.types.trak,c.tkhd(t),c.mdia(t))},c.trex=function(t){t=t.id;return c.box(c.types.trex,new Uint8Array([0,0,0,0,t>>24,t>>16&255,t>>8&255,255&t,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1]))},c.trun=function(t,e){var r,i,n,s,a,o=t.samples||[],l=o.length,u=12+16*l,d=new Uint8Array(u);for(d.set(["video"===t.type?1:0,0,15,1,l>>>24&255,l>>>16&255,l>>>8&255,255&l,(e+=8+u)>>>24&255,e>>>16&255,e>>>8&255,255&e],0),r=0;r>>24&255,i>>>16&255,i>>>8&255,255&i,n>>>24&255,n>>>16&255,n>>>8&255,255&n,s.isLeading<<2|s.dependsOn,s.isDependedOn<<6|s.hasRedundancy<<4|s.paddingValue<<1|s.isNonSync,61440&s.degradPrio,15&s.degradPrio,a>>>24&255,a>>>16&255,a>>>8&255,255&a],12+16*r);return c.box(c.types.trun,d)},c.initSegment=function(t){c.types||c.init();var t=c.moov(t),e=new Uint8Array(c.FTYP.byteLength+t.byteLength);return e.set(c.FTYP),e.set(t,c.FTYP.byteLength),e},c}();r.types=void 0,r.HDLR_TYPES=void 0,r.STTS=void 0,r.STSC=void 0,r.STCO=void 0,r.STSZ=void 0,r.VMHD=void 0,r.SMHD=void 0,r.STSD=void 0,r.FTYP=void 0,r.DINF=void 0;const i=r},"./src/remux/mp4-remuxer.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i,flushTextTrackMetadataCueSamples:()=>L,flushTextTrackUserdataCueSamples:()=>D,normalizePts:()=>at});var h=r("./src/polyfills/number.ts"),N=r("./src/remux/aac-helper.ts"),J=r("./src/remux/mp4-generator.ts"),Z=r("./src/events.ts"),tt=r("./src/errors.ts"),et=r("./src/utils/logger.ts"),b=r("./src/types/loader.ts"),rt=r("./src/utils/timescale-conversion.ts");function it(){return(it=Object.assign?Object.assign.bind():function(t){for(var e=1;es[0].pts)&&(v=u,A=s[0].pts-e,s[0].dts=v,s[0].pts=A,et.logger.log("Video: First PTS/DTS adjusted: "+(0,rt.toMsFromMpegTsClock)(A,!0)+"/"+(0,rt.toMsFromMpegTsClock)(v,!0)+", delta: "+(0,rt.toMsFromMpegTsClock)(e,!0)+" ms")),v=Math.max(0,v),0),M=0,T=0;T{"use strict";r.r(e),r.d(e,{default:()=>i});var c=r("./src/polyfills/number.ts"),h=r("./src/remux/mp4-remuxer.ts"),f=r("./src/utils/mp4-tools.ts"),s=r("./src/loader/fragment.ts"),g=r("./src/utils/logger.ts");function a(t,e){t=null==t?void 0:t.codec;return t&&4{"use strict";r.r(e),r.d(e,{default:()=>i});var i=function(){function t(){this._boundTick=void 0,this._tickTimer=null,this._tickInterval=null,this._tickCallCount=0,this._boundTick=this.tick.bind(this)}var e=t.prototype;return e.destroy=function(){this.onHandlerDestroying(),this.onHandlerDestroyed()},e.onHandlerDestroying=function(){this.clearNextTick(),this.clearInterval()},e.onHandlerDestroyed=function(){},e.hasInterval=function(){return!!this._tickInterval},e.hasNextTick=function(){return!!this._tickTimer},e.setInterval=function(t){return!this._tickInterval&&(this._tickInterval=self.setInterval(this._boundTick,t),!0)},e.clearInterval=function(){return!(!this._tickInterval||(self.clearInterval(this._tickInterval),this._tickInterval=null))},e.clearNextTick=function(){return!(!this._tickTimer||(self.clearTimeout(this._tickTimer),this._tickTimer=null))},e.tick=function(){this._tickCallCount++,1===this._tickCallCount&&(this.doTick(),1{"use strict";r.r(e),r.d(e,{CMCDObjectType:()=>i,CMCDStreamType:()=>s,CMCDStreamingFormat:()=>n,CMCDVersion:()=>a});var i,n,s,a=1;(r=i=i||{}).MANIFEST="m",r.AUDIO="a",r.VIDEO="v",r.MUXED="av",r.INIT="i",r.CAPTION="c",r.TIMED_TEXT="tt",r.KEY="k",r.OTHER="o",(e=n=n||{}).DASH="d",e.HLS="h",e.SMOOTH="s",e.OTHER="o",(r=s=s||{}).VOD="v",r.LIVE="l"},"./src/types/demuxer.ts":(t,e,r)=>{"use strict";var i;r.r(e),r.d(e,{MetadataSchema:()=>i}),(r=i=i||{}).audioId3="org.id3",r.dateRange="com.apple.quicktime.HLS",r.emsg="https://aomedia.org/emsg/ID3"},"./src/types/level.ts":(t,e,r)=>{"use strict";function n(t,e){for(var r=0;ri,HlsSkip:()=>s,HlsUrlParameters:()=>a,Level:()=>o,getSkipValue:()=>function(t,e){var r=t.canSkipUntil,i=t.canSkipDateRanges,t=t.endSN,e=void 0!==e?e-t:0;if(r&&e{"use strict";var i,n;r.r(e),r.d(e,{PlaylistContextType:()=>i,PlaylistLevelType:()=>n}),(r=i=i||{}).MANIFEST="manifest",r.LEVEL="level",r.AUDIO_TRACK="audioTrack",r.SUBTITLE_TRACK="subtitleTrack",(e=n=n||{}).MAIN="main",e.AUDIO="audio",e.SUBTITLE="subtitle"},"./src/types/transmuxer.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{ChunkMetadata:()=>i});var i=function(t,e,r,i,n,s){void 0===i&&(i=0),void 0===n&&(n=-1),void 0===s&&(s=!1),this.level=void 0,this.sn=void 0,this.part=void 0,this.id=void 0,this.size=void 0,this.partial=void 0,this.transmuxing=a(),this.buffering={audio:a(),video:a(),audiovideo:a()},this.level=t,this.sn=e,this.id=r,this.size=i,this.part=n,this.partial=s};function a(){return{start:0,executeStart:0,executeEnd:0,end:0}}},"./src/utils/attr-list.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{AttrList:()=>s});var i=/^(\d+)x(\d+)$/,n=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g,s=function(){function r(t){for(var e in t="string"==typeof t?r.parseAttrList(t):t)t.hasOwnProperty(e)&&(this[e]=t[e])}var t=r.prototype;return t.decimalInteger=function(t){t=parseInt(this[t],10);return t>Number.MAX_SAFE_INTEGER?1/0:t},t.hexadecimalInteger=function(t){if(this[t]){for(var e=(1&(e=(this[t]||"0x").slice(2)).length?"0":"")+e,r=new Uint8Array(e.length/2),i=0;iNumber.MAX_SAFE_INTEGER?1/0:t},t.decimalFloatingPoint=function(t){return parseFloat(this[t])},t.optionalFloat=function(t,e){t=this[t];return t?parseFloat(t):e},t.enumeratedString=function(t){return this[t]},t.bool=function(t){return"YES"===this[t]},t.decimalResolution=function(t){t=i.exec(this[t]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}},r.parseAttrList=function(t){var e,r={};for(n.lastIndex=0;null!==(e=n.exec(t));){var i=e[2];0===i.indexOf('"')&&i.lastIndexOf('"')===i.length-1&&(i=i.slice(1,-1)),r[e[1]]=i}return r},r}()},"./src/utils/binary-search.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});const i={search:function(t,e){for(var r=0,i=t.length-1;r<=i;){var n,s,a=e(s=t[n=(r+i)/2|0]);if(0{"use strict";r.r(e),r.d(e,{BufferHelper:()=>s});var i=r("./src/utils/logger.ts"),n={length:0,start:function(){return 0},end:function(){return 0}},s=function(){function a(){}return a.isBuffered=function(t,e){try{if(t)for(var r=a.getBuffered(t),i=0;i=r.start(i)&&e<=r.end(i))return!0}catch(t){}return!1},a.bufferInfo=function(t,e,r){try{if(t){for(var i=a.getBuffered(t),n=[],s=0;ss&&(i[a-1].end=t[n].end):i.push(t[n])}else i=t;for(var o,l=0,u=e,d=e,c=0;c{"use strict";r.r(e),r.d(e,{CaptionScreen:()=>v,Row:()=>m,default:()=>b});function s(t){var e=t;return n.hasOwnProperty(t)&&(e=n[t]),String.fromCharCode(e)}function l(t){for(var e=[],r=0;r=t&&(e="function"==typeof e?e():e,i.logger.log(this.time+" ["+t+"] "+e))},t}()),g=function(){function t(t,e,r,i,n){this.foreground=void 0,this.underline=void 0,this.italics=void 0,this.background=void 0,this.flash=void 0,this.foreground=t||"white",this.underline=e||!1,this.italics=r||!1,this.background=i||"black",this.flash=n||!1}var e=t.prototype;return e.reset=function(){this.foreground="white",this.underline=!1,this.italics=!1,this.background="black",this.flash=!1},e.setStyles=function(t){for(var e=["foreground","underline","italics","background","flash"],r=0;r ("+l([a,o])+")"),(r=(r=(r=(r=this.parseCmd(a,o))||this.parseMidrow(a,o))||this.parsePAC(a,o))||this.parseBackgroundAttributes(a,o))||(i=this.parseChars(a,o))&&((s=this.currentChannel)&&0{"use strict";r.r(e),r.d(e,{isCodecSupportedInMp4:()=>function(t,e){return MediaSource.isTypeSupported((e||"video")+'/mp4;codecs="'+t+'"')},isCodecType:()=>function(t,e){e=i[e];return!!e&&!0===e[t.slice(0,4)]}});var i={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,av01:!0,drac:!0,dva1:!0,dvav:!0,dvh1:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0},text:{stpp:!0,wvtt:!0}}},"./src/utils/cues.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});var g=r("./src/utils/vttparser.ts"),p=r("./src/utils/webvtt-parser.ts"),m=r("./src/utils/texttrack-utils.ts"),v=/\s/;const i={newCue:function(e,t,r,i){for(var n,s,a,o,l=[],u=self.VTTCue||self.TextTrackCue,d=0;d{"use strict";r.r(e),r.d(e,{adjustSlidingStart:()=>h,alignMediaPlaylistByPDT:()=>function(t,e){var r,i,n;t.hasProgramDateTime&&e.hasProgramDateTime&&(i=t.fragments,e=e.fragments,i.length)&&e.length&&(r=Math.round(e.length/2)-1,e=e[r],r=l(i,e.cc)||i[Math.round(i.length/2)-1],i=e.programDateTime,n=r.programDateTime,null!==i)&&null!==n&&h((n-i)/1e3-(r.start-e.start),t)},alignPDT:()=>f,alignStream:()=>function(t,e,r){var i,n;e&&(u(t=t,n=e,i=r)&&(t=d(n.details,i))&&(0,s.isFiniteNumber)(t.start)&&(a.logger.log("Adjusting PTS using last level due to CC increase within current level "+i.url),h(t.start,i)),!r.alignedSliding&&e.details&&f(r,e.details),r.alignedSliding||!e.details||r.skippedSegments||(0,o.adjustSliding)(e.details,r))},findDiscontinuousReferenceFrag:()=>d,findFirstFragWithCC:()=>l,shouldAlignOnDiscontinuities:()=>u});var s=r("./src/polyfills/number.ts"),a=r("./src/utils/logger.ts"),o=r("./src/controller/level-helper.ts");function l(t,e){for(var r=null,i=0,n=t.length;ir.startCC||t&&t.cc{"use strict";r.r(e),r.d(e,{default:()=>i});var n=r("./src/utils/ewma.ts");const i=function(){function t(t,e,r){this.defaultEstimate_=void 0,this.minWeight_=void 0,this.minDelayMs_=void 0,this.slow_=void 0,this.fast_=void 0,this.defaultEstimate_=r,this.minWeight_=.001,this.minDelayMs_=50,this.slow_=new n.default(t),this.fast_=new n.default(e)}var e=t.prototype;return e.update=function(t,e){var r=this.slow_,i=this.fast_;this.slow_.halfLife!==t&&(this.slow_=new n.default(t,r.getEstimate(),r.getTotalWeight())),this.fast_.halfLife!==e&&(this.fast_=new n.default(e,i.getEstimate(),i.getTotalWeight()))},e.sample=function(t,e){t=(t=Math.max(t,this.minDelayMs_))/1e3,e=8*e/t;this.fast_.sample(t,e),this.slow_.sample(t,e)},e.canEstimate=function(){var t=this.fast_;return t&&t.getTotalWeight()>=this.minWeight_},e.getEstimate=function(){return this.canEstimate()?Math.min(this.fast_.getEstimate(),this.slow_.getEstimate()):this.defaultEstimate_},e.destroy=function(){},t}()},"./src/utils/ewma.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});const i=function(){function t(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0),this.halfLife=void 0,this.alpha_=void 0,this.estimate_=void 0,this.totalWeight_=void 0,this.halfLife=t,this.alpha_=t?Math.exp(Math.log(.5)/t):0,this.estimate_=e,this.totalWeight_=r}var e=t.prototype;return e.sample=function(t,e){var r=Math.pow(this.alpha_,t);this.estimate_=e*(1-r)+r*this.estimate_,this.totalWeight_+=t},e.getTotalWeight=function(){return this.totalWeight_},e.getEstimate=function(){if(this.alpha_){var t=1-Math.pow(this.alpha_,this.totalWeight_);if(t)return this.estimate_/t}return this.estimate_},t}()},"./src/utils/fetch-loader.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>d,fetchSupported:()=>function(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch(t){}return!1}});var c=r("./src/polyfills/number.ts"),i=r("./src/loader/load-stats.ts"),u=r("./src/demux/chunk-cache.ts");function n(t){var r="function"==typeof Map?new Map:void 0;return function(t){if(null===t||-1===Function.toString.call(t).indexOf("[native code]"))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==r){if(r.has(t))return r.get(t);r.set(t,e)}function e(){return s(t,arguments,o(this).constructor)}return e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),a(e,t)}(t)}function s(t,e,r){return(s=function(){if("undefined"==typeof Reflect||!Reflect.construct)return;if(Reflect.construct.sham)return;if("function"==typeof Proxy)return 1;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),1}catch(t){}}()?Reflect.construct.bind():function(t,e,r){var i=[null];i.push.apply(i,e);e=new(Function.bind.apply(t,i));return r&&a(e,r.prototype),e}).apply(null,arguments)}function a(t,e){return(a=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}function o(t){return(o=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function h(){return(h=Object.assign?Object.assign.bind():function(t){for(var e=1;e=a&&o(n,s,l.flush(),i)):o(n,s,t,i),r())}).catch(function(){return Promise.reject()})}()},t}();function l(t,e){return new self.Request(t.url,e)}var f=function(i){var t,e;function r(t,e,r){t=i.call(this,t)||this;return t.code=void 0,t.details=void 0,t.code=e,t.details=r,t}return e=i,(t=r).prototype=Object.create(e.prototype),a(t.prototype.constructor=t,e),r}(n(Error));const d=e},"./src/utils/hex.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});const i={hexDump:function(t){for(var e="",r=0;r{"use strict";r.r(e),r.d(e,{IMSC1_CODEC:()=>i,parseIMSC1:()=>function(t,e,r,i,n){t=(0,a.findBox)(new Uint8Array(t),["mdat"]);if(0===t.length)n(new Error("Could not parse IMSC1 mdat"));else{var t=t.map(function(t){return(0,l.utf8ArrayToStr)(t)}),s=(0,u.toTimescaleFromScale)(e,1,r);try{t.forEach(function(t){return i(function(t,s){var r,a,o,l,u,i=(new DOMParser).parseFromString(t,"text/xml").getElementsByTagName("tt")[0];if(i)return r={frameRate:30,subFrameRate:1,frameRateMultiplier:0,tickRate:0},a=Object.keys(r).reduce(function(t,e){return t[e]=i.getAttribute("ttp:"+e)||r[e],t},{}),o="preserve"!==i.getAttribute("xml:space"),l=v(m(i,"styling","style")),u=v(m(i,"layout","region")),t=m(i,"body","[begin]"),[].map.call(t,function(t){var e=function i(t,n){return[].slice.call(t.childNodes).reduce(function(t,e,r){return"br"===e.nodeName&&r?t+"\n":null!=(r=e.childNodes)&&r.length?i(e,n):n?t+e.textContent.trim().replace(/\s+/g," "):t+e.textContent},"")}(t,o);if(!e||!t.hasAttribute("begin"))return null;var r=T(t.getAttribute("begin"),a),i=T(t.getAttribute("dur"),a),n=T(t.getAttribute("end"),a);if(null===r)throw E(t);if(null===n){if(null===i)throw E(t);n=r+i}i=new d.default(r-s,n-s,e);i.id=(0,c.generateCueId)(i.startTime,i.endTime,i.text);r=function(i,n,t){var s="http://www.w3.org/ns/ttml#styling",a=null,e=null!=i&&i.hasAttribute("style")?i.getAttribute("style"):null;e&&t.hasOwnProperty(e)&&(a=t[e]);return["displayAlign","textAlign","color","backgroundColor","fontSize","fontFamily"].reduce(function(t,e){var r=y(n,s,e)||y(i,s,e)||y(a,s,e);return r&&(t[e]=r),t},{})}(u[t.getAttribute("region")],l[t.getAttribute("style")],l),n=r.textAlign;return n&&((e=p[n])&&(i.lineAlign=e),i.align=n),h(i,r),i}).filter(function(t){return null!==t});throw new Error("Invalid ttml")}(t,s))})}catch(t){n(t)}}}});var a=r("./src/utils/mp4-tools.ts"),o=r("./src/utils/vttparser.ts"),d=r("./src/utils/vttcue.ts"),l=r("./src/demux/id3.ts"),u=r("./src/utils/timescale-conversion.ts"),c=r("./src/utils/webvtt-parser.ts");function h(){return(h=Object.assign?Object.assign.bind():function(t){for(var e=1;e{"use strict";r.r(e),r.d(e,{changeEndianness:()=>function(t){function e(t,e,r){var i=t[e];t[e]=t[r],t[r]=i}e(t,0,3),e(t,1,2),e(t,4,5),e(t,6,7)},convertDataUriToArrayBytes:()=>function(t){var t=t.split(":"),e=null;{var r,i;"data"===t[0]&&2===t.length&&(t=t[1].split(";"),2===(i=t[t.length-1].split(",")).length)&&(r="base64"===i[0],i=i[1],e=(r?(t.splice(-1,1),n.base64Decode):function(t){var t=s(t).subarray(0,16),e=new Uint8Array(16);return e.set(t,16-t.length),e})(i))}return e},strToUtf8array:()=>s});var n=r("./src/utils/numeric-encoding-utils.ts");function s(t){return Uint8Array.from(unescape(encodeURIComponent(t)),function(t){return t.charCodeAt(0)})}},"./src/utils/logger.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{enableLogs:()=>function(t,e){if(self.console&&!0===t||"object"==typeof t){!function(e){for(var t=arguments.length,r=new Array(1");return n}(t)})}(t,"debug","log","info","warn","error");try{s.log('Debug logs enabled for "'+e+'"')}catch(t){s=i}}else s=i},logger:()=>a});function n(){}var i={trace:n,debug:n,log:n,warn:n,info:n,error:n},s=i;var a=s},"./src/utils/mediakeys-helper.ts":(t,e,r)=>{"use strict";var s,i,n;r.r(e),r.d(e,{KeySystemFormats:()=>i,KeySystemIds:()=>n,KeySystems:()=>s,getKeySystemsForConfig:()=>function(t){var e=t.drmSystems,t=t.widevineLicenseUrl,r=e?[s.FAIRPLAY,s.WIDEVINE,s.PLAYREADY,s.CLEARKEY].filter(function(t){return!!e[t]}):[];!r[s.WIDEVINE]&&t&&r.push(s.WIDEVINE);return r},getSupportedMediaKeySystemConfigurations:()=>function(t,e,r,i){var n;switch(t){case s.FAIRPLAY:n=["cenc","sinf"];break;case s.WIDEVINE:case s.PLAYREADY:n=["cenc"];break;case s.CLEARKEY:n=["cenc","keyids"];break;default:throw new Error("Unknown key-system: "+t)}return function(t,e,r,i){return[{initDataTypes:t,persistentState:i.persistentState||"not-allowed",distinctiveIdentifier:i.distinctiveIdentifier||"not-allowed",sessionTypes:i.sessionTypes||[i.sessionType||"temporary"],audioCapabilities:e.map(function(t){return{contentType:'audio/mp4; codecs="'+t+'"',robustness:i.audioRobustness||"",encryptionScheme:i.audioEncryptionScheme||null}}),videoCapabilities:r.map(function(t){return{contentType:'video/mp4; codecs="'+t+'"',robustness:i.videoRobustness||"",encryptionScheme:i.videoEncryptionScheme||null}})}]}(n,e,r,i)},keySystemDomainToKeySystemFormat:()=>function(t){switch(t){case s.FAIRPLAY:return i.FAIRPLAY;case s.PLAYREADY:return i.PLAYREADY;case s.WIDEVINE:return i.WIDEVINE;case s.CLEARKEY:return i.CLEARKEY}},keySystemFormatToKeySystemDomain:()=>function(t){switch(t){case i.FAIRPLAY:return s.FAIRPLAY;case i.PLAYREADY:return s.PLAYREADY;case i.WIDEVINE:return s.WIDEVINE;case i.CLEARKEY:return s.CLEARKEY}},keySystemIdToKeySystemDomain:()=>function(t){if(t===n.WIDEVINE)return s.WIDEVINE},requestMediaKeySystemAccess:()=>a}),(r=s=s||{}).CLEARKEY="org.w3.clearkey",r.FAIRPLAY="com.apple.fps",r.PLAYREADY="com.microsoft.playready",r.WIDEVINE="com.widevine.alpha",(e=i=i||{}).CLEARKEY="org.w3.clearkey",e.FAIRPLAY="com.apple.streamingkeydelivery",e.PLAYREADY="com.microsoft.playready",e.WIDEVINE="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed",(n=n||{}).WIDEVINE="edef8ba979d64acea3c827dcd51d21ed";var a="undefined"!=typeof self&&self.navigator&&self.navigator.requestMediaKeySystemAccess?self.navigator.requestMediaKeySystemAccess.bind(self.navigator):null},"./src/utils/mediasource-helper.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{getMediaSource:()=>function(){return self.MediaSource||self.WebKitMediaSource}})},"./src/utils/mp4-tools.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{RemuxerTrackIdConfig:()=>l,appendUint8Array:()=>function(t,e){var r=new Uint8Array(t.length+e.length);return r.set(t),r.set(e,t.length),r},bin2str:()=>c,computeRawDurationFromSamples:()=>b,discardEPB:()=>A,findBox:()=>w,getDuration:()=>function(t,e){for(var r=0,i=0,n=0,s=w(t,["moof","traf"]),a=0;afunction(s,t){return w(t,["moof","traf"]).reduce(function(t,e){var i=w(e,["tfdt"])[0],n=i[0],e=w(e,["tfhd"]).reduce(function(t,e){e=C(e,4),e=s[e];if(e){var r=C(i,4),e=(1===n&&(r=(r*=Math.pow(2,32))+C(i,8)),e.timescale||9e4),r=r/e;if(isFinite(r)&&(null===t||rh,mp4pssh:()=>function(t,e,r){if(16!==t.byteLength)throw new RangeError("Invalid system id");var i,n,s;if(e){i=1,n=new Uint8Array(16*e.length);for(var a=0;afunction(r,t,n){w(t,["moof","traf"]).forEach(function(e){w(e,["tfhd"]).forEach(function(t){var i,t=C(t,4),t=r[t];t&&(i=t.timescale||9e4,w(e,["tfdt"]).forEach(function(t){var e=t[0],r=C(t,4);0===e?(r-=n*i,u(t,4,r=Math.max(r,0))):(r=(r=(r*=Math.pow(2,32))+C(t,8))-n*i,r=Math.max(r,0),e=Math.floor(r/(s+1)),r=Math.floor(r%(s+1)),u(t,4,e),u(t,8,r))}))})})},parseEmsg:()=>function(t){var e=t[0],r="",i="",n=0,s=0,a=0,o=0,l=0,u=0;if(0===e){for(;"\0"!==c(t.subarray(u,u+1));)r+=c(t.subarray(u,u+1)),u+=1;for(r+=c(t.subarray(u,u+1)),u+=1;"\0"!==c(t.subarray(u,u+1));)i+=c(t.subarray(u,u+1)),u+=1;i+=c(t.subarray(u,u+1)),u+=1,n=C(t,12),s=C(t,16),o=C(t,20),l=C(t,24),u=28}else if(1===e){n=C(t,u+=4);var e=C(t,u+=4),d=C(t,u+=4);for(u+=4,a=Math.pow(2,32)*e+d,Number.isSafeInteger(a)||(a=Number.MAX_SAFE_INTEGER),o=C(t,u),l=C(t,u+=4),u+=4;"\0"!==c(t.subarray(u,u+1));)r+=c(t.subarray(u,u+1)),u+=1;for(r+=c(t.subarray(u,u+1)),u+=1;"\0"!==c(t.subarray(u,u+1));)i+=c(t.subarray(u,u+1)),u+=1;i+=c(t.subarray(u,u+1)),u+=1}e=t.subarray(u,t.byteLength);return{schemeIdUri:r,value:i,timeScale:n,presentationTime:a,presentationTimeDelta:s,eventDuration:o,id:l,payload:e}},parseInitSegment:()=>function(t){for(var r=[],e=w(t,["moov","trak"]),i=0;ifunction(t){if(!(t instanceof ArrayBuffer)||t.byteLength<32)return null;var e={version:0,systemId:"",kids:null,data:null},r=new DataView(t),i=r.getUint32(0);if(t.byteLength!==i&&44>>24,1O,parseSamples:()=>function(b,L){var D=[],A=L.samples,k=L.timescale,s=L.id,R=!1;return w(A,["moof"]).map(function(t){var S=t.byteOffset-8;w(t,["traf"]).map(function(n){var t=w(n,["tfdt"]).map(function(t){var e=t[0],r=C(t,4);return(r=1===e?(r*=Math.pow(2,32))+C(t,8):r)/k})[0];return void 0!==t&&(b=t),w(n,["tfhd"]).map(function(t){var e=C(t,4),r=16777215&C(t,0),E=0,T=0,i=8;e===s&&(0!=(1&r)&&(i+=8),0!=(2&r)&&(i+=4),0!=(8&r)&&(E=C(t,i),i+=4),0!=(16&r)&&(T=C(t,i),i+=4),0!=(32&r)&&(i+=4),"video"===L.type&&(e=L.codec,R=!!e&&("hvc1"===(e=(t=e.indexOf("."))<0?e:e.substring(0,t))||"hev1"===e||"dvh1"===e||"dvhe"===e)),w(n,["trun"]).map(function(t){for(var e,r,i=t[0],n=16777215&C(t,0),s=0,a=0!=(256&n),o=0,l=0!=(512&n),u=0,d=0!=(1024&n),c=0!=(2048&n),h=0,f=C(t,4),g=8,p=(0!=(1&n)&&(s=C(t,g),g+=4),0!=(4&n)&&(g+=4),s+S),m=0;m>1&63)||40==e:6==(31&r))&&O(A.subarray(p,p+y),R?2:1,b+h/k,D),p+=y,v+=y+4}b+=o/k}}))})})}),D},parseSegmentIndex:()=>S,parseSinf:()=>d,patchEncyptionData:()=>function(t,e){var i;return t&&e&&(i=e.keyId)&&e.isCommonEncryption&&w(t,["moov","trak"]).forEach(function(t){var t=w(t,["mdia","minf","stbl","stsd"])[0].subarray(8),e=w(t,["enca"]),r=0sinf>>tenc' box: "+a.default.hexDump(e)+" -> "+a.default.hexDump(i)),t.set(i,8))})})}),t},readSint32:()=>_,readUint16:()=>D,readUint32:()=>C,segmentValidRange:()=>function(t){var e={valid:null,remainder:null},r=w(t,["moof"]);if(r){if(r.length<2)return e.remainder=t,e;r=r[r.length-1];e.valid=(0,i.sliceUint8)(t,0,r.byteOffset-8),e.remainder=(0,i.sliceUint8)(t,r.byteOffset-8)}return e},writeUint32:()=>u});var I=r("./src/loader/fragment.ts"),i=r("./src/utils/typed-array.ts"),L=r("./src/demux/id3.ts"),n=r("./src/utils/logger.ts"),a=r("./src/utils/hex.ts"),s=Math.pow(2,32)-1,o=[].push,l={video:1,audio:2,id3:3,text:4};function c(t){return String.fromCharCode.apply(null,t)}function D(t,e){t=t[e]<<8|t[e+1];return t<0?65536+t:t}function C(t,e){t=_(t,e);return t<0?4294967296+t:t}function _(t,e){return t[e]<<24|t[e+1]<<16|t[e+2]<<8|t[e+3]}function u(t,e,r){t[e]=r>>24,t[e+1]=r>>16&255,t[e+2]=r>>8&255,t[e+3]=255&r}function w(t,e){var r=[];if(e.length)for(var i=t.byteLength,n=0;n>>31)return null;u=C(t,l+=4);l+=4,e.push({referenceSize:d,subsegmentDuration:u,info:{duration:u/n,start:s,end:s+d-1}}),s+=d,i=l+=4}return{earliestPresentationTime:0,timescale:n,version:r,referencesCount:a,references:e}}function d(t){var e=w(t,["schm"])[0];if(e){e=c(e.subarray(4,8));if("cbcs"===e||"cenc"===e)return w(t,["schi","tenc"])[0]}return n.logger.error("[eme] missing 'schm' box"),null}function b(t){for(var e=C(t,0),r=8,i=(1&e&&(r+=4),4&e&&(r+=4),0),n=C(t,4),s=0;s=n.length)&&(a+=u=n[s++],255===u););for(o=0;!(s>=n.length)&&(o+=u=n[s++],255===u););var d=n.length-s;if(!l&&4===a&&s>24&255,o[1]=s>>16&255,o[2]=s>>8&255,o[3]=255&s,o.set(t,4),a=0,s=8;a{"use strict";function i(t){return t.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function n(t){return btoa(String.fromCharCode.apply(String,t))}r.r(e),r.d(e,{base64Decode:()=>function(t){return Uint8Array.from(atob(t),function(t){return t.charCodeAt(0)})},base64DecodeToStr:()=>function(t){return atob(t)},base64Encode:()=>n,base64ToBase64Url:()=>i,base64UrlEncode:()=>function(t){return i(n(t))},strToBase64Encode:()=>function(t){return btoa(t)}})},"./src/utils/output-filter.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});var i=function(){function t(t,e){this.timelineController=void 0,this.cueRanges=[],this.trackName=void 0,this.startTime=null,this.endTime=null,this.screen=null,this.timelineController=t,this.trackName=e}var e=t.prototype;return e.dispatchCue=function(){null!==this.startTime&&(this.timelineController.addCues(this.trackName,this.startTime,this.endTime,this.screen,this.cueRanges),this.startTime=null)},e.newCue=function(t,e,r){(null===this.startTime||this.startTime>t)&&(this.startTime=t),this.endTime=e,this.screen=r,this.timelineController.createCaptionsTrack(this.trackName)},e.reset=function(){this.cueRanges=[],this.startTime=null},t}()},"./src/utils/texttrack-utils.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{addCueToTrack:()=>function(e,r){var t=e.mode;"disabled"===t&&(e.mode="hidden");if(e.cues&&!e.cues.getCueById(r.id))try{if(e.addCue(r),!e.cues.getCueById(r.id))throw new Error("addCue is failed for: "+r)}catch(t){n.logger.debug("[texttrack-utils]: "+t);var i=new self.TextTrackCue(r.startTime,r.endTime,r.text);i.id=r.id,e.addCue(i)}"disabled"===t&&(e.mode=t)},clearCurrentCues:()=>function(t){var e=t.mode;"disabled"===e&&(t.mode="hidden");if(t.cues)for(var r=t.cues.length;r--;)t.removeCue(t.cues[r]);"disabled"===e&&(t.mode=e)},getCuesInRange:()=>o,removeCuesInRange:()=>function(t,e,r,i){var n=t.mode;"disabled"===n&&(t.mode="hidden");if(t.cues&&0function(t,e){var r;try{r=new Event("addtrack")}catch(t){(r=document.createEvent("Event")).initEvent("addtrack",!1,!1)}r.track=t,e.dispatchEvent(r)}});var n=r("./src/utils/logger.ts");function o(t,e,r){var i=[],n=function(t,e){if(et[r].endTime)return-1;for(var i=0,n=r;i<=n;){var s=Math.floor((n+i)/2);if(et[s].startTime&&i=e&&o.endTime<=r)i.push(o);else if(o.startTime>r)return i}return i}},"./src/utils/time-ranges.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});const i={toString:function(t){for(var e="",r=t.length,i=0;i{"use strict";r.r(e),r.d(e,{toMpegTsClockFromTimescale:()=>function(t,e){void 0===e&&(e=1);return n(t,i,1/e)},toMsFromMpegTsClock:()=>function(t,e){void 0===e&&(e=!1);return n(t,1e3,1/i,e)},toTimescaleFromBase:()=>n,toTimescaleFromScale:()=>function(t,e,r,i){void 0===r&&(r=1);void 0===i&&(i=!1);return n(t,e,1/r,i)}});var i=9e4;function n(t,e,r,i){t=t*e*(r=void 0===r?1:r);return(i=void 0===i?!1:i)?Math.round(t):t}},"./src/utils/typed-array.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{sliceUint8:()=>function(t,e,r){return Uint8Array.prototype.slice?t.slice(e,r):new Uint8Array(Array.prototype.slice.call(t,e,r))}})},"./src/utils/vttcue.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>i});const i="undefined"!=typeof self&&self.VTTCue?self.VTTCue:(b=["","lr","rl"],s=["start","middle","end","left","right"],n.prototype.getCueAsHTML=function(){return self.WebVTT.convertCueToDOMTree(self,this.text)},n);function E(t,e){return"string"==typeof e&&!!Array.isArray(t)&&(e=e.toLowerCase(),!!~t.indexOf(e))&&e}function T(t){return E(s,t)}function S(t){for(var e=arguments.length,r=new Array(1{"use strict";r.r(e),r.d(e,{VTTParser:()=>n,fixLineBreaks:()=>f,parseTimeStamp:()=>l});var o=r("./src/utils/vttcue.ts"),i=function(){function t(){}return t.prototype.decode=function(t,e){if(!t)return"";if("string"!=typeof t)throw new Error("Error - expected string data.");return decodeURIComponent(encodeURIComponent(t))},t}();function l(t){function e(t,e,r,i){return 3600*(0|t)+60*(0|e)+(0|r)+parseFloat(i||0)}t=t.match(/^(?:(\d+):)?(\d{2}):(\d{2})(\.\d+)?/);return t?59/gi,"\n")}var n=function(){function t(){this.state="INITIAL",this.buffer="",this.decoder=new i,this.regionList=[],this.cue=null,this.oncue=void 0,this.onparsingerror=void 0,this.onflush=void 0}var e=t.prototype;return e.parse=function(t){var i=this;function e(){for(var t=0,e=f(e=i.buffer);t{"use strict";r.r(e),r.d(e,{generateCueId:()=>L,parseWebVTT:()=>function(t,e,r,n,s,a,i,o){var l,u=new m.VTTParser,t=(0,v.utf8ArrayToStr)(new Uint8Array(t)).trim().replace(T,"\n").split("\n"),d=[],c=(0,y.toMpegTsClockFromTimescale)(e,r),h="00:00.000",f=0,g=0,p=!0;u.oncue=function(t){var e=n[s],r=n.ccOffset,i=(f-c)/9e4,e=(null!=e&&e.new&&(void 0!==g?r=n.ccOffset=e.start:D(n,s,i)),i&&(r=i-n.presentationOffset),t.endTime-t.startTime),i=(0,E.normalizePts)(9e4*(t.startTime+r-g),9e4*a)/9e4,r=(t.startTime=Math.max(i,0),t.endTime=Math.max(i+e,0),t.text.trim());t.text=decodeURIComponent(encodeURIComponent(r)),t.id||(t.id=L(t.startTime,t.endTime,r)),0>>0).toString()};function L(t,e,r){return i(t.toString())+i(e.toString())+i(r)}var D=function(t,e,r){var i,n=t[e],s=t[n.prevCC];if(!s||!s.new&&n.new)t.ccOffset=t.presentationOffset=n.start,n.new=!1;else{for(;null!=(i=s)&&i.new;)t.ccOffset+=n.start-s.start,n.new=!1,s=t[(n=s).prevCC];t.presentationOffset=r}}},"./src/utils/xhr-loader.ts":(t,e,r)=>{"use strict";r.r(e),r.d(e,{default:()=>s});var o=r("./src/utils/logger.ts"),i=r("./src/loader/load-stats.ts"),n=/^age:\s*[\d.]+\s*$/m;const s=function(){function t(t){this.xhrSetup=void 0,this.requestTimeout=void 0,this.retryTimeout=void 0,this.retryDelay=void 0,this.config=null,this.callbacks=null,this.context=void 0,this.loader=null,this.stats=void 0,this.xhrSetup=t?t.xhrSetup:null,this.stats=new i.LoadStats,this.retryDelay=0}var e=t.prototype;return e.destroy=function(){this.callbacks=null,this.abortInternal(),this.loader=null,this.config=null},e.abortInternal=function(){var t=this.loader;self.clearTimeout(this.requestTimeout),self.clearTimeout(this.retryTimeout),t&&(t.onreadystatechange=null,t.onprogress=null,4!==t.readyState)&&(this.stats.aborted=!0,t.abort())},e.abort=function(){var t;this.abortInternal(),null!=(t=this.callbacks)&&t.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.loader)},e.load=function(t,e,r){if(this.stats.loading.start)throw new Error("Loader can only be used once.");this.stats.loading.start=self.performance.now(),this.context=t,this.config=e,this.callbacks=r,this.retryDelay=e.retryDelay,this.loadInternal()},e.loadInternal=function(){var t=this.config,e=this.context;if(t){var r=this.loader=new self.XMLHttpRequest,i=this.stats,i=(i.loading.first=0,i.loaded=0,this.xhrSetup);try{if(i)try{i(r,e.url)}catch(t){r.open("GET",e.url,!0),i(r,e.url)}r.readyState||r.open("GET",e.url,!0);var n=this.context.headers;if(n)for(var s in n)r.setRequestHeader(s,n[s])}catch(t){return void this.callbacks.onError({code:r.status,text:t.message},e,r)}e.rangeEnd&&r.setRequestHeader("Range","bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),r.onreadystatechange=this.readystatechange.bind(this),r.onprogress=this.loadprogress.bind(this),r.responseType=e.responseType,self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),t.timeout),r.send()}},e.readystatechange=function(){var t,e,r,i,n=this.context,s=this.loader,a=this.stats;n&&s&&(e=s.readyState,t=this.config,a.aborted||2<=e&&(self.clearTimeout(this.requestTimeout),0===a.loading.first&&(a.loading.first=Math.max(self.performance.now(),a.loading.start)),4===e?(s.onreadystatechange=null,s.onprogress=null,e=s.status,i="arraybuffer"===s.responseType,200<=e&&e<300&&(i&&s.response||null!==s.responseText)?(a.loading.end=Math.max(self.performance.now(),a.loading.first),i=i?(r=s.response).byteLength:(r=s.responseText).length,a.loaded=a.total=i,this.callbacks&&((i=this.callbacks.onProgress)&&i(a,n,r,s),this.callbacks)&&(i={url:s.responseURL,data:r},this.callbacks.onSuccess(i,a,n,s))):a.retry>=t.maxRetry||400<=e&&e<499?(o.logger.error(e+" while loading "+n.url),this.callbacks.onError({code:e,text:s.statusText},n,s)):(o.logger.warn(e+" while loading "+n.url+", retrying in "+this.retryDelay+"..."),this.abortInternal(),this.loader=null,self.clearTimeout(this.retryTimeout),this.retryTimeout=self.setTimeout(this.loadInternal.bind(this),this.retryDelay),this.retryDelay=Math.min(2*this.retryDelay,t.maxRetryDelay),a.retry++)):(self.clearTimeout(this.requestTimeout),this.requestTimeout=self.setTimeout(this.loadtimeout.bind(this),t.timeout))))},e.loadtimeout=function(){o.logger.warn("timeout while loading "+this.context.url);var t=this.callbacks;t&&(this.abortInternal(),t.onTimeout(this.stats,this.context,this.loader))},e.loadprogress=function(t){var e=this.stats;e.loaded=t.loaded,t.lengthComputable&&(e.total=t.total)},e.getCacheAge=function(){var t,e=null;return e=this.loader&&n.test(this.loader.getAllResponseHeaders())?(t=this.loader.getResponseHeader("age"))?parseFloat(t):null:e},t}()},"./node_modules/eventemitter3/index.js":t=>{"use strict";var i=Object.prototype.hasOwnProperty,f="~";function r(){}function s(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function n(t,e,r,i,n){if("function"!=typeof r)throw new TypeError("The listener must be a function");r=new s(r,i||t,n),i=f?f+e:e;return t._events[i]?t._events[i].fn?t._events[i]=[t._events[i],r]:t._events[i].push(r):(t._events[i]=r,t._eventsCount++),t}function l(t,e){0==--t._eventsCount?t._events=new r:delete t._events[e]}function e(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(f=!1)),e.prototype.eventNames=function(){var t,e,r=[];if(0===this._eventsCount)return r;for(e in t=this._events)i.call(t,e)&&r.push(f?e.slice(1):e);return Object.getOwnPropertySymbols?r.concat(Object.getOwnPropertySymbols(t)):r},e.prototype.listeners=function(t){var t=f?f+t:t,e=this._events[t];if(!e)return[];if(e.fn)return[e.fn];for(var r=0,i=e.length,n=new Array(i);r{var e=t&&t.__esModule?()=>t.default:()=>t;return i.d(e,{a:e}),e},i.d=(t,e)=>{for(var r in e)i.o(e,r)&&!i.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},i.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),i.r=t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},i("./src/hls.ts").default;function i(t){var e=n[t];return void 0!==e||(e=n[t]={exports:{}},r[t].call(e.exports,e,e.exports,i)),e.exports}var r,n},t.exports=i())}]);if (typeof module === 'object' && module.exports) { module.exports = window.hlsSourceHandler; } diff --git a/pod/video/static/js/videojs-logo-controlbar.js b/pod/video/static/js/videojs-logo-controlbar.js index dc2df438a0..987b686862 100644 --- a/pod/video/static/js/videojs-logo-controlbar.js +++ b/pod/video/static/js/videojs-logo-controlbar.js @@ -45,7 +45,7 @@ * Initialize the plugin. */ videoJsLogo = function (options) { - var settings = videojs.mergeOptions(defaults, options), + var settings = videojs.obj.merge(defaults, options), player = this; player.ready(function () { if (settings.ui) { diff --git a/pod/video/static/js/videojs-vtt-thumbnails.js b/pod/video/static/js/videojs-vtt-thumbnails.js new file mode 100644 index 0000000000..88582a9752 --- /dev/null +++ b/pod/video/static/js/videojs-vtt-thumbnails.js @@ -0,0 +1,634 @@ +/** + * videojs-vtt-thumbnails + * @version 0.0.13 + * @copyright 2019 Chris Boustead + * @license MIT + */ +(function (global, factory) { + typeof exports === "object" && typeof module !== "undefined" + ? (module.exports = factory(require("video.js"))) + : typeof define === "function" && define.amd + ? define(["video.js"], factory) + : ((global = + typeof globalThis !== "undefined" ? globalThis : global || self), + (global.videojsVttThumbnails = factory(global.videojs))); +})(this, function (videojs) { + "use strict"; + + videojs = + videojs && videojs.hasOwnProperty("default") ? videojs["default"] : videojs; + + var version = "0.0.13"; + + var asyncGenerator = (function () { + function AwaitValue(value) { + this.value = value; + } + + function AsyncGenerator(gen) { + var front, back; + + function send(key, arg) { + return new Promise(function (resolve, reject) { + var request = { + key: key, + arg: arg, + resolve: resolve, + reject: reject, + next: null, + }; + + if (back) { + back = back.next = request; + } else { + front = back = request; + resume(key, arg); + } + }); + } + + function resume(key, arg) { + try { + var result = gen[key](arg); + var value = result.value; + + if (value instanceof AwaitValue) { + Promise.resolve(value.value).then( + function (arg) { + resume("next", arg); + }, + function (arg) { + resume("throw", arg); + }, + ); + } else { + settle(result.done ? "return" : "normal", result.value); + } + } catch (err) { + settle("throw", err); + } + } + + function settle(type, value) { + switch (type) { + case "return": + front.resolve({ + value: value, + done: true, + }); + break; + + case "throw": + front.reject(value); + break; + + default: + front.resolve({ + value: value, + done: false, + }); + break; + } + + front = front.next; + + if (front) { + resume(front.key, front.arg); + } else { + back = null; + } + } + + this._invoke = send; + + if (typeof gen.return !== "function") { + this.return = undefined; + } + } + + if (typeof Symbol === "function" && Symbol.asyncIterator) { + AsyncGenerator.prototype[Symbol.asyncIterator] = function () { + return this; + }; + } + + AsyncGenerator.prototype.next = function (arg) { + return this._invoke("next", arg); + }; + + AsyncGenerator.prototype.throw = function (arg) { + return this._invoke("throw", arg); + }; + + AsyncGenerator.prototype.return = function (arg) { + return this._invoke("return", arg); + }; + + return { + wrap: function (fn) { + return function () { + return new AsyncGenerator(fn.apply(this, arguments)); + }; + }, + await: function (value) { + return new AwaitValue(value); + }, + }; + })(); + + var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } + }; + + // import request from 'request'; + + // Default options for the plugin. + var defaults = {}; + + // Cross-compatibility for Video.js 5 and 6. + var registerPlugin = videojs.registerPlugin || videojs.plugin; + // const dom = videojs.dom || videojs; + + /** + * Function to invoke when the player is ready. + * + * This is a great place for your plugin to initialize itself. When this + * function is called, the player will have its DOM and child components + * in place. + * + * @function onPlayerReady + * @param {Player} player + * A Video.js player object. + * + * @param {Object} [options={}] + * A plain object containing options for the plugin. + */ + var onPlayerReady = function onPlayerReady(player, options) { + player.addClass("vjs-vtt-thumbnails"); + player.vttThumbnails = new vttThumbnailsPlugin(player, options); + }; + + /** + * A video.js plugin. + * + * In the plugin function, the value of `this` is a video.js `Player` + * instance. You cannot rely on the player being in a "ready" state here, + * depending on how the plugin is invoked. This may or may not be important + * to you; if not, remove the wait for "ready"! + * + * @function vttThumbnails + * @param {Object} [options={}] + * An object of options left to the plugin author to define. + */ + var vttThumbnails = function vttThumbnails(options) { + var _this = this; + + this.ready(function () { + onPlayerReady(_this, videojs.obj.merge(defaults, options)); + }); + }; + + /** + * VTT Thumbnails class. + * + * This class performs all functions related to displaying the vtt + * thumbnails. + */ + + var vttThumbnailsPlugin = (function () { + /** + * Plugin class constructor, called by videojs on + * ready event. + * + * @function constructor + * @param {Player} player + * A Video.js player object. + * + * @param {Object} [options={}] + * A plain object containing options for the plugin. + */ + function vttThumbnailsPlugin(player, options) { + classCallCheck(this, vttThumbnailsPlugin); + + this.player = player; + this.options = options; + this.listenForDurationChange(); + this.initializeThumbnails(); + this.registeredEvents = {}; + return this; + } + + vttThumbnailsPlugin.prototype.src = function src(source) { + this.resetPlugin(); + this.options.src = source; + this.initializeThumbnails(); + }; + + vttThumbnailsPlugin.prototype.detach = function detach() { + this.resetPlugin(); + }; + + vttThumbnailsPlugin.prototype.resetPlugin = function resetPlugin() { + this.thumbnailHolder && + this.thumbnailHolder.parentNode.removeChild(this.thumbnailHolder); + this.progressBar && + this.progressBar.removeEventListener( + "mouseenter", + this.registeredEvents.progressBarMouseEnter, + ); + this.progressBar && + this.progressBar.removeEventListener( + "mouseleave", + this.registeredEvents.progressBarMouseLeave, + ); + this.progressBar && + this.progressBar.removeEventListener( + "mousemove", + this.registeredEvents.progressBarMouseMove, + ); + delete this.registeredEvents.progressBarMouseEnter; + delete this.registeredEvents.progressBarMouseLeave; + delete this.registeredEvents.progressBarMouseMove; + delete this.progressBar; + delete this.vttData; + delete this.thumbnailHolder; + delete this.lastStyle; + }; + + vttThumbnailsPlugin.prototype.listenForDurationChange = + function listenForDurationChange() { + this.player.on("durationchange", function () {}); + }; + + /** + * Bootstrap the plugin. + */ + + vttThumbnailsPlugin.prototype.initializeThumbnails = + function initializeThumbnails() { + var _this2 = this; + + if (!this.options.src) { + return; + } + var baseUrl = this.getBaseUrl(); + var url = this.getFullyQualifiedUrl(this.options.src, baseUrl); + this.getVttFile(url).then(function (data) { + _this2.vttData = _this2.processVtt(data); + _this2.setupThumbnailElement(); + }); + }; + + /** + * Builds a base URL should we require one. + * + * @returns {string} + */ + + vttThumbnailsPlugin.prototype.getBaseUrl = function getBaseUrl() { + return [ + window.location.protocol, + "//", + window.location.hostname, + window.location.port ? ":" + window.location.port : "", + window.location.pathname, + ] + .join("") + .split(/([^\/]*)$/gi) + .shift(); + }; + + /** + * Grabs the contents of the VTT file. + * + * @param url + * @returns {Promise} + */ + + vttThumbnailsPlugin.prototype.getVttFile = function getVttFile(url) { + var _this3 = this; + + return new Promise(function (resolve, reject) { + var req = new XMLHttpRequest(); + req.data = { + resolve: resolve, + }; + req.addEventListener("load", _this3.vttFileLoaded); + req.open("GET", url); + req.send(); + }); + }; + + /** + * Callback for loaded VTT file. + */ + + vttThumbnailsPlugin.prototype.vttFileLoaded = function vttFileLoaded() { + this.data.resolve(this.responseText); + }; + + vttThumbnailsPlugin.prototype.setupThumbnailElement = + function setupThumbnailElement(data) { + var _this4 = this; + + var mouseDisplay = this.player.$(".vjs-mouse-display"); + this.progressBar = this.player.$(".vjs-progress-control"); + var thumbHolder = document.createElement("div"); + thumbHolder.setAttribute("class", "vjs-vtt-thumbnail-display"); + this.progressBar.appendChild(thumbHolder); + this.thumbnailHolder = thumbHolder; + if (mouseDisplay) { + mouseDisplay.classList.add("vjs-hidden"); + } + this.registeredEvents.progressBarMouseEnter = function () { + return _this4.onBarMouseenter(); + }; + this.registeredEvents.progressBarMouseLeave = function () { + return _this4.onBarMouseleave(); + }; + this.progressBar.addEventListener( + "mouseenter", + this.registeredEvents.progressBarMouseEnter, + ); + this.progressBar.addEventListener( + "mouseleave", + this.registeredEvents.progressBarMouseLeave, + ); + }; + + vttThumbnailsPlugin.prototype.onBarMouseenter = function onBarMouseenter() { + var _this5 = this; + + this.mouseMoveCallback = function (e) { + _this5.onBarMousemove(e); + }; + this.registeredEvents.progressBarMouseMove = this.mouseMoveCallback; + this.progressBar.addEventListener( + "mousemove", + this.registeredEvents.progressBarMouseMove, + ); + this.showThumbnailHolder(); + }; + + vttThumbnailsPlugin.prototype.onBarMouseleave = function onBarMouseleave() { + if (this.registeredEvents.progressBarMouseMove) { + this.progressBar.removeEventListener( + "mousemove", + this.registeredEvents.progressBarMouseMove, + ); + } + this.hideThumbnailHolder(); + }; + + vttThumbnailsPlugin.prototype.getXCoord = function getXCoord(bar, mouseX) { + var rect = bar.getBoundingClientRect(); + var docEl = document.documentElement; + return ( + mouseX - (rect.left + (window.pageXOffset || docEl.scrollLeft || 0)) + ); + }; + + vttThumbnailsPlugin.prototype.onBarMousemove = function onBarMousemove( + event, + ) { + this.updateThumbnailStyle( + this.getXCoord(this.progressBar, event.clientX), + this.progressBar.offsetWidth, + ); + }; + + vttThumbnailsPlugin.prototype.getStyleForTime = function getStyleForTime( + time, + ) { + for (var i = 0; i < this.vttData.length; ++i) { + var item = this.vttData[i]; + if (time >= item.start && time < item.end) { + return item.css; + } + } + }; + + vttThumbnailsPlugin.prototype.showThumbnailHolder = + function showThumbnailHolder() { + this.thumbnailHolder.style.opacity = "1"; + }; + + vttThumbnailsPlugin.prototype.hideThumbnailHolder = + function hideThumbnailHolder() { + this.thumbnailHolder.style.opacity = "0"; + }; + + vttThumbnailsPlugin.prototype.updateThumbnailStyle = + function updateThumbnailStyle(x, width) { + var duration = this.player.duration(); + var time = (1 - (width - x) / width) * duration; + var currentStyle = this.getStyleForTime(time); + + if (!currentStyle) { + return this.hideThumbnailHolder(); + } + + var xPos = (1 - (width - x) / width) * width; + + this.thumbnailHolder.style.transform = "translateX(" + xPos + "px)"; + this.thumbnailHolder.style.marginLeft = + "-" + parseInt(currentStyle.width) / 2 + "px"; + + if (this.lastStyle && this.lastStyle === currentStyle) { + return; + } + this.lastStyle = currentStyle; + + for (var style in currentStyle) { + if (currentStyle.hasOwnProperty(style)) { + this.thumbnailHolder.style[style] = currentStyle[style]; + } + } + }; + + vttThumbnailsPlugin.prototype.processVtt = function processVtt(data) { + var _this6 = this; + + var processedVtts = []; + var vttDefinitions = data.split(/[\r\n][\r\n]/i); + vttDefinitions.forEach(function (vttDef) { + if ( + vttDef.match( + /([0-9]{2}:)?([0-9]{2}:)?[0-9]{2}(.[0-9]{3})?( ?--> ?)([0-9]{2}:)?([0-9]{2}:)?[0-9]{2}(.[0-9]{3})?[\r\n]{1}.*/gi, + ) + ) { + var vttDefSplit = vttDef.split(/[\r\n]/i); + var vttTiming = vttDefSplit[0]; + var vttTimingSplit = vttTiming.split(/ ?--> ?/i); + var vttTimeStart = vttTimingSplit[0]; + var vttTimeEnd = vttTimingSplit[1]; + var vttImageDef = vttDefSplit[1]; + var vttCssDef = _this6.getVttCss(vttImageDef); + + processedVtts.push({ + start: _this6.getSecondsFromTimestamp(vttTimeStart), + end: _this6.getSecondsFromTimestamp(vttTimeEnd), + css: vttCssDef, + }); + } + }); + return processedVtts; + }; + + vttThumbnailsPlugin.prototype.getFullyQualifiedUrl = + function getFullyQualifiedUrl(path, base) { + if (path.indexOf("//") >= 0) { + // We have a fully qualified path. + return path; + } + if (base.indexOf("//") === 0) { + // We don't have a fully qualified path, but need to + // be careful with trimming. + return [base.replace(/\/$/gi, ""), this.trim(path, "/")].join("/"); + } + if (base.indexOf("//") > 0) { + // We don't have a fully qualified path, and should + // trim both sides of base and path. + return [this.trim(base, "/"), this.trim(path, "/")].join("/"); + } + + // If all else fails. + return path; + }; + + vttThumbnailsPlugin.prototype.getPropsFromDef = function getPropsFromDef( + def, + ) { + var imageDefSplit = def.split(/#xywh=/i); + var imageUrl = imageDefSplit[0]; + var imageCoords = imageDefSplit[1]; + var splitCoords = imageCoords.match(/[0-9]+/gi); + return { + x: splitCoords[0], + y: splitCoords[1], + w: splitCoords[2], + h: splitCoords[3], + image: imageUrl, + }; + }; + + vttThumbnailsPlugin.prototype.getVttCss = function getVttCss(vttImageDef) { + var cssObj = {}; + + // If there isn't a protocol, use the VTT source URL. + var baseSplit = void 0; + if (this.options.src.indexOf("//") >= 0) { + baseSplit = this.options.src.split(/([^\/]*)$/gi).shift(); + } else { + baseSplit = + this.getBaseUrl() + this.options.src.split(/([^\/]*)$/gi).shift(); + } + + vttImageDef = this.getFullyQualifiedUrl(vttImageDef, baseSplit); + + if (!vttImageDef.match(/#xywh=/i)) { + cssObj.background = 'url("' + vttImageDef + '")'; + return cssObj; + } + + var imageProps = this.getPropsFromDef(vttImageDef); + cssObj.background = + 'url("' + + imageProps.image + + '") no-repeat -' + + imageProps.x + + "px -" + + imageProps.y + + "px"; + cssObj.width = imageProps.w + "px"; + cssObj.height = imageProps.h + "px"; + + return cssObj; + }; + + vttThumbnailsPlugin.prototype.doconstructTimestamp = + function doconstructTimestamp(timestamp) { + var splitStampMilliseconds = timestamp.split("."); + var timeParts = splitStampMilliseconds[0]; + var timePartsSplit = timeParts.split(":"); + return { + milliseconds: parseInt(splitStampMilliseconds[1]) || 0, + seconds: parseInt(timePartsSplit.pop()) || 0, + minutes: parseInt(timePartsSplit.pop()) || 0, + hours: parseInt(timePartsSplit.pop()) || 0, + }; + }; + + vttThumbnailsPlugin.prototype.getSecondsFromTimestamp = + function getSecondsFromTimestamp(timestamp) { + var timestampParts = this.doconstructTimestamp(timestamp); + return parseInt( + timestampParts.hours * (60 * 60) + + timestampParts.minutes * 60 + + timestampParts.seconds + + timestampParts.milliseconds / 1000, + ); + }; + + vttThumbnailsPlugin.prototype.trim = function trim(str, charlist) { + var whitespace = [ + " ", + "\n", + "\r", + "\t", + "\f", + "\x0b", + "\xa0", + "\u2000", + "\u2001", + "\u2002", + "\u2003", + "\u2004", + "\u2005", + "\u2006", + "\u2007", + "\u2008", + "\u2009", + "\u200A", + "\u200B", + "\u2028", + "\u2029", + "\u3000", + ].join(""); + var l = 0; + var i = 0; + str += ""; + if (charlist) { + whitespace = (charlist + "").replace(/([[\]().?/*{}+$^:])/g, "$1"); + } + l = str.length; + for (i = 0; i < l; i++) { + if (whitespace.indexOf(str.charAt(i)) === -1) { + str = str.substring(i); + break; + } + } + l = str.length; + for (i = l - 1; i >= 0; i--) { + if (whitespace.indexOf(str.charAt(i)) === -1) { + str = str.substring(0, i + 1); + break; + } + } + return whitespace.indexOf(str.charAt(0)) === -1 ? str : ""; + }; + + return vttThumbnailsPlugin; + })(); + + // Register the plugin with video.js. + + registerPlugin("vttThumbnails", vttThumbnails); + + // Include the version number. + vttThumbnails.VERSION = version; + + return vttThumbnails; +}); diff --git a/pod/video/templates/videos/video-element.html b/pod/video/templates/videos/video-element.html index 388886c728..8b2731150a 100644 --- a/pod/video/templates/videos/video-element.html +++ b/pod/video/templates/videos/video-element.html @@ -34,20 +34,3 @@ {% endfor %} {% endif %} -
- {% if video.chapter_set.all %} -
-
{% trans "Chapters" %}
-
    -
    -
      - {% for chapter in video.chapter_set.all %} -
    • - {{chapter.title}} -
    • - {% endfor %} -
    - {% endif %} -
    diff --git a/pod/video/templates/videos/video-header.html b/pod/video/templates/videos/video-header.html index c2a329cb5d..5dc16e6861 100644 --- a/pod/video/templates/videos/video-header.html +++ b/pod/video/templates/videos/video-header.html @@ -1,14 +1,29 @@ -{% load static %} +{% load static custom_tags %} +{% get_setting "USE_VIDEO_P2P" False as use_video_p2p %} + +{% if use_video_p2p %} + + + +{% endif %} - {% with 'video.js/dist/lang/'|add:request.LANGUAGE_CODE|add:'.js' as videojs_lang %} - - {% endwith %} +{% with 'video.js/dist/lang/'|add:request.LANGUAGE_CODE|add:'.js' as videojs_lang %} + +{% endwith %} + - - - + + + {% if not video.is_video and event is None or playlist_in_get %} @@ -49,17 +64,6 @@ - - - - - - - - - @@ -70,12 +74,8 @@ {% endif %} - - - - -{% if video.overview or playlist_in_get %} +{% if video.overview or playlist_in_get %} {% endif %} diff --git a/pod/video/templates/videos/video-iframe.html b/pod/video/templates/videos/video-iframe.html index f1e74453c0..c16d1397da 100644 --- a/pod/video/templates/videos/video-iframe.html +++ b/pod/video/templates/videos/video-iframe.html @@ -18,8 +18,9 @@ {% block page_extra_head %} {% include 'videos/video-header.html' %} {% endblock page_extra_head %} - + diff --git a/pod/video/templates/videos/video-script.html b/pod/video/templates/videos/video-script.html index 53893800af..880da8467f 100644 --- a/pod/video/templates/videos/video-script.html +++ b/pod/video/templates/videos/video-script.html @@ -3,122 +3,232 @@ {% load i18n %} {% get_setting "VIDEO_PLAYBACKRATES" '[0.5, 1, 1.5, 2]' as video_playbackrates %} {% get_setting "USE_VIDEO_EVENT_TRACKING" False as video_event_tracking %} - +{% if use_video_p2p %} + +{% endif %} diff --git a/pod/video/templates/videos/video_p2p_stats.html b/pod/video/templates/videos/video_p2p_stats.html new file mode 100644 index 0000000000..f9a2d0b6e1 --- /dev/null +++ b/pod/video/templates/videos/video_p2p_stats.html @@ -0,0 +1,11 @@ +{% load i18n %} +
    + +  0 +  |  + +   +  -  +   + +
    diff --git a/pod/video/templates/videos/video_page_content.html b/pod/video/templates/videos/video_page_content.html index 65bb0516ca..3c413e456d 100644 --- a/pod/video/templates/videos/video_page_content.html +++ b/pod/video/templates/videos/video_page_content.html @@ -1,5 +1,6 @@ {% load i18n %} -{% load video_filters %} +{% load custom_tags video_filters %} +{% get_setting "USE_VIDEO_P2P" False as use_video_p2p %}
    @@ -96,13 +97,18 @@

    {% endif %} {% block video-element %} {% if form %} - {% include 'videos/video-form.html' %} + {% include 'videos/video-form.html' %} {% else %}
    {% include 'videos/video-element.html' %}
    -
    {% include 'videos/video-all-info.html' %}
    + {% if use_video_p2p %} + {% include 'videos/video_p2p_stats.html' %} + {% endif %} +
    + {% include 'videos/video-all-info.html' %} +
    {% endif %} {% endblock video-element %} diff --git a/pod/video/urls.py b/pod/video/urls.py index 94a0d7b8ca..41edf95a2f 100644 --- a/pod/video/urls.py +++ b/pod/video/urls.py @@ -14,6 +14,7 @@ video_count, video_marker, video_version, + get_video_chapters, get_categories, add_category, edit_category, @@ -87,12 +88,22 @@ ), url(r"^my/$", my_videos, name="my_videos"), ] + # COMPLETION urlpatterns += [ path("completion/", include("pod.completion.urls", namespace="completion")), ] + # CHAPTER urlpatterns += [ + path( + "get_video_chapters///", + get_video_chapters, + name="get_video_chapters", + ), + path( + "get_video_chapters//", get_video_chapters, name="get_video_chapters" + ), path("chapter/", include("pod.chapter.urls", namespace="chapter")), ] diff --git a/pod/video/views.py b/pod/video/views.py index d6a2a9a23f..1bca0a68ef 100644 --- a/pod/video/views.py +++ b/pod/video/views.py @@ -28,6 +28,7 @@ from dateutil.parser import parse import concurrent.futures as futures +from webvtt import WebVTT, Caption from pod.main.utils import is_ajax from pod.main.models import AdditionalChannelTab @@ -78,9 +79,11 @@ import re import pandas from http import HTTPStatus +from ..video_encode_transcript.transcript_model import format_time_caption from datetime import date from chunked_upload.models import ChunkedUpload from chunked_upload.views import ChunkedUploadView, ChunkedUploadCompleteView +from typing import Optional from django.db import transaction from django.db import IntegrityError @@ -860,6 +863,53 @@ def video_xhr(request, slug, slug_private=None): return HttpResponse(data, content_type="application/json") +def get_video_chapters( + request: WSGIRequest, slug: str, slug_private: Optional[str] = None +) -> HttpResponse: + """ + Return all video's chapters in webVTT format for video player. + + Args: + request (:class:`django.core.handlers.wsgi.WSGIRequest`): The WSGI request. + slug (str): The chapter slug. + slug_private (str, optional): The chapter private slug. Defaults to None. + + Raises: + SuspiciousOperation: Raised when an invalid video id is encountered. + + Returns: + HttpResponse: WebVTT formatted response containing video chapters. + """ + try: + id = int(slug.split("-")[0]) + except ValueError: + raise SuspiciousOperation("Invalid video id") + + video = get_object_or_404(Video, id=id, sites=get_current_site(request)) + show_page = get_video_access(request, video, slug_private) + if show_page: + webvtt = WebVTT() + chapters = video.chapter_set.all() + prev_chapter = chapters.first() + for chapter in chapters[1:]: + caption = Caption( + format_time_caption(prev_chapter.time_start), + format_time_caption(chapter.time_start), + " ".join(prev_chapter.title), + ) + webvtt.captions.append(caption) + last_chapter = chapters.last() + caption = Caption( + format_time_caption(last_chapter.time_start), + format_time_caption(video.duration), + " ".join(last_chapter.title), + ) + webvtt.captions.append(caption) + return HttpResponse(webvtt.content, content_type="text/plain") + else: + return HttpResponseForbidden(_("Sorry, you can't access to the video chapter.")) + + @csrf_protect def video(request, slug, slug_c=None, slug_t=None, slug_private=None): try: @@ -925,7 +975,6 @@ def toggle_render_video_user_can_see_video( def toggle_render_video_when_is_playlist_player(request): """Toggle `render_video()` when the user want to play a playlist.""" playlist = get_object_or_404(Playlist, slug=request.GET.get("playlist")) - print(playlist.visibility) if request.user.is_authenticated: video = ( Video.objects.filter( diff --git a/requirements-encode.txt b/requirements-encode.txt index 937e2a0661..cbf25d58b0 100644 --- a/requirements-encode.txt +++ b/requirements-encode.txt @@ -1,4 +1,4 @@ -webvtt-py==0.4.5 +webvtt-py==0.4.6 celery==5.2.7 redis==4.5.4 requests==2.31.0