PageSourceSearch

https://www.bloomsburyphilosophylibrary.com/bloomsbury_assets/bloomsbury/js/plyr.js

js bloomsburyphilosophylibrary.com collected 2026-09-24 10:11:52 UTC 69,679 bytes, 1,434 lines download raw bytes

1! function(e, t) {
2    "use strict";
3    "object" == typeof module && "object" == typeof module.exports ? module.exports = t(e, document) : "function" == typeof define && define.amd ? define([], function() {
4        return t(e, document)
5    }) : e.plyr = t(e, document)
6}("undefined" != typeof window ? window : this, function(e, t) {
7    "use strict";
8
9    function n() {
10        var e, n, r, a = navigator.userAgent,
11            s = navigator.appName,
12            o = "" + parseFloat(navigator.appVersion),
13            i = parseInt(navigator.appVersion, 10),
14            l = !1,
15            u = !1,
16            c = !1,
17            d = !1;
18        return navigator.appVersion.indexOf("Windows NT") !== -1 && navigator.appVersion.indexOf("rv:11") !== -1 ? (l = !0, s = "IE", o = "11") : (n = a.indexOf("MSIE")) !== -1 ? (l = !0, s = "IE", o = a.substring(n + 5)) : (n = a.indexOf("Chrome")) !== -1 ? (c = !0, s = "Chrome", o = a.substring(n + 7)) : (n = a.indexOf("Safari")) !== -1 ? (d = !0, s = "Safari", o = a.substring(n + 7), (n = a.indexOf("Version")) !== -1 && (o = a.substring(n + 8))) : (n = a.indexOf("Firefox")) !== -1 ? (u = !0, s = "Firefox", o = a.substring(n + 8)) : (e = a.lastIndexOf(" ") + 1) < (n = a.lastIndexOf("/")) && (s = a.substring(e, n), o = a.substring(n + 1), s.toLowerCase() === s.toUpperCase() && (s = navigator.appName)), (r = o.indexOf(";")) !== -1 && (o = o.substring(0, r)), (r = o.indexOf(" ")) !== -1 && (o = o.substring(0, r)), i = parseInt("" + o, 10), isNaN(i) && (o = "" + parseFloat(navigator.appVersion), i = parseInt(navigator.appVersion, 10)), {
19            name: s,
20            version: i,
21            isIE: l,
22            isFirefox: u,
23            isChrome: c,
24            isSafari: d,
25            isIos: /(iPad|iPhone|iPod)/g.test(navigator.platform),
26            isIphone: /(iPhone|iPod)/g.test(navigator.userAgent),
27            isTouch: "ontouchstart" in t.documentElement
28        }
29    }
30
31    function r(e, t) {
32        var n = e.media;
33        if ("video" === e.type) switch (t) {
34                case "video/webm":
35                    return !(!n.canPlayType || !n.canPlayType('video/webm; codecs="vp8, vorbis"').replace(/no/, ""));
36                case "video/mp4":
37                    return !(!n.canPlayType || !n.canPlayType('video/mp4; codecs="avc1.42E01E, mp4a.40.2"').replace(/no/, ""));
38                case "video/ogg":
39                    return !(!n.canPlayType || !n.canPlayType('video/ogg; codecs="theora"').replace(/no/, ""))
40            } else if ("audio" === e.type) switch (t) {
41                case "audio/mpeg":
42                    return !(!n.canPlayType || !n.canPlayType("audio/mpeg;").replace(/no/, ""));
43                case "audio/ogg":
44                    return !(!n.canPlayType || !n.canPlayType('audio/ogg; codecs="vorbis"').replace(/no/, ""));
45                case "audio/wav":
46                    return !(!n.canPlayType || !n.canPlayType('audio/wav; codecs="1"').replace(/no/, ""))
47            }
48            return !1
49    }
50
51    function a(e) {
52        if (!t.querySelectorAll('script[src="' + e + '"]').length) {
53            var n = t.createElement("script");
54            n.src = e;
55            var r = t.getElementsByTagName("script")[0];
56            r.parentNode.insertBefore(n, r)
57        }
58    }
59
60    function s(e, t) {
61        return Array.prototype.indexOf && e.indexOf(t) !== -1
62    }
63
64    function o(e, t, n) {
65        return e.replace(new RegExp(t.replace(/([.*+?\^=!:${}()|\[\]\/\\])/g, "\\$1"), "g"), n)
66    }
67
68    function i(e, t) {
69        e.length || (e = [e]);
70        for (var n = e.length - 1; n >= 0; n--) {
71            var r = n > 0 ? t.cloneNode(!0) : t,
72                a = e[n],
73                s = a.parentNode,
74                o = a.nextSibling;
75            return r.appendChild(a), o ? s.insertBefore(r, o) : s.appendChild(r), r
76        }
77    }
78
79    function l(e) {
80        e && e.parentNode.removeChild(e)
81    }
82
83    function u(e, t) {
84        e.insertBefore(t, e.firstChild)
85    }
86
87    function c(e, t) {
88        for (var n in t) e.setAttribute(n, O.boolean(t[n]) && t[n] ? "" : t[n])
89    }
90
91    function d(e, n, r) {
92        var a = t.createElement(e);
93        c(a, r), u(n, a)
94    }
95
96    function p(e) {
97        return e.replace(".", "")
98    }
99
100    function m(e, t, n) {
101        if (e)
102            if (e.classList) e.classList[n ? "add" : "remove"](t);
103            else {
104                var r = (" " + e.className + " ").replace(/\s+/g, " ").replace(" " + t + " ", "");
105                e.className = r + (n ? " " + t : "")
106            }
107    }
108
109    function f(e, t) {
110        return !!e && (e.classList ? e.classList.contains(t) : new RegExp("(\\s|^)" + t + "(\\s|$)").test(e.className))
111    }
112
113    function y(e, n) {
114        var r = Element.prototype,
115            a = r.matches || r.webkitMatchesSelector || r.mozMatchesSelector || r.msMatchesSelector || function(e) {
116                return [].indexOf.call(t.querySelectorAll(e), this) !== -1
117            };
118        return a.call(e, n)
119    }
120
121    function b(e, t, n, r, a) {
122        g(e, t, function(t) {
123            n && n.apply(e, [t]), r.apply(e, [t])
124        }, a)
125    }
126
127    function v(e, t, n, r, a) {
128        var s = t.split(" ");
129        if (O.boolean(a) || (a = !1), e instanceof NodeList)
130            for (var o = 0; o < e.length; o++) e[o] instanceof Node && v(e[o], arguments[1], arguments[2], arguments[3]);
131        else
132            for (var i = 0; i < s.length; i++) e[r ? "addEventListener" : "removeEventListener"](s[i], n, a)
133    }
134
135    function g(e, t, n, r) {
136        e && v(e, t, n, !0, r)
137    }
138
139    function h(e, t, n, r) {
140        if (e && t) {
141            O.boolean(n) || (n = !1);
142            var a = new CustomEvent(t, {
143                bubbles: n,
144                detail: r
145            });
146            e.dispatchEvent(a)
147        }
148    }
149
150    function k(e, t) {
151        if (e) return t = O.boolean(t) ? t : !e.getAttribute("aria-pressed"), e.setAttribute("aria-pressed", t), t
152    }
153
154    function w(e, t) {
155        return 0 === e || 0 === t || isNaN(e) || isNaN(t) ? 0 : (e / t * 100).toFixed(2)
156    }
157
158    function x() {
159        var e = arguments;
160        if (e.length) {
161            if (1 === e.length) return e[0];
162            for (var t = Array.prototype.shift.call(e), n = e.length, r = 0; r < n; r++) {
163                var a = e[r];
164                for (var s in a) a[s] && a[s].constructor && a[s].constructor === Object ? (t[s] = t[s] || {}, x(t[s], a[s])) : t[s] = a[s]
165            }
166            return t
167        }
168    }
169
170    function T(e) {
171        var t = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
172        return e.match(t) ? RegExp.$2 : e
173    }
174
175    function S(e) {
176        var t = /^.*(vimeo.com\/|video\/)(\d+).*/;
177        return e.match(t) ? RegExp.$2 : e
178    }
179
180    function _() {
181        var e = {
182                supportsFullScreen: !1,
183                isFullScreen: function() {
184                    return !1
185                },
186                requestFullScreen: function() {},
187                cancelFullScreen: function() {},
188                fullScreenEventName: "",
189                element: null,
190                prefix: ""
191            },
192            n = "webkit o moz ms khtml".split(" ");
193        if (O.undefined(t.cancelFullScreen))
194            for (var r = 0, a = n.length; r < a; r++) {
195                if (e.prefix = n[r], !O.undefined(t[e.prefix + "CancelFullScreen"])) {
196                    e.supportsFullScreen = !0;
197                    break
198                }
199                if (!O.undefined(t.msExitFullscreen) && t.msFullscreenEnabled) {
200                    e.prefix = "ms", e.supportsFullScreen = !0;
201                    break
202                }
203            } else e.supportsFullScreen = !0;
204        return e.supportsFullScreen && (e.fullScreenEventName = "ms" === e.prefix ? "MSFullscreenChange" : e.prefix + "fullscreenchange", e.isFullScreen = function(e) {
205            switch (O.undefined(e) && (e = t.body), this.prefix) {
206                case "":
207                    return t.fullscreenElement === e;
208                case "moz":
209                    return t.mozFullScreenElement === e;
210                default:
211                    return t[this.prefix + "FullscreenElement"] === e
212            }
213        }, e.requestFullScreen = function(e) {
214            return O.undefined(e) && (e = t.body), "" === this.prefix ? e.requestFullScreen() : e[this.prefix + ("ms" === this.prefix ? "RequestFullscreen" : "RequestFullScreen")]()
215        }, e.cancelFullScreen = function() {
216            return "" === this.prefix ? t.cancelFullScreen() : t[this.prefix + ("ms" === this.prefix ? "ExitFullscreen" : "CancelFullScreen")]()
217        }, e.element = function() {
218            return "" === this.prefix ? t.fullscreenElement : t[this.prefix + "FullscreenElement"]
219        }), e
220    }
221
222    function E(v, E) {
223        function A(e, t, n, r) {
224            h(e, t, n, x({}, r, {
225                plyr: Be
226            }))
227        }
228
229        function j(t, n) {
230            E.debug && e.console && (n = Array.prototype.slice.call(n), O.string(E.logPrefix) && E.logPrefix.length && n.unshift(E.logPrefix), console[t].apply(console, n))
231        }
232
233        function V() {
234            return {
235                url: E.iconUrl,
236                absolute: 0 === E.iconUrl.indexOf("http") || Ue.browser.isIE
237            }
238        }
239
240        function R() {
241            var e = [],
242                t = V(),
243                n = (t.absolute ? "" : t.url) + "#" + E.iconPrefix;
244            return s(E.controls, "play-large") && e.push('<button type="button" data-plyr="play" class="plyr__play-large">', '<svg><use xlink:href="' + n + '-play" /></svg>', '<span class="plyr__sr-only">' + E.i18n.play + "</span>", "</button>"), e.push('<div class="plyr__controls">'), s(E.controls, "restart") && e.push('<button type="button" data-plyr="restart">', '<svg><use xlink:href="' + n + '-restart" /></svg>', '<span class="plyr__sr-only">' + E.i18n.restart + "</span>", "</button>"), s(E.controls, "rewind") && e.push('<button type="button" data-plyr="rewind">', '<svg><use xlink:href="' + n + '-rewind" /></svg>', '<span class="plyr__sr-only">' + E.i18n.rewind + "</span>", "</button>"), s(E.controls, "play") && e.push('<button type="button" data-plyr="play">', '<svg><use xlink:href="' + n + '-play" /></svg>', '<span class="plyr__sr-only">' + E.i18n.play + "</span>", "</button>", '<button type="button" data-plyr="pause">', '<svg><use xlink:href="' + n + '-pause" /></svg>', '<span class="plyr__sr-only">' + E.i18n.pause + "</span>", "</button>"), s(E.controls, "fast-forward") && e.push('<button type="button" data-plyr="fast-forward">', '<svg><use xlink:href="' + n + '-fast-forward" /></svg>', '<span class="plyr__sr-only">' + E.i18n.forward + "</span>", "</button>"), s(E.controls, "progress") && (e.push('<span class="plyr__progress">', '<label for="seek{id}" class="plyr__sr-only">Seek</label>', '<input id="seek{id}" class="plyr__progress--seek" type="range" min="0" max="100" step="0.1" value="
2440" data-plyr="seek">', '<progress class="plyr__progress--played" max="100" value="0" role="presentation"></progress>', '<progress class="plyr__progress--buffer" max="100" value="0">', "<span>0</span>% " + E.i18n.buffered, "</progress>"), E.tooltips.seek && e.push('<span class="plyr__tooltip">00:00</span>'), e.push("</span>")), s(E.controls, "current-time") && e.push('<span class="plyr__time">', '<span class="plyr__sr-only">' + E.i18n.currentTime + "</span>", '<span class="plyr__time--current">00:00</span>', "</span>"), s(E.controls, "duration") && e.push('<span class="plyr__time">', '<span class="plyr__sr-only">' + E.i18n.duration + "</span>", '<span class="plyr__time--duration">00:00</span>', "</span>"), s(E.controls, "mute") && e.push('<button type="button" data-plyr="mute">', '<svg class="icon--muted"><use xlink:href="' + n + '-muted" /></svg>', '<svg><use xlink:href="' + n + '-volume" /></svg>', '<span class="plyr__sr-only">' + E.i18n.toggleMute + "</span>", "</button>"), s(E.controls, "volume") && e.push('<span class="plyr__volume">', '<label for="volume{id}" class="plyr__sr-only">' + E.i18n.volume + "</label>", '<input id="volume{id}" class="plyr__volume--input" type="range" min="' + E.volumeMin + '" max="' + E.volumeMax + '" value="' + E.volume + '" data-plyr="volume">', '<progress class="plyr__volume--display" max="' + E.volumeMax + '" value="' + E.volumeMin + '" role="presentation"></progress>', "</span>"), s(E.controls, "captions") && e.push('<button type="button" data-plyr="captions">', '<svg class="icon--captions-on"><use xlink:href="' + n + '-captions-on" /></svg>', '<svg><use xlink:href="' + n + '-captions-off" /></svg>', '<span class="plyr__sr-only">' + E.i18n.toggleCaptions + "</span>", "</button>"), s(E.controls, "fullscreen") && e.push('<button type="button" data-plyr="fullscreen">', '<svg class="icon--exit-fullscreen"><use xlink:href="' + n + '-exit-fullscreen" /></svg>', '<svg><use xlink:href="' + n + '-enter-fullscreen" /></svg>', '<span class="plyr__sr-only">' + E.i18n.toggleFullscreen + "</span>", "</button>"), e.push("</div>"), e.join("")
245        }
246
247        function q() {
248            if (Ue.supported.full && ("audio" !== Ue.type || E.fullscreen.allowAudio) && E.fullscreen.enabled) {
249                var e = N.supportsFullScreen;
250                e || E.fullscreen.fallback && !X() ? (Je((e ? "Native" : "Fallback") + " fullscreen enabled"), m(Ue.container, E.classes.fullscreen.enabled, !0)) : Je("Fullscreen not supported and fallback disabled"), Ue.buttons && Ue.buttons.fullscreen && k(Ue.buttons.fullscreen, !1), $()
251            }
252        }
253
254        function D() {
255            if ("video" === Ue.type) {
256                U(E.selectors.captions) || Ue.videoContainer.insertAdjacentHTML("afterbegin", '<div class="' + p(E.selectors.captions) + '"></div>'), Ue.usingTextTracks = !1, Ue.media.textTracks && (Ue.usingTextTracks = !0);
257                for (var e, t = "", n = Ue.media.childNodes, r = 0; r < n.length; r++) "track" === n[r].nodeName.toLowerCase() && (e = n[r].kind, "captions" !== e && "subtitles" !== e || (t = n[r].getAttribute("src")));
258                if (Ue.captionExists = !0, "" === t ? (Ue.captionExists = !1, Je("No caption track found")) : Je("Caption track found; URI: " + t), Ue.captionExists) {
259                    for (var a = Ue.media.textTracks, s = 0; s < a.length; s++) a[s].mode = "hidden";
260                    if (Y(Ue), (Ue.browser.isIE && Ue.browser.version >= 10 || Ue.browser.isFirefox && Ue.browser.version >= 31) && (Je("Detected browser with known TextTrack issues - using manual fallback"), Ue.usingTextTracks = !1), Ue.usingTextTracks) {
261                        Je("TextTracks supported");
262                        for (var o = 0; o < a.length; o++) {
263                            var i = a[o];
264                            "captions" !== i.kind && "subtitles" !== i.kind || g(i, "cuechange", function() {
265                                this.activeCues[0] && "text" in this.activeCues[0] ? H(this.activeCues[0].getCueAsHTML()) : H()
266                            })
267                        }
268                    } else if (Je("TextTracks not supported so rendering captions manually"), Ue.currentCaption = "", Ue.captions = [], "" !== t) {
269                        var l = new XMLHttpRequest;
270                        l.onreadystatechange = function() {
271                            if (4 === l.readyState)
272                                if (200 === l.status) {
273                                    var e, t = [],
274                                        n = l.responseText,
275                                        r = "\r\n";
276                                    n.indexOf(r + r) === -1 && (r = n.indexOf("\r\r") !== -1 ? "\r" : "\n"), t = n.split(r + r);
277                                    for (var a = 0; a < t.length; a++) {
278                                        e = t[a], Ue.captions[a] = [];
279                                        var s = e.split(r),
280                                            o = 0;
281                                        s[o].indexOf(":") === -1 && (o = 1), Ue.captions[a] = [s[o], s[o + 1]]
282                                    }
283                                    Ue.captions.shift(), Je("Successfully loaded the caption file via AJAX")
284                                } else ze(E.logPrefix + "There was a problem loading the caption file via AJAX")
285                        }, l.open("get", t, !0), l.send()
286                    }
287                } else m(Ue.container, E.classes.captions.enabled)
288            }
289        }
290
291        function H(e) {
292            var n = U(E.selectors.captions),
293                r = t.createElement("span");
294            n.innerHTML = "", O.undefined(e) && (e = ""), O.string(e) ? r.innerHTML = e.trim() : r.appendChild(e), n.appendChild(r);
295            n.offsetHeight
296        }
297
298        function W(e) {
299            function t(e, t) {
300                var n = [];
301                n = e.split(" --> ");
302                for (var r = 0; r < n.length; r++) n[r] = n[r].replace(/(\d+:\d+:\d+\.\d+).*/, "$1");
303                return a(n[t])
304            }
305
306            function n(e) {
307                return t(e, 0)
308            }
309
310            function r(e) {
311                return t(e, 1)
312            }
313
314            function a(e) {
315                if (null === e || void 0 === e) return 0;
316                var t, n = [],
317                    r = [];
318                return n = e.split(","), r = n[0].split(":"), t = Math.floor(60 * r[0] * 60) + Math.floor(60 * r[1]) + Math.floor(r[2])
319            }
320            if (!Ue.usingTextTracks && "video" === Ue.type && Ue.supported.full && (Ue.subcount = 0, e = O.number(e) ? e : Ue.media.currentTime, Ue.captions[Ue.subcount])) {
321                for (; r(Ue.captions[Ue.subcount][0]) < e.toFixed(1);)
322                    if (Ue.subcount++, Ue.subcount > Ue.captions.length - 1) {
323                        Ue.subcount = Ue.captions.length - 1;
324                        break
325                    }
326                Ue.media.currentTime.toFixed(1) >= n(Ue.captions[Ue.subcount][0]) && Ue.media.currentTime.toFixed(1) <= r(Ue.captions[Ue.subcount][0]) ? (Ue.currentCaption = Ue.captions[Ue.subcount][1], H(Ue.currentCaption)) : H()
327            }
328        }
329
330        function Y() {
331            if (Ue.buttons.captions) {
332                m(Ue.container, E.classes.captions.enabled, !0);
333                var e = Ue.storage.captionsEnabled;
334                O.boolean(e) || (e = E.captions.defaultActive), e && (m(Ue.container, E.classes.captions.active, !0), k(Ue.buttons.captions, !0))
335            }
336        }
337
338        function B(e) {
339            return Ue.container.querySelectorAll(e)
340        }
341
342        function U(e) {
343            return B(e)[0]
344        }
345
346        function X() {
347            try {
348                return e.self !== e.top
349            } catch (e) {
350                return !0
351            }
352        }
353
354        function $() {
355            function e(e) {
356                9 === e.which && Ue.isFullscreen && (e.target !== r || e.shiftKey ? e.target === n && e.shiftKey && (e.preventDefault(), r.focus()) : (e.preventDefault(), n.focus()))
357            }
358            var t = B("input:not([disabled]), button:not([disabled])"),
359                n = t[0],
360                r = t[t.length - 1];
361            g(Ue.container, "keydown", e)
362        }
363
364        function J(e, t) {
365            if (O.string(t)) d(e, Ue.media, {
366                src: t
367            });
368            else if (t.constructor === Array)
369                for (var n = t.length - 1; n >= 0; n--) d(e, Ue.media, t[n])
370        }
371
372        function z() {
373            if (E.loadSprite) {
374                var e = V();
375                e.absolute ? (Je("AJAX loading absolute SVG sprite" + (Ue.browser.isIE ? " (due to IE)" : "")), C(e.url, "sprite-plyr")) : Je("Sprite will be used as external resource directly")
376            }
377            var n = E.html;
378            Je("Injecting custom controls"), n || (n = R()), n = o(n, "{seektime}", E.seekTime), n = o(n, "{id}", Math.floor(1e4 * Math.random()));
379            var r;
380            if (O.string(E.selectors.controls.container) && (r = t.querySelector(E.selectors.controls.container)), O.htmlElement(r) || (r = Ue.container), r.insertAdjacentHTML("beforeend", n), E.tooltips.controls)
381                for (var a = B([E.selectors.controls.wrapper, " ", E.selectors.labels, " .", E.classes.hidden].join("")), s = a.length - 1; s >= 0; s--) {
382                    var i = a[s];
383                    m(i, E.classes.hidden, !1), m(i, E.classes.tooltip, !0)
384                }
385        }
386
387        function G() {
388            try {
389                return Ue.controls = U(E.selectors.controls.wrapper), Ue.buttons = {}, Ue.buttons.seek = U(E.selectors.buttons.seek), Ue.buttons.play = B(E.selectors.buttons.play), Ue.buttons.pause = U(E.selectors.buttons.pause), Ue.buttons.restart = U(E.selectors.buttons.restart), Ue.buttons.rewind = U(E.selectors.buttons.rewind), Ue.buttons.forward = U(E.selectors.buttons.forward), Ue.buttons.fullscreen = U(E.selectors.buttons.fullscreen), Ue.buttons.mute = U(E.selectors.buttons.mute), Ue.buttons.captions = U(E.selectors.buttons.captions), Ue.progress = {}, Ue.progress.container = U(E.selectors.progress.container), Ue.progress.buffer = {}, Ue.progress.buffer.bar = U(E.selectors.progress.buffer), Ue.progress.buffer.text = Ue.progress.buffer.bar && Ue.progress.buffer.bar.getElementsByTagName("span")[0], Ue.progress.played = U(E.selectors.progress.played), Ue.progress.tooltip = Ue.progress.container && Ue.progress.container.querySelector("." + E.classes.tooltip), Ue.volume = {}, Ue.volume.input = U(E.selectors.volume.input), Ue.volume.display = U(E.selectors.volume.display), Ue.duration = U(E.selectors.duration), Ue.currentTime = U(E.selectors.currentTime), Ue.seekTime = B(E.selectors.seekTime), !0
390            } catch (e) {
391                return ze("It looks like there is a problem with your controls HTML"), Q(!0), !1
392            }
393        }
394
395        function K() {
396            m(Ue.container, E.selectors.container.replace(".", ""), Ue.supported.full)
397        }
398
399        function Q(e) {
400            e && s(E.types.html5, Ue.type) ? Ue.media.setAttribute("controls", "") : Ue.media.removeAttribute("controls")
401        }
402
403        function Z(e) {
404            var t = E.i18n.play;
405            if (O.string(E.title) && E.title.length && (t += ", " + E.title, Ue.container.setAttribute("aria-label", E.title)), Ue.supported.full && Ue.buttons.play)
406                for (var n = Ue.buttons.play.length - 1; n >= 0; n--) Ue.buttons.play[n].setAttribute("aria-label", t);
407            O.htmlElement(e) && e.setAttribute("title", E.i18n.frameTitle.replace("{title}", E.title))
408        }
409
410        function ee() {
411            var t = null;
412            Ue.storage = {}, L.supported && E.storage.enabled && (e.localStorage.removeItem("plyr-volume"), t = e.localStorage.getItem(E.storage.key), t && (/^\d+(\.\d+)?$/.test(t) ? te({
413                volume: parseFloat(t)
414            }) : Ue.storage = JSON.parse(t)))
415        }
416
417        function te(t) {
418            L.supported && E.storage.enabled && (x(Ue.storage, t), e.localStorage.setItem(E.storage.key, JSON.stringify(Ue.storage)))
419        }
420
421        function ne() {
422            if (!Ue.media) return void ze("No media element found!");
423            if (Ue.supported.full && (m(Ue.container, E.classes.type.replace("{0}", Ue.type), !0), s(E.types.embed, Ue.type) && m(Ue.container, E.classes.type.replace("{0}", "video"), !0), m(Ue.container, E.classes.stopped, E.autoplay), m(Ue.ontainer, E.classes.isIos, Ue.browser.isIos), m(Ue.container, E.classes.isTouch, Ue.browser.isTouch), "video" === Ue.type)) {
424                var e = t.createElement("div");
425                e.setAttribute("class", E.classes.videoWrapper), i(Ue.media, e), Ue.videoContainer = e
426            }
427            s(E.types.embed, Ue.type) && re()
428        }
429
430        function re() {
431            var n, r = t.createElement("div"),
432                s = Ue.type + "-" + Math.floor(1e4 * Math.random());
433            switch (Ue.type) {
434                case "youtube":
435                    n = T(Ue.embedId);
436                    break;
437                case "vimeo":
438                    n = S(Ue.embedId);
439                    break;
440                default:
441                    n = Ue.embedId
442            }
443            for (var o = B('[id^="' + Ue.type + '-"]'), i = o.length - 1; i >= 0; i--) l(o[i]);
444            if (m(Ue.media, E.classes.videoWrapper, !0), m(Ue.media, E.classes.embedWrapper, !0), "youtube" === Ue.type) Ue.media.appendChild(r), r.setAttribute("id", s), O.object(e.YT) ? se(n, r) : (a(E.urls.youtube.api), e.onYouTubeReadyCallbacks = e.onYouTubeReadyCallbacks || [], e.onYouTubeReadyCallbacks.push(function() {
445                se(n, r)
446            }), e.onYouTubeIframeAPIReady = function() {
447                e.onYouTubeReadyCallbacks.forEach(function(e) {
448                    e()
449                })
450            });
451            else if ("vimeo" === Ue.type)
452                if (Ue.supported.full ? Ue.media.appendChild(r) : r = Ue.media, r.setAttribute("id", s), O.object(e.Vimeo)) oe(n, r);
453                else {
454                    a(E.urls.vimeo.api);
455                    var u = e.setInterval(function() {
456                        O.object(e.Vimeo) && (e.clearInterval(u), oe(n, r))
457                    }, 50)
458                }
459            else if ("soundcloud" === Ue.type) {
460                var d = t.createElement("iframe");
461                d.loaded = !1, g(d, "load", function() {
462                    d.loaded = !0
463                }), c(d, {
464                    src: "https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/" + n,
465                    id: s
466                }), r.appendChild(d), Ue.media.appendChild(r), e.SC || a(E.urls.soundcloud.api);
467                var p = e.setInterval(function() {
468                    e.SC && d.loaded && (e.clearInterval(p), ie.call(d))
469                }, 50)
470            }
471        }
472
473        function ae() {
474            Ue.supported.full && (We(), Ye()), Z(U("iframe"))
475        }
476
477        function se(t, n) {
478            Ue.embed = new e.YT.Player(n.id, {
479                videoId: t,
480                playerVars: {
481                    autoplay: E.autoplay ? 1 : 0,
482                    controls: Ue.supported.full ? 0 : 1,
483                    rel: 0,
484                    showinfo: 0,
485                    iv_load_policy: 3,
486                    cc_load_policy: E.captions.defaultActive ? 1 : 0,
487                    cc_lang_pref: "en",
488                    wmode: "transparent",
489                    modestbranding: 1,
490                    disablekb: 1,
491                    origin: "*"
492                },
493                events: {
494                    onError: function(e) {
495                        A(Ue.container, "error", !0, {
496                            code: e.data,
497                            embed: e.target
498                        })
499                    },
500                    onReady: function(t) {
501                        var n = t.target;
502                        Ue.media.play = function() {
503                            n.playVideo(), Ue.media.paused = !1
504                        }, Ue.media.pause = function() {
505                            n.pauseVideo(), Ue.media.paused = !0
506                        }, Ue.media.stop = function() {
507                            n.stopVideo(), Ue.media.paused = !0
508                        }, Ue.media.duration = n.getDuration(), Ue.media.paused = !0, Ue.media.currentTime = 0, Ue.media.muted = n.isMuted(), E.title = n.getVideoData().title, Ue.supported.full && Ue.media.querySelector("iframe").setAttribute("tabindex", "-1"), ae(), A(Ue.media, "timeupdate"), A(Ue.media, "durationchange"), e.clearInterval(Xe.buffering), Xe.buffering = e.setInterval(function() {
509                            Ue.media.buffered = n.getVideoLoadedFraction(), (null === Ue.media.lastBuffered || Ue.media.lastBuffered < Ue.media.buffered) && A(Ue.media, "progress"), Ue.media.lastBuffered = Ue.media.buffered, 1 === Ue.media.buffered && (e.clearInterval(Xe.buffering), A(Ue.media, "canplaythrough"))
510                        }, 200)
511                    },
512                    onStateChange: function(t) {
513                        var n = t.target;
514                        switch (e.clearInterval(Xe.playing), t.data) {
515                            case 0:
516                                Ue.media.paused = !0, A(Ue.media, "ended");
517                                break;
518                            case 1:
519                                Ue.media.paused = !1, Ue.media.seeking && A(Ue.media, "seeked"), Ue.media.seeking = !1, A(Ue.media, "play"), A(Ue.media, "playing"), Xe.playing = e.setInterval(function() {
520                                    Ue.media.currentTime = n.getCurrentTime(), A(Ue.media, "timeupdate")
521                                }, 100), Ue.media.duration !== n.getDuration() && (Ue.media.duration = n.getDuration(), A(Ue.media, "durationchange"));
522                                break;
523                            case 2:
524                                Ue.media.paused = !0, A(Ue.media, "pause")
525                        }
526                        A(Ue.container, "statechange", !1, {
527                            code: t.data
528                        })
529                    }
530                }
531            })
532        }
533
534        function oe(t, n) {
535            Ue.embed = new e.Vimeo.Player(n, {
536                id: parseInt(t),
537                loop: E.loop,
538                autoplay: E.autoplay,
539                byline: !1,
540                portrait: !1,
541                title: !1
542            }), Ue.media.play = function() {
543                Ue.embed.play(), Ue.media.paused = !1
544            }, Ue.media.pause = function() {
545                Ue.embed.pause(), Ue.media.paused = !0
546            }, Ue.media.stop = function() {
547                Ue.embed.stop(), Ue.media.paused = !0
548            }, Ue.media.paused = !0, Ue.media.currentTime = 0, ae(), Ue.embed.getCurrentTime().then(function(e) {
549                Ue.media.currentTime = e, A(Ue.media, "timeupdate")
550            }), Ue.embed.getDuration().then(function(e) {
551                Ue.media.duration = e, A(Ue.media, "durationchange")
552            }), Ue.embed.on("loaded", function() {
553                O.htmlElement(Ue.embed.element) && Ue.supported.full && Ue.embed.element.setAttribute("tabindex", "-1")
554            }), Ue.embed.on("play", function() {
555                Ue.media.paused = !1, A(Ue.media, "play"), A(Ue.media, "playing")
556            }), Ue.embed.on("pause", function() {
557                Ue.media.paused = !0, A(Ue.media, "pause")
558            }), Ue.embed.on("timeupdate", function(e) {
559                Ue.media.seeking = !1, Ue.media.currentTime = e.seconds, A(Ue.media, "timeupdate")
560            }), Ue.embed.on("progress", function(e) {
561                Ue.media.buffered = e.percent, A(Ue.media, "progress"), 1 === parseInt(e.percent) && A(Ue.media, "canplaythrough")
562            }), Ue.embed.on("seeked", function() {
563                Ue.media.seeking = !1, A(Ue.media, "seeked"), A(Ue.media, "play")
564            }), Ue.embed.on("ended", function() {
565                Ue.media.paused = !0, A(Ue.media, "ended")
566            })
567        }
568
569        function ie() {
570            Ue.embed = e.SC.Widget(this), Ue.embed.bind(e.SC.Widget.Events.READY, function() {
571                Ue.media.play = function() {
572                    Ue.embed.play(), Ue.media.paused = !1
573                }, Ue.media.pause = function() {
574                    Ue.embed.pause(), Ue.media.paused = !0
575                }, Ue.media.stop = function() {
576                    Ue.embed.seekTo(0), Ue.embed.pause(), Ue.media.paused = !0
577                }, Ue.media.paused = !0, Ue.media.currentTime = 0, Ue.embed.getDuration(function(e) {
578                    Ue.media.duration = e / 1e3, ae()
579                }), Ue.embed.getPosition(function(e) {
580                    Ue.media.currentTime = e, A(Ue.media, "timeupdate")
581                }), Ue.embed.bind(e.SC.Widget.Events.PLAY, function() {
582                    Ue.media.paused = !1, A(Ue.media, "play"), A(Ue.media, "playing")
583                }), Ue.embed.bind(e.SC.Widget.Events.PAUSE, function() {
584                    Ue.media.paused = !0, A(Ue.media, "pause")
585                }), Ue.embed.bind(e.SC.Widget.Events.PLAY_PROGRESS, function(e) {
586                    Ue.media.seeking = !1, Ue.media.currentTime = e.currentPosition / 1e3, A(Ue.media, "timeupdate")
587                }), Ue.embed.bind(e.SC.Widget.Events.LOAD_PROGRESS, function(e) {
588                    Ue.media.buffered = e.loadProgress, A(Ue.media, "progress"), 1 === parseInt(e.loadProgress) && A(Ue.media, "canplaythrough")
589                }), Ue.embed.bind(e.SC.Widget.Events.FINISH, function() {
590                    Ue.media.paused = !0, A(Ue.media, "ended")
591                })
592            })
593        }
594
595        function le() {
596            "play" in Ue.media && Ue.media.play()
597        }
598
599        function ue() {
600            "pause" in Ue.media && Ue.media.pause()
601        }
602
603        function ce(e) {
604            return O.boolean(e) || (e = Ue.media.paused), e ? le() : ue(), e
605        }
606
607        function de(e) {
608            O.number(e) || (e = E.seekTime), me(Ue.media.currentTime - e)
609        }
610
611        function pe(e) {
612            O.number(e) || (e = E.seekTime), me(Ue.media.currentTime + e)
613        }
614
615        function me(e) {
616            var t = 0,
617                n = Ue.media.paused,
618                r = fe();
619            O.number(e) ? t = e : O.object(e) && s(["input", "change"], e.type) && (t = e.target.value / e.target.max * r), t < 0 ? t = 0 : t > r && (t = r), Ne(t);
620            try {
621                Ue.media.currentTime = t.toFixed(4)
622            } catch (e) {}
623            if (s(E.types.embed, Ue.type)) {
624                switch (Ue.type) {
625                    case "youtube":
626                        Ue.embed.seekTo(t);
627                        break;
628                    case "vimeo":
629                        Ue.embed.setCurrentTime(t.toFixed(0));
630                        break;
631                    case "soundcloud":
632                        Ue.embed.seekTo(1e3 * t)
633                }
634                n && ue(), A(Ue.media, "timeupdate"), Ue.media.seeking = !0, A(Ue.media, "seeking")
635            }
636            Je("Seeking to " + Ue.media.currentTime + " seconds"), W(t)
637        }
638
639        function fe() {
640            var e = parseInt(E.duration),
641                t = 0;
642            return null === Ue.media.duration || isNaN(Ue.media.duration) || (t = Ue.media.duration), isNaN(e) ? t : e
643        }
644
645        function ye() {
646            m(Ue.container, E.classes.playing, !Ue.media.paused), m(Ue.container, E.classes.stopped, Ue.media.paused), Me(Ue.media.paused)
647        }
648
649        function be() {
650            P = {
651                x: e.pageXOffset || 0,
652                y: e.pageYOffset || 0
653            }
654        }
655
656        function ve() {
657            e.scrollTo(P.x, P.y)
658        }
659
660        function ge(e) {
661            var n = N.supportsFullScreen;
662            if (n) {
663                if (!e || e.type !== N.fullScreenEventName) return N.isFullScreen(Ue.container) ? N.cancelFullScreen() : (be(), N.requestFullScreen(Ue.container)), void(Ue.isFullscreen = N.isFullScreen(Ue.container));
664                Ue.isFullscreen = N.isFullScreen(Ue.container)
665            } else Ue.isFullscreen = !Ue.isFullscreen, t.body.style.overflow = Ue.isFullscreen ? "hidden" : "";
666            m(Ue.container, E.classes.fullscreen.active, Ue.isFullscreen), $(Ue.isFullscreen), Ue.buttons && Ue.buttons.fullscreen && k(Ue.buttons.fullscreen, Ue.isFullscreen), A(Ue.container, Ue.isFullscreen ? "enterfullscreen" : "exitfullscreen", !0), !Ue.isFullscreen && n && ve()
667        }
668
669        function he(e) {
670            if (O.boolean(e) || (e = !Ue.media.muted), k(Ue.buttons.mute, e), Ue.media.muted = e, 0 === Ue.media.volume && ke(E.volume), s(E.types.embed, Ue.type)) {
671                switch (Ue.type) {
672                    case "youtube":
673                        Ue.embed[Ue.media.muted ? "mute" : "unMute"]();
674                        break;
675                    case "vimeo":
676                    case "soundcloud":
677                        Ue.embed.setVolume(Ue.media.muted ? 0 : parseFloat(E.volume / E.volumeMax))
678                }
679                A(Ue.media, "volumechange")
680            }
681        }
682
683        function ke(e) {
684            var t = E.volumeMax,
685                n = E.volumeMin;
686            if (O.undefined(e) && (e = Ue.storage.volume), (null === e || isNaN(e)) && (e = E.volume), e > t && (e = t), e < n && (e = n), Ue.media.volume = parseFloat(e / t), Ue.volume.display && (Ue.volume.display.value = e), s(E.types.embed, Ue.type)) {
687                switch (Ue.type) {
688                    case "youtube":
689                        Ue.embed.setVolume(100 * Ue.media.volume);
690                        break;
691                    case "vimeo":
692                    case "soundcloud":
693                        Ue.embed.setVolume(Ue.media.volume)
694                }
695                A(Ue.media, "volumechange")
696            }
697            0 === e ? Ue.media.muted = !0 : Ue.media.muted && e > 0 && he()
698        }
699
700        function we(e) {
701            var t = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax;
702            O.number(e) || (e = E.volumeStep), ke(t + e)
703        }
704
705        function xe(e) {
706            var t = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax;
707            O.number(e) || (e = E.volumeStep), ke(t - e)
708        }
709
710        function Te() {
711            var e = Ue.media.muted ? 0 : Ue.media.volume * E.volumeMax;
712            Ue.supported.full && (Ue.volume.input && (Ue.volume.input.value = e), Ue.volume.display && (Ue.volume.display.value = e)), te({
713                volume: e
714            }), m(Ue.container, E.classes.muted, 0 === e), Ue.supported.full && Ue.buttons.mute && k(Ue.buttons.mute, 0 === e)
715        }
716
717        function Se(e) {
718            Ue.supported.full && Ue.buttons.captions && (O.boolean(e) || (e = Ue.container.className.indexOf(E.classes.captions.active) === -1), Ue.captionsEnabled = e, k(Ue.buttons.captions, Ue.captionsEnabled), m(Ue.container, E.classes.captions.active, Ue.captionsEnabled), A(Ue.container, Ue.captionsEnabled ? "captionsenabled" : "captionsdisabled", !0), te({
719                captionsEnabled: Ue.captionsEnabled
720            }))
721        }
722
723        function _e(e) {
724            var t = "waiting" === e.type;
725            clearTimeout(Xe.loading), Xe.loading = setTimeout(function() {
726                m(Ue.container, E.classes.loading, t), Me(t)
727            }, t ? 250 : 0)
728        }
729
730        function Ee(e) {
731            if (Ue.supported.full) {
732                var t = Ue.progress.played,
733                    n = 0,
734                    r = fe();
735                if (e) switch (e.type) {
736                    case "timeupdate":
737                    case "seeking":
738                        if (Ue.controls.pressed) return;
739                        n = w(Ue.media.currentTime, r), "timeupdate" === e.type && Ue.buttons.seek && (Ue.buttons.seek.value = n);
740                        break;
741                    case "playing":
742                    case "progress":
743                        t = Ue.progress.buffer, n = function() {
744                            var e = Ue.media.buffered;
745                            return e && e.length ? w(e.end(0), r) : O.number(e) ? 100 * e : 0
746                        }()
747                }
748                Ce(t, n)
749            }
750        }
751
752        function Ce(e, t) {
753            if (Ue.supported.full) {
754                if (O.undefined(t) && (t = 0), O.undefined(e)) {
755                    if (!Ue.progress || !Ue.progress.buffer) return;
756                    e = Ue.progress.buffer
757                }
758                O.htmlElement(e) ? e.value = t : e && (e.bar && (e.bar.value = t), e.text && (e.text.innerHTML = t))
759            }
760        }
761
762        function Fe(e, t) {
763            if (t) {
764                isNaN(e) && (e = 0), Ue.secs = parseInt(e % 60), Ue.mins = parseInt(e / 60 % 60), Ue.hours = parseInt(e / 60 / 60 % 60);
765                var n = parseInt(fe() / 60 / 60 % 60) > 0;
766                Ue.secs = ("0" + Ue.secs).slice(-2), Ue.mins = ("0" + Ue.mins).slice(-2), t.innerHTML = (n ? Ue.hours + ":" : "") + Ue.mins + ":" + Ue.secs
767            }
768        }
769
770        function Ae() {
771            if (Ue.supported.full) {
772                var e = fe() || 0;
773                !Ue.duration && E.displayDuration && Ue.media.paused && Fe(e, Ue.currentTime), Ue.duration && Fe(e, Ue.duration), Pe()
774            }
775        }
776
777        function Ie(e) {
778            Fe(Ue.media.currentTime, Ue.currentTime), e && "timeupdate" === e.type && Ue.media.seeking || Ee(e)
779        }
780
781        function Ne(e) {
782            O.number(e) || (e = 0);
783            var t = fe(),
784                n = w(e, t);
785            Ue.progress && Ue.progress.played && (Ue.progress.played.value = n), Ue.buttons && Ue.buttons.seek && (Ue.buttons.seek.value = n)
786        }
787
788        function Pe(e) {
789            var t = fe();
790            if (E.tooltips.seek && Ue.progress.container && 0 !== t) {
791                var n = Ue.progress.container.getBoundingClientRect(),
792                    r = 0,
793                    a = E.classes.tooltip + "--visible";
794                if (e) r = 100 / n.width * (e.pageX - n.left);
795                else {
796                    if (!f(Ue.progress.tooltip, a)) return;
797                    r = Ue.progress.tooltip.style.left.replace("%", "")
798                }
799                r < 0 ? r = 0 : r > 100 && (r = 100), Fe(t / 100 * r, Ue.progress.tooltip), Ue.progress.tooltip.style.left = r + "%", e && s(["mouseenter", "mouseleave"], e.type) && m(Ue.progress.tooltip, a, "mouseenter" === e.type)
800            }
801        }
802
803        function Me(t) {
804            if (E.hideControls && "audio" !== Ue.type) {
805                var n = 0,
806                    r = !1,
807                    a = t,
808                    o = f(Ue.container, E.classes.loading);
809                if (O.boolean(t) || (t && t.type ? (r = "enterfullscreen" === t.type, a = s(["mousemove", "touchstart", "mouseenter", "focu
809s"], t.type), s(["mousemove", "touchmove"], t.type) && (n = 2e3), "focus" === t.type && (n = 3e3)) : a = f(Ue.container, E.classes.hideControls)), e.clearTimeout(Xe.hover), a || Ue.media.paused || o) {
810                    if (m(Ue.container, E.classes.hideControls, !1), Ue.media.paused || o) return;
811                    Ue.browser.isTouch && (n = 3e3)
812                }
813                a && Ue.media.paused || (Xe.hover = e.setTimeout(function() {
814                    (!Ue.controls.pressed && !Ue.controls.hover || r) && m(Ue.container, E.classes.hideControls, !0)
815                }, n))
816            }
817        }
818
819        function Oe(e) {
820            if (!O.undefined(e)) return void Le(e);
821            var t;
822            switch (Ue.type) {
823                case "youtube":
824                    t = Ue.embed.getVideoUrl();
825                    break;
826                case "vimeo":
827                    Ue.embed.getVideoUrl.then(function(e) {
828                        t = e
829                    });
830                    break;
831                case "soundcloud":
832                    Ue.embed.getCurrentSound(function(e) {
833                        t = e.permalink_url
834                    });
835                    break;
836                default:
837                    t = Ue.media.currentSrc
838            }
839            return t || ""
840        }
841
842        function Le(e) {
843            function n() {
844                if (Ue.embed = null, l(Ue.media), "video" === Ue.type && Ue.videoContainer && l(Ue.videoContainer), Ue.container && Ue.container.removeAttribute("class"), "type" in e && (Ue.type = e.type, "video" === Ue.type)) {
845                    var n = e.sources[0];
846                    "type" in n && s(E.types.embed, n.type) && (Ue.type = n.type)
847                }
848                switch (Ue.supported = F(Ue.type), Ue.type) {
849                    case "video":
850                        Ue.media = t.createElement("video");
851                        break;
852                    case "audio":
853                        Ue.media = t.createElement("audio");
854                        break;
855                    case "youtube":
856                    case "vimeo":
857                    case "soundcloud":
858                        Ue.media = t.createElement("div"), Ue.embedId = e.sources[0].src
859                }
860                u(Ue.container, Ue.media), O.boolean(e.autoplay) && (E.autoplay = e.autoplay), s(E.types.html5, Ue.type) && (E.crossorigin && Ue.media.setAttribute("crossorigin", ""), E.autoplay && Ue.media.setAttribute("autoplay", ""), "poster" in e && Ue.media.setAttribute("poster", e.poster), E.loop && Ue.media.setAttribute("loop", "")), m(Ue.container, E.classes.fullscreen.active, Ue.isFullscreen), m(Ue.container, E.classes.captions.active, Ue.captionsEnabled), K(), s(E.types.html5, Ue.type) && J("source", e.sources), ne(), s(E.types.html5, Ue.type) && ("tracks" in e && J("track", e.tracks), Ue.media.load()), (s(E.types.html5, Ue.type) || s(E.types.embed, Ue.type) && !Ue.supported.full) && (We(), Ye()), E.title = e.title, Z()
861            }
862            return O.object(e) && "sources" in e && e.sources.length ? (m(Ue.container, E.classes.ready, !1), ue(), Ne(), Ce(), qe(), void De(n, !1)) : void ze("Invalid source format")
863        }
864
865        function je(e) {
866            "video" === Ue.type && Ue.media.setAttribute("poster", e)
867        }
868
869        function Ve() {
870            function n() {
871                var e = ce(),
872                    t = Ue.buttons[e ? "play" : "pause"],
873                    n = Ue.buttons[e ? "pause" : "play"];
874                if (n = n && n.length > 1 ? n[n.length - 1] : n[0]) {
875                    var r = f(t, E.classes.tabFocus);
876                    setTimeout(function() {
877                        n.focus(), r && (m(t, E.classes.tabFocus, !1), m(n, E.classes.tabFocus, !0))
878                    }, 100)
879                }
880            }
881
882            function r() {
883                var e = t.activeElement;
884                return e = e && e !== t.body ? t.querySelector(":focus") : null
885            }
886
887            function a(e) {
888                return e.keyCode ? e.keyCode : e.which
889            }
890
891            function o(e) {
892                for (var t in Ue.buttons) {
893                    var n = Ue.buttons[t];
894                    if (O.nodeList(n))
895                        for (var r = 0; r < n.length; r++) m(n[r], E.classes.tabFocus, n[r] === e);
896                    else m(n, E.classes.tabFocus, n === e)
897                }
898            }
899
900            function i(e) {
901                function t() {
902                    var e = Ue.media.duration;
903                    O.number(e) && me(e / 10 * (n - 48))
904                }
905                var n = a(e),
906                    r = "keydown" === e.type,
907                    o = r && n === u;
908                if (O.number(n))
909                    if (r) {
910                        var i = [48, 49, 50, 51, 52, 53, 54, 56, 57, 32, 75, 38, 40, 77, 39, 37, 70, 67];
911                        switch (s(i, n) && (e.preventDefault(), e.stopPropagation()), n) {
912                            case 48:
913                            case 49:
914                            case 50:
915                            case 51:
916                            case 52:
917                            case 53:
918                            case 54:
919                            case 55:
920                            case 56:
921                            case 57:
922                                o || t();
923                                break;
924                            case 32:
925                            case 75:
926                                o || ce();
927                                break;
928                            case 38:
929                                we();
930                                break;
931                            case 40:
932                                xe();
933                                break;
934                            case 77:
935                                o || he();
936                                break;
937                            case 39:
938                                pe();
939                                break;
940                            case 37:
941                                de();
942                                break;
943                            case 70:
944                                ge();
945                                break;
946                            case 67:
947                                o || Se()
948                        }!N.supportsFullScreen && Ue.isFullscreen && 27 === n && ge(), u = n
949                    } else u = null
950            }
951            var l = Ue.browser.isIE ? "change" : "input";
952            if (E.keyboardShorcuts.focused) {
953                var u = null;
954                E.keyboardShorcuts.global && g(e, "keydown keyup", function(e) {
955                    var t = a(e),
956                        n = r(),
957                        o = [48, 49, 50, 51, 52, 53, 54, 56, 57, 75, 77, 70, 67],
958                        l = I().length;
959                    1 !== l || !s(o, t) || O.htmlElement(n) && y(n, E.selectors.editable) || i(e)
960                }), g(Ue.container, "keydown keyup", i)
961            }
962            g(e, "keyup", function(e) {
963                var t = a(e),
964                    n = r();
965                9 === t && o(n)
966            }), g(t.body, "click", function() {
967                m(U("." + E.classes.tabFocus), E.classes.tabFocus, !1)
968            });
969            for (var c in Ue.buttons) {
970                var d = Ue.buttons[c];
971                g(d, "blur", function() {
972                    m(d, "tab-focus", !1);
973                })
974            }
975            b(Ue.buttons.play, "click", E.listeners.play, n), b(Ue.buttons.pause, "click", E.listeners.pause, n), b(Ue.buttons.restart, "click", E.listeners.restart, me), b(Ue.buttons.rewind, "click", E.listeners.rewind, de), b(Ue.buttons.forward, "click", E.listeners.forward, pe), b(Ue.buttons.seek, l, E.listeners.seek, me), b(Ue.volume.input, l, E.listeners.volume, function() {
976                ke(Ue.volume.input.value)
977            }), b(Ue.buttons.mute, "click", E.listeners.mute, he), b(Ue.buttons.fullscreen, "click", E.listeners.fullscreen, ge), N.supportsFullScreen && g(t, N.fullScreenEventName, ge), g(Ue.buttons.captions, "click", Se), g(Ue.progress.container, "mouseenter mouseleave mousemove", Pe), E.hideControls && (g(Ue.container, "mouseenter mouseleave mousemove touchstart touchend touchcancel touchmove enterfullscreen", Me), g(Ue.controls, "mouseenter mouseleave", function(e) {
978                Ue.controls.hover = "mouseenter" === e.type
979            }), g(Ue.controls, "mousedown mouseup touchstart touchend touchcancel", function(e) {
980                Ue.controls.pressed = s(["mousedown", "touchstart"], e.type)
981            }), g(Ue.controls, "focus blur", Me, !0)), g(Ue.volume.input, "wheel", function(e) {
982                e.preventDefault();
983                var t = e.webkitDirectionInvertedFromDevice,
984                    n = E.volumeStep / 5;
985                (e.deltaY < 0 || e.deltaX > 0) && (t ? xe(n) : we(n)), (e.deltaY > 0 || e.deltaX < 0) && (t ? we(n) : xe(n))
986            })
987        }
988
989        function Re() {
990            if (g(Ue.media, "timeupdate seeking", Ie), g(Ue.media, "timeupdate", W), g(Ue.media, "durationchange loadedmetadata", Ae), g(Ue.media, "ended", function() {
991                    "video" === Ue.type && E.showPosterOnEnd && ("video" === Ue.type && H(), me(), Ue.media.load())
992                }), g(Ue.media, "progress playing", Ee), g(Ue.media, "volumechange", Te), g(Ue.media, "play pause ended", ye), g(Ue.media, "waiting canplay seeked", _e), E.clickToPlay && "audio" !== Ue.type) {
993                var e = U("." + E.classes.videoWrapper);
994                if (!e) return;
995                e.style.cursor = "pointer", g(e, "click", function() {
996                    E.hideControls && Ue.browser.isTouch && !Ue.media.paused || (Ue.media.paused ? le() : Ue.media.ended ? (me(), le()) : ue())
997                })
998            }
999            E.disableContextMenu && g(Ue.media, "contextmenu", function(e) {
1000                e.preventDefault()
1001            }), g(Ue.media, E.events.concat(["keyup", "keydown"]).join(" "), function(e) {
1002                A(Ue.container, e.type, !0)
1003            })
1004        }
1005
1006        function qe() {
1007            if (s(E.types.html5, Ue.type)) {
1008                for (var e = Ue.media.querySelectorAll("source"), t = 0; t < e.length; t++) l(e[t]);
1009                Ue.media.setAttribute("src", "https://cdn.selz.com/plyr/blank.mp4"), Ue.media.load(), Je("Cancelled network requests")
1010            }
1011        }
1012
1013        function De(n, r) {
1014            function a() {
1015                clearTimeout(Xe.cleanUp), O.boolean(r) || (r = !0), O.function(n) && n.call($e), r && (Ue.init = !1, Ue.container.parentNode.replaceChild($e, Ue.container), t.body.style.overflow = "", A($e, "destroyed", !0))
1016            }
1017            if (!Ue.init) return null;
1018            switch (Ue.type) {
1019                case "youtube":
1020                    e.clearInterval(Xe.buffering), e.clearInterval(Xe.playing), Ue.embed.destroy(), a();
1021                    break;
1022                case "vimeo":
1023                    Ue.embed.unload().then(a), Xe.cleanUp = e.setTimeout(a, 200);
1024                    break;
1025                case "video":
1026                case "audio":
1027                    Q(!0), a()
1028            }
1029        }
1030
1031        function He() {
1032            if (Ue.init) return null;
1033            if (N = _(), Ue.browser = n(), O.htmlElement(Ue.media)) {
1034                ee();
1035                var e = v.tagName.toLowerCase();
1036                "div" === e ? (Ue.type = v.getAttribute("data-type"), Ue.embedId = v.getAttribute("data-video-id"), v.removeAttribute("data-type"), v.removeAttribute("data-video-id")) : (Ue.type = e, E.crossorigin = null !== v.getAttribute("crossorigin"), E.autoplay = E.autoplay || null !== v.getAttribute("autoplay"), E.loop = E.loop || null !== v.getAttribute("loop")), Ue.supported = F(Ue.type), Ue.supported.basic && (Ue.container = i(v, t.createElement("div")), Ue.container.setAttribute("tabindex", 0), K(), Je("" + Ue.browser.name + " " + Ue.browser.version), ne(), (s(E.types.html5, Ue.type) || s(E.types.embed, Ue.type) && !Ue.supported.full) && (We(), Ye(), Z()), Ue.init = !0)
1037            }
1038        }
1039
1040        function We() {
1041            if (!Ue.supported.full) return ze("Basic support only", Ue.type), l(U(E.selectors.controls.wrapper)), l(U(E.selectors.buttons.play)), void Q(!0);
1042            var e = !B(E.selectors.controls.wrapper).length;
1043            e && z(), G() && (e && Ve(), Re(), Q(), q(), D(), ke(), Te(), Ie(), ye())
1044        }
1045
1046        function Ye() {
1047            e.setTimeout(function() {
1048                A(Ue.media, "ready")
1049            }, 0), m(Ue.media, M.classes.setup, !0), m(Ue.container, E.classes.ready, !0), Ue.media.plyr = Be, E.autoplay && le()
1050        }
1051        var Be, Ue = this,
1052            Xe = {};
1053        Ue.media = v;
1054        var $e = v.cloneNode(!0),
1055            Je = function() {
1056                j("log", arguments)
1057            },
1058            ze = function() {
1059                j("warn", arguments)
1060            };
1061        return Je("Config", E), Be = {
1062            getOriginal: function() {
1063                return $e
1064            },
1065            getContainer: function() {
1066                return Ue.container
1067            },
1068            getEmbed: function() {
1069                return Ue.embed
1070            },
1071            getMedia: function() {
1072                return Ue.media
1073            },
1074            getType: function() {
1075                return Ue.type
1076            },
1077            getDuration: fe,
1078            getCurrentTime: function() {
1079                return Ue.media.currentTime
1080            },
1081            getVolume: function() {
1082                return Ue.media.volume
1083            },
1084            isMuted: function() {
1085                return Ue.media.muted
1086            },
1087            isReady: function() {
1088                return f(Ue.container, E.classes.ready)
1089            },
1090            isLoading: function() {
1091                return f(Ue.container, E.classes.loading)
1092            },
1093            isPaused: function() {
1094                return Ue.media.paused
1095            },
1096            on: function(e, t) {
1097                return g(Ue.container, e, t), this
1098            },
1099            play: le,
1100            pause: ue,
1101            stop: function() {
1102                ue(), me()
1103            },
1104            restart: me,
1105            rewind: de,
1106            forward: pe,
1107            seek: me,
1108            source: Oe,
1109            poster: je,
1110            setVolume: ke,
1111            togglePlay: ce,
1112            toggleMute: he,
1113            toggleCaptions: Se,
1114            toggleFullscreen: ge,
1115            toggleControls: Me,
1116            isFullscreen: function() {
1117                return Ue.isFullscreen || !1
1118            },
1119            support: function(e) {
1120                return r(Ue, e)
1121            },
1122            destroy: De
1123        }, He(), Ue.init ? Be : null
1124    }
1125
1126    function C(e, n) {
1127        var r = new XMLHttpRequest;
1128        if (!O.string(n) || !O.htmlElement(t.querySelector("#" + n))) {
1129            var a = t.createElement("div");
1130            a.setAttribute("hidden", ""), O.string(n) && a.setAttribute("id", n), t.body.insertBefore(a, t.body.childNodes[0]), "withCredentials" in r && (r.open("GET", e, !0), r.onload = function() {
1131                a.innerHTML = r.responseText
1132            }, r.send())
1133        }
1134    }
1135
1136    function F(e) {
1137        var r = n(),
1138            a = r.isIE && r.version <= 9,
1139            s = r.isIos,
1140            o = r.isIphone,
1141            i = !!t.createElement("audio").canPlayType,
1142            l = !!t.createElement("video").canPlayType,
1143            u = !1,
1144            c = !1;
1145        switch (e) {
1146            case "video":
1147                u = l, c = u && !a && !o;
1148                break;
1149            case "audio":
1150                u = i, c = u && !a;
1151                break;
1152            case "vimeo":
1153                u = !0, c = !a && !s;
1154                break;
1155            case "youtube":
1156               
1156 u = !0, c = !a && !s, s && !o && r.version >= 10 && (c = !0);
1157                break;
1158            case "soundcloud":
1159                u = !0, c = !a && !o;
1160                break;
1161            default:
1162                u = i && l, c = u && !a
1163        }
1164        return {
1165            basic: u,
1166            full: c
1167        }
1168    }
1169
1170    function A(e, n) {
1171        function r(e, t) {
1172            f(t, M.classes.hook) || a.push({
1173                target: e,
1174                media: t
1175            })
1176        }
1177        var a = [],
1178            s = [],
1179            o = [M.selectors.html5, M.selectors.embed].join(",");
1180        if (O.string(e) ? e = t.querySelectorAll(e) : O.htmlElement(e) ? e = [e] : O.nodeList(e) || O.array(e) || O.string(e) || (O.undefined(n) && O.object(e) && (n = e), e = t.querySelectorAll(o)), O.nodeList(e) && (e = Array.prototype.slice.call(e)), !F().basic || !e.length) return !1;
1181        for (var i = 0; i < e.length; i++) {
1182            var l = e[i],
1183                u = l.querySelectorAll(o);
1184            if (u.length)
1185                for (var c = 0; c < u.length; c++) r(l, u[c]);
1186            else y(l, o) && r(l, l)
1187        }
1188        return a.forEach(function(e) {
1189            var t = e.target,
1190                r = e.media,
1191                a = !1;
1192            r === t && (a = !0);
1193            var o = {};
1194            try {
1195                o = JSON.parse(t.getAttribute("data-plyr"))
1196            } catch (e) {}
1197            var i = x({}, M, n, o);
1198            if (!i.enabled) return null;
1199            var l = new E(r, i);
1200            if (O.object(l)) {
1201                if (i.debug) {
1202                    var u = i.events.concat(["setup", "statechange", "enterfullscreen", "exitfullscreen", "captionsenabled", "captionsdisabled"]);
1203                    g(l.getContainer(), u.join(" "), function(e) {
1204                        console.log([i.logPrefix, "event:", e.type].join(" "), e.detail.plyr)
1205                    })
1206                }
1207                h(l.getContainer(), "setup", !0, {
1208                    plyr: l
1209                }), s.push(l)
1210            }
1211        }), s
1212    }
1213
1214    function I(e) {
1215        if (O.string(e) ? e = t.querySelector(e) : O.undefined(e) && (e = t.body), O.htmlElement(e)) {
1216            var n = e.querySelectorAll("." + M.classes.setup),
1217                r = [];
1218            return Array.prototype.slice.call(n).forEach(function(e) {
1219                O.object(e.plyr) && r.push(e.plyr)
1220            }), r
1221        }
1222        return []
1223    }
1224    var N, P = {
1225            x: 0,
1226            y: 0
1227        },
1228        M = {
1229            enabled: !0,
1230            debug: !1,
1231            autoplay: !1,
1232            loop: !1,
1233            seekTime: 10,
1234            volume: 10,
1235            volumeMin: 0,
1236            volumeMax: 10,
1237            volumeStep: 1,
1238            duration: null,
1239            displayDuration: !0,
1240            loadSprite: !0,
1241            iconPrefix: "plyr",
1242            iconUrl: "https://cdn.plyr.io/2.0.10/plyr.svg",
1243            clickToPlay: !0,
1244            hideControls: !0,
1245            showPosterOnEnd: !1,
1246            disableContextMenu: !0,
1247            keyboardShorcuts: {
1248                focused: !0,
1249                global: !1
1250            },
1251            tooltips: {
1252                controls: !1,
1253                seek: !0
1254            },
1255            selectors: {
1256                html5: "video, audio",
1257                embed: "[data-type]",
1258                editable: "input, textarea, select, [contenteditable]",
1259                container: ".plyr",
1260                controls: {
1261                    container: null,
1262                    wrapper: ".plyr__controls"
1263                },
1264                labels: "[data-plyr]",
1265                buttons: {
1266                    seek: '[data-plyr="seek"]',
1267                    play: '[data-plyr="play"]',
1268                    pause: '[data-plyr="pause"]',
1269                    restart: '[data-plyr="restart"]',
1270                    rewind: '[data-plyr="rewind"]',
1271                    forward: '[data-plyr="fast-forward"]',
1272                    mute: '[data-plyr="mute"]',
1273                    captions: '[data-plyr="captions"]',
1274                    fullscreen: '[data-plyr="fullscreen"]'
1275                },
1276                volume: {
1277                    input: '[data-plyr="volume"]',
1278                    display: ".plyr__volume--display"
1279                },
1280                progress: {
1281                    container: ".plyr__progress",
1282                    buffer: ".plyr__progress--buffer",
1283                    played: ".plyr__progress--played"
1284                },
1285                captions: ".plyr__captions",
1286                currentTime: ".plyr__time--current",
1287                duration: ".plyr__time--duration"
1288            },
1289            classes: {
1290                setup: "plyr--setup",
1291                ready: "plyr--ready",
1292                videoWrapper: "plyr__video-wrapper",
1293                embedWrapper: "plyr__video-embed",
1294                type: "plyr--{0}",
1295                stopped: "plyr--stopped",
1296                playing: "plyr--playing",
1297                muted: "plyr--muted",
1298                loading: "plyr--loading",
1299                hover: "plyr--hover",
1300                tooltip: "plyr__tooltip",
1301                hidden: "plyr__sr-only",
1302                hideControls: "plyr--hide-controls",
1303                isIos: "plyr--is-ios",
1304                isTouch: "plyr--is-touch",
1305                captions: {
1306                    enabled: "plyr--captions-enabled",
1307                    active: "plyr--captions-active"
1308                },
1309                fullscreen: {
1310                    enabled: "plyr--fullscreen-enabled",
1311                    active: "plyr--fullscreen-active"
1312                },
1313                tabFocus: "tab-focus"
1314            },
1315            captions: {
1316                defaultActive: !1
1317            },
1318            fullscreen: {
1319                enabled: !0,
1320                fallback: !0,
1321                allowAudio: !1
1322            },
1323            storage: {
1324                enabled: !0,
1325                key: "plyr"
1326            },
1327            controls: ["play-large", "play", "progress", "current-time", "mute", "volume", "captions", "fullscreen"],
1328            i18n: {
1329                restart: "Restart",
1330                rewind: "Rewind {seektime} secs",
1331                play: "Play",
1332                pause: "Pause",
1333                forward: "Forward {seektime} secs",
1334                played: "played",
1335                buffered: "buffered",
1336                currentTime: "Current time",
1337                duration: "Duration",
1338                volume: "Volume",
1339                toggleMute: "Toggle Mute",
1340                toggleCaptions: "Toggle Captions",
1341                toggleFullscreen: "Toggle Fullscreen",
1342                frameTitle: "Player for {title}"
1343            },
1344            types: {
1345                embed: ["youtube", "vimeo", "soundcloud"],
1346                html5: ["video", "audio"]
1347            },
1348            urls: {
1349                vimeo: {
1350                    api: "https://player.vimeo.com/api/player.js"
1351                },
1352                youtube: {
1353                    api: "https://www.youtube.com/iframe_api"
1354                },
1355                soundcloud: {
1356                    api: "https://w.soundcloud.com/player/api.js"
1357                }
1358            },
1359            listeners: {
1360                seek: null,
1361                play: null,
1362                pause: null,
1363                restart: null,
1364                rewind: null,
1365                forward: null,
1366                mute: null,
1367                volume: null,
1368                captions: null,
1369                fullscreen: null
1370            },
1371            events: ["ready", "ended", "progress", "stalled", "playing", "waiting", "canplay", "canplaythrough", "loadstart", "loadeddata", "loadedmetadata", "timeupdate", "volumechange", "play", "pause", "error", "seeking", "seeked", "emptied"],
1372            logPrefix: "[Plyr]"
1373        },
1374        O = {
1375            object: function(e) {
1376                return null !== e && "object" == typeof e
1377            },
1378            array: function(e) {
1379                return null !== e && "object" == typeof e && e.constructor === Array
1380            },
1381            number: function(e) {
1382                return null !== e && ("number" == typeof e && !isNaN(e - 0) || "object" == typeof e && e.constructor === Number)
1383            },
1384            string: function(e) {
1385                return null !== e && ("string" == typeof e || "object" == typeof e && e.constructor === String)
1386            },
1387            boolean: function(e) {
1388                return null !== e && "boolean" == typeof e
1389            },
1390            nodeList: function(e) {
1391                return null !== e && e instanceof NodeList
1392            },
1393            htmlElement: function(e) {
1394                return null !== e && e instanceof HTMLElement
1395            },
1396            function: function(e) {
1397                return null !== e && "function" == typeof e
1398            },
1399            undefined: function(e) {
1400                return null !== e && "undefined" == typeof e
1401            }
1402        },
1403        L = {
1404            supported: function() {
1405                if (!("localStorage" in e)) return !1;
1406                try {
1407                    e.localStorage.setItem("___test", "OK");
1408                    var t = e.localStorage.getItem("___test");
1409                    return e.localStorage.removeItem("___test"), "OK" === t
1410                } catch (e) {
1411                    return !1
1412                }
1413                return !1
1414            }()
1415        };
1416    return {
1417        setup: A,
1418        supported: F,
1419        loadSprite: C,
1420        get: I
1421    }
1422}),
1423function() {
1424    function e(e, t) {
1425        t = t || {
1426            bubbles: !1,
1427            cancelable: !1,
1428            detail: void 0
1429        };
1430        var n = document.createEvent("CustomEvent");
1431        return n.initCustomEvent(e, t.bubbles, t.cancelable, t.detail), n
1432    }
1433    "function" != typeof window.CustomEvent && (e.prototype = window.Event.prototype, window.CustomEvent = e)
1434}();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.